第一板块
- 在配置文件中设置ESLint报错规则: 第一个框是用来关闭函数名前没有空格 报错; 第二个框是关闭 因为组件名字没有驼峰命名或者多单词命名 报错
- 这里的验证函数只能放在data函数中, 考虑到this的指向和能否获取数据
不论成功还是失败, 这里的callback必须要用, 否则后面的校验会失败, 就像拦截器中的next()方法
注意其中需要用到this的地方必须要用箭头函数(整理一下)
每个组件都有一个默认的类名, 名字就是标签的名称
表单校验规则流程:
第一板块思路整理
做登录和注册页面的动态js效果
- 创建store文件用来建立仓库, 创建views文件夹再分别创建login和reg文件夹用来存放vue组件, 创建router文件夹用来设置路由配置
- 在app.vue中设置路由挂载点, 在main.js中引入store router axios element-ui 和
'element-ui/lib/theme-chalk/index.css'
文件 分别挂载到vue对象上或原型上 - 对reg.vue组件进行操作, 从element官网拿到代码粘贴过来, 并修改得到静态页面
- 对输入框进行正则校验, 用户名为0-10位以字母开头的字符串, 密码和密码校验为6-15位非空字符串, 并且确认密码要进行两次密码相同校验(需要在data中定义函数)
- 点击注册按钮进行兜底校验, 拿到表单组件元素通过兜底校验后发送ajax, 如果验证通过则编程式跳转至登录页, 同时点击去登录按钮直接能跳转至登录页
- 和注册页功能相似, 完成基本功能后, 点击登录按钮发送ajax, 能够拿到token(此时已安装vuex-persistedstate插件并设置在路由配置中), 通过mutations方法传递toekn过去并将state中token赋值, 登录成功后, 跳转至Main.vue
第二板块
注意
- alert / comfirm / prompt 内置方法会阻止渲染, 因为是同步操作 (如果是异步操作, 弹窗的时候还会执行后面的代码)
- 在store中的
this指向为vuex(也就是store组件对象, 在actions和mutations中的this都指向store对象)
, 也就是说在main.js中挂载的axios方法拿不到, 需要在子模块中再引用axios模块 (子组件中的this是指向vueomponet组件对象, this.$store才是store对象
)
4. 在声明周期初期, 初始化阶段, 在初始化的时候, data注入数据的时机比computed早, 所以不能在data中直接使用computed中的内容(就是不能用data中数据直接赋值
this.计算属性中数据
) 5. 这种方式能实现数据的一层拷贝(能让两个赋值的数据指向不同的地址) - 补充: Object.assign(target目标, source源) 将指定的对象, 赋值到目标对象, 返回目标对象,实现数据拷贝 - 当然还可以通过
JSON.parse(JSON.stringfy(对象))
实现深拷贝
- 字面量是为了更好的用来创建对象, 数组等…
- data是一个函数而不是对象, 是因为我们需要创建的实例都有不同的地址, 如果data是对象, 那么创建出来的对象都指向data, 数组则会相互篡改
组件中data函数的函数
这个data函数中的函数只能放在这里, 因为要考虑到checkPwd中的this指向(直接放在原处显得代码很乱, 放在data外面this指向为undefined)
左侧菜单栏的实现
要渲染的数据
template标签的应用注意:
- 虚拟标签, 可以用来包裹多个标签, 这个标签不会真实渲染, 所以可以用来
处理互斥渲染
的处理 - v-for的key必须要添加在真实标签上, 也就是说template不能设置key
- 侧边菜单创建 以前v-for都是对于单个标签的渲染, 这里需要对两个互斥标签进行渲染
- 目前共涉及三处使用template标签
- 组件中的三大标签之一
- 用作插槽
- 用作虚拟标签
项目中的路由拦截
- 在router中index.js中注册全局前置守卫(每次路由跳转前拦截, 决定是否放行),
- 这里要实现: 当页面
没有token
并且不在login页面
并且不在reg页面
时, 就跳转至login页面 ||
的意思是左右两边任意一个为true, 如果写为to.path !== '/login' || to.path !== '/reg'
相当于所有情况都判断为true(也就是没用)
路由拦截
// src/router/index.js 路由模块
Vue.use(VueRouter)
// 把下面的代码粘贴到路由模块中对应的位置,即可防止路由报错的问题
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
请求响应拦截器
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
导航菜单中的路由跳转
可以给表单直接设置一个router属性, 当点击 其中所有设置了index的跳转到
第二板块思路整理
- 退出功能, 用了element中的退出功能逻辑, 记得删除token
- 头像这块功能用发请求的方法拿到数据, 数据通过在子组件中created函数触发, 在actions中发送请求拿到数据后, 传递数据到mutations, 再修改state中的userInfo数据, 通过vuex中数据对头像和名字渲染
- 侧边栏的实现, element拿到静态代码, 通过发送请求拿到渲染左侧的数据, 直接在当前组件发送请求和渲染即可, 注意data和computed注入数据时机问题
- 请求响应拦截器解决token, 在main.js中设置, 在请求拦截中给请求添加token, 对于token过期的响应错误处理, 清除原有token, 跳转到登录页, 注意在每次请求后都要有弹窗提示
- 路由前卫拦截, 每次路由跳转, 当没有token并且不是去登录并且不是去注册页, 就跳转到登录页
- userinfo.vue中 , 用户基本信息为二级路由, 用element拿到静态代码, 设置验证规则, 注意正则规则的属性为pattern, 邮箱需要设置属性为type:“email” , 这里要注意v-model会修改vuex中数据的问题
- 点击修改, 兜底验证, 通过则发送请求更新数据 , 重置可用表单的方法
前两个板块思路整理 及 注意点
思路
- 创建好文件夹及文件, 配置好router文件, 和vuex文件, 在main.js中导入router store element-ui less文件 css文件 axios 并配置到vux对象上, 挂载axios到原型并配置基地址
- 注册页的实现, 从element拿到静态代码, 绑定数据并绑定验证规则, 注意密码验证中的validator属性要在data中设置一个函数, 记得每次表单提交都需要进行兜底校验, 利用elemnent的表单组件validate方法, 再发送ajax请求获取数据, 通过则跳转至登录页, 还要记得每次发送ajax之后都要设置可视化提示弹窗
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qrD81eKt-1655532555683)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f9e769249edd44bcb6ede5f60529b238~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]
- 登录页的实现和注册页差不多, 基本功能实现后点击登录兜底校验后, 发送ajax请求, 将请求回的token设置到state中, 配置token持久化存取的插件, 跳转至main.vue主页
- main主页的实现, 进来页面直接发送ajax请求, 将数据存储在state中, 并且渲染用户基本数据; 同时在当前页面发送ajax请求拿到侧边栏的数据, 根据element静态代码进行数据渲染
- 路由的设置, 在element表单上设置router属性, user-info跳转至基本资料页, 并且默认显示Home组件, 所以需要对Main组件设置两个二级路由
- 基本信息页的实现, 这个页面要注意userForm的数据不能直接用computed中的, 要在created函数中进行深拷贝(就是实现赋值只给数据, 不给数据的地址), 点击重置触发表单重置方法resetFields, 点击修改兜底校验通过后发送请求, 更新state中数据
注意
- 记得每次表单提交都需要进行兜底校验
- 记得每次发送ajax之后都要设置可视化提示弹窗
- 规则验证中的几个应当注意的属性: validator(用来进行进一步表单校验) pattern(设置正则校验) type:“email”(直接对输入框匹配email的正则验证)
- 在element的表单上设置router属性能跳转element-item上绑定的index中的路径(很好用, 相当于自动设置了$router.push())
- 要注意input表单中v-model双向绑定会自动修改state中数据的问题
- delete请求方式需要这样写配置参数
第三板块
更换头像页面
图片上传功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A99Jiw8A-1655532555685)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5a33aade10134a128351a6aec2393204~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]
注意
- 这里的accept属性, 能够让文件只选择特定的文件类型(这里用 * 表示能用任意图片格式), 选择了文件之后就触发change事件
- 利用好看的按钮点击之后, 能够触发文件input:file框
- img的src只能设置成: BASE64(DataURL) 或 URL
第三板块思路整理
- 添加头像页面, 通过按钮触发文件选择按钮, 注意文件标签选择中的accept属性, 用来设置指定图片格式, 点击选择了图片后, 触发事件, 能够将图片转为base64格式, 并赋值到头像图片的src, 点击上传头像, 能够发送请求并获取更新后的数据
- 重置密码页面, 从element中拿到静态代码, 对输入框进行正则校验, 并注意其中的validator属性, 能够自定义校验规则, 点击重置按钮能利用resetFields方法重置表单, 点击修改密码能发送请求并弹出提示框, 再重置表单
- 文章分类页面, 点击添加分类按钮能够弹出添加框, 为添加框设定校验规则, 点击修改按钮, 能够自动渲染当前行的数据(这里要用到自定义插槽), 点击弹出框中确定按钮, 兜底校验后发送请求, 并更新数据, 点击删除按钮拿到element中关于删除校验的代码, 点击确定删除发送请求(注意这里的请求参数是用
{ params:{ id } }
)
注意
- 要让输入框在进来网页时就自动获取光标, 用的是自定义命令directive (分为局部设置和全局设置, 当时是给特定标签设置自定义命令v-focus, 能够在DOM树渲染时自动执行该函数)’
- validator为自定义校验规则, 绑定的函数会三个参数, 注意
必须要调用callback回调函数
- 如果是用户操作的内容就需要提示框提醒, 兜底校验之所以不用提醒, 是因为规则校验有提醒了
this.$route.path
能拿到当前url中路径(/home
)(这里实现的是导航的默认高亮, 刷新的时候能够根据)- $route 和 scope 不能直接在页面上利用插值表达式进行渲染, 可以在函数中处理后再放到标签中
- 注意FileReader构造函数创建的实例对象有一个readAsDataURL的方法, 能够将传入的文件转成base64格式并挂载到实例对象上 (对文件的操作都是异步操作)
- el-table中的scope的用法: 拿到绑定在el-table上数组的每一项指定数据
- 配合这个函数, 实现点击修改按钮, 弹出框中数据自动渲染(注意这里用了
{...row}
的方式避免将articleList和editForm的地址绑定)
- 如果后台要求查询参数就传params, 请求体就直接传对象
- 图片上传可以用 FormData() 或者 用FileReader()转成base64格式
- axios默认的传输格式是application/json (在浏览器请求头中能看到, 也就是说后台没有要求其他格式的时候, 都是用的这种格式传输)
第四板块
弹出对话框的设置
- 这里的:before-close 能够在点击
x
或者点击弹出框以外的区域时执行里面的函数 - 注意这里$comfirm函数里面有三个参数, 其中第三个参数是对象
利用深度选择器给标签添加样式
- 原理: 将以前的交集选择器(.ql-editor[datas-v-hash]) 改为后代选择器([data-v-hash] .ql-editor)
- style标签如果添加scoped 那么其中的选择器就选不到组件中的标签 (也就是说引入的组件中的页面标签不会赋予hash, 样式对组件中的标签不生效)
对element外的组件(富文本编辑器)进行校验的方式
主动调用element表单的validateField('校验规则')
方法
补充
- 表单的方法, 通过
$refs.表单名.方法名
调用方法, 第一个用来进行表单的兜底校验, 回调函数会返回布尔值; 第二个能够配合其他组件自定义校验方式 (还是需要通过prop绑定校验规则) ;第三个能重置表单中的内容;
- 注意:
URL.createObjectURL(文件)
一般是用来预览图片才会用到, 该方法是原生webapi的方法, 作用是将文件转成URL, URL的生命周期和当前窗口绑定
- resetFields()方法能清空当前绑定表单已设置的prop属性中的变量
- http 只能传输两种类型的数据 字符串 和 二进制
- 利用Object.keys优化for in
第四板块思路整理
- 发表文章页面, 先做弹出对话框, 拿到element静态代码, 写好验证规则, 注意文章内容部分需要下quill包, 并且文章分类和文章内容部分都需要进行触发事件表单验证, 文章封面板块的设置用URL.createObjectURL转化成URL格式赋给img的src, 点击存为草稿或发布按钮, 兜底验证并发送请求(注意这里的请求需要一个FormDate对象) 点击退出按钮, 清空所有数据, 关闭当前窗口
- 拿到静态表格代码, 发送请求并获取数据, 拿到静态分页代码, 并完成点击逻辑
前四个板块思路整理
- 做好基础文件创建和配置文件
- 注册页, 从element中拿到静态页面, 输入框做规则校验, 点击注册按钮兜底校验, 通过后发送请求通过后跳转至登录页, 点击去登录按钮也能直接跳到登录页
- 登录页, 复制注册页基础部分, 点击登录兜底校验, 发送请求, 通过后在vuex中设置全局的token(注意这里用插件实现token的本地存取), 最终跳转至main主页
- main主页, 进入网页需发送请求拿到用户基础信息, 渲染头像和名字, 设置/home页面为默认页面, 渲染echarts内容
- 基本资料页, 从element中拿到静态代码, 做规则校验, 默认渲染登录名, 点击提交修改按钮, 兜底校验发送请求并直接渲染当前页面数据, 点击重置按钮能重置表单内容
- 更换头像页, 点击选择图片在选取图片时触发函数, 通过FileReader将图片转成base64格式并赋值给img的src显示图片, 点击上传头像发送请求, 能直接渲染当前页面数据
- 重置密码页, 从element中拿到静态代码, 做规则校验, 注意这里新密码和确认新密码需要用到validator属性, 点击修改密码发送请求, 重置按钮能重置表单数据
- 文章分类页, 从element中拿到静态代码, 渲染表格, 点击添加分类能够弹出对话框, 拿到静态页面并做规则校验, 点击确定兜底校验后发送请求, 添加文章分类数据, 点击修改按钮, 弹出对话框并自动渲染输入框中数据, 点击确定按钮兜底校验后发送请求, 修改信息并渲染页面, 点击删除按钮, 弹出提示框点击确定后发送请求并删除当前行
- 文章列表页, 点击发表文章, 弹出对话框, 拿到element静态代码, 进行规则验证, 注意其中有个富文本编辑器, 需要引入quill模块, 需要手动调用表单验证, 然后后面有个文章封面也需要手动调用验证, 注意这里的文章设置可以通过将图片转成URL格式赋值给img的src, 点击发布或存为草稿能够进行兜底校验分别发送请求, 并退出当前对话框, 点击叉叉, 能弹出提示框, 点击确定后能清除数据. 分页功能的设置, 从element中拿, 每次修改页面操作能够发送请求拿到数据并渲染页面, 点击删除按钮, 弹出提示框, 并删除当前行
第五板块
CDN
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。