登录的写法,routerHook具体配置,流程

news2025/7/24 0:59:55

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 = newValue
    window.localStorage.setItem('token', token)
  }

// 清除token,退出的时候
 const clear_token = (newValue) => {
    token = newValue
    window.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 } = e
      this.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.username
        loginObj.password = this.loginForm.pwd
        loginObj.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到vuex
    ttacLinkStore.set_token(token)
    //验证token是否通过的字段
    let tokenIsValidate = false
    try {
      //验证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 {
      //通过了再存一次token
      ttacLinkStore.set_token(token)
      //是否是管理员登录
        //如果不是管理员,是普通用户
      if (ttacLinkStore.currentUserInfo.userinfo.username != 'admin') {
        //这个是当前登陆用户被分配的所有页面的数据
        //用户被分配权限的页面
        let selfmenus = await getSelfMenus()
        //存一下vuex
        ttacLinkStore.save_menuSelfData(selfmenus.data)
        //这玩意是根据当前页面和所有路由对照,取出来的当前用户的有的路由
        let cuteuserroutes = cutePermissionRoutes(selfmenus.data, allroutes)
        //存一下
        ttacLinkStore.updateRoutes(cuteuserroutes)
        let path = null
        //跳到当前用户所有权限的路由的第一个界面,看需求用不用,用就下面的next,不用就直接next
        for (let index = 0; index < cuteuserroutes.length; index++) {
          const element = cuteuserroutes[index]
          if (!element.children || element.children.length < 1) {
            continue
          }
          path = element.children[0].path
          break
        }
        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了,大头在用户分配权限这里

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

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

相关文章

工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线

一、方案背景​ 在工地、矿山、工厂等高危作业场景&#xff0c;反光衣是保障人员安全的必备装备。但传统人工巡查存在效率低、易疏漏等问题&#xff0c;难以实现实时监管。AI智能分析网关V4基于人工智能技术&#xff0c;可自动识别人员着装状态&#xff0c;精准定位未穿反光衣…

设计模式——中介者设计模式(行为型)

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

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&#xff08;Minimalist GNU for Windows&#xff09; 是一个用…

LabVIEW磁悬浮轴承传感器故障识别

针对工业高端装备中主动磁悬浮轴承&#xff08;AMB&#xff09;的位移传感器故障检测需求&#xff0c;基于 LabVIEW 平台构建了一套高精度故障识别系统。通过集成品牌硬件与 LabVIEW 的信号处理能力&#xff0c;实现了传感器探头故障的实时监测与精准定位&#xff0c;解决了传统…

多线程1(Thread)

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

NVIDIA DOCA 3.0:引领AI基础设施革命的引擎简析

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

小家电外贸出口新利器:WD8001低成本风扇智能控制方案全解析

低成本单节电池风扇解决方案WD8001 用途 低成本单节电池风扇解决方案WD8001用于小功率风扇供电及控制&#xff0c;具有三个档位调节、自动停机及锁机功能。 基本参数 充电参数&#xff1a;输入5V/500mA&#xff0c;满电4.2V&#xff0c;充电指示灯亮&#xff0c;满电后熄灭…

C++实现汉诺塔游戏用户交互

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

谷歌地图手机版(Google maps)v11.152.0100安卓版 - 前端工具导航

谷歌地图(Google maps)是由谷歌官方推出的一款手机地图应用。软件功能强大&#xff0c;支持本地搜索查找世界各地的地址、地点和商家&#xff1b;支持在街景视图中查看世界各地的360度全景图&#xff1b;支持查找乘坐火车、公交车和地铁的路线&#xff0c;或者查找步行路线等 …

C++核心编程_关系运算符重载

4.5.5 关系运算符重载 作用&#xff1a;重载关系运算符&#xff0c;可以让两个自定义类型对象进行对比操作 /*#### 4.5.5 关系运算符重载 **作用&#xff1a;**重载关系运算符&#xff0c;可以让两个自定义类型对象进行对比操作 */class Person { public:Person(string name, …

T/CCSA 663-2025《医疗科研云平台技术要求》标准解读与深度分析

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

win11回收站中出现:查看回收站中是否有以下项: WPS云盘回收站

好久没更新了&#xff0c;首先祝所有大朋友、小朋友六一儿童节快乐&#xff0c;真的希望我们永远都不会长大呀&#xff0c;长大真的好累呀(•_•) 免责声明 笔者先来个免责声明吧&#xff0c;被网上的阴暗面吓到了 若读者参照笔者的这篇文章所执行的操作中途或后续出现的任何…

SCDN如何同时保障网站加速与DDoS防御?

在互联网时代&#xff0c;网站既要面对用户访问量的激增&#xff0c;又要抵御层出不穷的网络攻击&#xff0c;特别是DDoS攻击的威胁。SCDN&#xff08;安全内容分发网络&#xff09;作为融合加速与安全的解决方案&#xff0c;如何实现“加速”与“防御”的双重保障&#xff1f;…

项目前置知识——不定参以及设计模式

1.C语言不定参宏函数 c语言中&#xff0c;printf就是一个不定参函数&#xff0c;在使用不定参宏函数时&#xff0c;我们使用__VA_ARGS__来解析不定参&#xff1a; #include <iostream> #include <cstdarg>#define LOG(fmt/*格式*/, .../*用...表示不定参*/) prin…

04powerbi-度量值-筛选引擎CALCULATE()

1、calculate calculate 的参数分两部分&#xff0c;分别是计算器和筛选器 2、多条件calculater与表筛选 多条件有不列的多条件 相同列的多条件 3、calculatertable &#xff08;表&#xff0c;筛选条件&#xff09;表筛选 与calculate用法一样&#xff0c;可以用创建表&…

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 &#xff0c;先将其下载到本地目录(D…

Weather app using Django - Python

我们的任务是使用 Django 创建一个 Weather 应用程序&#xff0c;让用户可以输入城市名称并查看当前天气详细信息&#xff0c;例如温度、湿度和压力。我们将通过设置一个 Django 项目&#xff0c;创建一个视图来从 OpenWeatherMap API 获取数据&#xff0c;并设计一个简单的模板…

机器视觉2,硬件选型

机器视觉1&#xff0c;学习了硬件的基本知识和选型&#xff0c;现在另外的教材巩固知识 选相机 工业相机选型的保姆级教程_哔哩哔哩_bilibili 1.先看精度多少mm&#xff0c;被检测物体长宽多少mm》分辨率&#xff0c; 选出合理范围内的相机 2.靶面尺寸&#xff0c;得出分…

电阻电容的选型

一、电阻选型 1.1安装方式 贴片电阻体积小&#xff0c;适用于SMT生产&#xff1b;功率小&#xff1b;易拆解插件电阻体积大&#xff1b;功率大&#xff1b;不易脱落 1.2阻值 电阻的阻值是离散的&#xff0c;其标称阻值根据精度分为E6、E12、E24、E48、E96、E192六大系列&am…

12.springCloud AlibabaSentinel实现熔断与限流

目录 一、Sentinel简介 1.官网 2.Sentinel 是什么 3.Sentinel 的历史 4.Sentinel 基本概念 资源 规则 5.Sentinel 功能和设计理念 (1).流量控制 什么是流量控制 流量控制设计理念 (2).断降级 什么是熔断降级 熔断降级设计理念 (3).系统自适应保护 6.主要工作机制…