@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
@@ -16,12 +16,11 @@
16
16
  <FormDialog
17
17
  v-model="dialog.visible"
18
18
  ref="formDialogRef"
19
- :title="dialog.title"
19
+ :title="t(dialog.titleKey, { resource: t('system.base.dept.resource') })"
20
20
  width="600px"
21
21
  :model="formData"
22
22
  :fields="formFields"
23
23
  :rules="rules"
24
- label-width="90px"
25
24
  @confirm="handleSubmit"
26
25
  @close="handleCloseDialog"
27
26
  />
@@ -45,6 +44,7 @@ import type { SelectOptionResponse_Option, TreeOptionResponse_Option } from "@li
45
44
  import { Status } from "@liujitcn/kratos-admin-system/rpc/common/v1/enum";
46
45
  import { normalizeSelectedIds } from "@liujitcn/kratos-admin-core/table";
47
46
  import { DEFAULT_TENANT_CODE, requestTenantOptions } from "@liujitcn/kratos-admin-core/tenant";
47
+ import { t } from "@liujitcn/kratos-admin-core";
48
48
 
49
49
  defineOptions({
50
50
  name: "BaseDept",
@@ -63,17 +63,17 @@ const proTable = ref<ProTableInstance>();
63
63
  const formDialogRef = ref<InstanceType<typeof FormDialog>>();
64
64
 
65
65
  const dialog = reactive({
66
- title: "",
66
+ titleKey: "common.action.create_resource",
67
67
  visible: false
68
68
  });
69
69
 
70
70
  const deptOptions = ref<TreeOptionResponse_Option[]>([]);
71
71
  const tenantOptions = ref<SelectOptionResponse_Option[]>([]);
72
72
  const currentTenantId = ref<number | undefined>();
73
- const statusOptions: ProFormOption[] = [
74
- { label: "启用", value: Status.ENABLE },
75
- { label: "禁用", value: Status.DISABLE }
76
- ];
73
+ const statusOptions = computed<ProFormOption[]>(() => [
74
+ { label: t("common.status.enabled"), value: Status.ENABLE },
75
+ { label: t("common.status.disabled"), value: Status.DISABLE }
76
+ ]);
77
77
 
78
78
  const formData = reactive<BaseDeptFormState>({
79
79
  /** 部门ID */
@@ -92,16 +92,42 @@ const formData = reactive<BaseDeptFormState>({
92
92
  remark: ""
93
93
  });
94
94
 
95
- const rules = reactive({
96
- tenant_id: [{ required: true, message: "所属租户不能为空", trigger: "change" }],
97
- parent_id: [{ required: true, message: "上级部门不能为空", trigger: "change" }],
95
+ const rules = computed(() => ({
96
+ tenant_id: [
97
+ {
98
+ required: true,
99
+ message: t("common.validation.required_select", { field: t("common.field.tenant") }),
100
+ trigger: "change"
101
+ }
102
+ ],
103
+ parent_id: [
104
+ {
105
+ required: true,
106
+ message: t("common.validation.required_select", { field: t("system.base.dept.field.parent") }),
107
+ trigger: "change"
108
+ }
109
+ ],
98
110
  name: [
99
- { required: true, message: "部门名称不能为空", trigger: "blur" },
100
- { max: 255, message: "部门名称不能超过 255 个字符", trigger: "blur" }
111
+ {
112
+ required: true,
113
+ message: t("common.validation.required_input", { field: t("system.base.dept.field.name") }),
114
+ trigger: "blur"
115
+ },
116
+ {
117
+ max: 255,
118
+ message: t("common.validation.max_length", { field: t("system.base.dept.field.name"), max: 255 }),
119
+ trigger: "blur"
120
+ }
101
121
  ],
102
- sort: [{ required: true, type: "number", min: 1, message: "排序必须大于 0", trigger: "blur" }],
103
- status: [{ required: true, message: "状态不能为空", trigger: "change" }]
104
- });
122
+ sort: [{ required: true, type: "number", min: 1, message: t("common.validation.sort_positive"), trigger: "blur" }],
123
+ status: [
124
+ {
125
+ required: true,
126
+ message: t("common.validation.required_select", { field: t("common.field.status") }),
127
+ trigger: "change"
128
+ }
129
+ ]
130
+ }));
105
131
 
106
132
  /** 当前登录账号是否默认租户。 */
107
133
  const isDefaultTenant = computed(() => userStore.userInfo.tenant_code === DEFAULT_TENANT_CODE);
@@ -110,10 +136,10 @@ const isDefaultTenant = computed(() => userStore.userInfo.tenant_code === DEFAUL
110
136
  const formFields = computed<ProFormField[]>(() => [
111
137
  {
112
138
  prop: "tenant_id",
113
- label: "所属租户",
139
+ label: t("common.field.tenant"),
114
140
  component: "select",
115
141
  props: {
116
- placeholder: "请选择所属租户",
142
+ placeholder: t("common.validation.required_select", { field: t("common.field.tenant") }),
117
143
  filterable: true,
118
144
  disabled: Boolean(formData.id),
119
145
  onChange: handleFormTenantChange
@@ -123,26 +149,36 @@ const formFields = computed<ProFormField[]>(() => [
123
149
  },
124
150
  {
125
151
  prop: "parent_id",
126
- label: "上级部门",
152
+ label: t("system.base.dept.field.parent"),
127
153
  component: "tree-select",
128
154
  options: deptOptions.value,
129
155
  props: {
130
- placeholder: "选择上级部门",
156
+ placeholder: t("common.validation.required_select", { field: t("system.base.dept.field.parent") }),
131
157
  filterable: true,
132
158
  checkStrictly: true,
133
159
  renderAfterExpand: false,
134
160
  style: { width: "100%" }
135
161
  }
136
162
  },
137
- { prop: "name", label: "部门名称", component: "input", props: { placeholder: "请输入部门名称" } },
163
+ {
164
+ prop: "name",
165
+ label: t("system.base.dept.field.name"),
166
+ component: "input",
167
+ props: { placeholder: t("common.validation.required_input", { field: t("system.base.dept.field.name") }) }
168
+ },
138
169
  {
139
170
  prop: "sort",
140
- label: "排序",
171
+ label: t("common.field.sort"),
141
172
  component: "input-number",
142
173
  props: { min: 1, precision: 0, step: 1, controlsPosition: "right", style: { width: "100%" } }
143
174
  },
144
- { prop: "remark", label: "备注", component: "textarea", props: { placeholder: "请输入备注" } },
145
- { prop: "status", label: "状态", component: "radio-group", options: statusOptions }
175
+ {
176
+ prop: "remark",
177
+ label: t("common.field.remark"),
178
+ component: "textarea",
179
+ props: { placeholder: t("common.placeholder.remark") }
180
+ },
181
+ { prop: "status", label: t("common.field.status"), component: "radio-group", options: statusOptions.value }
146
182
  ]);
147
183
 
148
184
  /** 部门树表格列配置。 */
@@ -152,7 +188,7 @@ const columns = computed<ColumnProps[]>(() => [
152
188
  ? ([
153
189
  {
154
190
  prop: "tenant_id",
155
- label: "租户",
191
+ label: t("common.field.tenant"),
156
192
  minWidth: 140,
157
193
  showOverflowTooltip: true,
158
194
  search: { el: "select", key: "tenant_id", props: { filterable: true }, order: 1 },
@@ -160,35 +196,35 @@ const columns = computed<ColumnProps[]>(() => [
160
196
  }
161
197
  ] satisfies ColumnProps[])
162
198
  : []),
163
- { prop: "name", label: "部门名称", minWidth: 140, align: "left", search: { el: "input" } },
164
- { prop: "remark", label: "备注", minWidth: 160, search: { el: "input" } },
165
- { prop: "sort", label: "排序", minWidth: 90, align: "right" },
199
+ { prop: "name", label: t("system.base.dept.field.name"), minWidth: 140, align: "left", search: { el: "input" } },
200
+ { prop: "remark", label: t("common.field.remark"), minWidth: 160, search: { el: "input" } },
201
+ { prop: "sort", label: t("common.field.sort"), minWidth: 90, align: "right" },
166
202
  {
167
203
  prop: "status",
168
- label: "状态",
204
+ label: t("common.field.status"),
169
205
  minWidth: 100,
170
206
  search: { el: "select" },
171
207
  cellType: "status",
172
208
  statusProps: {
173
209
  activeValue: Status.ENABLE,
174
210
  inactiveValue: Status.DISABLE,
175
- activeText: "启用",
176
- inactiveText: "禁用",
211
+ activeText: t("common.status.enabled"),
212
+ inactiveText: t("common.status.disabled"),
177
213
  disabled: () => !BUTTONS.value["base:dept:status"],
178
214
  beforeChange: scope => handleBeforeSetStatus(scope.row as BaseDept)
179
215
  }
180
216
  },
181
- { prop: "created_at", label: "创建时间", minWidth: 180 },
182
- { prop: "updated_at", label: "更新时间", minWidth: 180 },
217
+ { prop: "created_at", label: t("common.field.created_at"), minWidth: 180 },
218
+ { prop: "updated_at", label: t("common.field.updated_at"), minWidth: 180 },
183
219
  {
184
220
  prop: "operation",
185
- label: "操作",
221
+ label: t("common.field.operation"),
186
222
  width: 220,
187
223
  fixed: "right",
188
224
  cellType: "actions",
189
225
  actions: [
190
226
  {
191
- label: "新增",
227
+ label: t("common.action.create"),
192
228
  type: "primary",
193
229
  link: true,
194
230
  icon: CirclePlus,
@@ -198,7 +234,7 @@ const columns = computed<ColumnProps[]>(() => [
198
234
  handleOpenDialog((params?.parent_id as number | undefined) ?? 0, undefined, params?.tenantId as number | undefined)
199
235
  },
200
236
  {
201
- label: "编辑",
237
+ label: t("common.action.edit"),
202
238
  type: "primary",
203
239
  link: true,
204
240
  icon: EditPen,
@@ -210,7 +246,7 @@ const columns = computed<ColumnProps[]>(() => [
210
246
  onClick: (_, params) => handleOpenDialog(params?.parent_id as number | undefined, params?.deptId as number | undefined)
211
247
  },
212
248
  {
213
- label: "删除",
249
+ label: t("common.action.delete"),
214
250
  type: "danger",
215
251
  link: true,
216
252
  icon: Delete,
@@ -222,23 +258,23 @@ const columns = computed<ColumnProps[]>(() => [
222
258
  ]);
223
259
 
224
260
  /** 部门顶部按钮配置。 */
225
- const headerActions: HeaderActionProps[] = [
261
+ const headerActions = computed<HeaderActionProps[]>(() => [
226
262
  {
227
- label: "新增",
263
+ label: t("common.action.create"),
228
264
  type: "success",
229
265
  icon: CirclePlus,
230
266
  hidden: () => !BUTTONS.value["base:dept:create"],
231
267
  onClick: () => handleOpenDialog(0)
232
268
  },
233
269
  {
234
- label: "删除",
270
+ label: t("common.action.delete"),
235
271
  type: "danger",
236
272
  icon: Delete,
237
273
  hidden: () => !BUTTONS.value["base:dept:delete"],
238
274
  disabled: scope => !scope.selectedList.length,
239
275
  onClick: scope => handleDelete(scope.selectedList as BaseDept[])
240
276
  }
241
- ];
277
+ ]);
242
278
 
243
279
  /**
244
280
  * 按搜索条件递归过滤部门树,命中父节点或子节点时保留当前节点。
@@ -295,7 +331,7 @@ function refreshTable() {
295
331
  async function loadDeptOptions() {
296
332
  // 默认租户未选择目标租户时仅保留顶级部门,避免混入其他租户的部门树。
297
333
  if (isDefaultTenant.value && !formData.tenant_id) {
298
- deptOptions.value = [{ value: 0, label: "顶级部门", disabled: false, has_children: true, children: [] }];
334
+ deptOptions.value = [{ value: 0, label: t("system.base.dept.value.root"), disabled: false, has_children: true, children: [] }];
299
335
  return;
300
336
  }
301
337
  const optionBaseDeptResponse = await defBaseDeptService.OptionBaseDept({
@@ -304,7 +340,7 @@ async function loadDeptOptions() {
304
340
  deptOptions.value = [
305
341
  {
306
342
  value: 0,
307
- label: "顶级部门",
343
+ label: t("system.base.dept.value.root"),
308
344
  disabled: false,
309
345
  has_children: true,
310
346
  children: optionBaseDeptResponse.list
@@ -336,7 +372,7 @@ async function handleOpenDialog(parent_id?: number, deptId?: number, tenantId?:
336
372
  resetForm();
337
373
  await loadTenantOptions();
338
374
  if (deptId) {
339
- dialog.title = "修改部门";
375
+ dialog.titleKey = "common.action.edit_resource";
340
376
  dialog.visible = true;
341
377
  defBaseDeptService.GetBaseDept({ id: deptId }).then(async data => {
342
378
  Object.assign(formData, data);
@@ -348,7 +384,7 @@ async function handleOpenDialog(parent_id?: number, deptId?: number, tenantId?:
348
384
  // 从部门行新增子部门时,继承父部门租户并加载同租户上级部门树。
349
385
  formData.tenant_id = tenantId;
350
386
  await loadDeptOptions();
351
- dialog.title = "新增部门";
387
+ dialog.titleKey = "common.action.create_resource";
352
388
  dialog.visible = true;
353
389
  formData.parent_id = parent_id ?? 0;
354
390
  }
@@ -389,7 +425,11 @@ function handleSubmit() {
389
425
  ? defBaseDeptService.UpdateBaseDept({ base_dept: submitData })
390
426
  : defBaseDeptService.CreateBaseDept({ base_dept: submitData });
391
427
  request.then(() => {
392
- ElMessage.success(submitData.id ? "修改部门成功" : "新增部门成功");
428
+ ElMessage.success(
429
+ t(submitData.id ? "common.message.update_success" : "common.message.create_success", {
430
+ resource: t("system.base.dept.resource")
431
+ })
432
+ );
393
433
  handleCloseDialog();
394
434
  refreshTable();
395
435
  });
@@ -401,16 +441,25 @@ function handleSubmit() {
401
441
  */
402
442
  async function handleBeforeSetStatus(row: BaseDept) {
403
443
  const nextStatus = row.status === Status.ENABLE ? Status.DISABLE : Status.ENABLE;
404
- const text = nextStatus === Status.ENABLE ? "启用" : "禁用";
444
+ const text = t(nextStatus === Status.ENABLE ? "common.status.enabled" : "common.status.disabled");
405
445
  const deptName = row.name || `ID:${row.id}`;
406
446
  try {
407
- await ElMessageBox.confirm(`是否确定${text}部门?\n部门名称:${deptName}`, "提示", {
408
- confirmButtonText: "确认",
409
- cancelButtonText: "取消",
410
- type: "warning"
411
- });
447
+ await ElMessageBox.confirm(
448
+ t("common.dialog.status_change", {
449
+ action: text,
450
+ resource: t("system.base.dept.resource"),
451
+ field: t("system.base.dept.field.name"),
452
+ value: deptName
453
+ }),
454
+ t("common.title.notice"),
455
+ {
456
+ confirmButtonText: t("common.action.confirm"),
457
+ cancelButtonText: t("common.action.cancel"),
458
+ type: "warning"
459
+ }
460
+ );
412
461
  await defBaseDeptService.SetBaseDeptStatus({ id: row.id, status: nextStatus });
413
- ElMessage.success(`${text}成功`);
462
+ ElMessage.success(t("common.message.status_success", { action: text }));
414
463
  refreshTable();
415
464
  return true;
416
465
  } catch {
@@ -431,31 +480,30 @@ function handleDelete(selected?: number | string | Array<number | string> | Base
431
480
  deptList.length ? deptList.map(item => item.id) : normalizeSelectedIds(selected as number | string | Array<number | string>)
432
481
  ).join(",");
433
482
  if (!deptIds) {
434
- ElMessage.warning("请勾选删除项");
483
+ ElMessage.warning(t("common.message.select_delete_item"));
435
484
  return;
436
485
  }
437
486
 
438
487
  const confirmMessage = deptList.length
439
488
  ? deptList.length === 1
440
- ? `是否确定删除部门?\n部门名称:${deptList[0].name || `ID:${deptList[0].id}`}`
441
- : `确认删除已选中的 ${deptList.length} 个部门吗?`
442
- : "确认删除已选中的部门吗?";
489
+ ? `${t("common.dialog.delete_single", { resource: t("system.base.dept.resource") })}\n${t("common.dialog.resource_field", { field: t("system.base.dept.field.name"), value: deptList[0].name || `ID:${deptList[0].id}` })}`
490
+ : t("common.dialog.delete_batch", { count: deptList.length, unit: "", resource: t("system.base.dept.resource") })
491
+ : t("common.dialog.delete_selected", { resource: t("system.base.dept.resource") });
443
492
 
444
- ElMessageBox.confirm(confirmMessage, "警告", {
445
- confirmButtonText: "确定",
446
- cancelButtonText: "取消",
493
+ ElMessageBox.confirm(confirmMessage, t("common.title.warning"), {
494
+ confirmButtonText: t("common.action.confirm"),
495
+ cancelButtonText: t("common.action.cancel"),
447
496
  type: "warning"
448
497
  }).then(
449
498
  () => {
450
499
  defBaseDeptService.DeleteBaseDept({ id: deptIds }).then(() => {
451
- ElMessage.success("删除部门成功");
500
+ ElMessage.success(t("common.message.delete_success", { resource: t("system.base.dept.resource") }));
452
501
  refreshTable();
453
502
  });
454
503
  },
455
504
  () => {
456
- ElMessage.info("已取消删除部门");
505
+ ElMessage.info(t("common.dialog.cancel_delete", { resource: t("system.base.dept.resource") }));
457
506
  }
458
507
  );
459
508
  }
460
-
461
509
  </script>