user.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import { defineStore } from 'pinia'
  2. import { getWXLoginCode } from '@/lib/wechatService'
  3. import { checkBlacklistApi, getTokenBySmsApi, getUserInfoByCodeApi } from '@/services/modules/login'
  4. import type {
  5. CheckBlacklistRequest,
  6. LoginActionResult,
  7. LoginRequest,
  8. } from '@/services/modules/login/type'
  9. import type { UserInfoItem } from '@/services/modules/login/userInfo'
  10. import { resetUnauthorizedHandled } from '@/services/request'
  11. import { pinia } from '@/stores/index'
  12. import { uniStorage } from '@/utils/uniStorage'
  13. interface UserState {
  14. access_token?: string
  15. currentUserInfoIndex?: number
  16. userInfoList: UserInfoItem[]
  17. isBlacklisted?: boolean
  18. /**
  19. * 活体验证提醒:本次登录是否已经展示过
  20. * 不持久化,避免变成永久只展示一次
  21. */
  22. hasShownLivenessReminder: boolean
  23. }
  24. export const useUserStore = defineStore('user', {
  25. state: (): UserState => ({
  26. access_token: '',
  27. currentUserInfoIndex: 0,
  28. userInfoList: [],
  29. isBlacklisted: false,
  30. hasShownLivenessReminder: false,
  31. }),
  32. getters: {
  33. isLoggedIn(state): boolean {
  34. return Boolean(state.access_token)
  35. },
  36. hasBlacklistRisk(state): boolean {
  37. return Boolean(state.isBlacklisted)
  38. },
  39. currentUserInfo(state): UserInfoItem | undefined {
  40. const index = state.currentUserInfoIndex
  41. if (index == null) return undefined
  42. return state.userInfoList[index]
  43. },
  44. },
  45. actions: {
  46. // 登录
  47. async login(payload: LoginRequest): Promise<LoginActionResult> {
  48. const res = await getTokenBySmsApi(payload)
  49. if (!res.access_token) {
  50. return {
  51. success: false,
  52. message: res.msg || '登录失败',
  53. }
  54. }
  55. this.access_token = res.access_token
  56. // 登录成功后立即重置,保证本次登录重新具备弹窗资格
  57. this.resetLivenessReminderShown()
  58. resetUnauthorizedHandled()
  59. await this.getUserInfoByCode()
  60. return {
  61. success: true,
  62. }
  63. },
  64. async getUserInfoByCode(): Promise<UserInfoItem | undefined> {
  65. const wxRes = await getWXLoginCode()
  66. if (!wxRes?.code) return undefined
  67. const userInfoResult = await getUserInfoByCodeApi(wxRes.code)
  68. if (userInfoResult.code !== 0 || !userInfoResult.data) {
  69. return undefined
  70. }
  71. const userInfoList = userInfoResult.data.userInfo || []
  72. this.userInfoList = userInfoList
  73. console.log('userInfoList', userInfoList[0])
  74. const index = this.currentUserInfoIndex ?? 0
  75. const currentUserInfo = userInfoList[index]
  76. if (!currentUserInfo) {
  77. return undefined
  78. }
  79. const { phone, idCardNumber } = currentUserInfo
  80. if (phone && idCardNumber) {
  81. this.fetchUserBlacklistStatus({
  82. phoneNumber: phone,
  83. idCardNumber,
  84. })
  85. }
  86. return currentUserInfo
  87. },
  88. async fetchUserBlacklistStatus(payload: CheckBlacklistRequest) {
  89. const res = await checkBlacklistApi(payload)
  90. if (res.code === 0) {
  91. const { idCardNumberStatus, phoneNumberStatus } = res.data
  92. this.isBlacklisted = idCardNumberStatus || phoneNumberStatus
  93. }
  94. },
  95. setCurrentUserInfoIndex(index: number) {
  96. if (this.currentUserInfoIndex === index) return
  97. this.currentUserInfoIndex = index
  98. // 切换身份后,活体状态需要重新判断
  99. this.resetLivenessReminderShown()
  100. },
  101. markLivenessReminderShown() {
  102. this.hasShownLivenessReminder = true
  103. },
  104. resetLivenessReminderShown() {
  105. this.hasShownLivenessReminder = false
  106. },
  107. logout() {
  108. this.$reset()
  109. },
  110. },
  111. persist: {
  112. key: 'user-store',
  113. storage: uniStorage,
  114. pick: ['access_token', 'currentUserInfoIndex', 'userInfoList', 'isBlacklisted'],
  115. },
  116. })
  117. export function useUserStoreWithOut() {
  118. return useUserStore(pinia)
  119. }