西藏巴青项目

user.js 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { reactive } from 'vue'
  2. import { login as loginApi, logout as logoutApi, getInfo } from '@/api/login'
  3. import { getToken, setToken, removeToken } from '@/utils/auth'
  4. import { resolveResourceUrl } from '@/utils/resourceUrl'
  5. import { hasPartnerRole, normalizeRoles, PARTNER_ROLE_DENIED_MSG, shouldDenyPartnerLogin } from '@/utils/partnerRole'
  6. const state = reactive({
  7. token: getToken(),
  8. id: '',
  9. name: '',
  10. nickName: '',
  11. avatar: '',
  12. phonenumber: '',
  13. roles: [],
  14. permissions: []
  15. })
  16. function resolveAvatar(path) {
  17. return resolveResourceUrl(path)
  18. }
  19. function clearSessionState() {
  20. state.token = ''
  21. state.roles = []
  22. state.permissions = []
  23. state.id = ''
  24. state.name = ''
  25. state.nickName = ''
  26. state.avatar = ''
  27. state.phonenumber = ''
  28. removeToken()
  29. }
  30. export function useUserStore() {
  31. const login = (userInfo) => {
  32. const username = (userInfo.username || '').trim()
  33. const password = userInfo.password
  34. const code = userInfo.code
  35. const uuid = userInfo.uuid
  36. return loginApi(username, password, code, uuid).then((res) => {
  37. const token = res.token
  38. setToken(token)
  39. state.token = token
  40. return res
  41. })
  42. }
  43. const fetchUserInfo = () => {
  44. return getInfo().then((res) => {
  45. const user = res.user || {}
  46. const roles = normalizeRoles(res.roles)
  47. if (shouldDenyPartnerLogin(roles)) {
  48. clearSessionState()
  49. logoutApi().catch(() => {})
  50. return Promise.reject(new Error(PARTNER_ROLE_DENIED_MSG))
  51. }
  52. state.roles = roles
  53. state.permissions = res.permissions || []
  54. state.id = user.userId
  55. state.name = user.userName
  56. state.nickName = user.nickName
  57. state.avatar = resolveAvatar(user.avatar)
  58. state.phonenumber = user.phonenumber || ''
  59. return res
  60. })
  61. }
  62. const logOut = () => {
  63. return logoutApi()
  64. .catch(() => {})
  65. .finally(() => {
  66. clearSessionState()
  67. })
  68. }
  69. const fedLogOut = () => {
  70. clearSessionState()
  71. return Promise.resolve()
  72. }
  73. const displayName = () => {
  74. return state.nickName || state.name || ''
  75. }
  76. const isLoggedIn = () => !!state.token && hasPartnerRole(state.roles)
  77. return {
  78. state,
  79. login,
  80. fetchUserInfo,
  81. logOut,
  82. fedLogOut,
  83. displayName,
  84. isLoggedIn
  85. }
  86. }