user.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. uni.setStorageSync('token', loginData.token);
  37. if (loginData) {
  38. const { token: newToken, ...userData } = loginData
  39. if (newToken) {
  40. token.value = newToken
  41. uni.setStorageSync('token', newToken)
  42. }
  43. userInfo.value = userData
  44. // uni.setStorageSync('userInfo', userData)
  45. return loginData
  46. } else {
  47. throw new Error('登录失败:未获取到数据')
  48. }
  49. } catch (error) {
  50. token.value = null
  51. userInfo.value = null
  52. uni.removeStorageSync('token')
  53. uni.removeStorageSync('userInfo')
  54. throw error
  55. } finally {
  56. isLogging.value = false
  57. }
  58. }
  59. const getTokenSafe = async () => {
  60. if (token.value) {
  61. return token.value
  62. }
  63. try {
  64. const result = await login()
  65. return result.token || token.value
  66. } catch (error) {
  67. console.error('自动登录失败', error)
  68. throw error
  69. }
  70. }
  71. return {
  72. token,
  73. userInfo,
  74. isLogging,
  75. login,
  76. getTokenSafe
  77. }
  78. })