学习全文大概需要 12分钟,内容实战性较强。

1. 前言

本篇将基于Python 3.7+Django 3.0结合Vue.js前端框架,为大家介绍如何基于这三者的技术栈来实现一个前端后离的Web开发项目。为了简化,方便读者理解,本文将以开发一个单体页面应用作为实战演示。

2. 先搞清楚什么是前后端分离

在正式开始实战示例之前,我们有必要先弄清楚一个概念:什么是前后端分离?

前后端分离目前已成为互联网项目开发的业界标准使用方式,在聊前后端分离之前,相信也有很多读者,对如何区分前端还是后端,还搞不清楚(是不是让我戳中了你的痛处了)。本着“致良知”,先科谱一下知识。

通常情况下,我们说的前端,大多是指浏览器这一端,一般是用Html+CSS+JS来实现的,所以通常会引申为用Html+CSS+JS写的大部分程序都是前端,包括App,小程序,H5等。

PS: 在NodeJS出现之后,用NodeJS写的后端部分,也会被人归类为前端,为了区分之前的前端,就给他们起了一个名字,叫做“大前端”。

久而久之,人们习惯把Html+CSS+JS,运行在浏览器端执行的,称之为前端。

而Java,C,Python,PHP这些运行在服务器端的,统一称之为后端。

但,这种以语言为分界点去区分前后端,真的合理么?显然不合理!

前后端的定义,不应该是以语言来定义,而是应该以它的运行环境,如果是在服务器端,就应该被称之为后端,代表着你看不见,摸不着。而如果运行在用户端,就应该被称之为前端,代表你是可以看得到的。

在不分前后端的时候,无论是Java还是JS,全都是一个人来写。

为什么现在很多互联网公司在项目开发时,建议要进行前后端分离,或者说前后端分离能带来哪些优势?(好处多多,这里仅提两个点)

  • 第一个,并行开发、独立部署、实现前后端解前后端的进度互不影响,在过去,前后端不分离的情况下,项目代码耦合严重相互影响,且前后端人员工作量分布不均。

  • 第二个,术业有专攻(开发人员分离)以前的JavaWeb项目大多数都是Java程序员又当爹又当妈,又搞前端,又搞后端。前后端分离之后,前端工程师只管前端的事情,后端工程师只管后端的事情。

我们先看看一个 Web 系统,在前后端不分离时架构设计是什么样的。

用户在浏览器上发送请求,服务器端接收到请求,根据 Header 中的 token 进行用户鉴权,从数据库取出数据,处理后将结果数据填入 HTML 模板,返回给浏览器,浏览器将 HTML 展现给用户。

而采用前后端分离之后,分离的是人员职责,人员职责分离了,因此架构也发生变化。

前后端分离后,前端人员和后端人员约定好接口,前端人员不用再关心业务处理是怎么回事,他只需要把界面做好就可以了,后端人员也不用再关系前端界面是什么样的,他只需要做好业务逻辑处理即可。

小结一下,前后端分离是什么?

前后端分离是一种架构模式,或者说是最佳实践,它主张将前端开发人员和后端开发人员的工作进行解耦,尽量减少他她们之间的交流成本,帮助他她们更能专注于自己擅长的工作。

PS: 本篇实战示例,使用Vue.js作为前端框架,代替Django本身自带的模板引擎,Django则作为服务端提供API接口,从而实现前后端分离。

3. 环境准备

本实战示例,基础环境对应安装版本如下:

  • Python 3.7.4

  • Mysql 5.7

  • Pycharm (建议专业版)

  • Node

PS: 其中Python、Mysql、Pycharm、Node安装过程皆较为简单,不是本文介绍重点,读者可直接参考官网安装方法。

4. 新建独立的虚拟开发环境

1、创建一个用于Django项目开发的独立虚拟环境,切换到本地开发目录,输入如下命令:

python3 -m venv venv

2、创建完成后,目录结构如下:

➜  venv tree -L 2
.
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── easy_install
│   ├── easy_install-3.7
│   ├── pip
│   ├── pip3
│   ├── pip3.7
│   ├── python -> python3
│   └── python3 -> /usr/local/bin/python3
├── include
├── lib
│   └── python3.7
└── pyvenv.cfg4 directories, 11 files

3、进入到bin目录,输入命令source activate 命令,激活虚拟环境。

4、虚拟环境激活后,如上图所示。接下来,在虚拟环境安装Django库。

安装Django (最新版本为3.0)

(venv) ➜  pip install Django

Django 项目源码:

https://github.com/django/django

Django3.0 版本特性可查阅官网:

https://docs.djangoproject.com/en/3.0/releases/3.0/


5、安装完成后,可检查一下版本信息:

(venv) ➜  python
Python 3.7.4 (default, Jul  9 2019, 18:15:00)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print(django.get_version())
3.0

可以发现,在虚拟环境中已经成功安装好了Django 3.0。

5. 创建Django后端项目

1、创建Django项目,采用Pycharm或者命令行创建皆可。此处,以命令行方式作为演示,项目名为django_vue。

(venv) ➜ django-admin startproject django_vue

2. Django项目创建完成后,目录结构如下所示。

├── django_vue
│   ├── django_vue
│   │   ├── __init__.py
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── manage.py

3、执行同步数据库文件(Django默认数据库为db.sqlite3),执行同步过程如下:

(venv) ➜  python manage.py migrate
Operations to perform:Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying sessions.0001_initial... OK

4、启动Django Server ,验证默认配置是否正常。

(venv) ➜   python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...System check identified no issues (0 silenced).
December 15, 2019 - 08:36:28
Django version 3.0, using settings 'django_vue.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

5、打开浏览器,访问http://localhost:8000,一切正常的话,可见到如下界面。

6. 将Django数据库更换为Mysql

1、假设在前面,我们已经安装配置好了Mysql,输入如下命令进入到Mysql。

mysql -u root -p

2、创建数据库,数据库取名为django_vue_db,并设置字符集为utf-8。

mysql> CREATE DATABASE django_vue_db CHARACTER SET utf8;
Query OK, 1 row affected (0.01 sec)

3、安装myslqclient库

(venv) ➜  pip install mysqlclient

4、配置settings.py文件,配置Mysql数据库引擎。

```pythonDATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django_vue_db','USER': 'root','PASSWORD': 'xxxxxxx','HOST': '127.0.0.1',}
}
```

5、执行同步操作,将数据迁移到Mysql。

python manage.py migrate

6、验证是否切库成功,进入到Mysql客户端,查看django初化表是否有生成。

mysql> use django_vue_db;
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_django_vue_db    |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
10 rows in set (0.00 sec)

7、运行Django Server,重新访问http://localhost:8000。

python manage.py runserver 0.0.0.0:8000

如果能正常访问,过程没有报错,说明切换数据库已经成功了。

7. 创建Django实战项目App

1、创建Django App,进入django_vue项目主目录,输入如下命令:

(venv) ➜  python manage.py startapp api_test

2、App创建完成后,目录结构如下所示:

├── api_test
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py

并把api_test加入到settings文件中的installed_apps列表里:

```python
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','api_test',
]
```

3、 在api_test目录下的models.py里我们简单写一个model如下:

```python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
class Book(models.Model):book_name = models.CharField(max_length=128)add_time = models.DateTimeField(auto_now_add=True)def __unicode__(self):return self.book_name
```

只有两个字段,书名book_name和添加时间add_time。如果没有指定主键的话Django会自动新增一个自增id作为主键。

4、在api_test目录下的views里我们新增两个接口,一个是show_books返回所有的书籍列表(通过JsonResponse返回能被前端识别的json格式数据),二是add_book接受一个get请求,往数据库里添加一条book数据。

```python
from django.shortcuts import render
from django.views.decorators.http import require_http_methods
from django.core import serializers
from django.http import JsonResponse
import jsonfrom .models import Book@require_http_methods(["GET"])
def add_book(request):response = {}try:book = Book(book_name=request.GET.get('book_name'))book.save()response['msg'] = 'success'response['error_num'] = 0except  Exception as e:response['msg'] = str(e)response['error_num'] = 1return JsonResponse(response)@require_http_methods(["GET"])
def show_books(request):response = {}try:books = Book.objects.filter()response['list'] = json.loads(serializers.serialize("json", books))response['msg'] = 'success'response['error_num'] = 0except  Exception as e:response['msg'] = str(e)response['error_num'] = 1return JsonResponse(response)
```

可以看出,在ORM的帮忙下,我们的接口实际上不需要自己去组织SQL代码。

5、在api_test目录下,新增一个urls.py文件,把我们新增的两个接口添加到路由里:

from django.conf.urls import url, include
from .views import *urlpatterns = [url(r'add_book$', add_book, ),url(r'show_books$', show_books, ),
]
```

6、我们还要把api_test下的urls添加到项目django_vue下的urls中,才能完成路由:

```python
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from django.contrib import admin
from django.views.generic import TemplateView
import api_test.urlsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^api/', include(api_test.urls)),
]
```

7、在项目的根目录,输入命令:

python manage.py makemigrations api_test
python manage.py migrate

8、查询数据库,看到book表已经自动创建了:

mysql> show tables;
+----------------------------+
| Tables_in_django_vue_db    |
+----------------------------+
| api_test_book              |
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
11 rows in set (0.00 sec)
mysql> desc api_test_book;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| book_name | varchar(128) | NO   |     | NULL    |                |
| add_time  | datetime(6)  | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql>
```

Django生成的表名将以app名加上model中的类名组合而成。

9、在项目的根目录,输入命令:

python manage.py runserver 0.0.0.0:800

启动服务,通过httpie测试一下我们刚才写的两个接口。

10、通过调用接口向Django App中添加两条书名记录。

```shell
➜  http http://127.0.0.1:8000/api/add_book\?book_name\=mikezhou_talk
HTTP/1.1 200 OK
Content-Length: 34
Content-Type: application/json
Date: Sun, 15 Dec 2019 09:11:12 GMT
Server: WSGIServer/0.2 CPython/3.7.4
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
{"error_num": 0,"msg": "success"
}➜  http http://127.0.0.1:8000/api/add_book\?book_name\=测试开发技术
HTTP/1.1 200 OK
Content-Length: 34
Content-Type: application/json
Date: Sun, 15 Dec 2019 09:11:44 GMT
Server: WSGIServer/0.2 CPython/3.7.4
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
{"error_num": 0,"msg": "success"
}
```

11、通过调用接口,显示Django App中所有书名列表:

```shell
➜  http http://127.0.0.1:8000/api/show_books
HTTP/1.1 200 OK
Content-Length: 305
Content-Type: application/json
Date: Sun, 15 Dec 2019 09:13:48 GMT
Server: WSGIServer/0.2 CPython/3.7.4
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
{"error_num": 0,"list": [{"fields": {"add_time": "2019-12-15T09:11:12.673Z","book_name": "mikezhou_talk"},"model": "api_test.book","pk": 1},{"fields": {"add_time": "2019-12-15T09:11:44.305Z","book_name": "测试开发技术"},"model": "api_test.book","pk": 2}],"msg": "success"
}
```

8. 新建Vue.js前端项目

1、有关Vue的模块(包括vue)可以使用node自带的npm包管理器安装。推荐使用淘宝的 cnpm 命令行工具代替默认的 npm。

npm install -g cnpm --registry=https://registry.npm.taobao.org

2、先用cnpm安装vue-cli脚手架工具(vue-cli是官方脚手架工具,能迅速帮你搭建起vue项目的框架):

cnpm install -g vue-cli

3、安装好后,在django_vue项目根目录下,新建一个前端工程目录:

vue-init webpack frontend

在创建项目的过程中会弹出一些与项目相关的选项需要回答,按照真实情况进行输入即可。

4、安装 vue 依赖模块

cd frontend
cnpm install
cnpm install  vue-resource
cnpm install element-ui

5、现在我们可以看到整个文件目录结构是这样的:

本文为了读者方便查看,是直接将vue前端工程放在django项目目录下,实际多人协作开发过程中,完全是可以放在不同代码仓库下面的。

6、在frontend目录src下包含入口文件main.js,入口组件App.vue等。后缀为vue的文件是Vue.js框架定义的单文件组件,其中标签中的内容可以理解为是类html的页面结构内容。

7、在src/component文件夹下新建一个名为Home.vue的组件,通过调用之前在Django上写好的api,实现添加书籍和展示书籍信息的功能。在样式组件上我们使用了饿了么团队推出的element-ui,这是一套专门匹配Vue.js框架的功能样式组件。由于组件的编码涉及到了很多js、html、css的知识,并不是本文的重点,因此在此只贴出部分代码:

Home.vue文件代码:

```vue<template>
<div class="home">
<el-row display="margin-top:10px">
<el-input v-model="input" placeholder="请输入书名" style="display:inline-table; width: 30%; float:left"></el-input>
<el-button type="primary" @click="addBook()" style="float:left; margin: 2px;">新增</el-button>
</el-row>
<el-row>
<el-table :data="bookList" style="width: 100%" border>
<el-table-column prop="id" label="编号" min-width="100">
<template slot-scope="scope"> {{ scope.row.pk }} </template>
</el-table-column>
<el-table-column prop="book_name" label="书名" min-width="100">
<template slot-scope="scope"> {{ scope.row.fields.book_name }} </template>
</el-table-column>
<el-table-column prop="add_time" label="添加时间" min-width="100">
<template slot-scope="scope"> {{ scope.row.fields.add_time }} </template>
</el-table-column>
</el-table></el-row></div>
</template><script>
export default {name: 'home',data () {return {input: '',bookList: []}},mounted: function () {this.showBooks()},methods: {addBook () {this.$http.get('http://127.0.0.1:8000/api/add_book?book_name=' + this.input).then((response) => {var res = JSON.parse(response.bodyText)if (res.error_num === 0) {this.showBooks()} else {this.$message.error('新增书籍失败,请重试')console.log(res['msg'])}})},showBooks () {this.$http.get('http://127.0.0.1:8000/api/show_books').then((response) => {var res = JSON.parse(response.bodyText)console.log(res)if (res.error_num === 0) {this.bookList = res['list']} else {this.$message.error('查询书籍失败')console.log(res['msg'])}})}}
}
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>h1, h2 {font-weight: normal;}ul {list-style-type: none;padding: 0;
}li {display: inline-block;margin: 0 10px;
}a {color: #42b983;
}
</style>
```

8、在src/router目录的index.js中,我们把新建的Home组件,配置到vue-router路由中:

```js
import Vue from 'vue'
import Router from 'vue-router'
// import HelloWorld from '@/components/HelloWorld'
import Home from '@/components/Home'
Vue.use(Router)
export default new Router({routes: [{path: '/',name: 'Home',component: Home}]
})
```

9、在src/main.js文件中,导入element-ui、vue-resource库。

```js
import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui'
import VueResource from 'vue-resource'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
Vue.use(VueResource)
Vue.config.productionTip = false/* eslint-disable no-new */
new Vue({el: '#app',router,components: { App },template: '<App/>'
})
```

10、如果出现跨域问题,需要在Django层注入header,用Django的第三方包django-cors-headers来解决跨域问题:

pip install django-cors-headers

settings.py 修改:

```python
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','corsheaders.middleware.CorsMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]CORS_ORIGIN_ALLOW_ALL = True
```

PS: 注意中间件的添加顺序。

12、在前端工程frontend目录下,输入npm run dev启动node自带的服务器,浏览器会自动打开, 我们能看到页面:

13、尝试新增书籍,如填入:“自动化测试实战宝典”,新增的书籍信息会实时反映到页面的列表中,这得益于Vue.js的数据双向绑定特性。

14、在前端工程frontend目录下,输入npm run build,如果项目没有错误的话,就能够看到所有的组件、css、图片等都被webpack自动打包到dist目录下了:

9. 整合Django和Vue.js前端

目前我们已经分别完成了Django后端和Vue.js前端工程的创建和编写,但实际上它们是运行在各自的服务器上,和我们的要求是不一致的。因此我们须要把Django的TemplateView指向我们刚才生成的前端dist文件即可。

1、 找到project目录的urls.py,使用通用视图创建最简单的模板控制器,访问 『/』时直接返回 index.html:

```python
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^api/', include(api_test.urls)),url(r'^$', TemplateView.as_view(template_name="index.html")),
]
```

2、上一步使用了Django的模板系统,所以需要配置一下模板使Django知道从哪里找到index.html。在project目录的settings.py下:

```python
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS':['frontend/dist'],'APP_DIRS':True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]
```

3、 我们还需要配置一下静态文件的搜索路径。同样是project目录的settings.py下:

```python
# Add for vuejs
STATICFILES_DIRS = [os.path.join(BASE_DIR, "frontend/dist/static"),
]
```

4、 配置完成,我们在project目录下输入命令python manage.py runserver,就能够看到我们的前端页面在浏览器上展现:

注意此时服务的端口已经是Django服务的8000而不是node服务的8080了,说明我们已经成功通过Django集成了Vue前端工程。

该实战示例为大家充分展示了现在主流的前后端分离方式,由前端框架,如Vue.js来构建实现前端界面,再通过后端框架,如Django来实现API数据提供,两者通过接口进行通讯、相辅相成、最终实现一个完整Web项目。

推荐阅读:

王垠受邀面试阿里P9,被P10面跪后网上怒发文,惨打325的P10赵海平回应了!

张一鸣:白手起家干到千亿身价,位列中国富豪第7位,只用了7年


关注“Python之禅“,学地道的Python技术

好文和朋友一起看~ 

相关文章

  1. Vue.js实战——数据绑定和第一个Vue应用(二)

    2.指令与事件 2.1 v-bind与v-on指令(Dicrectives)是Vue.js模板中最常用的一项功能数据驱动DOM是Vue.js的核心概念,所以不可轻易主动操作DOMv-bind:动态更新HTML元素上的属性,比如id,class等,语法糖:: v-on:绑定事件监听器,语法糖:@<!DOCTYPE html> <html>…...

    2024/5/1 16:11:13
  2. Vue.js实战之系统学习第三节

    Vue.js实战之系统学习第二节想看上一节请点击上面的链接。这一节我们要学习的是计算属性在模板中双向绑定一些数据或表达式,会出现表达式过长,或者罗竞技较为复杂,就会变得臃肿甚至难以阅读和维护。<div>{{ text.spilt(,).reverse().join(,)}} </div>这里的表达…...

    2024/5/1 16:11:08
  3. 最新版教学Vue.js渐进式JavaScript框架

    点击蓝色 “达达前端” 关注我哦!加个 “星标” ,每天一篇文章,一起学编程2020年02月09日什么是vue.js?vue.js是一款渐进式的JavaScript框架。什么是渐进式?渐进式就是指可以由浅入深的,由简单到困难的一种方式。那么vue.js有什么优点?vue.js拥有更小的体积,压缩后的vue…...

    2024/5/1 16:11:04
  4. 《vue.js从入门到项目实战》之Vue项目化笔记

    Vue项目化 前言: 《vue.js从入门到项目实战》的第六章和第八章。尝试一下Vue项目化的过程。 前置内容:vue的基础知识 上次学习了《vue.js从入门到项目实战》的前六章,重点学习了第二、三、四章的Vue实例和模板语法;了解了一下Vue组件(可复用的Vue实例)和Vue项目化(Vue C…...

    2024/5/1 16:11:00
  5. 15.vue.js实战笔记(自定义指令、JSX、ejs、使用webpack、插件)

    一、自定义指令1.基本用法自定义指令分全局注册和局部注册,例如注册一个v-focus指令用于在<input>元素初始化时自动获得焦点,两种写法分别是:(1)全局注册Vue.directive(focus,{//指令选项 });(2)局部注册var app = new Vue({el:#app,directives:{focus:{//指令选项…...

    2024/5/5 7:49:14
  6. Vue.js实战——数据绑定和第一个Vue应用(一)

    参考:《Vue.js实战》梁灏 1. Vue实例与数据绑定 1.1 Vue实例与数据绑定 <!DOCTYPE html> <html><head><meta charset="utf-8"><title></title><script src="js/vue.min.js" type="text/javascript" cha…...

    2024/5/1 16:10:52
  7. vue的书籍调研

    淘宝搜索vue然后选择前面5页汇总市面上所有vue书籍Spring Boot+Spring Cloud+Vue+Element项目实战(没啥用)Spring Boot+Vue全栈开发实战Vue.js开发实战(没啥用)Vue.js项目开发实战-张帆(电影网站项目)深入浅出Vue.js-刘博文(没啥用)移动Web前端高效开发实战(最后一章搭…...

    2024/5/1 16:10:49
  8. 智能社vue.js项目实战(精讲)

    下载地址:百度网盘...

    2024/5/1 16:10:44
  9. Vue.js-Day07【项目实战(附带 完整项目源码)-day02:学习能力、字体图标(使用步骤)、在vue.js中使用jQuery】

    【项目源码】 链接:https://pan.baidu.com/s/1r0Mje3Xnh8x4F1HyG4aQTA 提取码:n6ol目 录0、学习能力 1、字体图标1.1、使用步骤1.2、使用2、在Vue中使用jQuery0、学习能力 阅读能力阅读文档阅读博客阅读书籍解决问题能力分析问题(思路问题、代码编写)解决问题思路问题:冷…...

    2024/5/1 2:12:19
  10. vue.js移动端app实战3:从一个购物车入门vue

    什么是vuex? 官方的解释是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 简单来说就是集中管理所有的状态。 为什么要用vuex?对于父子组件之前的通信,父组件通过po…...

    2024/5/3 11:28:48
  11. 项目总结:vue.js2.5饿了么APP(1)概述+项目准备

    说明:本总结来源于慕课网 @ustbhuangyi老师的课程《Vue.js2.5+cube-ui重构饿了么App》课程,本博客做了项目总结梳理便于回顾,需要学习的伙伴可以移步学习。与君共勉!项目总结:vue.js2.5饿了么APP(1)概述+项目准备 项目总结:vue.js2.5饿了么APP(2)主要组件实现 - 头部…...

    2024/5/1 16:09:52
  12. 前端自检梳理——Vue.js项目实战开发

    01. Vue基础语法1)总结2)总结3)组件化开发4) 02. Vue路由 目标总结03. Vue前端工程化 目标总结04. Vue电商项目实战 Day01目标Day01总结Day02~Day03目标Day02总结Day03总结Day04目标Day04总结Day05目标Day05总结Day06目标Day06总结Day07目标Day07总结05. Vuex电商项目实战 …...

    2024/5/1 16:09:48
  13. Vue.js实战——框架搭建_2

    1、参考网友的经验安装Node.js:https://blog.csdn.net/zhaibingbinglove/article/details/79311673安装好:node(如果部分组件下载timeout时,才需要考虑使用cnpm,建议一开始跳过这步)。本人因几个月前已经做完这些操作,无法一一验证。各位也可以自行通过其他经验进行安装…...

    2024/5/1 16:10:32
  14. Vue.js 学习系列(一)

    文章目录一、什么是Vue.js二、框架和库的区别三、Node(后端)中的 MVC 与 前端中的 MVVM 之间的区别四、Vue.js 基本代码 和 MVVM 之间的对应关系(一)、Vue之 - `基本的代码结构`和`插值表达式`、`v-cloak`(二)Vue指令之`插值`:(三)Vue指令之`v-bind`的三种用法(四)V…...

    2024/5/1 16:10:28
  15. Vue.js实战——微信拍照时页面会被刷新的BUG定位_9

    一、目标1、这几个月辛辛苦苦做出来,基于Vue.js和html5的项目里面,一直存在一个明显的BUG:在微信公众号拍照后,会出现概率重定向到当前页面(当前页面被刷新,或者叫做重新加载)。这两天的目标就是定位并解决这个bug,提高用户体验。2、基于之前的承诺,把精简后确实可用的…...

    2024/5/1 16:10:24
  16. Vue.js--实例与数据绑定

    Vue实例 Vue.js应用的创建很简单,通过构造函数Vue就可以创建一个Vue的根实例,并启动Vue应用: var app = new Vue({//选项 })变量app就代表了这个Vue实例。事实上,几乎所有的代码都是一个对象,写入Vue实例的选项内。 el: 首先:必不可少的一个选项就是el。el用于指定一个页…...

    2024/5/2 17:31:55
  17. vue.js 初步--动态订单结算列表

    刚接触vue.js ,写了个动态的订单列算列表Demo效果: 代码:<template><div class="page-field"><mt-header title="回收登记"><router-link to="/reclaimList" slot="left"><mt-button icon="back&q…...

    2024/5/1 16:10:16
  18. Vue.js-Day01-AM【第一次学习-安装、基础使用(引入方式)、数据展示、指令介绍(v-html、v-text、v-bind、v-if、v-for】

    目 录1、讲在前面课程内容实训课内容2、Vue.js介绍2.1、安装开发环境版本介绍2.2、基础使用引入Vue.js---方式1引入Vue.js---方式2输出Vue.js的构造函数使用Vue.js的3个步骤原生实现(不使用Vue.js)2.3、数据的展示var、let区别插值表达式3、常用指令3.1、指令介绍3.2、常用…...

    2024/5/1 16:10:14
  19. php开发面试题---vue面试题(vue.js的好处及作用)

    php开发面试题---vue面试题(vue.js的好处及作用) 一、总结 一句话总结: 双向数据绑定:在做ajax的时候,更新实在是太方便了 用数据绑定的思想,vue可以简单写单个页面,也可以写一个大的前端系统,也可以做手机app的界面。1、Vue.js是什么? 渐进式框架 自底向上增量开发的…...

    2024/5/1 16:10:09
  20. express+webpack+vue.js实战

    建立express项目首先通过如下命令创建一个express的ejs模板项目(PS:ejs 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。)express ewv_test -e再…...

    2024/5/1 16:10:04

最新文章

  1. npm ERP! 错误【已解决】

    错误内容&#xff1a; (base) C:\Users\14605>npm install -g cnpm --registryhttps://registry.npm.taobao.org npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/cnpm failed, reason: certificate …...

    2024/5/7 3:20:42
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/6 9:38:23
  3. dp小兰走迷宫

    昨天学习了bfs的基本概念&#xff0c;今天来做一道经典习题练练手吧&#xff01; bfs常用的两类题型 1.从A出发是否存在到达B的路径(dfs也可) 2.从A出发到B的最短路径&#xff08;数小:<20才能用dfs&#xff09; 遗留的那个问题的答案- 题目&#xff1a;走迷宫 #incl…...

    2024/5/5 21:03:10
  4. Vue组件的注册和使用方法

    全局注册​ 我们可以使用 Vue 应用实例的 .component() 方法&#xff0c;让组件在当前 Vue 应用中全局可用。 import { createApp } from vueconst app createApp({})app.component(// 注册的名字MyComponent,// 组件的实现{/* ... */} ) 如果使用单文件组件&#xff0c;你可以…...

    2024/5/5 8:39:30
  5. 2019最新23套前端(包含17套vue.js视频教程2套webpack 4套react native)

    ...

    2024/5/4 1:38:29
  6. NPM方法安装Vue.js 超详细~

    首先,先列出我们接下来需要的东西:node.js环境(npm包管理器) vue-cli 脚手架构建工具 cnpm npm的淘宝镜像1.安装Node.js node.js官网:https://nodejs.org/en/ 从node.js官网下载并安装node,下载完成后,一直点下一步就ok了,安装完之后,我们通过打开命令行工具(win+R)…...

    2024/5/2 15:23:16
  7. Vue.js 生产环境部署

    生产环境部署开启生产环境模式开发环境下,Vue 会提供很多警告来帮你对付常见的错误与陷阱。而在生产环境下,这些警告语句却没有用,反而会增加应用的体积。此外,有些警告检查还有一些小的运行时开销,这在生产环境模式下是可以避免的。不使用构建工具如果用 Vue 完整独立版本…...

    2024/5/2 7:01:39
  8. vue.js从入门到放弃1--环境安装,包括linux和window

    1.windows安装vue.js环境。1.1 先决条件,本地装了npm安装环境,查看的话,就新建一个目录,然后shift+右键->在此处打开命令行。 然后输入npm -v 去查看npm的版本 1.2 更新npm的版本到最新的版本npm i -g npm1.3 安装cnpm,这是淘宝的npm资源,安装vue会快很多,然后将npm设…...

    2024/5/5 23:56:02
  9. vue-cli3.x + vux 环境配置

    vue-cli 3.x 使用全新配置模式,GUI操作,无webpackconfig文件。 根据官方文档,根目录下新建 vue.config.js,可修改相关webpack配置npm install vux --save npm install vux-loader --save-dev安装成功后 // vue.config.js 文件如下const vuxLoader = require(vux-loader)mod…...

    2024/5/2 15:23:04
  10. Vue开发环境配置

    Vue.js是一个构建数据驱动的web界面的渐进式框架,其通过尽可能简单的API实现响应的数据绑定和组合的视图组件。与传统的Angular.js和React框架相比,Vue.js不仅具有简单易学和上手快的特点,并且可以通过组件的特性实现单页面的局部刷新和页面组件的重复利用,因此使用Vue.js技…...

    2024/5/3 6:00:19
  11. nodejs运行vue项目

    1、下载nodejs官网:https://nodejs.org/en/ (下图是我下载的版本)2、下载后压缩包3、开始安装安装很简单,默认下一步,就可以了(中间可选择安装路径)安装后里面的文件如图4、安装后判断是否安装成功 及环境变量配置node -v ; npm -v (一般新的node安装自带npm包管理器…...

    2024/5/2 1:31:53
  12. Vue-Cli 4版本运行环境配置

    一、问题描述 Vue-Cli自3.x以上版本取消了config目录,我们没法直接在config目录下的文件中对运行环境进行配置,因此需要开发者手动完成配置。 二、配置方法 1.新建vue.config.js文件 在项目的根目录新建vue.config.js文件,并在该文件中配置相应的启动项。 // vue.config.js …...

    2024/5/2 4:42:11
  13. 前后端分离之Vue(一)环境配置

    Vue环境配置前言:之前开发过微信小程序,感觉前后端分离的开发非常舒服,在线学习了下Vue这个前端框架,感觉与小程序的开发类似。动手搭建下前后端分离的项目,做个简单的Demo,体会下前后端分离的开发。写下这个系列也是记录自己在学习Vue的实践过程。Vue官网地址,可在线学…...

    2024/5/1 21:47:04
  14. 使用 Docker 部署 Vue.js + Go 项目

    最近公司要求搞一个 dashboard ,前端用 Vue.js 框架,后端用 Go 语言写的。在决定用 Docker 进行部署的时候,遇到了很多问题,特此记录。由于这个项目需要使用 AWS 中的 DynamoDB,因此需要先在 Docker 的 image 中安装 aws-cli,然而 aws-cli 只能依赖 Python 进行安装。因为…...

    2024/5/1 22:18:49
  15. Vue.js分环境打包到部署-并用nginx代理请求后端接口

    1.Vue.js分环境打包 vue.js分环境打包(vue-cli2.0),主要应对开发环境和生产环境请求后端地址ip不同,避免每次打包需要反复修改baseUrl的问题,根据npm run dev / npm build 打包生成不同baseUrl 配置。 打开config目录 分别修改以下两个文件如下: dev.env.js 开发环境 use …...

    2024/5/1 23:24:51
  16. vue-cli 3搭建vue项目后对vue.config.js进行简单配置

    vue-cli 3搭建vue项目后目录下没有vue.config.js文件,如果要配置,需要自己手动在根目录(与package.json同级目录)下新建此文件下面是简单的配置及说明module.exports = {// 详细、更多配置请查看官网https://cli.vuejs.org/zh/config/#vue-config-js/** 区分打包环境与开发…...

    2024/5/2 10:10:55
  17. 让vue-cli3.0 配置简单起来(vue.config.js编结)

    前提:随着vue脚手架的升级,越来越便于开发者开发和维护项目,本质上vue-cli3提供了基础的配置和可拓展的空间,但是vue-cli3官网对于新脚手架的用例都比较简洁,更多的内容需要我们去研究,更多都是基于webpack去拓展。为了更好的入门,我写了个常用配置的小总结,下面我们来…...

    2024/5/6 20:32:20
  18. vue.js 三种方式安装(转)

    https://blog.csdn.net/m0_37479246/article/details/78836686https://www.cnblogs.com/winter92/p/7117057.html的版本号,则说明你安装成功了。npm包管理器,是集成在node中的,所以安装了node也就有了npm,直接输入 npm -v 命令,显示npm的版本信息。到目前为止,node的环境已…...

    2024/5/2 15:22:28
  19. 基于node.js开发环境下创建及开发vue.js项目的环境配置骤

    基于node.js开发环境下创建开发vue.js项目的环境配置骤如下: 步骤一:安装node.js,安装完后运行node -v命令检安装node的查版本,判断是否安装成功。Npm是node.js包管理工具。安装node就会自动安装它的包管理工具,查看是否成功安装运行npm -v命令即可。 //这些是在互联网电脑…...

    2024/5/2 15:22:23
  20. vue-cli4.0之vue.config.js的配置项

    const path = require(“path”); module.exports = { // 部署应用时的基本 URL publicPath: process.env.NODE_ENV === “production” ? “/production-sub-path/” : “/”, // build时构建文件的目录 构建时传入 --no-clean 可关闭该行为 outputDir: “dist”, // build时…...

    2024/5/2 2:32:31
  21. 前端自动化测试jest教程9-TDD+单元测试,BDD+集成测试

    准备条件 以第1节教程的创建的目录和代码为基础进行讲解。如果没有看过第1节教程,请关注我,查看以往该系列的文章 这节教程主要讲解TDD+单元测试,BDD+集成测试 什么是TDD? Test Driven Development 测试驱动开发 顾名思义,就是我们先根据需求去写测试用例,根据测试用例再…...

    2024/5/2 15:22:15
  22. react基础教程

    react基础教程官网安装目录结构hello world组件化图片和样式表的引入学习资源推荐:https://blog.csdn.net/qq_42813491/article/details/90213353官网https://react.docschina.org/官方教程:https://react.docschina.org/tutorial/tutorial.html介绍什么的就不说了,从代码开…...

    2024/5/2 3:22:20
  23. 带你玩转vue——简单高效的vue.config.js配置

    通用的vue.config.js配置 module.exports = {publicPath: ./,devServer: {port: 7004,disableHostCheck: true},assetsDir:static,indexPath:"index.html",//lintOnSave: false,runtimeCompiler: true,productionSourceMap: false,css:{extract:true,sourceMap: fals…...

    2024/5/6 21:45:14
  24. Konva快速入门

    konva简单理解1、 当我们刚接触到canvas时,我们期待如何去画出如游戏中的图画,而konva便是让我们更加便捷画图的库,如同JS有jQuery,首先我们要了解图画的构造把整个视图看做一个舞台stage 而舞台中的每一层,看做layer layer层中有许多group组 在group中绘制画图、图片等2、…...

    2024/5/1 17:30:44
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

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

    2022/11/19 21:17:18
  26. 错误使用 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,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
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:16:58
  44. 如何在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