user.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { defineStore } from 'pinia'
  2. import { useVisitedRowState } from './visitedRow'
  3. import dayjs from 'dayjs'
  4. interface UserInfo {
  5. uname: string
  6. first_name: string
  7. last_name: string
  8. user_type: string
  9. email: string
  10. expire_day: number
  11. date_format: string
  12. numbers_format: string
  13. PASSWORD_CHANGE_CYCLE: number // 密码修改周期(多少天需要改一次)
  14. last_pwd_change: string // 上次密码修改时间
  15. }
  16. interface UserState {
  17. userInfo: UserInfo
  18. isFirstLogin: boolean
  19. }
  20. /**
  21. * 根据用户地区判断日期格式
  22. * @returns {string} - 返回日期格式
  23. */
  24. const getDateFormat = () => {
  25. const userLanguage = navigator.language || 'en-US' // 获取浏览器的语言设置
  26. // 判断用户地区
  27. if (userLanguage === 'en-US') {
  28. return 'MM/DD/YYYY' // 美国使用 MM/DD/YYYY 格式
  29. } else if (
  30. userLanguage.startsWith('de') ||
  31. userLanguage.startsWith('fr') ||
  32. userLanguage.startsWith('it') ||
  33. userLanguage.startsWith('es') ||
  34. userLanguage.startsWith('pl') ||
  35. userLanguage.startsWith('nl') ||
  36. userLanguage.startsWith('pt') ||
  37. userLanguage.startsWith('se')
  38. ) {
  39. return 'DD/MM/YYYY' // 其他欧洲国家(例:德语、法语、西班牙语等)使用 DD/MM/YYYY 格式
  40. } else if (['zh-CN', 'ja-JP', 'ko-KR'].includes(userLanguage)) {
  41. return 'YYYY-MM-DD' // 东亚国家(如简体中文、日语、韩语)使用 YYYY-MM-DD 格式
  42. } else {
  43. return 'DD/MM/YYYY' // 其他地区默认 DD/MM/YYYY 格式
  44. }
  45. }
  46. export const useUserStore = defineStore('user', {
  47. state: (): UserState => ({
  48. userInfo: JSON.parse(localStorage.getItem('userInfo') || '{}'),
  49. isFirstLogin: localStorage.getItem('isFirstLogin')
  50. ? JSON.parse(localStorage.getItem('isFirstLogin'))
  51. : false
  52. }),
  53. getters: {
  54. userName(state) {
  55. if (state.userInfo.first_name && state.userInfo.last_name) {
  56. return `${state.userInfo.first_name} ${state.userInfo.last_name}`
  57. } else {
  58. return state.userInfo.uname || ''
  59. }
  60. },
  61. dateFormat(state) {
  62. return state.userInfo.date_format || getDateFormat()
  63. },
  64. expireDay(state) {
  65. const userInfo = state.userInfo
  66. return userInfo.PASSWORD_CHANGE_CYCLE - dayjs().diff(dayjs(userInfo.last_pwd_change), 'day')
  67. }
  68. },
  69. actions: {
  70. setUserInfo(userInfo: any, isFirstLogin?: boolean) {
  71. this.userInfo = userInfo
  72. localStorage.setItem('userInfo', JSON.stringify(userInfo))
  73. if (isFirstLogin !== undefined) {
  74. localStorage.setItem('isFirstLogin', JSON.stringify(isFirstLogin))
  75. this.isFirstLogin = isFirstLogin
  76. }
  77. },
  78. async logout(isNeedLogout: boolean = true) {
  79. if (isNeedLogout) {
  80. await $api.logout().then(() => {})
  81. }
  82. localStorage.removeItem('userInfo')
  83. this.userInfo = {}
  84. if (localStorage.getItem('isFirstLogin')) {
  85. localStorage.removeItem('isFirstLogin')
  86. }
  87. this.isFirstLogin = false
  88. useVisitedRowState().clearVisitedRow()
  89. }
  90. }
  91. })