user.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { LoginFormData } from '@/schemas/login';
  2. import { getUserInfoApi, loginApi } from '@/services/apis';
  3. import { Auth } from '@/utils/auth';
  4. import Taro from '@tarojs/taro';
  5. import { create } from 'zustand';
  6. // 用户信息
  7. export interface UserState {
  8. enterpriseId: string;
  9. accountId: string;
  10. userId: string;
  11. userName: string;
  12. avatar: string;
  13. mobile: string;
  14. /** 是否正在加载用户信息 */
  15. loading: boolean;
  16. getUserInfo: () => Promise<void>;
  17. setUserInfo: (userInfo: Partial<UserState>) => void;
  18. logout: () => void;
  19. login: (data: LoginFormData) => Promise<void>;
  20. }
  21. // 创建用户状态管理store
  22. export const useUserStore = create<UserState>((set, get) => ({
  23. enterpriseId: '',
  24. accountId: '',
  25. userId: '',
  26. userName: '',
  27. avatar: '',
  28. mobile: '',
  29. loading: false,
  30. getUserInfo: async () => {
  31. const { mobile } = get();
  32. set({ loading: true });
  33. try {
  34. const info = await getUserInfoApi(mobile);
  35. set({
  36. enterpriseId: (info as any).enterpriseId || '',
  37. accountId: (info as any).accountId || (info as any).enterpriseId || '',
  38. userId: (info as any).userId || '',
  39. userName: (info as any).userName || '',
  40. avatar: (info as any).avatar || '',
  41. loading: false,
  42. });
  43. saveUserToStorage({
  44. enterpriseId: (info as any).enterpriseId,
  45. accountId: (info as any).accountId || (info as any).enterpriseId,
  46. userId: (info as any).userId,
  47. userName: (info as any).userName,
  48. avatar: (info as any).avatar,
  49. });
  50. } catch (error) {
  51. set({ loading: false });
  52. console.error('获取用户信息失败:', error);
  53. throw error;
  54. }
  55. },
  56. setUserInfo: (userInfo) =>
  57. set((state) => ({
  58. ...state,
  59. ...userInfo,
  60. })),
  61. logout: () => {
  62. set({
  63. enterpriseId: '',
  64. accountId: '',
  65. userId: '',
  66. userName: '',
  67. avatar: '',
  68. mobile: '',
  69. loading: false,
  70. });
  71. Auth.clearToken();
  72. Auth.requireAuth();
  73. },
  74. login: async (data) => {
  75. const response = await loginApi(data);
  76. Auth.setToken(response);
  77. // 登录成功后获取用户信息(含 enterpriseId、accountId)
  78. const info = await getUserInfoApi(data.mobile);
  79. console.log('员工信息接口返回:', JSON.stringify(info));
  80. set({
  81. enterpriseId: (info as any).enterpriseId || '',
  82. accountId: (info as any).accountId || (info as any).enterpriseId || '',
  83. userId: (info as any).userId || '',
  84. userName: (info as any).userName || '',
  85. avatar: (info as any).avatar || '',
  86. mobile: data.mobile,
  87. });
  88. saveUserToStorage({
  89. enterpriseId: (info as any).enterpriseId,
  90. accountId: (info as any).accountId || (info as any).enterpriseId,
  91. userId: (info as any).userId,
  92. userName: (info as any).userName,
  93. avatar: (info as any).avatar,
  94. mobile: data.mobile,
  95. });
  96. },
  97. }));
  98. const USER_INFO_KEY = 'userInfo';
  99. // 从本地存储加载用户信息
  100. export const loadUserFromStorage = () => {
  101. try {
  102. const userInfo = Taro.getStorageSync(USER_INFO_KEY);
  103. if (userInfo) {
  104. const parsedUserInfo = JSON.parse(userInfo);
  105. useUserStore.getState().setUserInfo(parsedUserInfo);
  106. }
  107. } catch (error) {
  108. console.error('加载用户信息失败:', error);
  109. }
  110. };
  111. // 保存用户信息到本地存储
  112. export const saveUserToStorage = (userInfo: Partial<UserState>) => {
  113. try {
  114. const currentUserInfo = useUserStore.getState();
  115. const updatedUserInfo = { ...currentUserInfo, ...userInfo };
  116. Taro.setStorageSync(USER_INFO_KEY, JSON.stringify(updatedUserInfo));
  117. } catch (error) {
  118. console.error('保存用户信息失败:', error);
  119. }
  120. };