@liujitcn/kratos-admin-system 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.
Files changed (106) hide show
  1. package/dist/package/declarations/src/api/system/base_language.d.ts +5 -4
  2. package/dist/package/declarations/src/api/system/base_translation.d.ts +7 -4
  3. package/dist/package/declarations/src/api/system/ops_monitoring.d.ts +19 -0
  4. package/dist/package/declarations/src/api/system/ops_monitoring_sse.d.ts +12 -0
  5. package/dist/package/declarations/src/components/DynamicTranslationCell.vue.d.ts +9 -32
  6. package/dist/package/declarations/src/components/DynamicTranslationEditor.vue.d.ts +3 -6
  7. package/dist/package/declarations/src/components/dynamicTranslation.d.ts +11 -17
  8. package/dist/package/declarations/src/locales/generated.d.ts +6536 -0
  9. package/dist/package/declarations/src/rpc/base/v1/ai_session.d.ts +12 -2
  10. package/dist/package/declarations/src/rpc/base/v1/ai_tool.d.ts +9 -1
  11. package/dist/package/declarations/src/rpc/base/v1/config.d.ts +35 -0
  12. package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +1 -1
  13. package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +23 -7
  14. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +7 -77
  15. package/dist/package/declarations/src/rpc/system/admin/v1/base_job.d.ts +9 -1
  16. package/dist/package/declarations/src/rpc/system/admin/v1/base_language.d.ts +7 -2
  17. package/dist/package/declarations/src/rpc/system/admin/v1/base_menu.d.ts +5 -40
  18. package/dist/package/declarations/src/rpc/system/admin/v1/base_migration.d.ts +6 -6
  19. package/dist/package/declarations/src/rpc/system/admin/v1/base_role.d.ts +13 -1
  20. package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +54 -81
  21. package/dist/package/declarations/src/rpc/system/admin/v1/base_user.d.ts +11 -1
  22. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen.d.ts +11 -11
  23. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_table.d.ts +11 -1
  24. package/dist/package/declarations/src/rpc/system/admin/v1/common.d.ts +13 -0
  25. package/dist/package/declarations/src/rpc/system/admin/v1/ops_monitoring.d.ts +222 -0
  26. package/dist/package/declarations/src/views/tool/ops-monitoring/index.vue.d.ts +3 -0
  27. package/dist/package/src/api/base/ai_message.ts +2 -2
  28. package/dist/package/src/api/system/base_language.ts +13 -15
  29. package/dist/package/src/api/system/base_translation.ts +17 -6
  30. package/dist/package/src/api/system/ops_monitoring.ts +88 -0
  31. package/dist/package/src/api/system/ops_monitoring_sse.ts +49 -0
  32. package/dist/package/src/components/DynamicTranslationCell.vue +199 -126
  33. package/dist/package/src/components/DynamicTranslationEditor.vue +109 -78
  34. package/dist/package/src/components/dynamicTranslation.ts +11 -31
  35. package/dist/package/src/locales/README.md +7 -5
  36. package/dist/package/src/locales/en-US.json +876 -872
  37. package/dist/package/src/locales/es-ES.json +900 -895
  38. package/dist/package/src/locales/fr-FR.json +896 -891
  39. package/dist/package/src/locales/generated.ts +22 -0
  40. package/dist/package/src/locales/ja-JP.json +876 -872
  41. package/dist/package/src/locales/ko-KR.json +881 -876
  42. package/dist/package/src/locales/zh-CN.json +876 -872
  43. package/dist/package/src/locales/zh-TW.json +876 -871
  44. package/dist/package/src/module.ts +3 -17
  45. package/dist/package/src/rpc/base/v1/ai_session.ts +13 -2
  46. package/dist/package/src/rpc/base/v1/ai_tool.ts +10 -1
  47. package/dist/package/src/rpc/base/v1/config.ts +47 -0
  48. package/dist/package/src/rpc/system/admin/v1/auth.ts +1 -1
  49. package/dist/package/src/rpc/system/admin/v1/base_config.ts +24 -7
  50. package/dist/package/src/rpc/system/admin/v1/base_dict.ts +7 -79
  51. package/dist/package/src/rpc/system/admin/v1/base_job.ts +10 -1
  52. package/dist/package/src/rpc/system/admin/v1/base_language.ts +8 -2
  53. package/dist/package/src/rpc/system/admin/v1/base_menu.ts +5 -41
  54. package/dist/package/src/rpc/system/admin/v1/base_migration.ts +8 -8
  55. package/dist/package/src/rpc/system/admin/v1/base_role.ts +14 -1
  56. package/dist/package/src/rpc/system/admin/v1/base_translation.ts +54 -81
  57. package/dist/package/src/rpc/system/admin/v1/base_user.ts +12 -1
  58. package/dist/package/src/rpc/system/admin/v1/code_gen.ts +11 -11
  59. package/dist/package/src/rpc/system/admin/v1/code_gen_table.ts +12 -1
  60. package/dist/package/src/rpc/system/admin/v1/common.ts +21 -0
  61. package/dist/package/src/rpc/system/admin/v1/ops_monitoring.ts +255 -0
  62. package/dist/package/src/views/ai/chat/components/ChatPanel.vue +36 -36
  63. package/dist/package/src/views/ai/chat/components/SessionPanel.vue +6 -6
  64. package/dist/package/src/views/ai/chat/components/XSender.vue +20 -20
  65. package/dist/package/src/views/ai/chat/index.vue +33 -32
  66. package/dist/package/src/views/ai/chat/message.ts +16 -15
  67. package/dist/package/src/views/base/api/index.vue +55 -56
  68. package/dist/package/src/views/base/area/index.vue +18 -19
  69. package/dist/package/src/views/base/config/index.vue +143 -133
  70. package/dist/package/src/views/base/dept/index.vue +42 -43
  71. package/dist/package/src/views/base/dict/index.vue +49 -45
  72. package/dist/package/src/views/base/dict/item.vue +54 -49
  73. package/dist/package/src/views/base/job/index.vue +51 -52
  74. package/dist/package/src/views/base/job/log.vue +18 -18
  75. package/dist/package/src/views/{tool → base}/language/index.vue +51 -47
  76. package/dist/package/src/views/base/log/index.vue +40 -40
  77. package/dist/package/src/views/base/menu/index.vue +220 -177
  78. package/dist/package/src/views/base/migration/index.vue +24 -24
  79. package/dist/package/src/views/base/post/index.vue +42 -43
  80. package/dist/package/src/views/base/role/index.vue +54 -55
  81. package/dist/package/src/views/base/tenant/index.vue +42 -43
  82. package/dist/package/src/views/base/user/components/dept-tree.vue +1 -1
  83. package/dist/package/src/views/base/user/index.vue +69 -71
  84. package/dist/package/src/views/profile/components/base.vue +9 -9
  85. package/dist/package/src/views/profile/components/password.vue +19 -20
  86. package/dist/package/src/views/profile/components/security.vue +20 -20
  87. package/dist/package/src/views/profile/index.vue +3 -3
  88. package/dist/package/src/views/tool/api-doc/index.vue +1 -1
  89. package/dist/package/src/views/tool/code-gen/code-preview/index.vue +13 -13
  90. package/dist/package/src/views/tool/code-gen/columns/index.vue +89 -89
  91. package/dist/package/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue +5 -5
  92. package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +21 -21
  93. package/dist/package/src/views/tool/code-gen/components/CodePreviewPane.vue +5 -5
  94. package/dist/package/src/views/tool/code-gen/config.ts +60 -60
  95. package/dist/package/src/views/tool/code-gen/preview/data.ts +2 -2
  96. package/dist/package/src/views/tool/code-gen/preview/index.vue +30 -31
  97. package/dist/package/src/views/tool/code-gen/proto/index.vue +43 -43
  98. package/dist/package/src/views/tool/code-gen/table/index.vue +95 -95
  99. package/dist/package/src/views/tool/ops-monitoring/index.vue +1175 -0
  100. package/dist/package/src/views/tool/project-doc/index.vue +7 -7
  101. package/package.json +2 -2
  102. package/dist/package/declarations/src/rpc/base/v1/enum.d.ts +0 -43
  103. package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +0 -67
  104. package/dist/package/src/rpc/base/v1/enum.ts +0 -54
  105. package/dist/package/src/rpc/system/common/v1/enum.ts +0 -80
  106. /package/dist/package/declarations/src/views/{tool → base}/language/index.vue.d.ts +0 -0
@@ -2,7 +2,7 @@
2
2
  <div class="table-box">
3
3
  <ProTable
4
4
  ref="proTable"
5
- :title="t('system.menu.title.list')"
5
+ :title="t('system.base.menu.title.list')"
6
6
  row-key="id"
7
7
  :indent="20"
8
8
  :columns="columns"
@@ -16,26 +16,23 @@
16
16
  <FormDialog
17
17
  v-model="dialog.visible"
18
18
  ref="formDialogRef"
19
- :title="t(dialog.editing ? 'system.menu.action.edit' : 'system.menu.action.create')"
19
+ :title="t(dialog.editing ? 'system.base.menu.action.edit' : 'system.base.menu.action.create')"
20
20
  width="1180px"
21
21
  :model="formData"
22
22
  :fields="formFields"
23
23
  :rules="rules"
24
- label-width="120px"
25
24
  :col-span="12"
26
25
  @confirm="handleSubmit"
27
26
  @close="handleCloseDialog"
28
27
  >
29
28
  <template #menuIcon>
30
- <SelectIcon v-model:icon-value="menuIconValue" :placeholder="t('system.menu.placeholder.icon')" />
29
+ <SelectIcon v-model:icon-value="menuIconValue" :placeholder="t('system.base.menu.placeholder.icon')" />
31
30
  </template>
32
31
 
33
32
  <template #translations>
34
33
  <DynamicTranslationEditor
35
34
  v-model="translationValues"
36
- :resource-id="formData.id"
37
- :resource-type="TranslationResourceType.TRANSLATION_RESOURCE_TYPE_MENU"
38
- :draft-enabled="configStore.translationDraftEnabled"
35
+ :source="formData.meta.title"
39
36
  :maxlength="100"
40
37
  />
41
38
  </template>
@@ -43,9 +40,9 @@
43
40
  <template #apiTransferItem="slotScope">
44
41
  <el-popover effect="light" trigger="hover" placement="top" width="auto">
45
42
  <template #default>
46
- <div>{{ t("system.api.field.operation") }}:{{ slotScope.option.operation }}</div>
47
- <div>{{ t("system.api.field.method") }}:{{ slotScope.option.method }}</div>
48
- <div>{{ t("system.api.field.path") }}:{{ slotScope.option.path }}</div>
43
+ <div>{{ t("system.base.api.field.operation") }}:{{ slotScope.option.operation }}</div>
44
+ <div>{{ t("system.base.api.field.method") }}:{{ slotScope.option.method }}</div>
45
+ <div>{{ t("system.base.api.field.path") }}:{{ slotScope.option.path }}</div>
49
46
  </template>
50
47
  <template #reference>{{ slotScope.option.label }}</template>
51
48
  </el-popover>
@@ -79,10 +76,10 @@ import type {
79
76
  BaseMenuMeta
80
77
  } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_menu";
81
78
  import { Status } from "@liujitcn/kratos-admin-system/rpc/common/v1/enum";
82
- import { BaseMenuType } from "@liujitcn/kratos-admin-system/rpc/system/common/v1/enum";
79
+ import { BaseMenuType } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/common";
80
+ import { TranslationTargetType } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_translation";
83
81
  import { normalizeSelectedIds } from "@liujitcn/kratos-admin-core/table";
84
82
  import { t } from "@liujitcn/kratos-admin-core";
85
- import { useConfigStore } from "@liujitcn/kratos-admin-core/stores/runtime";
86
83
  import DynamicTranslationEditor from "@liujitcn/kratos-admin-system/components/DynamicTranslationEditor.vue";
87
84
  import DynamicTranslationCell from "@liujitcn/kratos-admin-system/components/DynamicTranslationCell.vue";
88
85
  import {
@@ -91,8 +88,6 @@ import {
91
88
  type DynamicTranslationRecord,
92
89
  type DynamicTranslationValue
93
90
  } from "@liujitcn/kratos-admin-system/components/dynamicTranslation";
94
- import { TranslationResourceType } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_translation";
95
- import type { BaseMenuTranslation } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_menu";
96
91
 
97
92
  defineOptions({
98
93
  name: "BaseMenu",
@@ -110,7 +105,6 @@ type MenuFormState = Omit<BaseMenuForm, "meta"> & {
110
105
  };
111
106
 
112
107
  const { BUTTONS } = useAuthButtons();
113
- const configStore = useConfigStore();
114
108
  const proTable = ref<ProTableInstance>();
115
109
  const formDialogRef = ref<InstanceType<typeof FormDialog>>();
116
110
  const menuOptions = ref<ProFormOption[]>([]);
@@ -122,7 +116,7 @@ const translationValues = ref<DynamicTranslationValue[]>(normalizeDynamicTransla
122
116
  const dialog = reactive({
123
117
  editing: false,
124
118
  visible: false,
125
- parentType: BaseMenuType.UNKNOWN_MT,
119
+ parentType: BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED,
126
120
  parentLocked: true
127
121
  });
128
122
 
@@ -156,7 +150,7 @@ function createDefaultMenuForm(): MenuFormState {
156
150
  return {
157
151
  id: 0,
158
152
  parent_id: undefined,
159
- type: BaseMenuType.FOLDER,
153
+ type: BaseMenuType.BASE_MENU_TYPE_FOLDER,
160
154
  path: "",
161
155
  name: "",
162
156
  component: "",
@@ -180,10 +174,10 @@ const menuIconValue = computed({
180
174
  });
181
175
 
182
176
  const menuTypeOptions = computed<ProFormOption[]>(() => [
183
- { label: t("system.menu.type.folder"), value: BaseMenuType.FOLDER },
184
- { label: t("system.menu.type.menu"), value: BaseMenuType.MENU },
185
- { label: t("system.menu.type.button"), value: BaseMenuType.BUTTON },
186
- { label: t("system.menu.type.external"), value: BaseMenuType.EXT_LINK }
177
+ { label: t("system.base.menu.type.folder"), value: BaseMenuType.BASE_MENU_TYPE_FOLDER },
178
+ { label: t("system.base.menu.type.menu"), value: BaseMenuType.BASE_MENU_TYPE_MENU },
179
+ { label: t("system.base.menu.type.button"), value: BaseMenuType.BASE_MENU_TYPE_BUTTON },
180
+ { label: t("system.base.menu.type.external"), value: BaseMenuType.BASE_MENU_TYPE_EXT_LINK }
187
181
  ]);
188
182
 
189
183
  /** 判断父节点是否属于固定移动端菜单树。 */
@@ -209,8 +203,8 @@ function getMenuLevel(menuId: number) {
209
203
  function canCreateChild(menu: BaseMenu) {
210
204
  const level = getMenuLevel(menu.id);
211
205
  if (menu.id === APP_MENU_ROOT_ID || isAppMenu(menu.parent_id)) return level >= 1 && level < 4;
212
- if (menu.type === BaseMenuType.FOLDER) return level === 1 || level === 2;
213
- if (menu.type === BaseMenuType.MENU) return level === 2 || level === 3;
206
+ if (menu.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) return level === 1 || level === 2;
207
+ if (menu.type === BaseMenuType.BASE_MENU_TYPE_MENU) return level === 2 || level === 3;
214
208
  return false;
215
209
  }
216
210
 
@@ -218,17 +212,24 @@ function canCreateChild(menu: BaseMenu) {
218
212
  const availableMenuTypeOptions = computed(() => {
219
213
  const parentLevel = getMenuLevel(formData.parent_id ?? 0);
220
214
 
221
- if (formData.id === APP_MENU_ROOT_ID) return menuTypeOptions.value.filter(item => item.value === BaseMenuType.FOLDER);
222
- if (isAppMenu(formData.parent_id)) return menuTypeOptions.value.filter(item => item.value === BaseMenuType.MENU);
223
- if (formData.id > 0 && parentLevel === 0) return menuTypeOptions.value.filter(item => item.value === BaseMenuType.FOLDER);
224
- if (dialog.parentType === BaseMenuType.FOLDER && parentLevel === 1)
215
+ if (formData.id === APP_MENU_ROOT_ID)
216
+ return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BASE_MENU_TYPE_FOLDER);
217
+ if (isAppMenu(formData.parent_id)) return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BASE_MENU_TYPE_MENU);
218
+ if (formData.id > 0 && parentLevel === 0)
219
+ return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BASE_MENU_TYPE_FOLDER);
220
+ if (dialog.parentType === BaseMenuType.BASE_MENU_TYPE_FOLDER && parentLevel === 1)
225
221
  return menuTypeOptions.value.filter(
226
- item => item.value === BaseMenuType.FOLDER || item.value === BaseMenuType.MENU || item.value === BaseMenuType.EXT_LINK
222
+ item =>
223
+ item.value === BaseMenuType.BASE_MENU_TYPE_FOLDER ||
224
+ item.value === BaseMenuType.BASE_MENU_TYPE_MENU ||
225
+ item.value === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
227
226
  );
228
- if (dialog.parentType === BaseMenuType.FOLDER && parentLevel === 2)
229
- return menuTypeOptions.value.filter(item => item.value === BaseMenuType.MENU || item.value === BaseMenuType.EXT_LINK);
230
- if (dialog.parentType === BaseMenuType.MENU && (parentLevel === 2 || parentLevel === 3))
231
- return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BUTTON);
227
+ if (dialog.parentType === BaseMenuType.BASE_MENU_TYPE_FOLDER && parentLevel === 2)
228
+ return menuTypeOptions.value.filter(
229
+ item => item.value === BaseMenuType.BASE_MENU_TYPE_MENU || item.value === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
230
+ );
231
+ if (dialog.parentType === BaseMenuType.BASE_MENU_TYPE_MENU && (parentLevel === 2 || parentLevel === 3))
232
+ return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BASE_MENU_TYPE_BUTTON);
232
233
  return [];
233
234
  });
234
235
 
@@ -241,9 +242,9 @@ watch(
241
242
  } else if (formData.id === 0) {
242
243
  formData.meta.app = undefined;
243
244
  }
244
- dialog.parentType = parentMenuTypeMap.value.get(formData.parent_id ?? 0) ?? BaseMenuType.UNKNOWN_MT;
245
+ dialog.parentType = parentMenuTypeMap.value.get(formData.parent_id ?? 0) ?? BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED;
245
246
  if (formData.id > 0 || availableMenuTypeOptions.value.some(item => item.value === formData.type)) return;
246
- formData.type = (availableMenuTypeOptions.value[0]?.value as BaseMenuType) ?? BaseMenuType.UNKNOWN_MT;
247
+ formData.type = (availableMenuTypeOptions.value[0]?.value as BaseMenuType) ?? BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED;
247
248
  }
248
249
  );
249
250
 
@@ -253,9 +254,9 @@ const statusOptions = computed<ProFormOption[]>(() => [
253
254
  ]);
254
255
 
255
256
  const appAccessOptions = computed<ProFormOption[]>(() => [
256
- { label: t("system.menu.access.public"), value: "PUBLIC" },
257
- { label: t("system.menu.access.guest"), value: "GUEST_ONLY" },
258
- { label: t("system.menu.access.authenticated"), value: "AUTHENTICATED" }
257
+ { label: t("system.base.menu.access.public"), value: "PUBLIC" },
258
+ { label: t("system.base.menu.access.guest"), value: "GUEST_ONLY" },
259
+ { label: t("system.base.menu.access.authenticated"), value: "AUTHENTICATED" }
259
260
  ]);
260
261
 
261
262
  /**
@@ -284,7 +285,7 @@ function renderMenuIconCell(scope: RenderScope<BaseMenu>) {
284
285
  function renderHiddenCell(scope: RenderScope<BaseMenu>) {
285
286
  const isHidden = Boolean(scope.row.meta?.hidden);
286
287
  return h(ElTag, { type: isHidden ? "info" : "success" }, () =>
287
- t(isHidden ? "system.menu.status.hidden" : "system.menu.status.visible")
288
+ t(isHidden ? "system.base.menu.status.hidden" : "system.base.menu.status.visible")
288
289
  );
289
290
  }
290
291
 
@@ -293,8 +294,9 @@ function renderMenuTitleCell(scope: RenderScope<BaseMenu>) {
293
294
  const row = scope.row;
294
295
  return h(DynamicTranslationCell, {
295
296
  source: row.meta?.title ?? "",
296
- translations: row.translations,
297
- textField: "title"
297
+ targetType: TranslationTargetType.TRANSLATION_TARGET_TYPE_BASE_MENU,
298
+ targetId: row.id,
299
+ translations: row.translations
298
300
  });
299
301
  }
300
302
 
@@ -310,28 +312,28 @@ const columns = computed<ColumnProps[]>(() => [
310
312
  },
311
313
  {
312
314
  prop: "meta.title",
313
- label: t("system.menu.field.name"),
315
+ label: t("system.base.menu.field.name"),
314
316
  minWidth: 220,
315
317
  align: "left",
316
318
  search: { el: "input", key: "title" },
317
319
  showOverflowTooltip: false,
318
320
  render: scope => renderMenuTitleCell(scope as unknown as RenderScope<BaseMenu>)
319
321
  },
320
- { prop: "type", label: t("system.menu.field.type"), minWidth: 120, dictCode: "base_menu_type", search: { el: "select" } },
322
+ { prop: "type", label: t("system.base.menu.field.type"), minWidth: 120, dictCode: "base_menu_type", search: { el: "select" } },
321
323
  {
322
324
  prop: "meta.icon",
323
- label: t("system.menu.field.icon"),
325
+ label: t("system.base.menu.field.icon"),
324
326
  width: 90,
325
327
  render: scope => renderMenuIconCell(scope as unknown as RenderScope<BaseMenu>)
326
328
  },
327
- { prop: "path", label: t("system.menu.field.pathOrPermission"), minWidth: 260, search: { el: "input" } },
328
- { prop: "name", label: t("system.menu.field.routeName"), minWidth: 180, search: { el: "input" } },
329
- { prop: "component", label: t("system.menu.field.component"), minWidth: 260 },
330
- { prop: "redirect", label: t("system.menu.field.redirect"), minWidth: 220 },
331
- { prop: "sort", label: t("system.common.field.sort"), minWidth: 80, align: "right" },
329
+ { prop: "path", label: t("system.base.menu.field.path_or_permission"), minWidth: 260, search: { el: "input" } },
330
+ { prop: "name", label: t("system.base.menu.field.route_name"), minWidth: 180, search: { el: "input" } },
331
+ { prop: "component", label: t("system.base.menu.field.component"), minWidth: 260 },
332
+ { prop: "redirect", label: t("system.base.menu.field.redirect"), minWidth: 220 },
333
+ { prop: "sort", label: t("common.field.sort"), minWidth: 80, align: "right" },
332
334
  {
333
335
  prop: "status",
334
- label: t("system.common.field.status"),
336
+ label: t("common.field.status"),
335
337
  width: 100,
336
338
  dictCode: "status",
337
339
  search: { el: "select" },
@@ -347,15 +349,15 @@ const columns = computed<ColumnProps[]>(() => [
347
349
  },
348
350
  {
349
351
  prop: "meta.hidden",
350
- label: t("system.menu.field.displayStatus"),
352
+ label: t("system.base.menu.field.display_status"),
351
353
  width: 100,
352
354
  render: scope => renderHiddenCell(scope as unknown as RenderScope<BaseMenu>)
353
355
  },
354
- { prop: "created_at", label: t("system.common.field.createdAt"), minWidth: 180 },
355
- { prop: "updated_at", label: t("system.common.field.updatedAt"), minWidth: 180 },
356
+ { prop: "created_at", label: t("common.field.created_at"), minWidth: 180 },
357
+ { prop: "updated_at", label: t("common.field.updated_at"), minWidth: 180 },
356
358
  {
357
359
  prop: "operation",
358
- label: t("system.common.field.action"),
360
+ label: t("common.field.action"),
359
361
  width: 220,
360
362
  fixed: "right",
361
363
  cellType: "actions",
@@ -423,7 +425,7 @@ const transferData = computed<ProFormOption[]>(() => {
423
425
  const formFields = computed<ProFormField[]>(() => [
424
426
  {
425
427
  prop: "parent_id",
426
- label: t("system.menu.field.parent"),
428
+ label: t("system.base.menu.field.parent"),
427
429
  component: "tree-select",
428
430
  options: menuOptions.value,
429
431
  props: () => ({
@@ -432,14 +434,14 @@ const formFields = computed<ProFormField[]>(() => [
432
434
  checkStrictly: true,
433
435
  clearable: false,
434
436
  filterable: true,
435
- placeholder: t("system.menu.placeholder.parent"),
437
+ placeholder: t("system.base.menu.placeholder.parent"),
436
438
  disabled: dialog.parentLocked,
437
439
  style: { width: "100%" }
438
440
  })
439
441
  },
440
442
  {
441
443
  prop: "type",
442
- label: t("system.menu.field.type"),
444
+ label: t("system.base.menu.field.type"),
443
445
  component: "radio-group",
444
446
  options: availableMenuTypeOptions.value,
445
447
  props: model => ({
@@ -448,20 +450,24 @@ const formFields = computed<ProFormField[]>(() => [
448
450
  },
449
451
  {
450
452
  prop: "meta.title",
451
- label: t(formData.type === BaseMenuType.BUTTON ? "system.menu.field.buttonName" : "system.menu.field.title"),
453
+ label: t(
454
+ formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON ? "system.base.menu.field.button_name" : "system.base.menu.field.title"
455
+ ),
452
456
  component: "input",
453
457
  itemProps: {
454
458
  required: true
455
459
  },
456
460
  props: () => ({
457
461
  placeholder: t(
458
- formData.type === BaseMenuType.BUTTON ? "system.menu.placeholder.buttonName" : "system.menu.placeholder.title"
462
+ formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON
463
+ ? "system.base.menu.placeholder.button_name"
464
+ : "system.base.menu.placeholder.title"
459
465
  )
460
466
  })
461
467
  },
462
468
  {
463
469
  prop: "translations",
464
- label: t("system.translation.field.translations"),
470
+ label: t("system.base.translation.field.translations"),
465
471
  component: "slot",
466
472
  slotName: "translations",
467
473
  colSpan: 24
@@ -472,12 +478,12 @@ const formFields = computed<ProFormField[]>(() => [
472
478
  component: "input",
473
479
  labelTooltip: getPathFieldTooltip(),
474
480
  itemProps: model => ({
475
- required: model.type !== BaseMenuType.FOLDER
481
+ required: model.type !== BaseMenuType.BASE_MENU_TYPE_FOLDER
476
482
  }),
477
483
  props: () => ({
478
484
  placeholder: getPathFieldPlaceholder()
479
485
  }),
480
- visible: model => model.type !== BaseMenuType.FOLDER
486
+ visible: model => model.type !== BaseMenuType.BASE_MENU_TYPE_FOLDER
481
487
  },
482
488
  {
483
489
  prop: "redirect",
@@ -485,117 +491,121 @@ const formFields = computed<ProFormField[]>(() => [
485
491
  component: "input",
486
492
  props: () => ({ placeholder: getRedirectFieldPlaceholder() }),
487
493
  itemProps: model => ({
488
- required: model.type === BaseMenuType.EXT_LINK
494
+ required: model.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
489
495
  }),
490
- visible: model => model.type === BaseMenuType.FOLDER || model.type === BaseMenuType.EXT_LINK
496
+ visible: model => model.type === BaseMenuType.BASE_MENU_TYPE_FOLDER || model.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
491
497
  },
492
498
  {
493
499
  prop: "meta.icon",
494
- label: t("system.menu.field.icon"),
500
+ label: t("system.base.menu.field.icon"),
495
501
  component: "slot",
496
502
  slotName: "menuIcon",
497
503
  itemProps: model => ({
498
- required: model.type !== BaseMenuType.BUTTON
504
+ required: model.type !== BaseMenuType.BASE_MENU_TYPE_BUTTON
499
505
  }),
500
- visible: model => !isAppMenu(model.parent_id) && model.type !== BaseMenuType.BUTTON
506
+ visible: model => !isAppMenu(model.parent_id) && model.type !== BaseMenuType.BASE_MENU_TYPE_BUTTON
501
507
  },
502
508
  {
503
509
  prop: "meta.icon",
504
- label: t("system.menu.field.defaultIcon"),
510
+ label: t("system.base.menu.field.default_icon"),
505
511
  component: "input",
506
- labelTooltip: t("system.menu.tooltip.mobileIcon"),
512
+ labelTooltip: t("system.base.menu.tooltip.mobile_icon"),
507
513
  itemProps: model => ({
508
514
  required: Boolean(model.meta?.app?.in_tab_bar)
509
515
  }),
510
- props: { placeholder: t("system.menu.placeholder.defaultIcon") },
516
+ props: { placeholder: t("system.base.menu.placeholder.default_icon") },
511
517
  visible: model => isAppMenu(model.parent_id)
512
518
  },
513
519
  {
514
520
  prop: "name",
515
- label: t(isAppMenu(formData.parent_id) ? "system.menu.field.logicalName" : "system.menu.field.routeName"),
521
+ label: t(isAppMenu(formData.parent_id) ? "system.base.menu.field.logical_name" : "system.base.menu.field.route_name"),
516
522
  component: "input",
517
- labelTooltip: isAppMenu(formData.parent_id) ? t("system.menu.tooltip.logicalName") : t("system.menu.tooltip.routeName"),
523
+ labelTooltip: isAppMenu(formData.parent_id)
524
+ ? t("system.base.menu.tooltip.logical_name")
525
+ : t("system.base.menu.tooltip.route_name"),
518
526
  itemProps: model => ({
519
- required: model.type === BaseMenuType.MENU
527
+ required: model.type === BaseMenuType.BASE_MENU_TYPE_MENU
520
528
  }),
521
529
  props: () => ({
522
530
  placeholder: isAppMenu(formData.parent_id)
523
- ? t("system.menu.placeholder.logicalName")
524
- : t("system.menu.placeholder.routeName")
531
+ ? t("system.base.menu.placeholder.logical_name")
532
+ : t("system.base.menu.placeholder.route_name")
525
533
  }),
526
- visible: model => model.type === BaseMenuType.MENU
534
+ visible: model => model.type === BaseMenuType.BASE_MENU_TYPE_MENU
527
535
  },
528
536
  {
529
537
  prop: "meta.app.view_key",
530
- label: t("system.menu.field.viewKey"),
538
+ label: t("system.base.menu.field.view_key"),
531
539
  component: "input",
532
- labelTooltip: t("system.menu.tooltip.viewKey"),
540
+ labelTooltip: t("system.base.menu.tooltip.view_key"),
533
541
  itemProps: { required: true },
534
- props: { placeholder: t("system.menu.placeholder.viewKey") },
542
+ props: { placeholder: t("system.base.menu.placeholder.view_key") },
535
543
  visible: model => isAppMenu(model.parent_id)
536
544
  },
537
545
  {
538
546
  prop: "meta.app.access",
539
- label: t("system.menu.field.access"),
547
+ label: t("system.base.menu.field.access"),
540
548
  component: "select",
541
549
  options: appAccessOptions.value,
542
550
  itemProps: { required: true },
543
551
  props: {
544
552
  clearable: false,
545
- placeholder: t("system.menu.placeholder.access")
553
+ placeholder: t("system.base.menu.placeholder.access")
546
554
  },
547
555
  visible: model => isAppMenu(model.parent_id)
548
556
  },
549
557
  {
550
558
  prop: "meta.app.selected_icon",
551
- label: t("system.menu.field.selectedIcon"),
559
+ label: t("system.base.menu.field.selected_icon"),
552
560
  component: "input",
553
- labelTooltip: t("system.menu.tooltip.mobileIcon"),
561
+ labelTooltip: t("system.base.menu.tooltip.mobile_icon"),
554
562
  itemProps: { required: true },
555
- props: { placeholder: t("system.menu.placeholder.selectedIcon") },
563
+ props: { placeholder: t("system.base.menu.placeholder.selected_icon") },
556
564
  visible: model => isAppTab(model.parent_id)
557
565
  },
558
566
  {
559
567
  prop: "component",
560
- label: t("system.menu.field.component"),
568
+ label: t("system.base.menu.field.component"),
561
569
  component: "input",
562
- labelTooltip: t("system.menu.tooltip.component"),
570
+ labelTooltip: t("system.base.menu.tooltip.component"),
563
571
  itemProps: model => ({
564
- required: model.type === BaseMenuType.MENU && !isAppMenu(model.parent_id)
572
+ required: model.type === BaseMenuType.BASE_MENU_TYPE_MENU && !isAppMenu(model.parent_id)
565
573
  }),
566
574
  props: { placeholder: "system/base/user/index" },
567
- visible: model => model.type === BaseMenuType.MENU && !isAppMenu(model.parent_id)
575
+ visible: model => model.type === BaseMenuType.BASE_MENU_TYPE_MENU && !isAppMenu(model.parent_id)
568
576
  },
569
577
  {
570
578
  prop: "meta.hidden",
571
- label: t("system.menu.field.hidden"),
579
+ label: t("system.base.menu.field.hidden"),
572
580
  component: "switch",
573
581
  props: {
574
582
  inlinePrompt: true,
575
- activeText: t("system.common.value.yes"),
576
- inactiveText: t("system.common.value.no"),
583
+ activeText: t("common.value.yes"),
584
+ inactiveText: t("common.value.no"),
577
585
  activeValue: true,
578
586
  inactiveValue: false
579
587
  },
580
- visible: model => !isAppMenu(model.parent_id) && model.type !== BaseMenuType.BUTTON
588
+ visible: model => !isAppMenu(model.parent_id) && model.type !== BaseMenuType.BASE_MENU_TYPE_BUTTON
581
589
  },
582
590
  {
583
591
  prop: "meta.always_show",
584
- label: t("system.menu.field.alwaysShow"),
592
+ label: t("system.base.menu.field.always_show"),
585
593
  component: "switch",
586
- labelTooltip: t("system.menu.tooltip.alwaysShow"),
594
+ labelTooltip: t("system.base.menu.tooltip.always_show"),
587
595
  props: {
588
596
  inlinePrompt: true,
589
- activeText: t("system.common.value.yes"),
590
- inactiveText: t("system.common.value.no"),
597
+ activeText: t("common.value.yes"),
598
+ inactiveText: t("common.value.no"),
591
599
  activeValue: true,
592
600
  inactiveValue: false
593
601
  },
594
- visible: model => !isAppMenu(model.parent_id) && (model.type === BaseMenuType.FOLDER || model.type === BaseMenuType.MENU)
602
+ visible: model =>
603
+ !isAppMenu(model.parent_id) &&
604
+ (model.type === BaseMenuType.BASE_MENU_TYPE_FOLDER || model.type === BaseMenuType.BASE_MENU_TYPE_MENU)
595
605
  },
596
606
  {
597
607
  prop: "meta.keep_alive",
598
- label: t("system.menu.field.keepAlive"),
608
+ label: t("system.base.menu.field.keep_alive"),
599
609
  component: "switch",
600
610
  props: {
601
611
  inlinePrompt: true,
@@ -604,11 +614,11 @@ const formFields = computed<ProFormField[]>(() => [
604
614
  activeValue: true,
605
615
  inactiveValue: false
606
616
  },
607
- visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.MENU
617
+ visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.BASE_MENU_TYPE_MENU
608
618
  },
609
619
  {
610
620
  prop: "meta.full",
611
- label: t("system.menu.field.fullscreen"),
621
+ label: t("system.base.menu.field.fullscreen"),
612
622
  component: "switch",
613
623
  props: {
614
624
  inlinePrompt: true,
@@ -617,11 +627,11 @@ const formFields = computed<ProFormField[]>(() => [
617
627
  activeValue: true,
618
628
  inactiveValue: false
619
629
  },
620
- visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.MENU
630
+ visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.BASE_MENU_TYPE_MENU
621
631
  },
622
632
  {
623
633
  prop: "meta.affix",
624
- label: t("system.menu.field.affix"),
634
+ label: t("system.base.menu.field.affix"),
625
635
  component: "switch",
626
636
  props: {
627
637
  inlinePrompt: true,
@@ -630,39 +640,42 @@ const formFields = computed<ProFormField[]>(() => [
630
640
  activeValue: true,
631
641
  inactiveValue: false
632
642
  },
633
- visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.MENU
643
+ visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.BASE_MENU_TYPE_MENU
634
644
  },
635
645
  {
636
646
  prop: "meta.params",
637
- label: t("system.menu.field.routeParams"),
647
+ label: t("system.base.menu.field.route_params"),
638
648
  component: "kv-list",
639
- labelTooltip: t("system.menu.tooltip.routeParams"),
649
+ labelTooltip: t("system.base.menu.tooltip.route_params"),
640
650
  props: {
641
- addText: t("system.menu.action.addRouteParam"),
642
- keyInputProps: { placeholder: t("common.field.parameterName") },
643
- valueInputProps: { placeholder: t("common.field.parameterValue") }
651
+ addText: t("system.base.menu.action.add_route_param"),
652
+ keyInputProps: { placeholder: t("common.field.parameter_name") },
653
+ valueInputProps: { placeholder: t("common.field.parameter_value") }
644
654
  },
645
655
  itemProps: {
646
656
  class: "menu-form__params"
647
657
  },
648
- visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.MENU
658
+ visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.BASE_MENU_TYPE_MENU
649
659
  },
650
660
  {
651
661
  prop: "api",
652
- label: t("system.menu.field.apiList"),
662
+ label: t("system.base.menu.field.api_list"),
653
663
  component: "transfer",
654
664
  slotName: "apiTransferItem",
655
665
  options: transferData.value,
656
666
  props: {
657
667
  filterable: true,
658
- titles: [t("system.menu.value.availableApi"), t("system.menu.value.selectedApi")]
668
+ titles: [t("system.base.menu.value.available_api"), t("system.base.menu.value.selected_api")]
659
669
  },
660
- visible: model => model.id === APP_MENU_ROOT_ID || model.type === BaseMenuType.MENU || model.type === BaseMenuType.BUTTON,
670
+ visible: model =>
671
+ model.id === APP_MENU_ROOT_ID ||
672
+ model.type === BaseMenuType.BASE_MENU_TYPE_MENU ||
673
+ model.type === BaseMenuType.BASE_MENU_TYPE_BUTTON,
661
674
  colSpan: 24
662
675
  },
663
676
  {
664
677
  prop: "sort",
665
- label: t("system.common.field.sort"),
678
+ label: t("common.field.sort"),
666
679
  component: "input-number",
667
680
  itemProps: {
668
681
  required: true
@@ -677,7 +690,7 @@ const formFields = computed<ProFormField[]>(() => [
677
690
  },
678
691
  {
679
692
  prop: "status",
680
- label: t("system.common.field.status"),
693
+ label: t("common.field.status"),
681
694
  component: "radio-group",
682
695
  itemProps: {
683
696
  required: true
@@ -689,11 +702,11 @@ const formFields = computed<ProFormField[]>(() => [
689
702
  const rules = computed<FormRules>(() => ({
690
703
  parent_id: formData.id
691
704
  ? []
692
- : [{ required: true, type: "number", min: 1, message: t("system.menu.placeholder.parent"), trigger: "change" }],
705
+ : [{ required: true, type: "number", min: 1, message: t("system.base.menu.placeholder.parent"), trigger: "change" }],
693
706
  type: [
694
707
  {
695
708
  required: true,
696
- message: t("system.common.validation.requiredSelect", { field: t("system.menu.field.type") }),
709
+ message: t("common.validation.required_select", { field: t("system.base.menu.field.type") }),
697
710
  trigger: "change"
698
711
  }
699
712
  ],
@@ -703,7 +716,11 @@ const rules = computed<FormRules>(() => ({
703
716
  if (value) return callback();
704
717
  callback(
705
718
  new Error(
706
- t(formData.type === BaseMenuType.BUTTON ? "system.menu.placeholder.buttonName" : "system.menu.placeholder.title")
719
+ t(
720
+ formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON
721
+ ? "system.base.menu.placeholder.button_name"
722
+ : "system.base.menu.placeholder.title"
723
+ )
707
724
  )
708
725
  );
709
726
  },
@@ -713,11 +730,13 @@ const rules = computed<FormRules>(() => ({
713
730
  "meta.icon": [
714
731
  {
715
732
  validator: (_rule, value, callback) => {
716
- if (formData.type === BaseMenuType.BUTTON) return callback();
733
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) return callback();
717
734
  if (isAppMenu(formData.parent_id) && !isAppTab(formData.parent_id)) return callback();
718
735
  if (value) return callback();
719
736
  callback(
720
- new Error(t(isAppMenu(formData.parent_id) ? "system.menu.validation.defaultIcon" : "system.menu.placeholder.icon"))
737
+ new Error(
738
+ t(isAppMenu(formData.parent_id) ? "system.base.menu.validation.default_icon" : "system.base.menu.placeholder.icon")
739
+ )
721
740
  );
722
741
  },
723
742
  trigger: "change"
@@ -727,7 +746,7 @@ const rules = computed<FormRules>(() => ({
727
746
  {
728
747
  validator: (_rule, value, callback) => {
729
748
  if (!isAppMenu(formData.parent_id) || value) return callback();
730
- callback(new Error(t("system.menu.validation.viewKey")));
749
+ callback(new Error(t("system.base.menu.validation.view_key")));
731
750
  },
732
751
  trigger: "blur"
733
752
  }
@@ -736,7 +755,7 @@ const rules = computed<FormRules>(() => ({
736
755
  {
737
756
  validator: (_rule, value, callback) => {
738
757
  if (!isAppMenu(formData.parent_id) || value) return callback();
739
- callback(new Error(t("system.menu.placeholder.access")));
758
+ callback(new Error(t("system.base.menu.placeholder.access")));
740
759
  },
741
760
  trigger: "change"
742
761
  }
@@ -745,7 +764,7 @@ const rules = computed<FormRules>(() => ({
745
764
  {
746
765
  validator: (_rule, value, callback) => {
747
766
  if (!isAppTab(formData.parent_id) || value) return callback();
748
- callback(new Error(t("system.menu.validation.selectedIcon")));
767
+ callback(new Error(t("system.base.menu.validation.selected_icon")));
749
768
  },
750
769
  trigger: "blur"
751
770
  }
@@ -753,23 +772,29 @@ const rules = computed<FormRules>(() => ({
753
772
  path: [
754
773
  {
755
774
  max: 1024,
756
- message: t("system.common.validation.maxLength", { field: t("system.menu.field.path"), max: 1024 }),
775
+ message: t("common.validation.max_length", { field: t("system.base.menu.field.path"), max: 1024 }),
757
776
  trigger: "blur"
758
777
  },
759
778
  {
760
779
  validator: (_rule, value, callback) => {
761
- if (formData.type === BaseMenuType.FOLDER) return callback();
780
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) return callback();
762
781
  if (!value) {
763
- if (formData.type === BaseMenuType.BUTTON) return callback(new Error(t("system.menu.validation.permission")));
764
- if (formData.type === BaseMenuType.EXT_LINK) return callback(new Error(t("system.menu.validation.externalUrl")));
782
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON)
783
+ return callback(new Error(t("system.base.menu.validation.permission")));
784
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK)
785
+ return callback(new Error(t("system.base.menu.validation.external_url")));
765
786
  return callback(
766
787
  new Error(
767
- t(isAppMenu(formData.parent_id) ? "system.menu.validation.logicalPath" : "system.menu.validation.routePath")
788
+ t(
789
+ isAppMenu(formData.parent_id)
790
+ ? "system.base.menu.validation.logical_path"
791
+ : "system.base.menu.validation.route_path"
792
+ )
768
793
  )
769
794
  );
770
795
  }
771
796
  if (isAppMenu(formData.parent_id) && !String(value).startsWith("app/")) {
772
- return callback(new Error(t("system.menu.validation.appPathPrefix")));
797
+ return callback(new Error(t("system.base.menu.validation.app_path_prefix")));
773
798
  }
774
799
  callback();
775
800
  },
@@ -779,14 +804,14 @@ const rules = computed<FormRules>(() => ({
779
804
  redirect: [
780
805
  {
781
806
  max: 1024,
782
- message: t("system.common.validation.maxLength", { field: t("system.menu.field.redirect"), max: 1024 }),
807
+ message: t("common.validation.max_length", { field: t("system.base.menu.field.redirect"), max: 1024 }),
783
808
  trigger: "blur"
784
809
  },
785
810
  {
786
811
  validator: (_rule, value, callback) => {
787
- if (formData.type !== BaseMenuType.EXT_LINK) return callback();
812
+ if (formData.type !== BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return callback();
788
813
  if (/^https?:\/\/\S+$/.test(value)) return callback();
789
- callback(new Error(t("system.menu.validation.httpUrl")));
814
+ callback(new Error(t("system.base.menu.validation.http_url")));
790
815
  },
791
816
  trigger: "blur"
792
817
  }
@@ -794,20 +819,24 @@ const rules = computed<FormRules>(() => ({
794
819
  name: [
795
820
  {
796
821
  max: 255,
797
- message: t("system.common.validation.maxLength", { field: t("system.menu.field.routeName"), max: 255 }),
822
+ message: t("common.validation.max_length", { field: t("system.base.menu.field.route_name"), max: 255 }),
798
823
  trigger: "blur"
799
824
  },
800
825
  {
801
826
  validator: (_rule, value, callback) => {
802
- if (formData.type !== BaseMenuType.MENU) return callback();
827
+ if (formData.type !== BaseMenuType.BASE_MENU_TYPE_MENU) return callback();
803
828
  if (!value)
804
829
  return callback(
805
830
  new Error(
806
- t(isAppMenu(formData.parent_id) ? "system.menu.validation.logicalName" : "system.menu.placeholder.routeName")
831
+ t(
832
+ isAppMenu(formData.parent_id)
833
+ ? "system.base.menu.validation.logical_name"
834
+ : "system.base.menu.placeholder.route_name"
835
+ )
807
836
  )
808
837
  );
809
838
  if (isAppMenu(formData.parent_id) && !String(value).startsWith("App")) {
810
- return callback(new Error(t("system.menu.validation.appNamePrefix")));
839
+ return callback(new Error(t("system.base.menu.validation.app_name_prefix")));
811
840
  }
812
841
  callback();
813
842
  },
@@ -817,23 +846,23 @@ const rules = computed<FormRules>(() => ({
817
846
  component: [
818
847
  {
819
848
  max: 255,
820
- message: t("system.common.validation.maxLength", { field: t("system.menu.field.component"), max: 255 }),
849
+ message: t("common.validation.max_length", { field: t("system.base.menu.field.component"), max: 255 }),
821
850
  trigger: "blur"
822
851
  },
823
852
  {
824
853
  validator: (_rule, value, callback) => {
825
- if (formData.type !== BaseMenuType.MENU || isAppMenu(formData.parent_id)) return callback();
854
+ if (formData.type !== BaseMenuType.BASE_MENU_TYPE_MENU || isAppMenu(formData.parent_id)) return callback();
826
855
  if (value) return callback();
827
- callback(new Error(t("system.menu.validation.component")));
856
+ callback(new Error(t("system.base.menu.validation.component")));
828
857
  },
829
858
  trigger: "blur"
830
859
  }
831
860
  ],
832
- sort: [{ required: true, type: "number", min: 1, message: t("system.common.validation.sortPositive"), trigger: "blur" }],
861
+ sort: [{ required: true, type: "number", min: 1, message: t("common.validation.sort_positive"), trigger: "blur" }],
833
862
  status: [
834
863
  {
835
864
  required: true,
836
- message: t("system.common.validation.requiredSelect", { field: t("system.common.field.status") }),
865
+ message: t("common.validation.required_select", { field: t("common.field.status") }),
837
866
  trigger: "change"
838
867
  }
839
868
  ]
@@ -841,38 +870,44 @@ const rules = computed<FormRules>(() => ({
841
870
 
842
871
  /** 计算当前路径字段文案。 */
843
872
  function getPathFieldLabel() {
844
- if (isAppMenu(formData.parent_id)) return t("system.menu.field.logicalPath");
845
- if (formData.type === BaseMenuType.BUTTON) return t("system.menu.field.permission");
846
- if (formData.type === BaseMenuType.EXT_LINK) return t("system.menu.field.internalPath");
847
- return t("system.menu.field.path");
873
+ if (isAppMenu(formData.parent_id)) return t("system.base.menu.field.logical_path");
874
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) return t("system.base.menu.field.permission");
875
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return t("system.base.menu.field.internal_path");
876
+ return t("system.base.menu.field.path");
848
877
  }
849
878
 
850
879
  /** 计算当前路径字段占位文案。 */
851
880
  function getPathFieldPlaceholder() {
852
- if (isAppMenu(formData.parent_id)) return t("system.menu.placeholder.logicalPath");
853
- if (formData.type === BaseMenuType.BUTTON) return t("system.menu.placeholder.permission");
854
- if (formData.type === BaseMenuType.EXT_LINK) return "external/baidu";
855
- if (formData.type === BaseMenuType.FOLDER) return "base";
881
+ if (isAppMenu(formData.parent_id)) return t("system.base.menu.placeholder.logical_path");
882
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) return t("system.base.menu.placeholder.permission");
883
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return "external/baidu";
884
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) return "base";
856
885
  return "user";
857
886
  }
858
887
 
859
888
  /** 计算当前路径字段提示文案。 */
860
889
  function getPathFieldTooltip() {
861
- if (isAppMenu(formData.parent_id)) return t("system.menu.tooltip.logicalPath");
862
- if (formData.type === BaseMenuType.BUTTON) return t("system.menu.tooltip.permission");
863
- if (formData.type === BaseMenuType.EXT_LINK) return t("system.menu.tooltip.internalPath");
864
- if (formData.type === BaseMenuType.FOLDER) return t("system.menu.tooltip.folderPath");
865
- return t("system.menu.tooltip.routePath");
890
+ if (isAppMenu(formData.parent_id)) return t("system.base.menu.tooltip.logical_path");
891
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) return t("system.base.menu.tooltip.permission");
892
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return t("system.base.menu.tooltip.internal_path");
893
+ if (formData.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) return t("system.base.menu.tooltip.folder_path");
894
+ return t("system.base.menu.tooltip.route_path");
866
895
  }
867
896
 
868
897
  /** 计算重定向字段文案。 */
869
898
  function getRedirectFieldLabel() {
870
- return t(formData.type === BaseMenuType.EXT_LINK ? "system.menu.field.externalUrl" : "system.menu.field.redirectRoute");
899
+ return t(
900
+ formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
901
+ ? "system.base.menu.field.external_url"
902
+ : "system.base.menu.field.redirect_route"
903
+ );
871
904
  }
872
905
 
873
906
  /** 计算重定向字段占位文案。 */
874
907
  function getRedirectFieldPlaceholder() {
875
- return formData.type === BaseMenuType.EXT_LINK ? "https://www.example.com/" : t("system.menu.placeholder.redirectRoute");
908
+ return formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
909
+ ? "https://www.example.com/"
910
+ : t("system.base.menu.placeholder.redirect_route");
876
911
  }
877
912
 
878
913
  /** 判断当前图标是否为 Element Plus 图标。 */
@@ -929,7 +964,7 @@ function normalizeMenuForm(data?: Partial<BaseMenuForm>): MenuFormState {
929
964
  ...defaultForm,
930
965
  ...data,
931
966
  parent_id: parentId,
932
- type: data?.type ?? BaseMenuType.FOLDER,
967
+ type: data?.type ?? BaseMenuType.BASE_MENU_TYPE_FOLDER,
933
968
  status: data?.status ?? Status.ENABLE,
934
969
  api: normalizeMenuApiSelection(data?.api),
935
970
  sort: data?.sort ?? 1,
@@ -943,7 +978,7 @@ function buildMenuOptions(menuList: BaseMenu[] = []) {
943
978
  const mobileIds = new Set<number>([APP_MENU_ROOT_ID]);
944
979
  const convert = (list: BaseMenu[]): ProFormOption[] =>
945
980
  list
946
- .filter(item => item.type === BaseMenuType.FOLDER || item.type === BaseMenuType.MENU)
981
+ .filter(item => item.type === BaseMenuType.BASE_MENU_TYPE_FOLDER || item.type === BaseMenuType.BASE_MENU_TYPE_MENU)
947
982
  .map(item => {
948
983
  typeMap.set(item.id, item.type);
949
984
  if (mobileIds.has(item.parent_id ?? 0)) mobileIds.add(item.id);
@@ -962,7 +997,11 @@ function buildMenuOptions(menuList: BaseMenu[] = []) {
962
997
  /** 根据菜单类型清理无效字段,避免提交脏数据。 */
963
998
  function buildSubmitPayload(): BaseMenuForm {
964
999
  const payload = normalizeMenuForm(formData);
965
- payload.translations = serializeDynamicTranslations(translationValues.value, "title") as unknown as BaseMenuTranslation[];
1000
+ payload.translations = serializeDynamicTranslations(
1001
+ translationValues.value,
1002
+ TranslationTargetType.TRANSLATION_TARGET_TYPE_BASE_MENU,
1003
+ payload.id
1004
+ );
966
1005
  // 一级菜单在表单中保持空白,提交时仍按接口约定传回根节点标识。
967
1006
  if (payload.id > 0 && payload.parent_id === undefined) payload.parent_id = 0;
968
1007
  payload.meta.params = (payload.meta.params ?? []).filter(item => item.key || item.value);
@@ -981,7 +1020,7 @@ function buildSubmitPayload(): BaseMenuForm {
981
1020
  if (!payload.meta.app.in_tab_bar) payload.meta.app.selected_icon = undefined;
982
1021
  }
983
1022
 
984
- if (payload.type === BaseMenuType.BUTTON) {
1023
+ if (payload.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) {
985
1024
  payload.name = "";
986
1025
  payload.component = "";
987
1026
  payload.redirect = "";
@@ -994,7 +1033,7 @@ function buildSubmitPayload(): BaseMenuForm {
994
1033
  payload.meta.params = [];
995
1034
  }
996
1035
 
997
- if (payload.type === BaseMenuType.FOLDER) {
1036
+ if (payload.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) {
998
1037
  payload.path = "";
999
1038
  payload.name = "";
1000
1039
  payload.component = "Layout";
@@ -1005,7 +1044,7 @@ function buildSubmitPayload(): BaseMenuForm {
1005
1044
  payload.meta.params = [];
1006
1045
  }
1007
1046
 
1008
- if (payload.type === BaseMenuType.EXT_LINK) {
1047
+ if (payload.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) {
1009
1048
  payload.name = "";
1010
1049
  payload.component = "";
1011
1050
  payload.api = [];
@@ -1080,7 +1119,7 @@ async function handleOpenDialog(parentMenu?: BaseMenu, menuId?: number) {
1080
1119
  await loadDialogResources();
1081
1120
  dialog.parentLocked = Boolean(parentMenu || menuId);
1082
1121
  dialog.editing = Boolean(menuId);
1083
- dialog.parentType = parentMenu?.type ?? BaseMenuType.UNKNOWN_MT;
1122
+ dialog.parentType = parentMenu?.type ?? BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED;
1084
1123
  resetForm(menuId ? undefined : { parent_id: parentMenu?.id });
1085
1124
  dialog.visible = true;
1086
1125
 
@@ -1094,7 +1133,7 @@ async function handleOpenDialog(parentMenu?: BaseMenu, menuId?: number) {
1094
1133
  /** 关闭菜单弹窗并显式重置表单与校验状态。 */
1095
1134
  function handleCloseDialog() {
1096
1135
  dialog.visible = false;
1097
- dialog.parentType = BaseMenuType.UNKNOWN_MT;
1136
+ dialog.parentType = BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED;
1098
1137
  dialog.parentLocked = true;
1099
1138
  resetForm();
1100
1139
  }
@@ -1115,10 +1154,10 @@ async function handleSubmit() {
1115
1154
  const payload = buildSubmitPayload();
1116
1155
  if (payload.id > 0) {
1117
1156
  await defBaseMenuService.UpdateBaseMenu({ base_menu: payload });
1118
- ElMessage.success(t("system.menu.message.updateSuccess"));
1157
+ ElMessage.success(t("system.base.menu.message.update_success"));
1119
1158
  } else {
1120
1159
  await defBaseMenuService.CreateBaseMenu({ base_menu: payload });
1121
- ElMessage.success(t("system.menu.message.createSuccess"));
1160
+ ElMessage.success(t("system.base.menu.message.create_success"));
1122
1161
  }
1123
1162
 
1124
1163
  handleCloseDialog();
@@ -1133,13 +1172,17 @@ async function handleBeforeSetStatus(row: BaseMenu) {
1133
1172
  const action = t(nextStatus === Status.ENABLE ? "common.status.enabled" : "common.status.disabled");
1134
1173
  const menuName = row.meta?.title || row.name || row.path || `ID:${row.id}`;
1135
1174
  try {
1136
- await ElMessageBox.confirm(t("system.menu.message.confirmStatus", { action, name: menuName }), t("common.title.notice"), {
1137
- confirmButtonText: t("common.action.confirm"),
1138
- cancelButtonText: t("common.action.cancel"),
1139
- type: "warning"
1140
- });
1175
+ await ElMessageBox.confirm(
1176
+ t("system.base.menu.message.confirm_status", { action, name: menuName }),
1177
+ t("common.title.notice"),
1178
+ {
1179
+ confirmButtonText: t("common.action.confirm"),
1180
+ cancelButtonText: t("common.action.cancel"),
1181
+ type: "warning"
1182
+ }
1183
+ );
1141
1184
  await defBaseMenuService.SetBaseMenuStatus({ id: row.id, status: nextStatus });
1142
- ElMessage.success(t("system.common.message.statusSuccess", { action }));
1185
+ ElMessage.success(t("common.message.status_success", { action }));
1143
1186
  refreshTable();
1144
1187
  return true;
1145
1188
  } catch {
@@ -1157,23 +1200,23 @@ function handleDeleteMenu(selected?: number | string | Array<number | string> |
1157
1200
  ? [selected as BaseMenu]
1158
1201
  : [];
1159
1202
  if (menuList.some(item => item.parent_id === 0 || item.id === APP_MENU_ROOT_ID)) {
1160
- ElMessage.warning(t("system.menu.message.protectedDelete"));
1203
+ ElMessage.warning(t("system.base.menu.message.protected_delete"));
1161
1204
  return;
1162
1205
  }
1163
1206
  const menuIds = (
1164
1207
  menuList.length ? menuList.map(item => item.id) : normalizeSelectedIds(selected as number | string | Array<number | string>)
1165
1208
  ).join(",");
1166
1209
  if (!menuIds) {
1167
- ElMessage.warning(t("system.common.message.selectDeleteItem"));
1210
+ ElMessage.warning(t("common.message.select_delete_item"));
1168
1211
  return;
1169
1212
  }
1170
1213
 
1171
1214
  const singleMenuName = menuList[0]?.meta?.title || menuList[0]?.name || menuList[0]?.path || `ID:${menuList[0]?.id ?? ""}`;
1172
1215
  const confirmMessage = menuList.length
1173
1216
  ? menuList.length === 1
1174
- ? t("system.menu.message.confirmDeleteSingle", { name: singleMenuName })
1175
- : t("system.menu.message.confirmDeleteBatch", { count: menuList.length })
1176
- : t("system.menu.message.confirmDeleteSelected");
1217
+ ? t("system.base.menu.message.confirm_delete_single", { name: singleMenuName })
1218
+ : t("system.base.menu.message.confirm_delete_batch", { count: menuList.length })
1219
+ : t("system.base.menu.message.confirm_delete_selected");
1177
1220
 
1178
1221
  ElMessageBox.confirm(confirmMessage, t("common.title.warning"), {
1179
1222
  confirmButtonText: t("common.action.confirm"),
@@ -1182,12 +1225,12 @@ function handleDeleteMenu(selected?: number | string | Array<number | string> |
1182
1225
  }).then(
1183
1226
  () => {
1184
1227
  defBaseMenuService.DeleteBaseMenu({ id: menuIds }).then(() => {
1185
- ElMessage.success(t("system.menu.message.deleteSuccess"));
1228
+ ElMessage.success(t("system.base.menu.message.delete_success"));
1186
1229
  refreshTable();
1187
1230
  });
1188
1231
  },
1189
1232
  () => {
1190
- ElMessage.info(t("system.menu.message.deleteCanceled"));
1233
+ ElMessage.info(t("system.base.menu.message.delete_canceled"));
1191
1234
  }
1192
1235
  );
1193
1236
  }