西藏巴青项目

user.js 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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 { joinApiUrl } from '@/config'
  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 isHttp(url) {
  17. return /^https?:\/\//i.test(url || '')
  18. }
  19. function resolveAvatar(path) {
  20. if (!path) {
  21. return ''
  22. }
  23. if (isHttp(path)) {
  24. return path
  25. }
  26. return joinApiUrl(path)
  27. }
  28. function clearSessionState() {
  29. state.token = ''
  30. state.roles = []
  31. state.permissions = []
  32. state.id = ''
  33. state.name = ''
  34. state.nickName = ''
  35. state.avatar = ''
  36. state.phonenumber = ''
  37. removeToken()
  38. }
  39. export function useUserStore() {
  40. const login = (userInfo) => {
  41. const username = (userInfo.username || '').trim()
  42. const password = userInfo.password
  43. const code = userInfo.code
  44. const uuid = userInfo.uuid
  45. return loginApi(username, password, code, uuid).then((res) => {
  46. const token = res.token
  47. setToken(token)
  48. state.token = token
  49. return res
  50. })
  51. }
  52. const fetchUserInfo = () => {
  53. return getInfo().then((res) => {
  54. const user = res.user || {}
  55. const roles = normalizeRoles(res.roles)
  56. if (shouldDenyPartnerLogin(roles)) {
  57. clearSessionState()
  58. logoutApi().catch(() => {})
  59. return Promise.reject(new Error(PARTNER_ROLE_DENIED_MSG))
  60. }
  61. state.roles = roles
  62. state.permissions = res.permissions || []
  63. state.id = user.userId
  64. state.name = user.userName
  65. state.nickName = user.nickName
  66. state.avatar = resolveAvatar(user.avatar)
  67. state.phonenumber = user.phonenumber || ''
  68. return res
  69. })
  70. }
  71. const logOut = () => {
  72. return logoutApi()
  73. .catch(() => {})
  74. .finally(() => {
  75. clearSessionState()
  76. })
  77. }
  78. const fedLogOut = () => {
  79. clearSessionState()
  80. return Promise.resolve()
  81. }
  82. const displayName = () => {
  83. return state.nickName || state.name || ''
  84. }
  85. const isLoggedIn = () => !!state.token && hasPartnerRole(state.roles)
  86. return {
  87. state,
  88. login,
  89. fetchUserInfo,
  90. logOut,
  91. fedLogOut,
  92. displayName,
  93. isLoggedIn
  94. }
  95. }