当前位置: 首页 > news >正文

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

导言

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

过程

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

router.beforeEach((to, from, next) => {NProgress.start()//如果有tokenif (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 = falsestore.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 {// 没有tokenif (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.dataconst 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.jsGenerateRoutes({ 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,用户信息的持久化和菜单生成...

相关文章:

  • 第L2周:机器学习|线性回归模型 LinearRegression:2. 多元线性回归模型
  • FileLink跨网文件交换|解决网络隔离导致的文件共享难题
  • Unity NetCode 客户端连接不上服务器,局域网模式 Failed to connect to server.
  • 贴片式TF卡(SD NAND)参考设计
  • 采用云端SaaS服务模式的基层云HIS系统,源码开放合作,B/S架构,公立二甲医院应用五年。
  • 828华为云征文 | 华为云Flexus X实例在混合云环境中的应用与实践
  • 04 B-树
  • 使用 npkill 快速清理本地 node_modules 文件
  • Appium跨平台测试实战:从Android到iOS
  • Unreal Engine 5 C++: 插件编写03 | MessageDialog
  • 鸿蒙HarmonyOS开发生态
  • 流水线并行(Pipeline Parallelism)原理详解
  • 软考中级网络规划设计师已过,分享一些备考心得
  • 推荐2个国内优秀的物联网平台
  • 生信初学者教程(十二):数据汇总
  • 【comparator, comparable】小总结
  • bootstrap创建登录注册页面
  • input实现文字超出省略号功能
  • JavaScript设计模式与开发实践系列之策略模式
  • Java程序员幽默爆笑锦集
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux CTF 逆向入门
  • Mocha测试初探
  • 大主子表关联的性能优化方法
  • 关于for循环的简单归纳
  • 近期前端发展计划
  • 前端技术周刊 2019-02-11 Serverless
  • 如何选择开源的机器学习框架?
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 数据可视化之 Sankey 桑基图的实现
  • 听说你叫Java(二)–Servlet请求
  • 应用生命周期终极 DevOps 工具包
  • 阿里云移动端播放器高级功能介绍
  • 关于Android全面屏虚拟导航栏的适配总结
  • #pragma 指令
  • (3)(3.5) 遥测无线电区域条例
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (ZT)薛涌:谈贫说富
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (四)JPA - JQPL 实现增删改查
  • (算法)N皇后问题
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (转)JAVA中的堆栈
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core 项目指定SDK版本
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • //解决validator验证插件多个name相同只验证第一的问题
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • []FET-430SIM508 研究日志 11.3.31
  • [1525]字符统计2 (哈希)SDUT