登录演示和功能拆解
登录演示和功能拆解

表单基础校验实现
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. 表单校验配置
- 按照业务要求编写校验规则对象(rules)
- el-form组件绑定表单对象(model)和规则对象(rules)
- 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函数

实现步骤:
- 根据接口文档封装登录接口
- 在vuex中编写user模块的相关代码
- 组件中表单校验通过之后提交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的工作机制:
- 在 mutation 完成对state的更新后,
vuex-persistedstate监听到状态的变化 vuex-persistedstate将更新后的状态序列化(通常是转换为 JSON 字符串)- 序列化后的数据被保存到指定的持久化存储中(例如
localStorage,sessionStorage中)
使用步骤:
- npm install vuex-persistedstate 或者 yarn add vuex-persistedstate 安装
- 在store/index.js中使用
- 登录成功后,观察本地存储中如果有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
- 为什么要添加Token到请求头?
点击查看答案接口需要做鉴权,只有token有效,才能返回正常数据,token就是后端用来做判断的标识
- 为什么要在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)
})
记住我功能实现

交互表现:
- 如果当前用户选中了checkbox,点击登录之后,再次回到登录,应该把之前输入的用户名和密码回填到输入框里面;
- 如果当前用户取消了checkbox,点击登录之后,再次回到登录,应该把之前存到本地的数据清除掉
实现思路:
- 完成选择框的双向绑定 得到一个true或者false的选中状态
- 如果当前为true,点击登录时,表示要记住,把当前的用户名和密码存入本地
- 组件初始化的时候,从本地取账号和密码,把账号密码存入用来双向绑定的form身上
- 如果当前用户没有记住,状态为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')}}
})
接口错误统一处理
背景:
- 接口报错的时候提示用户到底是哪里错误
- 接口数量很多 统一管控 不管哪个接口报错了 都能监控到 而且给出提示
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失效访问,所以需要通过拦截器来做
- 跳转到登录页
- 清除掉过期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是一款由国内人工智能公司研发的大型语言模型,拥有强大的自然语言处理能力,能够理解并回答问题,还能辅助写代码、整理资料和解决复杂的数学问题。 与OpenAI开发的ChatGPT相比,DeepSeek不仅率先实现了媲美OpenAI-o1模型的…...
Redis进阶使用
在日常工作中,使用Redis有什么需要注意的? 设置合适的过期时间。尽量避免大key问题,避免用字符串存储过大的数据;避免集合的数据量太大,要定期清除。 常用的数据结构有哪些?用在什么地方? 按…...
Python常见面试题的详解6
1. 按字典 value 值排序 要点:对于给定字典,使用 sorted() 函数结合 items() 方法,依据 value 进行排序,也可以定义一个通用函数,支持按 value 升序或降序排序。示例: python d {a: 1, b: 2, c: 3, d: …...
Linux基础之文件权限的八进制表示法
1. Linux 文件权限概述 在 Linux 中,每个文件或目录都有三种基本权限,分别是: 读权限 - r:允许查看文件内容。写权限 - w:允许修改文件内容。执行权限 - x:允许执行文件或进入目录。 每个文件或目录的权…...
数据结构与算法面试专题——堆排序
完全二叉树 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 设计目标:完全二叉树的设计目标是高效地利用存储空间,同时便于进行层次遍历和数组存储。它的结构使得每个节点的子节点都可以通过简…...
《On Java进阶卷》阅读笔记(五)
第7章 IO系统 I/O流: IO有很多不同的来源和去处,如文件、控制台网络连接等,而且还涉及需求以很多种方式,如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等。 Java8的函数式流相关的类和IO流之间并无关联。 IO流隐藏了…...
《代码随想录》刷题笔记——回溯篇【java实现】
文章目录 组合组合总和 III电话号码的字母组合组合总和组合总和II思路代码实现 分割回文串※思路字符串分割回文串判断效率优化※ 复原 IP 地址优化版本 子集子集 II使用usedArr辅助去重不使用usedArr辅助去重 递增子序列※全排列全排列 II重新安排行程题意代码 N 皇后解数独直…...
数值积分:通过复合梯形法计算
在物理学和工程学中,很多问题都可以通过数值积分来求解,特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中,我将讨论如何使用 复合梯形法 来进行数值积分,并以一个简单的…...
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进阶】验证码案例
目 🌲实现说明 🎄Hutool介绍 🌳准备工作 🌴约定前后端交互接口 🚩接口定义 🚩实现服务器后端代码 🚩前端代码 🚩整体测试 🌲实现说明 随着安全性的要求越来越⾼…...
Uniapp 短视频去水印解析工具开发实现
最近搞了一个有意思的小工具——短视频去水印解析器!这玩意儿可以把短视频中的水印给抹掉,还能提取视频、封面等资源。整个项目用了 Uniapp 开发,做完后体验了一下,发现还挺顺手。今天就来跟大家聊聊实现思路和代码细节~ 需求分析…...
计算机网络-八股-学习摘要
一:HTTP的基本概念 全称: 超文本传输协议 从三个方面介绍HTTP协议 1,超文本:我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…...
编程速递-庆祝Delphi诞生30周年!
庆祝Delphi 30周年纪念是一个特别的时刻。 回到1995年,也就是30年前,在微软Windows和互联网时代的曙光初现之时,Borland Delphi的创建者们无法想象,当时使用Borland Delphi构建的应用程序至今仍在运行——为全世界数十亿人服务。…...
每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块
本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…...
性能测试流程、主流性能工具
性能测试流程 性能测试流程 测试测试需求分析 性能测试计划和方案 测什么: 测试背景 测试目的 测试范围 谁来测: 进度和分工 交付清单 怎么测: 测试策略 性能测试用例设计 性能测试测试执行 性能分析和调优 性能测试报告 测试报告是…...
DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏
DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器,可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API,开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…...
无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架
Solon 框架! Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet&#…...
【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版
针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接:https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录,保持与游戏主程序同目录下。...
使用 playwright 自定义 js 下载的路径和文件名
遇到一个问题,点击按钮自动下载文件,路径和文件名都不能自定义,可以用 playwright 来解决这个问题 from playwright.sync_api import sync_playwright import os import time class ExcelDownloader: def __init__(self, download_pat…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
