qlfy-ecological-login 1.1.10 → 1.2.0
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/README.md +57 -297
- package/lib/components/qlfyEcologicalLogin/IndexedDBManager.d.ts +72 -0
- package/lib/components/qlfyEcologicalLogin/LocalStorageManager.d.ts +5 -4
- package/lib/components/qlfyEcologicalLogin/data.d.ts +30 -16
- package/lib/components/qlfyEcologicalLogin/index.vue.d.ts +17 -12
- package/lib/components/qlfyEcologicalLogin/myDataCenter.d.ts +31 -0
- package/lib/components/qlfyEcologicalLogin/tools.d.ts +53 -33
- package/lib/components/qlfyEcologicalLogin copy/LocalStorageManager.d.ts +30 -0
- package/lib/components/qlfyEcologicalLogin copy/data.d.ts +41 -0
- package/lib/components/qlfyEcologicalLogin copy/tools.d.ts +46 -0
- package/lib/index.d.ts +18 -12
- package/lib/index.mjs +1368 -2407
- package/lib/index.mjs.gz +0 -0
- package/lib/index.umd.js +6 -11
- package/lib/index.umd.js.gz +0 -0
- package/package.json +1 -1
- package/lib/index.css +0 -1
- package/lib/index.css.gz +0 -0
package/README.md
CHANGED
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
- 🔐 **OAuth2认证** - 基于标准OAuth2协议的统一登录
|
|
12
12
|
- 🚀 **Vue3支持** - 完全基于Vue3 Composition API开发
|
|
13
13
|
- 📦 **TypeScript** - 完整的TypeScript类型支持
|
|
14
|
-
- 🔄 **自动Token管理** - 自动处理token
|
|
14
|
+
- 🔄 **自动Token管理** - 自动处理token存储和校验
|
|
15
15
|
- 👥 **权限管理** - 获取和管理用户权限信息
|
|
16
16
|
- 🎯 **灵活配置** - 支持多种配置模式和自定义参数
|
|
17
|
-
-
|
|
18
|
-
-
|
|
17
|
+
- ️ **安全可靠** - 内置安全机制和错误处理
|
|
18
|
+
- 📝 **日志调试** - 支持开启日志和调试模式
|
|
19
19
|
|
|
20
20
|
## 安装
|
|
21
21
|
|
|
@@ -49,6 +49,7 @@ app.mount('#app')
|
|
|
49
49
|
login-page-base-address="https://sdocen.weathermate.cn:15029/auth"
|
|
50
50
|
login-service-base-address="http://10.76.34.53:48080"
|
|
51
51
|
:use-router="router"
|
|
52
|
+
:show-log="true"
|
|
52
53
|
@login-success="handleLoginSuccess"
|
|
53
54
|
@login-fail="handleLoginFail"
|
|
54
55
|
@logging-in="handleLoggingIn"
|
|
@@ -69,8 +70,8 @@ const clientId = 'your-client-id'
|
|
|
69
70
|
const clientSecret = 'your-client-secret'
|
|
70
71
|
|
|
71
72
|
// 事件处理
|
|
72
|
-
const handleLoginSuccess = (
|
|
73
|
-
console.log('登录成功:',
|
|
73
|
+
const handleLoginSuccess = (loginInfo) => {
|
|
74
|
+
console.log('登录成功:', loginInfo)
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
const handleLoginFail = (error) => {
|
|
@@ -94,149 +95,51 @@ const handleLoggingIn = (token) => {
|
|
|
94
95
|
| `loginPageBaseAddress` | `string` | ✅ | - | 统一登录页面的基础地址 |
|
|
95
96
|
| `loginServiceBaseAddress` | `string` | ✅ | - | 登录服务的基础地址 |
|
|
96
97
|
| `useRouter` | `Router` | ✅ | - | Vue Router实例 |
|
|
97
|
-
| `isEnabled` | `boolean` | ❌ | `true` | 是否启用组件,支持动态控制 |
|
|
98
98
|
| `forceMode` | `boolean` | ❌ | `true` | 强制登录模式 |
|
|
99
|
+
| `clientName` | `string` | ❌ | - | 应用名称 |
|
|
99
100
|
| `token` | `string` | ❌ | - | 外部传入的token |
|
|
100
|
-
| `
|
|
101
|
+
| `isEnabled` | `boolean` | ❌ | `true` | 是否启用组件,支持动态控制 |
|
|
101
102
|
| `redirectPath` | `string` | ❌ | `''` | 认证成功后的重定向路径 |
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
103
|
+
| `tenantId` | `number \| string` | ❌ | `168` | 租户ID |
|
|
104
|
+
| `showLog` | `boolean` | ❌ | `false` | 是否显示执行日志 |
|
|
105
|
+
| `openDebugger` | `boolean` | ❌ | `false` | 是否开启调试模式 |
|
|
104
106
|
|
|
105
107
|
### 组件事件 (Events)
|
|
106
108
|
|
|
107
109
|
| 事件名 | 参数 | 说明 |
|
|
108
110
|
|--------|------|------|
|
|
109
|
-
| `
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
111
|
+
| `loggingIn` | `(code: String, loginInfo?: any)` | 正在登录时触发 |
|
|
112
|
+
| `loginSuccess` | `(loginInfo: { [x: string]: any } \| null)` | 登录成功时触发 |
|
|
113
|
+
| `loginFail` | `(failInfo: any)` | 登录失败时触发 |
|
|
114
|
+
| `tokenRefresh` | `(loginInfo: { [x: string]: any } \| null)` | Token刷新时触发 |
|
|
112
115
|
|
|
113
116
|
#### 事件触发机制详解
|
|
114
117
|
|
|
115
118
|
**1. `loggingIn` 事件**
|
|
116
|
-
- **触发时机**:
|
|
119
|
+
- **触发时机**: 组件初始化加载或路由变化时检测到token
|
|
117
120
|
- **触发条件**: 可从插件参数、url或缓存中获取到token
|
|
118
121
|
- **参数说明**: 当前获取到的token值
|
|
119
|
-
- **使用场景**:
|
|
120
|
-
|
|
121
|
-
```javascript
|
|
122
|
-
const handleLoggingIn = (token) => {
|
|
123
|
-
console.log('正在处理登录,token:', token)
|
|
124
|
-
// 显示加载动画
|
|
125
|
-
showLoading()
|
|
126
|
-
}
|
|
127
|
-
```
|
|
122
|
+
- **使用场景**: 显示登录加载状态
|
|
128
123
|
|
|
129
124
|
**2. `loginSuccess` 事件**
|
|
130
125
|
- **触发时机**: 插件首次完成完整登录流程后,包括token验证和用户权限获取
|
|
131
126
|
- **触发条件**:
|
|
132
|
-
|
|
133
|
-
- token验证通过(后端返回code为0)
|
|
127
|
+
- token验证通过
|
|
134
128
|
- 用户权限信息获取成功
|
|
135
129
|
- **参数说明**: 包含用户权限和配置信息的完整对象
|
|
136
|
-
-
|
|
137
|
-
```typescript
|
|
138
|
-
{
|
|
139
|
-
code: number,
|
|
140
|
-
data: {
|
|
141
|
-
user: any, // 用户基本信息
|
|
142
|
-
permissions: any, // 用户权限列表
|
|
143
|
-
roles: any, // 用户角色信息
|
|
144
|
-
menus: any // 菜单权限
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
```
|
|
148
|
-
- **使用场景**: 保存用户信息到全局状态,初始化应用权限,跳转到主页面
|
|
149
|
-
|
|
150
|
-
```javascript
|
|
151
|
-
const handleLoginSuccess = (userInfo) => {
|
|
152
|
-
// 保存用户信息到状态管理
|
|
153
|
-
store.commit('setUserInfo', userInfo.data)
|
|
154
|
-
|
|
155
|
-
// 初始化权限
|
|
156
|
-
initPermissions(userInfo.data.permissions)
|
|
157
|
-
|
|
158
|
-
// 跳转到主页面
|
|
159
|
-
router.push('/dashboard')
|
|
160
|
-
|
|
161
|
-
// 隐藏加载动画
|
|
162
|
-
hideLoading()
|
|
163
|
-
}
|
|
164
|
-
```
|
|
130
|
+
- **使用场景**: 保存用户信息到全局状态,初始化应用权限
|
|
165
131
|
|
|
166
132
|
**3. `loginFail` 事件**
|
|
167
133
|
- **触发时机**: 登录流程中任何步骤失败时
|
|
168
134
|
- **触发条件**:
|
|
169
|
-
-
|
|
135
|
+
- Token验证失败
|
|
170
136
|
- 用户权限获取失败
|
|
171
137
|
- 网络请求异常
|
|
172
|
-
- 在非强制模式下无有效token
|
|
173
|
-
|
|
174
|
-
-
|
|
175
|
-
- **错误类型**:
|
|
176
|
-
|
|
177
|
-
```typescript
|
|
178
|
-
{
|
|
179
|
-
msg: string, // 错误描述信息
|
|
180
|
-
data: any, // 详细错误数据(可能为null)
|
|
181
|
-
code?: number // 错误代码(如果有)
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
- **使用场景**: 显示错误提示,记录错误日志,处理登录失败逻辑
|
|
185
|
-
|
|
186
|
-
```javascript
|
|
187
|
-
const handleLoginFail = (error) => {
|
|
188
|
-
console.error('登录失败:', error)
|
|
189
|
-
|
|
190
|
-
// 显示错误提示
|
|
191
|
-
ElMessage.error(error.msg || '登录失败,请重试')
|
|
192
|
-
|
|
193
|
-
// 记录错误日志
|
|
194
|
-
logError('Login failed', error)
|
|
195
|
-
|
|
196
|
-
// 隐藏加载动画
|
|
197
|
-
hideLoading()
|
|
198
|
-
|
|
199
|
-
// 根据错误类型处理
|
|
200
|
-
if (error.msg.includes('Token验证失败')) {
|
|
201
|
-
// 清除本地token,重新登录
|
|
202
|
-
clearLocalToken()
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
```
|
|
138
|
+
- 在非强制模式下无有效token时
|
|
139
|
+
- **参数说明**: 包含错误信息的对象
|
|
140
|
+
- **使用场景**: 显示错误提示,记录错误日志
|
|
206
141
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
```
|
|
210
|
-
页面加载/路由变化
|
|
211
|
-
↓
|
|
212
|
-
检查登录状态
|
|
213
|
-
↓
|
|
214
|
-
发现参数、URL或缓存中有token
|
|
215
|
-
↓
|
|
216
|
-
触发 loggingIn 事件 ← 显示加载状态
|
|
217
|
-
↓
|
|
218
|
-
验证token
|
|
219
|
-
↓
|
|
220
|
-
┌─────────────┐
|
|
221
|
-
│ 验证结果 │
|
|
222
|
-
└─────────────┘
|
|
223
|
-
↓ ↓
|
|
224
|
-
成功 失败
|
|
225
|
-
↓ ↓
|
|
226
|
-
获取用户权限 触发 loginFail 事件
|
|
227
|
-
↓
|
|
228
|
-
触发 loginSuccess 事件
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
#### 最佳实践
|
|
232
|
-
|
|
233
|
-
1. **统一错误处理**: 在`loginFail`事件中统一处理各种登录错误
|
|
234
|
-
2. **加载状态管理**: 配合`loggingIn`和`loginSuccess`/`loginFail`事件管理加载状态
|
|
235
|
-
3. **权限初始化**: 在`loginSuccess`事件中完成权限系统的初始化
|
|
236
|
-
4. **错误日志**: 记录详细的错误信息便于问题排查
|
|
237
|
-
5. **用户体验**: 提供清晰的状态反馈和错误提示
|
|
238
|
-
|
|
239
|
-
### 组件方法 (Methods)
|
|
142
|
+
### 组件方法 (Exposed Methods)
|
|
240
143
|
|
|
241
144
|
通过组件ref可以调用以下方法:
|
|
242
145
|
|
|
@@ -245,104 +148,57 @@ const handleLoginFail = (error) => {
|
|
|
245
148
|
const loginRef = ref()
|
|
246
149
|
|
|
247
150
|
// 退出登录
|
|
248
|
-
loginRef.value.logout()
|
|
151
|
+
await loginRef.value.logout()
|
|
249
152
|
|
|
250
153
|
// 获取当前token
|
|
251
|
-
const token = loginRef.value.getToken()
|
|
252
|
-
|
|
253
|
-
// 获取用户权限信息
|
|
254
|
-
const permissions = loginRef.value.getUserPermission()
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
## 工具函数
|
|
258
|
-
|
|
259
|
-
组件还提供了一系列工具函数,可以在应用的任何地方使用:
|
|
260
|
-
|
|
261
|
-
### 工具函数API表格
|
|
262
|
-
|
|
263
|
-
| 函数名 | 参数 | 返回值 | 说明 |
|
|
264
|
-
|--------|------|--------|------|
|
|
265
|
-
| `logout` | `isGoLog?: boolean`, `success?: (res) => void`, `error?: (err) => void` | `void` | 退出登录,可选择是否跳转登录页 |
|
|
266
|
-
| `getToken` | 无 | `string \| null` | 获取当前存储的访问token |
|
|
267
|
-
| `getRefreshToken` | 无 | `string \| undefined` | 获取刷新token |
|
|
268
|
-
| `getUserPermission` | 无 | `any` | 获取当前用户的权限信息 |
|
|
269
|
-
| `goLogin` | 无 | `void` | 跳转到统一登录页面 |
|
|
270
|
-
| `getLoginUrl` | `loginPageBaseAddress: string`, `clientId: string`, `clientSecret: string`, `redirectUrl?: string` | `string` | 生成登录页面URL |
|
|
271
|
-
| `changePassword` | `newPassword: string`, `oldPassword: string` | `Promise<any>` | 修改用户密码 |
|
|
272
|
-
|
|
273
|
-
### 详细说明
|
|
274
|
-
|
|
275
|
-
#### `logout(isGoLog?, success?, error?)`
|
|
276
|
-
**功能**: 退出当前登录状态
|
|
277
|
-
- `isGoLog`: 是否在退出后跳转到登录页,默认为true
|
|
278
|
-
- `success`: 退出成功的回调函数
|
|
279
|
-
- `error`: 退出失败的回调函数
|
|
280
|
-
|
|
281
|
-
#### `getToken()`
|
|
282
|
-
**功能**: 获取当前用户的访问token
|
|
283
|
-
- 返回存储在本地的token,如果不存在或已过期则返回null
|
|
284
|
-
|
|
285
|
-
#### `getRefreshToken()`
|
|
286
|
-
**功能**: 获取用于刷新访问token的刷新token
|
|
287
|
-
- 返回刷新token,用于token续期
|
|
154
|
+
const token = await loginRef.value.getToken()
|
|
288
155
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
- 返回包含用户权限、角色、菜单等信息的对象
|
|
156
|
+
// 获取登录信息
|
|
157
|
+
const loginInfo = await loginRef.value.getLoginInfo()
|
|
292
158
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
159
|
+
// 跳转到统一登录页面
|
|
160
|
+
await loginRef.value.goLogin()
|
|
161
|
+
```
|
|
296
162
|
|
|
297
|
-
|
|
298
|
-
**功能**: 生成登录页面的完整URL
|
|
299
|
-
- `loginPageBaseAddress`: 登录页面的基础地址
|
|
300
|
-
- `clientId`: 应用ID
|
|
301
|
-
- `clientSecret`: 应用密钥
|
|
302
|
-
- `redirectUrl`: 登录成功后的重定向地址,默认为当前页面
|
|
163
|
+
## 全局工具函数
|
|
303
164
|
|
|
304
|
-
|
|
305
|
-
**功能**: 修改用户密码
|
|
306
|
-
- `newPassword`: 新密码
|
|
307
|
-
- `oldPassword`: 原密码
|
|
308
|
-
- 返回Promise,成功时resolve,失败时reject
|
|
165
|
+
组件还提供了一系列全局工具函数,可以在应用的任何地方使用:
|
|
309
166
|
|
|
310
167
|
```javascript
|
|
311
168
|
import {
|
|
312
169
|
logout,
|
|
170
|
+
goLogin,
|
|
313
171
|
getToken,
|
|
314
172
|
getRefreshToken,
|
|
315
|
-
getUserPermission
|
|
316
|
-
goLogin,
|
|
317
|
-
getLoginUrl,
|
|
318
|
-
changePassword
|
|
173
|
+
getUserPermission
|
|
319
174
|
} from 'qlfy-ecological-login'
|
|
320
175
|
|
|
321
176
|
// 退出登录
|
|
177
|
+
// isGoLog: 是否跳转到登录页,默认为true
|
|
178
|
+
// success: 成功回调
|
|
179
|
+
// error: 失败回调
|
|
322
180
|
logout(true,
|
|
323
181
|
(res) => console.log('退出成功', res),
|
|
324
182
|
(err) => console.log('退出失败', err)
|
|
325
183
|
)
|
|
326
184
|
|
|
327
|
-
//
|
|
328
|
-
const token = getToken()
|
|
329
|
-
|
|
330
|
-
// 获取刷新token
|
|
331
|
-
const refreshToken = getRefreshToken()
|
|
332
|
-
|
|
333
|
-
// 获取用户权限
|
|
334
|
-
const permissions = getUserPermission()
|
|
335
|
-
|
|
336
|
-
// 跳转到登录页【建议直接使用logout方法】
|
|
185
|
+
// 跳转到登录页
|
|
337
186
|
goLogin()
|
|
338
187
|
|
|
339
|
-
//
|
|
340
|
-
|
|
188
|
+
// 获取当前token (Promise)
|
|
189
|
+
getToken().then(token => {
|
|
190
|
+
console.log('Token:', token)
|
|
191
|
+
})
|
|
341
192
|
|
|
342
|
-
//
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
193
|
+
// 获取刷新token (Promise)
|
|
194
|
+
getRefreshToken().then(refreshToken => {
|
|
195
|
+
console.log('RefreshToken:', refreshToken)
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
// 获取用户权限信息 (Promise)
|
|
199
|
+
getUserPermission().then(permissions => {
|
|
200
|
+
console.log('Permissions:', permissions)
|
|
201
|
+
})
|
|
346
202
|
```
|
|
347
203
|
|
|
348
204
|
## 登录流程
|
|
@@ -357,111 +213,15 @@ changePassword('newPassword', 'oldPassword')
|
|
|
357
213
|
3. **Token验证** - 调用后端接口验证token有效性
|
|
358
214
|
4. **用户信息获取** - 获取用户权限和配置信息
|
|
359
215
|
5. **状态管理** - 管理登录状态和token生命周期
|
|
360
|
-
6.
|
|
361
|
-
|
|
362
|
-
## 本地存储管理
|
|
363
|
-
|
|
364
|
-
组件内置了智能的本地存储管理器,支持:
|
|
365
|
-
|
|
366
|
-
- **自动过期** - 支持设置存储项的有效期
|
|
367
|
-
- **类型安全** - 自动序列化和反序列化
|
|
368
|
-
- **错误恢复** - 处理存储异常情况
|
|
369
|
-
- **清理机制** - 自动清理过期数据
|
|
370
|
-
|
|
371
|
-
## 配置示例
|
|
372
|
-
|
|
373
|
-
### 基础配置
|
|
374
|
-
|
|
375
|
-
```vue
|
|
376
|
-
<qlfy-ecological-login
|
|
377
|
-
client-id="your-app-id"
|
|
378
|
-
client-secret="your-app-secret"
|
|
379
|
-
:login-page-base-address="https://sdocen.weathermate.cn:15029/auth"
|
|
380
|
-
:login-service-base-address="http://10.76.34.53:48080"
|
|
381
|
-
:use-router="router"
|
|
382
|
-
/>
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
### 高级配置
|
|
386
|
-
|
|
387
|
-
```vue
|
|
388
|
-
<qlfy-ecological-login
|
|
389
|
-
client-id="your-app-id"
|
|
390
|
-
client-secret="your-app-secret"
|
|
391
|
-
login-page-base-address="https://sdocen.weathermate.cn:15029/auth"
|
|
392
|
-
login-service-base-address="http://10.76.34.53:48080"
|
|
393
|
-
:use-router="router"
|
|
394
|
-
:is-enabled="true"
|
|
395
|
-
:force-mode="true"
|
|
396
|
-
:listen-token="true"
|
|
397
|
-
redirect-path="系统地址"
|
|
398
|
-
token-name="custom_token"
|
|
399
|
-
:token-validity="3600"
|
|
400
|
-
@login-success="handleLoginSuccess"
|
|
401
|
-
@login-fail="handleLoginFail"
|
|
402
|
-
/>
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
## 类型定义
|
|
406
|
-
|
|
407
|
-
```typescript
|
|
408
|
-
// 组件属性类型
|
|
409
|
-
interface Prop {
|
|
410
|
-
clientId: string
|
|
411
|
-
clientSecret: string
|
|
412
|
-
loginPageBaseAddress: string
|
|
413
|
-
loginServiceBaseAddress: string
|
|
414
|
-
useRouter: any
|
|
415
|
-
forceMode?: boolean
|
|
416
|
-
token?: string
|
|
417
|
-
isEnabled?: boolean
|
|
418
|
-
listenToken?: boolean
|
|
419
|
-
redirectPath?: string
|
|
420
|
-
tokenName?: string
|
|
421
|
-
tokenValidity?: number
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// 事件类型
|
|
425
|
-
interface Emits {
|
|
426
|
-
(e: 'loggingIn', token: string): void
|
|
427
|
-
(e: 'loginFail', failInfo: any): void
|
|
428
|
-
(e: 'loginSuccess', loginInfo: any): void
|
|
429
|
-
}
|
|
430
|
-
```
|
|
216
|
+
6. **路由拦截** - 根据登录状态和强制模式进行路由拦截
|
|
431
217
|
|
|
432
218
|
## 注意事项
|
|
433
219
|
|
|
434
|
-
1. **路由依赖** - 组件依赖Vue Router,请确保正确传入router
|
|
435
|
-
2.
|
|
436
|
-
3.
|
|
437
|
-
4.
|
|
438
|
-
5. **跨域问题** - 请确保登录服务支持跨域请求或配置代理
|
|
439
|
-
|
|
440
|
-
## 兼容性
|
|
441
|
-
|
|
442
|
-
- Vue 3.x
|
|
443
|
-
- TypeScript 4.x+
|
|
444
|
-
- 现代浏览器(支持ES6+)
|
|
445
|
-
|
|
446
|
-
## 更新日志
|
|
447
|
-
|
|
448
|
-
### v1.1.2
|
|
449
|
-
- 优化登录流程
|
|
450
|
-
- 修复token验证问题
|
|
451
|
-
- 改进错误处理机制
|
|
452
|
-
|
|
453
|
-
### v1.1.6
|
|
454
|
-
|
|
455
|
-
- 文档部分描述及配置问题修改
|
|
220
|
+
1. **路由依赖** - 组件依赖Vue Router,请确保正确传入router实例,且路由模式(Hash/History)会自动检测。
|
|
221
|
+
2. **数据存储** - 组件内置了IndexedDB和LocalStorage的数据存储管理器,自动处理跨域和存储限制。
|
|
222
|
+
3. **安全性** - 请妥善保管clientId和clientSecret。
|
|
223
|
+
4. **跨域问题** - 请确保登录服务支持跨域请求或配置代理。
|
|
456
224
|
|
|
457
225
|
## 许可证
|
|
458
226
|
|
|
459
227
|
MIT License
|
|
460
|
-
|
|
461
|
-
## 支持
|
|
462
|
-
|
|
463
|
-
如果您在使用过程中遇到问题,请提交Issue或联系开发团队。
|
|
464
|
-
|
|
465
|
-
生态工程项目群统一认证登陆功能的插件,内置统一登陆跳转、统一登录token获取、token效验、用户数据配置获取、密码修改登功能;
|
|
466
|
-
|
|
467
|
-
####
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IndexedDB 管理类,封装了对象的存储、读取、修改和删除功能
|
|
3
|
+
*/
|
|
4
|
+
export default class IndexedDBManager {
|
|
5
|
+
private dbName;
|
|
6
|
+
private storeName;
|
|
7
|
+
private version;
|
|
8
|
+
private db;
|
|
9
|
+
/**
|
|
10
|
+
* 初始化 IndexedDB 管理器
|
|
11
|
+
* @param dbName 数据库名称
|
|
12
|
+
* @param storeName 对象存储空间名称
|
|
13
|
+
* @param version 数据库版本号,默认为 1
|
|
14
|
+
*/
|
|
15
|
+
constructor(dbName: string, storeName: string, version?: number);
|
|
16
|
+
/**
|
|
17
|
+
* 打开数据库连接
|
|
18
|
+
* @returns Promise<IDBDatabase> 数据库实例
|
|
19
|
+
*/
|
|
20
|
+
open(): Promise<IDBDatabase>;
|
|
21
|
+
/**
|
|
22
|
+
* 关闭数据库连接
|
|
23
|
+
*/
|
|
24
|
+
close(): void;
|
|
25
|
+
/**
|
|
26
|
+
* 存储数据到对象存储空间(存在则更新,不存在则插入)
|
|
27
|
+
* @param data 要存储的数据,必须包含 id 属性作为键
|
|
28
|
+
* @returns Promise<T> 存储成功后返回存储的数据
|
|
29
|
+
*/
|
|
30
|
+
put<T extends {
|
|
31
|
+
id: IDBValidKey;
|
|
32
|
+
}>(data: T): Promise<T>;
|
|
33
|
+
/**
|
|
34
|
+
* 更新数据(完整对象替换)
|
|
35
|
+
* @param data 要更新的数据,必须包含 id 属性作为键
|
|
36
|
+
* @returns Promise<T> 更新成功后返回更新的数据
|
|
37
|
+
*/
|
|
38
|
+
update<T extends {
|
|
39
|
+
id: IDBValidKey;
|
|
40
|
+
}>(data: T): Promise<T>;
|
|
41
|
+
/**
|
|
42
|
+
* 部分更新数据(只更新提供的字段)
|
|
43
|
+
* @param id 要更新的数据的ID
|
|
44
|
+
* @param partialData 要更新的部分字段
|
|
45
|
+
* @returns Promise<T> 更新成功后返回完整的更新后数据
|
|
46
|
+
*/
|
|
47
|
+
partialUpdate<T extends {
|
|
48
|
+
id: IDBValidKey;
|
|
49
|
+
}>(id: IDBValidKey, partialData: Partial<T>): Promise<T>;
|
|
50
|
+
/**
|
|
51
|
+
* 根据 ID 读取数据
|
|
52
|
+
* @param id 数据的 ID
|
|
53
|
+
* @returns Promise<T | undefined> 找到的数据或 undefined
|
|
54
|
+
*/
|
|
55
|
+
get<T>(id: IDBValidKey): Promise<T | undefined>;
|
|
56
|
+
/**
|
|
57
|
+
* 根据 ID 删除数据
|
|
58
|
+
* @param id 要删除的数据的 ID
|
|
59
|
+
* @returns Promise<void>
|
|
60
|
+
*/
|
|
61
|
+
delete(id: IDBValidKey): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* 获取对象存储空间中的所有数据
|
|
64
|
+
* @returns Promise<T[]> 所有数据的数组
|
|
65
|
+
*/
|
|
66
|
+
getAll<T>(): Promise<T[]>;
|
|
67
|
+
/**
|
|
68
|
+
* 清空对象存储空间中的所有数据
|
|
69
|
+
* @returns Promise<void>
|
|
70
|
+
*/
|
|
71
|
+
clear(): Promise<void>;
|
|
72
|
+
}
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
export default class LocalStorageManager {
|
|
2
|
+
constructor();
|
|
2
3
|
/**
|
|
3
4
|
* 设置存储项
|
|
4
5
|
* @param {string} key - 存储键名
|
|
5
6
|
* @param {*} value - 存储值
|
|
6
7
|
* @param {number} [seconds] - 有效期(秒)
|
|
7
8
|
*/
|
|
8
|
-
set(key:
|
|
9
|
+
set(key: any, value: any, seconds?: any): void;
|
|
9
10
|
/**
|
|
10
11
|
* 获取存储项
|
|
11
12
|
* @param {string} key - 要获取的键名
|
|
12
13
|
* @returns {*|null} 存储值或null
|
|
13
14
|
*/
|
|
14
|
-
get(key:
|
|
15
|
+
get(key: any): any;
|
|
15
16
|
/**
|
|
16
17
|
* 获取原始存储数据(内部方法)
|
|
17
18
|
* @param {string} key - 要获取的键名
|
|
18
19
|
* @returns {Object|null} 包含值和过期时间的对象或null
|
|
19
20
|
*/
|
|
20
|
-
getRaw(key:
|
|
21
|
+
getRaw(key: any): any;
|
|
21
22
|
/**
|
|
22
23
|
* 删除指定存储项
|
|
23
24
|
* @param {string} key - 要删除的键名
|
|
24
25
|
*/
|
|
25
|
-
remove(key:
|
|
26
|
+
remove(key: any): void;
|
|
26
27
|
/**
|
|
27
28
|
* 清空所有存储项
|
|
28
29
|
*/
|
|
@@ -1,7 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Router } from 'vue-router';
|
|
2
2
|
/** 响应式数据对象 */
|
|
3
3
|
export declare class Data {
|
|
4
4
|
}
|
|
5
|
+
export interface LoginInfo {
|
|
6
|
+
[x: string]: any;
|
|
7
|
+
access_token: string;
|
|
8
|
+
refresh_token: string;
|
|
9
|
+
account: string;
|
|
10
|
+
nick_name: string;
|
|
11
|
+
real_name: string;
|
|
12
|
+
role_name: string;
|
|
13
|
+
role_id: string;
|
|
14
|
+
user_id: string;
|
|
15
|
+
user_name: string;
|
|
16
|
+
tenant_id: string;
|
|
17
|
+
outLogin?: boolean;
|
|
18
|
+
}
|
|
5
19
|
export interface Prop {
|
|
6
20
|
/** 应用id,平台提供*/
|
|
7
21
|
clientId: string;
|
|
@@ -12,30 +26,30 @@ export interface Prop {
|
|
|
12
26
|
/** 登陆服务的ip地址 */
|
|
13
27
|
loginServiceBaseAddress: string;
|
|
14
28
|
/** 路由对象 */
|
|
15
|
-
useRouter:
|
|
16
|
-
/**
|
|
29
|
+
useRouter: Router;
|
|
30
|
+
/** 强制模式 */
|
|
17
31
|
forceMode?: boolean;
|
|
18
|
-
/**
|
|
32
|
+
/** 应用名称,平台提供 */
|
|
33
|
+
clientName?: string;
|
|
34
|
+
/** 传入外部登陆token */
|
|
19
35
|
token?: string;
|
|
20
36
|
/** 是否启用组件,支持动态控制,非必填*/
|
|
21
37
|
isEnabled?: boolean;
|
|
22
|
-
/**
|
|
23
|
-
listenToken?: boolean;
|
|
24
|
-
/** 认证成功后的,非必填*/
|
|
38
|
+
/** 登陆认证成功后的跳转地址,非必填*/
|
|
25
39
|
redirectPath?: string;
|
|
26
|
-
/** local中保存token值的键名称,非必填*/
|
|
27
|
-
tokenName?: string;
|
|
28
|
-
/** token有效期,单位秒,非必填*/
|
|
29
|
-
tokenValidity?: number;
|
|
30
40
|
/** 租户id */
|
|
31
41
|
tenantId?: number | string;
|
|
32
|
-
/**
|
|
33
|
-
|
|
42
|
+
/** 显示执行日志 */
|
|
43
|
+
showLog?: boolean;
|
|
44
|
+
openDebugger?: boolean;
|
|
34
45
|
}
|
|
35
46
|
export interface Emits {
|
|
36
|
-
(e: 'loggingIn',
|
|
37
|
-
(e: 'loginFail', failInfo: any): void;
|
|
47
|
+
(e: 'loggingIn', code: String, loginInfo?: any): void;
|
|
38
48
|
(e: 'loginSuccess', loginInfo: {
|
|
39
49
|
[x: string]: any;
|
|
40
|
-
}): void;
|
|
50
|
+
} | null): void;
|
|
51
|
+
(e: 'loginFail', failInfo: any): void;
|
|
52
|
+
(e: 'tokenRefresh', loginInfo: {
|
|
53
|
+
[x: string]: any;
|
|
54
|
+
} | null): void;
|
|
41
55
|
}
|
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
import { Prop } from './data';
|
|
2
|
-
import { logout, getToken, getUserPermission } from './tools';
|
|
3
2
|
declare const _default: import('vue').DefineComponent<Prop, {
|
|
4
|
-
logout:
|
|
5
|
-
getToken:
|
|
6
|
-
|
|
3
|
+
logout: () => Promise<void>;
|
|
4
|
+
getToken: () => Promise<string>;
|
|
5
|
+
getLoginInfo: () => Promise<import('./data').LoginInfo>;
|
|
6
|
+
goLogin: () => Promise<void>;
|
|
7
7
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
8
|
-
loggingIn: (
|
|
9
|
-
loginFail: (failInfo: any) => any;
|
|
8
|
+
loggingIn: (code: String, loginInfo?: any) => any;
|
|
10
9
|
loginSuccess: (loginInfo: {
|
|
11
10
|
[x: string]: any;
|
|
12
11
|
}) => any;
|
|
12
|
+
loginFail: (failInfo: any) => any;
|
|
13
|
+
tokenRefresh: (loginInfo: {
|
|
14
|
+
[x: string]: any;
|
|
15
|
+
}) => any;
|
|
13
16
|
}, string, import('vue').PublicProps, Readonly<Prop> & Readonly<{
|
|
14
|
-
onLoggingIn?: (
|
|
15
|
-
onLoginFail?: (failInfo: any) => any;
|
|
17
|
+
onLoggingIn?: (code: String, loginInfo?: any) => any;
|
|
16
18
|
onLoginSuccess?: (loginInfo: {
|
|
17
19
|
[x: string]: any;
|
|
18
20
|
}) => any;
|
|
21
|
+
onLoginFail?: (failInfo: any) => any;
|
|
22
|
+
onTokenRefresh?: (loginInfo: {
|
|
23
|
+
[x: string]: any;
|
|
24
|
+
}) => any;
|
|
19
25
|
}>, {
|
|
20
|
-
tenantId: number | string;
|
|
21
26
|
forceMode: boolean;
|
|
22
27
|
isEnabled: boolean;
|
|
23
|
-
listenToken: boolean;
|
|
24
28
|
redirectPath: string;
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
tenantId: number | string;
|
|
30
|
+
showLog: boolean;
|
|
31
|
+
openDebugger: boolean;
|
|
27
32
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
28
33
|
export default _default;
|