authStore.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { create } from 'zustand';
  2. import type { User, LoginForm, LoginResponse } from '@/types';
  3. interface AuthState {
  4. user: User | null;
  5. token: string | null;
  6. isLoggedIn: boolean;
  7. login: (form: LoginForm) => Promise<LoginResponse>;
  8. logout: () => void;
  9. setUser: (user: User) => void;
  10. setToken: (token: string) => void;
  11. setIsLoggedIn: (isLoggedIn: boolean) => void;
  12. }
  13. const mockUsers: Record<string, { password: string; user: User }> = {
  14. 'super_admin': {
  15. password: 'admin123',
  16. user: {
  17. id: 'u1',
  18. username: 'super_admin',
  19. email: 'super@token.com',
  20. phone: '13800000001',
  21. role: 'super_admin',
  22. status: 'enabled',
  23. enterpriseId: '',
  24. departmentId: null,
  25. quota: -1,
  26. usedQuota: 0,
  27. createdAt: '2024-01-01',
  28. updatedAt: '2024-01-01',
  29. },
  30. },
  31. 'platform_operator': {
  32. password: 'operator123',
  33. user: {
  34. id: 'u2',
  35. username: 'platform_operator',
  36. email: 'operator@token.com',
  37. phone: '13800000002',
  38. role: 'platform_operator',
  39. status: 'enabled',
  40. enterpriseId: '',
  41. departmentId: null,
  42. quota: -1,
  43. usedQuota: 0,
  44. createdAt: '2024-01-01',
  45. updatedAt: '2024-01-01',
  46. },
  47. },
  48. 'enterprise_admin': {
  49. password: 'enterprise123',
  50. user: {
  51. id: 'u3',
  52. username: 'enterprise_admin',
  53. email: 'admin@enterprise.com',
  54. phone: '13800000003',
  55. role: 'enterprise_admin',
  56. status: 'enabled',
  57. enterpriseId: 'e1',
  58. departmentId: 'd1',
  59. quota: 1000000,
  60. usedQuota: 250000,
  61. createdAt: '2024-01-01',
  62. updatedAt: '2024-01-01',
  63. },
  64. },
  65. 'employee': {
  66. password: 'employee123',
  67. user: {
  68. id: 'u4',
  69. username: 'employee',
  70. email: 'employee@enterprise.com',
  71. phone: '13800000004',
  72. role: 'employee',
  73. status: 'enabled',
  74. enterpriseId: 'e1',
  75. departmentId: 'd2',
  76. quota: 100000,
  77. usedQuota: 35000,
  78. createdAt: '2024-01-01',
  79. updatedAt: '2024-01-01',
  80. },
  81. },
  82. };
  83. export const useAuthStore = create<AuthState>()((set) => ({
  84. user: null,
  85. token: null,
  86. isLoggedIn: false,
  87. login: async (form: LoginForm) => {
  88. const mockUser = mockUsers[form.username];
  89. if (!mockUser || mockUser.password !== form.password) {
  90. throw new Error('用户名或密码错误');
  91. }
  92. const response: LoginResponse = {
  93. token: `token_${form.username}_${Date.now()}`,
  94. user: mockUser.user,
  95. };
  96. set({ user: mockUser.user, token: response.token, isLoggedIn: true });
  97. localStorage.setItem('token', response.token);
  98. localStorage.setItem('user', JSON.stringify(mockUser.user));
  99. return response;
  100. },
  101. logout: () => {
  102. set({ user: null, token: null, isLoggedIn: false });
  103. localStorage.removeItem('token');
  104. localStorage.removeItem('user');
  105. },
  106. setUser: (user: User) => {
  107. set({ user });
  108. localStorage.setItem('user', JSON.stringify(user));
  109. },
  110. setToken: (token: string) => {
  111. set({ token });
  112. localStorage.setItem('token', token);
  113. },
  114. setIsLoggedIn: (isLoggedIn: boolean) => {
  115. set({ isLoggedIn });
  116. },
  117. }));
  118. export const initAuth = () => {
  119. const token = localStorage.getItem('token');
  120. const userStr = localStorage.getItem('user');
  121. if (token && userStr) {
  122. try {
  123. const user = JSON.parse(userStr) as User;
  124. useAuthStore.getState().setUser(user);
  125. useAuthStore.getState().setToken(token);
  126. useAuthStore.getState().setIsLoggedIn(true);
  127. } catch {
  128. localStorage.removeItem('token');
  129. localStorage.removeItem('user');
  130. }
  131. }
  132. };