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

登录演示和功能拆解

登录演示和功能拆解

表单基础校验实现

1. 基础双向绑定

<template><el-form><el-form-item label="账号"><el-input v-model="formData.username" /></el-form-item><el-form-item label="密码"><el-input v-model="formData.password" /></el-form-item><el-form-item><el-checkbox v-model="formData.remember">记住我</el-checkbox></el-form-item><el-form-item><el-button type="primary" class="login_btn">登录</el-button></el-form-item></el-form></template><script>
export default {name: 'Login',data() {return {formData: {username: '',password: '',remember: ''}}}
}</script>

2. 表单校验配置

  1. 按照业务要求编写校验规则对象(rules)
  1. el-form组件绑定表单对象(model)和规则对象(rules)
  1. el-form-item组件通过prop属性指定要使用的校验规则

<template><el-form :model="formData" :rules="rules"><el-form-itemlabel="账号"prop="username"><el-input v-model="formData.username" /></el-form-item><el-form-itemlabel="密码"prop="password"><el-input v-model="formData.password" /></el-form-item><el-form-item prop="remember"><el-checkbox v-model="formData.remember">记住我</el-checkbox></el-form-item><el-form-item><el-button type="primary" class="login_btn">登录</el-button></el-form-item></el-form></template><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方法

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

Vuex管理用户Token

业务背景:由于用户数据的特殊性,可能需要在多个模块中进行使用,适合使用Vuex集中管理

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


实现步骤:

  1. 根据接口文档封装登录接口
  1. 在vuex中编写user模块的相关代码
  1. 组件中表单校验通过之后提交action

1. 封装登录接口

src/apis/user.js

import request from '@/utils/request'// 登录函数
/*** @description: 登录函数* @param {*} data { mobile,password}* @return {*} promise*/
export function loginAPI({ username, password }) {return request({url: '/park/login',method: 'POST',data: {username,password}})
}

utils/request.js

const service = axios.create({baseURL: 'https://api-hmzs.itheima.net/tj',timeout: 5000 // request timeout
})

2. 编写Vuex相关代码

src/store/modules/user.js

import { loginAPI } from '@/api/user'
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)}}
}

3. 组件中提交action

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持久化

vuex-persistedstate 是一个 Vuex 插件,它允许你将 Vuex 的状态持久化存储在浏览器的 localStorage 或 sessionStorage 中。这对于需要在页面刷新后保持某些状态非常有用

vuex-persistedstate的工作机制:

  1. 在 mutation 完成对state的更新后,vuex-persistedstate 监听到状态的变化
  2. vuex-persistedstate 将更新后的状态序列化(通常是转换为 JSON 字符串)
  3. 序列化后的数据被保存到指定的持久化存储中(例如 localStorage,sessionStorage中

使用步骤:

  1. npm install vuex-persistedstate 或者 yarn add vuex-persistedstate 安装
  2. 在store/index.js中使用
  3. 登录成功后,观察本地存储中如果有token即为成功
import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
import  createPersistedState  from 'vuex-persistedstate'
Vue.use(Vuex)export default new Vuex.Store({plugins: [createPersistedState({key: 'hm--vuex-token', // 存储在 localStorage 中的键名,默认为 'vuex'storage: window.localStorage, // 或者 window.localStorage,默认为 localStoragepaths: ['user.token'] // 指定要持久化的 state 的路径,默认为所有 state})],modules: {user}
})

Axios请求头中添加Token

  1. 为什么要添加Token到请求头?

点击查看答案接口需要做鉴权,只有token有效,才能返回正常数据,token就是后端用来做判断的标识

  1. 为什么要在axios中加?

点击查看答案项目中有很多接口都需要加鉴权功能,axios请求拦截器可以同一控制,一次添加,多个接口生效```

import store from '@/store'// 添加请求拦截器
request.interceptors.request.use(function (config) {// 在发送请求之前做些什么const  token  = store.state.user.tokenif (token) {config.headers.Authorization = token}return config
}, function (error) {// 对请求错误做些什么return Promise.reject(error)
})

记住我功能实现


交互表现:

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

实现思路:

  1. 完成选择框的双向绑定 得到一个true或者false的选中状态
  1. 如果当前为true,点击登录时,表示要记住,把当前的用户名和密码存入本地
  1. 组件初始化的时候,从本地取账号和密码,把账号密码存入用来双向绑定的form身上
  1. 如果当前用户没有记住,状态为false,点击登录的时候要把之前的数据清空
<script>const FORMDATA_KEY = 'form_key'export default {name: 'Login',mounted() {const cacheFormStr = localStorage.getItem(FORMDATA_KEY)if (cacheFormStr) {const cacheFormData = JSON.parse(cacheFormStr)this.formData.username = cacheFormData.usernamethis.formData.password = cacheFormData.password}},methods: {doLogin() {this.$refs.form.validate((valid) => {console.log(valid)if (valid) {// TODOconsole.log('登录')const { username, password, remember } = this.formDatathis.$store.dispatch('user/doLogin', { username, password })// 补充remeber逻辑if (remember) {localStorage.setItem(FORMDATA_KEY, JSON.stringify({ username, password }))} else {localStorage.removeItem(FORMDATA_KEY)}}})}}}</script>

退出登录功能实现

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

1. 编写清除用户信息mutation

  mutations: {clearUserInfo(state) {// 清除Tokenstate.token = ''}},

2. 提交mutation跳回到登录页

 methods: {// 退出登录logout() {this.$store.commit('user/clearUserInfo')this.$router.push('/login')}
}

Token控制路由跳转

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


说明:白名单指的是不需要用户登录就可以看到的路由,比如/loigin

编写权限控制逻辑

// 导入vuex仓库对象
import store from '@/store'// 路由守卫
router.beforeEach((to, from, next) => {// 登录页面直接放行if (to.path === '/login') {next()} else {const token = store.state.user.token// 判断是否有tokenif (token) {// 放行next()} else {// 跳转回登录页next('/login')}}
})

接口错误统一处理

背景:

  1. 接口报错的时候提示用户到底是哪里错误
  1. 接口数量很多 统一管控 不管哪个接口报错了 都能监控到 而且给出提示
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. 跳转到登录页
  1. 清除掉过期Token
// 响应拦截器
service.interceptors.response.use(response => {return response.data},error => {// Token 401处理console.dir(error.response.status)if (error.response.status === 401) {// 1. 跳转到登录router.push('/login')// 2. 清空用户数据store.commit('user/clearUserInfo')}return Promise.reject(error)}
)

相关文章:

登录演示和功能拆解

登录演示和功能拆解 表单基础校验实现 1. 基础双向绑定 <template><el-form><el-form-item label"账号"><el-input v-model"formData.username" /></el-form-item><el-form-item label"密码"><el-inpu…...

DeepSeek深度求索API多线程批量写原创文章软件-ai痕迹极低

DeepSeek是一款由国内人工智能公司研发的大型语言模型&#xff0c;拥有强大的自然语言处理能力&#xff0c;能够理解并回答问题&#xff0c;还能辅助写代码、整理资料和解决复杂的数学问题。 与OpenAI开发的ChatGPT相比&#xff0c;DeepSeek不仅率先实现了媲美OpenAI-o1模型的…...

Redis进阶使用

在日常工作中&#xff0c;使用Redis有什么需要注意的&#xff1f; 设置合适的过期时间。尽量避免大key问题&#xff0c;避免用字符串存储过大的数据&#xff1b;避免集合的数据量太大&#xff0c;要定期清除。 常用的数据结构有哪些&#xff1f;用在什么地方&#xff1f; 按…...

Python常见面试题的详解6

1. 按字典 value 值排序 要点&#xff1a;对于给定字典&#xff0c;使用 sorted() 函数结合 items() 方法&#xff0c;依据 value 进行排序&#xff0c;也可以定义一个通用函数&#xff0c;支持按 value 升序或降序排序。示例&#xff1a; python d {a: 1, b: 2, c: 3, d: …...

Linux基础之文件权限的八进制表示法

1. Linux 文件权限概述 在 Linux 中&#xff0c;每个文件或目录都有三种基本权限&#xff0c;分别是&#xff1a; 读权限 - r&#xff1a;允许查看文件内容。写权限 - w&#xff1a;允许修改文件内容。执行权限 - x&#xff1a;允许执行文件或进入目录。 每个文件或目录的权…...

数据结构与算法面试专题——堆排序

完全二叉树 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 设计目标&#xff1a;完全二叉树的设计目标是高效地利用存储空间&#xff0c;同时便于进行层次遍历和数组存储。它的结构使得每个节点的子节点都可以通过简…...

《On Java进阶卷》阅读笔记(五)

第7章 IO系统 I/O流&#xff1a; IO有很多不同的来源和去处&#xff0c;如文件、控制台网络连接等&#xff0c;而且还涉及需求以很多种方式&#xff0c;如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等。 Java8的函数式流相关的类和IO流之间并无关联。 IO流隐藏了…...

《代码随想录》刷题笔记——回溯篇【java实现】

文章目录 组合组合总和 III电话号码的字母组合组合总和组合总和II思路代码实现 分割回文串※思路字符串分割回文串判断效率优化※ 复原 IP 地址优化版本 子集子集 II使用usedArr辅助去重不使用usedArr辅助去重 递增子序列※全排列全排列 II重新安排行程题意代码 N 皇后解数独直…...

数值积分:通过复合梯形法计算

在物理学和工程学中&#xff0c;很多问题都可以通过数值积分来求解&#xff0c;特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中&#xff0c;我将讨论如何使用 复合梯形法 来进行数值积分&#xff0c;并以一个简单的…...

AcWing——3624. 三值字符串

双指针解法 #include<iostream> #include<unordered_map> using namespace std; int main() {int n; cin >> n;while(n--){unordered_map<char, int> tree;string s; cin >> s;int ans 0x7fffffff; for(int i 0, j 0; j < (int)s.size();…...

【JavaEE进阶】验证码案例

目 &#x1f332;实现说明 &#x1f384;Hutool介绍 &#x1f333;准备工作 &#x1f334;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f6a9;实现服务器后端代码 &#x1f6a9;前端代码 &#x1f6a9;整体测试 &#x1f332;实现说明 随着安全性的要求越来越⾼…...

Uniapp 短视频去水印解析工具开发实现

最近搞了一个有意思的小工具——短视频去水印解析器&#xff01;这玩意儿可以把短视频中的水印给抹掉&#xff0c;还能提取视频、封面等资源。整个项目用了 Uniapp 开发&#xff0c;做完后体验了一下&#xff0c;发现还挺顺手。今天就来跟大家聊聊实现思路和代码细节~ 需求分析…...

计算机网络-八股-学习摘要

一&#xff1a;HTTP的基本概念 全称&#xff1a; 超文本传输协议 从三个方面介绍HTTP协议 1&#xff0c;超文本&#xff1a;我们先来理解「文本」&#xff0c;在互联网早期的时候只是简单的字符文字&#xff0c;但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…...

编程速递-庆祝Delphi诞生30周年!

庆祝Delphi 30周年纪念是一个特别的时刻。 回到1995年&#xff0c;也就是30年前&#xff0c;在微软Windows和互联网时代的曙光初现之时&#xff0c;Borland Delphi的创建者们无法想象&#xff0c;当时使用Borland Delphi构建的应用程序至今仍在运行——为全世界数十亿人服务。…...

每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块

本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…...

性能测试流程、主流性能工具

性能测试流程 性能测试流程 测试测试需求分析 性能测试计划和方案 测什么&#xff1a; 测试背景 测试目的 测试范围 谁来测&#xff1a; 进度和分工 交付清单 怎么测&#xff1a; 测试策略 性能测试用例设计 性能测试测试执行 性能分析和调优 性能测试报告 测试报告是…...

DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏

DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器&#xff0c;可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API&#xff0c;开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…...

无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架

Solon 框架&#xff01; Solon 是新一代&#xff0c;Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目&#xff08;最近“杭州六小龙”很火啊&#xff0c;我们也是杭州的哦&#xff09;。从零开始构建&#xff08;No Spring、No Java-EE、No Servlet&#…...

【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版

针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接&#xff1a;https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录&#xff0c;保持与游戏主程序同目录下。...

使用 playwright 自定义 js 下载的路径和文件名

遇到一个问题&#xff0c;点击按钮自动下载文件&#xff0c;路径和文件名都不能自定义&#xff0c;可以用 playwright 来解决这个问题 from playwright.sync_api import sync_playwright import os import time class ExcelDownloader: def __init__(self, download_pat…...

Obsidian剪藏模板生成器:打造自动化知识入库工作流

1. 项目概述&#xff1a;一个为Obsidian用户量身定制的剪藏模板生成器如果你和我一样&#xff0c;是Obsidian的重度用户&#xff0c;同时又经常在网上冲浪&#xff0c;看到好文章、好想法就想立刻保存下来&#xff0c;那你一定对“剪藏”这个动作不陌生。无论是用浏览器插件&am…...

FPGA网络通信避坑指南:从CRC32校验到GMII接口,我的ARP协议调试血泪史

FPGA网络通信实战&#xff1a;从CRC校验到GMII接口的深度解析 在FPGA网络通信开发中&#xff0c;ARP协议实现是工程师必须掌握的核心技能之一。本文将深入探讨三个关键环节&#xff1a;CRC32校验的生成与验证、GMII接口的时序同步机制&#xff0c;以及ARP状态机的设计要点。通过…...

手机号逆向查询QQ号:终极完整快速指南

手机号逆向查询QQ号&#xff1a;终极完整快速指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录自己的账号&#xff1f;或者需要验证员工的QQ绑定状态却无从下手&#xff1f;现在&#xff0c;通过…...

开源智能体分析工具f/agentlytics:从可观测性到数据驱动的AI应用开发

1. 项目概述&#xff1a;一个面向开发者的开源分析工具最近在折腾一个个人项目&#xff0c;想把一些零散的数据收集起来做点分析&#xff0c;结果发现市面上的分析工具要么太重、要么太贵&#xff0c;要么就是数据模型和我的需求对不上。就在我准备自己从头造轮子的时候&#x…...

C# WinForm项目实战:用OpenCvSharp 4.x打造一个带十字准星和ROI的简易摄像头工具

C# WinForm实战&#xff1a;基于OpenCvSharp的智能摄像头标注工具开发指南 在工业检测、生物显微或工程测量领域&#xff0c;经常需要对实时视频流进行精确标注和分析。传统商业软件往往价格昂贵且扩展性有限&#xff0c;而利用C# WinForm配合OpenCvSharp库&#xff0c;开发者可…...

从Pro Micro到掌上游戏机:手把手教你用Arduino IDE和Python脚本打造自己的Arduboy(含完整BOM清单)

从Pro Micro到掌上游戏机&#xff1a;手把手打造复古Arduboy全攻略 记得第一次在创客社区看到Arduboy的演示视频时&#xff0c;那个只有信用卡大小的设备竟然能流畅运行《太空侵略者》和《俄罗斯方块》&#xff0c;瞬间点燃了我的制作欲望。这种将现代微控制器与复古游戏体验完…...

分布式爬虫平台架构设计:从权限控制到规模化数据采集实战

1. 项目概述&#xff1a;从“权限实验室”到“爬虫农场”的构想最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“claw-farm”&#xff0c;来自一个叫“PermissionLabs”的组织。光看这个名字&#xff0c;就让人忍不住想点进去看看。PermissionLabs&#xff0c;直译是“权…...

终极字体美化教程:用MacType让Windows文字显示效果翻倍提升

终极字体美化教程&#xff1a;用MacType让Windows文字显示效果翻倍提升 【免费下载链接】mactype Better font rendering for Windows. 项目地址: https://gitcode.com/gh_mirrors/ma/mactype 还在为Windows系统上模糊不清的字体显示而烦恼吗&#xff1f;MacType是一款革…...

别再手动复制粘贴了!用Java的XWPFTemplate 1.9.1动态生成Word表格,5分钟搞定周报

告别手工周报&#xff1a;用JavaXWPFTemplate实现智能表格生成 每周五下午&#xff0c;办公室里总会响起此起彼伏的键盘敲击声和鼠标点击声——这是同事们正在与Word文档搏斗&#xff0c;手动复制粘贴数据、调整表格格式、核对数字准确性。这种重复性劳动不仅消耗时间&#xff…...

从 PDF 中精准提取表格、图片与公式:MinerU 结构化元素抽取的 3 种方案

为什么 PDF 元素提取比纯文本难 PDF 是一种视觉格式&#xff0c;不是逻辑格式。PDF 文件的本质是一组绘图指令——把文字放在哪、画多粗的线、用什么字体渲染——而非像 HTML 或 Markdown 那样告诉你"这是一个表格标题"或"这是一个三级公式"。当你用传统 …...