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

RBAC前端架构-06:使用localstorage及Vuex用户信息存储逻辑

1-文件调整

  1. 修改frontend-vue2\src\store\index.js,用于整体整合Vuex更简洁
importVuefrom"vue";importVuexfrom"vuex";// 标签页管理模块importtabsfrom"./modules/tabs";// 用户信息管理模块importuserfrom"./modules/user";Vue.use(Vuex);// 创建并导出 Vuex store 实例exportdefaultnewVuex.Store({// 模块化配置 - 将 store 分割成不同的模块modules:{// 所有user的commit/dispatch都要加命名空间,如: this.$store.dispatch("user/logout");user,// 后续扩展...},});
  1. 新增frontend-vue2\src\store\modules\user.js,用于控制用户相关的信息,结合localstorage,配合Vuex存储用户的token,基本信息,菜单,权限信息,后续便于其他地方使用
import{loginApi,logoutApi}from"@/api/auth";import{getCurrentUserMenus,getUserInfo}from"@/api/user";importVuefrom"vue";importVuexfrom"vuex";Vue.use(Vuex);// 页面刷新时从 localStorage 里恢复用户状态constsavedToken=localStorage.getItem("token");constsavedUserInfo=localStorage.getItem("userInfo");constsavedUserMenus=localStorage.getItem("userMenus");constsavedUserPermissions=localStorage.getItem("userPermissions");conststate={// 全局状态:存储用户 tokentoken:savedToken||null,// 用户信息userInfo:savedUserInfo?JSON.parse(savedUserInfo):null,// 全局loading信息,用于调用接口时显示 loadingloading:false,// 当前用户的权限码userPermissions:savedUserPermissions?JSON.parse(savedUserPermissions):[],// 当前用户的菜单树userMenus:savedUserMenus?JSON.parse(savedUserMenus):[],};// mutations:修改state的唯一入口constmutations={// 设置 token(登录时调用)setToken(state,token){state.token=token;localStorage.setItem("token",token);},// 清除 token(退出时调用)clearToken(state){state.token=null;localStorage.removeItem("token");},// 设置用户信息setUserInfo(state,userInfo){state.userInfo=userInfo;localStorage.setItem("userInfo",JSON.stringify(userInfo));},// 清除用户信息clearUserInfo(state){state.userInfo=null;localStorage.removeItem("userInfo");},setUserPermissions(state,userPermissions){state.userPermissions=userPermissions;localStorage.setItem("userPermissions",JSON.stringify(userPermissions));},clearUserPermissions(state){state.userPermissions=[];localStorage.removeItem("userPermissions");},setUserMenus(state,userMenus){state.userMenus=userMenus;localStorage.setItem("userMenus",JSON.stringify(userMenus));},clearUserMenus(state){state.userMenus=[];localStorage.removeItem("userMenus");},// 控制 loading 显示开关setLoading(state,flag){state.loading=flag;},};// actions:处理异步逻辑(像 Java Service 层)constactions={asynclogin({commit},{username,password}){try{// 登录获取tokenconstres=awaitloginApi({username,password});// 登录失败,抛错if(res.code!=="200"){thrownewError(res.message||"登录失败");}commit("setToken",res.data);// 登录成功后获取用户信息constuserInfo=awaitgetUserInfo();commit("setUserInfo",userInfo.data);// 登录成功后获取用户权限// TODO可以拆一个权限接口commit("setUserPermissions",userInfo.data.permissions||[]);// 登录成功后获取用户的菜单信息constuserMenus=awaitgetCurrentUserMenus();commit("setUserMenus",userMenus.data||[]);}catch(err){throwerr;}},// 退出登录asynclogout({commit},skipApiCall=false){try{commit("setLoading",true);// 只有在主动触发 logout 时才调用 APIif(!skipApiCall){awaitlogoutApi();}}catch(error){console.error("Logout API error:",error);}finally{commit("clearToken");commit("clearUserInfo");commit("clearUserMenus");commit("clearUserPermissions");commit("setLoading",false);}},};// getters:数据的派生计算constgetters={// 获取登录状态:是否有 tokenisLoggedIn:(state)=>!!state.token,// 获取用户信息userInfo:(state)=>state.userInfo,// 获取用户角色roles:(state)=>state.userInfo?.roles||[],// 获取用户权限permissions:(state)=>state.userPermissions||[],// 检查是否有某个权限hasPermission:(state)=>(permission)=>{returnstate.userPermissions?.includes(permission)||false;},// 检查是否有某个角色hasRole:(state)=>(role)=>{returnstate.userInfo?.roles?.includes(role)||false;},// 获取用户菜单userMenus:(state)=>state.userMenus||[],// 页面loading状态isLoading:(state)=>state.loading,};// 导出这个 Vuex 模块的配置exportdefault{// 开启命名空间,防止不同模块间的状态冲突namespaced:true,state,mutations,actions,getters,};

主要作用:

  • 状态管理 (State): 存储token、用户信息、权限列表、菜单树以及全局加载状态。
  • 持久化: 初始化时自动从localStorage读取数据,更新时同步写入,确保页面刷新后登录状态不丢失
  • 异步流 (Actions): 封装了复杂的登录逻辑(登录 -> 获取用户信息 -> 获取菜单/权限)和登出逻辑。
  • 数据派生 (Getters): 提供快捷的权限判断方法(如hasPermission),方便在组件中直接使用

2-结构展示

获取对应接口响应的信息,然后存储

  • token:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzcwNzc3OTYwLCJleHAiOjE3NzA4NjQzNjB9.GxtIfTMJ_fot4VodLEdQPFeFuiTZ-PQWHfo0dN6GVco
  • userInfo:
{"id":1,"username":"admin","nickname":"管理员Main","email":"999999999@qq.com","phone":"13983999999","status":1,"createTime":"2025-09-23T07:19:52","updateTime":"2026-01-23T08:17:59","roles":["ADMIN"],"permissions":["btn:user:system:menu:create","btn:user:system:menu:delete","btn:permission:assign","btn:user:create","btn:user:update","btn:user:delete","btn:user:list"]}
  • userMenus:
[{"id":5,"menuName":"系统管理","menuCode":"menu:user:system","menuType":1,"parentId":null,"path":"/system","component":"","icon":"","sortOrder":0,"status":1,"createTime":"2025-10-24T03:58:06","updateTime":"2025-10-31T08:56:10","children":[{"id":4,"menuName":"个人中心","menuCode":"menu:user:system:profile","menuType":1,"parentId":5,"path":"/system/profile","component":"Profile","icon":"user","sortOrder":0,"status":1,"createTime":"2025-10-24T03:58:06","updateTime":"2025-10-31T08:55:57","children":[]},{"id":6,"menuName":"权限分配","menuCode":"menu:user:system:permissionassign","menuType":1,"parentId":5,"path":"/system/permissionsAssign","component":"PermissionsAssign","icon":"","sortOrder":0,"status":1,"createTime":null,"updateTime":"2025-11-19T07:01:24","children":[]},{"id":1,"menuName":"用户管理","menuCode":"menu:user:system:user","menuType":1,"parentId":5,"path":"/system/user","component":"UserManagement","icon":"user","sortOrder":1,"status":1,"createTime":"2025-10-24T03:58:06","updateTime":"2025-10-31T08:55:57","children":[]},{"id":3,"menuName":"菜单管理","menuCode":"menu:user:system:menu","menuType":1,"parentId":5,"path":"/system/menu","component":"MenuManagement","icon":"setting","sortOrder":3,"status":1,"createTime":"2025-10-24T03:58:06","updateTime":"2025-10-31T08:55:57","children":[]}]},{"id":2,"menuName":"订单管理","menuCode":"menu:order","menuType":1,"parentId":null,"path":"/order","component":"OrderManagement","icon":"tickets","sortOrder":2,"status":1,"createTime":"2025-10-24T03:58:06","updateTime":"2025-10-30T04:18:39","children":[]}]
  • userPermissions:
["btn:user:system:menu:create","btn:user:system:menu:delete","btn:permission:assign","btn:user:create","btn:user:update","btn:user:delete","btn:user:list"]

以上信息主要用于让其他组件获取使用,比如后续菜单的展示,就用userMenus中的信息

http://www.jsqmd.com/news/370196/

相关文章:

  • 深入解析:华为HuaweiCloudStack(一)介绍与架构
  • .NET框架 - NETCORE + API + EF(DBFirst) + PostgresSql
  • 聊聊电动重型货架、电移动货架靠谱生产商,哪家性价比高 - 工业设备
  • 全球口服抗衰营养保健品风向标,为什么盼生派NMN 2026年会值得重点投资? - 速递信息
  • 微信立减金不浪费!自用省钱+闲置回收技巧,新手也能轻松上手 - 可可收
  • 微生物限度检测仪靠谱厂家推荐:关键参数解析+主流品牌实测数据对比 - 品牌推荐大师
  • 5分钟搭建完整后端服务,这款开源的快速开发神器太牛了! - Lafite
  • 2026年儿童牙膏品牌推荐:基于多年龄段实测评价,针对刷牙抗拒与口味挑剔难题 - 品牌推荐
  • 2026最新烹饪院校推荐!中国厨师之乡/陈派豫菜/营养配餐优质院校权威榜单发布 - 品牌推荐2026
  • 聚焦2026年1月,XRNM源头厂家口碑好的排行榜单,目前比较好的XRNM企业行业优质排行榜亮相 - 品牌推荐师
  • 2026最新业财数据应用与管理专业推荐!国内优质院校权威榜单发布,适配餐饮产业发展需求 - 品牌推荐2026
  • 追踪调试
  • 知识库,RAG(Embedding模型和向量数据库),MCP(Function Calling)
  • 网络流杂谈
  • Git 分支使用规范
  • Claude Code 小白指北(二):五个“暗号”,让 Claude Code 干活更听话
  • 2026最新大数据与会计专业推荐!国内优质院校权威榜单发布,特色办学助力职业发展 - 品牌推荐2026
  • 分期乐购物额度如何回收?便捷流程一步到位 - 团团收购物卡回收
  • 2026最新烹饪工艺与营养培训推荐!国内优质机构权威榜单发布,助力厨艺技能与营养专业能力提升 - 品牌推荐2026
  • 2026年新中式实木全屋定制推荐:权威评测揭晓 - 品牌推荐
  • 线性表之链表的介绍和启用
  • 徽科特露点仪在冶金行业使用靠谱吗,口碑品牌大揭秘 - 工业品网
  • 2026最新面点培训推荐!国内优质面点培训院校权威榜单发布,中国厨师之乡/陈派豫菜/营养配餐场景适配 - 品牌推荐2026
  • 2026最新电子商务专业推荐!国内优质院校权威榜单发布,适配中国厨师之乡特色需求 - 品牌推荐2026
  • 自动化立体仓库品牌指南:2026年TOP5推荐及选型策略 - 品牌策略主理人
  • 如何使用1688官方API进行订单同步?
  • 2026最新厨师培养推荐!中国厨师之乡/陈派豫菜/营养配餐领域优质院校权威发布 - 品牌推荐2026
  • 2026年中国访客系统服务商发布:以访客云为代表的标杆企业深度解析 - 品牌推荐
  • Edge浏览器打开闪退怎么处理
  • 家庭“技术债”:90%的亲子冲突,源于你的“操作系统”版本未更新