Skip to content

9.6 状态管理(Pinia) ​

概述

状态管理用 Pinia,modules 七个状态域:user(登录身份)、asyncRoute(动态路由)、tabsView(标签页)、designSetting/projectSetting(界面设置)、lockscreen(锁屏)、ossConfig(存储配置)。本节说明各域职责与关键状态。

Store 模块清单(store/modules/) ​

模块职责关键状态/动作
user.ts登录与身份token(ACCESS_TOKEN)、用户信息、Login/GetInfo/LogOut
asyncRoute.ts动态路由菜单树、generateRoutes、isDynamicAddedRoute
tabsView.ts标签页多标签缓存、visitedTabs、delCachedTab
designSetting.ts设计设置主题色、水印、灰度/色弱模式
projectSetting.ts项目设置布局模式、标签页开关、面包屑等
lockscreen.ts锁屏锁定状态、解锁
ossConfig.ts存储配置OSS 相关配置状态

辅助文件:mutation-types.ts(ACCESS_TOKEN/FIRST_ROUTE 等存储键常量)、index.ts(createPinia)、types.ts、plugins/(持久化插件)。

user 模块(核心) ​

text
状态:
  token       从 storage.get(ACCESS_TOKEN) 恢复(刷新不丢)
  userInfo    getUser 接口数据(头像/名称/permissions…)

动作:
  Login       登录 → data.access_token 存 storage + store
  GetInfo     调 /api/index/getUser → 权限/角色注入
  LogOut      调 /api/logout → 清 token/存储 → 跳登录

关键:登录响应读 data.access_token(下划线字段)

asyncRoute 模块(动态路由) ​

text
generateRoutes(userInfo):
  调 /api/index/getMenus → 菜单树
  → generator-routers 转换为路由记录(component 动态 import)
  → 常量路由 + 动态路由合并 → 返回

isDynamicAddedRoute:守卫判断"是否已注入动态路由"的标志

令牌存储(mutation-types + Storage) ​

text
ACCESS_TOKEN = "ACCESS_TOKEN"    storage 封装(utils/Storage.ts)
登录写入 → 守卫读取 → http 拦截器注入 Authorization
登出/401 清除

使用模式 ​

ts
// 组件内获取状态
const userStore = useUserStore();
const avatar = userStore.userInfo?.avatar;

// 跨组件动作
const { logOut } = useUserStoreWidthOut();   // store 外引用(store/modules 导出)

持久化策略 ​

text
token:localStorage 持久化(刷新不丢)
用户信息/菜单:内存态(刷新重新 GetInfo + generateRoutes)
界面设置:持久化(designSetting/projectSetting 经插件)

排障 ​

症状原因
刷新后回登录页ACCESS_TOKEN 未持久化或被清;查 storage 与守卫
权限按钮不更新GetInfo 缓存旧 permissions;重新登录或刷新用户信息
标签页缓存失效tabsView cachedTabs 与 keep-alive name 不匹配
store 类型报错types.ts 与模块状态不一致;跑 type:check

小蚂蚁云团队 · 提供技术支持