user.ts 3.2 KB

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