登录的写法,routerHook具体配置,流程
routerHook挂在在index.js/main.js下的,找不到可以去那边看一下
vuex需要做的:
//创建token的sate,从本地取 let token = window.localStorage.getItem('token')
// 存储用户登录信息let currentUserInfo = reactive({userinfo: {}})
//存根据不同权限分配的路由界面的数据const permission_routes = reactive({permission_routes: []})//存token,登陆时和rookhooks的时候存const set_token = (newValue: any) => {token = newValuewindow.localStorage.setItem('token', token)}// 清除token,退出的时候const clear_token = (newValue) => {token = newValuewindow.localStorage.removeItem('token')}//存用户信息const set_currentUserInfo = (newValue: any) => {currentUserInfo.userinfo = newValue}
//清除用户信息const clear_currentUserInfo = (newValue) => {currentUserInfo.userinfo = newValue}//存当前的路由const updateRoutes = (newRoutes) => {permission_routes.permission_routes = [...newRoutes] // 确保数组是响应式的}
1.第一步构建页面,这一步就是点击登录全部的流程,输入账密,点击调接口,存token
<el-form ref="loginForm" :model="loginForm" style="background-color:white;width:410px;margin-block-end:0em;" autocomplete="on"label-position="left"><div class="flexLeft" style="width: 100%;height: 84px;margin-bottom:36px"><span class="loginForm-title" style="font-weight: 500;font-size: 38px;color: black;"> 欢迎登陆选型计算 </span><span class="loginForm-title" style="font-weight: 600;font-size: 24px;color: #18AEB7;">账户密码登录</span></div><el-form-item prop="username" style="margin-bottom: 24px;"><!-- <span class="svg-contain1er"><svg-icon icon-class="user" /></span> --><span style="color: #9A9CA1;display: block;font-size: 18px;">用户名</span><el-input ref="username" v-model.trim="loginForm.username" placeholder="" name="username" type="text" tabindex="1" autocomplete="off" /></el-form-item><el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual><el-form-item prop="pwd"><!-- <span class="svg-container"><svg-icon icon-class="password" /></span> --><span style="color: #9A9CA1;display: block;font-size: 18px;">密码</span><el-input :key="passwordType" ref="pwd" v-model.trim="loginForm.pwd" :type="passwordType" placeholder="" name="pwd" tabindex="2"autocomplete="off" @keyup.native="checkCapslock" @blur="capsTooltip = false" @keyup.enter.native="handleLogin" /><span class="show-pwd" @click="showPwd"><span :style="{ 'display': passwordType === 'password' ? '' : 'none' }"><Sunny></Sunny></span><span :style="{ 'display': passwordType === 'password' ? 'none' : '' }"><Moon></Moon></span><!-- <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" /> --></span></el-form-item></el-tooltip><el-button :loading="loading" type="primary" class="login-button" @click.native.prevent="handleLogin">登录</el-button></el-form>//下面是字段和方法passwordType: 'password',checkCapslock(e) {const { key } = ethis.capsTooltip = key && key.length === 1 && key >= 'A' && key <= 'Z'},async handleLogin() {window.localStorage.removeItem('token')if (this.validateUser() && this.validatePass()) {let loginObj = {}loginObj.username = this.loginForm.usernameloginObj.password = this.loginForm.pwdloginObj.machineType = Number(1)loginObj.machineName = ''loginObj.machineId = ''try {// 登录接口,输入账号密码的let token = await LoginWithPassword(loginObj)// 存到vuex里一份ttacLinkStore.set_token(token.data)this.$router.push({ path: '/home' })} catch (error) {ElMessage({message: error,type: 'error'})}// let token = 'asdfasdf'}}
2.路由跳转的时候的操作,点击登陆后针对不同用户不同操作
//所有的路由import allroutes from './routes'
//跳转守卫
const router_beforeEach = async (to, from, next) => {
//去登录页,直接放if (to.path == '/adminLogin') {next()return} else {
//不然就是走具体方法await hasTokenFromUrl(to, from, next)}
}//地址不是登录页就走这
async function hasTokenFromUrl(to, from, next) {//从本地拿token,看有没有let token = window.localStorage.getItem('token')//本项目拿vuex的写法let ttacLinkStore = useTTACLinkStore()if (token) {//存token到vuexttacLinkStore.set_token(token)//验证token是否通过的字段let tokenIsValidate = falsetry {//验证token是否通过,并且返回登录用户数据的tokenIsValidate = await checkToken()//保存用户数据到vuex的ttacLinkStore.set_currentUserInfo(tokenIsValidate.data)} catch (error) {}//token验证不通过直接毙掉,回登录页if (tokenIsValidate === false || tokenIsValidate.data === false) {// await hasTokeLocal(to, from, next, type)next('/adminLogin')} else {//通过了再存一次tokenttacLinkStore.set_token(token)//是否是管理员登录//如果不是管理员,是普通用户if (ttacLinkStore.currentUserInfo.userinfo.username != 'admin') {//这个是当前登陆用户被分配的所有页面的数据//用户被分配权限的页面let selfmenus = await getSelfMenus()//存一下vuexttacLinkStore.save_menuSelfData(selfmenus.data)//这玩意是根据当前页面和所有路由对照,取出来的当前用户的有的路由let cuteuserroutes = cutePermissionRoutes(selfmenus.data, allroutes)//存一下ttacLinkStore.updateRoutes(cuteuserroutes)let path = null//跳到当前用户所有权限的路由的第一个界面,看需求用不用,用就下面的next,不用就直接nextfor (let index = 0; index < cuteuserroutes.length; index++) {const element = cuteuserroutes[index]if (!element.children || element.children.length < 1) {continue}path = element.children[0].pathbreak}next()//next(path[0])} else {//管理员就存一下所有路由,ttacLinkStore.updateRoutes(allroutes)next()}}} else {//没token直接回登录next('/adminLogin')}
}//用户被分配权限的页面,所有路由
function cutePermissionRoutes(userRoleMenus, allroutes) {let res = []const keysSet = new Set(userRoleMenus.map((item) => item.menuPath)) // 提取数组 A 的字段 'a'[^3] [ 'adminglog' ,'home'...... ,]allroutes.forEach((item2) => {if (keysSet.has(item2.path)) {// 检查数组 B 的 'id' 是否存在于 keysSet 中res.push(item2) // 如果匹配,则将该项添加到结果数组中}})debugger//返回的是分配的页面的路由数据,用于展示return res
}
//基本上就ojbk了,大头在用户分配权限这里
相关文章:

登录的写法,routerHook具体配置,流程
routerHook挂在在index.js/main.js下的,找不到可以去那边看一下 vuex需要做的: //创建token的sate,从本地取 let token window.localStorage.getItem(token) // 存储用户登录信息let currentUserInfo reactive({userinfo: {}}) //存根据不…...
Java-IO流之字节输出流详解
Java-IO流之字节输出流详解 一、Java字节输出流基础概念1.1 Java IO体系与字节输出流的位置1.2 字节输出流的核心类层次结构 二、OutputStream接口核心方法详解2.1 void write(int b)2.2 void write(byte[] b)2.3 void write(byte[] b, int off, int len)2.4 void flush()2.5 v…...

工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线
一、方案背景 在工地、矿山、工厂等高危作业场景,反光衣是保障人员安全的必备装备。但传统人工巡查存在效率低、易疏漏等问题,难以实现实时监管。AI智能分析网关V4基于人工智能技术,可自动识别人员着装状态,精准定位未穿反光衣…...
采摘机器人项目
采摘对象特点 表皮组织比较柔软,很容易损伤蔬菜或者水果生长的位置具有随机性。挂果的位置是随机的,没有一定的规律果实的成熟期是不具备一致性的。同一颗树上的果实有的熟透了,有的还没成熟果实的大小和形状不一样。成熟度不一样࿰…...
malloc 内存分配机制:brk 与 mmap
一、malloc的两种内存分配策略 malloc 并非直接的系统调用,而是C标准库封装的内存管理函数。它根据应用程序请求的内存大小,智能地选择两种不同的底层机制向操作系统申请内存: 小块内存分配 (< 128KB):brk() / sbrk() 系统调用…...

设计模式——中介者设计模式(行为型)
摘要 文章详细介绍了中介者设计模式,这是一种行为型设计模式,通过中介者对象封装多个对象间的交互,降低系统耦合度。文中阐述了其核心角色、优缺点、适用场景,并通过类图、时序图、实现方式、实战示例等多方面进行讲解࿰…...

MinGW-w64的安装详细步骤(c_c++的编译器gcc、g++的windows版,win10、win11真实可用)
文章目录 1、MinGW的定义2、MinGW的主要组件3、MinGW-w64下载与安装 3.1、下载解压安装地址3.2、MinGW-w64环境变量的设置 4、验证MinGW是否安装成功5、编写一段简单的代码验证下6、总结 1、MinGW的定义 MinGW(Minimalist GNU for Windows) 是一个用…...

LabVIEW磁悬浮轴承传感器故障识别
针对工业高端装备中主动磁悬浮轴承(AMB)的位移传感器故障检测需求,基于 LabVIEW 平台构建了一套高精度故障识别系统。通过集成品牌硬件与 LabVIEW 的信号处理能力,实现了传感器探头故障的实时监测与精准定位,解决了传统…...
MongoDB-6.0.24 主从复制搭建和扩容缩容详解
目录 1 操作系统信息 2 MongoDB 集群架构图 3 MongoDB 软件安装及配置 4 初始化存储集群和配置 5 MongoDB主从复制集群测试 6 MongoDB运维管理 7 主从复制集群扩容一个secondary节点 8 主从复制集群缩容一个节点 1 操作系统信息 rootu24-mongo-70:~# cat /etc/issue Ub…...
Resend React Email:用React组件化思维重塑电子邮件开发
在数字化沟通中,电子邮件仍是企业与用户建立联系的核心渠道。然而传统邮件开发依赖繁琐的HTML表格布局和行内样式,效率低下且兼容性难以保障。Resend团队推出的React Email开源框架(https://github.com/resend/react-email)正通过…...
UNION 与 UNION ALL 的区别
UNION 与 UNION ALL 的区别 1. 基本概念 1.1 UNION 操作符 UNION 是SQL中用于合并两个或多个SELECT语句结果集的操作符,它会自动去除重复行并按照默认规则排序。 go专栏:https://duoke360.com/tutorial/path/golang SELECT column1 FROM table1 UNION SELECT column1 FRO…...

多线程1(Thread)
认识线程(Thread) 在进程中,要创建一个进程和销毁一个进程所消耗的硬件和软件资源是巨大的,因此为了优化上述过程,我们引入了“线程”。 线程是系统调度的基本单位。 1)线程和进程的关系 可以认为进程包…...

NVIDIA DOCA 3.0:引领AI基础设施革命的引擎简析
引言 在当今快速发展的AI时代,大规模AI模型的训练和部署对数据中心基础设施提出了前所未有的挑战。传统的CPU-centric架构已经难以满足超大规模AI工作负载对性能、效率和安全性的需求。NVIDIA于2025年4月正式发布了DOCA 3.0软件框架,这一创新性平台彻底改变了AI基础设施的设计…...

小家电外贸出口新利器:WD8001低成本风扇智能控制方案全解析
低成本单节电池风扇解决方案WD8001 用途 低成本单节电池风扇解决方案WD8001用于小功率风扇供电及控制,具有三个档位调节、自动停机及锁机功能。 基本参数 充电参数:输入5V/500mA,满电4.2V,充电指示灯亮,满电后熄灭…...
【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
步骤:配置Pycharm,Firefox安装Selenium IDE插件,下载geckodriver插件,安装至Firefox目录下。https://blog.csdn.net/weixin_61926199/article/details/148383668?fromshareblogdetail&sharetypeblogdetail&sharerId14838…...

C++实现汉诺塔游戏用户交互
目录 一、模型调整(一)模型定义(二)模型实现1.电脑自动完成部分2.SDL图形显示2.1拿起放下盘子的函数2.2左右移动手指的函数 二、处理用户输入,进行人机分流三、总结四、源码下载 上篇文章使用C语言实现汉诺塔游戏电脑自动完成的步骤,还没有实现用户交互&…...

谷歌地图手机版(Google maps)v11.152.0100安卓版 - 前端工具导航
谷歌地图(Google maps)是由谷歌官方推出的一款手机地图应用。软件功能强大,支持本地搜索查找世界各地的地址、地点和商家;支持在街景视图中查看世界各地的360度全景图;支持查找乘坐火车、公交车和地铁的路线,或者查找步行路线等 …...
AJAX对于XML和JSON的处理
这是book.xml文件: <?xml version"1.0" encoding"ISO-8859-1"?><bookstore><book category"children"><title>Harry Potter</title> <author>J K. Rowling</author> <year>2005&…...

C++核心编程_关系运算符重载
4.5.5 关系运算符重载 作用:重载关系运算符,可以让两个自定义类型对象进行对比操作 /*#### 4.5.5 关系运算符重载 **作用:**重载关系运算符,可以让两个自定义类型对象进行对比操作 */class Person { public:Person(string name, …...
NIO知识点
一、Java NIO 基础概念 Java NIO(New Input/Output)是从 Java 1.4 版本开始引入的新的 IO API,它提供了与标准 IO 不同的工作方式。主要特点包括: 面向缓冲区:数据读取到一个稍后处理的缓冲区,需要时可在…...

T/CCSA 663-2025《医疗科研云平台技术要求》标准解读与深度分析
参考地址:https://www.doc88.com/p-30280431175529.html 引言 随着医疗信息化建设的深入推进,医疗行业正经历从"业务驱动"向"数据驱动"的转型。在这一背景下,中国通信标准化协会(CCSA)于2025年发布了T/CCSA 663-2025《医疗科研云平台技术要求》标准,并…...

win11回收站中出现:查看回收站中是否有以下项: WPS云盘回收站
好久没更新了,首先祝所有大朋友、小朋友六一儿童节快乐,真的希望我们永远都不会长大呀,长大真的好累呀(•_•) 免责声明 笔者先来个免责声明吧,被网上的阴暗面吓到了 若读者参照笔者的这篇文章所执行的操作中途或后续出现的任何…...
Nginx+Tomcat 负载均衡群集
一、Tomcat 基础与案例部署 (一)Tomcat 概述与应用场景 起源与命名 Tomcat 最初由 Sun 公司的詹姆斯・邓肯・戴维森开发,后贡献给 Apache 软件基金会。项目早期名为 “Catalina”,因此安装目录中包含大量与 Catalina 相关的文件…...

SCDN如何同时保障网站加速与DDoS防御?
在互联网时代,网站既要面对用户访问量的激增,又要抵御层出不穷的网络攻击,特别是DDoS攻击的威胁。SCDN(安全内容分发网络)作为融合加速与安全的解决方案,如何实现“加速”与“防御”的双重保障?…...
Trae CN IDE 中 Python 开发的具体流程和配置总结
以下是 Trae CN IDE 中 Python 开发的具体流程和配置总结,结合实例说明,帮助开发者快速上手: 一、环境准备 1. 安装 Trae CN IDE 下载地址:访问 Trae 官网 下载对应操作系统的安装包(Windows .exe / macOS .dmg / Linux .tar.gz)。安装步骤: Windows:双击 .exe 文件,…...
PostgreSQL不同的等级认证体系
PostgreSQL 专家认证有不同的等级和体系,以工业和信息化部人才交流中心推出的认证为例,分为 PGCA 认证专员、PGCP 认证专家、PGCM 认证大师三个等级。以下是学习建议: 明确学习目标与认证等级 PGCA初级认证专员:适合刚接触 Post…...

项目前置知识——不定参以及设计模式
1.C语言不定参宏函数 c语言中,printf就是一个不定参函数,在使用不定参宏函数时,我们使用__VA_ARGS__来解析不定参: #include <iostream> #include <cstdarg>#define LOG(fmt/*格式*/, .../*用...表示不定参*/) prin…...

04powerbi-度量值-筛选引擎CALCULATE()
1、calculate calculate 的参数分两部分,分别是计算器和筛选器 2、多条件calculater与表筛选 多条件有不列的多条件 相同列的多条件 3、calculatertable (表,筛选条件)表筛选 与calculate用法一样,可以用创建表&…...
JavaScript排序算法详解:从基础到高级
排序是编程中最基本也是最重要的操作之一。JavaScript作为一门广泛应用于Web开发的语言,提供了内置的排序方法,但了解各种排序算法的原理和实现对于开发者来说仍然至关重要。本文将深入探讨JavaScript中常见的排序算法,帮助您理解它们的原理、…...

chromedriver 下载失败
问题描述 chromedriver 2.46.0 下载失败 淘宝https://registry.npmmirror.com/chromedriver/2.46/chromedriver_win32.zip无法下载 解决方法 找到可下载源 https://cdn.npmmirror.com/binaries/chromedriver/2.46/chromedriver_win32.zip ,先将其下载到本地目录(D…...