GraphQL 搭配 Koa 最佳入门实践
GraphQL一种用为你 API 而生的查询语言,2018已经到来,PWA还没有大量投入生产应用之中就已经火起来了,GraphQL的应用或许也不会太远了。前端的发展的最大一个特点就是变化快,有时候应对各种需求场景的变化,不得不去对接口开发很多版本或者修改。各种业务依赖强大的基础数据平台快速生长,如何高效地为各种业务提供数据支持,是所有人关心的问题。而且现在前端的解决方案是将视图组件化,各个业务线既可以是组件的使用者,也可以是组件的生产者,如果能够将其中通用的内容抽取出来提供给各个业务方反复使用,必然能够节省宝贵的开发时间和开发人力。那么问题来了,前端通过组件实现了跨业务的复用,后端接口如何相应地提高开发效率呢?GraphQL,就是应对复杂场景的一种新思路。
官方解释:
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
下面介绍一下GraphQL的有哪些好处:
-
请求你所要的数据不多不少
-
获取多个资源只用一个请求
-
自定义接口数据的字段
-
强大的开发者工具
-
API 演进无需划分版本
本篇文章中将搭配koa实现一个GraphQL查询的例子,逐步从简单kao服务到mongodb的数据插入查询再到GraphQL的使用, 让大家快速看到:
- 搭建koa搭建一个后台项目
- 后台路由简单处理方式
- 利用mongoose简单操作mongodb
- 掌握GraphQL的入门姿势
项目如下图所示
1、搭建GraphQL工具查询界面。
2、前端用jq发送ajax的使用方式
入门项目我们都已经是预览过了,下面我们动手开发吧!!!
lets do it
首先建立一个项目文件夹,然后在这个项目文件夹新建一个server.js
(node服务)、config文件夹
、mongodb文件夹
、router文件夹
、controllers文件夹
以及public文件夹
(这个主要放前端静态数据展示页面),好啦,项目的结构我们都已经建立好,下面在server.js
文件夹里写上
server.js
// 引入模块
import Koa from 'koa'
import KoaStatic from 'koa-static'
import Router from 'koa-router'
import bodyParser from 'koa-bodyparser'const app = new Koa()
const router = new Router();// 使用 bodyParser 和 KoaStatic 中间件
app.use(bodyParser());
app.use(KoaStatic(__dirname + '/public'));// 路由设置test
router.get('/test', (ctx, next) => {ctx.body="test page"
});app.use(router.routes()).use(router.allowedMethods());app.listen(4000);console.log('graphQL server listen port: ' + 4000)
复制代码
在命令行npm install koa koa-static koa-router koa-bodyparser --save
安装好上面几个模块,
然后运行node server.js
,不出什么意外的话,你会发现报如下图的一个error
原因是现在的node版本并没有支持es6的模块引入方式。
放心 我们用神器babel-polyfill
转译一下就阔以了。详细的请看阮一峰老师的这篇文章
下面在项目文件夹新建一个start.js
,然后在里面写上以下代码:
start.js
require('babel-core/register')({'presets': ['stage-3',["latest-node", { "target": "current" }]]
})require('babel-polyfill')
require('./server')复制代码
然后 在命令行,运行npm install babel-core babel-polyfill babel-preset-latest-node babel-preset-stage-3 --save-dev
安装几个开发模块。
安装完毕之后,在命令行运行 node start.js
,之后你的node服务安静的运行起来了。用koa-router中间件做我们项目路由模块的管理,后面会写到router文件夹
中统一管理。
打开浏览器,输入localhost:4000/test
,你就会发现访问这个路由node服务会返回test page
文字。如下图
yeah~~kao服务器基本搭建好之后,下面就是,链接mongodb
然后把数据存储到mongodb
数据库里面啦。
实现mongodb的基本数据模型
tip:这里我们需要mongodb
存储数据以及利用mongoose
模块操作mongodb
数据库
-
在
mongodb文件夹
新建一个index.js
和schema文件夹
, 在schema文件夹
文件夹下面新建info.js
和student.js
。 -
在
config文件夹
下面建立一个index.js
,这个文件主要是放一下配置代码。
又一波文件建立好之后,先在config/index.js
下写上链接数据库配置的代码。
config/index.js
export default {dbPath: 'mongodb://localhost/graphql'
}复制代码
然后在mongodb/index.js
下写上链接数据库的代码。
mongodb/index.js
// 引入mongoose模块
import mongoose from 'mongoose'
import config from '../config'// 同步引入 info model和 studen model
require('./schema/info')
require('./schema/student')// 链接mongodb
export const database = () => {mongoose.set('debug', true)mongoose.connect(config.dbPath)mongoose.connection.on('disconnected', () => {mongoose.connect(config.dbPath)})mongoose.connection.on('error', err => {console.error(err)})mongoose.connection.on('open', async () => {console.log('Connected to MongoDB ', config.dbPath)})
}复制代码
上面我们我们代码还加载了info.js
和 studen.js
这两个分别是学生的附加信息和基本信息的数据模型,为什么会分成两个信息表?原因是顺便给大家介绍一下联表查询的基本方法(嘿嘿~~~)
下面我们分别完成这两个数据模型
mongodb/schema/info.js
// 引入mongoose
import mongoose from 'mongoose'//
const Schema = mongoose.Schema// 实例InfoSchema
const InfoSchema = new Schema({hobby: [String],height: String,weight: Number,meta: {createdAt: {type: Date,default: Date.now()},updatedAt: {type: Date,default: Date.now()}}
})
// 在保存数据之前跟新日期
InfoSchema.pre('save', function (next) {if (this.isNew) {this.meta.createdAt = this.meta.updatedAt = Date.now()} else {this.meta.updatedAt = Date.now()}next()
})
// 建立Info数据模型
mongoose.model('Info', InfoSchema)
复制代码
上面的代码就是利用mongoose
实现了学生的附加信息的数据模型,用同样的方法我们实现了student数据模型
mongodb/schema/student.js
import mongoose from 'mongoose'const Schema = mongoose.Schema
const ObjectId = Schema.Types.ObjectIdconst StudentSchema = new Schema({name: String,sex: String,age: Number,info: {type: ObjectId,ref: 'Info'},meta: {createdAt: {type: Date,default: Date.now()},updatedAt: {type: Date,default: Date.now()}}
})StudentSchema.pre('save', function (next) {if (this.isNew) {this.meta.createdAt = this.meta.updatedAt = Date.now()} else {this.meta.updatedAt = Date.now()}next()
})mongoose.model('Student', StudentSchema)
复制代码
实现保存数据的控制器
数据模型都链接好之后,我们就添加一些存储数据的方法,这些方法都写在控制器里面。然后在controler里面新建info.js
和student.js
,这两个文件分别对象,操作info和student数据的控制器,分开写为了方便模块化管理。
- 实现info数据信息的保存,顺便把查询也先写上去,代码很简单
controlers/info.js
import mongoose from 'mongoose'
const Info = mongoose.model('Info')// 保存info信息
export const saveInfo = async (ctx, next) => {// 获取请求的数据const opts = ctx.request.bodyconst info = new Info(opts)const saveInfo = await info.save() // 保存数据console.log(saveInfo)// 简单判断一下 是否保存成功,然后返回给前端if (saveInfo) {ctx.body = {success: true,info: saveInfo}} else {ctx.body = {success: false}}
}// 获取所有的info数据
export const fetchInfo = async (ctx, next) => {const infos = await Info.find({}) // 数据查询if (infos.length) {ctx.body = {success: true,info: infos}} else {ctx.body = {success: false}}
}
复制代码
上面的代码,就是前端用post(路由下面一会在写)请求过来的数据,然后保存到mongodb数据库,在返回给前端保存成功与否的状态。也简单实现了一下,获取全部附加信息的的一个方法。下面我们用同样的道理实现studen数据的保存以及获取。
- 实现studen数据的保存以及获取
controllers/sdudent.js
import mongoose from 'mongoose'
const Student = mongoose.model('Student')// 保存学生数据的方法
export const saveStudent = async (ctx, next) => {// 获取前端请求的数据const opts = ctx.request.bodyconst student = new Student(opts)const saveStudent = await student.save() // 保存数据if (saveStudent) {ctx.body = {success: true,student: saveStudent}} else {ctx.body = {success: false}}
}// 查询所有学生的数据
export const fetchStudent = async (ctx, next) => {const students = await Student.find({})if (students.length) {ctx.body = {success: true,student: students}} else {ctx.body = {success: false}}
}// 查询学生的数据以及附加数据
export const fetchStudentDetail = async (ctx, next) => {// 利用populate来查询关联info的数据const students = await Student.find({}).populate({path: 'info',select: 'hobby height weight'}).exec()if (students.length) {ctx.body = {success: true,student: students}} else {ctx.body = {success: false}}
}
复制代码
实现路由,给前端提供API接口
数据模型和控制器在上面我们都已经是完成了,下面就利用koa-router
路由中间件,来实现请求的接口。我们回到server.js
,在上面添加一些代码。如下
server.js
import Koa from 'koa'
import KoaStatic from 'koa-static'
import Router from 'koa-router'
import bodyParser from 'koa-bodyparser'import {database} from './mongodb' // 引入mongodb
import {saveInfo, fetchInfo} from './controllers/info' // 引入info controller
import {saveStudent, fetchStudent, fetchStudentDetail} from './controllers/student' // 引入 student controllerdatabase() // 链接数据库并且初始化数据模型const app = new Koa()
const router = new Router();app.use(bodyParser());
app.use(KoaStatic(__dirname + '/public'));router.get('/test', (ctx, next) => {ctx.body="test page"
});// 设置每一个路由对应的相对的控制器
router.post('/saveinfo', saveInfo)
router.get('/info', fetchInfo)router.post('/savestudent', saveStudent)
router.get('/student', fetchStudent)
router.get('/studentDetail', fetchStudentDetail)app.use(router.routes()).use(router.allowedMethods());app.listen(4000);console.log('graphQL server listen port: ' + 4000)
复制代码
上面的代码,就是做了,引入mongodb设置,info以及student控制器,然后链接数据库,并且设置每一个设置每一个路由对应的我们定义的的控制器。
安装一下mongoose模块 npm install mongoose --save
然后在命令行运行node start
,我们服务器运行之后,然后在给info和student添加一些数据。这里是通过postman
的谷歌浏览器插件来请求的,如下图所示
yeah~~~保存成功,继续按照步骤多保存几条,然后按照接口查询一下。如下图
嗯,如图都已经查询到我们保存的全部数据,并且全部返回前端了。不错不错。下面继续保存学生数据。
tip: 学生数据保存的时候关联了信息里面的数据哦。所以把id写上去了。
同样的一波操作,我们多保存学生几条信息,然后查询学生信息,如下图所示。
好了 ,数据我们都已经保存好了,铺垫也做了一大把了,下面让我们真正的进入,GrapgQL查询的骚操作吧~~~~
重构路由,配置GraphQL查询界面
别忘了,下面我们建立了一个router文件夹
,这个文件夹就是统一管理我们路由的模块,分离了路由个应用服务的模块。在router文件夹
新建一个index.js
。并且改造一下server.js
里面的路由全部复制到router/index.js
。
顺便在这个路由文件中加入,graphql-server-koa模块,这是koa集成的graphql服务器模块。graphql server是一个社区维护的开源graphql服务器,可以与所有的node.js http服务器框架一起工作:express,connect,hapi,koa和restify。可以点击链接查看详细知识点。
加入graphql-server-koa
的路由文件代码如下:
router/index.js
import { graphqlKoa, graphiqlKoa } from 'graphql-server-koa'
import {saveInfo, fetchInfo} from '../controllers/info'
import {saveStudent, fetchStudent, fetchStudentDetail} from '../controllers/student'const router = require('koa-router')()router.post('/saveinfo', saveInfo).get('/info', fetchInfo).post('/savestudent', saveStudent).get('/student', fetchStudent).get('/studentDetail', fetchStudentDetail).get('/graphiql', async (ctx, next) => {await graphiqlKoa({endpointURL: '/graphql'})(ctx, next)})
module.exports = router复制代码
之后把server.js
的路由代码去掉之后的的代码如下:
server.js
import Koa from 'koa'
import KoaStatic from 'koa-static'
import Router from 'koa-router'
import bodyParser from 'koa-bodyparser'import {database} from './mongodb'database()const GraphqlRouter = require('./router')const app = new Koa()
const router = new Router();const port = 4000app.use(bodyParser());
app.use(KoaStatic(__dirname + '/public'));router.use('', GraphqlRouter.routes())app.use(router.routes()).use(router.allowedMethods());app.listen(port);console.log('GraphQL-demo server listen port: ' + port)复制代码
恩,分离之后简洁,明了了很多。然后我们在重新启动node服务。在浏览器地址栏输入http://localhost:4000/graphiql
,就会得到下面这个界面。如图:
没错,什么都没有 就是GraphQL查询服务的界面。下面我们把这个GraphQL查询服务完善起来。
编写GraphQL Schema
看一下我们第一张图,我们需要什么数据,在GraphQL查询界面就编写什么字段,就可以查询到了,而后端需要定义好这些数据格式。这就需要我们定义好GraphQL Schema。
首先我们在根目录新建一个graphql文件夹
,这个文件夹用于存放管理graphql相关的js文件。然后在graphql文件夹
新建一个schema.js
。
这里我们用到graphql模块,这个模块就是用javascript参考实现graphql查询。向需要详细学习,请使劲戳链接。
我们先写好info
的查询方法。然后其他都差不多滴。
graphql/schema.js
// 引入GraphQL各种方法类型import {graphql,GraphQLSchema,GraphQLObjectType,GraphQLString,GraphQLID,GraphQLList,GraphQLNonNull,isOutputType
} from 'graphql';import mongoose from 'mongoose'
const Info = mongoose.model('Info') // 引入Info模块// 定义日期时间 类型
const objType = new GraphQLObjectType({name: 'mete',fields: {createdAt: {type: GraphQLString},updatedAt: {type: GraphQLString}}
})// 定义Info的数据类型
let InfoType = new GraphQLObjectType({name: 'Info',fields: {_id: {type: GraphQLID},height: {type: GraphQLString},weight: {type: GraphQLString},hobby: {type: new GraphQLList(GraphQLString)},meta: {type: objType}}
})// 批量查询
const infos = {type: new GraphQLList(InfoType),args: {},resolve (root, params, options) {return Info.find({}).exec() // 数据库查询}
}// 根据id查询单条info数据const info = {type: InfoType,// 传进来的参数args: {id: {name: 'id',type: new GraphQLNonNull(GraphQLID) // 参数不为空}},resolve (root, params, options) {return Info.findOne({_id: params.id}).exec() // 查询单条数据}
}// 导出GraphQLSchema模块export default new GraphQLSchema({query: new GraphQLObjectType({name: 'Queries',fields: {infos,info}})
})复制代码
看代码的时候建议从下往上看~~~~,上面代码所说的就是,建立info和infos的GraphQLSchema,然后定义好数据格式,查询到数据,或者根据参数查询到单条数据,然后返回出去。
写好了info schema之后 我们在配置一下路由,进入router/index.js
里面,加入下面几行代码。
router/index.js
import { graphqlKoa, graphiqlKoa } from 'graphql-server-koa'
import {saveInfo, fetchInfo} from '../controllers/info'
import {saveStudent, fetchStudent, fetchStudentDetail} from '../controllers/student'// 引入schema
import schema from '../graphql/schema'const router = require('koa-router')()router.post('/saveinfo', saveInfo).get('/info', fetchInfo).post('/savestudent', saveStudent).get('/student', fetchStudent).get('/studentDetail', fetchStudentDetail)router.post('/graphql', async (ctx, next) => {await graphqlKoa({schema: schema})(ctx, next) // 使用schema}).get('/graphql', async (ctx, next) => {await graphqlKoa({schema: schema})(ctx, next) // 使用schema}).get('/graphiql', async (ctx, next) => {await graphiqlKoa({endpointURL: '/graphql'})(ctx, next) // 重定向到graphiql路由})
module.exports = router复制代码
详细请看注释,然后被忘记安装好npm install graphql-server-koa graphql --save
这两个模块。安装完毕之后,重新运行服务器的node start
(你可以使用nodemon来启动本地node服务,免得来回启动。)
然后刷新http://localhost:4000/graphiql
,你会发现右边会有查询文档,在左边写上查询方式,如下图
重整Graphql代码结构,完成所有数据查询
现在是我们把schema和type都写到一个文件上面了去了,如果数据多了,字段多了变得特别不好维护以及review,所以我们就把定义type的和schema分离开来,说做就做。
在graphql文件夹
新建info.js
,studen.js
,文件,先把info type 写到info.js
代码如下
graphql/info.js
import {graphql,GraphQLSchema,GraphQLObjectType,GraphQLString,GraphQLID,GraphQLList,GraphQLNonNull,isOutputType
} from 'graphql';import mongoose from 'mongoose'
const Info = mongoose.model('Info')const objType = new GraphQLObjectType({name: 'mete',fields: {createdAt: {type: GraphQLString},updatedAt: {type: GraphQLString}}
})export let InfoType = new GraphQLObjectType({name: 'Info',fields: {_id: {type: GraphQLID},height: {type: GraphQLString},weight: {type: GraphQLString},hobby: {type: new GraphQLList(GraphQLString)},meta: {type: objType}}
})export const infos = {type: new GraphQLList(InfoType),args: {},resolve (root, params, options) {return Info.find({}).exec()}
}export const info = {type: InfoType,args: {id: {name: 'id',type: new GraphQLNonNull(GraphQLID)}},resolve (root, params, options) {return Info.findOne({_id: params.id}).exec()}
}复制代码
分离好info type 之后,一鼓作气,我们顺便把studen type 也完成一下,代码如下,原理跟info type 都是相通的,
graphql/student.js
import {graphql,GraphQLSchema,GraphQLObjectType,GraphQLString,GraphQLID,GraphQLList,GraphQLNonNull,isOutputType,GraphQLInt
} from 'graphql';import mongoose from 'mongoose'import {InfoType} from './info'
const Student = mongoose.model('Student')let StudentType = new GraphQLObjectType({name: 'Student',fields: {_id: {type: GraphQLID},name: {type: GraphQLString},sex: {type: GraphQLString},age: {type: GraphQLInt},info: {type: InfoType}}
})export const student = {type: new GraphQLList(StudentType),args: {},resolve (root, params, options) {return Student.find({}).populate({path: 'info',select: 'hobby height weight'}).exec()}
}复制代码
tips: 上面因为有了联表查询,所以引用了
info.js
然后调整一下schema.js
的代码,如下:
import {GraphQLSchema,GraphQLObjectType
} from 'graphql';
// 引入 type
import {info, infos} from './info'
import {student} from './student'// 建立 schema
export default new GraphQLSchema({query: new GraphQLObjectType({name: 'Queries',fields: {infos,info,student}})
})复制代码
看到代码是如此的清新脱俗,是不是深感欣慰。好了,graophql数据查询都已经是大概比较完善了。 课程的数据大家可以自己写一下,或者直接到我的github项目里面copy过来我就不一一重复的说了。
下面写一下前端接口是怎么查询的,然后让数据返回浏览器展示到页面的。
前端接口调用
在public文件夹
下面新建一个index.html
,js文件夹
,css文件夹
,然后在js文件夹
建立一个index.js
, 在css文件夹
建立一个index.css
,代码如下
public/index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>GraphQL-demo</title><link rel="stylesheet" href="./css/index.css">
</head>
<body><h1 class="app-title">GraphQL-前端demo</h1><div id="app"><div class="course list"><h3>课程列表</h3><ul id="courseList"><li>暂无数据....</li></ul></div><div class="student list"><h3>班级学生列表</h3><ul id="studentList"><li>暂无数据....</li></ul></div></div><div class="btnbox"><div class="btn" id="btn1">点击常规获取课程列表</div><div class="btn" id="btn2">点击常规获取班级学生列表</div><div class="btn" id="btn3">点击graphQL一次获取所有数据,问你怕不怕?</div></div><div class="toast"></div><script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.js"></script><script src="./js/index.js"></script>
</body>
</html>复制代码
我们主要看js请求方式 代码如下
window.onload = function () {$('#btn2').click(function() {$.ajax({url: '/student',data: {},success:function (res){if (res.success) {renderStudent (res.data)}}})})$('#btn1').click(function() {$.ajax({url: '/course',data: {},success:function (res){if (res.success) {renderCourse(res.data)}}})})function renderStudent (data) {var str = ''data.forEach(function(item) {str += '<li>姓名:'+item.name+',性别:'+item.sex+',年龄:'+item.age+'</li>'})$('#studentList').html(str)}function renderCourse (data) {var str = ''data.forEach(function(item) {str += '<li>课程:'+item.title+',简介:'+item.desc+'</li>'})$('#courseList').html(str)}// 请求看query参数就可以了,跟查询界面的参数差不多$('#btn3').click(function() {$.ajax({url: '/graphql',data: {query: `query{student{_idnamesexage}course{titledesc}}`},success:function (res){renderStudent (res.data.student)renderCourse (res.data.course)}})})
}复制代码
css的代码 我就不贴出来啦。大家可以去项目直接拿嘛。
所有东西都已经完成之后,重新启动node服务,然后访问,http://localhost:4000/
就会看到如下界面。界面丑,没什么设计美化细胞,求轻喷~~~~
操作点击之后就会想第二张图一样了。
所有效果都出来了,本篇文章也就到此结束了。
附上项目地址: github.com/naihe138/Gr…
ps:喜欢的话丢一个小星星(star)给我嘛
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 前端开源实战项目,大厂级别
强烈推荐 GitHub 上值得学习的开源实战项目,包含web前端,java,PHP,python,Android/IOS,大数据,区块链,AI机器学习,数据结构与算法,设计模式等等。...
2024/4/24 13:23:09 - 2018尚硅谷全套视频打包地址(不对外)
尚硅谷《全套Java、Android、HTML5前端、Python、大数据视频》 (史上最牛、最适合自学的全套视频、资料及源码) 【尚硅谷官网资料导航…...
2024/4/24 13:23:12 - 黑马程序员武汉2019新版前端与移动开发学习路线图(视频+工具+书籍+资源)
一、2019新版前端与移动开发学习路线图---每阶段可掌握的能力及各阶段覆盖的关键字二、2019新版前端与移动开发学习路线图---学习大纲及各阶段知识点三、2019新版前端与移动开发学习路线图--升级后新增知识点设计理念四、2019新版前端与移动开发学习路线图---各阶段配套视频推荐…...
2024/4/24 13:23:06 - Java,PHP,Python,WebApp开发教程视频资料汇总
教程名称(免费获取资源关注:Java开发教程视频) SSM到Spring Boot-从零开发校园商铺平台 Java Spring Boot企业微信点餐系统 Java秒杀系统方案优化-高性能高并发实战 Spring Boot技术栈博客企业前后端 Java SSM快速开发仿慕课网在线教育平台 Spring Boot带前后端 渐进式开发企…...
2024/5/6 0:53:58 - Ant Design Pro 企业级后台实战(73 个视频)
Ant Design Pro 企业级后台实战(73 个视频) Ant Design Pro 企业级后台实战 #1 介绍(声音已调到毫无杂音_)「07:48」 Ant Design Pro 企业级后台实战 #2 学习的思想(二更)「09:43」 Ant Design Pro 企业级后台实战 #3 分析源码目录结构与跑起来(第三更)「08:37」 Ant D…...
2024/4/24 13:23:05 - web前端架构师课程【免费试听群】
近期预备推出一个【前端架构师课程】因为在我的群、公众号里,许多前端新人都是已经自学了一段时间,都掌握了基本的Html、css,而Js多少也会一点,而这样的同学,他们所面临的最大的问题,【学不下去了】、【怎么提高】?在我的粉丝中,真正的一片空白啥也不懂的人很少, 这样…...
2024/5/5 18:55:15 - 非常适合程序员学习新技能的最佳网站
今天给程序员们整理了一份福利,想要学习新编程技能的朋友千万不要错过啦,针对程序员推荐了50个适合学习新技能的最佳网站,涵盖了各类编程语言、数据处理、艺术、科技等等。它们可以教会你实践练 习任何技能,从制作豆沙到用 node.js 开发 app,重要的是,它们都是免费的。 参…...
2024/4/29 2:45:32 - 学习教程汇总
A-最新课程01-Java并发编程与高并发解决方案 02-Tomcat+Memcached+Redis集群 构建高可用解决方案 03-Spring Cloud 微服务实战 04-Docker+k8s微服务容器化实践 05-基于Python玩转人工智能最火框架 TensorFlow应用实践 06-Elastic Stack从入门到实践 07-Vue核心技术 Vue+V…...
2024/5/5 18:55:30 - Javascript - Ajax精讲系列教程-李游Leo-专题视频课程
Javascript - Ajax精讲系列教程—96人已学习 课程介绍 Ajax是前后台交互的一个非常重要的对象,它在前端里面扮演着一个非常重要的角色。 我们通过这套教程了解前后台的实现原理,以及Ajax的技术展示。 通过实例更清晰的了解Ajax的核心以及Ajax的方法使用,让Ajax那些所…...
2024/4/15 4:01:53 - ruoyi衍生品ruoyi-cloud和ruoyi-ant的研究(下)
目前ruoyi-cloud和ruoyi-ant,作者已经写了比较好的文章,可以参考文章运行了http://doc.rycloud.zmrit.com注意:只能在google 浏览器运行前端,在QQ浏览器会报错。前端启动参考文档所示:(npm和yarn以及node.js安装省略,可查找其他文章安装)最后进入界面,如下图所示:...
2024/5/5 17:00:40 - 微信小程序开发之大神之路最全微信小程序开发教程(视频+精品文章)
最新小程序商城类开发教程:1微信小程序之侧栏分类 —— 微信小程序实战商城系列(1)2微信小程序之仿淘宝分类入口 —— 微信小程序实战商城系列(2)3微信小程序之购物数量加减 —— 微信小程序实战商城系列(3)4微信小程序之商品属性分类 —— 微信小程序实战商城系列(4)…...
2024/5/5 19:53:35 - Hexo博客+Next主题深度优化与定制
写在前面本教程只适用于 Next5 或者 Next6 主题,Next7 开始做了大量修改,并删除了 custom.styl 文件,同时增加了很多在 Next7 之前需要手动配置的功能,请随个人喜好进行版本选择。环境准备 在安装 hexo 框架之前,我们需要先安装该框架的依赖环境:Node.js Git因为 Hexo 博…...
2024/5/5 23:44:06 - Vue 全家桶学习资源(持续更新)
companion:React 全家桶学习资源(持续更新)下面整理了一些关于Vue以及Vue衍生的学习资源:官网文档官网APIECMAScript 6 入门30分钟掌握ES6/ES2015核心内容(上)30分钟掌握ES6/ES2015核心内容(下)vuefeVue 中文社区vue-router 2Vuex到底 Vuex 是什么Vuex 原来可以这样上手vuex-…...
2024/5/5 17:00:35 - 初学者应该怎么学习前端?web前端的发展路线大剖析!
此套前端课程的知识体系包括:html,css,html5,css3,JavaScript,jquery,bootstrap,Ajax,vue.js,node.js等等。从初级到高级框架应有尽有, 另外教程里面除超清视频课件以外,最重要的是还有学习笔记,源码,作业练习等等。一共100个G,非常全面。内容由浅入深,非常适合…...
2024/5/5 21:58:58 - 2019新版技术胖Vue.Js+Koa2 移动电商实战(完整版)
第1章: 项目搭建 第2章: 首页布局 第3章: mock使用 第4章: 首页交互开发 第5章: koa2后端开发下载地址:百度网盘...
2024/5/5 20:08:51 - 百度云学习资源整合
关注微信公众号《IT技术资源共享》获取更多资源! 微信号:feng1376311650 或者扫二维码关注获取下面全部资源:python:【0001】Python安装包,教程文档,工具包 链接:http://pan.baidu.com/s/1hsnHizM 密码:9x03【0002】Python基础到高级视频教程 链接:http://pan.bai…...
2024/5/5 18:15:17 - react全家桶从0到1(react-router4、redux、redux-saga)
react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目。文中针对react、webpack、babel、react-route、redux、redux-saga的核心配置会加以讲解,希望通过这个项目,可以系统的了解react技术栈的主要知识,避免搭建一次后面就忘记的情况。…...
2024/4/19 23:57:58 - 征服Kotlin-李宁-专题视频课程
征服Kotlin—7027人已学习 课程介绍 包括Kotlin开发环境搭建、Kotlin基础知识、类和接口、枚举类、扩展、泛型、函数、lambdas表达式、对象、标准API等。课程收益 本课程让学员充分了解Kotlin的核心知识,已经如何通过Kotlin开发Android App。讲师介绍 李宁更多讲…...
2024/4/15 4:01:48 - 【收藏】Appium 国内下载地址(百度云盘,已更新至 1.3.4.1)
链接是Appium相关安装包下载地址(exe&dmg格式),如需自取:) 最新更新的是: appium-1.3.4.dmg& AppiumForWindows-1.3.4.1.zip 现已更新到 TesterHome官方百度网盘 下载地址: http://pan.baidu.com/s/1jGvAISuAppium各版本release doc地址: https://github.com…...
2024/4/15 4:01:47 - Webpack 4.X 从入门到精通 - loader(五)
通过上一篇文章相信大家已经明白了loader的概念。那这篇文章继续介绍一些常用loader,并展现它的强大之处 处理less less与sass的功能都一样,这里我就以less为例,介绍其对应loader的用法。less的语法对于浏览器那是必需不认识的,要处理成浏览器认识的需要借助两个模块,一个…...
2024/4/18 5:26:49
最新文章
- <网络安全>《74 微课堂<容器是什么?>》
1 容器 容器,是一种虚拟化技术。允许一个操作系统上用户空间被分割成几个独立的单元在内核中运行,彼此互不干扰,这样一个独立的空间,就被称之为一个容器。 2 容器技术为什么得到快速发展 随着智能制造的推进,企业开…...
2024/5/6 1:21:27 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 探索进程控制第一弹(进程终止、进程等待)
文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么?进程终止的情况代码跑完,结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…...
2024/5/5 1:11:34 - JS实现双向数据绑定的三种方式
1、第一种是通过Proxy数据代理来达到双向绑定的,这是Vue3更新的双向绑定方式。 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Proxy双向绑定</title> <<...
2024/5/5 19:53:09 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/4 23:55:17 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/4 18:20:48 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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