user.ts 1.6 KB

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