af-mobile-client-vue3 1.6.19 → 1.6.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/.env +11 -11
  2. package/package.json +121 -121
  3. package/src/api/user/index.ts +50 -50
  4. package/src/components/common/MateChat/apiService.ts +310 -310
  5. package/src/components/data/OtherCharge/OtherChargeGroupModal.vue +542 -542
  6. package/src/components/data/UserDetail/api.ts +24 -24
  7. package/src/components/data/UserDetail/index.vue +660 -660
  8. package/src/components/data/XFormGroup/doc/UserForm.vue +102 -102
  9. package/src/components/data/step/index.vue +1975 -1975
  10. package/src/router/invoiceRoutes.ts +37 -37
  11. package/src/services/api/Login.ts +6 -6
  12. package/src/services/v3Api.ts +170 -170
  13. package/src/stores/modules/user.ts +441 -441
  14. package/src/types/platform.ts +194 -194
  15. package/src/utils/Storage.ts +124 -124
  16. package/src/utils/http/index.ts +228 -228
  17. package/src/utils/login/loginVerify.ts +317 -317
  18. package/src/views/SafeInspection/SecurityCertificate/AddDevice/index.vue +662 -661
  19. package/src/views/SafeInspection/SecurityCertificate/OverallHiddenDangers/index.vue +376 -376
  20. package/src/views/SafeInspection/SecurityCertificate/contractSign/index.vue +80 -80
  21. package/src/views/SafeInspection/SecurityCertificate/photoSignature/SignatureComponent/SignatureComponent.vue +285 -285
  22. package/src/views/SafeInspection/SecurityCertificate/photoSignature/index.vue +258 -258
  23. package/src/views/SafeInspection/SecurityCertificate/photoSignature/slots/QinHuaSignature.vue +82 -82
  24. package/src/views/SafeInspection/SecurityCertificate/slots/GasDevice.vue +132 -132
  25. package/src/views/SafeInspection/SecurityCertificate/userInfo/index.vue +1 -0
  26. package/src/views/SafeInspection/SecurityCertificate/userInfo/upaddress.vue +239 -239
  27. package/src/views/SafeInspection/SecurityFormItem/XMultiSelect/index.vue +194 -194
  28. package/src/views/SafeInspection/SecurityFormItem/XSignature/index.vue +68 -68
  29. package/src/views/SafeInspection/SecurityFormItem/index.vue +418 -418
  30. package/src/views/component/UserDetailView/UserDetailPage.vue +78 -78
  31. package/src/views/component/UserDetailView/index.vue +234 -234
  32. package/src/views/external/index.vue +158 -158
  33. package/src/views/user/employeeBinding/index.vue +392 -392
  34. package/src/views/user/register/index.vue +995 -995
  35. package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -21
  36. package/src/views/userRecords/CardReplacementRecords.vue +21 -21
  37. package/src/views/userRecords/ChangeRecords.vue +19 -19
  38. package/src/views/userRecords/CommandViewRecords.vue +20 -20
  39. package/src/views/userRecords/GasCompensationRecords.vue +20 -20
  40. package/src/views/userRecords/GasPurchaseRecords.vue +19 -19
  41. package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -21
  42. package/src/views/userRecords/MeterRecords.vue +20 -20
  43. package/src/views/userRecords/OperateRecords.vue +51 -51
  44. package/src/views/userRecords/OtherChargeRecords.vue +19 -19
  45. package/src/views/userRecords/PaymentRecords.vue +114 -114
  46. package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -19
  47. package/src/views/userRecords/RepairRecords.vue +19 -19
  48. package/src/views/userRecords/ReplacementRecords.vue +19 -19
  49. package/src/views/userRecords/SafetyRecords.vue +19 -19
  50. package/src/views/userRecords/TransactionRecords.vue +21 -21
  51. package/src/views/userRecords/TransferGasRecords.vue +19 -19
  52. package/src/views/userRecords/TransferRecords.vue +19 -19
  53. package/vite.config.ts +121 -121
  54. package/certs/127.0.0.1+2-key.pem +0 -28
  55. package/certs/127.0.0.1+2.pem +0 -27
  56. package/mock/modules/prose.mock.ts.timestamp-1758877157774.mjs +0 -53
  57. package/mock/modules/user.mock.ts.timestamp-1758877157774.mjs +0 -97
@@ -1,441 +1,441 @@
1
- import type { UserType } from '@af-mobile-client-vue3/types/auth'
2
- import type { RouteRecordRaw } from 'vue-router'
3
- import { doLogout, login, OALogin } from '@af-mobile-client-vue3/api/user'
4
- import router from '@af-mobile-client-vue3/router/index'
5
- import { useSettingStore } from '@af-mobile-client-vue3/stores/modules/setting'
6
- import {
7
- ACCESS_TOKEN,
8
- APP_LOGIN_KEY,
9
- APP_PERMISSIONS_KEY,
10
- APP_ROLES_KEY,
11
- APP_ROUTES_KEY,
12
- APP_WEB_CONFIG_KEY,
13
- CURRENT_USER,
14
- EXTERNAL_USER_INFO,
15
- PLATFORM_TYPE,
16
- USER_TYPE,
17
- } from '@af-mobile-client-vue3/stores/mutation-type'
18
- import { getPlatformRoutePrefix } from '@af-mobile-client-vue3/types/platform'
19
- import crypto from '@af-mobile-client-vue3/utils/crypto'
20
- import { encryptUtil } from '@af-mobile-client-vue3/utils/EncryptUtil'
21
- import { indexedDB } from '@af-mobile-client-vue3/utils/indexedDB'
22
- import { secureStorageWrite } from '@af-mobile-client-vue3/utils/secureStorage'
23
- import { createStorage } from '@af-mobile-client-vue3/utils/Storage'
24
- import { defineStore } from 'pinia'
25
- import { ref } from 'vue'
26
-
27
- const Storage = createStorage({ storage: localStorage })
28
-
29
- export interface UserInfo {
30
- id: number
31
- username: string
32
- password: string
33
- name: string
34
- avatar: string
35
- functions: Array<any>
36
- rolestr: string
37
- f_operator: string
38
- f_operatorid: string
39
- f_orgid: string
40
- f_orgname: string
41
- f_depid: string
42
- f_depname: string
43
- nickname: string
44
-
45
- [key: string]: any
46
- }
47
-
48
- interface IUserState {
49
- token?: string
50
- userInfo: any
51
- lastUpdateTime: number
52
- permissions: string[]
53
- roles: [{ id: string, operation: string[] }]
54
- routesConfig: Array<any>
55
- single: Array<ExtraRouteRecordRaw>
56
- login: any
57
- tenantName: string
58
- // 用户类型相关字段
59
- userType?: UserType | null
60
- platformType?: string | null
61
- }
62
-
63
- type ExtraRouteRecordRaw = RouteRecordRaw & {
64
- delete: boolean
65
- fullPath: string
66
- }
67
-
68
- interface LoginParams {
69
- username: string
70
- password: string
71
- resourceName: string
72
- }
73
-
74
- interface FaceLoginParams {
75
- resourceName: string
76
- embedding: string // 面别识别信息
77
- isMobile: boolean
78
- }
79
-
80
- interface WxParams {
81
- unifiedCode: string
82
- tenantName: string
83
- loginMode: string
84
- resourceName: string
85
- }
86
-
87
- interface ExternalLoginParams {
88
- platformType: string
89
- platformUserId: string
90
- tenantName: string
91
- resourceName?: string
92
- isMobile?: boolean
93
- }
94
-
95
- export const useUserStore = defineStore('app-user', () => {
96
- const userState = ref<IUserState>({
97
- userInfo: null,
98
- token: undefined,
99
- lastUpdateTime: 0,
100
- // 旧营收产品$login对象
101
- login: undefined,
102
- permissions: null,
103
- roles: null,
104
- routesConfig: null,
105
- single: [],
106
- tenantName: '',
107
- // 用户类型相关字段
108
- userType: null,
109
- platformType: null,
110
- } as IUserState)
111
- const getUserInfo = () => {
112
- return userState.value.userInfo || Storage.get(CURRENT_USER, {}) || {}
113
- }
114
- const getLogin = () => {
115
- return userState.value.login || Storage.get(APP_LOGIN_KEY, []) || {}
116
- }
117
- const getPermissions = () => {
118
- return userState.value.permissions || Storage.get(APP_PERMISSIONS_KEY, []) || []
119
- }
120
- const getRoles = () => {
121
- return userState.value.roles || Storage.get(APP_ROLES_KEY, []) || []
122
- }
123
- const getRoutesConfig = () => {
124
- return userState.value.routesConfig || Storage.get(APP_ROUTES_KEY, []) || []
125
- }
126
- const getToken = () => {
127
- return userState.value.token || Storage.get(ACCESS_TOKEN, '') as string
128
- }
129
- const getLastUpdateTime = () => {
130
- return userState.value.lastUpdateTime
131
- }
132
- const setToken = (token: string | undefined) => {
133
- Storage.set(ACCESS_TOKEN, token)
134
- }
135
- /**
136
- * 设置 token,过期时间单位为分钟
137
- * @param token token 值
138
- * @param expiresInMinutes 过期分钟数
139
- * - null:默认走setToken 7天
140
- * - 0:立即过期
141
- * - >0:指定分钟(内部会减30秒缓冲)
142
- */
143
- const setTokenWithExpireMinutes = (token: string | undefined, expiresInMinutes: number | null = null) => {
144
- if (expiresInMinutes === 0) {
145
- Storage.set(ACCESS_TOKEN, token, 0)
146
- }
147
- else if (expiresInMinutes && expiresInMinutes > 0) {
148
- const expiresInSeconds = expiresInMinutes * 60
149
- const BUFFER_SECONDS = 30
150
- const safeExpire = Math.max(expiresInSeconds - BUFFER_SECONDS, 0)
151
- Storage.set(ACCESS_TOKEN, token, safeExpire)
152
- }
153
- else {
154
- setToken(token)
155
- }
156
- }
157
- const setUserInfo = (info: any | null) => {
158
- userState.value.userInfo = info
159
- userState.value.lastUpdateTime = new Date().getTime()
160
- Storage.set(CURRENT_USER, info)
161
- }
162
- const setLogin = (login: any) => {
163
- userState.value.login = login
164
- Storage.set(APP_LOGIN_KEY, login)
165
- }
166
-
167
- const setTenantName = (tenantName: string) => {
168
- userState.value.tenantName = tenantName
169
- }
170
- const getTenantName = () => {
171
- return userState.value.tenantName
172
- }
173
-
174
- // 用户类型相关方法
175
- const getUserType = (): UserType | null => {
176
- return userState.value.userType || Storage.get(USER_TYPE, null)
177
- }
178
-
179
- const setUserType = (userType: UserType | null) => {
180
- userState.value.userType = userType
181
- Storage.set(USER_TYPE, userType)
182
- }
183
-
184
- const isSystemUser = (): boolean => {
185
- const userType = getUserType()
186
- return userType === 'SYSTEM' || userType === null // null 默认为系统用户
187
- }
188
-
189
- const isExternalUser = (): boolean => {
190
- return getUserType() === 'EXTERNAL'
191
- }
192
-
193
- // 平台类型相关方法
194
- const getPlatformType = (): string | null => {
195
- return userState.value.platformType || Storage.get(PLATFORM_TYPE, null)
196
- }
197
-
198
- const setPlatformType = (platformType: string | null) => {
199
- userState.value.platformType = platformType
200
- Storage.set(PLATFORM_TYPE, platformType)
201
- }
202
-
203
- const getDefaultRoute = (): string => {
204
- if (isExternalUser()) {
205
- const platformType = getPlatformType()
206
- return getPlatformRoutePrefix(platformType)
207
- }
208
- return '/'
209
- }
210
-
211
- const setSingle = (page: ExtraRouteRecordRaw) => {
212
- if (page.path && page.delete) {
213
- // 删除
214
- userState.value.single = userState.value.single.filter(item => item.fullPath !== page.path)
215
- }
216
- else if (userState.value.single.filter(item => item.meta.singlePage === page.meta.singlePage).length === 0) {
217
- // 添加
218
- userState.value.single.push(page)
219
- }
220
- }
221
- const setPermissions = (permissions: []) => {
222
- userState.value.permissions = permissions
223
- Storage.set(APP_PERMISSIONS_KEY, permissions)
224
- }
225
- const setRoles = (roles: [{ id: string, operation: string[] }]) => {
226
- userState.value.roles = roles
227
- Storage.set(APP_ROLES_KEY, roles)
228
- }
229
- const setRoutesConfig = (routesConfig: Array<any>) => {
230
- userState.value.routesConfig = routesConfig
231
- Storage.set(APP_ROUTES_KEY, routesConfig)
232
- }
233
- const Login = async (params: LoginParams) => {
234
- try {
235
- let data: any
236
- const compatible = import.meta.env.VITE_APP_COMPATIBLE
237
- if (compatible === 'OA') {
238
- data = await OALogin(params)
239
- // save token
240
- setToken(params.password)
241
- }
242
- else {
243
- data = await login(params)
244
- if (data.resources && data.resources.msg && data.resources.code && data.resources.code !== 200) {
245
- return Promise.reject(new Error(data.resources.msg))
246
- }
247
- // save token
248
- setToken(data.access_token)
249
- // 第三方教培系统鉴权兼容
250
- const LoginTicket = crypto.AESEncrypt(JSON.stringify(params), '3KMKqvgwR8ULbR8Z')
251
- if (data.session && useSettingStore().getSetting().requestEncrypt) {
252
- const k = encryptUtil.RSADecrypt(data.session as string)
253
- localStorage.setItem('v4-session-key', k)
254
- secureStorageWrite('v4-session-key', k)
255
- }
256
- Storage.set('LoginTicket', LoginTicket)
257
- }
258
- return Promise.resolve(data)
259
- }
260
- catch (error) {
261
- return Promise.reject(error)
262
- }
263
- }
264
- const faceLogin = async (params: FaceLoginParams) => {
265
- try {
266
- const data = await login(params)
267
- if (data.resources && data.resources.msg && data.resources.code && data.resources.code !== 200) {
268
- return Promise.reject(new Error(data.resources.msg))
269
- }
270
- // save token
271
- setToken(data.access_token)
272
- const LoginTicket = crypto.AESEncrypt(JSON.stringify(params), '3KMKqvgwR8ULbR8Z')
273
- if (data.session && useSettingStore().getSetting().requestEncrypt) {
274
- const k = encryptUtil.RSADecrypt(data.session as string)
275
- localStorage.setItem('v4-session-key', k)
276
- secureStorageWrite('v4-session-key', k)
277
- }
278
- Storage.set('LoginTicket', LoginTicket)
279
- return Promise.resolve(data)
280
- }
281
- catch (error) {
282
- return Promise.reject(error)
283
- }
284
- }
285
- const loginUnified = async (params: WxParams) => {
286
- try {
287
- const data: any = await login(params)
288
- setToken(data.access_token)
289
- const LoginTicket = crypto.AESEncrypt(JSON.stringify(params), '3KMKqvgwR8ULbR8Z')
290
- Storage.set('LoginTicket', LoginTicket)
291
- return Promise.resolve(data)
292
- }
293
- catch (error) {
294
- return Promise.reject(error)
295
- }
296
- }
297
-
298
- const loginExternal = async (params: ExternalLoginParams) => {
299
- try {
300
- const data: any = await login(params)
301
- if (data.resources && data.resources.msg && data.resources.code && data.resources.code !== 200) {
302
- return Promise.reject(new Error(data.resources.msg))
303
- }
304
- // 设置Token 含过期时间
305
- setTokenWithExpireMinutes(data.access_token, data.expires_in)
306
-
307
- // 加密存储登录票据
308
- const LoginTicket = crypto.AESEncrypt(JSON.stringify(params), '3KMKqvgwR8ULbR8Z')
309
- Storage.set('LoginTicket', LoginTicket)
310
- if (data.session && useSettingStore().getSetting().requestEncrypt) {
311
- const k = encryptUtil.RSADecrypt(data.session as string)
312
- localStorage.setItem('v4-session-key', k)
313
- secureStorageWrite('v4-session-key', k)
314
- }
315
- return Promise.resolve(data)
316
- }
317
- catch (error) {
318
- return Promise.reject(error)
319
- }
320
- }
321
- const loginExternalMini = async (data: any) => {
322
- try {
323
- // 设置Token 含过期时间
324
- setTokenWithExpireMinutes(data.access_token, data.expires_in)
325
-
326
- // 加密存储登录票据
327
- const LoginTicket = crypto.AESEncrypt(JSON.stringify(data), '3KMKqvgwR8ULbR8Z')
328
- if (data.session && useSettingStore().getSetting().requestEncrypt) {
329
- const k = encryptUtil.RSADecrypt(data.session as string)
330
- localStorage.setItem('v4-session-key', k)
331
- secureStorageWrite('v4-session-key', k)
332
- }
333
- Storage.set('LoginTicket', LoginTicket)
334
-
335
- return Promise.resolve(data)
336
- }
337
- catch (error) {
338
- return Promise.reject(error)
339
- }
340
- }
341
-
342
- const logout = async () => {
343
- if (getToken()) {
344
- try {
345
- await doLogout()
346
- }
347
- catch {
348
- console.error('注销Token失败')
349
- }
350
- }
351
- setToken(undefined)
352
- setUserInfo(null)
353
- setUserType(null)
354
- setPlatformType(null)
355
- Storage.remove(CURRENT_USER)
356
- Storage.remove(ACCESS_TOKEN)
357
- Storage.remove(APP_LOGIN_KEY)
358
- Storage.remove(APP_PERMISSIONS_KEY)
359
- Storage.remove(APP_ROLES_KEY)
360
- Storage.remove(APP_ROUTES_KEY)
361
- Storage.remove(APP_WEB_CONFIG_KEY)
362
- Storage.remove(USER_TYPE)
363
- Storage.remove(PLATFORM_TYPE)
364
- Storage.remove(EXTERNAL_USER_INFO)
365
- Storage.remove('LoginTicket')
366
- // 清除本地加密秘钥
367
- localStorage.removeItem('v4-session-key')
368
- secureStorageWrite('v4-session-key', '')
369
- await indexedDB.clearDB()
370
- await useSettingStore().init()
371
- try {
372
- // 添加页面刷新
373
- await router.replace('/login')
374
- window.location.reload()
375
- }
376
- catch (e) {
377
- console.error(e)
378
- }
379
- }
380
- const registerClean = async () => {
381
- setToken(undefined)
382
- setUserInfo(null)
383
- setUserType(null)
384
- setPlatformType(null)
385
- Storage.remove(CURRENT_USER)
386
- Storage.remove(ACCESS_TOKEN)
387
- Storage.remove(APP_LOGIN_KEY)
388
- Storage.remove(APP_PERMISSIONS_KEY)
389
- Storage.remove(APP_ROLES_KEY)
390
- Storage.remove(APP_ROUTES_KEY)
391
- Storage.remove(APP_WEB_CONFIG_KEY)
392
- Storage.remove(USER_TYPE)
393
- Storage.remove(PLATFORM_TYPE)
394
- Storage.remove(EXTERNAL_USER_INFO)
395
- Storage.remove('LoginTicket')
396
- localStorage.removeItem('v4-session-key')
397
- secureStorageWrite('v4-session-key', '')
398
- await indexedDB.clearDB()
399
- await useSettingStore().init()
400
- }
401
- const getCode = (tenantName: string) => {
402
- window.location.replace(`api/af-system/user/getcode?state=${tenantName}`)
403
- }
404
-
405
- return {
406
- Login,
407
- faceLogin,
408
- loginUnified,
409
- loginExternal,
410
- loginExternalMini,
411
- getToken,
412
- getLastUpdateTime,
413
- logout,
414
- registerClean,
415
- setUserInfo,
416
- getUserInfo,
417
- getLogin,
418
- getPermissions,
419
- getRoles,
420
- getRoutesConfig,
421
- setLogin,
422
- setSingle,
423
- setPermissions,
424
- setRoles,
425
- setRoutesConfig,
426
- setTenantName,
427
- getTenantName,
428
- getCode,
429
- // 用户类型相关方法
430
- getUserType,
431
- setUserType,
432
- isSystemUser,
433
- isExternalUser,
434
- getDefaultRoute,
435
- // 平台类型相关方法
436
- getPlatformType,
437
- setPlatformType,
438
- }
439
- })
440
-
441
- export default useUserStore
1
+ import type { UserType } from '@af-mobile-client-vue3/types/auth'
2
+ import type { RouteRecordRaw } from 'vue-router'
3
+ import { doLogout, login, OALogin } from '@af-mobile-client-vue3/api/user'
4
+ import router from '@af-mobile-client-vue3/router/index'
5
+ import { useSettingStore } from '@af-mobile-client-vue3/stores/modules/setting'
6
+ import {
7
+ ACCESS_TOKEN,
8
+ APP_LOGIN_KEY,
9
+ APP_PERMISSIONS_KEY,
10
+ APP_ROLES_KEY,
11
+ APP_ROUTES_KEY,
12
+ APP_WEB_CONFIG_KEY,
13
+ CURRENT_USER,
14
+ EXTERNAL_USER_INFO,
15
+ PLATFORM_TYPE,
16
+ USER_TYPE,
17
+ } from '@af-mobile-client-vue3/stores/mutation-type'
18
+ import { getPlatformRoutePrefix } from '@af-mobile-client-vue3/types/platform'
19
+ import crypto from '@af-mobile-client-vue3/utils/crypto'
20
+ import { encryptUtil } from '@af-mobile-client-vue3/utils/EncryptUtil'
21
+ import { indexedDB } from '@af-mobile-client-vue3/utils/indexedDB'
22
+ import { secureStorageWrite } from '@af-mobile-client-vue3/utils/secureStorage'
23
+ import { createStorage } from '@af-mobile-client-vue3/utils/Storage'
24
+ import { defineStore } from 'pinia'
25
+ import { ref } from 'vue'
26
+
27
+ const Storage = createStorage({ storage: localStorage })
28
+
29
+ export interface UserInfo {
30
+ id: number
31
+ username: string
32
+ password: string
33
+ name: string
34
+ avatar: string
35
+ functions: Array<any>
36
+ rolestr: string
37
+ f_operator: string
38
+ f_operatorid: string
39
+ f_orgid: string
40
+ f_orgname: string
41
+ f_depid: string
42
+ f_depname: string
43
+ nickname: string
44
+
45
+ [key: string]: any
46
+ }
47
+
48
+ interface IUserState {
49
+ token?: string
50
+ userInfo: any
51
+ lastUpdateTime: number
52
+ permissions: string[]
53
+ roles: [{ id: string, operation: string[] }]
54
+ routesConfig: Array<any>
55
+ single: Array<ExtraRouteRecordRaw>
56
+ login: any
57
+ tenantName: string
58
+ // 用户类型相关字段
59
+ userType?: UserType | null
60
+ platformType?: string | null
61
+ }
62
+
63
+ type ExtraRouteRecordRaw = RouteRecordRaw & {
64
+ delete: boolean
65
+ fullPath: string
66
+ }
67
+
68
+ interface LoginParams {
69
+ username: string
70
+ password: string
71
+ resourceName: string
72
+ }
73
+
74
+ interface FaceLoginParams {
75
+ resourceName: string
76
+ embedding: string // 面别识别信息
77
+ isMobile: boolean
78
+ }
79
+
80
+ interface WxParams {
81
+ unifiedCode: string
82
+ tenantName: string
83
+ loginMode: string
84
+ resourceName: string
85
+ }
86
+
87
+ interface ExternalLoginParams {
88
+ platformType: string
89
+ platformUserId: string
90
+ tenantName: string
91
+ resourceName?: string
92
+ isMobile?: boolean
93
+ }
94
+
95
+ export const useUserStore = defineStore('app-user', () => {
96
+ const userState = ref<IUserState>({
97
+ userInfo: null,
98
+ token: undefined,
99
+ lastUpdateTime: 0,
100
+ // 旧营收产品$login对象
101
+ login: undefined,
102
+ permissions: null,
103
+ roles: null,
104
+ routesConfig: null,
105
+ single: [],
106
+ tenantName: '',
107
+ // 用户类型相关字段
108
+ userType: null,
109
+ platformType: null,
110
+ } as IUserState)
111
+ const getUserInfo = () => {
112
+ return userState.value.userInfo || Storage.get(CURRENT_USER, {}) || {}
113
+ }
114
+ const getLogin = () => {
115
+ return userState.value.login || Storage.get(APP_LOGIN_KEY, []) || {}
116
+ }
117
+ const getPermissions = () => {
118
+ return userState.value.permissions || Storage.get(APP_PERMISSIONS_KEY, []) || []
119
+ }
120
+ const getRoles = () => {
121
+ return userState.value.roles || Storage.get(APP_ROLES_KEY, []) || []
122
+ }
123
+ const getRoutesConfig = () => {
124
+ return userState.value.routesConfig || Storage.get(APP_ROUTES_KEY, []) || []
125
+ }
126
+ const getToken = () => {
127
+ return userState.value.token || Storage.get(ACCESS_TOKEN, '') as string
128
+ }
129
+ const getLastUpdateTime = () => {
130
+ return userState.value.lastUpdateTime
131
+ }
132
+ const setToken = (token: string | undefined) => {
133
+ Storage.set(ACCESS_TOKEN, token)
134
+ }
135
+ /**
136
+ * 设置 token,过期时间单位为分钟
137
+ * @param token token 值
138
+ * @param expiresInMinutes 过期分钟数
139
+ * - null:默认走setToken 7天
140
+ * - 0:立即过期
141
+ * - >0:指定分钟(内部会减30秒缓冲)
142
+ */
143
+ const setTokenWithExpireMinutes = (token: string | undefined, expiresInMinutes: number | null = null) => {
144
+ if (expiresInMinutes === 0) {
145
+ Storage.set(ACCESS_TOKEN, token, 0)
146
+ }
147
+ else if (expiresInMinutes && expiresInMinutes > 0) {
148
+ const expiresInSeconds = expiresInMinutes * 60
149
+ const BUFFER_SECONDS = 30
150
+ const safeExpire = Math.max(expiresInSeconds - BUFFER_SECONDS, 0)
151
+ Storage.set(ACCESS_TOKEN, token, safeExpire)
152
+ }
153
+ else {
154
+ setToken(token)
155
+ }
156
+ }
157
+ const setUserInfo = (info: any | null) => {
158
+ userState.value.userInfo = info
159
+ userState.value.lastUpdateTime = new Date().getTime()
160
+ Storage.set(CURRENT_USER, info)
161
+ }
162
+ const setLogin = (login: any) => {
163
+ userState.value.login = login
164
+ Storage.set(APP_LOGIN_KEY, login)
165
+ }
166
+
167
+ const setTenantName = (tenantName: string) => {
168
+ userState.value.tenantName = tenantName
169
+ }
170
+ const getTenantName = () => {
171
+ return userState.value.tenantName
172
+ }
173
+
174
+ // 用户类型相关方法
175
+ const getUserType = (): UserType | null => {
176
+ return userState.value.userType || Storage.get(USER_TYPE, null)
177
+ }
178
+
179
+ const setUserType = (userType: UserType | null) => {
180
+ userState.value.userType = userType
181
+ Storage.set(USER_TYPE, userType)
182
+ }
183
+
184
+ const isSystemUser = (): boolean => {
185
+ const userType = getUserType()
186
+ return userType === 'SYSTEM' || userType === null // null 默认为系统用户
187
+ }
188
+
189
+ const isExternalUser = (): boolean => {
190
+ return getUserType() === 'EXTERNAL'
191
+ }
192
+
193
+ // 平台类型相关方法
194
+ const getPlatformType = (): string | null => {
195
+ return userState.value.platformType || Storage.get(PLATFORM_TYPE, null)
196
+ }
197
+
198
+ const setPlatformType = (platformType: string | null) => {
199
+ userState.value.platformType = platformType
200
+ Storage.set(PLATFORM_TYPE, platformType)
201
+ }
202
+
203
+ const getDefaultRoute = (): string => {
204
+ if (isExternalUser()) {
205
+ const platformType = getPlatformType()
206
+ return getPlatformRoutePrefix(platformType)
207
+ }
208
+ return '/'
209
+ }
210
+
211
+ const setSingle = (page: ExtraRouteRecordRaw) => {
212
+ if (page.path && page.delete) {
213
+ // 删除
214
+ userState.value.single = userState.value.single.filter(item => item.fullPath !== page.path)
215
+ }
216
+ else if (userState.value.single.filter(item => item.meta.singlePage === page.meta.singlePage).length === 0) {
217
+ // 添加
218
+ userState.value.single.push(page)
219
+ }
220
+ }
221
+ const setPermissions = (permissions: []) => {
222
+ userState.value.permissions = permissions
223
+ Storage.set(APP_PERMISSIONS_KEY, permissions)
224
+ }
225
+ const setRoles = (roles: [{ id: string, operation: string[] }]) => {
226
+ userState.value.roles = roles
227
+ Storage.set(APP_ROLES_KEY, roles)
228
+ }
229
+ const setRoutesConfig = (routesConfig: Array<any>) => {
230
+ userState.value.routesConfig = routesConfig
231
+ Storage.set(APP_ROUTES_KEY, routesConfig)
232
+ }
233
+ const Login = async (params: LoginParams) => {
234
+ try {
235
+ let data: any
236
+ const compatible = import.meta.env.VITE_APP_COMPATIBLE
237
+ if (compatible === 'OA') {
238
+ data = await OALogin(params)
239
+ // save token
240
+ setToken(params.password)
241
+ }
242
+ else {
243
+ data = await login(params)
244
+ if (data.resources && data.resources.msg && data.resources.code && data.resources.code !== 200) {
245
+ return Promise.reject(new Error(data.resources.msg))
246
+ }
247
+ // save token
248
+ setToken(data.access_token)
249
+ // 第三方教培系统鉴权兼容
250
+ const LoginTicket = crypto.AESEncrypt(JSON.stringify(params), '3KMKqvgwR8ULbR8Z')
251
+ if (data.session && useSettingStore().getSetting().requestEncrypt) {
252
+ const k = encryptUtil.RSADecrypt(data.session as string)
253
+ localStorage.setItem('v4-session-key', k)
254
+ secureStorageWrite('v4-session-key', k)
255
+ }
256
+ Storage.set('LoginTicket', LoginTicket)
257
+ }
258
+ return Promise.resolve(data)
259
+ }
260
+ catch (error) {
261
+ return Promise.reject(error)
262
+ }
263
+ }
264
+ const faceLogin = async (params: FaceLoginParams) => {
265
+ try {
266
+ const data = await login(params)
267
+ if (data.resources && data.resources.msg && data.resources.code && data.resources.code !== 200) {
268
+ return Promise.reject(new Error(data.resources.msg))
269
+ }
270
+ // save token
271
+ setToken(data.access_token)
272
+ const LoginTicket = crypto.AESEncrypt(JSON.stringify(params), '3KMKqvgwR8ULbR8Z')
273
+ if (data.session && useSettingStore().getSetting().requestEncrypt) {
274
+ const k = encryptUtil.RSADecrypt(data.session as string)
275
+ localStorage.setItem('v4-session-key', k)
276
+ secureStorageWrite('v4-session-key', k)
277
+ }
278
+ Storage.set('LoginTicket', LoginTicket)
279
+ return Promise.resolve(data)
280
+ }
281
+ catch (error) {
282
+ return Promise.reject(error)
283
+ }
284
+ }
285
+ const loginUnified = async (params: WxParams) => {
286
+ try {
287
+ const data: any = await login(params)
288
+ setToken(data.access_token)
289
+ const LoginTicket = crypto.AESEncrypt(JSON.stringify(params), '3KMKqvgwR8ULbR8Z')
290
+ Storage.set('LoginTicket', LoginTicket)
291
+ return Promise.resolve(data)
292
+ }
293
+ catch (error) {
294
+ return Promise.reject(error)
295
+ }
296
+ }
297
+
298
+ const loginExternal = async (params: ExternalLoginParams) => {
299
+ try {
300
+ const data: any = await login(params)
301
+ if (data.resources && data.resources.msg && data.resources.code && data.resources.code !== 200) {
302
+ return Promise.reject(new Error(data.resources.msg))
303
+ }
304
+ // 设置Token 含过期时间
305
+ setTokenWithExpireMinutes(data.access_token, data.expires_in)
306
+
307
+ // 加密存储登录票据
308
+ const LoginTicket = crypto.AESEncrypt(JSON.stringify(params), '3KMKqvgwR8ULbR8Z')
309
+ Storage.set('LoginTicket', LoginTicket)
310
+ if (data.session && useSettingStore().getSetting().requestEncrypt) {
311
+ const k = encryptUtil.RSADecrypt(data.session as string)
312
+ localStorage.setItem('v4-session-key', k)
313
+ secureStorageWrite('v4-session-key', k)
314
+ }
315
+ return Promise.resolve(data)
316
+ }
317
+ catch (error) {
318
+ return Promise.reject(error)
319
+ }
320
+ }
321
+ const loginExternalMini = async (data: any) => {
322
+ try {
323
+ // 设置Token 含过期时间
324
+ setTokenWithExpireMinutes(data.access_token, data.expires_in)
325
+
326
+ // 加密存储登录票据
327
+ const LoginTicket = crypto.AESEncrypt(JSON.stringify(data), '3KMKqvgwR8ULbR8Z')
328
+ if (data.session && useSettingStore().getSetting().requestEncrypt) {
329
+ const k = encryptUtil.RSADecrypt(data.session as string)
330
+ localStorage.setItem('v4-session-key', k)
331
+ secureStorageWrite('v4-session-key', k)
332
+ }
333
+ Storage.set('LoginTicket', LoginTicket)
334
+
335
+ return Promise.resolve(data)
336
+ }
337
+ catch (error) {
338
+ return Promise.reject(error)
339
+ }
340
+ }
341
+
342
+ const logout = async () => {
343
+ if (getToken()) {
344
+ try {
345
+ await doLogout()
346
+ }
347
+ catch {
348
+ console.error('注销Token失败')
349
+ }
350
+ }
351
+ setToken(undefined)
352
+ setUserInfo(null)
353
+ setUserType(null)
354
+ setPlatformType(null)
355
+ Storage.remove(CURRENT_USER)
356
+ Storage.remove(ACCESS_TOKEN)
357
+ Storage.remove(APP_LOGIN_KEY)
358
+ Storage.remove(APP_PERMISSIONS_KEY)
359
+ Storage.remove(APP_ROLES_KEY)
360
+ Storage.remove(APP_ROUTES_KEY)
361
+ Storage.remove(APP_WEB_CONFIG_KEY)
362
+ Storage.remove(USER_TYPE)
363
+ Storage.remove(PLATFORM_TYPE)
364
+ Storage.remove(EXTERNAL_USER_INFO)
365
+ Storage.remove('LoginTicket')
366
+ // 清除本地加密秘钥
367
+ localStorage.removeItem('v4-session-key')
368
+ secureStorageWrite('v4-session-key', '')
369
+ await indexedDB.clearDB()
370
+ await useSettingStore().init()
371
+ try {
372
+ // 添加页面刷新
373
+ await router.replace('/login')
374
+ window.location.reload()
375
+ }
376
+ catch (e) {
377
+ console.error(e)
378
+ }
379
+ }
380
+ const registerClean = async () => {
381
+ setToken(undefined)
382
+ setUserInfo(null)
383
+ setUserType(null)
384
+ setPlatformType(null)
385
+ Storage.remove(CURRENT_USER)
386
+ Storage.remove(ACCESS_TOKEN)
387
+ Storage.remove(APP_LOGIN_KEY)
388
+ Storage.remove(APP_PERMISSIONS_KEY)
389
+ Storage.remove(APP_ROLES_KEY)
390
+ Storage.remove(APP_ROUTES_KEY)
391
+ Storage.remove(APP_WEB_CONFIG_KEY)
392
+ Storage.remove(USER_TYPE)
393
+ Storage.remove(PLATFORM_TYPE)
394
+ Storage.remove(EXTERNAL_USER_INFO)
395
+ Storage.remove('LoginTicket')
396
+ localStorage.removeItem('v4-session-key')
397
+ secureStorageWrite('v4-session-key', '')
398
+ await indexedDB.clearDB()
399
+ await useSettingStore().init()
400
+ }
401
+ const getCode = (tenantName: string) => {
402
+ window.location.replace(`api/af-system/user/getcode?state=${tenantName}`)
403
+ }
404
+
405
+ return {
406
+ Login,
407
+ faceLogin,
408
+ loginUnified,
409
+ loginExternal,
410
+ loginExternalMini,
411
+ getToken,
412
+ getLastUpdateTime,
413
+ logout,
414
+ registerClean,
415
+ setUserInfo,
416
+ getUserInfo,
417
+ getLogin,
418
+ getPermissions,
419
+ getRoles,
420
+ getRoutesConfig,
421
+ setLogin,
422
+ setSingle,
423
+ setPermissions,
424
+ setRoles,
425
+ setRoutesConfig,
426
+ setTenantName,
427
+ getTenantName,
428
+ getCode,
429
+ // 用户类型相关方法
430
+ getUserType,
431
+ setUserType,
432
+ isSystemUser,
433
+ isExternalUser,
434
+ getDefaultRoute,
435
+ // 平台类型相关方法
436
+ getPlatformType,
437
+ setPlatformType,
438
+ }
439
+ })
440
+
441
+ export default useUserStore