黑马智数Day2

news2024/11/16 1:22:31

表单基础校验实现 

基础双向绑定

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-item
        label="账号"
        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) {
          // TODO
          console.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. 提交mutation
      ctx.commit('setToken', res.data.token)
    }
  }
}
doLogin() {
  this.$refs.form.validate(async(valid) => {
    console.log(valid)
    if (valid) {
      // TODO
      console.log('登录')
      const { username, password } = this.formData
      await 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()
  // 有token
  if (token) {
    next()
  } else {
    // 没有token
    if (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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

231. 2 的幂 简单递归 python除法的类型

已解答 简单 相关标签 相关企业 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&…

【ollama 在linux 上离线部署 本地大模型】

本文继续来讲如何在linux上部署离线本地智能大模型&#xff0c;前篇如下&#xff1a;window上部署离线大模型 首先还是安装ollama linux版本&#xff0c;如果完全离线的话&#xff0c;可以从github上下载一个linux 版本的压缩包传上去 git hub上搜索ollama 找到右下角 找到li…

Centos/fedora/openEuler 终端中文显示配置

注意&#xff1a;这里主要解决的是图形界面、远程登录界面的中文乱码问题 系统原生的终端&#xff08;如虚拟机系统显示的终端&#xff09;&#xff0c;由于使用的是十分原始的 TTY 终端&#xff0c;使用点阵字体进行显示&#xff0c;点阵字体不支持中文&#xff0c;因此无法显…

用友与万里汇达成战略合作,共创出海企业司库管理新篇章

新加坡 2024年9月23日 在全球数字化浪潮的推动下&#xff0c;中国企业正加速融入全球贸易体系&#xff0c;面对复杂多变的国际市场环境&#xff0c;寻求更高效、便捷的跨境贸易解决方案成为众多出口企业的迫切需求。 9月23日&#xff0c;用友网络科技股份有限公司&#xff08…

KDD2024 时序论文

1、Generative Pretrained Hierarchical Transformer for Time Series Forecasting paper: https://dl.acm.org/doi/abs/10.1145/3637528.3671855 code&#xff1a;GitHub - SiriZhang45/FRNet: Code Implementation of FRNet 2、Fredformer: Frequency Debiased Transforme…

[Redis][持久化][上][RDB]详细讲解

目录 0.前言1.RDB0.是什么&#xff1f;1.触发机制2.流程说明3.RDB文件的处理4.RDB的优缺点 0.前言 Redis ⽀持 RDB 和 AOF 两种持久化机制&#xff0c;持久化功能有效地避免因进程退出造成数据丢失问题&#xff0c;当下次重启时利⽤之前持久化的⽂件即可实现数据恢复 RDB ->…

展锐平台的手机camera 系统isptool 架构

展锐平台的isptool 主要用于支持展锐各代芯片isp的各效果模块快速tuning和参数生成打包。 具体需要&#xff1a; 一、工具段能在线实时预览到调试sensor经过isp 处理后的图像&#xff0c;也就是各模块的参数在当下实时生效&#xff0c;通过工具能在PC 上在线观看到修改的效果。…

[笔记]2024大厂变频器,电机参数一览

注意中心高&#xff0c;在用铁心规格&#xff0c;功率换算表 温升曲线在预防性维护过程能用到 注意各类电流参数,上面双极对&#xff0c;下面3极对。 另一种极对数 4极对的电机参数可参考&#xff0c;不常用。 emc滤波&#xff0c; Sto,通讯接口 颜色区分的接口设计 一组新强…

基于MaxScale搭建MariaDB读写分离集群的方法【2024年最新版】

1、什么是MaxScale MaxScale是MariaDB数据库的一个中间件&#xff0c;为MariaDB提供代理服务&#xff0c;主要可以实现读写分离和一定的负载均衡功能&#xff0c;其中读写分离可将读操作和写操作分离到不同的数据库服务器上&#xff0c;以提高系统的整体性能和扩展性&#xff…

Pandas的入门操作-DataFrame对象

目录 类型 通过 pd.read_csv(xxx)返回df 将Series对象通过to_frame()转成df 使用列表 加元组返回df 使用字典返回df DataFrame对象的常用属性和方法 常用属性 常用方法 实例 DataFrame对象的运算 加载数据 字符串的运算 字符串和数字(会报错) 根据下表获取数据 类…

第 1 章:Vue 核心

1. Vue 简介 1.1. 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/&#xff1a;中文官网里面【教程】和【API】是比较重要的。用到api就去查询&#xff0c;实践当中记忆更牢靠。 风格指南&#xff1a;官方推荐写的一个代码风格cookbook&#xff1a;编写v…

浙江省计算机三级网络及安全技术资料(最后有我考完后的想法)

还有一周就要考试了&#xff0c;网上几乎找不到浙江省的计算机三级网络及安全技术的复习资料&#xff0c;大部分都是全国计算机三级的复习资料&#xff0c;气得我直接对着大纲一部分一部分找过去。以后的友友们需要的自取&#xff0c;为了能够顺利通过浙江省计算机三级考试&…

『功能项目』按钮的打开关闭功能【73】

本章项目成果展示 我们打开上一篇72QFrameWork制作背包界面UGUI的项目&#xff0c; 本章要做的事情是制作打开背包与修改器的打开关闭按钮 首先打开UGUICanvas复制button按钮 重命名为ReviseBtn 修改脚本&#xff1a;UIManager.cs 将修改器UI在UGUICanvas预制体中设置为隐藏 运…

FP7208:升压汽车车灯方案 高效稳定的电力支持

前言 近年来随着汽车的不断普及&#xff0c;车灯方面也在不断发展&#xff0c;车灯对于汽车不仅是外观件更是汽车主动安全的重要组成部分。灯光在保证照亮前部道路的同时&#xff0c;还要确保不对对面车辆产生眩目影响。同时需要针对不同路况和不同载荷引起的灯光偏离进行调整&…

Linux:文件描述符详解

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程&#xff0c;都拥有自己的文件描述符(File Descriptor, FD)&#xff0c;它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

胤娲科技:DeepMind的FermiNet——带你穿越“薛定谔的早餐桌”

当AI遇上量子迷雾&#xff0c;FermiNet成了你的“量子导航仪” 想象一下&#xff0c;你早晨醒来&#xff0c;发现家里的厨房变成了薛定谔的实验室&#xff0c;你的咖啡杯和吐司同时处于“存在与不存在”的叠加态。 你伸手去拿&#xff0c;却不确定会不会摸到冰冷的空气或是热腾…

文献笔记 - Reinforcement Learning for UAV Attitude Control

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者&#xff0c;文献的引用格式如下&#xff0c;原文更有价值 Koch W, Mancuso R, West R, et al. Reinforcement learning for UA…

前端——表单和输入

今天我们来学习web前端中的表单和输入 表单 HTML 表单用于收集用户的输入信息&#xff0c;用表单标签来完成服务器的一次交互。 HTML 表单表示文档中的一个区域&#xff0c;此区域包含交互控件&#xff0c;将用户收集到的信息发送到 Web 服务器。 HTML 表单通常包含各种输入…

【android10】【binder】【3.向servicemanager注册服务】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …

为什么AI不会夺去软件工程师的工作?

▼ 自从AI大模型爆火以来&#xff0c;我每天的工作中&#xff0c;已经有大量的真实代码是通过AI完成的。人工智能辅助下的编程&#xff0c;确实大幅减轻了我的工作负担&#xff0c;大大提高了生产力。 大语言模型是如此成功&#xff0c;以至于无可避免地在开发者社区中引起了…