@liujitcn/kratos-admin-system 0.0.20 → 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 (118) hide show
  1. package/README.md +51 -50
  2. package/dist/package/declarations/src/api/system/base_language.d.ts +52 -0
  3. package/dist/package/declarations/src/api/system/base_translation.d.ts +10 -0
  4. package/dist/package/declarations/src/api/system/code_gen_i18n.d.ts +8 -0
  5. package/dist/package/declarations/src/api/system/ops_monitoring.d.ts +19 -0
  6. package/dist/package/declarations/src/api/system/ops_monitoring_sse.d.ts +12 -0
  7. package/dist/package/declarations/src/components/DynamicTranslationCell.vue.d.ts +16 -0
  8. package/dist/package/declarations/src/components/DynamicTranslationEditor.vue.d.ts +20 -0
  9. package/dist/package/declarations/src/components/dynamicTranslation.d.ts +38 -0
  10. package/dist/package/declarations/src/locales/generated.d.ts +6536 -0
  11. package/dist/package/declarations/src/rpc/base/v1/ai_session.d.ts +12 -2
  12. package/dist/package/declarations/src/rpc/base/v1/ai_tool.d.ts +9 -1
  13. package/dist/package/declarations/src/rpc/base/v1/config.d.ts +35 -0
  14. package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +1 -1
  15. package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +23 -2
  16. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +9 -0
  17. package/dist/package/declarations/src/rpc/system/admin/v1/base_job.d.ts +9 -1
  18. package/dist/package/declarations/src/rpc/system/admin/v1/base_language.d.ts +119 -0
  19. package/dist/package/declarations/src/rpc/system/admin/v1/base_menu.d.ts +6 -1
  20. package/dist/package/declarations/src/rpc/system/admin/v1/base_migration.d.ts +6 -6
  21. package/dist/package/declarations/src/rpc/system/admin/v1/base_role.d.ts +13 -1
  22. package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +75 -0
  23. package/dist/package/declarations/src/rpc/system/admin/v1/base_user.d.ts +11 -1
  24. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen.d.ts +13 -11
  25. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_column.d.ts +7 -0
  26. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_table.d.ts +24 -1
  27. package/dist/package/declarations/src/rpc/system/admin/v1/common.d.ts +13 -0
  28. package/dist/package/declarations/src/rpc/system/admin/v1/ops_monitoring.d.ts +222 -0
  29. package/dist/package/declarations/src/views/base/language/index.vue.d.ts +3 -0
  30. package/dist/package/declarations/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue.d.ts +23 -0
  31. package/dist/package/declarations/src/views/tool/code-gen/config.d.ts +7 -7
  32. package/dist/package/declarations/src/views/tool/ops-monitoring/index.vue.d.ts +3 -0
  33. package/dist/package/src/api/base/ai_message.ts +7 -12
  34. package/dist/package/src/api/base/sse.ts +3 -1
  35. package/dist/package/src/api/system/base_language.ts +135 -0
  36. package/dist/package/src/api/system/base_translation.ts +33 -0
  37. package/dist/package/src/api/system/code_gen_column.ts +17 -3
  38. package/dist/package/src/api/system/code_gen_i18n.ts +18 -0
  39. package/dist/package/src/api/system/code_gen_table.ts +12 -4
  40. package/dist/package/src/api/system/ops_monitoring.ts +88 -0
  41. package/dist/package/src/api/system/ops_monitoring_sse.ts +49 -0
  42. package/dist/package/src/components/DynamicTranslationCell.vue +249 -0
  43. package/dist/package/src/components/DynamicTranslationEditor.vue +197 -0
  44. package/dist/package/src/components/dynamicTranslation.ts +66 -0
  45. package/dist/package/src/locales/README.md +30 -0
  46. package/dist/package/src/locales/en-US.json +933 -0
  47. package/dist/package/src/locales/es-ES.json +933 -0
  48. package/dist/package/src/locales/fr-FR.json +933 -0
  49. package/dist/package/src/locales/generated.ts +22 -0
  50. package/dist/package/src/locales/ja-JP.json +933 -0
  51. package/dist/package/src/locales/ko-KR.json +933 -0
  52. package/dist/package/src/locales/zh-CN.json +933 -0
  53. package/dist/package/src/locales/zh-TW.json +933 -0
  54. package/dist/package/src/module.ts +6 -2
  55. package/dist/package/src/rpc/base/v1/ai_session.ts +13 -2
  56. package/dist/package/src/rpc/base/v1/ai_tool.ts +10 -1
  57. package/dist/package/src/rpc/base/v1/config.ts +47 -0
  58. package/dist/package/src/rpc/system/admin/v1/auth.ts +1 -1
  59. package/dist/package/src/rpc/system/admin/v1/base_config.ts +24 -2
  60. package/dist/package/src/rpc/system/admin/v1/base_dict.ts +9 -0
  61. package/dist/package/src/rpc/system/admin/v1/base_job.ts +10 -1
  62. package/dist/package/src/rpc/system/admin/v1/base_language.ts +141 -0
  63. package/dist/package/src/rpc/system/admin/v1/base_menu.ts +6 -1
  64. package/dist/package/src/rpc/system/admin/v1/base_migration.ts +8 -8
  65. package/dist/package/src/rpc/system/admin/v1/base_role.ts +14 -1
  66. package/dist/package/src/rpc/system/admin/v1/base_translation.ts +90 -0
  67. package/dist/package/src/rpc/system/admin/v1/base_user.ts +12 -1
  68. package/dist/package/src/rpc/system/admin/v1/code_gen.ts +16 -12
  69. package/dist/package/src/rpc/system/admin/v1/code_gen_column.ts +8 -0
  70. package/dist/package/src/rpc/system/admin/v1/code_gen_table.ts +27 -1
  71. package/dist/package/src/rpc/system/admin/v1/common.ts +21 -0
  72. package/dist/package/src/rpc/system/admin/v1/ops_monitoring.ts +255 -0
  73. package/dist/package/src/views/ai/chat/components/AiMarkdown.vue +1 -6
  74. package/dist/package/src/views/ai/chat/components/ChatPanel.vue +75 -58
  75. package/dist/package/src/views/ai/chat/components/SessionPanel.vue +20 -9
  76. package/dist/package/src/views/ai/chat/components/XSender.vue +36 -23
  77. package/dist/package/src/views/ai/chat/index.vue +58 -41
  78. package/dist/package/src/views/ai/chat/message.ts +29 -27
  79. package/dist/package/src/views/base/api/index.vue +121 -84
  80. package/dist/package/src/views/base/area/index.vue +81 -32
  81. package/dist/package/src/views/base/config/index.vue +300 -96
  82. package/dist/package/src/views/base/dept/index.vue +110 -62
  83. package/dist/package/src/views/base/dict/index.vue +145 -62
  84. package/dist/package/src/views/base/dict/item.vue +155 -64
  85. package/dist/package/src/views/base/job/index.vue +134 -82
  86. package/dist/package/src/views/base/job/log.vue +24 -25
  87. package/dist/package/src/views/base/language/index.vue +260 -0
  88. package/dist/package/src/views/base/log/index.vue +68 -46
  89. package/dist/package/src/views/base/menu/index.vue +344 -200
  90. package/dist/package/src/views/base/migration/index.vue +49 -29
  91. package/dist/package/src/views/base/post/index.vue +128 -60
  92. package/dist/package/src/views/base/role/index.vue +145 -79
  93. package/dist/package/src/views/base/tenant/index.vue +132 -64
  94. package/dist/package/src/views/base/user/components/dept-tree.vue +2 -1
  95. package/dist/package/src/views/base/user/index.vue +194 -116
  96. package/dist/package/src/views/profile/components/base.vue +45 -28
  97. package/dist/package/src/views/profile/components/password.vue +45 -30
  98. package/dist/package/src/views/profile/components/security.vue +90 -54
  99. package/dist/package/src/views/profile/index.vue +10 -9
  100. package/dist/package/src/views/tool/api-doc/index.vue +6 -2
  101. package/dist/package/src/views/tool/code-gen/code-preview/index.vue +32 -16
  102. package/dist/package/src/views/tool/code-gen/columns/index.vue +382 -273
  103. package/dist/package/src/views/tool/code-gen/columns/option-copy.ts +1 -6
  104. package/dist/package/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue +118 -0
  105. package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +65 -36
  106. package/dist/package/src/views/tool/code-gen/components/CodePreviewPane.vue +8 -5
  107. package/dist/package/src/views/tool/code-gen/config.ts +116 -79
  108. package/dist/package/src/views/tool/code-gen/preview/data.ts +19 -17
  109. package/dist/package/src/views/tool/code-gen/preview/index.vue +96 -59
  110. package/dist/package/src/views/tool/code-gen/proto/index.vue +110 -62
  111. package/dist/package/src/views/tool/code-gen/table/index.vue +201 -121
  112. package/dist/package/src/views/tool/ops-monitoring/index.vue +1175 -0
  113. package/dist/package/src/views/tool/project-doc/index.vue +17 -15
  114. package/package.json +6 -2
  115. package/dist/package/declarations/src/rpc/base/v1/enum.d.ts +0 -43
  116. package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +0 -67
  117. package/dist/package/src/rpc/base/v1/enum.ts +0 -54
  118. package/dist/package/src/rpc/system/common/v1/enum.ts +0 -80
@@ -12,19 +12,22 @@
12
12
  <FormDialog
13
13
  v-model="dialog.visible"
14
14
  ref="formDialogRef"
15
- :title="dialog.title"
15
+ :title="t(dialog.editing ? 'system.base.role.action.edit' : 'system.base.role.action.create')"
16
16
  width="500px"
17
17
  :model="formData"
18
18
  :fields="formFields"
19
19
  :rules="rules"
20
- label-width="100px"
21
20
  @confirm="handleSubmit"
22
21
  @close="handleCloseDialog"
23
22
  />
24
23
 
25
- <el-drawer v-model="assignPermDialogVisible" :title="`【${checkedBaseRole.name}】权限分配`" size="500">
24
+ <el-drawer
25
+ v-model="assignPermDialogVisible"
26
+ :title="t('system.base.role.title.assign_permission', { name: checkedBaseRole.name || '' })"
27
+ size="500"
28
+ >
26
29
  <div class="perm-toolbar">
27
- <el-input v-model="permKeywords" clearable class="perm-search" placeholder="菜单权限名称">
30
+ <el-input v-model="permKeywords" clearable class="perm-search" :placeholder="t('system.base.role.placeholder.menu_permission')">
28
31
  <template #prefix>
29
32
  <Search />
30
33
  </template>
@@ -32,19 +35,21 @@
32
35
 
33
36
  <div class="perm-toolbar__actions">
34
37
  <div class="perm-toolbar__group">
35
- <span class="perm-toolbar__label">树操作</span>
38
+ <span class="perm-toolbar__label">{{ t("system.base.role.field.tree_operation") }}</span>
36
39
  <el-button type="primary" size="small" plain class="perm-toolbar__button" @click="togglePermTree">
37
40
  <template #icon>
38
41
  <Switch />
39
42
  </template>
40
- {{ isExpanded ? "收缩节点" : "展开节点" }}
43
+ {{ t(isExpanded ? "system.base.role.action.collapse_nodes" : "system.base.role.action.expand_nodes") }}
41
44
  </el-button>
42
45
  </div>
43
46
  <div class="perm-toolbar__group perm-toolbar__group--linkage">
44
- <span class="perm-toolbar__label">勾选模式</span>
45
- <el-checkbox v-model="parentChildLinked" @change="handelParentChildLinkedChange">父子联动</el-checkbox>
47
+ <span class="perm-toolbar__label">{{ t("system.base.role.field.selection_mode") }}</span>
48
+ <el-checkbox v-model="parentChildLinked" @change="handelParentChildLinkedChange">{{
49
+ t("system.base.role.field.parent_child_linked")
50
+ }}</el-checkbox>
46
51
  <el-tooltip placement="bottom">
47
- <template #content>如果只需勾选菜单权限,不需要勾选子菜单或者按钮权限,请关闭父子联动</template>
52
+ <template #content>{{ t("system.base.role.message.parent_child_linked_tip") }}</template>
48
53
  <el-icon class="perm-linkage__icon">
49
54
  <QuestionFilled />
50
55
  </el-icon>
@@ -70,8 +75,8 @@
70
75
 
71
76
  <template #footer>
72
77
  <div class="dialog-footer">
73
- <el-button type="primary" @click="handleAssignPermSubmit">确 定</el-button>
74
- <el-button @click="assignPermDialogVisible = false">取 消</el-button>
78
+ <el-button type="primary" @click="handleAssignPermSubmit">{{ t("common.action.confirm") }}</el-button>
79
+ <el-button @click="assignPermDialogVisible = false">{{ t("common.action.cancel") }}</el-button>
75
80
  </div>
76
81
  </template>
77
82
  </el-drawer>
@@ -97,6 +102,7 @@ import { Status } from "@liujitcn/kratos-admin-system/rpc/common/v1/enum";
97
102
  import { buildPageRequest, normalizeSelectedIds } from "@liujitcn/kratos-admin-core/table";
98
103
  import { useUserStore } from "@liujitcn/kratos-admin-core/stores/runtime";
99
104
  import { DEFAULT_TENANT_CODE, requestTenantOptions } from "@liujitcn/kratos-admin-core/tenant";
105
+ import { t } from "@liujitcn/kratos-admin-core";
100
106
 
101
107
  defineOptions({
102
108
  name: "BaseRole",
@@ -122,16 +128,16 @@ const formDialogRef = ref<InstanceType<typeof FormDialog>>();
122
128
  const permTreeRef = ref<InstanceType<typeof ElTree>>();
123
129
 
124
130
  const dialog = reactive({
125
- title: "",
131
+ editing: false,
126
132
  visible: false
127
133
  });
128
134
 
129
135
  const menuPermOptions = ref<TreeOptionResponse_Option[]>([]);
130
136
  const tenantOptions = ref<SelectOptionResponse_Option[]>([]);
131
- const statusOptions: ProFormOption[] = [
132
- { label: "启用", value: Status.ENABLE },
133
- { label: "禁用", value: Status.DISABLE }
134
- ];
137
+ const statusOptions = computed<ProFormOption[]>(() => [
138
+ { label: t("common.status.enabled"), value: Status.ENABLE },
139
+ { label: t("common.status.disabled"), value: Status.DISABLE }
140
+ ]);
135
141
  const protectedRoleCodes = new Set(["admin", "authuser", "user"]);
136
142
 
137
143
  const formData = reactive<BaseRoleFormState>({
@@ -153,24 +159,56 @@ const formData = reactive<BaseRoleFormState>({
153
159
  remark: ""
154
160
  });
155
161
 
156
- const rules = reactive({
157
- tenant_id: [{ required: true, message: "请选择所属租户", trigger: "change" }],
162
+ const rules = computed(() => ({
163
+ tenant_id: [
164
+ {
165
+ required: true,
166
+ message: t("common.validation.required_select", { field: t("system.base.role.field.tenant") }),
167
+ trigger: "change"
168
+ }
169
+ ],
158
170
  name: [
159
- { required: true, message: "请输入角色名称", trigger: "blur" },
160
- { max: 30, message: "角色名称不能超过 30 个字符", trigger: "blur" }
171
+ {
172
+ required: true,
173
+ message: t("common.validation.required_input", { field: t("system.base.role.field.name") }),
174
+ trigger: "blur"
175
+ },
176
+ {
177
+ max: 30,
178
+ message: t("common.validation.max_length", { field: t("system.base.role.field.name"), max: 30 }),
179
+ trigger: "blur"
180
+ }
161
181
  ],
162
182
  code: [
163
- { required: true, message: "请输入角色编码", trigger: "blur" },
164
- { max: 20, message: "角色编号不能超过 20 个字符", trigger: "blur" }
183
+ {
184
+ required: true,
185
+ message: t("common.validation.required_input", { field: t("system.base.role.field.code") }),
186
+ trigger: "blur"
187
+ },
188
+ {
189
+ max: 20,
190
+ message: t("common.validation.max_length", { field: t("system.base.role.field.code"), max: 20 }),
191
+ trigger: "blur"
192
+ }
193
+ ],
194
+ data_scope: [
195
+ {
196
+ required: true,
197
+ message: t("common.validation.required_select", { field: t("system.base.role.field.data_scope") }),
198
+ trigger: "change"
199
+ }
165
200
  ],
166
- data_scope: [{ required: true, message: "请选择数据权限", trigger: "change" }],
167
201
  menus: [
168
- { required: true, message: "请选择菜单权限", trigger: "change" },
202
+ {
203
+ required: true,
204
+ message: t("common.validation.required_select", { field: t("system.base.role.field.menu_permission") }),
205
+ trigger: "change"
206
+ },
169
207
  {
170
208
  validator: (_rule: unknown, value: unknown, callback: (error?: Error) => void) => {
171
209
  const menuIds = Array.isArray(value) ? value : [];
172
210
  if (new Set(menuIds).size !== menuIds.length) {
173
- callback(new Error("菜单权限不能重复"));
211
+ callback(new Error(t("system.base.role.validation.menu_duplicate")));
174
212
  return;
175
213
  }
176
214
  callback();
@@ -178,9 +216,21 @@ const rules = reactive({
178
216
  trigger: "change"
179
217
  }
180
218
  ],
181
- status: [{ required: true, message: "请选择状态", trigger: "change" }],
182
- remark: [{ max: 500, message: "备注不能超过 500 个字符", trigger: "blur" }]
183
- });
219
+ status: [
220
+ {
221
+ required: true,
222
+ message: t("common.validation.required_select", { field: t("common.field.status") }),
223
+ trigger: "change"
224
+ }
225
+ ],
226
+ remark: [
227
+ {
228
+ max: 500,
229
+ message: t("common.validation.max_length", { field: t("common.field.remark"), max: 500 }),
230
+ trigger: "blur"
231
+ }
232
+ ]
233
+ }));
184
234
 
185
235
  const checkedBaseRole = ref<CheckedBaseRole>({});
186
236
  const assignPermDialogVisible = ref(false);
@@ -195,10 +245,10 @@ const isDefaultTenant = computed(() => userStore.userInfo.tenant_code === DEFAUL
195
245
  const formFields = computed<ProFormField[]>(() => [
196
246
  {
197
247
  prop: "tenant_id",
198
- label: "所属租户",
248
+ label: t("system.base.role.field.tenant"),
199
249
  component: "select",
200
250
  props: {
201
- placeholder: "请选择所属租户",
251
+ placeholder: t("system.base.role.placeholder.tenant"),
202
252
  filterable: true,
203
253
  disabled: Boolean(formData.id),
204
254
  onChange: handleFormTenantChange
@@ -206,17 +256,22 @@ const formFields = computed<ProFormField[]>(() => [
206
256
  visible: () => isDefaultTenant.value,
207
257
  options: tenantOptions.value
208
258
  },
209
- { prop: "name", label: "角色名称", component: "input", props: { placeholder: "请输入角色名称" } },
259
+ {
260
+ prop: "name",
261
+ label: t("system.base.role.field.name"),
262
+ component: "input",
263
+ props: { placeholder: t("system.base.role.placeholder.name") }
264
+ },
210
265
  {
211
266
  prop: "code",
212
- label: "角色编码",
267
+ label: t("system.base.role.field.code"),
213
268
  component: "input",
214
- props: { placeholder: "请输入角色编码", disabled: Boolean(formData.id && formData.code === "tenant") }
269
+ props: { placeholder: t("system.base.role.placeholder.code"), disabled: Boolean(formData.id && formData.code === "tenant") }
215
270
  },
216
- { prop: "data_scope", label: "数据权限", component: "dict", props: { code: "base_role_data_scope" } },
271
+ { prop: "data_scope", label: t("system.base.role.field.data_scope"), component: "dict", props: { code: "base_role_data_scope" } },
217
272
  {
218
273
  prop: "menus",
219
- label: "菜单权限",
274
+ label: t("system.base.role.field.menu_permission"),
220
275
  component: "tree-select",
221
276
  options: menuPermOptions.value as unknown as ProFormOption[],
222
277
  props: {
@@ -229,12 +284,17 @@ const formFields = computed<ProFormField[]>(() => [
229
284
  onCheck: handleCheck
230
285
  }
231
286
  },
232
- { prop: "remark", label: "备注", component: "textarea", props: { placeholder: "请输入备注" } },
287
+ {
288
+ prop: "remark",
289
+ label: t("common.field.remark"),
290
+ component: "textarea",
291
+ props: { placeholder: t("common.placeholder.remark") }
292
+ },
233
293
  {
234
294
  prop: "status",
235
- label: "状态",
295
+ label: t("common.field.status"),
236
296
  component: "radio-group",
237
- options: statusOptions,
297
+ options: statusOptions.value,
238
298
  props: { disabled: isRoleProtected(formData.code) }
239
299
  }
240
300
  ]);
@@ -246,7 +306,7 @@ const columns = computed<ColumnProps[]>(() => [
246
306
  ? ([
247
307
  {
248
308
  prop: "tenant_id",
249
- label: "租户",
309
+ label: t("system.base.role.field.tenant_short"),
250
310
  minWidth: 140,
251
311
  showOverflowTooltip: true,
252
312
  search: { el: "select", key: "tenant_id", props: { filterable: true }, order: 1 },
@@ -254,36 +314,42 @@ const columns = computed<ColumnProps[]>(() => [
254
314
  }
255
315
  ] satisfies ColumnProps[])
256
316
  : []),
257
- { prop: "name", label: "角色名称", minWidth: 140, search: { el: "input" } },
258
- { prop: "code", label: "角色编码", minWidth: 160, search: { el: "input" } },
259
- { prop: "data_scope", label: "数据权限", minWidth: 120, dictCode: "base_role_data_scope", search: { el: "select" } },
260
- { prop: "remark", label: "备注", minWidth: 160 },
317
+ { prop: "name", label: t("system.base.role.field.name"), minWidth: 140, search: { el: "input" } },
318
+ { prop: "code", label: t("system.base.role.field.code"), minWidth: 160, search: { el: "input" } },
319
+ {
320
+ prop: "data_scope",
321
+ label: t("system.base.role.field.data_scope"),
322
+ minWidth: 120,
323
+ dictCode: "base_role_data_scope",
324
+ search: { el: "select" }
325
+ },
326
+ { prop: "remark", label: t("common.field.remark"), minWidth: 160 },
261
327
  {
262
328
  prop: "status",
263
- label: "状态",
329
+ label: t("common.field.status"),
264
330
  minWidth: 100,
265
331
  search: { el: "select" },
266
332
  cellType: "status",
267
333
  statusProps: {
268
334
  activeValue: Status.ENABLE,
269
335
  inactiveValue: Status.DISABLE,
270
- activeText: "启用",
271
- inactiveText: "禁用",
336
+ activeText: t("common.status.enabled"),
337
+ inactiveText: t("common.status.disabled"),
272
338
  disabled: scope => !canChangeRoleStatus(scope.row as BaseRole) || !BUTTONS.value["base:role:status"],
273
339
  beforeChange: scope => handleBeforeSetStatus(scope.row as BaseRole)
274
340
  }
275
341
  },
276
- { prop: "created_at", label: "创建时间", minWidth: 180 },
277
- { prop: "updated_at", label: "更新时间", minWidth: 180 },
342
+ { prop: "created_at", label: t("common.field.created_at"), minWidth: 180 },
343
+ { prop: "updated_at", label: t("common.field.updated_at"), minWidth: 180 },
278
344
  {
279
345
  prop: "operation",
280
- label: "操作",
346
+ label: t("common.field.action"),
281
347
  width: 280,
282
348
  fixed: "right",
283
349
  cellType: "actions",
284
350
  actions: [
285
351
  {
286
- label: "分配权限",
352
+ label: t("system.base.role.action.assign_permission"),
287
353
  type: "primary",
288
354
  link: true,
289
355
  icon: Position,
@@ -291,7 +357,7 @@ const columns = computed<ColumnProps[]>(() => [
291
357
  onClick: scope => handleOpenAssignPermDialog(scope.row as BaseRole)
292
358
  },
293
359
  {
294
- label: "编辑",
360
+ label: t("common.action.edit"),
295
361
  type: "primary",
296
362
  link: true,
297
363
  icon: EditPen,
@@ -300,7 +366,7 @@ const columns = computed<ColumnProps[]>(() => [
300
366
  onClick: (scope, params) => handleOpenDialog((params?.roleId as number | undefined) ?? (scope.row as BaseRole).id)
301
367
  },
302
368
  {
303
- label: "删除",
369
+ label: t("common.action.delete"),
304
370
  type: "danger",
305
371
  link: true,
306
372
  icon: Delete,
@@ -312,23 +378,23 @@ const columns = computed<ColumnProps[]>(() => [
312
378
  ]);
313
379
 
314
380
  /** 角色顶部按钮配置。 */
315
- const headerActions: HeaderActionProps[] = [
381
+ const headerActions = computed<HeaderActionProps[]>(() => [
316
382
  {
317
- label: "新增",
383
+ label: t("common.action.create"),
318
384
  type: "success",
319
385
  icon: CirclePlus,
320
386
  hidden: () => !BUTTONS.value["base:role:create"],
321
387
  onClick: () => handleOpenDialog()
322
388
  },
323
389
  {
324
- label: "删除",
390
+ label: t("common.action.delete"),
325
391
  type: "danger",
326
392
  icon: Delete,
327
393
  hidden: () => !BUTTONS.value["base:role:delete"],
328
394
  disabled: scope => !scope.selectedList.length,
329
395
  onClick: scope => handleDelete(scope.selectedList as BaseRole[])
330
396
  }
331
- ];
397
+ ]);
332
398
 
333
399
  /**
334
400
  * 请求角色列表,并由 ProTable 统一维护分页与搜索参数。
@@ -336,7 +402,7 @@ const headerActions: HeaderActionProps[] = [
336
402
  async function requestBaseRoleTable(params: PageBaseRoleRequest) {
337
403
  const data = await defBaseRoleService.PageBaseRole({
338
404
  ...buildPageRequest(params),
339
- tenant_id: isDefaultTenant.value ? params.tenant_id : undefined,
405
+ tenant_id: isDefaultTenant.value ? params.tenant_id : undefined
340
406
  });
341
407
  return { data: { list: data.base_roles ?? [], total: data.total } };
342
408
  }
@@ -381,7 +447,7 @@ async function handleFormTenantChange() {
381
447
  async function handleOpenDialog(roleId?: number) {
382
448
  resetForm();
383
449
  await loadTenantOptions();
384
- dialog.title = roleId ? "修改角色" : "新增角色";
450
+ dialog.editing = Boolean(roleId);
385
451
  dialog.visible = true;
386
452
  if (!roleId) {
387
453
  await loadMenuPermOptions();
@@ -437,7 +503,7 @@ function handleSubmit() {
437
503
  ? defBaseRoleService.UpdateBaseRole({ base_role: submitData })
438
504
  : defBaseRoleService.CreateBaseRole({ base_role: submitData });
439
505
  request.then(() => {
440
- ElMessage.success(submitData.id ? "修改角色成功" : "新增角色成功");
506
+ ElMessage.success(t(submitData.id ? "system.base.role.message.update_success" : "system.base.role.message.create_success"));
441
507
  handleCloseDialog();
442
508
  refreshTable();
443
509
  });
@@ -471,21 +537,21 @@ function canDeleteRole(row?: BaseRole) {
471
537
  */
472
538
  async function handleBeforeSetStatus(row: BaseRole) {
473
539
  if (!canChangeRoleStatus(row)) {
474
- ElMessage.warning("默认角色不允许修改状态");
540
+ ElMessage.warning(t("system.base.role.message.protected_status"));
475
541
  return false;
476
542
  }
477
543
 
478
544
  const nextStatus = row.status === Status.ENABLE ? Status.DISABLE : Status.ENABLE;
479
- const text = nextStatus === Status.ENABLE ? "启用" : "禁用";
545
+ const action = t(nextStatus === Status.ENABLE ? "common.status.enabled" : "common.status.disabled");
480
546
  const roleName = row.name || row.code || `ID:${row.id}`;
481
547
  try {
482
- await ElMessageBox.confirm(`是否确定${text}角色?\n角色名称:${roleName}`, "提示", {
483
- confirmButtonText: "确认",
484
- cancelButtonText: "取消",
548
+ await ElMessageBox.confirm(t("system.base.role.message.confirm_status", { action, name: roleName }), t("common.title.notice"), {
549
+ confirmButtonText: t("common.action.confirm"),
550
+ cancelButtonText: t("common.action.cancel"),
485
551
  type: "warning"
486
552
  });
487
553
  await defBaseRoleService.SetBaseRoleStatus({ id: row.id, status: nextStatus });
488
- ElMessage.success(`${text}成功`);
554
+ ElMessage.success(t("common.message.status_success", { action }));
489
555
  refreshTable();
490
556
  return true;
491
557
  } catch {
@@ -503,7 +569,7 @@ function handleDelete(selected?: number | string | Array<number | string> | Base
503
569
  ? [selected as BaseRole]
504
570
  : [];
505
571
  if (roleList.some(role => !canDeleteRole(role))) {
506
- ElMessage.warning("默认角色不允许删除");
572
+ ElMessage.warning(t("system.base.role.message.protected_delete"));
507
573
  return;
508
574
  }
509
575
 
@@ -511,29 +577,29 @@ function handleDelete(selected?: number | string | Array<number | string> | Base
511
577
  roleList.length ? roleList.map(item => item.id) : normalizeSelectedIds(selected as number | string | Array<number | string>)
512
578
  ).join(",");
513
579
  if (!roleIds) {
514
- ElMessage.warning("请勾选删除项");
580
+ ElMessage.warning(t("common.message.select_delete_item"));
515
581
  return;
516
582
  }
517
583
 
518
584
  const confirmMessage = roleList.length
519
585
  ? roleList.length === 1
520
- ? `是否确定删除角色?\n角色名称:${roleList[0].name || roleList[0].code || `ID:${roleList[0].id}`}`
521
- : `确认删除已选中的 ${roleList.length} 个角色吗?`
522
- : "确认删除已选中的角色吗?";
586
+ ? t("system.base.role.message.confirm_delete_single", { name: roleList[0].name || roleList[0].code || `ID:${roleList[0].id}` })
587
+ : t("system.base.role.message.confirm_delete_batch", { count: roleList.length })
588
+ : t("system.base.role.message.confirm_delete_selected");
523
589
 
524
- ElMessageBox.confirm(confirmMessage, "警告", {
525
- confirmButtonText: "确定",
526
- cancelButtonText: "取消",
590
+ ElMessageBox.confirm(confirmMessage, t("common.title.warning"), {
591
+ confirmButtonText: t("common.action.confirm"),
592
+ cancelButtonText: t("common.action.cancel"),
527
593
  type: "warning"
528
594
  }).then(
529
595
  () => {
530
596
  defBaseRoleService.DeleteBaseRole({ id: roleIds }).then(() => {
531
- ElMessage.success("删除角色成功");
597
+ ElMessage.success(t("system.base.role.message.delete_success"));
532
598
  refreshTable();
533
599
  });
534
600
  },
535
601
  () => {
536
- ElMessage.info("已取消删除角色");
602
+ ElMessage.info(t("system.base.role.message.delete_canceled"));
537
603
  }
538
604
  );
539
605
  }
@@ -544,7 +610,7 @@ function handleDelete(selected?: number | string | Array<number | string> | Base
544
610
  async function handleOpenAssignPermDialog(row: BaseRole) {
545
611
  if (!row.id) return;
546
612
  if (!canManageRole(row)) {
547
- ElMessage.warning("当前租户不能分配该内置角色权限");
613
+ ElMessage.warning(t("system.base.role.message.protected_permission"));
548
614
  return;
549
615
  }
550
616
  checkedBaseRole.value = { id: row.id, name: row.name };
@@ -565,15 +631,15 @@ function handleAssignPermSubmit() {
565
631
  const checkedNodes = (permTreeRef.value?.getCheckedNodes(false, true) as Array<{ value: number }> | undefined) ?? [];
566
632
  const checkedMenuIds = checkedNodes.map(node => Number(node.value));
567
633
  if (!checkedMenuIds.length) {
568
- ElMessage.warning("请选择菜单权限");
634
+ ElMessage.warning(t("common.validation.required_select", { field: t("system.base.role.field.menu_permission") }));
569
635
  return;
570
636
  }
571
637
  if (new Set(checkedMenuIds).size !== checkedMenuIds.length) {
572
- ElMessage.warning("菜单权限不能重复");
638
+ ElMessage.warning(t("system.base.role.validation.menu_duplicate"));
573
639
  return;
574
640
  }
575
641
  defBaseRoleService.SetBaseRoleMenu({ id: roleId, menus: checkedMenuIds }).then(() => {
576
- ElMessage.success("分配权限成功");
642
+ ElMessage.success(t("system.base.role.message.assign_success"));
577
643
  assignPermDialogVisible.value = false;
578
644
  refreshTable();
579
645
  });