auth.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import { defineStore } from 'pinia';
  2. import { ref } from 'vue';
  3. import { getToken, setToken, removeToken } from '@/utils/auth';
  4. import { useClientRequest } from '@/utils/request';
  5. import { useUserStore } from '@/store/modules/user';
  6. export interface LoginForm {
  7. username: string;
  8. password: string;
  9. code?: string;
  10. uuid?: string;
  11. rememberMe?: boolean;
  12. }
  13. export interface UserInfo {
  14. id: string;
  15. username: string;
  16. nickname: string;
  17. email?: string;
  18. phone?: string;
  19. avatar?: string;
  20. roles: string[];
  21. permissions: string[];
  22. }
  23. export interface LoginResponse {
  24. code: number;
  25. msg: string;
  26. token: string;
  27. user: UserInfo;
  28. }
  29. export const useAuthStore = defineStore('auth', () => {
  30. const token = ref<string>(getToken() || '');
  31. const isLoggedIn = ref<boolean>(!!getToken());
  32. const loading = ref<boolean>(false);
  33. const loginError = ref<string>('');
  34. /**
  35. * 用户登录
  36. */
  37. const login = async (loginForm: LoginForm): Promise<boolean> => {
  38. try {
  39. loading.value = true;
  40. loginError.value = '';
  41. const response = await useClientRequest.post('/auth/login', loginForm) as LoginResponse;
  42. if (response.code === 200) {
  43. token.value = response.token;
  44. isLoggedIn.value = true;
  45. setToken(response.token);
  46. // 存储用户信息到用户store
  47. const userStore = useUserStore();
  48. userStore.setUserInfo(response.user);
  49. return true;
  50. } else {
  51. loginError.value = response.msg || '登录失败';
  52. return false;
  53. }
  54. } catch (error: any) {
  55. console.error('Login error:', error);
  56. loginError.value = error.message || '网络错误,请稍后重试';
  57. return false;
  58. } finally {
  59. loading.value = false;
  60. }
  61. };
  62. /**
  63. * 用户登出
  64. */
  65. const logout = async (): Promise<void> => {
  66. try {
  67. console.log('>>>>>>>');
  68. // 调用登出接口
  69. await useClientRequest.post('/auth/logout');
  70. } catch (error) {
  71. console.error('Logout error:', error);
  72. } finally {
  73. // 清除本地数据
  74. token.value = '';
  75. isLoggedIn.value = false;
  76. removeToken();
  77. // 清除用户信息
  78. const userStore = useUserStore();
  79. userStore.clearUserInfo();
  80. }
  81. };
  82. /**
  83. * 检查token有效性
  84. */
  85. const checkToken = async (): Promise<boolean> => {
  86. if (!token.value) {
  87. isLoggedIn.value = false;
  88. return false;
  89. }
  90. try {
  91. const response = await useClientRequest.get('/auth/check') as any;
  92. if (response.code === 200) {
  93. isLoggedIn.value = true;
  94. return true;
  95. } else {
  96. logout();
  97. return false;
  98. }
  99. } catch (error) {
  100. console.error('Token check error:', error);
  101. logout();
  102. return false;
  103. }
  104. };
  105. /**
  106. * 刷新token
  107. */
  108. const refreshToken = async (): Promise<boolean> => {
  109. try {
  110. const response = await useClientRequest.post('/auth/refresh') as any;
  111. if (response.code === 200) {
  112. token.value = response.token;
  113. setToken(response.token);
  114. return true;
  115. }
  116. return false;
  117. } catch (error) {
  118. console.error('Refresh token error:', error);
  119. return false;
  120. }
  121. };
  122. return {
  123. // 状态
  124. token,
  125. isLoggedIn,
  126. loading,
  127. loginError,
  128. // 方法
  129. login,
  130. logout,
  131. checkToken,
  132. refreshToken
  133. };
  134. });