user.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { store } from '@/store'
  2. import { defineStore } from 'pinia'
  3. import { getAccessToken, removeToken } from '@/utils/auth'
  4. import { CACHE_KEY, useCache, deleteUserCache } from '@/hooks/web/useCache'
  5. import { getInfo, loginOut } from '@/api/login'
  6. const { wsCache } = useCache()
  7. interface UserVO {
  8. id: number
  9. avatar: string
  10. nickname: string
  11. deptId: number
  12. }
  13. interface UserInfoVO {
  14. // USER 缓存
  15. permissions: Set<string>
  16. roles: string[]
  17. isSetUser: boolean
  18. user: UserVO
  19. }
  20. export const useUserStore = defineStore('admin-user', {
  21. state: (): UserInfoVO => ({
  22. permissions: new Set<string>(),
  23. roles: [],
  24. isSetUser: false,
  25. user: {
  26. id: 0,
  27. avatar: '',
  28. nickname: '',
  29. deptId: 0
  30. }
  31. }),
  32. getters: {
  33. getPermissions(): Set<string> {
  34. return this.permissions
  35. },
  36. getRoles(): string[] {
  37. return this.roles
  38. },
  39. getIsSetUser(): boolean {
  40. return this.isSetUser
  41. },
  42. getUser(): UserVO {
  43. return this.user
  44. }
  45. },
  46. actions: {
  47. async setUserInfoAction() {
  48. if (!getAccessToken()) {
  49. this.resetState()
  50. return null
  51. }
  52. let userInfo = wsCache.get(CACHE_KEY.USER)
  53. if (!userInfo) {
  54. userInfo = await getInfo()
  55. } else {
  56. // 特殊:在有缓存的情况下,进行加载。但是即使加载失败,也不影响后续的操作,保证可以进入系统
  57. try {
  58. userInfo = await getInfo()
  59. } catch (error) {}
  60. }
  61. this.permissions = new Set(userInfo.permissions)
  62. this.roles = userInfo.roles
  63. this.user = userInfo.user
  64. this.isSetUser = true
  65. wsCache.set(CACHE_KEY.USER, userInfo)
  66. wsCache.set(CACHE_KEY.ROLE_ROUTERS, userInfo.menus)
  67. },
  68. async setUserAvatarAction(avatar: string) {
  69. const userInfo = wsCache.get(CACHE_KEY.USER)
  70. // NOTE: 是否需要像`setUserInfoAction`一样判断`userInfo != null`
  71. this.user.avatar = avatar
  72. userInfo.user.avatar = avatar
  73. wsCache.set(CACHE_KEY.USER, userInfo)
  74. },
  75. async setUserNicknameAction(nickname: string) {
  76. const userInfo = wsCache.get(CACHE_KEY.USER)
  77. // NOTE: 是否需要像`setUserInfoAction`一样判断`userInfo != null`
  78. this.user.nickname = nickname
  79. userInfo.user.nickname = nickname
  80. wsCache.set(CACHE_KEY.USER, userInfo)
  81. },
  82. async loginOut() {
  83. await loginOut()
  84. removeToken()
  85. deleteUserCache() // 删除用户缓存
  86. this.resetState()
  87. },
  88. resetState() {
  89. this.permissions = new Set<string>()
  90. this.roles = []
  91. this.isSetUser = false
  92. this.user = {
  93. id: 0,
  94. avatar: '',
  95. nickname: '',
  96. deptId: 0
  97. }
  98. }
  99. }
  100. })
  101. export const useUserStoreWithOut = () => {
  102. return useUserStore(store)
  103. }