当前位置: 首页 > 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…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...