有关若依登录过程前端的对应处理学习

news2024/11/16 19:42:38

导言

在用C#搞完个后端后想用若依的前端做对接,不过很久没搞过若依了,想趁这个二次开发的过程记录熟悉一下登录的过程

过程

验证,在permission.js的路由守卫,这里在用户发起api请求时会验证用户的请求是否有token,对应访问的权限,并进行相应的拦截和跳转

router.beforeEach((to, from, next) => {
  NProgress.start()
  //如果有token
  if (getToken()) {
    to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
    /* has token*/
    //如果在登录
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
    } else {
      //不在登录的话根据用户角色动态生成路由表
      if (store.getters.roles.length === 0) {
        isRelogin.show = true
        // 判断当前用户是否已拉取完user_info信息
        store.dispatch('GetInfo').then(() => {
          isRelogin.show = false
          store.dispatch('GenerateRoutes').then(accessRoutes => {
            // 根据roles权限生成可访问的路由表
            router.addRoutes(accessRoutes) // 动态添加可访问路由表
            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
          })
        }).catch(err => {
            store.dispatch('LogOut').then(() => {
              Message.error(err)
              next({ path: '/' })
            })
          })
      } else {
        next()
      }
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单,直接进入
      next()
    } else {
      console.log("//如果在登录");
      next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) // 否则全部重定向到登录页
      NProgress.done()
    }
  }
})

 1.获取验证码图片,展示

从登录页面开始先调后端拿验证码图片和从cookie拿到之前保存的用户登录信息

然后在api定义请求后端接口的方法格式与所要传递的参数,这里不需要传token

//在api/login
// 获取验证码  
export function getCodeImg() {
  return request({
    url: '/api/Auth/Code',
    headers: {
      isToken: false
    },
    method: 'get',
    timeout: 20000
  })
}

接到后端返回验证码(Base64 编码)后,前端对应显示在页面上

<img :src="codeUrl" @click="getCode" class="login-code-img"/>
...
getCode() {
      //调用拿验证码
      getCodeImg().then(res => {
        console.log(res,",验证码");

        this.captchaEnabled = res.statusCode === 200 ? true : res.captchaCode;
        if (this.captchaEnabled) {
          console.log("进来了",res.data.captchaGUID)
          this.codeUrl = res.data.captchaCode;
          this.loginForm.uuid = res.data.captchaGUID;
        }
      });
    },

验证码大概长这样

{
  "captchaImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
2.登录提交,存token

用户点击提交表单(登录)后前端将所需的东西传回后端验证,具体是先调store中的登录方法,这样好存token

//login.vue
handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.loading = true;
          if (this.loginForm.rememberMe) {
            Cookies.set("username", this.loginForm.username, { expires: 30 });
            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
          } else {
            Cookies.remove("username");
            Cookies.remove("password");
            Cookies.remove('rememberMe');
          }
          //调后端登录接口 先是从持久化那调,
          //然后在那边调完就存token 再把登录成功的信息 传过来
          this.$store.dispatch("Login", this.loginForm).then(() => {
            console.log("登录处理成功!");
            
            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
          }).catch(() => {
            this.loading = false;
            if (this.captchaEnabled) {
              this.getCode();
            }
          });
        }
      });
    }
3.用户信息持久化

存完之后在handleLogin最后跳转路由之前会在路由守卫那进到if (store.getters.roles.length === 0),即已经有token和不在登录界面。这时需要用户角色来动态生成路由与存用户的信息,所以还要请求后端拿到用户的详细信息

同理也是先调store中的相应方法,在通过这个来调请求后端的方法

//先调这个 在...src\store\modules\user.js
// 获取用户信息 
    GetInfo({ commit, state }) {
      
      
      return new Promise((resolve, reject) => {
          //在这里调请求后端的方法
          getInfo().then(res => {
          //成功后做持久化
          console.log("用户信息:",res);
          
          const user = res.data
          const avatar = (user.avatarUrl == "" || user.avatarUrl == null) ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatarUrl;
          if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
            commit('SET_ROLES', res.roles)
            commit('SET_PERMISSIONS', res.permissions)
          } else {
            commit('SET_ROLES', ['ROLE_DEFAULT'])
          }
          commit('SET_ID', user.userId)
          commit('SET_NAME', user.userName)
          commit('SET_AVATAR', avatar)
          resolve(res)
        }).catch(error => {
          reject(error)
        })
      })
    },
// 获取用户详细信息
export function getInfo() {
  return request({
    headers: {
      isToken: true
    },
    url: '/api/Auth/GetUserInfo',
    method: 'get'
  })
}
4.生成动态路由菜单

请求后端获得菜单树,在前端根据用户角色(管理员和普通用户)将其转换为菜单

// 生成路由  在src\store\modules\permission.js
    GenerateRoutes({ commit }) {
      return new Promise(resolve => {
        // 向后端请求路由数据
        getRouters().then(res => {
          const sdata = JSON.parse(JSON.stringify(res.data))
          const rdata = JSON.parse(JSON.stringify(res.data))
          const sidebarRoutes = filterAsyncRouter(sdata)
          const rewriteRoutes = filterAsyncRouter(rdata, false, true)
          const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
          rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
          router.addRoutes(asyncRoutes);
          commit('SET_ROUTES', rewriteRoutes)
          commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
          commit('SET_DEFAULT_ROUTES', sidebarRoutes)
          commit('SET_TOPBAR_ROUTES', sidebarRoutes)
          resolve(rewriteRoutes)
        })
      })
    }

之后路由守卫放行,进到主页..

结语

登录过程不是很复杂,主要就是路由守卫的一系列验证筛选,把不合规范的请求和路由跳转都筛掉了。

正常登录流程大概是验证码图片获取,登录提交,token,用户信息的持久化和菜单生成...

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

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

相关文章

网络编程(10)——json序列化

十、day10 今天学习如何使用jsoncpp将json数据解析为c对象&#xff0c;将c对象序列化为json数据。jsoncp经常在网络通信中使用&#xff0c;也就是服务器和客户端的通信一般使用json&#xff08;可视化好&#xff09;&#xff1b;而protobuf一般在服务器之间的通信中使用 json…

C# 委托(Delegate)二

一.委托的多播&#xff08;Multicasting of a Delegate&#xff09;&#xff1a; 委托对象&#xff0c;使用 "" 运算符进行合并&#xff0c;一个合并委托调用它所合并的两个委托。使用"-" 运算符从合并的委托中移除组件委托。 注&#xff1a;只有相同类型…

使用 Napkins.dev 将草图转换为应用程序

在现代前端开发中&#xff0c;快速将设计草图转换为实际的应用程序代码是一个巨大的优势。Napkins.dev 是一个利用人工智能将网站设计草图转换成实际应用程序的平台。本文将介绍如何使用 Napkins.dev 进行这一过程。 什么是 Napkins.dev&#xff1f; Napkins.dev 是一个开源平…

机器学习-TopicModel

概率图模型基础概率潜在语义分析&#xff08;PLSA&#xff09;LDA 概率图模型基础 猜球游戏 有两个信封&#xff0c;其中一个装有一个红球&#xff0c;一个黑球。另一个信封有两个黑球。 。 假设红球价值100元&#xff0c;黑球价值1元。 你随机从其中拿起一个信封&#xff0c;从…

Linux高阶IO之select多路转接

文章目录 select多路转接timeoutfd_set返回值执行过程总结 select多路转接 多路转接有三种方案,分别是select,poll和epoll,我们都会讲解和介绍 select的函数原型是这样的 他一共有五个参数,但是可以分为三组 nfds:需要监视的最大的文件描述符值1readfds:可读文件描述符集合 …

C#邮件发送:实现自动化邮件通知完整指南!

C#邮件发送性能怎么优化&#xff1f;使用C#发送邮件的设置步骤&#xff1f; 无论是用于客户服务、内部沟通还是项目管理&#xff0c;自动化邮件通知都能显著提高效率和响应速度。AokSend将详细介绍如何使用C#邮件发送功能来实现自动化邮件通知系统。 C#邮件发送&#xff1a;配…

二、词法分析,《编译原理》(本科教学版),第2版

文章目录 一、词法分析器1.1 词法分析器的作用1.2 词法分析器的设计方法1.3Antlr 词法分析器生成器1.3.1 环境准备1.3.2 词法分析器自动生成初体验&#xff08;需了解少许正则表达式概念&#xff09;1.3.2.1 创建工程1.3.2.2 空白符逻辑1.3.2.3 实现INT类型1.3.2.4 实现单行注释…

ClkLog常见问题-埋点集成篇Sec. 2

本篇将继续解答ClkLog使用过程中【埋点集成】阶段的常见问题。 1.【埋点集成】 问&#xff1a;receiver数据接收是不是一定要有ssl证书&#xff1f; 答&#xff1a;不是。 2.【埋点集成】 问&#xff1a;接收服务地址从哪里获取&#xff1f; 答&#xff1a;接收服务地址参考&am…

死磕P7: JVM垃圾回收那点事,轻松拿捏不是事儿(一)

这是「死磕P7」系列第 003 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 上两篇介绍了 JVM 内存区域划分&#xff0c;简单记忆一下就可以了&#xff0c;后面再不断深入吧。 死磕P7: JVM内存划分必知必会…

Spring邮件发送:配置与发送邮件详细步骤?

Spring邮件发送教程指南&#xff1f;怎么用Spring邮件发送服务&#xff1f; Spring框架提供了强大的邮件发送支持&#xff0c;使得开发者能够轻松地在应用程序中集成邮件发送功能。AokSend将详细介绍如何在Spring应用中配置和发送邮件&#xff0c;帮助开发者快速掌握这一关键技…

浙大数据结构:06-图2 Saving James Bond - Easy Version

这道题是稍复杂版的dfs或bfs&#xff0c;此处我采用bfs实现 机翻&#xff1a; 1、条件准备 n为鳄鱼数量&#xff0c;jump为跳一次最大距离。 eyu数组对存每条鳄鱼的坐标位置&#xff0c;visit数组判断该鳄鱼是否走过&#xff0c;isalive判断到达该鳄鱼时能否逃离。 #includ…

探索图像生成大模型Imagen:原理、比较与应用

目录 目录 1. 引言 2. 图像生成模型的发展背景 2.1 生成对抗网络&#xff08;GAN&#xff09; 2.2 变分自编码器&#xff08;VAE&#xff09; 2.3 自回归模型 2.4 扩散模型 3. Imagen简介 3.1 模型架构 3.2 关键技术 3.3 训练数据与方法 4. Imagen与其他模型的比较 …

ArcGIS Pro高级地图可视化—双变量符号地图

ArcGIS Pro高级地图可视化 ——双变量符号地图 1 背景 “我不是双变量&#xff0c;但我很好奇。”出自2013 年南卡罗来纳州格林维尔举行的 NACIS 会议上&#xff0c;双变量地图随着这句俏皮的话便跳跃在人们的视角下&#xff0c;在讨论二元映射之后&#xff0c;它不仅恰逢其…

AOT源码解析4.5-AOT整体结构

论文阅读 papergithub论文阅读笔记AOT源码解析1-数据集处理AOT源码解析2-encoderdecoderAOT源码解析3-模型训练AOT源码解析4.1-model主体AOT源码解析4.2-model主体AOT源码解析4.3-model主体AOT源码解析4.4-model主体AOT源码解析4.5-model主体 4.1~4.4小节详细讲解了ref_imgs相…

15年408-数据结构

第一题 解析&#xff1a; 栈第一次应该存main的信息。 然后进入到main里面&#xff0c;要输出S(1)&#xff0c;将S(1)存入栈内&#xff0c; 进入到S(1)中&#xff0c;1>0,所以还要调用S(0) S(0)进入栈中&#xff0c;此时栈内从下至上依次是main(),S(1),S(0) 答案选A 第二题&…

Java基于相似算法实现以图搜图

一、简述 本文主要讲如何利用图片相似性算法&#xff0c;基于LIRE来实现图片搜索。 二、依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core --><dependency><groupId>org.apache.lucene</groupId><…

Apache Solr:深入探索与常见误区解析

Apache Solr&#xff1a;深入探索与常见误区解析 Apache Solr 是一个强大的搜索引擎&#xff0c;基于 Lucene 构建&#xff0c;广泛应用于电商平台、日志分析、内容管理系统等领域。Solr 的功能强大&#xff0c;然而它的配置和使用过程却不乏一些容易误解和出错的地方。本文将…

Spring validation校验框架

第1步&#xff1a;导入依赖 <!-- 校验框架--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 第2步&#xff1a;为需要校验的参数&…

Leetcode 739.42. 每日温度 接雨水 单调栈 C++实现

问题&#xff1a;Leetcode 739. 每日温度 算法1&#xff1a;从右到左 栈中记录下一个更大元素的「候选项」。 代码&#xff1a; class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();vector<…

【echarts】报错series.render is required.

总结&#xff1a;就是echarts无法保存renderItem函数到json里&#xff0c;因为renderItem是个封装方法&#xff0c;因此需要初始化加载时重新插入renderItem即可 1.描述&#xff1a;控制台报错series.render is required. 原数据json如下&#xff1a; {type: "bar"…