wepy是一个优秀的微信小程序组件化框架,突破了小程序的限制,支持了npm包加载以及组件化方案,并且在性能优化方面也下了功夫,不管之后项目是否会使用到,该框架组件化编译方案都是值得学习和深入的。

本文同步于个人博客 www.imhjm.com/article/597…
wepy文档: wepyjs.github.io/wepy/#/
github地址:github.com/wepyjs/wepy

我们先提出几个问题,让下面的分析更有针对性:

  1. wepy如何实现单文件组件.wpy编译?
  2. 如何隔离组件作用域?
  3. 如何实现组件通信?
  4. 如何实现加载外部npm包?

先从源码目录入手

我们可以先clone下wepy的github目录

  • docs目录下是开发文档以及使用docsify生成的文档网站
  • packages目录下就是核心代码了,wepy是小程序端的框架,wepy-cli是脚手架(负责组件化编译等等),其他就是一些预处理编译插件、还有一些压缩插件等等
  • scripts是一些shell脚本,负责test等等一些操作
  • gulpfile.js主要负责将package中的src开发目录中js文件babel转换至lib目录供使用,并支持watch compile
  • 等等

我们就重点看wepy以及wepy-cli,接下来的文章也是围绕这两个展开

wepy-cli分析

目录结构


上面的bin/wepy.js是入口文件,其实就一句话引入lib中经过babel转换的文件
require('../lib/wepy');复制代码

编译构建流程

下图简单画出了整体wepy-cli的编译构建流程,忽略了部分细节


接下来答大体说下build的流程(可以跟着图看)
  • wepy-cli使用commander作为命令行工具,build命令执行调用compile build方法
  • 如果没有指定文件build,则获取src目录下所有文件,寻找没有引用的(指的是这种<script src="">),调用compile方法开始编译,如果指定文件,则相应判断寻找父组件或者寻找引用去编译
  • compile方法根据文件后缀判断,调用不同文件的方法(下面就说wpy单文件组件)
  • compile-wpy调用resolveWpy方法(核心)

    • 替换内容中的attr(比如@tap => bindtap等等)
    • 使用xmldom放入内容,操作节点
    • 获取wpy中的包裹的config,放入rst.config
    • 将样式放入rst.style
    • 提前编译wxml,如果是jade/pug之类的
    • 获取文件中的import和components放入rst.template.components
    • 获取代码中components的属性,获取props以及events放入rst.script.code中
      rst.script.code = rst.script.code.replace(/[\s\r\n]components\s*=[\s\r\n]*/, (match, item, index) => {return `$props = ${JSON.stringify(props)};\r\n$events = ${JSON.stringify(events)};\r\n${match}`;});复制代码
    • 最后拆解style、template、script构成一个rst文件
      let rst = {moduleId: moduleId,style: [],template: {code: '',src: '',type: '',components: {},},script: {code: '',src: '',type: '',},config: {},};复制代码
    • rst构建完成,开始逐个操作

      • rst.config写入xxx.json
      • rst.template
        • 经过compiler后再次使用xmldom
        • updateSlot,替换内容
        • updateBind, 将{{}}以及attr中的加入组件前缀($prefix)
        • 将组件替换成相应xml
      • rst.style
        • 寻找require再进入compile-style
        • compiler预编译处理,并且置入依赖(@import)
      • rst.script

        • compiler处理
        • 假如不是npm包,则置入wepy框架初始化代码

          if (type !== 'npm') {if (type === 'page' || type === 'app') {code = code.replace(/exports\.default\s*=\s*(\w+);/ig, function (m, defaultExport) {if (defaultExport === 'undefined') {return '';}if (type === 'page') {let pagePath = path.join(path.relative(appPath.dir, opath.dir), opath.name).replace(/\\/ig, '/');return `\nPage(require('wepy').default.$createPage(${defaultExport} , '${pagePath}'));\n`;} else {appPath = opath;let appConfig = JSON.stringify(config.appConfig);return `\nApp(require('wepy').default.$createApp(${defaultExport}, ${appConfig}));\n`;}});}
          }复制代码
        • resolveDeps(核心),根据require的形式,模仿node require加载机制,将文件拷贝到相应目录,修改require内容,这里包括外部npm包的拷贝加载
        • 假如是npm包,特殊处理部分代码
    • 均通过相应plugins顺序通过一遍,最后输出到dist目录

大体就像开发文档的图一样,现在看就很清晰了

核心方法

resolveWpy

这个方法用于生成rst,拆分wpy单文件组件,上面流程讲了大部分,这里就详细讲下props和event的提取
其实也不是很复杂,就是遍历元素,取出相应attributes,放入events[comid][attr.name]以及props[comid][attr.name]放入代码中

elems.forEach((elem) => {// ignore the components calculated in repeat.if (calculatedComs.indexOf(elem) === -1) {let comid = util.getComId(elem);[].slice.call(elem.attributes || []).forEach((attr) => {if (attr.name !== 'id' && attr.name !== 'path') {if (/v-on:/.test(attr.name)) { // v-on:fn user custom eventif (!events[comid])events[comid] = {};events[comid][attr.name] = attr.value;} else {if (!props[comid])props[comid] = {};if (['hidden', 'wx:if', 'wx:elif', 'wx:else'].indexOf(attr.name) === -1) {props[comid][attr.name] = attr.value;}}}});}});if (Object.keys(props).length) {rst.script.code =rst.script.code.replace(/[\s\r\n]components\s*=[\s\r\n]*/, (match, item, index) => {return `$props = ${JSON.stringify(props)};\r\n$events = ${JSON.stringify(events)};\r\n${match}`;});}复制代码
//... util.geComId
getComId(elem) {let tagName = elem.nodeName;let path = elem.getAttribute('path');let id = elem.getAttribute('id');if (tagName !== 'component')return tagName;if (id)return id;if (path && !id)return path;},复制代码

updateBind && parseExp

  • updateBind遍历调用parseExp,并且遇到子元素调用自身传入前面的prefix,最后可以生成$parent$child$xxx这种一样的数据
  • parseExp就是用于替换添加prefix

下面精简了下代码,易于理解

updateBind(node, prefix, ignores = {}, mapping = {}) {let comid = prefix;if (node.nodeName === '#text' && prefix) {if (node.data && node.data.indexOf('{{') > -1) {node.replaceData(0, node.data.length, this.parseExp(node.data, prefix, ignores, mapping));}} else {[].slice.call(node.attributes || []).forEach((attr) => {if (prefix) {if (attr.value.indexOf('{{') > -1) {attr.value = this.parseExp(attr.value, prefix, ignores, mapping);}}if (attr.name.indexOf('bind') === 0 || attr.name.indexOf('catch') === 0) {if (prefix) {attr.value = `$${comid}$${attr.value}`;}}});[].slice.call(node.childNodes || []).forEach((child) => {this.updateBind(child, prefix, ignores, mapping);});}},复制代码
  parseExp(content, prefix, ignores, mapping) {let comid = prefix;// replace {{ param ? 'abc' : 'efg' }} => {{ $prefix_param ? 'abc' : 'efg' }}return content.replace(/\{\{([^}]+)\}\}/ig, (matchs, words) => {return matchs.replace(/[^\.\w'"](\.{0}|\.{3})([a-z_\$][\w\d\._\$]*)/ig, (match, expand, word, n) => {// console.log(matchs + '------' + match + '--' + word + '--' + n);let char = match[0];let tmp = word.match(/^([\w\$]+)(.*)/);let w = tmp[1];let rest = tmp[2];if (ignores[w] || this.isInQuote(matchs, n)) {return match;} else {if (mapping.items && mapping.items[w]) {// prefix 减少一层let upper = comid.split(PREFIX);upper.pop();upper = upper.join(PREFIX);upper = upper ? `${PREFIX}${upper}${JOIN}` : '';return `${char}${expand}${upper}${mapping.items[w].mapping}${rest}`;}return `${char}${expand}${PREFIX}${comid}${JOIN}${word}`;}});});},复制代码

resolveDeps

这个方法用于wpy框架的加载机制
将require部分替换成正确的编译后的路径
npm包通过读取相应package.json中的main部分去寻找文件,寻找npm文件会再继续resolveDeps获取依赖,最后写入npm中

    resolveDeps (code, type, opath) {let params = cache.getParams();let wpyExt = params.wpyExt;return code.replace(/require\(['"]([\w\d_\-\.\/@]+)['"]\)/ig, (match, lib) => {let resolved = lib;let target = '', source = '', ext = '', needCopy = false;if (lib[0] === '.') { // require('./something'');source = path.join(opath.dir, lib);  // e:/src/utilif (type === 'npm') {target = path.join(npmPath, path.relative(modulesPath, source));needCopy = true;} else {// e:/dist/utiltarget = util.getDistPath(source);needCopy = false;}} else if (lib.indexOf('/') === -1 || // require('asset');lib.indexOf('/') === lib.length - 1 || // reqiore('a/b/something/')(lib[0] === '@' && lib.indexOf('/') !== -1 && lib.lastIndexOf('/') === lib.indexOf('/')) // require('@abc/something')) {  let pkg = this.getPkgConfig(lib);if (!pkg) {throw Error('找不到模块: ' + lib);}let main = pkg.main || 'index.js';if (pkg.browser && typeof pkg.browser === 'string') {main = pkg.browser;}source = path.join(modulesPath, lib, main);target = path.join(npmPath, lib, main);lib += path.sep + main;ext = '';needCopy = true;} else { // require('babel-runtime/regenerator')//console.log('3: ' + lib);source = path.join(modulesPath, lib);target = path.join(npmPath, lib);ext = '';needCopy = true;}if (util.isFile(source + wpyExt)) {ext = '.js';} else if (util.isFile(source + '.js')) {ext = '.js';} else if (util.isDir(source) && util.isFile(source + path.sep + 'index.js')) {ext = path.sep + 'index.js';}else if (util.isFile(source)) {ext = '';} else {throw ('找不到文件: ' + source);}source += ext;target += ext;lib += ext;resolved = lib;// 第三方组件if (/\.wpy$/.test(resolved)) {target = target.replace(/\.wpy$/, '') + '.js';resolved = resolved.replace(/\.wpy$/, '') + '.js';lib = resolved;}if (needCopy) {if (!cache.checkBuildCache(source)) {cache.setBuildCache(source);util.log('依赖: ' + path.relative(process.cwd(), target), '拷贝');// 这里是写入npm包,并且继续寻找依赖的地方this.compile('js', null, 'npm', path.parse(source));}}if (type === 'npm') {if (lib[0] !== '.') {resolved = path.join('..' + path.sep, path.relative(opath.dir, modulesPath), lib);} else {if (lib[0] === '.' && lib[1] === '.')resolved = './' + resolved;}} else {resolved = path.relative(util.getDistPath(opath, opath.ext, src, dist), target);}resolved = resolved.replace(/\\/g, '/').replace(/^\.\.\//, './');return `require('${resolved}')`;});},复制代码

new loader.PluginHelper

在代码中会常看到以下PluginHelper再进行写入,我们可以看看如何实现plugin一个一个运用到content中的

let plg = new loader.PluginHelper(config.plugins, {type: 'wxml',code: util.decode(node.toString()),file: target,output (p) {util.output(p.action, p.file);},done (rst) {util.output('写入', rst.file);rst.code = self.replaceBooleanAttr(rst.code);util.writeFile(target, rst.code);}
});复制代码

核心代码如下,其实跟koa/express中间的compose类似,通过next方法,调用完一个调用下一个next(),next()不断,最后done(),next方法在框架内部实现,done方法有我们配置即可,当然在插件中(就像中间件)需要在最后调用next

class PluginHelper {constructor (plugins, op) {this.applyPlugin(0, op);return true;}applyPlugin (index, op) {let plg = loadedPlugins[index];if (!plg) {op.done && op.done(op);} else {op.next = () => {this.applyPlugin(index + 1, op);};op.catch = () => {op.error && op.error(op);};if (plg)plg.apply(op);}}
}复制代码

wepy分析

这里的wepy是wepy框架的前端部分,需要在小程序中import的

主要职责就是让框架中props和events能成功使用,就是需要setData一些加prefix的内容,并且实现组件之间的通信,以及部分性能调优

目录结构

  • wepy.js: 暴露$createApp、$createPage等接口
  • base.js: $createApp、$createPage逻辑,bindExt为组件以及method添加prefix
  • app.js: promisifyAPI以及intercept拦截接口逻辑
  • page.js: 继承component,route、page一些性能调优逻辑
  • component.js: 组件逻辑,props构建,computed计算,脏值检查,组件通信($invoke、$broadcast、$emit)
  • native.js: 空,代码里面用于app.js中重新定义wx自带接口
  • event.js: 用于传入method第一参数e,可以获取组件通信的来源等
  • mixin.js: 将混合的数据,事件以及方法注入到组件之中
  • util.js:工具包

框架分析

针对前端wepy部分,也画了个流程图方便理解,也略去大量细节部分,后面分析可以跟着图来

  • 上一节wepy-cli编译时往代码中注入了以下代码
    // page
    Page(require('wepy').default.$createPage(${defaultExport} , '${pagePath}'));
    // app
    App(require('wepy').default.$createApp(${defaultExport}, ${appConfig}));复制代码
    这也是入口所在,从这里开始入手分析
  • $createApp在App包裹中,正常小程序应该是App({}),所以这里$createApp返回config,这里new class extends wepy.app, 通过调用app.js中$initAPI实现接口promise化以及实现拦截器
    定义接口使用

    Object.defineProperty(native, key, {get () { return (...args) => wx[key].apply(wx, args) }
    });
    wepy[key] = native[key];复制代码

    success时候reoslve,fail时候reject实现promise化,在其中查询拦截器调用

    if (self.$addons.promisify) {return new Promise((resolve, reject) => {let bak = {};['fail', 'success', 'complete'].forEach((k) => {bak[k] = obj[k];obj[k] = (res) => {if (self.$interceptors[key] && self.$interceptors[key][k]) {res = self.$interceptors[key][k].call(self, res);}if (k === 'success')resolve(res)else if (k === 'fail')reject(res);};});if (self.$addons.requestfix && key === 'request') {RequestMQ.request(obj);} elsewx[key](obj);});}复制代码
  • $createPage在Page包裹中,同样返回config{},构造page实例,来自new class extends wepy.page,page class又继承于component

    • $bindEvt方法:
      • 遍历com.components,如果com还有子组件则递归调用,new class extend componeng后放入com.$coms
      • 递归设置com.$prefix,第一层没有,接下去就是$one$,再有子级,就是$one$two$,以此类推...
      • 这个方法名叫$bindEvt,主要也是跟方法有关的,将所有methods中的方法放入config中并添加当前组件的$prefix,即是$prefix+method,并且方法最后都会调用com.$mixin,调用com.$apply
    • onload方法:
      • 调用$init并且调用super.$init,即class component的$init
      • 根据$props(这个是编译注入的)生成$mappingProps,mapping双向绑定的部分
      • Props.build(this.props);(注意这个props是前端编写)构建props,并寻找父级的$props(编译注入),获取值以后放在this.data[key]里,如果有props设定为twoWay,同样放入$mappingProps中
      • 初始化数据(注意把prefix加上去了),并将defaultData setData到页面
          defaultData[`${this.$prefix}${k}`] = this.data[k];this[k] = this.data[k];复制代码
      • 计算computed的值放入this[k]中
      • 获取this.$com(在base.js中的bindEvt根据components绑定的),让组件一个一个继续$init、onLoad、$mixins、$apply
      • $init结束,调用page的onload方法,调用$mixins, 最后再page.$apply

$apply方法需要特别提一下,它于component中的$digest配合,是wepy框架里比较核心的脏值检查setData机制

下图是官网的图


我们可以看下$apply方法
带fn去调用,则调用结束再调用自身,然后假如当前阶段$$phase为无,则设为$apply阶段,假如调用时候之前已经标记过apply,则调用 this.$digest();进入脏检查阶段
$apply (fn) {if (typeof(fn) === 'function') {fn.call(this);this.$apply();} else {if (this.$$phase) {this.$$phase = '$apply';} else {this.$digest();}}}复制代码

$digest方法就是脏值检查了,顺便再讲之前的$createPage我们可以看到data放在好几个地方,this[k],this.data[k],this.$data,这里来区分以下它们

  • this[k]是作为当前的数据,没有set上去的新数据,这也是wepy框架的一个特点,它将setData简化,this.xxx = yyy 替代之前的setData({xxx: yyy})
  • this.data就是刚开始用到的初始化数据,放入defaultData中set,但是作为this.data里的,小程序更新数据setData也会更新到这里的数据
  • this.$data是作为set上去的数据,wepy框架重写setData方法,会操作这个this.$data

分析完上面,脏值检查就很明了了,拿this.$data跟this中比较,不等的话放入readyToSet中,然后再setData,更新this.$data即可,还需注意上面官网图下两个tips,注意只会有一个脏数据检查流程

至于组件通信方面,有了一棵组件树,理好层级父级的关系就不复杂了,举一个$emit触发父级事件例子分析一下

  • 假如是用event传入的,寻找父级组件$events(编译时注入的,在attr里遍历收集的),然后apply相应的方法即可
  • 假如不是,则一层一层找上级方法emit即可

    $emit (evtName, ...args) {let com = this;let source = this;let $evt = new event(evtName, source, 'emit');// User custom event;if (this.$parent.$events && this.$parent.$events[this.$name]) {let method = this.$parent.$events[this.$name]['v-on:' + evtName];if (method && this.$parent.methods) {let fn = this.$parent.methods[method];if (typeof(fn) === 'function') {this.$parent.$apply(() => {fn.apply(this.$parent, args.concat($evt));});return;} else {throw new Error(`Invalid method from emit, component is ${this.$parent.$name}, method is ${method}. Make sure you defined it already.\n`);}}}while(com && com.$isComponent !== undefined && $evt.active) {// 保存 com 块级作用域组件实例let comContext = com;let fn = getEventsFn(comContext, evtName);fn && comContext.$apply(() => {fn.apply(comContext, args.concat($evt));});com = comContext.$parent;}}复制代码

其他的invoke和broadcast不具体讲了,只要构建出组件树,问题就很好解决(构建就是在每次new的时候记住它的$parent就行了)

总结

到这里,整体流程大致讲完了,没有涵盖所有细节,作者的这个小程序框架很强大,并且作者还在积极地解决issue和更新,值得我们点赞~
接下来来回答下文首提出的问题,应该就迎刃而解了
1. wepy如何实现单文件组件.wpy编译?
答:wepy框架通过wepy-cli对.wpy编译,拆解为style,script(+config),template几部分,再分别处理,生成到dist文件对应xxx.wxss,xxx.script,xxx.json,xxx.wxml

2. 如何隔离组件作用域?
答:通过组件在不同page的命名作为前缀,并且以父级为起点,依次为$child,再子级就是$child$chind,依次类推。。。不同组件在不同的component实例下,data set到page就是带上前缀,同样的method也是加入前缀放在Page({})中

3. 如何实现组件通信?
答:通过编译获取component的路径注入代码,在小程序代码运行时,根据逐层require获取,new component,并记下父级$parent,构建组件树。
如果向子组件传props和events?
编译时就会收集在template中传入的props和events注入到代码中$props和$events,然后子组件init的时候获取父级$parent的$props并加入前缀$prefix去setData(子组件的在page中的元素表现已经在编译的时候被替换成了$prefix$data的样子),这样就实现了传值。调用$emit触发父组件event,直接寻找父级$parent apply调用相应方法即可。
广播事件broadcast就是直接广度优先去遍历组件树就行了。

4. 如何实现加载外部npm包?
答:wepy-cli在处理script部分,根据require的内容判断是否是npm内容或者带有npm标识,如果是require('xxx') require('xxx/yyy')的形式获取package.json中的main部分找到引用文件,就去compile该文件(带上npm标识继续去resolveDeps),如果判断不是npm内容修正require即可,带有npm标识最后会打包到npm文件夹。

其他可以参考阅读的相关介绍文章

  • 小程序组件化框架 WePY 在性能调优上做出的探究:
  • 【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架

最后

谢谢阅读~
欢迎follow我哈哈github.com/BUPT-HJM
欢迎继续观光我的新博客~(老博客近期可能迁移)

欢迎关注

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. C++ 资源url

    刚刚收集的C/C++资源,大家可以看下,觉得可以的话帮忙顶起来,让更多的人知道. 1.开发工具下载TUBER C http://www.duote.com/soft/392.html Turbo C 2.0 汉化版 http://www.programfan.com/showdown.asp?id=306 C-Free 4.0 http://www.programfan.com/showdown.asp?id=245…...

    2024/4/19 14:52:54
  2. Vmware Workstation 虚拟机打开失败--提示以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件以及虚拟机

    解决办法:以管理员方式打开dos窗口,输入netsh winsock reset(这个命令是重置网络规范,虚拟机打开失败的原因很可能就是VMware软件跟本地网络规范有冲突),回车之后提示成功重置winsock目录,您必须重新启动计算机才能重新完成配置。重启电脑后打开即可。...

    2024/4/16 21:27:22
  3. Nginx的安装问题解决(80端口被占用以及防火墙的设置)

    首先安装nginx之前需要先安装pcre库,原因是nginx依赖于这个库之后便是一步一步的解压缩安装等但是当我想运行安装后的NGINX的时候他却显示nginx: [emerg] bind() to 0.0.0.0:80 failed(98: Address already in use)....nginx: [emerg] bind() to 0.0.0.0:80 failed(98: Addres…...

    2024/5/4 8:48:10
  4. 程序员网站资源宝库

    当前全球有数百万的开发人员在使用微软的.NET技术。如果你是其中之一,或者想要成为其中之一的话,我下面将要列出的每一个站点都应该是你的最爱,都应该收藏到书签中去。 对于不熟悉.NET技术的朋友,需要说明一下,.NET提供了一个平台和一些相应的工具,编程人员可以使用它们来…...

    2024/4/20 11:14:11
  5. 关于vmware打开虚拟机之后一直黑屏的问题

    1. 以管理员身份运行cmd,输入如下命令,作用:重置winsock网络规范netsh winsock reset2.打开控制面板,选择系统与安全,选择管理工具,打开服务,找到vmware authorization右击,点重新运行就可以了...

    2024/4/16 21:26:52
  6. wepy框架开启Promise

    在wepy框架中,创建empty模板的时候,并没有开启Promise,为了开启异步,我们需要在项目的根目录安装:npm install wepy-async-function --save然后在app.wpy文件中引入import wepy-async-function;引入之后,我们还需要在app.wpy中开启Promise;代码如下:constructor () {su…...

    2024/5/4 3:40:18
  7. 解决steamcommunity报错443/80端口被占用

    这个问题大部分应该是安装了虚拟机,虚拟机端口冲突。如果安转了可以先关掉试试行不行。 如果你没安装虚拟机或者关掉不管用,可以在cmd中用指令netstat -ano根据端口号找pid 搜索cmd以端口号80为例,可以看到本地地址0.0.0.0:80 就是指端口号为80 对应的pid为4进入任务管理器…...

    2024/5/4 4:50:09
  8. 微信小程序开发框架WePY的创建过程及遇到的问题

    1、安装wepy命令行工具 npm install wepy-cli -g 如果出现以下问题:解决方法: npm cache clean --force npm install wepy-cli -g2、创建wepy项目my-project(wepy版本1.7.0以后) wepy init standard my-project 如果出现以下问题:解决方法: 在C:\Windows\System32\driver…...

    2024/4/16 21:25:40
  9. Nginx中碰到80端口被占用

    配置Nginx服务时出现Nginx开启不了后来就用CMD(管理员方式)去打开 Nginx却发现下面结果D:\Program Files (x86)\Nginx\nginx-1.10.2>nginx.exenginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its acces…...

    2024/4/16 21:28:16
  10. iPhone ebook 中翻页效果(牛人)的实现

    在Cocochina上看到的帖子,赞美发帖人。。。确实好使。Tom Brow,此牛人模仿iBook的翻页效果,并共享了代码。 人家说自己是freelance,好吧我很羡慕,我也想free,不过估计后果很严重。 大概看了他的几个作品,多是图片处理的,估计也是为啥人家的翻页效果中的阴影比较帅的原因…...

    2024/4/16 21:28:16
  11. 被创新工场、君联和华熙集团先后翻牌子,因为它把古风二次元玩得特别溜!

    古风音乐圈的人,有多少人是被这首歌启蒙?没错,就由墨明棋妙团队创作,河图演唱的《倾尽天下》。反正小编是其中之一。这首歌火到什么程度?其全网下载量已破亿。据百度百科上记录,光是为这首歌创造的MV就有80多个。当时最火的一支MV是由网友根据天涯四美(钟汉良、乔振宇、…...

    2024/4/17 21:13:28
  12. 能ping通某网页,但无法访问网页的处理

    cmd----->netsh winsock reset 用以重置Winsock目录,是网络环境初始化,解决一些奇怪的问题转载于:https://www.cnblogs.com/peng-zone/p/8427414.html...

    2024/4/16 21:27:04
  13. wepy封装post get请求!!

    1): 在src目录下新建baseAPI.js文件;2):在文件头部引入wepy; import wepy from ‘wepy’; 3): 拼接网址 const baseURL = https://www.zhuzhu.com/nasp.php;3):封装提示框; wepy.baseToast = function (str = ) {wepy.showToast({title: str,icon: none,duration: 1000}) }封装…...

    2024/4/16 21:27:16
  14. nginx 80端口被占用

    https://blog.csdn.net/weixin_41852866/article/details/79705039...

    2024/4/20 6:27:31
  15. GSBookShelf书架管理

    仿照iBOOK,提供动画删除等等.github.com 转载于:https://www.cnblogs.com/kiss007/archive/2012/05/29/2524747.html...

    2024/4/16 21:26:16
  16. 【有利可图网】PS教程:PS调出中国古风水彩背景汉服女孩照片

    古风摄影最得意的地方一定是从准备到最后出品,看到成品后的满足感,在拍摄古风人像时候,前期显得尤为关键,我们不能只靠后期进行修图和调色,只有充分的前期,才有好的作品诞生,因为原片欠曝,我们要拉高一点曝光,但是要把握好这个度,不能出现局部过曝的情况,具体还有哪…...

    2024/4/20 7:22:57
  17. VMware安装Ubuntu18停滞在黑窗口解决办法

    1、可能是VMware创建虚拟网络后,未启用。命令:netsh winsock reset1 作用:重置winsock网络规范 输入命令方法: 左下角开始菜单,选择运行(管理员身份)输入。 运行后重启电脑。...

    2024/4/16 21:27:16
  18. wepy学习之路-初始化项目及额外组件的使用2

    文章目录基础项目生产1、使用wepy指令生成一个空wepy项目2、安装npm依赖包3、关闭eslint代码检查4、配置完成额外组件1、promise的使用 基础项目生产 1、使用wepy指令生成一个空wepy项目 wepy init empty projectname 2、安装npm依赖包 npm install 3、关闭eslint代码检查 打开…...

    2024/4/16 21:27:46
  19. 批评“古风”歌词“狗屁不通”就是不尊重?我们又都成了“垃圾听众”

    昨天发了《大学老师称古风歌词“狗屁不通”,遭粉丝围攻:回家葬母吧》帖子之后,发现大家讨论得非常热烈。而《盗将行》这首歌的曲作者和词作者,在昨晚都分别出面回应:先是曲作者&演唱者花粥:我觉得上面这段回应槽点真的很多啊.......这个意思我没太懂,是花粥老师的大…...

    2024/4/16 21:27:16
  20. Learn Swift

    简单的 Tutorial 苹果 iBook Store 上的 The Swift Programming Language (Swift 2)转载于:https://www.cnblogs.com/1oo1/p/4864695.html...

    2024/4/16 21:27:40

最新文章

  1. 机器学习每周挑战——二手车车辆信息交易售价数据

    这是数据集的截图 目录 背景描述 数据说明 车型对照&#xff1a; 燃料类型对照&#xff1a; 老规矩&#xff0c;第一步先导入用到的库 第二步&#xff0c;读入数据&#xff1a; 第三步&#xff0c;数据预处理 第四步&#xff1a;对数据的分析 第五步&#xff1a;模型建…...

    2024/5/4 10:54:49
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 腾讯云云原生数据库TDSQL-C mysql 以及项目怎么接入

    要接入腾讯云的云原生数据库TDSQL-C的MySQL版本&#xff0c;并将它用于你的项目中&#xff0c;你需要按照以下步骤进行&#xff1a; 创建TDSQL-C的MySQL数据库实例&#xff1a; 登录腾讯云控制台。在产品搜索框中搜索TDSQL-C&#xff0c;然后选择它。在TDSQL-C的产品页面上&…...

    2024/5/4 6:23:44
  4. 前端路径问题总结

    1.相对路径 不以/开头 以当前资源的所在路径为出发点去找目标资源 语法: ./表示当前资源的路径 ../表示当前资源的上一层路径 缺点:不同位置,相对路径写法不同2.绝对路径 以固定的路径作为出发点作为目标资源,和当前资源所在路径没关系 语法:以/开头,不同的项目中,固定的路径…...

    2024/5/1 13:55:59
  5. 2024蓝桥杯每日一题(区间DP)

    备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;游戏 试题二&#xff1a;石子合并 试题三&#xff1a;密码脱落 试题四&#xff1a;能量项链 试题一&#xff1a;游戏 【题目描述】 玩家一和玩家二共同玩一个小游戏。给定一个包含 N 个…...

    2024/5/2 13:18:42
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/3 23:10:03
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57