user-store.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { defineStore } from 'pinia'
  2. import { ref, computed } from 'vue'
  3. import { getToken, setToken, removeToken } from '@/utils/auth'
  4. import { login, logout, getUserInfo } from '@/api/auth'
  5. import type { LoginData, User } from '@/types/system'
  6. export const useUserStore = defineStore('user', () => {
  7. const token = ref<string | undefined>(getToken())
  8. const userInfo = ref<User | null>(null)
  9. const roles = ref<string[]>([])
  10. const isLoggedIn = computed(() => !!token.value)
  11. async function loginAction(data: LoginData) {
  12. const res = await login(data)
  13. token.value = res.token
  14. setToken(res.token)
  15. return res
  16. }
  17. async function fetchUserInfo() {
  18. const res = await getUserInfo()
  19. userInfo.value = res
  20. roles.value = res.roleIds?.map(String) || []
  21. return res
  22. }
  23. async function logoutAction() {
  24. try {
  25. await logout()
  26. } catch {
  27. // ignore
  28. }
  29. token.value = undefined
  30. userInfo.value = null
  31. roles.value = []
  32. removeToken()
  33. }
  34. return {
  35. token,
  36. userInfo,
  37. roles,
  38. isLoggedIn,
  39. loginAction,
  40. fetchUserInfo,
  41. logoutAction
  42. }
  43. })