user.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import type { IUserInfoVo } from '@/api/types/login'
  2. import { defineStore } from 'pinia'
  3. import { ref } from 'vue'
  4. import {
  5. getUserInfo as _getUserInfo,
  6. login as _login,
  7. logout as _logout,
  8. wxLogin as _wxLogin,
  9. getWxCode,
  10. } from '@/api/login'
  11. import { toast } from '@/utils/toast'
  12. // 初始化状态
  13. const userInfoState: IUserInfoVo = {
  14. id: 0,
  15. username: '',
  16. avatar: '/static/images/default-avatar.png',
  17. token: '',
  18. }
  19. export const useUserStore = defineStore(
  20. 'user',
  21. () => {
  22. // 定义用户信息
  23. const userInfo = ref<IUserInfoVo>({ ...userInfoState })
  24. // 设置用户信息
  25. const setUserInfo = (val: IUserInfoVo) => {
  26. console.log('设置用户信息', val)
  27. // 若头像为空 则使用默认头像
  28. if (!val.avatar) {
  29. val.avatar = userInfoState.avatar
  30. }
  31. else {
  32. val.avatar = 'https://oss.laf.run/ukw0y1-site/avatar.jpg?feige'
  33. }
  34. userInfo.value = val
  35. }
  36. const setUserAvatar = (avatar: string) => {
  37. userInfo.value.avatar = avatar
  38. console.log('设置用户头像', avatar)
  39. console.log('userInfo', userInfo.value)
  40. }
  41. // 删除用户信息
  42. const removeUserInfo = () => {
  43. userInfo.value = { ...userInfoState }
  44. uni.removeStorageSync('userInfo')
  45. uni.removeStorageSync('token')
  46. }
  47. /**
  48. * 获取用户信息
  49. */
  50. const getUserInfo = async () => {
  51. const res = await _getUserInfo()
  52. const userInfo = res.data
  53. setUserInfo(userInfo)
  54. uni.setStorageSync('userInfo', userInfo)
  55. uni.setStorageSync('token', userInfo.token)
  56. // TODO 这里可以增加获取用户路由的方法 根据用户的角色动态生成路由
  57. return res
  58. }
  59. /**
  60. * 用户登录
  61. * @param credentials 登录参数
  62. * @returns R<IUserLogin>
  63. */
  64. const login = async (credentials: {
  65. username: string
  66. password: string
  67. code: string
  68. uuid: string
  69. }) => {
  70. const res = await _login(credentials)
  71. console.log('登录信息', res)
  72. toast.success('登录成功')
  73. await getUserInfo()
  74. return res
  75. }
  76. /**
  77. * 退出登录 并 删除用户信息
  78. */
  79. const logout = async () => {
  80. _logout()
  81. removeUserInfo()
  82. }
  83. /**
  84. * 微信登录
  85. */
  86. const wxLogin = async () => {
  87. // 获取微信小程序登录的code
  88. const data = await getWxCode()
  89. console.log('微信登录code', data)
  90. const res = await _wxLogin(data)
  91. await getUserInfo()
  92. return res
  93. }
  94. return {
  95. userInfo,
  96. login,
  97. wxLogin,
  98. getUserInfo,
  99. setUserAvatar,
  100. logout,
  101. }
  102. },
  103. {
  104. persist: true,
  105. },
  106. )