user.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { defineStore } from "pinia"
  2. import { store } from "../index"
  3. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  4. import { logout_gym, logout_gyt, logout_klx, getUserInfo_gyt, queryUserInfo_gym, getUserInfo_klx } from "@/api/user.api"
  5. import { removeToken, setToken, setUserType, getUserType, removeUserType, setCODE401 } from "@/libs/auth"
  6. import router, { resetRouter } from "@/router"
  7. import { httpAjax, httpAjaxLoading } from "@/plugin/httpAjax"
  8. import { menus_gym, menus_gyt, menus_klx } from "@/config/menus"
  9. interface userDataType {
  10. appKey: string
  11. data: any
  12. }
  13. interface userType {
  14. userInfo: {
  15. avatar?: string
  16. username?: string
  17. realName?: string
  18. phone?: string
  19. subjectId?: string
  20. isVip?: boolean
  21. }
  22. roles?: rolesType
  23. }
  24. const useStore = defineStore("user", {
  25. state: (): userType => {
  26. return {
  27. userInfo: {}, //用户信息
  28. roles: undefined //用户角色
  29. }
  30. },
  31. actions: {
  32. /** 登录 */
  33. async login({ data, appKey }: userDataType) {
  34. // GYM,GYT,KLX 区分 获取token的区分
  35. const tokenObj = {
  36. GYT: data.access_token,
  37. GYM: data,
  38. KLX: data
  39. }
  40. setToken(tokenObj[appKey as rolesType])
  41. setUserType(appKey)
  42. return Promise.resolve()
  43. },
  44. /** 获取用户信息 */
  45. async getUserInfo(): Promise<menuType[]> {
  46. const userType = getUserType()
  47. if (!userType) {
  48. return Promise.reject({
  49. code: "500",
  50. data: null,
  51. message: "获取用户信息出错!"
  52. })
  53. }
  54. // GYM,GYT,KLX 区分 code验证错误码的区分 管乐团是5000,其他的是403
  55. userType === "GYT" && setCODE401(5000)
  56. // GYM,GYT,KLX 区分 获取用户信息的接口区分
  57. const userInfoApi = {
  58. GYT: getUserInfo_gyt,
  59. GYM: queryUserInfo_gym,
  60. KLX: getUserInfo_klx
  61. }
  62. const userInfoRes = await httpAjaxLoading(userInfoApi[userType])
  63. if (userInfoRes.code !== 200) {
  64. return Promise.reject(userInfoRes)
  65. }
  66. // GYM,GYT,KLX 区分 用户信息数据不一样区分
  67. this.userInfo = handleUserInfo(userType, userInfoRes.data)
  68. this.roles = userType
  69. // GYM,GYT,KLX 区分 区分菜单然后分配路由
  70. const menusObj = {
  71. GYT: menus_gyt,
  72. GYM: menus_gym,
  73. KLX: menus_klx
  74. }
  75. return Promise.resolve(menusObj[userType])
  76. },
  77. /** 退出登录 */
  78. async loginOut() {
  79. // GYM,GYT,KLX 区分 区分退出登录
  80. const logoutApi = {
  81. GYT: logout_gyt,
  82. GYM: logout_gym,
  83. KLX: logout_klx
  84. }
  85. const logoutRes = await httpAjax(logoutApi[this.roles!])
  86. if (logoutRes.code !== 200) {
  87. return Promise.reject(logoutRes)
  88. }
  89. this.resetUser()
  90. return Promise.resolve(logoutRes)
  91. },
  92. /** 清空所有登录信息,退出 */
  93. resetUser() {
  94. this.userInfo = {}
  95. this.roles = undefined
  96. removeToken()
  97. removeUserType()
  98. resetRouter()
  99. router.push({
  100. path: "/login"
  101. })
  102. }
  103. }
  104. })
  105. export default () => {
  106. return useStore(store)
  107. }
  108. function handleUserInfo(userType: rolesType, userInfo: Record<string, any>) {
  109. let avatar, username, realName, phone, subjectId, isVip
  110. if (["GYM", "KLX"].includes(userType)) {
  111. avatar = userInfo.avatar
  112. username = userInfo.username
  113. realName = userInfo.realName
  114. phone = userInfo.phone
  115. subjectId = userInfo.subjectId
  116. isVip = userInfo.userVip ? (userInfo.userVip?.vipType === "NOT_VIP" || !userInfo.userVip?.vipType ? true : false) : false
  117. } else {
  118. avatar = userInfo.avatar
  119. username = userInfo.nickname
  120. realName = userInfo.realName
  121. phone = userInfo.phone
  122. subjectId = userInfo.subjectId
  123. isVip = false
  124. }
  125. return {
  126. avatar,
  127. username,
  128. realName,
  129. phone,
  130. subjectId,
  131. isVip
  132. }
  133. }