user.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /** @format */
  2. import { ref } from 'vue'
  3. import { defineStore } from 'pinia'
  4. import { useCommonStore } from './common'
  5. import { loginApi, logoutApi } from '~/api/model/user'
  6. interface LoginRequestData {
  7. email: string
  8. password: string
  9. type: 'google' | 'email'
  10. }
  11. export const useUserStore = defineStore(
  12. 'user',
  13. () => {
  14. const userInfo = shallowRef<any>()
  15. const token = shallowRef<any>()
  16. const isLogin = computed(() => !!token.value)
  17. const avatar = computed(() => userInfo.value?.avatar)
  18. const nickname = computed(() => userInfo.value?.email)
  19. /** 登录操作 */
  20. const login = async (params: LoginRequestData) => {
  21. try {
  22. const data: any = await loginApi(params)
  23. const { token: userToken, userInfo: userDataInfo } = data
  24. userInfo.value = userDataInfo
  25. token.value = userToken
  26. ElMessage({
  27. message: 'Login success',
  28. type: 'success',
  29. plain: true,
  30. })
  31. const commonStore = useCommonStore()
  32. commonStore.pushAccount({ email: userDataInfo.email, name: userDataInfo.annualPurchaseAmount, type: params.type })
  33. }
  34. catch (error) {
  35. return Promise.reject(error)
  36. }
  37. }
  38. /** 退出登录操作 */
  39. const logout = async () => {
  40. try {
  41. if (token.value) {
  42. await logoutApi()
  43. document.cookie
  44. = 'user=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/'
  45. ElMessage({
  46. message: 'Exit successful',
  47. type: 'success',
  48. plain: true,
  49. })
  50. }
  51. }
  52. finally {
  53. token.value = null
  54. userInfo.value = undefined
  55. const router = useRouter()
  56. router.push('/')
  57. }
  58. }
  59. return { userInfo, token, login, logout, isLogin, avatar, nickname }
  60. },
  61. {
  62. persist: true,
  63. },
  64. )