user.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. is_desensitization_kln?: string // Mask Customer Information
  18. kam_customers_name: Array<{ kam_customers_name: string }>
  19. }
  20. interface CustomerInfo {
  21. name: string
  22. isShowMapping: boolean
  23. }
  24. interface UserState {
  25. userInfo: UserInfo
  26. isFirstLogin: boolean
  27. originalUName: string
  28. customerInfo: CustomerInfo
  29. }
  30. /**
  31. * 根据用户地区判断日期格式
  32. * @returns {string} - 返回日期格式
  33. */
  34. const getDateFormat = () => {
  35. const userLanguage = navigator.language || 'en-US' // 获取浏览器的语言设置
  36. // 判断用户地区
  37. if (userLanguage === 'en-US') {
  38. return 'MM/DD/YYYY' // 美国使用 MM/DD/YYYY 格式
  39. } else if (
  40. userLanguage.startsWith('de') ||
  41. userLanguage.startsWith('fr') ||
  42. userLanguage.startsWith('it') ||
  43. userLanguage.startsWith('es') ||
  44. userLanguage.startsWith('pl') ||
  45. userLanguage.startsWith('nl') ||
  46. userLanguage.startsWith('pt') ||
  47. userLanguage.startsWith('se')
  48. ) {
  49. return 'DD/MM/YYYY' // 其他欧洲国家(例:德语、法语、西班牙语等)使用 DD/MM/YYYY 格式
  50. } else if (['zh-CN', 'ja-JP', 'ko-KR'].includes(userLanguage)) {
  51. return 'YYYY-MM-DD' // 东亚国家(如简体中文、日语、韩语)使用 YYYY-MM-DD 格式
  52. } else {
  53. return 'DD/MM/YYYY' // 其他地区默认 DD/MM/YYYY 格式
  54. }
  55. }
  56. export const useUserStore = defineStore('user', {
  57. state: (): UserState => ({
  58. userInfo: JSON.parse(localStorage.getItem('userInfo') || '{}'),
  59. isFirstLogin: localStorage.getItem('isFirstLogin')
  60. ? JSON.parse(localStorage.getItem('isFirstLogin'))
  61. : false,
  62. originalUName: localStorage.getItem('originalUName') || JSON.parse(localStorage.getItem('userInfo') || '{}')?.uname || '',
  63. customerInfo: JSON.parse(localStorage.getItem('customerInfo') || '{"name": "", "isShowMapping": false}')
  64. }),
  65. getters: {
  66. userName(state) {
  67. if (state.userInfo.first_name && state.userInfo.last_name) {
  68. return `${state.userInfo.first_name} ${state.userInfo.last_name}`
  69. } else {
  70. return state.userInfo.uname || ''
  71. }
  72. },
  73. isShowMapping(state) {
  74. return state.customerInfo.isShowMapping
  75. },
  76. dateFormat(state) {
  77. return state.userInfo.date_format || getDateFormat()
  78. },
  79. expireDay(state) {
  80. const userInfo = state.userInfo
  81. return userInfo.PASSWORD_CHANGE_CYCLE - dayjs().diff(dayjs(userInfo.last_pwd_change), 'day')
  82. },
  83. isLogin(state) {
  84. return !(!state.userInfo?.uname || (state.userInfo?.uname && state.isFirstLogin === true))
  85. }
  86. },
  87. actions: {
  88. // isFirstLogin字段是
  89. /**
  90. *
  91. * @param userInfo
  92. * @param isFromMapping 用来判断是否从映射的时候获取的用户信息
  93. * @param isFirstLogin 用来判断是不是该用户第一次使用,如果是第一次使用,那么需要跳转到修改密码页面修改密码之后才能继续使用系统
  94. */
  95. setUserInfo(userInfo: any, isFromMapping?: boolean, isFirstLogin?: boolean) {
  96. this.userInfo = userInfo
  97. localStorage.setItem('userInfo', JSON.stringify(userInfo))
  98. if (!isFromMapping) {
  99. this.originalUName = userInfo.uname
  100. localStorage.setItem('originalUName', userInfo.uname)
  101. }
  102. if (isFirstLogin !== undefined) {
  103. localStorage.setItem('isFirstLogin', JSON.stringify(isFirstLogin))
  104. this.isFirstLogin = isFirstLogin
  105. }
  106. },
  107. setCustomerInfo(customerInfo: CustomerInfo) {
  108. this.customerInfo = customerInfo
  109. localStorage.setItem('customerInfo', JSON.stringify(customerInfo))
  110. },
  111. async logout(isNeedLogout: boolean = true) {
  112. if (isNeedLogout) {
  113. await $api.logout().then(() => { })
  114. }
  115. localStorage.removeItem('userInfo')
  116. localStorage.removeItem('originalUName')
  117. localStorage.removeItem('customerInfo')
  118. this.originalUName = ''
  119. this.customerInfo = { name: '', isShowMapping: false }
  120. this.userInfo = {}
  121. if (localStorage.getItem('isFirstLogin')) {
  122. localStorage.removeItem('isFirstLogin')
  123. }
  124. this.isFirstLogin = false
  125. useVisitedRowState().clearVisitedRow()
  126. useNotificationMessage().clearData()
  127. }
  128. }
  129. })