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.
- package/.env +11 -11
- package/package.json +121 -121
- package/src/api/user/index.ts +50 -50
- package/src/components/common/MateChat/apiService.ts +310 -310
- package/src/components/data/OtherCharge/OtherChargeGroupModal.vue +542 -542
- package/src/components/data/UserDetail/api.ts +24 -24
- package/src/components/data/UserDetail/index.vue +660 -660
- package/src/components/data/XFormGroup/doc/UserForm.vue +102 -102
- package/src/components/data/step/index.vue +1975 -1975
- package/src/router/invoiceRoutes.ts +37 -37
- package/src/services/api/Login.ts +6 -6
- package/src/services/v3Api.ts +170 -170
- package/src/stores/modules/user.ts +441 -441
- package/src/types/platform.ts +194 -194
- package/src/utils/Storage.ts +124 -124
- package/src/utils/http/index.ts +228 -228
- package/src/utils/login/loginVerify.ts +317 -317
- package/src/views/SafeInspection/SecurityCertificate/AddDevice/index.vue +662 -661
- package/src/views/SafeInspection/SecurityCertificate/OverallHiddenDangers/index.vue +376 -376
- package/src/views/SafeInspection/SecurityCertificate/contractSign/index.vue +80 -80
- package/src/views/SafeInspection/SecurityCertificate/photoSignature/SignatureComponent/SignatureComponent.vue +285 -285
- package/src/views/SafeInspection/SecurityCertificate/photoSignature/index.vue +258 -258
- package/src/views/SafeInspection/SecurityCertificate/photoSignature/slots/QinHuaSignature.vue +82 -82
- package/src/views/SafeInspection/SecurityCertificate/slots/GasDevice.vue +132 -132
- package/src/views/SafeInspection/SecurityCertificate/userInfo/index.vue +1 -0
- package/src/views/SafeInspection/SecurityCertificate/userInfo/upaddress.vue +239 -239
- package/src/views/SafeInspection/SecurityFormItem/XMultiSelect/index.vue +194 -194
- package/src/views/SafeInspection/SecurityFormItem/XSignature/index.vue +68 -68
- package/src/views/SafeInspection/SecurityFormItem/index.vue +418 -418
- package/src/views/component/UserDetailView/UserDetailPage.vue +78 -78
- package/src/views/component/UserDetailView/index.vue +234 -234
- package/src/views/external/index.vue +158 -158
- package/src/views/user/employeeBinding/index.vue +392 -392
- package/src/views/user/register/index.vue +995 -995
- package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -21
- package/src/views/userRecords/CardReplacementRecords.vue +21 -21
- package/src/views/userRecords/ChangeRecords.vue +19 -19
- package/src/views/userRecords/CommandViewRecords.vue +20 -20
- package/src/views/userRecords/GasCompensationRecords.vue +20 -20
- package/src/views/userRecords/GasPurchaseRecords.vue +19 -19
- package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -21
- package/src/views/userRecords/MeterRecords.vue +20 -20
- package/src/views/userRecords/OperateRecords.vue +51 -51
- package/src/views/userRecords/OtherChargeRecords.vue +19 -19
- package/src/views/userRecords/PaymentRecords.vue +114 -114
- package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -19
- package/src/views/userRecords/RepairRecords.vue +19 -19
- package/src/views/userRecords/ReplacementRecords.vue +19 -19
- package/src/views/userRecords/SafetyRecords.vue +19 -19
- package/src/views/userRecords/TransactionRecords.vue +21 -21
- package/src/views/userRecords/TransferGasRecords.vue +19 -19
- package/src/views/userRecords/TransferRecords.vue +19 -19
- package/vite.config.ts +121 -121
- package/certs/127.0.0.1+2-key.pem +0 -28
- package/certs/127.0.0.1+2.pem +0 -27
- package/mock/modules/prose.mock.ts.timestamp-1758877157774.mjs +0 -53
- 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
|