当前位置: 首页 > news >正文

黑马智数Day2

表单基础校验实现 

基础双向绑定

v-model

<el-input v-model="formData.username" />
<script>
export default {name: 'Login',data() {return {formData: {username: '',password: '',remember: ''}}}
}
</script>

表单校验配置

  1. 按照业务要求编写校验规则对象(rules)

  2. el-form组件绑定表单对象model)和规则对象(rules

  3. el-form-item组件通过prop属性指定要使用的校验规则

<el-form :model="formData" :rules="rules"><el-form-itemlabel="账号"prop="username"><el-input v-model="formData.username" /></el-form-item>
<script>
export default {name: 'Login',data() {return {formData: {username: '',password: '',remember: ''},rules: {username: [{ required: true, message: '请输入账号', trigger: 'blur' }],password: [{ required: true, message: '请输入密码', trigger: 'blur' }]}}}
}
</script>

表单统一校验实现

表单校验部分的触发条件是失焦事件,如果用户打开界面后直接点击登录按钮,校验将失效,所有需要在点击登录按钮时统一对所有表单进行校验。

实现思路:通过调用form组件实例对象的validate方法。

<el-form ref="form"><el-form-item><el-button type="primary" class="login_btn" @click="doLogin()">登录</el-button></el-form-item>
<script>
export default {name: 'Login',methods: {doLogin() {this.$refs.form.validate((valid) => {if (valid) {// TODOconsole.log('登录')}})}}
}
</script>

Vuex管理用户Token

有关token的所有操作都放到Vuex中做,组件只做一个事儿就是触发action函数

实现步骤:

  1. 根据接口文档封装登录接口

  2. vuex(store)中编写user模块的相关代码

  3. 组件中表单校验通过之后提交action

export function loginAPI({ username, password }) {return request({url: '/park/login',method: 'POST',data: {username,password}})
}
export default {namespaced: true,state: () => {return {token: ''}},mutations: {setToken(state, token) {state.token = token}},actions: {async doLogin(ctx, { username, password }) {// 1. 调用接口const res = await loginAPI({ username, password })// 2. 提交mutationctx.commit('setToken', res.data.token)}}
}
doLogin() {this.$refs.form.validate(async(valid) => {console.log(valid)if (valid) {// TODOconsole.log('登录')const { username, password } = this.formDataawait this.$store.dispatch('user/doLogin', { username, password })this.$router.push('/')}})
}

具体流程图 

用户Token持久化

Token的有效期会持续一段时间,在这段时间内没有必要重复请求token,但是Vuex本身是基于内存的管理方式,刷新浏览器Token会丢失,为了避免丢失需要配置持久化进行缓存。

基础思路:

  1. 存Token数据时,一份存入vuex,一份存入cookie

  2. vuex中初始化Token时,优先从本地cookie取,取不到再初始化为空串

基于js-cookie封装存取方法

在utils文件夹中的auth.js文件中。

store中的核心逻辑

import { loginAPI } from '@/apis/user'
import { getToken, setToken } from '@/utils/auth'export default {namespaced: true,state: () => {return {// 优先从本地取token: getToken() || ''}},mutations: {setToken(state, token) {state.token = token// 本地存一份setToken(token)}}
}

为什么要使用Vuex+Cookies

俩种存储方式的优势都想要,又想快又想持久

  1. vuex 基于内存管理 存取速度快 但是刷新就丢失

  2. localstore/cookie 基于磁盘 存取速度稍慢 刷新不丢失(持久化)

cookie vs localstore

  1. 存数据的空间大小:ls-5M  cookie-kb
  2. 是否允许后端操作:ls-纯前端操作  cookie-前端可操作,后端也可操作(占多数)
  3. 是否跟随接口发送:cookie跟随接口发送

Axios请求头中添加Token

  1. 为什么要添加Token到请求头?-- 接口需要做鉴权,只有token有效,才能返回正常数据,token就是后端用来做判断的标识。

  2. 为什么要在axios中加?-- 项目中有很多接口都需要加鉴权功能,axios请求拦截器可以同一控制,一次添加,多个接口生效。

// 请求拦截器
service.interceptors.request.use(config => {const token = getToken()if (token) {config.headers.Authorization = token}return config},error => {return Promise.reject(error)}
)

记住我功能实现

如果当前用户选中了checkbox,点击登录之后,再次回到登录,应该把之前输入的用户名和密码回填到输入框里面;如果当前用户取消了checkbox,点击登录之后,再次回到登录,应该把之前存到本地的数据清除掉。

实现思路:

  1. 完成选择框的双向绑定(v-model) 得到一个true或者false的选中状态

  2. 如果当前为true,点击登录时,表示要记住,把当前的用户名和密码存入本地localStore

  3. 组件初始化(created)的时候,从本地取账号和密码,把账号密码存入用来双向绑定的form身上

  4. 如果当前用户没有记住,状态为false,点击登录的时候要把之前的数据清空

<el-checkbox v-model="remember">记住我</el-checkbox>
if (this.remember){localStorage.setItem(REMEMBER_KEY,JSON.stringify(this.form))}else{localStorage.removeItem(REMEMBER_KEY)}
created(){// 去本地取之前存入的账号、密码 如果取到了 赋值const formStr = localStorage.getItem(REMEMBER_KEY)if (formStr){const formObj = JSON.parse(formStr)this.form = formObj}},

退出登录功能实现

 询问用户是否真的要退出 -> 实现退出登录逻辑 ( 1. 清空当前用户的所有信息 2. 调回到登录页 )

编写清除用户信息mutation

clearUserInfo(state) {state.token = ''removeToken()}

提交mutation跳回到登录页

this.$store.commit('user/clearUserInfo')this.$router.push('/login')

Token控制路由跳转

 如果用户没有登录,不让用户进入到页面中,所以需要通过token的有无来控制路由的跳转。

编写权限控制逻辑

const WHITE_LIST = ['/login', '/404']
router.beforeEach((to, from, next) => {const token = getToken()// 有tokenif (token) {next()} else {// 没有tokenif (WHITE_LIST.includes(to.path)) {next()} else {next('/login')}}
})

在入口文件引入生效

import './permission'

接口错误统一处理

接口报错的时候提示用户到底是哪里错误;接口数量很多,统一管控,不管哪个接口报错了,都能监控到,而且给出提示。

import { Message } from 'element-ui'// 响应拦截器
service.interceptors.response.use(response => {return response.data},error => {// 错误统一处理Message.error(error.response.data.msg)return Promise.reject(error)}
)export default service

Token失效处理

 Token存在一定的有效时间,如果长时间不进行接口访问,Token有可能就失效了,需要我们做统一控制。因为我们不知道到底用户实在访问哪个接口的时候发生了Token失效访问,所以需要通过拦截器来做。

  1. 跳转到登录页

  2. 清除掉过期Token

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【protobuf】ProtoBuf的学习与使用⸺C++
  • Go语言语法基础
  • 蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
  • GNU链接器(LD):设置入口点(ENTRY命令)的用法及实例解析
  • 【python】requests 库 源码解读、参数解读
  • 使用 Python 模拟光的折射,反射,和全反射
  • 【技术解析】wx.request 封装:优化小程序网络请求的最佳实践
  • 人工智能面试题(Artificial Intelligence Algorithm Interview Questions)
  • 【深度学习】03-神经网络3-1梯度下降网络优化方法
  • 在Java中 String能存储多少个字符?
  • 前端——表单标签样式
  • 使用Python实现图形学曲线和曲面的B样条曲线算法
  • 通过 Xshell 无法连接到 Ubuntu
  • 计算机二级C语言练习题
  • 【AI写代码】使用 ChatGPT 写 ila
  • [译]如何构建服务器端web组件,为何要构建?
  • Cookie 在前端中的实践
  • create-react-app做的留言板
  • django开发-定时任务的使用
  • PHP 的 SAPI 是个什么东西
  • SpringBoot几种定时任务的实现方式
  • TCP拥塞控制
  • 从零搭建Koa2 Server
  • ------- 计算机网络基础
  • 简单数学运算程序(不定期更新)
  • 排序算法之--选择排序
  • 思考 CSS 架构
  • 在weex里面使用chart图表
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​如何使用QGIS制作三维建筑
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $refs 、$nextTic、动态组件、name的使用
  • (k8s)kubernetes 部署Promehteus学习之路
  • (八十八)VFL语言初步 - 实现布局
  • (九)信息融合方式简介
  • (论文阅读40-45)图像描述1
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (一)基于IDEA的JAVA基础10
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (轉貼) UML中文FAQ (OO) (UML)
  • ****三次握手和四次挥手
  • *上位机的定义
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .Net环境下的缓存技术介绍
  • @antv/g6 业务场景:流程图
  • @PreAuthorize注解
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!