user.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import {
  2. login as _login,
  3. getUserInfo as _getUserInfo,
  4. wxLogin as _wxLogin,
  5. logout as _logout,
  6. getWxCode,
  7. } from '@/api/login'
  8. import { defineStore } from 'pinia'
  9. import { ref } from 'vue'
  10. import { toast } from '@/utils/toast'
  11. import { IUserInfoVo } from '@/api/login.typings'
  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. } else {
  31. val.avatar = 'https://oss.laf.run/ukw0y1-site/avatar.jpg?feige'
  32. }
  33. userInfo.value = val
  34. }
  35. // 删除用户信息
  36. const removeUserInfo = () => {
  37. userInfo.value = { ...userInfoState }
  38. uni.removeStorageSync('userInfo')
  39. uni.removeStorageSync('token')
  40. }
  41. /**
  42. * 用户登录
  43. * @param credentials 登录参数
  44. * @returns R<IUserLogin>
  45. */
  46. const login = async (credentials: {
  47. username: string
  48. password: string
  49. code: string
  50. uuid: string
  51. }) => {
  52. const res = await _login(credentials)
  53. console.log('登录信息', res)
  54. toast.success('登录成功')
  55. getUserInfo()
  56. return res
  57. }
  58. /**
  59. * 获取用户信息
  60. */
  61. const getUserInfo = async () => {
  62. const res = await _getUserInfo()
  63. const userInfo = res.data
  64. setUserInfo(userInfo)
  65. uni.setStorageSync('userInfo', userInfo)
  66. uni.setStorageSync('token', userInfo.token)
  67. // TODO 这里可以增加获取用户路由的方法 根据用户的角色动态生成路由
  68. return res
  69. }
  70. /**
  71. * 退出登录 并 删除用户信息
  72. */
  73. const logout = async () => {
  74. _logout()
  75. removeUserInfo()
  76. }
  77. /**
  78. * 微信登录
  79. */
  80. const wxLogin = async () => {
  81. // 获取微信小程序登录的code
  82. const data = await getWxCode()
  83. console.log('微信登录code', data)
  84. const res = await _wxLogin(data)
  85. getUserInfo()
  86. return res
  87. }
  88. return {
  89. userInfo,
  90. login,
  91. wxLogin,
  92. getUserInfo,
  93. logout,
  94. }
  95. },
  96. {
  97. persist: true,
  98. },
  99. )