storage.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import { currentUser as mockCurrentUser } from '@/data/mock'
  2. const APPLY_KEY = 'aimill_hr_applications'
  3. const DRAFT_KEY = 'aimill_hr_application_drafts'
  4. const APPROVAL_KEY = 'aimill_hr_approval_results'
  5. const TRAINING_KEY = 'aimill_hr_training_progress'
  6. const PROFILE_KEY = 'aimill_hr_profile_changes'
  7. const AUTH_KEY = 'aimill_hr_auth'
  8. const REMEMBER_KEY = 'aimill_hr_remembered_account'
  9. const PASSWORD_MEMO_KEY = 'passwordMemo'
  10. const PASSWORD_INFO_KEY = 'passInfo'
  11. const TOKEN_KEY = 'token'
  12. const USER_INFO_KEY = 'userInfo'
  13. const TREE_KEY = 'treeList'
  14. const AUTHORITIES_KEY = 'authorities'
  15. const CURRENT_USER_KEY = 'currentUser'
  16. const API_INFO_KEY = 'apiInfo'
  17. export const DEMO_ACCOUNT = 'ZY20230128'
  18. export const DEMO_PASSWORD = '123456'
  19. export function saveLoginSession(data, account) {
  20. const userInfo = data && typeof data === 'object' ? data : {}
  21. const token = userInfo.token || `demo-token-${Date.now()}`
  22. const normalizedAccount = String(account || userInfo.loginName || '').trim().toUpperCase()
  23. uni.setStorageSync(TOKEN_KEY, token)
  24. uni.setStorageSync(USER_INFO_KEY, { ...userInfo, token, loginName: normalizedAccount })
  25. uni.setStorageSync(AUTH_KEY, { account: normalizedAccount, loggedInAt: Date.now() })
  26. }
  27. export function login(account, password, remember = true) {
  28. const normalizedAccount = String(account || '').trim().toUpperCase()
  29. if (normalizedAccount !== DEMO_ACCOUNT || String(password) !== DEMO_PASSWORD) {
  30. return false
  31. }
  32. saveLoginSession({
  33. token: `demo-token-${Date.now()}`,
  34. sessionId: 'demo-session',
  35. userId: normalizedAccount,
  36. userName: '陈晓雨',
  37. loginName: normalizedAccount,
  38. }, normalizedAccount)
  39. saveRememberedCredentials({
  40. account: normalizedAccount,
  41. password,
  42. rememberPassword: remember,
  43. })
  44. savePermissionData([], [])
  45. return true
  46. }
  47. export function logout() {
  48. [AUTH_KEY, TOKEN_KEY, USER_INFO_KEY, TREE_KEY, AUTHORITIES_KEY, CURRENT_USER_KEY].forEach((key) =>
  49. uni.removeStorageSync(key),
  50. )
  51. }
  52. export function isLoggedIn() {
  53. return Boolean(uni.getStorageSync(TOKEN_KEY) && uni.getStorageSync(USER_INFO_KEY))
  54. }
  55. // 服务器模式下需要的是真实 token(demo 登录的是 demo-token- 开头,残留时视为无效)
  56. export function hasServerAuth() {
  57. const token = uni.getStorageSync(TOKEN_KEY)
  58. const userInfo = uni.getStorageSync(USER_INFO_KEY)
  59. return Boolean(token && userInfo && !String(token).startsWith('demo-token-'))
  60. }
  61. export function getRememberedAccount() {
  62. return getRememberedCredentials().account
  63. }
  64. export function saveRememberedCredentials({ account, password, rememberPassword }) {
  65. const normalizedAccount = String(account || '').trim()
  66. if (!rememberPassword) {
  67. uni.removeStorageSync(PASSWORD_MEMO_KEY)
  68. uni.removeStorageSync(PASSWORD_INFO_KEY)
  69. uni.removeStorageSync(REMEMBER_KEY)
  70. return
  71. }
  72. uni.setStorageSync(PASSWORD_MEMO_KEY, '1')
  73. uni.setStorageSync(PASSWORD_INFO_KEY, { username: normalizedAccount, passwd: String(password || '') })
  74. uni.setStorageSync(REMEMBER_KEY, normalizedAccount)
  75. }
  76. export function getRememberedCredentials() {
  77. const remembered = uni.getStorageSync(PASSWORD_INFO_KEY) || {}
  78. const rememberPassword = uni.getStorageSync(PASSWORD_MEMO_KEY) === '1'
  79. return {
  80. account: remembered.username || uni.getStorageSync(REMEMBER_KEY) || '',
  81. password: rememberPassword ? remembered.passwd || '' : '',
  82. rememberPassword,
  83. }
  84. }
  85. export function savePermissionData(tree, authorities) {
  86. uni.setStorageSync(TREE_KEY, JSON.stringify(Array.isArray(tree) ? tree : []))
  87. uni.setStorageSync(AUTHORITIES_KEY, JSON.stringify(Array.isArray(authorities) ? authorities : []))
  88. }
  89. export function getLoginUser() {
  90. return uni.getStorageSync(USER_INFO_KEY) || null
  91. }
  92. export function saveCurrentUser(data) {
  93. if (!data) return
  94. uni.setStorageSync(CURRENT_USER_KEY, data)
  95. }
  96. // 把 /system/account/getLoginUser 的 CurrentUserVO 映射成页面里使用的字段
  97. function mapCurrentUser(vo) {
  98. if (!vo || typeof vo !== 'object') return null
  99. const name = String(vo.name || '')
  100. return {
  101. id: vo.jobNumber || vo.loginName || '',
  102. name,
  103. initials: name ? name.charAt(0) : '',
  104. department: vo.deptName || '',
  105. position: vo.postName || '',
  106. company: vo.groupName || '',
  107. phone: vo.phone || '',
  108. entryDate: vo.entryDate || '',
  109. workAge: vo.workAge || '',
  110. raw: vo,
  111. }
  112. }
  113. function isServerMode() {
  114. const info = uni.getStorageSync(API_INFO_KEY)
  115. return Boolean(info && info.mode === 'server')
  116. }
  117. // 演示模式 → mock 数据;服务器模式 → 接口返回的数据;服务器模式未拉到则返回 null
  118. export function getCurrentUser() {
  119. if (!isServerMode()) return mockCurrentUser
  120. const stored = uni.getStorageSync(CURRENT_USER_KEY)
  121. return mapCurrentUser(stored)
  122. }
  123. export function getAuthCredentials() {
  124. const userInfo = uni.getStorageSync(USER_INFO_KEY) || {}
  125. return {
  126. token: userInfo.token || '',
  127. sessionId: userInfo.sessionId || '',
  128. }
  129. }
  130. export function clearDemoStorage() {
  131. [APPLY_KEY, DRAFT_KEY, APPROVAL_KEY, TRAINING_KEY, PROFILE_KEY].forEach((key) =>
  132. uni.removeStorageSync(key),
  133. )
  134. }
  135. export function getApplications() {
  136. const saved = uni.getStorageSync(APPLY_KEY)
  137. return Array.isArray(saved) ? saved : []
  138. }
  139. export function addApplication(item) {
  140. const list = getApplications()
  141. list.unshift({ ...item, id: Date.now(), status: '审批中', createdAt: formatNow() })
  142. uni.setStorageSync(APPLY_KEY, list)
  143. return list
  144. }
  145. export function saveDraft(type, form) {
  146. const drafts = uni.getStorageSync(DRAFT_KEY) || {}
  147. drafts[type] = { ...form, savedAt: formatNow() }
  148. uni.setStorageSync(DRAFT_KEY, drafts)
  149. }
  150. export function getDraft(type) {
  151. const drafts = uni.getStorageSync(DRAFT_KEY) || {}
  152. return drafts[type] || null
  153. }
  154. export function removeDraft(type) {
  155. const drafts = uni.getStorageSync(DRAFT_KEY) || {}
  156. delete drafts[type]
  157. uni.setStorageSync(DRAFT_KEY, drafts)
  158. }
  159. export function getApprovalResults() {
  160. const saved = uni.getStorageSync(APPROVAL_KEY)
  161. return saved && typeof saved === 'object' ? saved : {}
  162. }
  163. export function setApprovalResult(id, status, comment = '') {
  164. const results = getApprovalResults()
  165. results[id] = { status, comment, handledAt: formatNow() }
  166. uni.setStorageSync(APPROVAL_KEY, results)
  167. return results[id]
  168. }
  169. export function getTrainingProgress(defaults) {
  170. const saved = uni.getStorageSync(TRAINING_KEY) || {}
  171. return defaults.map((item) => ({ ...item, progress: saved[item.id] ?? item.progress }))
  172. }
  173. export function setTrainingProgress(id, progress) {
  174. const saved = uni.getStorageSync(TRAINING_KEY) || {}
  175. saved[id] = progress
  176. uni.setStorageSync(TRAINING_KEY, saved)
  177. }
  178. export function saveProfileChange(item) {
  179. const list = uni.getStorageSync(PROFILE_KEY) || []
  180. list.unshift({ ...item, id: Date.now(), status: '审核中', createdAt: formatNow() })
  181. uni.setStorageSync(PROFILE_KEY, list)
  182. return list
  183. }
  184. export function formatNow() {
  185. const d = new Date()
  186. const pad = (n) => String(n).padStart(2, '0')
  187. return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`
  188. }