auth.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // 工人端认证状态管理
  2. import { defineStore } from 'pinia';
  3. import { ref, computed } from 'vue';
  4. import type { User } from '@smartcut/types';
  5. import { AuthApi, createApiClient } from '@smartcut/api-client';
  6. import {
  7. STORAGE_KEYS,
  8. setSessionStorage,
  9. getSessionStorage,
  10. removeSessionStorage
  11. } from '@smartcut/shared-utils';
  12. import { getApiBaseUrl } from '@/apiConfig';
  13. export const useAuthStore = defineStore('auth', () => {
  14. const token = ref<string | null>(getSessionStorage<string>(STORAGE_KEYS.WORKER_TOKEN));
  15. const user = ref<User | null>(getSessionStorage<User>(STORAGE_KEYS.WORKER_USER));
  16. const currentFactoryId = ref<string | null>(
  17. getSessionStorage<string>(STORAGE_KEYS.CURRENT_FACTORY_ID)
  18. );
  19. const isLoggedIn = computed(() => !!token.value && !!user.value && !!currentFactoryId.value);
  20. const apiClient = createApiClient({
  21. baseURL: getApiBaseUrl(),
  22. tokenKey: STORAGE_KEYS.WORKER_TOKEN
  23. });
  24. const authApi = new AuthApi(apiClient);
  25. async function login(username: string, password: string, factoryId: string) {
  26. try {
  27. const response = await authApi.login({
  28. username,
  29. password,
  30. factory_id: factoryId
  31. });
  32. token.value = response.token;
  33. user.value = response.user as User;
  34. currentFactoryId.value = factoryId;
  35. setSessionStorage(STORAGE_KEYS.WORKER_TOKEN, response.token);
  36. setSessionStorage(STORAGE_KEYS.WORKER_USER, response.user);
  37. setSessionStorage(STORAGE_KEYS.CURRENT_FACTORY_ID, factoryId);
  38. return response;
  39. } catch (error) {
  40. console.error('登录失败:', error);
  41. throw error;
  42. }
  43. }
  44. async function loginByPhone(phone: string, password: string, factoryId: string) {
  45. try {
  46. const response = await authApi.login({
  47. phone,
  48. password,
  49. factory_id: factoryId
  50. });
  51. token.value = response.token;
  52. user.value = response.user as User;
  53. currentFactoryId.value = factoryId;
  54. setSessionStorage(STORAGE_KEYS.WORKER_TOKEN, response.token);
  55. setSessionStorage(STORAGE_KEYS.WORKER_USER, response.user);
  56. setSessionStorage(STORAGE_KEYS.CURRENT_FACTORY_ID, factoryId);
  57. return response;
  58. } catch (error) {
  59. console.error('登录失败:', error);
  60. throw error;
  61. }
  62. }
  63. async function logout() {
  64. // P1: best-effort 调后端撤销 jti,失败不阻塞本地登出
  65. try {
  66. await authApi.logout();
  67. } catch (e) { /* 忽略 */ }
  68. token.value = null;
  69. user.value = null;
  70. // 保留 currentFactoryId,便于重新登录同一工厂
  71. removeSessionStorage(STORAGE_KEYS.WORKER_TOKEN);
  72. removeSessionStorage(STORAGE_KEYS.WORKER_USER);
  73. }
  74. async function fetchProfile() {
  75. if (!token.value || !currentFactoryId.value) return;
  76. try {
  77. const profile = await authApi.getProfile();
  78. user.value = profile as User;
  79. setSessionStorage(STORAGE_KEYS.WORKER_USER, profile);
  80. } catch (error) {
  81. console.error('获取用户信息失败:', error);
  82. logout();
  83. }
  84. }
  85. async function changePassword(oldPassword: string, newPassword: string) {
  86. try {
  87. await authApi.changePassword({
  88. old_password: oldPassword,
  89. new_password: newPassword
  90. });
  91. if (user.value) {
  92. user.value.must_change_password = false;
  93. setSessionStorage(STORAGE_KEYS.WORKER_USER, user.value);
  94. }
  95. } catch (error) {
  96. console.error('修改密码失败:', error);
  97. throw error;
  98. }
  99. }
  100. function setFactoryIdFromQuery(factoryId: string) {
  101. currentFactoryId.value = factoryId;
  102. setSessionStorage(STORAGE_KEYS.CURRENT_FACTORY_ID, factoryId);
  103. }
  104. return {
  105. token,
  106. user,
  107. currentFactoryId,
  108. isLoggedIn,
  109. login,
  110. loginByPhone,
  111. logout,
  112. fetchProfile,
  113. changePassword,
  114. setFactoryIdFromQuery
  115. };
  116. });