user.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // stores/user.js
  2. import { defineStore } from 'pinia'
  3. import { ref } from 'vue'
  4. import USER from '@/api/user.js'
  5. export const useUserStore = defineStore('user', () => {
  6. const token = ref(uni.getStorageSync('token') || null)
  7. const userInfo = ref(uni.getStorageSync('userInfo') || null)
  8. const isLogging = ref(false)
  9. const login = async () => {
  10. // if (isLogging.value) {
  11. // throw new Error('登录正在进行中')
  12. // }
  13. isLogging.value = true
  14. try {
  15. let loginData = null
  16. // #ifdef MP-WEIXIN
  17. loginData = await new Promise((resolve, reject) => {
  18. uni.login({
  19. success: async ({ code }) => {
  20. try {
  21. const { data } = await USER.fetchLogin({ code })
  22. resolve(data)
  23. } catch (error) {
  24. reject(error)
  25. }
  26. },
  27. fail: reject
  28. })
  29. })
  30. // #endif
  31. // #ifdef H5
  32. const { data } = await USER.userInfo()
  33. loginData = data
  34. // #endif
  35. uni.setStorageSync('userInfo', loginData);
  36. if (loginData) {
  37. const { token: newToken, ...userData } = loginData
  38. if (newToken) {
  39. token.value = newToken
  40. uni.setStorageSync('token', newToken)
  41. }
  42. userInfo.value = userData
  43. // uni.setStorageSync('userInfo', userData)
  44. return loginData
  45. } else {
  46. throw new Error('登录失败:未获取到数据')
  47. }
  48. } catch (error) {
  49. token.value = null
  50. userInfo.value = null
  51. uni.removeStorageSync('token')
  52. uni.removeStorageSync('userInfo')
  53. throw error
  54. } finally {
  55. isLogging.value = false
  56. }
  57. }
  58. const getTokenSafe = async () => {
  59. if (token.value) {
  60. return token.value
  61. }
  62. try {
  63. const result = await login()
  64. return result.token || token.value
  65. } catch (error) {
  66. console.error('自动登录失败', error)
  67. throw error
  68. }
  69. }
  70. return {
  71. token,
  72. userInfo,
  73. isLogging,
  74. login,
  75. getTokenSafe
  76. }
  77. })