@liujitcn/kratos-uni-app-core 0.0.82 → 0.0.83
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 +2 -0
- package/dist/module.mjs +4 -52
- package/package.json +1 -1
- package/src/locales/README.md +1 -1
- package/src/locales/en-US.json +1 -13
- package/src/locales/ja-JP.json +1 -13
- package/src/locales/zh-CN.json +1 -13
- package/src/locales/zh-TW.json +1 -13
- package/src/utils/http.ts +3 -2
- package/src/utils/navigation.ts +36 -5
- package/src/views/pages/login/login.vue +13 -15
package/README.md
CHANGED
|
@@ -43,6 +43,8 @@ packages/core
|
|
|
43
43
|
|
|
44
44
|
## 公开入口
|
|
45
45
|
|
|
46
|
+
登录页返回会清理本次回跳并替换到首页;直接打开登录页清理旧 `lastRoute`,登录成功默认进入首页。主动登录、路由守卫和会话过期重登通过 `redirect=1` 标记保留本次业务目标及查询参数,成功跳转后才清理目标。登录页每次显示都会检查有效登录态,已登录则替换回首页,避免浏览器回退重新停留在登录页。H5 与微信小程序统一使用 `reLaunch` 替换登录入口并重置应用页面栈。
|
|
47
|
+
|
|
46
48
|
- `@liujitcn/kratos-uni-app-core`:运行时、导航、store 和组件。
|
|
47
49
|
- `@liujitcn/kratos-uni-app-core/module`:模块协议和 core 模块。
|
|
48
50
|
- `@liujitcn/kratos-uni-app-core/vite`:Vite 配置、页面装配插件和构建错误文案格式化器。
|
package/dist/module.mjs
CHANGED
|
@@ -26,6 +26,7 @@ var corePages = {
|
|
|
26
26
|
|
|
27
27
|
// src/locales/zh-CN.json
|
|
28
28
|
var zh_CN_default = {
|
|
29
|
+
"common.action.back": "\u8FD4\u56DE",
|
|
29
30
|
"common.action.cancel": "\u53D6\u6D88",
|
|
30
31
|
"common.action.confirm": "\u786E\u5B9A",
|
|
31
32
|
"common.action.delete": "\u5220\u9664",
|
|
@@ -36,16 +37,11 @@ var zh_CN_default = {
|
|
|
36
37
|
"common.action.save": "\u4FDD\u5B58",
|
|
37
38
|
"common.action.view": "\u67E5\u770B",
|
|
38
39
|
"common.field.language": "\u8BED\u8A00",
|
|
39
|
-
"common.language.en-US": "English",
|
|
40
|
-
"common.language.zh-CN": "\u7B80\u4F53\u4E2D\u6587",
|
|
41
|
-
"common.language.zh-TW": "\u7E41\u4F53\u4E2D\u6587",
|
|
42
|
-
"common.language.ja-JP": "\u65E5\u8BED",
|
|
43
40
|
"common.message.loading": "\u6B63\u5728\u52A0\u8F7D",
|
|
44
41
|
"common.message.network_error": "\u7F51\u7EDC\u9519\u8BEF\uFF0C\u6362\u4E2A\u7F51\u7EDC\u8BD5\u8BD5",
|
|
45
42
|
"common.message.request_error": "\u8BF7\u6C42\u9519\u8BEF",
|
|
46
43
|
"common.message.unknown": "\u6682\u65F6\u65E0\u6CD5\u5904\u7406\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",
|
|
47
44
|
"common.title.notice": "\u63D0\u793A",
|
|
48
|
-
"core.auth.login_again": "\u91CD\u65B0\u767B\u5F55",
|
|
49
45
|
"core.auth.session_expired": "\u5F53\u524D\u9875\u9762\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55",
|
|
50
46
|
"core.config.missing": "\u79FB\u52A8\u7AEF\u914D\u7F6E\u7F3A\u5931\uFF1A{names}",
|
|
51
47
|
"core.crypto.base64_decode_unsupported": "\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301 Base64 \u89E3\u7801",
|
|
@@ -96,7 +92,6 @@ var zh_CN_default = {
|
|
|
96
92
|
"core.login.mfa_recovery_code": "\u6062\u590D\u7801\uFF08\u53EF\u9009\uFF09",
|
|
97
93
|
"core.login.mfa_setup_title": "\u7ED1\u5B9A\u591A\u56E0\u7D20\u8BA4\u8BC1",
|
|
98
94
|
"core.login.mfa_copy_uri": "\u590D\u5236\u7ED1\u5B9A\u5730\u5740",
|
|
99
|
-
"core.login.mfa_copy_success": "\u7ED1\u5B9A\u5730\u5740\u5DF2\u590D\u5236",
|
|
100
95
|
"core.login.mfa_recovery_codes_copied": "\u6062\u590D\u7801\u5DF2\u590D\u5236",
|
|
101
96
|
"core.login.mfa_recovery_codes_title": "\u4FDD\u5B58 MFA \u6062\u590D\u7801",
|
|
102
97
|
"core.login.mfa_recovery_codes_warning": "\u6BCF\u4E2A\u6062\u590D\u7801\u53EA\u80FD\u4F7F\u7528\u4E00\u6B21\uFF0C\u6B64\u5F39\u7A97\u5173\u95ED\u540E\u4E0D\u4F1A\u518D\u6B21\u663E\u793A\u3002",
|
|
@@ -169,14 +164,7 @@ var zh_CN_default = {
|
|
|
169
164
|
"core.webview.embed_blocked": "\u5F53\u524D H5 \u9875\u9762\u53EF\u80FD\u88AB\u76EE\u6807\u7AD9\u70B9\u9650\u5236\u5D4C\u5165",
|
|
170
165
|
"core.webview.invalid_url": "\u7F3A\u5C11\u6709\u6548\u94FE\u63A5\u5730\u5740",
|
|
171
166
|
"core.webview.open_failed": "\u94FE\u63A5\u65E0\u6CD5\u6253\u5F00",
|
|
172
|
-
"common.value.top_level": "\u9876\u7EA7\u8282\u70B9",
|
|
173
|
-
"common.resource.default": "{resource}",
|
|
174
|
-
"common.action.delete_resource": "\u5220\u9664{resource}",
|
|
175
|
-
"common.action.set_field_status": "\u8BBE\u7F6E{field}",
|
|
176
167
|
"common.action.load_more": "\u52A0\u8F7D\u66F4\u591A",
|
|
177
|
-
"common.status.loading": "\u52A0\u8F7D\u4E2D\u2026",
|
|
178
|
-
"core.navigation.analytics": "\u5206\u6790",
|
|
179
|
-
"core.navigation.report": "\u62A5\u8868",
|
|
180
168
|
"core.settings.theme": "\u4E3B\u9898\u5916\u89C2",
|
|
181
169
|
"core.theme.auto": "\u8DDF\u968F\u7CFB\u7EDF",
|
|
182
170
|
"core.theme.dark": "\u6697\u9ED1",
|
|
@@ -185,6 +173,7 @@ var zh_CN_default = {
|
|
|
185
173
|
|
|
186
174
|
// src/locales/en-US.json
|
|
187
175
|
var en_US_default = {
|
|
176
|
+
"common.action.back": "Back",
|
|
188
177
|
"common.action.cancel": "Cancel",
|
|
189
178
|
"common.action.confirm": "Confirm",
|
|
190
179
|
"common.action.delete": "Delete",
|
|
@@ -195,16 +184,11 @@ var en_US_default = {
|
|
|
195
184
|
"common.action.save": "Save",
|
|
196
185
|
"common.action.view": "View",
|
|
197
186
|
"common.field.language": "Language",
|
|
198
|
-
"common.language.en-US": "English",
|
|
199
|
-
"common.language.zh-CN": "\u7B80\u4F53\u4E2D\u6587",
|
|
200
|
-
"common.language.zh-TW": "Traditional Chinese",
|
|
201
|
-
"common.language.ja-JP": "Japanese",
|
|
202
187
|
"common.message.loading": "Loading",
|
|
203
188
|
"common.message.network_error": "Network error. Check your connection and try again.",
|
|
204
189
|
"common.message.request_error": "Request failed",
|
|
205
190
|
"common.message.unknown": "Unable to process this request. Try again later.",
|
|
206
191
|
"common.title.notice": "Notice",
|
|
207
|
-
"core.auth.login_again": "Log in again",
|
|
208
192
|
"core.auth.session_expired": "Your session has expired. Please log in again.",
|
|
209
193
|
"core.config.missing": "Missing app configuration: {names}",
|
|
210
194
|
"core.crypto.base64_decode_unsupported": "Base64 decoding is not supported in this environment",
|
|
@@ -255,7 +239,6 @@ var en_US_default = {
|
|
|
255
239
|
"core.login.mfa_recovery_code": "Recovery code (optional)",
|
|
256
240
|
"core.login.mfa_setup_title": "Bind multi-factor authentication",
|
|
257
241
|
"core.login.mfa_copy_uri": "Copy binding address",
|
|
258
|
-
"core.login.mfa_copy_success": "Binding address copied",
|
|
259
242
|
"core.login.mfa_recovery_codes_copied": "Recovery codes copied",
|
|
260
243
|
"core.login.mfa_recovery_codes_title": "Save MFA recovery codes",
|
|
261
244
|
"core.login.mfa_recovery_codes_warning": "Each code works once and will not be shown again after this dialog closes.",
|
|
@@ -328,14 +311,7 @@ var en_US_default = {
|
|
|
328
311
|
"core.webview.embed_blocked": "The destination may block embedding on H5",
|
|
329
312
|
"core.webview.invalid_url": "No valid link was provided",
|
|
330
313
|
"core.webview.open_failed": "Unable to open link",
|
|
331
|
-
"common.value.top_level": "Top level",
|
|
332
|
-
"common.resource.default": "{resource}",
|
|
333
|
-
"common.action.delete_resource": "Delete {resource}",
|
|
334
|
-
"common.action.set_field_status": "Set {field}",
|
|
335
314
|
"common.action.load_more": "Load more",
|
|
336
|
-
"common.status.loading": "Loading\u2026",
|
|
337
|
-
"core.navigation.analytics": "Analytics",
|
|
338
|
-
"core.navigation.report": "Reports",
|
|
339
315
|
"core.settings.theme": "Theme Appearance",
|
|
340
316
|
"core.theme.auto": "Follow System",
|
|
341
317
|
"core.theme.dark": "Dark",
|
|
@@ -344,6 +320,7 @@ var en_US_default = {
|
|
|
344
320
|
|
|
345
321
|
// src/locales/ja-JP.json
|
|
346
322
|
var ja_JP_default = {
|
|
323
|
+
"common.action.back": "\u623B\u308B",
|
|
347
324
|
"common.action.cancel": "\u30AD\u30E3\u30F3\u30BB\u30EB",
|
|
348
325
|
"common.action.confirm": "OK",
|
|
349
326
|
"common.action.delete": "\u524A\u9664",
|
|
@@ -354,16 +331,11 @@ var ja_JP_default = {
|
|
|
354
331
|
"common.action.save": "\u4FDD\u5B58",
|
|
355
332
|
"common.action.view": "\u8868\u793A",
|
|
356
333
|
"common.field.language": "\u8A00\u8A9E",
|
|
357
|
-
"common.language.en-US": "\u82F1\u8A9E",
|
|
358
|
-
"common.language.zh-CN": "\u7C21\u4F53\u5B57\u4E2D\u56FD\u8A9E",
|
|
359
|
-
"common.language.zh-TW": "\u7E41\u4F53\u5B57\u4E2D\u56FD\u8A9E",
|
|
360
|
-
"common.language.ja-JP": "\u65E5\u672C\u8A9E",
|
|
361
334
|
"common.message.loading": "\u3092\u30ED\u30FC\u30C9\u4E2D\u3067\u3059",
|
|
362
335
|
"common.message.network_error": "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF \u30A8\u30E9\u30FC\u3002\u5225\u306E\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A66\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
363
336
|
"common.message.request_error": "\u30EA\u30AF\u30A8\u30B9\u30C8\u30A8\u30E9\u30FC",
|
|
364
337
|
"common.message.unknown": "\u73FE\u5728\u51E6\u7406\u3067\u304D\u307E\u305B\u3093\u3002\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",
|
|
365
338
|
"common.title.notice": "\u30D2\u30F3\u30C8",
|
|
366
|
-
"core.auth.login_again": "\u518D\u5EA6\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
367
339
|
"core.auth.session_expired": "\u73FE\u5728\u306E\u30DA\u30FC\u30B8\u306F\u7121\u52B9\u3067\u3059\u3002\u518D\u5EA6\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
368
340
|
"core.config.missing": "\u30E2\u30D0\u30A4\u30EB\u7AEF\u672B\u306E\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093: {names}",
|
|
369
341
|
"core.crypto.base64_decode_unsupported": "\u73FE\u5728\u306E\u74B0\u5883\u306F Base64 \u30C7\u30B3\u30FC\u30C9\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u3066\u3044\u307E\u305B\u3093",
|
|
@@ -414,7 +386,6 @@ var ja_JP_default = {
|
|
|
414
386
|
"core.login.mfa_recovery_code": "\u30EA\u30AB\u30D0\u30EA\u30FC\u30B3\u30FC\u30C9\uFF08\u4EFB\u610F\uFF09",
|
|
415
387
|
"core.login.mfa_setup_title": "\u591A\u8981\u7D20\u8A8D\u8A3C\u3092\u8A2D\u5B9A",
|
|
416
388
|
"core.login.mfa_copy_uri": "\u767B\u9332\u30A2\u30C9\u30EC\u30B9\u3092\u30B3\u30D4\u30FC",
|
|
417
|
-
"core.login.mfa_copy_success": "\u767B\u9332\u30A2\u30C9\u30EC\u30B9\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",
|
|
418
389
|
"core.login.mfa_recovery_codes_copied": "\u30EA\u30AB\u30D0\u30EA\u30FC\u30B3\u30FC\u30C9\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",
|
|
419
390
|
"core.login.mfa_recovery_codes_title": "MFA \u30EA\u30AB\u30D0\u30EA\u30FC\u30B3\u30FC\u30C9\u3092\u4FDD\u5B58",
|
|
420
391
|
"core.login.mfa_recovery_codes_warning": "\u5404\u30B3\u30FC\u30C9\u306F\u4E00\u5EA6\u3060\u3051\u4F7F\u7528\u3067\u304D\u3001\u30C0\u30A4\u30A2\u30ED\u30B0\u3092\u9589\u3058\u308B\u3068\u518D\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002",
|
|
@@ -487,14 +458,7 @@ var ja_JP_default = {
|
|
|
487
458
|
"core.webview.embed_blocked": "\u73FE\u5728\u306E H5 \u30DA\u30FC\u30B8\u306F\u3001\u30BF\u30FC\u30B2\u30C3\u30C8 \u30B5\u30A4\u30C8\u306B\u3088\u3063\u3066\u57CB\u3081\u8FBC\u307F\u304C\u5236\u9650\u3055\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059",
|
|
488
459
|
"core.webview.invalid_url": "\u6709\u52B9\u306A\u30EA\u30F3\u30AF \u30A2\u30C9\u30EC\u30B9\u304C\u3042\u308A\u307E\u305B\u3093",
|
|
489
460
|
"core.webview.open_failed": "\u30EA\u30F3\u30AF\u3092\u958B\u3051\u307E\u305B\u3093",
|
|
490
|
-
"common.value.top_level": "\u30C8\u30C3\u30D7\u30EC\u30D9\u30EB",
|
|
491
|
-
"common.resource.default": "{resource}",
|
|
492
|
-
"common.action.delete_resource": "{resource}\u3092\u524A\u9664",
|
|
493
|
-
"common.action.set_field_status": "{field}\u3092\u8A2D\u5B9A",
|
|
494
461
|
"common.action.load_more": "\u3055\u3089\u306B\u8AAD\u307F\u8FBC\u3080",
|
|
495
|
-
"common.status.loading": "\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026",
|
|
496
|
-
"core.navigation.analytics": "\u5206\u6790",
|
|
497
|
-
"core.navigation.report": "\u30EC\u30DD\u30FC\u30C8",
|
|
498
462
|
"core.settings.theme": "\u30C6\u30FC\u30DE\u5916\u89B3",
|
|
499
463
|
"core.theme.auto": "\u30B7\u30B9\u30C6\u30E0\u306B\u5F93\u3046",
|
|
500
464
|
"core.theme.dark": "\u30C0\u30FC\u30AF",
|
|
@@ -503,6 +467,7 @@ var ja_JP_default = {
|
|
|
503
467
|
|
|
504
468
|
// src/locales/zh-TW.json
|
|
505
469
|
var zh_TW_default = {
|
|
470
|
+
"common.action.back": "\u8FD4\u56DE",
|
|
506
471
|
"common.action.cancel": "\u53D6\u6D88",
|
|
507
472
|
"common.action.confirm": "\u78BA\u5B9A",
|
|
508
473
|
"common.action.delete": "\u522A\u9664",
|
|
@@ -513,16 +478,11 @@ var zh_TW_default = {
|
|
|
513
478
|
"common.action.save": "\u5132\u5B58",
|
|
514
479
|
"common.action.view": "\u6AA2\u8996",
|
|
515
480
|
"common.field.language": "\u8A9E\u8A00",
|
|
516
|
-
"common.language.en-US": "English",
|
|
517
|
-
"common.language.zh-CN": "\u7C21\u9AD4\u4E2D\u6587",
|
|
518
|
-
"common.language.zh-TW": "\u7E41\u9AD4\u4E2D\u6587",
|
|
519
|
-
"common.language.ja-JP": "\u65E5\u8A9E",
|
|
520
481
|
"common.message.loading": "\u6B63\u5728\u8F09\u5165",
|
|
521
482
|
"common.message.network_error": "\u7DB2\u8DEF\u932F\u8AA4\uFF0C\u63DB\u500B\u7DB2\u8DEF\u8A66\u8A66",
|
|
522
483
|
"common.message.request_error": "\u8ACB\u6C42\u932F\u8AA4",
|
|
523
484
|
"common.message.unknown": "\u66AB\u6642\u7121\u6CD5\u8655\u7406\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",
|
|
524
485
|
"common.title.notice": "\u63D0\u793A",
|
|
525
|
-
"core.auth.login_again": "\u91CD\u65B0\u767B\u5165",
|
|
526
486
|
"core.auth.session_expired": "\u7576\u524D\u9801\u9762\u5DF2\u5931\u6548\uFF0C\u8ACB\u91CD\u65B0\u767B\u5165",
|
|
527
487
|
"core.config.missing": "\u79FB\u52D5\u7AEF\u914D\u7F6E\u7F3A\u5931\uFF1A{names}",
|
|
528
488
|
"core.crypto.base64_decode_unsupported": "\u7576\u524D\u74B0\u5883\u4E0D\u652F\u63F4 Base64 \u89E3\u78BC",
|
|
@@ -573,7 +533,6 @@ var zh_TW_default = {
|
|
|
573
533
|
"core.login.mfa_recovery_code": "\u6062\u5FA9\u78BC\uFF08\u53EF\u9078\uFF09",
|
|
574
534
|
"core.login.mfa_setup_title": "\u7D81\u5B9A\u591A\u56E0\u7D20\u8A8D\u8B49",
|
|
575
535
|
"core.login.mfa_copy_uri": "\u8907\u88FD\u7D81\u5B9A\u5730\u5740",
|
|
576
|
-
"core.login.mfa_copy_success": "\u7D81\u5B9A\u5730\u5740\u5DF2\u8907\u88FD",
|
|
577
536
|
"core.login.mfa_recovery_codes_copied": "\u6062\u5FA9\u78BC\u5DF2\u8907\u88FD",
|
|
578
537
|
"core.login.mfa_recovery_codes_title": "\u5132\u5B58 MFA \u6062\u5FA9\u78BC",
|
|
579
538
|
"core.login.mfa_recovery_codes_warning": "\u6BCF\u500B\u6062\u5FA9\u78BC\u53EA\u80FD\u4F7F\u7528\u4E00\u6B21\uFF0C\u95DC\u9589\u6B64\u8996\u7A97\u5F8C\u4E0D\u6703\u518D\u6B21\u986F\u793A\u3002",
|
|
@@ -646,14 +605,7 @@ var zh_TW_default = {
|
|
|
646
605
|
"core.webview.embed_blocked": "\u7576\u524D H5 \u9801\u9762\u53EF\u80FD\u88AB\u76EE\u6A19\u7AD9\u9EDE\u9650\u5236\u5D4C\u5165",
|
|
647
606
|
"core.webview.invalid_url": "\u7F3A\u5C11\u6709\u6548\u9023\u7D50\u5730\u5740",
|
|
648
607
|
"core.webview.open_failed": "\u9023\u7D50\u7121\u6CD5\u958B\u555F",
|
|
649
|
-
"common.value.top_level": "\u9802\u7D1A\u7BC0\u9EDE",
|
|
650
|
-
"common.resource.default": "{resource}",
|
|
651
|
-
"common.action.delete_resource": "\u522A\u9664{resource}",
|
|
652
|
-
"common.action.set_field_status": "\u8A2D\u5B9A{field}",
|
|
653
608
|
"common.action.load_more": "\u8F09\u5165\u66F4\u591A",
|
|
654
|
-
"common.status.loading": "\u8F09\u5165\u4E2D\u2026",
|
|
655
|
-
"core.navigation.analytics": "\u5206\u6790",
|
|
656
|
-
"core.navigation.report": "\u5831\u8868",
|
|
657
609
|
"core.settings.theme": "\u4E3B\u984C\u5916\u89C0",
|
|
658
610
|
"core.theme.auto": "\u8DDF\u96A8\u7CFB\u7D71",
|
|
659
611
|
"core.theme.dark": "\u6697\u9ED1",
|
package/package.json
CHANGED
package/src/locales/README.md
CHANGED
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
| `en-US.json` | 英文 Core 语言包。 | uni-app 切换为英文时使用。 |
|
|
10
10
|
| `ja-JP.json` | 日文 Core 语言包。 | uni-app 切换为日文时使用。 |
|
|
11
11
|
|
|
12
|
-
语言包是标准 JSON,不能在文件内直接写注释;公共键使用 `common.` 或 `core.` 命名空间。新增语言后执行仓库根目录的 `make i18n`。语言切换选项固定显示后端 `base_language.native_name
|
|
12
|
+
语言包是标准 JSON,不能在文件内直接写注释;公共键使用 `common.` 或 `core.` 命名空间。新增语言后执行仓库根目录的 `make i18n`。语言切换选项固定显示后端 `base_language.native_name`,接口不可用时使用代码内置的原生名称;语言迁移初始名称来自管理端 Core 的 `common.language.*`。新增语言的完整文件清单见[国际化设计与语言扩展](../../../../../../docs/国际化设计与语言扩展.md)。
|
package/src/locales/en-US.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"common.action.back": "Back",
|
|
2
3
|
"common.action.cancel": "Cancel",
|
|
3
4
|
"common.action.confirm": "Confirm",
|
|
4
5
|
"common.action.delete": "Delete",
|
|
@@ -9,16 +10,11 @@
|
|
|
9
10
|
"common.action.save": "Save",
|
|
10
11
|
"common.action.view": "View",
|
|
11
12
|
"common.field.language": "Language",
|
|
12
|
-
"common.language.en-US": "English",
|
|
13
|
-
"common.language.zh-CN": "简体中文",
|
|
14
|
-
"common.language.zh-TW": "Traditional Chinese",
|
|
15
|
-
"common.language.ja-JP": "Japanese",
|
|
16
13
|
"common.message.loading": "Loading",
|
|
17
14
|
"common.message.network_error": "Network error. Check your connection and try again.",
|
|
18
15
|
"common.message.request_error": "Request failed",
|
|
19
16
|
"common.message.unknown": "Unable to process this request. Try again later.",
|
|
20
17
|
"common.title.notice": "Notice",
|
|
21
|
-
"core.auth.login_again": "Log in again",
|
|
22
18
|
"core.auth.session_expired": "Your session has expired. Please log in again.",
|
|
23
19
|
"core.config.missing": "Missing app configuration: {names}",
|
|
24
20
|
"core.crypto.base64_decode_unsupported": "Base64 decoding is not supported in this environment",
|
|
@@ -69,7 +65,6 @@
|
|
|
69
65
|
"core.login.mfa_recovery_code": "Recovery code (optional)",
|
|
70
66
|
"core.login.mfa_setup_title": "Bind multi-factor authentication",
|
|
71
67
|
"core.login.mfa_copy_uri": "Copy binding address",
|
|
72
|
-
"core.login.mfa_copy_success": "Binding address copied",
|
|
73
68
|
"core.login.mfa_recovery_codes_copied": "Recovery codes copied",
|
|
74
69
|
"core.login.mfa_recovery_codes_title": "Save MFA recovery codes",
|
|
75
70
|
"core.login.mfa_recovery_codes_warning": "Each code works once and will not be shown again after this dialog closes.",
|
|
@@ -142,14 +137,7 @@
|
|
|
142
137
|
"core.webview.embed_blocked": "The destination may block embedding on H5",
|
|
143
138
|
"core.webview.invalid_url": "No valid link was provided",
|
|
144
139
|
"core.webview.open_failed": "Unable to open link",
|
|
145
|
-
"common.value.top_level": "Top level",
|
|
146
|
-
"common.resource.default": "{resource}",
|
|
147
|
-
"common.action.delete_resource": "Delete {resource}",
|
|
148
|
-
"common.action.set_field_status": "Set {field}",
|
|
149
140
|
"common.action.load_more": "Load more",
|
|
150
|
-
"common.status.loading": "Loading…",
|
|
151
|
-
"core.navigation.analytics": "Analytics",
|
|
152
|
-
"core.navigation.report": "Reports",
|
|
153
141
|
"core.settings.theme": "Theme Appearance",
|
|
154
142
|
"core.theme.auto": "Follow System",
|
|
155
143
|
"core.theme.dark": "Dark",
|
package/src/locales/ja-JP.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"common.action.back": "戻る",
|
|
2
3
|
"common.action.cancel": "キャンセル",
|
|
3
4
|
"common.action.confirm": "OK",
|
|
4
5
|
"common.action.delete": "削除",
|
|
@@ -9,16 +10,11 @@
|
|
|
9
10
|
"common.action.save": "保存",
|
|
10
11
|
"common.action.view": "表示",
|
|
11
12
|
"common.field.language": "言語",
|
|
12
|
-
"common.language.en-US": "英語",
|
|
13
|
-
"common.language.zh-CN": "簡体字中国語",
|
|
14
|
-
"common.language.zh-TW": "繁体字中国語",
|
|
15
|
-
"common.language.ja-JP": "日本語",
|
|
16
13
|
"common.message.loading": "をロード中です",
|
|
17
14
|
"common.message.network_error": "ネットワーク エラー。別のネットワークを試してください",
|
|
18
15
|
"common.message.request_error": "リクエストエラー",
|
|
19
16
|
"common.message.unknown": "現在処理できません。後でもう一度お試しください。",
|
|
20
17
|
"common.title.notice": "ヒント",
|
|
21
|
-
"core.auth.login_again": "再度ログインしてください",
|
|
22
18
|
"core.auth.session_expired": "現在のページは無効です。再度ログインしてください。",
|
|
23
19
|
"core.config.missing": "モバイル端末の設定がありません: {names}",
|
|
24
20
|
"core.crypto.base64_decode_unsupported": "現在の環境は Base64 デコードをサポートしていません",
|
|
@@ -69,7 +65,6 @@
|
|
|
69
65
|
"core.login.mfa_recovery_code": "リカバリーコード(任意)",
|
|
70
66
|
"core.login.mfa_setup_title": "多要素認証を設定",
|
|
71
67
|
"core.login.mfa_copy_uri": "登録アドレスをコピー",
|
|
72
|
-
"core.login.mfa_copy_success": "登録アドレスをコピーしました",
|
|
73
68
|
"core.login.mfa_recovery_codes_copied": "リカバリーコードをコピーしました",
|
|
74
69
|
"core.login.mfa_recovery_codes_title": "MFA リカバリーコードを保存",
|
|
75
70
|
"core.login.mfa_recovery_codes_warning": "各コードは一度だけ使用でき、ダイアログを閉じると再表示されません。",
|
|
@@ -142,14 +137,7 @@
|
|
|
142
137
|
"core.webview.embed_blocked": "現在の H5 ページは、ターゲット サイトによって埋め込みが制限されている可能性があります",
|
|
143
138
|
"core.webview.invalid_url": "有効なリンク アドレスがありません",
|
|
144
139
|
"core.webview.open_failed": "リンクを開けません",
|
|
145
|
-
"common.value.top_level": "トップレベル",
|
|
146
|
-
"common.resource.default": "{resource}",
|
|
147
|
-
"common.action.delete_resource": "{resource}を削除",
|
|
148
|
-
"common.action.set_field_status": "{field}を設定",
|
|
149
140
|
"common.action.load_more": "さらに読み込む",
|
|
150
|
-
"common.status.loading": "読み込み中…",
|
|
151
|
-
"core.navigation.analytics": "分析",
|
|
152
|
-
"core.navigation.report": "レポート",
|
|
153
141
|
"core.settings.theme": "テーマ外観",
|
|
154
142
|
"core.theme.auto": "システムに従う",
|
|
155
143
|
"core.theme.dark": "ダーク",
|
package/src/locales/zh-CN.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"common.action.back": "返回",
|
|
2
3
|
"common.action.cancel": "取消",
|
|
3
4
|
"common.action.confirm": "确定",
|
|
4
5
|
"common.action.delete": "删除",
|
|
@@ -9,16 +10,11 @@
|
|
|
9
10
|
"common.action.save": "保存",
|
|
10
11
|
"common.action.view": "查看",
|
|
11
12
|
"common.field.language": "语言",
|
|
12
|
-
"common.language.en-US": "English",
|
|
13
|
-
"common.language.zh-CN": "简体中文",
|
|
14
|
-
"common.language.zh-TW": "繁体中文",
|
|
15
|
-
"common.language.ja-JP": "日语",
|
|
16
13
|
"common.message.loading": "正在加载",
|
|
17
14
|
"common.message.network_error": "网络错误,换个网络试试",
|
|
18
15
|
"common.message.request_error": "请求错误",
|
|
19
16
|
"common.message.unknown": "暂时无法处理,请稍后重试",
|
|
20
17
|
"common.title.notice": "提示",
|
|
21
|
-
"core.auth.login_again": "重新登录",
|
|
22
18
|
"core.auth.session_expired": "当前页面已失效,请重新登录",
|
|
23
19
|
"core.config.missing": "移动端配置缺失:{names}",
|
|
24
20
|
"core.crypto.base64_decode_unsupported": "当前环境不支持 Base64 解码",
|
|
@@ -69,7 +65,6 @@
|
|
|
69
65
|
"core.login.mfa_recovery_code": "恢复码(可选)",
|
|
70
66
|
"core.login.mfa_setup_title": "绑定多因素认证",
|
|
71
67
|
"core.login.mfa_copy_uri": "复制绑定地址",
|
|
72
|
-
"core.login.mfa_copy_success": "绑定地址已复制",
|
|
73
68
|
"core.login.mfa_recovery_codes_copied": "恢复码已复制",
|
|
74
69
|
"core.login.mfa_recovery_codes_title": "保存 MFA 恢复码",
|
|
75
70
|
"core.login.mfa_recovery_codes_warning": "每个恢复码只能使用一次,此弹窗关闭后不会再次显示。",
|
|
@@ -142,14 +137,7 @@
|
|
|
142
137
|
"core.webview.embed_blocked": "当前 H5 页面可能被目标站点限制嵌入",
|
|
143
138
|
"core.webview.invalid_url": "缺少有效链接地址",
|
|
144
139
|
"core.webview.open_failed": "链接无法打开",
|
|
145
|
-
"common.value.top_level": "顶级节点",
|
|
146
|
-
"common.resource.default": "{resource}",
|
|
147
|
-
"common.action.delete_resource": "删除{resource}",
|
|
148
|
-
"common.action.set_field_status": "设置{field}",
|
|
149
140
|
"common.action.load_more": "加载更多",
|
|
150
|
-
"common.status.loading": "加载中…",
|
|
151
|
-
"core.navigation.analytics": "分析",
|
|
152
|
-
"core.navigation.report": "报表",
|
|
153
141
|
"core.settings.theme": "主题外观",
|
|
154
142
|
"core.theme.auto": "跟随系统",
|
|
155
143
|
"core.theme.dark": "暗黑",
|
package/src/locales/zh-TW.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"common.action.back": "返回",
|
|
2
3
|
"common.action.cancel": "取消",
|
|
3
4
|
"common.action.confirm": "確定",
|
|
4
5
|
"common.action.delete": "刪除",
|
|
@@ -9,16 +10,11 @@
|
|
|
9
10
|
"common.action.save": "儲存",
|
|
10
11
|
"common.action.view": "檢視",
|
|
11
12
|
"common.field.language": "語言",
|
|
12
|
-
"common.language.en-US": "English",
|
|
13
|
-
"common.language.zh-CN": "簡體中文",
|
|
14
|
-
"common.language.zh-TW": "繁體中文",
|
|
15
|
-
"common.language.ja-JP": "日語",
|
|
16
13
|
"common.message.loading": "正在載入",
|
|
17
14
|
"common.message.network_error": "網路錯誤,換個網路試試",
|
|
18
15
|
"common.message.request_error": "請求錯誤",
|
|
19
16
|
"common.message.unknown": "暫時無法處理,請稍後重試",
|
|
20
17
|
"common.title.notice": "提示",
|
|
21
|
-
"core.auth.login_again": "重新登入",
|
|
22
18
|
"core.auth.session_expired": "當前頁面已失效,請重新登入",
|
|
23
19
|
"core.config.missing": "移動端配置缺失:{names}",
|
|
24
20
|
"core.crypto.base64_decode_unsupported": "當前環境不支援 Base64 解碼",
|
|
@@ -69,7 +65,6 @@
|
|
|
69
65
|
"core.login.mfa_recovery_code": "恢復碼(可選)",
|
|
70
66
|
"core.login.mfa_setup_title": "綁定多因素認證",
|
|
71
67
|
"core.login.mfa_copy_uri": "複製綁定地址",
|
|
72
|
-
"core.login.mfa_copy_success": "綁定地址已複製",
|
|
73
68
|
"core.login.mfa_recovery_codes_copied": "恢復碼已複製",
|
|
74
69
|
"core.login.mfa_recovery_codes_title": "儲存 MFA 恢復碼",
|
|
75
70
|
"core.login.mfa_recovery_codes_warning": "每個恢復碼只能使用一次,關閉此視窗後不會再次顯示。",
|
|
@@ -142,14 +137,7 @@
|
|
|
142
137
|
"core.webview.embed_blocked": "當前 H5 頁面可能被目標站點限制嵌入",
|
|
143
138
|
"core.webview.invalid_url": "缺少有效連結地址",
|
|
144
139
|
"core.webview.open_failed": "連結無法開啟",
|
|
145
|
-
"common.value.top_level": "頂級節點",
|
|
146
|
-
"common.resource.default": "{resource}",
|
|
147
|
-
"common.action.delete_resource": "刪除{resource}",
|
|
148
|
-
"common.action.set_field_status": "設定{field}",
|
|
149
140
|
"common.action.load_more": "載入更多",
|
|
150
|
-
"common.status.loading": "載入中…",
|
|
151
|
-
"core.navigation.analytics": "分析",
|
|
152
|
-
"core.navigation.report": "報表",
|
|
153
141
|
"core.settings.theme": "主題外觀",
|
|
154
142
|
"core.theme.auto": "跟隨系統",
|
|
155
143
|
"core.theme.dark": "暗黑",
|
package/src/utils/http.ts
CHANGED
|
@@ -467,15 +467,16 @@ function silentClearAuthData() {
|
|
|
467
467
|
uni.$emit(AUTH_SILENT_LOGOUT_EVENT)
|
|
468
468
|
}
|
|
469
469
|
|
|
470
|
+
/** 清理失效认证并进入携带本次业务回跳标记的登录页。 */
|
|
470
471
|
async function clearUserData() {
|
|
471
472
|
clearToken()
|
|
472
473
|
uni.removeStorageSync('user')
|
|
473
474
|
saveCurrentRoute()
|
|
474
475
|
// token 失效时直接重启页面栈,避免小程序历史页残留。
|
|
475
476
|
uni.reLaunch({
|
|
476
|
-
url: '/pages/login/login',
|
|
477
|
+
url: '/pages/login/login?redirect=1',
|
|
477
478
|
fail: () => {
|
|
478
|
-
uni.redirectTo({ url: '/pages/login/login' })
|
|
479
|
+
uni.redirectTo({ url: '/pages/login/login?redirect=1' })
|
|
479
480
|
},
|
|
480
481
|
})
|
|
481
482
|
}
|
package/src/utils/navigation.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { hasValidToken } from './auth'
|
|
2
|
+
|
|
1
3
|
/** 登录前暂存的目标路由。 */
|
|
2
4
|
const LAST_ROUTE_KEY = 'lastRoute'
|
|
3
5
|
/** 登录页路径。 */
|
|
4
6
|
const LOGIN_PAGE = '/pages/login/login'
|
|
7
|
+
/** 携带本次回跳标记的登录入口。 */
|
|
8
|
+
const LOGIN_REDIRECT_PAGE = `${LOGIN_PAGE}?redirect=1`
|
|
5
9
|
/** 首页 tab 页面路径。 */
|
|
6
10
|
export const homeTabPage = '/pages/index/index'
|
|
7
11
|
|
|
@@ -47,7 +51,6 @@ const getCurrentRouteUrl = () => {
|
|
|
47
51
|
export const saveCurrentRoute = () => {
|
|
48
52
|
const currentRoute = getCurrentRouteUrl()
|
|
49
53
|
if (!currentRoute || currentRoute.startsWith(LOGIN_PAGE)) {
|
|
50
|
-
uni.removeStorageSync(LAST_ROUTE_KEY)
|
|
51
54
|
return
|
|
52
55
|
}
|
|
53
56
|
uni.setStorageSync(LAST_ROUTE_KEY, currentRoute)
|
|
@@ -61,6 +64,34 @@ export const saveLoginRedirectUrl = (url: string) => {
|
|
|
61
64
|
}
|
|
62
65
|
}
|
|
63
66
|
|
|
67
|
+
/** prepareLoginPage 清理直接访问的旧目标,已登录时替换回首页。 */
|
|
68
|
+
export const prepareLoginPage = (redirect?: string): boolean => {
|
|
69
|
+
if (redirect !== '1') uni.removeStorageSync(LAST_ROUTE_KEY)
|
|
70
|
+
if (!hasValidToken()) return true
|
|
71
|
+
void returnFromLogin()
|
|
72
|
+
return false
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** returnFromLogin 结束本次登录入口并替换到首页,避免返回受保护页面。 */
|
|
76
|
+
export const returnFromLogin = async (): Promise<void> => {
|
|
77
|
+
uni.removeStorageSync(LAST_ROUTE_KEY)
|
|
78
|
+
uni.setStorageSync('SwitchTabIndex', true)
|
|
79
|
+
await uni.reLaunch({ url: homeTabPage })
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** restoreLoginRedirect 替换到本次访问目标,跳转成功后才清理保存的地址。 */
|
|
83
|
+
export const restoreLoginRedirect = async (): Promise<void> => {
|
|
84
|
+
const savedRoute = uni.getStorageSync(LAST_ROUTE_KEY) || ''
|
|
85
|
+
const normalizedRoute = `/${savedRoute.replace(/^\/+/, '')}`
|
|
86
|
+
const targetRoute =
|
|
87
|
+
savedRoute && !normalizedRoute.startsWith(LOGIN_PAGE) ? normalizedRoute : homeTabPage
|
|
88
|
+
if (targetRoute.startsWith(homeTabPage)) uni.setStorageSync('SwitchTabIndex', true)
|
|
89
|
+
await uni.reLaunch({ url: targetRoute })
|
|
90
|
+
if (savedRoute && uni.getStorageSync(LAST_ROUTE_KEY) === savedRoute) {
|
|
91
|
+
uni.removeStorageSync(LAST_ROUTE_KEY)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
64
95
|
/** 跳转到登录页,并在跳转前记录当前页面。 */
|
|
65
96
|
export const navigateToLogin = (redirectUrl?: string) => {
|
|
66
97
|
// 模板直接绑定时会传入点击事件对象,只有字符串才是明确的回跳地址。
|
|
@@ -70,9 +101,9 @@ export const navigateToLogin = (redirectUrl?: string) => {
|
|
|
70
101
|
saveCurrentRoute()
|
|
71
102
|
}
|
|
72
103
|
uni.navigateTo({
|
|
73
|
-
url:
|
|
104
|
+
url: LOGIN_REDIRECT_PAGE,
|
|
74
105
|
fail: () => {
|
|
75
|
-
uni.reLaunch({ url:
|
|
106
|
+
uni.reLaunch({ url: LOGIN_REDIRECT_PAGE })
|
|
76
107
|
},
|
|
77
108
|
})
|
|
78
109
|
}
|
|
@@ -86,9 +117,9 @@ export const redirectToLogin = (redirectUrl?: string) => {
|
|
|
86
117
|
saveCurrentRoute()
|
|
87
118
|
}
|
|
88
119
|
uni.redirectTo({
|
|
89
|
-
url:
|
|
120
|
+
url: LOGIN_REDIRECT_PAGE,
|
|
90
121
|
fail: () => {
|
|
91
|
-
uni.reLaunch({ url:
|
|
122
|
+
uni.reLaunch({ url: LOGIN_REDIRECT_PAGE })
|
|
92
123
|
},
|
|
93
124
|
})
|
|
94
125
|
}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import { useSettingStore, useThemeStore, useUserStore } from '../../../stores'
|
|
3
3
|
import type { LoginRequest } from '../../../rpc/base/v1/login'
|
|
4
4
|
import { LoginStatus, type LoginResponse } from '../../../rpc/base/v1/login'
|
|
5
|
-
import { onLoad, onUnload } from '@dcloudio/uni-app'
|
|
5
|
+
import { onLoad, onShow, onUnload } from '@dcloudio/uni-app'
|
|
6
6
|
import { computed, defineAsyncComponent, nextTick, reactive, ref, watch } from 'vue'
|
|
7
7
|
import { defLoginService } from '../../../api/base/v1/login'
|
|
8
8
|
import { defMfaService } from '../../../api/base/v1/mfa'
|
|
9
9
|
import defaultLogo from '../../../static/images/logo_icon.png'
|
|
10
10
|
import { formatSrc } from '../../../utils'
|
|
11
|
-
import {
|
|
11
|
+
import { prepareLoginPage, restoreLoginRedirect, returnFromLogin } from '../../../utils/navigation'
|
|
12
12
|
import { encryptPassword } from '../../../utils/secretCrypto'
|
|
13
13
|
import { createWebAuthnCredential, getWebAuthnAssertion } from '../../../utils/webauthn'
|
|
14
14
|
import { navigateAppRoute } from '../../../navigation'
|
|
@@ -600,11 +600,9 @@ const refreshCaptcha = async () => {
|
|
|
600
600
|
}
|
|
601
601
|
}
|
|
602
602
|
|
|
603
|
-
/**
|
|
603
|
+
/** 返回首页并结束本次登录回跳,避免上一页再次要求登录。 */
|
|
604
604
|
const goBack = () => {
|
|
605
|
-
|
|
606
|
-
fail: () => uni.reLaunch({ url: homeTabPage }),
|
|
607
|
-
})
|
|
605
|
+
void returnFromLogin()
|
|
608
606
|
}
|
|
609
607
|
|
|
610
608
|
// 页面加载或普通表单刷新验证码,行为验证码延迟到登录弹窗打开时再请求。
|
|
@@ -786,6 +784,7 @@ const onSubmit = async () => {
|
|
|
786
784
|
}
|
|
787
785
|
}
|
|
788
786
|
// #endif
|
|
787
|
+
/** 完成用户资料加载并替换到本次登录目标,直接登录默认进入首页。 */
|
|
789
788
|
const loginSuccess = async () => {
|
|
790
789
|
await userStore.getUserProfile()
|
|
791
790
|
// 成功提示
|
|
@@ -793,13 +792,7 @@ const loginSuccess = async () => {
|
|
|
793
792
|
if (loginSuccessTimer) clearTimeout(loginSuccessTimer)
|
|
794
793
|
loginSuccessTimer = setTimeout(() => {
|
|
795
794
|
loginSuccessTimer = undefined
|
|
796
|
-
|
|
797
|
-
if (lastRoute.startsWith(homeTabPage)) {
|
|
798
|
-
uni.setStorageSync('SwitchTabIndex', true)
|
|
799
|
-
}
|
|
800
|
-
uni.removeStorageSync('lastRoute')
|
|
801
|
-
|
|
802
|
-
uni.reLaunch({ url: lastRoute })
|
|
795
|
+
void restoreLoginRedirect()
|
|
803
796
|
}, 500)
|
|
804
797
|
}
|
|
805
798
|
|
|
@@ -882,8 +875,13 @@ const loadLoginSettings = () => {
|
|
|
882
875
|
/** 确保登录前已完成移动端配置加载。 */
|
|
883
876
|
const ensureLoginSettings = () => loadLoginSettings()
|
|
884
877
|
|
|
885
|
-
|
|
886
|
-
onLoad(() => {
|
|
878
|
+
let loginRedirect: string | undefined
|
|
879
|
+
onLoad((options) => {
|
|
880
|
+
loginRedirect = options?.redirect
|
|
881
|
+
})
|
|
882
|
+
|
|
883
|
+
onShow(() => {
|
|
884
|
+
if (!prepareLoginPage(loginRedirect)) return
|
|
887
885
|
void loadLoginSettings()
|
|
888
886
|
})
|
|
889
887
|
|