import { defineStore } from 'pinia' import { useVisitedRowState } from './visitedRow' import { useNotificationMessage } from './notificationMessage' import dayjs from 'dayjs' interface UserInfo { uname: string first_name: string last_name: string user_type: string email: string employee_email: string expire_day: number date_format: string numbers_format: string PASSWORD_CHANGE_CYCLE: number // 密码修改周期(多少天需要改一次) last_pwd_change: string // 上次密码修改时间 } interface UserState { userInfo: UserInfo isFirstLogin: boolean } /** * 根据用户地区判断日期格式 * @returns {string} - 返回日期格式 */ const getDateFormat = () => { const userLanguage = navigator.language || 'en-US' // 获取浏览器的语言设置 // 判断用户地区 if (userLanguage === 'en-US') { return 'MM/DD/YYYY' // 美国使用 MM/DD/YYYY 格式 } else if ( userLanguage.startsWith('de') || userLanguage.startsWith('fr') || userLanguage.startsWith('it') || userLanguage.startsWith('es') || userLanguage.startsWith('pl') || userLanguage.startsWith('nl') || userLanguage.startsWith('pt') || userLanguage.startsWith('se') ) { return 'DD/MM/YYYY' // 其他欧洲国家(例:德语、法语、西班牙语等)使用 DD/MM/YYYY 格式 } else if (['zh-CN', 'ja-JP', 'ko-KR'].includes(userLanguage)) { return 'YYYY-MM-DD' // 东亚国家(如简体中文、日语、韩语)使用 YYYY-MM-DD 格式 } else { return 'DD/MM/YYYY' // 其他地区默认 DD/MM/YYYY 格式 } } export const useUserStore = defineStore('user', { state: (): UserState => ({ userInfo: JSON.parse(localStorage.getItem('userInfo') || '{}'), isFirstLogin: localStorage.getItem('isFirstLogin') ? JSON.parse(localStorage.getItem('isFirstLogin')) : false }), getters: { userName(state) { if (state.userInfo.first_name && state.userInfo.last_name) { return `${state.userInfo.first_name} ${state.userInfo.last_name}` } else { return state.userInfo.uname || '' } }, dateFormat(state) { return state.userInfo.date_format || getDateFormat() }, expireDay(state) { const userInfo = state.userInfo return userInfo.PASSWORD_CHANGE_CYCLE - dayjs().diff(dayjs(userInfo.last_pwd_change), 'day') }, isLogin(state) { return !(!state.userInfo?.uname || (state.userInfo?.uname && state.isFirstLogin === true)) } }, actions: { setUserInfo(userInfo: any, isFirstLogin?: boolean) { this.userInfo = userInfo localStorage.setItem('userInfo', JSON.stringify(userInfo)) if (isFirstLogin !== undefined) { localStorage.setItem('isFirstLogin', JSON.stringify(isFirstLogin)) this.isFirstLogin = isFirstLogin } }, async logout(isNeedLogout: boolean = true) { if (isNeedLogout) { await $api.logout().then(() => { }) } localStorage.removeItem('userInfo') this.userInfo = {} if (localStorage.getItem('isFirstLogin')) { localStorage.removeItem('isFirstLogin') } this.isFirstLogin = false useVisitedRowState().clearVisitedRow() useNotificationMessage().clearData() } } })