@liujitcn/kratos-admin-core 0.0.21 → 0.0.23
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/dist/package/declarations/src/api/base/language.d.ts +3 -3
- package/dist/package/declarations/src/components/Dict/index.vue.d.ts +4 -3
- package/dist/package/declarations/src/components/Dict/value.d.ts +11 -0
- package/dist/package/declarations/src/locales/generated.d.ts +3382 -0
- package/dist/package/declarations/src/locales/index.d.ts +11 -21
- package/dist/package/declarations/src/rpc/base/v1/config.d.ts +11 -1
- package/dist/package/declarations/src/rpc/base/v1/language.d.ts +7 -13
- package/dist/package/declarations/src/rpc/base/v1/login.d.ts +13 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +1 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +7 -77
- package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +54 -81
- package/dist/package/declarations/src/rpc/system/admin/v1/common.d.ts +13 -0
- package/dist/package/declarations/src/stores/modules/auth.d.ts +6 -6
- package/dist/package/declarations/src/utils/passwordCrypto.d.ts +1 -1
- package/dist/package/src/App.vue +2 -8
- package/dist/package/src/api/base/language.ts +4 -4
- package/dist/package/src/bootstrap.ts +1 -1
- package/dist/package/src/components/CronExpression/index.vue +19 -19
- package/dist/package/src/components/Dialog/FormDialog.vue +1 -1
- package/dist/package/src/components/Dict/index.vue +21 -7
- package/dist/package/src/components/Dict/value.ts +18 -0
- package/dist/package/src/components/ImportExcel/index.vue +10 -10
- package/dist/package/src/components/LocaleSwitch/index.vue +1 -1
- package/dist/package/src/components/ProForm/components/DynamicList.vue +1 -1
- package/dist/package/src/components/ProForm/components/KvList.vue +2 -2
- package/dist/package/src/components/ProForm/index.vue +2 -2
- package/dist/package/src/components/ProTable/components/ColSetting.vue +3 -3
- package/dist/package/src/components/ProTable/components/TableColumn.vue +1 -1
- package/dist/package/src/components/ProTable/index.vue +4 -4
- package/dist/package/src/components/SearchForm/components/SearchFormItem.vue +2 -2
- package/dist/package/src/components/SelectFilter/index.vue +1 -1
- package/dist/package/src/components/TreeFilter/index.vue +4 -4
- package/dist/package/src/components/Upload/File.vue +6 -6
- package/dist/package/src/components/Upload/Files.vue +7 -7
- package/dist/package/src/components/Upload/Img.vue +4 -4
- package/dist/package/src/components/Upload/Imgs.vue +5 -5
- package/dist/package/src/components/WangEditor/index.vue +1 -1
- package/dist/package/src/hooks/useDownload.ts +1 -1
- package/dist/package/src/hooks/useHandleData.ts +2 -2
- package/dist/package/src/hooks/useTheme.ts +1 -1
- package/dist/package/src/layouts/components/Header/components/AssemblySize.vue +1 -1
- package/dist/package/src/layouts/components/Header/components/Avatar.vue +5 -5
- package/dist/package/src/layouts/components/Header/components/Breadcrumb.vue +2 -2
- package/dist/package/src/layouts/components/Header/components/Fullscreen.vue +2 -2
- package/dist/package/src/layouts/components/Header/components/PasswordDialog.vue +1 -1
- package/dist/package/src/layouts/components/Header/components/SearchMenu.vue +3 -3
- package/dist/package/src/layouts/components/Main/index.vue +1 -0
- package/dist/package/src/layouts/components/Tabs/components/MoreButton.vue +5 -5
- package/dist/package/src/layouts/components/Tabs/index.vue +15 -1
- package/dist/package/src/layouts/components/ThemeDrawer/index.vue +7 -7
- package/dist/package/src/locales/README.md +2 -2
- package/dist/package/src/locales/en-US.json +142 -117
- package/dist/package/src/locales/es-ES.json +226 -201
- package/dist/package/src/locales/fr-FR.json +226 -201
- package/dist/package/src/locales/generated.ts +57 -0
- package/dist/package/src/locales/index.ts +54 -55
- package/dist/package/src/locales/ja-JP.json +177 -152
- package/dist/package/src/locales/ko-KR.json +221 -196
- package/dist/package/src/locales/zh-CN.json +142 -117
- package/dist/package/src/locales/zh-TW.json +147 -122
- package/dist/package/src/modules/kratosAdmin.ts +3 -17
- package/dist/package/src/routers/modules/dynamicRouter.ts +4 -4
- package/dist/package/src/routers/modules/staticRouter.ts +2 -2
- package/dist/package/src/rpc/base/v1/config.ts +12 -1
- package/dist/package/src/rpc/base/v1/language.ts +7 -13
- package/dist/package/src/rpc/base/v1/login.ts +14 -1
- package/dist/package/src/rpc/system/admin/v1/auth.ts +1 -1
- package/dist/package/src/rpc/system/admin/v1/base_dict.ts +7 -79
- package/dist/package/src/rpc/system/admin/v1/base_translation.ts +54 -81
- package/dist/package/src/rpc/system/admin/v1/common.ts +21 -0
- package/dist/package/src/stores/modules/config.ts +2 -2
- package/dist/package/src/stores/modules/user.ts +1 -1
- package/dist/package/src/styles/element.scss +2 -0
- package/dist/package/src/utils/color.ts +4 -4
- package/dist/package/src/utils/eleValidate.ts +2 -2
- package/dist/package/src/utils/index.ts +3 -3
- package/dist/package/src/utils/passwordCrypto.ts +2 -2
- package/dist/package/src/utils/request.ts +6 -6
- package/dist/package/src/views/login/components/LoginForm.vue +15 -12
- package/package.json +2 -2
- package/vite.config.ts +12 -8
- package/dist/package/declarations/src/rpc/base/v1/enum.d.ts +0 -43
- package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +0 -67
- package/dist/package/src/rpc/base/v1/enum.ts +0 -54
- package/dist/package/src/rpc/system/common/v1/enum.ts +0 -80
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
/* eslint-disable */
|
|
8
8
|
import type { Status } from "../../../common/v1/enum";
|
|
9
9
|
import type { Empty } from "../../../google/protobuf/empty";
|
|
10
|
-
import type {
|
|
10
|
+
import type { BaseTranslation } from "./base_translation";
|
|
11
11
|
|
|
12
12
|
/** 字典选项查询条件 */
|
|
13
13
|
export interface OptionBaseDictRequest {
|
|
@@ -102,7 +102,7 @@ export interface BaseDictForm {
|
|
|
102
102
|
/** 字典名称 */
|
|
103
103
|
name: string;
|
|
104
104
|
/** 非主语言翻译 */
|
|
105
|
-
translations:
|
|
105
|
+
translations: BaseTranslation[];
|
|
106
106
|
/** 状态 */
|
|
107
107
|
status: Status;
|
|
108
108
|
}
|
|
@@ -128,7 +128,7 @@ export interface BaseDictItemForm {
|
|
|
128
128
|
/** 排序 */
|
|
129
129
|
sort: number;
|
|
130
130
|
/** 非主语言翻译 */
|
|
131
|
-
translations:
|
|
131
|
+
translations: BaseTranslation[];
|
|
132
132
|
/** 状态 */
|
|
133
133
|
status: Status;
|
|
134
134
|
}
|
|
@@ -193,14 +193,14 @@ export interface BaseDict {
|
|
|
193
193
|
code: string;
|
|
194
194
|
/** 字典名称 */
|
|
195
195
|
name: string;
|
|
196
|
-
/** 非主语言翻译 */
|
|
197
|
-
translations: BaseDictTranslation[];
|
|
198
196
|
/** 状态 */
|
|
199
197
|
status: Status;
|
|
200
198
|
/** 创建时间 */
|
|
201
199
|
created_at: string;
|
|
202
200
|
/** 更新时间 */
|
|
203
201
|
updated_at: string;
|
|
202
|
+
/** 非主语言翻译 */
|
|
203
|
+
translations: BaseTranslation[];
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
/** 字典项 */
|
|
@@ -217,86 +217,14 @@ export interface BaseDictItem {
|
|
|
217
217
|
tag_type: string;
|
|
218
218
|
/** 排序 */
|
|
219
219
|
sort: number;
|
|
220
|
-
/** 非主语言翻译 */
|
|
221
|
-
translations: BaseDictItemTranslation[];
|
|
222
220
|
/** 状态 */
|
|
223
221
|
status: Status;
|
|
224
222
|
/** 创建时间 */
|
|
225
223
|
created_at: string;
|
|
226
224
|
/** 更新时间 */
|
|
227
225
|
updated_at: string;
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
/** 字典翻译 */
|
|
231
|
-
export interface BaseDictTranslation {
|
|
232
|
-
/** 主键ID */
|
|
233
|
-
id: number;
|
|
234
|
-
/** 字典ID */
|
|
235
|
-
dict_id: number;
|
|
236
|
-
/** 语言代码 */
|
|
237
|
-
locale: string;
|
|
238
|
-
/** 字典名称 */
|
|
239
|
-
name: string;
|
|
240
|
-
/** 翻译状态 */
|
|
241
|
-
translation_status: TranslationStatus;
|
|
242
|
-
/** 中文源文SHA-256 */
|
|
243
|
-
source_hash: string;
|
|
244
|
-
/** 机器翻译提供方 */
|
|
245
|
-
translation_provider: string;
|
|
246
|
-
/** 最近机器翻译时间 */
|
|
247
|
-
translated_at: string;
|
|
248
|
-
/** 审核人ID */
|
|
249
|
-
reviewed_by: number;
|
|
250
|
-
/** 审核时间 */
|
|
251
|
-
reviewed_at: string;
|
|
252
|
-
/** 创建人ID */
|
|
253
|
-
created_by: number;
|
|
254
|
-
/** 更新人ID */
|
|
255
|
-
updated_by: number;
|
|
256
|
-
/** 创建时间 */
|
|
257
|
-
created_at: string;
|
|
258
|
-
/** 更新时间 */
|
|
259
|
-
updated_at: string;
|
|
260
|
-
/** 删除时间 */
|
|
261
|
-
deleted_at: number;
|
|
262
|
-
/** 中文源文是否已变化 */
|
|
263
|
-
source_changed: boolean;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/** 字典项翻译 */
|
|
267
|
-
export interface BaseDictItemTranslation {
|
|
268
|
-
/** 主键ID */
|
|
269
|
-
id: number;
|
|
270
|
-
/** 字典项ID */
|
|
271
|
-
dict_item_id: number;
|
|
272
|
-
/** 语言代码 */
|
|
273
|
-
locale: string;
|
|
274
|
-
/** 字典项标签 */
|
|
275
|
-
label: string;
|
|
276
|
-
/** 翻译状态 */
|
|
277
|
-
translation_status: TranslationStatus;
|
|
278
|
-
/** 中文源文SHA-256 */
|
|
279
|
-
source_hash: string;
|
|
280
|
-
/** 机器翻译提供方 */
|
|
281
|
-
translation_provider: string;
|
|
282
|
-
/** 最近机器翻译时间 */
|
|
283
|
-
translated_at: string;
|
|
284
|
-
/** 审核人ID */
|
|
285
|
-
reviewed_by: number;
|
|
286
|
-
/** 审核时间 */
|
|
287
|
-
reviewed_at: string;
|
|
288
|
-
/** 创建人ID */
|
|
289
|
-
created_by: number;
|
|
290
|
-
/** 更新人ID */
|
|
291
|
-
updated_by: number;
|
|
292
|
-
/** 创建时间 */
|
|
293
|
-
created_at: string;
|
|
294
|
-
/** 更新时间 */
|
|
295
|
-
updated_at: string;
|
|
296
|
-
/** 删除时间 */
|
|
297
|
-
deleted_at: number;
|
|
298
|
-
/** 中文源文是否已变化 */
|
|
299
|
-
source_changed: boolean;
|
|
226
|
+
/** 非主语言翻译 */
|
|
227
|
+
translations: BaseTranslation[];
|
|
300
228
|
}
|
|
301
229
|
|
|
302
230
|
/** Admin字典服务 */
|
|
@@ -5,101 +5,72 @@
|
|
|
5
5
|
// source: system/admin/v1/base_translation.proto
|
|
6
6
|
|
|
7
7
|
/* eslint-disable */
|
|
8
|
+
import type { Empty } from "../../../google/protobuf/empty";
|
|
8
9
|
|
|
9
|
-
/**
|
|
10
|
-
export enum
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
/** 统一翻译表目标类型,和 base_translation.target_type 的值一一对应。 */
|
|
11
|
+
export enum TranslationTargetType {
|
|
12
|
+
/** TRANSLATION_TARGET_TYPE_UNSPECIFIED - 未指定统一翻译表目标类型。 */
|
|
13
|
+
TRANSLATION_TARGET_TYPE_UNSPECIFIED = 0,
|
|
14
|
+
/** TRANSLATION_TARGET_TYPE_BASE_CONFIG_VALUE - 系统配置值。 */
|
|
15
|
+
TRANSLATION_TARGET_TYPE_BASE_CONFIG_VALUE = 1,
|
|
16
|
+
/** TRANSLATION_TARGET_TYPE_BASE_CONFIG_NAME - 系统配置名称。 */
|
|
17
|
+
TRANSLATION_TARGET_TYPE_BASE_CONFIG_NAME = 2,
|
|
18
|
+
/** TRANSLATION_TARGET_TYPE_BASE_DICT - 字典名称。 */
|
|
19
|
+
TRANSLATION_TARGET_TYPE_BASE_DICT = 3,
|
|
20
|
+
/** TRANSLATION_TARGET_TYPE_BASE_DICT_ITEM - 字典项标签。 */
|
|
21
|
+
TRANSLATION_TARGET_TYPE_BASE_DICT_ITEM = 4,
|
|
22
|
+
/** TRANSLATION_TARGET_TYPE_BASE_MENU - 菜单标题。 */
|
|
23
|
+
TRANSLATION_TARGET_TYPE_BASE_MENU = 5,
|
|
15
24
|
}
|
|
16
25
|
|
|
17
|
-
/**
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
TRANSLATION_RESOURCE_TYPE_CONFIG = 4,
|
|
26
|
+
/** 翻译单个文本请求。 */
|
|
27
|
+
export interface DraftBaseTranslationRequest {
|
|
28
|
+
/** 待翻译文本 */
|
|
29
|
+
source: string;
|
|
30
|
+
/** 目标语言区域,不传时翻译所有启用的非主语言 */
|
|
31
|
+
locale?: string | undefined;
|
|
24
32
|
}
|
|
25
33
|
|
|
26
|
-
/**
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
BASE_CONFIG_TRANSLATION_FIELD_VALUE = 2,
|
|
34
|
+
/** 翻译单个文本响应。 */
|
|
35
|
+
export interface DraftBaseTranslationResponse {
|
|
36
|
+
/** 翻译结果 */
|
|
37
|
+
translations: DraftBaseTranslationItem[];
|
|
31
38
|
}
|
|
32
39
|
|
|
33
|
-
/**
|
|
34
|
-
export interface
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
|
|
39
|
-
/** 目标语言代码 */
|
|
40
|
-
target_locale: string;
|
|
41
|
-
/** 系统配置翻译字段,配置资源必填 */
|
|
42
|
-
field: BaseConfigTranslationField;
|
|
40
|
+
/** 翻译单个文本响应。 */
|
|
41
|
+
export interface DraftBaseTranslationItem {
|
|
42
|
+
/** 目标语言区域 */
|
|
43
|
+
locale: string;
|
|
44
|
+
/** 翻译文本 */
|
|
45
|
+
translation: string;
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
/**
|
|
46
|
-
export interface
|
|
47
|
-
/**
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
|
|
51
|
-
/**
|
|
48
|
+
/** 修改单个翻译信息请求。 */
|
|
49
|
+
export interface UpdateBaseTranslationRequest {
|
|
50
|
+
/** 翻译记录ID,大于零时优先按ID更新;ID不存在时根据目标信息更新或新增 */
|
|
51
|
+
id: number;
|
|
52
|
+
/** 翻译目标类型,ID为零时用于查询或新增 */
|
|
53
|
+
target_type: TranslationTargetType;
|
|
54
|
+
/** 目标资源ID,ID为零时用于查询或新增 */
|
|
55
|
+
target_id: number;
|
|
56
|
+
/** 目标语言区域,ID为零时用于查询或新增 */
|
|
52
57
|
locale: string;
|
|
53
|
-
/**
|
|
54
|
-
|
|
55
|
-
/** 翻译状态 */
|
|
56
|
-
translation_status: TranslationStatus;
|
|
57
|
-
/** 中文源文SHA-256 */
|
|
58
|
-
source_hash: string;
|
|
59
|
-
/** 机器翻译提供方 */
|
|
60
|
-
translation_provider: string;
|
|
61
|
-
/** 最近机器翻译时间 */
|
|
62
|
-
translated_at: string;
|
|
63
|
-
/** 系统配置翻译字段 */
|
|
64
|
-
field: BaseConfigTranslationField;
|
|
58
|
+
/** 翻译文本 */
|
|
59
|
+
name: string;
|
|
65
60
|
}
|
|
66
61
|
|
|
67
|
-
/**
|
|
68
|
-
export interface
|
|
62
|
+
/** 国际化翻译信息 */
|
|
63
|
+
export interface BaseTranslation {
|
|
69
64
|
/** 翻译记录ID */
|
|
70
65
|
id: number;
|
|
71
|
-
/**
|
|
72
|
-
|
|
66
|
+
/** 翻译目标类型 */
|
|
67
|
+
target_type: TranslationTargetType;
|
|
68
|
+
/** 目标资源ID */
|
|
69
|
+
target_id: number;
|
|
73
70
|
/** 语言区域 */
|
|
74
71
|
locale: string;
|
|
75
|
-
/** 翻译字段:name或value */
|
|
76
|
-
field: BaseConfigTranslationField;
|
|
77
72
|
/** 翻译文本 */
|
|
78
|
-
|
|
79
|
-
/** 翻译审核状态 */
|
|
80
|
-
translation_status: TranslationStatus;
|
|
81
|
-
/** 中文源文SHA-256 */
|
|
82
|
-
source_hash: string;
|
|
83
|
-
/** 中文源文是否已变化 */
|
|
84
|
-
source_changed: boolean;
|
|
85
|
-
/** 机器翻译提供方 */
|
|
86
|
-
translation_provider: string;
|
|
87
|
-
/** 最近机器翻译时间 */
|
|
88
|
-
translated_at: string;
|
|
89
|
-
/** 审核人ID */
|
|
90
|
-
reviewed_by: number;
|
|
91
|
-
/** 审核时间 */
|
|
92
|
-
reviewed_at: string;
|
|
93
|
-
/** 创建人ID */
|
|
94
|
-
created_by: number;
|
|
95
|
-
/** 更新人ID */
|
|
96
|
-
updated_by: number;
|
|
97
|
-
/** 创建时间 */
|
|
98
|
-
created_at: string;
|
|
99
|
-
/** 更新时间 */
|
|
100
|
-
updated_at: string;
|
|
101
|
-
/** 删除时间 */
|
|
102
|
-
deleted_at: number;
|
|
73
|
+
name: string;
|
|
103
74
|
}
|
|
104
75
|
|
|
105
76
|
/** 代码生成单语言国际化配置 */
|
|
@@ -110,8 +81,10 @@ export interface CodeGenLocaleConfig {
|
|
|
110
81
|
left_tree_comment: string;
|
|
111
82
|
}
|
|
112
83
|
|
|
113
|
-
/**
|
|
84
|
+
/** 国际化翻译信息服务。 */
|
|
114
85
|
export interface BaseTranslationService {
|
|
115
|
-
/**
|
|
116
|
-
|
|
86
|
+
/** 翻译单个文本。 */
|
|
87
|
+
DraftBaseTranslation(request: DraftBaseTranslationRequest): Promise<DraftBaseTranslationResponse>;
|
|
88
|
+
/** 修改国际化翻译信息 */
|
|
89
|
+
UpdateBaseTranslation(request: UpdateBaseTranslationRequest): Promise<Empty>;
|
|
117
90
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
|
|
2
|
+
// versions:
|
|
3
|
+
// protoc-gen-ts_proto v2.11.8
|
|
4
|
+
// protoc unknown
|
|
5
|
+
// source: system/admin/v1/common.proto
|
|
6
|
+
|
|
7
|
+
/* eslint-disable */
|
|
8
|
+
|
|
9
|
+
/** 菜单类型。 */
|
|
10
|
+
export enum BaseMenuType {
|
|
11
|
+
/** BASE_MENU_TYPE_UNSPECIFIED - 未指定菜单类型。 */
|
|
12
|
+
BASE_MENU_TYPE_UNSPECIFIED = 0,
|
|
13
|
+
/** BASE_MENU_TYPE_FOLDER - 目录。 */
|
|
14
|
+
BASE_MENU_TYPE_FOLDER = 1,
|
|
15
|
+
/** BASE_MENU_TYPE_MENU - 菜单。 */
|
|
16
|
+
BASE_MENU_TYPE_MENU = 2,
|
|
17
|
+
/** BASE_MENU_TYPE_BUTTON - 按钮。 */
|
|
18
|
+
BASE_MENU_TYPE_BUTTON = 3,
|
|
19
|
+
/** BASE_MENU_TYPE_EXT_LINK - 外部链接。 */
|
|
20
|
+
BASE_MENU_TYPE_EXT_LINK = 4,
|
|
21
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineStore } from "pinia";
|
|
2
2
|
import { defConfigService } from "../../api/base/config";
|
|
3
|
-
import { BaseConfigSite } from "../../rpc/base/v1/
|
|
3
|
+
import { BaseConfigSite } from "../../rpc/base/v1/config";
|
|
4
4
|
import type { LoginCaptchaConfig, SiteConfigState, SiteDisplayConfig } from "../../stores/interface";
|
|
5
5
|
import defaultLogoUrl from "../../assets/images/logo.svg";
|
|
6
6
|
import defaultBackgroundUrl from "../../assets/images/login_left.png";
|
|
@@ -110,7 +110,7 @@ export const useConfigStore = defineStore("admin-config", {
|
|
|
110
110
|
*/
|
|
111
111
|
async loadDisplayConfig() {
|
|
112
112
|
const configResponse = await defConfigService.GetConfig({
|
|
113
|
-
site: BaseConfigSite.
|
|
113
|
+
site: BaseConfigSite.BASE_CONFIG_SITE_ADMIN
|
|
114
114
|
});
|
|
115
115
|
const configMap = buildConfigMap(configResponse.configs ?? []);
|
|
116
116
|
|
|
@@ -72,7 +72,7 @@ export const useUserStore = defineStore("admin-user", {
|
|
|
72
72
|
/** 刷新认证令牌 */
|
|
73
73
|
async refreshAccessToken() {
|
|
74
74
|
if (!this.refreshToken) {
|
|
75
|
-
return Promise.reject(new Error(t("core.auth.
|
|
75
|
+
return Promise.reject(new Error(t("core.auth.refresh_token_missing")));
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
const data = await defLoginService.RefreshToken({ refresh_token: this.refreshToken });
|
|
@@ -9,7 +9,7 @@ import { t } from "../locales";
|
|
|
9
9
|
export function hexToRgb(str: any) {
|
|
10
10
|
let hexs: any = "";
|
|
11
11
|
let reg = /^#?[0-9A-Fa-f]{6}$/;
|
|
12
|
-
if (!reg.test(str)) return ElMessage.warning(t("core.theme.
|
|
12
|
+
if (!reg.test(str)) return ElMessage.warning(t("core.theme.color_hex_invalid"));
|
|
13
13
|
str = str.replace("#", "");
|
|
14
14
|
hexs = str.match(/../g);
|
|
15
15
|
for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16);
|
|
@@ -25,7 +25,7 @@ export function hexToRgb(str: any) {
|
|
|
25
25
|
*/
|
|
26
26
|
export function rgbToHex(r: any, g: any, b: any) {
|
|
27
27
|
let reg = /^\d{1,3}$/;
|
|
28
|
-
if (!reg.test(r) || !reg.test(g) || !reg.test(b)) return ElMessage.warning(t("core.theme.
|
|
28
|
+
if (!reg.test(r) || !reg.test(g) || !reg.test(b)) return ElMessage.warning(t("core.theme.color_rgb_invalid"));
|
|
29
29
|
let hexs = [r.toString(16), g.toString(16), b.toString(16)];
|
|
30
30
|
for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`;
|
|
31
31
|
return `#${hexs.join("")}`;
|
|
@@ -39,7 +39,7 @@ export function rgbToHex(r: any, g: any, b: any) {
|
|
|
39
39
|
*/
|
|
40
40
|
export function getDarkColor(color: string, level: number) {
|
|
41
41
|
let reg = /^#?[0-9A-Fa-f]{6}$/;
|
|
42
|
-
if (!reg.test(color)) return ElMessage.warning(t("core.theme.
|
|
42
|
+
if (!reg.test(color)) return ElMessage.warning(t("core.theme.color_hex_invalid"));
|
|
43
43
|
let rgb = hexToRgb(color);
|
|
44
44
|
for (let i = 0; i < 3; i++) rgb[i] = Math.round(20.5 * level + rgb[i] * (1 - level));
|
|
45
45
|
return rgbToHex(rgb[0], rgb[1], rgb[2]);
|
|
@@ -53,7 +53,7 @@ export function getDarkColor(color: string, level: number) {
|
|
|
53
53
|
*/
|
|
54
54
|
export function getLightColor(color: string, level: number) {
|
|
55
55
|
let reg = /^#?[0-9A-Fa-f]{6}$/;
|
|
56
|
-
if (!reg.test(color)) return ElMessage.warning(t("core.theme.
|
|
56
|
+
if (!reg.test(color)) return ElMessage.warning(t("core.theme.color_hex_invalid"));
|
|
57
57
|
let rgb = hexToRgb(color);
|
|
58
58
|
for (let i = 0; i < 3; i++) rgb[i] = Math.round(255 * level + rgb[i] * (1 - level));
|
|
59
59
|
return rgbToHex(rgb[0], rgb[1], rgb[2]);
|
|
@@ -6,9 +6,9 @@ import { t } from "../locales";
|
|
|
6
6
|
*/
|
|
7
7
|
export function checkPhoneNumber(rule: any, value: any, callback: any) {
|
|
8
8
|
const regexp = /^(((13[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|(17[3-8]{1})|(18[0-9]{1})|(19[0-9]{1})|(14[5-7]{1}))+\d{8})$/;
|
|
9
|
-
if (value === "") callback(t("common.validation.
|
|
9
|
+
if (value === "") callback(t("common.validation.phone_required"));
|
|
10
10
|
if (!regexp.test(value)) {
|
|
11
|
-
callback(new Error(t("common.validation.
|
|
11
|
+
callback(new Error(t("common.validation.phone_invalid")));
|
|
12
12
|
} else {
|
|
13
13
|
return callback();
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isArray } from "../utils/is";
|
|
2
2
|
import type { RouteItem, RouteMeta } from "../rpc/system/admin/v1/auth";
|
|
3
|
-
import { BaseMenuType } from "../rpc/system/
|
|
3
|
+
import { BaseMenuType } from "../rpc/system/admin/v1/common";
|
|
4
4
|
import { t } from "../locales";
|
|
5
5
|
|
|
6
6
|
const mode = import.meta.env.VITE_ROUTER_MODE;
|
|
@@ -23,7 +23,7 @@ export function getRouteMetaIcon(meta?: RouteMeta) {
|
|
|
23
23
|
* 获取菜单标题。
|
|
24
24
|
*/
|
|
25
25
|
export function getRouteMetaTitle(meta?: RouteMeta) {
|
|
26
|
-
return meta?.title ?? t("core.layout.
|
|
26
|
+
return meta?.title ?? t("core.layout.unnamed_menu");
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/**
|
|
@@ -199,7 +199,7 @@ export function isExternalPath(path?: string) {
|
|
|
199
199
|
|
|
200
200
|
/** 获取菜单项实际跳转目标,外链优先使用 redirect。 */
|
|
201
201
|
export function getRouteTarget(item: RouteItem): string {
|
|
202
|
-
if (item.type === BaseMenuType.
|
|
202
|
+
if (item.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return item.redirect || item.path || "";
|
|
203
203
|
return item.path ?? "";
|
|
204
204
|
}
|
|
205
205
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defLoginService } from "../api/base/login";
|
|
2
|
-
import { PasswordCryptoScene } from "../rpc/base/v1/
|
|
2
|
+
import { PasswordCryptoScene } from "../rpc/base/v1/login";
|
|
3
3
|
import type { PasswordCrypto } from "../rpc/common/v1/types";
|
|
4
4
|
import { t } from "../locales";
|
|
5
5
|
|
|
@@ -34,7 +34,7 @@ function arrayBufferToBase64(buffer: ArrayBuffer) {
|
|
|
34
34
|
function getSubtleCrypto() {
|
|
35
35
|
const cryptoApi = globalThis.crypto;
|
|
36
36
|
if (!cryptoApi?.subtle) {
|
|
37
|
-
throw new Error(t("core.password.
|
|
37
|
+
throw new Error(t("core.password.crypto_unsupported"));
|
|
38
38
|
}
|
|
39
39
|
return cryptoApi;
|
|
40
40
|
}
|
|
@@ -160,8 +160,8 @@ export function handleAuthExpired() {
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
isHandlingAuthExpired = true;
|
|
163
|
-
ElMessageBox.confirm(t("core.auth.
|
|
164
|
-
confirmButtonText: t("core.auth.
|
|
163
|
+
ElMessageBox.confirm(t("core.auth.session_expired"), t("common.title.notice"), {
|
|
164
|
+
confirmButtonText: t("core.auth.login_again"),
|
|
165
165
|
cancelButtonText: t("common.action.cancel"),
|
|
166
166
|
type: "warning",
|
|
167
167
|
closeOnClickModal: false,
|
|
@@ -212,7 +212,7 @@ service.interceptors.response.use(
|
|
|
212
212
|
return response.data;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
ElMessage.error(message || t("common.message.
|
|
215
|
+
ElMessage.error(message || t("common.message.system_error"));
|
|
216
216
|
return Promise.reject(new Error(message || "Error"));
|
|
217
217
|
},
|
|
218
218
|
async (error: AxiosError) => {
|
|
@@ -240,11 +240,11 @@ service.interceptors.response.use(
|
|
|
240
240
|
if (message) {
|
|
241
241
|
ElMessage.error(message);
|
|
242
242
|
} else {
|
|
243
|
-
ElMessage.error(t("common.message.
|
|
243
|
+
ElMessage.error(t("common.message.system_error"));
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
246
|
} else if (!shouldSkipErrorMessage(requestConfig)) {
|
|
247
|
-
ElMessage.error(error.message || t("common.message.
|
|
247
|
+
ElMessage.error(error.message || t("common.message.system_error"));
|
|
248
248
|
}
|
|
249
249
|
return Promise.reject(error.message);
|
|
250
250
|
}
|
|
@@ -283,7 +283,7 @@ async function handleTokenRefresh(promptOnFailure = true) {
|
|
|
283
283
|
async function refreshAccessToken() {
|
|
284
284
|
const userStore = getUserStore();
|
|
285
285
|
if (!userStore.refreshToken) {
|
|
286
|
-
return Promise.reject(new Error(t("core.auth.
|
|
286
|
+
return Promise.reject(new Error(t("core.auth.refresh_token_missing")));
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
const response = await refreshService.post(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" size="large">
|
|
3
3
|
<el-form-item prop="tenant_code">
|
|
4
|
-
<el-input v-model="loginForm.tenant_code" :placeholder="t('core.login.
|
|
4
|
+
<el-input v-model="loginForm.tenant_code" :placeholder="t('core.login.tenant_code')">
|
|
5
5
|
<template #prefix>
|
|
6
6
|
<el-icon class="el-input__icon">
|
|
7
7
|
<office-building />
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
</el-input>
|
|
11
11
|
</el-form-item>
|
|
12
12
|
<el-form-item prop="user_name">
|
|
13
|
-
<el-input v-model="loginForm.user_name" :placeholder="t('core.login.
|
|
13
|
+
<el-input v-model="loginForm.user_name" :placeholder="t('core.login.user_name')">
|
|
14
14
|
<template #prefix>
|
|
15
15
|
<el-icon class="el-input__icon">
|
|
16
16
|
<user />
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
class="captcha-image"
|
|
52
52
|
:style="{ width: captchaImageWidth }"
|
|
53
53
|
:src="captcha_base64"
|
|
54
|
-
:alt="t('core.login.
|
|
54
|
+
:alt="t('core.login.captcha_alt')"
|
|
55
55
|
@load="handleCaptchaImageLoad"
|
|
56
56
|
@click="getCaptcha"
|
|
57
57
|
/>
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
</div>
|
|
74
74
|
<div v-if="oauthProviders.length" class="oauth-login">
|
|
75
75
|
<div class="oauth-divider">
|
|
76
|
-
<span>{{ t("core.login.
|
|
76
|
+
<span>{{ t("core.login.other_methods") }}</span>
|
|
77
77
|
</div>
|
|
78
78
|
<div class="oauth-provider-list">
|
|
79
79
|
<el-tooltip
|
|
@@ -170,8 +170,8 @@ const captchaImageWidth = ref(`${defaultCaptchaImageWidth}px`);
|
|
|
170
170
|
const behaviorDialogVisible = ref(false);
|
|
171
171
|
const behaviorLoading = ref(false);
|
|
172
172
|
const loginRules = computed(() => ({
|
|
173
|
-
tenant_code: [{ required: true, message: t("core.login.
|
|
174
|
-
user_name: [{ required: true, message: t("core.login.
|
|
173
|
+
tenant_code: [{ required: true, message: t("core.login.tenant_code"), trigger: "blur" }],
|
|
174
|
+
user_name: [{ required: true, message: t("core.login.user_name"), trigger: "blur" }],
|
|
175
175
|
password: [{ required: true, message: t("core.login.password"), trigger: "blur" }],
|
|
176
176
|
captcha_code: [{ required: true, message: t("core.login.captcha"), trigger: "blur" }]
|
|
177
177
|
}));
|
|
@@ -296,7 +296,7 @@ const slideCaptchaConfig = computed(() => ({
|
|
|
296
296
|
verticalPadding: 0,
|
|
297
297
|
horizontalPadding: 0,
|
|
298
298
|
iconSize: 20,
|
|
299
|
-
title: t("core.login.
|
|
299
|
+
title: t("core.login.behavior_puzzle")
|
|
300
300
|
}));
|
|
301
301
|
const clickCaptchaConfig = computed(() => ({
|
|
302
302
|
width: behaviorCaptchaDisplayWidth,
|
|
@@ -306,10 +306,10 @@ const clickCaptchaConfig = computed(() => ({
|
|
|
306
306
|
showTheme: false,
|
|
307
307
|
verticalPadding: 0,
|
|
308
308
|
horizontalPadding: 0,
|
|
309
|
-
buttonText: t("core.login.
|
|
309
|
+
buttonText: t("core.login.behavior_confirm"),
|
|
310
310
|
iconSize: 20,
|
|
311
311
|
dotSize: 20,
|
|
312
|
-
title: t("core.login.
|
|
312
|
+
title: t("core.login.behavior_click")
|
|
313
313
|
}));
|
|
314
314
|
const rotateCaptchaConfig = computed(() => ({
|
|
315
315
|
width: behaviorCaptchaDisplayWidth,
|
|
@@ -319,7 +319,7 @@ const rotateCaptchaConfig = computed(() => ({
|
|
|
319
319
|
verticalPadding: 0,
|
|
320
320
|
horizontalPadding: 0,
|
|
321
321
|
iconSize: 20,
|
|
322
|
-
title: t("core.login.
|
|
322
|
+
title: t("core.login.behavior_rotate")
|
|
323
323
|
}));
|
|
324
324
|
const slideCaptchaEvents = {
|
|
325
325
|
refresh: () => getCaptcha(),
|
|
@@ -526,7 +526,7 @@ const verifyCaptchaToken = async (captchaCode: string) => {
|
|
|
526
526
|
const submitLogin = async (captchaToken: string) => {
|
|
527
527
|
loading.value = true;
|
|
528
528
|
try {
|
|
529
|
-
const password = await encryptPassword(loginForm.password, PASSWORD_CRYPTO_SCENE.
|
|
529
|
+
const password = await encryptPassword(loginForm.password, PASSWORD_CRYPTO_SCENE.PASSWORD_CRYPTO_SCENE_LOGIN);
|
|
530
530
|
const loginRequest: LoginRequest = {
|
|
531
531
|
tenant_code: loginForm.tenant_code,
|
|
532
532
|
user_name: loginForm.user_name,
|
|
@@ -761,13 +761,16 @@ watch(
|
|
|
761
761
|
height: auto;
|
|
762
762
|
min-height: 24px;
|
|
763
763
|
margin-bottom: 6px;
|
|
764
|
+
align-items: flex-start;
|
|
764
765
|
}
|
|
765
766
|
|
|
766
767
|
:global(.behavior-captcha-dialog .go-captcha .gc-header span),
|
|
767
768
|
:global(.behavior-captcha-dialog .go-captcha .gc-header .gc-text) {
|
|
769
|
+
min-width: 0;
|
|
768
770
|
font-size: 14px;
|
|
769
771
|
line-height: 22px;
|
|
770
|
-
white-space:
|
|
772
|
+
white-space: normal;
|
|
773
|
+
overflow-wrap: anywhere;
|
|
771
774
|
}
|
|
772
775
|
|
|
773
776
|
:global(.behavior-captcha-dialog .go-captcha .gc-body) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liujitcn/kratos-admin-core",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.23",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "kratos-admin frontend runtime and base modules",
|
|
7
7
|
"author": {
|
|
@@ -202,7 +202,7 @@
|
|
|
202
202
|
"scripts": {
|
|
203
203
|
"build": "pnpm build:package",
|
|
204
204
|
"build:package": "node ../../scripts/build-package.mjs .",
|
|
205
|
-
"test": "tsc -p tsconfig.test.json && node --test dist/test/tests/modules.test.js",
|
|
205
|
+
"test": "tsc -p tsconfig.test.json && node --test dist/test/tests/modules.test.js dist/test/tests/dict.test.js",
|
|
206
206
|
"type:check": "vue-tsc --noEmit --skipLibCheck"
|
|
207
207
|
}
|
|
208
208
|
}
|
package/vite.config.ts
CHANGED
|
@@ -43,6 +43,7 @@ export function defineAdminViteConfig(options: AdminViteConfigOptions = {}) {
|
|
|
43
43
|
packageRoot: coreRoot,
|
|
44
44
|
sourceRoot: coreSourceRoot
|
|
45
45
|
};
|
|
46
|
+
const dayjsLocaleDependencies = readDayjsLocaleDependencies(coreSourceRoot);
|
|
46
47
|
const modulePackages = (options.modulePackages ?? []).map(packageName => ({
|
|
47
48
|
packageName,
|
|
48
49
|
...resolvePackageSource(root, packageName)
|
|
@@ -79,14 +80,6 @@ export function defineAdminViteConfig(options: AdminViteConfigOptions = {}) {
|
|
|
79
80
|
optimizeDeps: {
|
|
80
81
|
include: [
|
|
81
82
|
"@liujitcn/kratos-admin-core > dayjs",
|
|
82
|
-
// Day.js locale 是 CommonJS,必须与核心实例一起预构建,避免开发环境丢失 dayjs.locale。
|
|
83
|
-
"@liujitcn/kratos-admin-core > dayjs/locale/en",
|
|
84
|
-
"@liujitcn/kratos-admin-core > dayjs/locale/ja",
|
|
85
|
-
"@liujitcn/kratos-admin-core > dayjs/locale/zh-cn",
|
|
86
|
-
"@liujitcn/kratos-admin-core > dayjs/locale/zh-tw",
|
|
87
|
-
"@liujitcn/kratos-admin-core > dayjs/locale/ko",
|
|
88
|
-
"@liujitcn/kratos-admin-core > dayjs/locale/fr",
|
|
89
|
-
"@liujitcn/kratos-admin-core > dayjs/locale/es",
|
|
90
83
|
"@liujitcn/kratos-admin-core > dayjs/plugin/advancedFormat.js",
|
|
91
84
|
"@liujitcn/kratos-admin-core > dayjs/plugin/customParseFormat.js",
|
|
92
85
|
"@liujitcn/kratos-admin-core > dayjs/plugin/dayOfYear.js",
|
|
@@ -95,6 +88,7 @@ export function defineAdminViteConfig(options: AdminViteConfigOptions = {}) {
|
|
|
95
88
|
"@liujitcn/kratos-admin-core > dayjs/plugin/localeData.js",
|
|
96
89
|
"@liujitcn/kratos-admin-core > dayjs/plugin/weekOfYear.js",
|
|
97
90
|
"@liujitcn/kratos-admin-core > dayjs/plugin/weekYear.js",
|
|
91
|
+
...dayjsLocaleDependencies,
|
|
98
92
|
"@liujitcn/kratos-admin-core > dompurify",
|
|
99
93
|
"@liujitcn/kratos-admin-core > highlight.js",
|
|
100
94
|
"@liujitcn/kratos-admin-core > md-editor-v3",
|
|
@@ -181,6 +175,16 @@ function readPackageInfo(root: string) {
|
|
|
181
175
|
return { dependencies, devDependencies, name, version };
|
|
182
176
|
}
|
|
183
177
|
|
|
178
|
+
/** 从生成的语言注册文件读取 Day.js locale 预构建入口。 */
|
|
179
|
+
function readDayjsLocaleDependencies(sourceRoot: string): string[] {
|
|
180
|
+
const generatedPath = resolve(sourceRoot, "locales/generated.ts");
|
|
181
|
+
if (!existsSync(generatedPath)) return [];
|
|
182
|
+
const generatedSource = readFileSync(generatedPath, "utf8");
|
|
183
|
+
return [...generatedSource.matchAll(/import "dayjs\/locale\/([^"]+)"/g)].map(
|
|
184
|
+
match => `@liujitcn/kratos-admin-core > dayjs/locale/${match[1]}`
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
184
188
|
/** 解析业务模块在当前宿主中的源码目录。 */
|
|
185
189
|
function resolvePackageSource(root: string, packageName: string): Pick<AdminSourcePackage, "packageRoot" | "sourceRoot"> {
|
|
186
190
|
const require = createRequire(resolve(root, "package.json"));
|