user.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { defineStore } from 'pinia'
  2. import { ref } from 'vue'
  3. import { getUserInfo as _getUserInfo, login as _login } from '@/api/login'
  4. import { goBack, toPage } from '@/utils/page'
  5. import { toast } from '@/utils/toast'
  6. // 初始化状态
  7. const userInfoState: any = {
  8. avatar: '/static/images/default-avatar.png',
  9. }
  10. export const useUserStore = defineStore(
  11. 'user',
  12. () => {
  13. // 定义用户信息
  14. const userInfo = ref<any>({ ...userInfoState })
  15. const token = ref<string>('')
  16. // 设置用户信息
  17. const setUserInfo = (val: any) => {
  18. console.log('设置用户信息', val)
  19. userInfo.value = val
  20. }
  21. // 删除用户信息
  22. const removeUserInfo = () => {
  23. userInfo.value = { ...userInfoState }
  24. uni.removeStorageSync('userInfo')
  25. uni.removeStorageSync('token')
  26. }
  27. /**
  28. * 获取用户信息
  29. */
  30. const getUserInfo = async () => {
  31. const res = await _getUserInfo()
  32. const userInfo = res.data
  33. setUserInfo(userInfo)
  34. uni.setStorageSync('userInfo', userInfo)
  35. return res
  36. }
  37. /**
  38. * 用户登录
  39. * @param loginData 登录数据
  40. * @param redirectUrl 登录成功后的跳转地址,默认跳转到首页
  41. */
  42. const login = async (loginData: any, redirectUrl?: string) => {
  43. try {
  44. // 显示加载状态
  45. uni.showLoading({
  46. title: 'Logging in...',
  47. mask: true,
  48. })
  49. // 调用登录接口
  50. const res = await _login(loginData)
  51. uni.hideLoading()
  52. // 登录成功,保存 token
  53. if (res.code === '200' && res.data && res.data.token) {
  54. token.value = res.data.token
  55. uni.setStorageSync('token', res.data.token)
  56. // 获取用户信息
  57. await getUserInfo()
  58. }
  59. // 登录成功提示
  60. toast.success('Login successful!')
  61. // 跳转到指定页面或默认首页
  62. setTimeout(() => {
  63. if (redirectUrl) {
  64. // 使用 toPage 方法,自动判断是否为 tabBar 页面
  65. toPage(decodeURIComponent(redirectUrl), {}, true)
  66. }
  67. else {
  68. // 默认跳转到首页
  69. goBack()
  70. }
  71. }, 1500)
  72. return res
  73. }
  74. catch (error) {
  75. uni.hideLoading()
  76. toast.error(error.message || 'Login failed')
  77. throw error
  78. }
  79. }
  80. return {
  81. userInfo,
  82. token,
  83. getUserInfo,
  84. setUserInfo,
  85. removeUserInfo,
  86. login,
  87. }
  88. },
  89. {
  90. persist: true,
  91. },
  92. )