@liujitcn/kratos-admin-core 0.0.21 → 0.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/package/declarations/src/api/base/language.d.ts +3 -3
  2. package/dist/package/declarations/src/components/Dict/index.vue.d.ts +4 -3
  3. package/dist/package/declarations/src/components/Dict/value.d.ts +11 -0
  4. package/dist/package/declarations/src/locales/generated.d.ts +3382 -0
  5. package/dist/package/declarations/src/locales/index.d.ts +11 -21
  6. package/dist/package/declarations/src/rpc/base/v1/config.d.ts +11 -1
  7. package/dist/package/declarations/src/rpc/base/v1/language.d.ts +7 -13
  8. package/dist/package/declarations/src/rpc/base/v1/login.d.ts +13 -1
  9. package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +1 -1
  10. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +7 -77
  11. package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +54 -81
  12. package/dist/package/declarations/src/rpc/system/admin/v1/common.d.ts +13 -0
  13. package/dist/package/declarations/src/stores/modules/auth.d.ts +6 -6
  14. package/dist/package/declarations/src/utils/passwordCrypto.d.ts +1 -1
  15. package/dist/package/src/App.vue +2 -8
  16. package/dist/package/src/api/base/language.ts +4 -4
  17. package/dist/package/src/bootstrap.ts +1 -1
  18. package/dist/package/src/components/CronExpression/index.vue +19 -19
  19. package/dist/package/src/components/Dialog/FormDialog.vue +1 -1
  20. package/dist/package/src/components/Dict/index.vue +21 -7
  21. package/dist/package/src/components/Dict/value.ts +18 -0
  22. package/dist/package/src/components/ImportExcel/index.vue +10 -10
  23. package/dist/package/src/components/LocaleSwitch/index.vue +1 -1
  24. package/dist/package/src/components/ProForm/components/DynamicList.vue +1 -1
  25. package/dist/package/src/components/ProForm/components/KvList.vue +2 -2
  26. package/dist/package/src/components/ProForm/index.vue +2 -2
  27. package/dist/package/src/components/ProTable/components/ColSetting.vue +3 -3
  28. package/dist/package/src/components/ProTable/components/TableColumn.vue +1 -1
  29. package/dist/package/src/components/ProTable/index.vue +4 -4
  30. package/dist/package/src/components/SearchForm/components/SearchFormItem.vue +2 -2
  31. package/dist/package/src/components/SelectFilter/index.vue +1 -1
  32. package/dist/package/src/components/TreeFilter/index.vue +4 -4
  33. package/dist/package/src/components/Upload/File.vue +6 -6
  34. package/dist/package/src/components/Upload/Files.vue +7 -7
  35. package/dist/package/src/components/Upload/Img.vue +4 -4
  36. package/dist/package/src/components/Upload/Imgs.vue +5 -5
  37. package/dist/package/src/components/WangEditor/index.vue +1 -1
  38. package/dist/package/src/hooks/useDownload.ts +1 -1
  39. package/dist/package/src/hooks/useHandleData.ts +2 -2
  40. package/dist/package/src/hooks/useTheme.ts +1 -1
  41. package/dist/package/src/layouts/components/Header/components/AssemblySize.vue +1 -1
  42. package/dist/package/src/layouts/components/Header/components/Avatar.vue +5 -5
  43. package/dist/package/src/layouts/components/Header/components/Breadcrumb.vue +2 -2
  44. package/dist/package/src/layouts/components/Header/components/Fullscreen.vue +2 -2
  45. package/dist/package/src/layouts/components/Header/components/PasswordDialog.vue +1 -1
  46. package/dist/package/src/layouts/components/Header/components/SearchMenu.vue +3 -3
  47. package/dist/package/src/layouts/components/Main/index.vue +1 -0
  48. package/dist/package/src/layouts/components/Tabs/components/MoreButton.vue +5 -5
  49. package/dist/package/src/layouts/components/Tabs/index.vue +15 -1
  50. package/dist/package/src/layouts/components/ThemeDrawer/index.vue +7 -7
  51. package/dist/package/src/locales/README.md +2 -2
  52. package/dist/package/src/locales/en-US.json +142 -117
  53. package/dist/package/src/locales/es-ES.json +226 -201
  54. package/dist/package/src/locales/fr-FR.json +226 -201
  55. package/dist/package/src/locales/generated.ts +57 -0
  56. package/dist/package/src/locales/index.ts +54 -55
  57. package/dist/package/src/locales/ja-JP.json +177 -152
  58. package/dist/package/src/locales/ko-KR.json +221 -196
  59. package/dist/package/src/locales/zh-CN.json +142 -117
  60. package/dist/package/src/locales/zh-TW.json +147 -122
  61. package/dist/package/src/modules/kratosAdmin.ts +3 -17
  62. package/dist/package/src/routers/modules/dynamicRouter.ts +4 -4
  63. package/dist/package/src/routers/modules/staticRouter.ts +2 -2
  64. package/dist/package/src/rpc/base/v1/config.ts +12 -1
  65. package/dist/package/src/rpc/base/v1/language.ts +7 -13
  66. package/dist/package/src/rpc/base/v1/login.ts +14 -1
  67. package/dist/package/src/rpc/system/admin/v1/auth.ts +1 -1
  68. package/dist/package/src/rpc/system/admin/v1/base_dict.ts +7 -79
  69. package/dist/package/src/rpc/system/admin/v1/base_translation.ts +54 -81
  70. package/dist/package/src/rpc/system/admin/v1/common.ts +21 -0
  71. package/dist/package/src/stores/modules/config.ts +2 -2
  72. package/dist/package/src/stores/modules/user.ts +1 -1
  73. package/dist/package/src/styles/element.scss +2 -0
  74. package/dist/package/src/utils/color.ts +4 -4
  75. package/dist/package/src/utils/eleValidate.ts +2 -2
  76. package/dist/package/src/utils/index.ts +3 -3
  77. package/dist/package/src/utils/passwordCrypto.ts +2 -2
  78. package/dist/package/src/utils/request.ts +6 -6
  79. package/dist/package/src/views/login/components/LoginForm.vue +15 -12
  80. package/package.json +2 -2
  81. package/vite.config.ts +12 -8
  82. package/dist/package/declarations/src/rpc/base/v1/enum.d.ts +0 -43
  83. package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +0 -67
  84. package/dist/package/src/rpc/base/v1/enum.ts +0 -54
  85. 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 { TranslationStatus } from "./base_translation";
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: BaseDictTranslation[];
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: BaseDictItemTranslation[];
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 TranslationStatus {
11
- TRANSLATION_STATUS_UNSPECIFIED = 0,
12
- TRANSLATION_STATUS_PENDING = 1,
13
- TRANSLATION_STATUS_MACHINE = 2,
14
- TRANSLATION_STATUS_REVIEWED = 3,
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 enum TranslationResourceType {
19
- TRANSLATION_RESOURCE_TYPE_UNSPECIFIED = 0,
20
- TRANSLATION_RESOURCE_TYPE_MENU = 1,
21
- TRANSLATION_RESOURCE_TYPE_DICT = 2,
22
- TRANSLATION_RESOURCE_TYPE_DICT_ITEM = 3,
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 enum BaseConfigTranslationField {
28
- BASE_CONFIG_TRANSLATION_FIELD_UNSPECIFIED = 0,
29
- BASE_CONFIG_TRANSLATION_FIELD_NAME = 1,
30
- BASE_CONFIG_TRANSLATION_FIELD_VALUE = 2,
34
+ /** 翻译单个文本响应。 */
35
+ export interface DraftBaseTranslationResponse {
36
+ /** 翻译结果 */
37
+ translations: DraftBaseTranslationItem[];
31
38
  }
32
39
 
33
- /** 生成翻译草稿请求 */
34
- export interface GenerateTranslationDraftRequest {
35
- /** 资源类型 */
36
- resource_type: TranslationResourceType;
37
- /** 已保存资源ID */
38
- resource_id: number;
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 GenerateTranslationDraftResponse {
47
- /** 资源类型 */
48
- resource_type: TranslationResourceType;
49
- /** 资源ID */
50
- resource_id: number;
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
- translation: string;
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 BaseConfigTranslation {
62
+ /** 国际化翻译信息 */
63
+ export interface BaseTranslation {
69
64
  /** 翻译记录ID */
70
65
  id: number;
71
- /** 系统配置ID */
72
- config_id: number;
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
- text: string;
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
- /** Admin翻译草稿服务 */
84
+ /** 国际化翻译信息服务。 */
114
85
  export interface BaseTranslationService {
115
- /** 为单个已保存资源生成机器翻译草稿 */
116
- GenerateTranslationDraft(request: GenerateTranslationDraftRequest): Promise<GenerateTranslationDraftResponse>;
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/enum";
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.ADMIN
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.refreshTokenMissing")));
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 });
@@ -310,6 +310,8 @@
310
310
 
311
311
  /* el-dialog */
312
312
  .el-dialog {
313
+ box-sizing: border-box;
314
+ max-width: calc(100vw - 32px);
313
315
  padding: 0;
314
316
  margin-top: 8vh;
315
317
  .el-dialog__header {
@@ -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.colorHexInvalid"));
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.colorRgbInvalid"));
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.colorHexInvalid"));
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.colorHexInvalid"));
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.phoneRequired"));
9
+ if (value === "") callback(t("common.validation.phone_required"));
10
10
  if (!regexp.test(value)) {
11
- callback(new Error(t("common.validation.phoneInvalid")));
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/common/v1/enum";
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.unnamedMenu");
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.EXT_LINK) return item.redirect || item.path || "";
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/enum";
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.cryptoUnsupported"));
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.sessionExpired"), t("common.title.notice"), {
164
- confirmButtonText: t("core.auth.loginAgain"),
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.systemError"));
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.systemError"));
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.systemError"));
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.refreshTokenMissing")));
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.tenantCode')">
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.userName')">
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.captchaAlt')"
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.otherMethods") }}</span>
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.tenantCode"), trigger: "blur" }],
174
- user_name: [{ required: true, message: t("core.login.userName"), trigger: "blur" }],
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.behaviorPuzzle")
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.behaviorConfirm"),
309
+ buttonText: t("core.login.behavior_confirm"),
310
310
  iconSize: 20,
311
311
  dotSize: 20,
312
- title: t("core.login.behaviorClick")
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.behaviorRotate")
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.LOGIN);
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: nowrap;
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.21",
4
+ "version": "0.0.24",
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"));