useUserStore.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import {computed, readonly, watchEffect} from "vue";
  2. import {createEventHook, createGlobalState, useLocalStorage} from "@vueuse/core";
  3. import mxConst from "@/common/mxConst";
  4. import mxConfig from "@/common/mxConfig";
  5. import {getInfo, login, logout, logoutPhysical} from "@/api/login";
  6. import {useCacheStore} from "@/hooks/useCacheStore";
  7. import {mobile} from "@/uni_modules/uv-ui-tools/libs/function/test";
  8. import defaultAvatar from "@/static/personal/avatar_default.png";
  9. export const useUserStore = createGlobalState(() => {
  10. // user data
  11. const token = useLocalStorage(mxConst.keyToken, "")
  12. const data = useLocalStorage(mxConst.keyUserInfo, {})
  13. const appConfig = useLocalStorage(mxConst.keyAppConfig, {})
  14. const agreeProtocolUserName = useLocalStorage(mxConst.keyUserAgreed, "")
  15. const userInfoUpdate = createEventHook()
  16. // computed
  17. const isLogin = computed(() => !!token.value)
  18. const isBind = computed(() => data.value.isBind == 1) // 表示卡登陆/关联,但手机信息不一定完善了
  19. const isMobileBind = computed(() => isBind.value || mobile(data.value.phonenumber)) // 手机信息已完善情况
  20. const isCardBind = computed(() => isBind.value || !isMobileBind.value) // 手机信息未完善情况
  21. const isScoreLocked = computed(() => data.value.scoreLock == mxConst.enum.scoreLock.locked)
  22. const isScoreUnlocked = computed(() => data.value.scoreLock == mxConst.enum.scoreLock.unlock)
  23. const isScoreLocking = computed(() => data.value.scoreLock == mxConst.enum.scoreLock.locking)
  24. const isCultural = computed(() => data.value.examType == mxConst.keyCulturalExamType)
  25. const enableAuthModify = computed(() => data.value.enableAuthModify)
  26. const period = computed(() => data.value.period) // 只是为了妆容旧结构,理论上这个值已经没有用了
  27. // 同意协议需要严格判定,必须和当前用户挂钩
  28. const isAgreeProtocol = computed(() => data.value.userName == agreeProtocolUserName.value)
  29. // isK9Sensitive 是旧的store.getters上的属性,继续保留
  30. const isK9Sensitive = computed(() => data.value.isK9Sensitive)
  31. const avatar = computed(() => data.value.avatar || defaultAvatar)
  32. // hooks
  33. watchEffect(() => mergeAppConfig())
  34. // methods
  35. function mergeAppConfig() {
  36. const overrideConfig = appConfig.value;
  37. const mergedConfig = uni.$uv.deepMerge(mxConfig, overrideConfig);
  38. Object.assign(mxConfig, mergedConfig);
  39. console.log("merge app config: to mx config", overrideConfig, mxConfig);
  40. }
  41. const Login = async function (data) {
  42. const loginRes = await login(data);
  43. token.value = loginRes.token;
  44. const infoRes = await GetInfo();
  45. agreeProtocolUserName.value = infoRes.data.userName;
  46. };
  47. const SyncToken = async function (val) {
  48. // 注册时,注册接口会返回token
  49. token.value = val
  50. const infoRes = await GetInfo()
  51. agreeProtocolUserName.value = infoRes.data.userName
  52. }
  53. const GetInfo = async function () {
  54. const infoRes = await getInfo()
  55. data.value = infoRes.data
  56. appConfig.value = infoRes[mxConst.propAppConfig]
  57. // 每次重新登陆,主动清空所有缓存
  58. const {clearCache} = useCacheStore()
  59. clearCache()
  60. await userInfoUpdate.trigger()
  61. return infoRes
  62. };
  63. const Logout = async function () {
  64. await logout()
  65. token.value = ""
  66. data.value = Object.create(null)
  67. };
  68. const LogoutPhysical = async function () {
  69. await logoutPhysical()
  70. token.value = ""
  71. data.value = Object.create(null)
  72. };
  73. const clearToken = function () {
  74. token.value = ''
  75. data.value = Object.create(null)
  76. }
  77. return {
  78. token: readonly(token),
  79. currentUser: data,
  80. appConfig: appConfig,
  81. isLogin,
  82. isBind,
  83. isMobileBind,
  84. isCardBind,
  85. isScoreLocked,
  86. isScoreUnlocked,
  87. isScoreLocking,
  88. isCultural,
  89. enableAuthModify,
  90. period,
  91. isAgreeProtocol,
  92. isK9Sensitive,
  93. avatar,
  94. Login,
  95. SyncToken,
  96. GetInfo,
  97. Logout,
  98. LogoutPhysical,
  99. clearToken,
  100. onUserInfoUpdate: userInfoUpdate.on
  101. };
  102. });