@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
@@ -0,0 +1,260 @@
1
+ <!-- 语言管理 -->
2
+ <template>
3
+ <div class="table-box">
4
+ <ProTable
5
+ ref="proTable"
6
+ row-key="id"
7
+ :columns="columns"
8
+ :header-actions="headerActions"
9
+ :request-api="requestBaseLanguageTable"
10
+ />
11
+
12
+ <FormDialog
13
+ v-model="dialog.visible"
14
+ ref="formDialogRef"
15
+ :title="t(dialog.editing ? 'system.base.language.action.edit' : 'system.base.language.action.create')"
16
+ width="620px"
17
+ :model="formData"
18
+ :fields="formFields"
19
+ :rules="rules"
20
+ @confirm="handleSubmit"
21
+ @close="handleCloseDialog"
22
+ />
23
+ </div>
24
+ </template>
25
+
26
+ <script setup lang="ts">
27
+ import { computed, reactive, ref } from "vue";
28
+ import { ElMessage, ElMessageBox } from "element-plus";
29
+ import { CirclePlus, Delete, EditPen } from "@element-plus/icons-vue";
30
+ import type { ColumnProps, HeaderActionProps, ProTableInstance } from "@liujitcn/kratos-admin-core/components/ProTable/interface";
31
+ import ProTable from "@liujitcn/kratos-admin-core/components/ProTable";
32
+ import FormDialog from "@liujitcn/kratos-admin-core/components/Dialog/FormDialog.vue";
33
+ import type { ProFormField, ProFormOption } from "@liujitcn/kratos-admin-core/components/ProForm/interface";
34
+ import { useAuthButtons } from "@liujitcn/kratos-admin-core/auth";
35
+ import { buildPageRequest, normalizeSelectedIds } from "@liujitcn/kratos-admin-core/table";
36
+ import { applyLanguageConfig, defLanguageService, t } from "@liujitcn/kratos-admin-core";
37
+ import { defBaseLanguageService, invalidateEnabledBaseLanguages } from "@liujitcn/kratos-admin-system/api/system/base_language";
38
+ import type { BaseLanguage, BaseLanguageForm, PageBaseLanguageRequest } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_language";
39
+ import { Status } from "@liujitcn/kratos-admin-system/rpc/common/v1/enum";
40
+
41
+ defineOptions({ name: "BaseLanguage", inheritAttrs: false });
42
+
43
+ const { BUTTONS } = useAuthButtons();
44
+ const proTable = ref<ProTableInstance>();
45
+ const formDialogRef = ref<InstanceType<typeof FormDialog>>();
46
+ const dialog = reactive({ editing: false, visible: false });
47
+ const formData = reactive<BaseLanguageForm>({
48
+ id: 0,
49
+ language_code: "",
50
+ language_name: "",
51
+ native_name: "",
52
+ sort: 100,
53
+ status: Status.ENABLE
54
+ });
55
+
56
+ const rules = computed(() => ({
57
+ language_code: [
58
+ { required: true, message: t("system.base.language.placeholder.code"), trigger: "blur" },
59
+ { max: 16, message: t("common.validation.max_length", { field: t("system.base.language.field.code"), max: 16 }), trigger: "blur" }
60
+ ],
61
+ language_name: [
62
+ { required: true, message: t("system.base.language.placeholder.name"), trigger: "blur" },
63
+ { max: 50, message: t("common.validation.max_length", { field: t("system.base.language.field.name"), max: 50 }), trigger: "blur" }
64
+ ],
65
+ native_name: [
66
+ { required: true, message: t("system.base.language.placeholder.native_name"), trigger: "blur" },
67
+ { max: 50, message: t("common.validation.max_length", { field: t("system.base.language.field.native_name"), max: 50 }), trigger: "blur" }
68
+ ],
69
+ sort: [{ required: true, message: t("system.base.language.placeholder.sort"), trigger: "change" }]
70
+ }));
71
+
72
+ const statusOptions = computed<ProFormOption[]>(() => [
73
+ { label: t("common.status.enabled"), value: Status.ENABLE },
74
+ { label: t("common.status.disabled"), value: Status.DISABLE }
75
+ ]);
76
+
77
+ const formFields = computed<ProFormField[]>(() => [
78
+ { prop: "language_code", label: t("system.base.language.field.code"), component: "input", props: { placeholder: t("system.base.language.placeholder.code"), disabled: dialog.editing } },
79
+ { prop: "language_name", label: t("system.base.language.field.name"), component: "input", props: { placeholder: t("system.base.language.placeholder.name") } },
80
+ { prop: "native_name", label: t("system.base.language.field.native_name"), component: "input", props: { placeholder: t("system.base.language.placeholder.native_name") } },
81
+ { prop: "sort", label: t("system.base.language.field.sort"), component: "input-number", props: { min: 0, controlsPosition: "right", style: { width: "100%" } } },
82
+ { prop: "status", label: t("system.base.language.field.status"), component: "radio-group", options: statusOptions.value }
83
+ ]);
84
+
85
+ const columns = computed<ColumnProps[]>(() => [
86
+ { prop: "native_name", label: t("system.base.language.field.native_name"), minWidth: 130 },
87
+ { prop: "language_name", label: t("system.base.language.field.name"), minWidth: 130, search: { el: "input" } },
88
+ { prop: "language_code", label: t("system.base.language.field.code"), minWidth: 120, search: { el: "input" } },
89
+ {
90
+ prop: "is_primary",
91
+ label: t("system.base.language.field.primary"),
92
+ minWidth: 100,
93
+ cellType: "status",
94
+ statusProps: {
95
+ activeValue: true,
96
+ inactiveValue: false,
97
+ activeText: t("common.status.enabled"),
98
+ inactiveText: t("common.status.disabled"),
99
+ disabled: () => !BUTTONS.value["base:language:primary"],
100
+ beforeChange: scope => handleBeforeSetPrimary(scope.row as BaseLanguage)
101
+ }
102
+ },
103
+ {
104
+ prop: "status",
105
+ label: t("system.base.language.field.status"),
106
+ minWidth: 100,
107
+ search: { el: "select" },
108
+ cellType: "status",
109
+ statusProps: {
110
+ activeValue: Status.ENABLE,
111
+ inactiveValue: Status.DISABLE,
112
+ activeText: t("common.status.enabled"),
113
+ inactiveText: t("common.status.disabled"),
114
+ disabled: () => !BUTTONS.value["base:language:status"],
115
+ beforeChange: scope => handleBeforeSetStatus(scope.row as BaseLanguage)
116
+ }
117
+ },
118
+ { prop: "sort", label: t("system.base.language.field.sort"), width: 80 },
119
+ { prop: "created_at", label: t("common.field.created_at"), minWidth: 180 },
120
+ {
121
+ prop: "operation",
122
+ label: t("common.field.operation"),
123
+ width: 150,
124
+ fixed: "right",
125
+ cellType: "actions",
126
+ actions: [
127
+ { label: t("common.action.edit"), type: "primary", link: true, icon: EditPen, hidden: () => !BUTTONS.value["base:language:update"], onClick: scope => handleOpenDialog((scope.row as BaseLanguage).id) },
128
+ { label: t("common.action.delete"), type: "danger", link: true, icon: Delete, hidden: () => !BUTTONS.value["base:language:delete"], onClick: scope => handleDelete(scope.row as BaseLanguage) }
129
+ ]
130
+ }
131
+ ]);
132
+
133
+ const headerActions = computed<HeaderActionProps[]>(() => [
134
+ { label: t("common.action.create"), type: "success", icon: CirclePlus, hidden: () => !BUTTONS.value["base:language:create"], onClick: () => handleOpenDialog() },
135
+ { label: t("common.action.delete"), type: "danger", icon: Delete, hidden: () => !BUTTONS.value["base:language:delete"], disabled: scope => !scope.selectedList.length, onClick: scope => handleDelete(scope.selectedList as BaseLanguage[]) }
136
+ ]);
137
+
138
+ /** 请求语言分页列表。 */
139
+ async function requestBaseLanguageTable(params: PageBaseLanguageRequest) {
140
+ const data = await defBaseLanguageService.PageBaseLanguage(buildPageRequest(params));
141
+ return { data: { list: data.base_languages ?? [], total: data.total } };
142
+ }
143
+
144
+ /** 打开语言编辑弹窗。 */
145
+ async function handleOpenDialog(id?: number) {
146
+ resetForm();
147
+ dialog.editing = Boolean(id);
148
+ dialog.visible = true;
149
+ if (!id) return;
150
+ Object.assign(formData, await defBaseLanguageService.GetBaseLanguage({ id }));
151
+ }
152
+
153
+ /** 关闭语言编辑弹窗。 */
154
+ function handleCloseDialog() {
155
+ dialog.visible = false;
156
+ resetForm();
157
+ }
158
+
159
+ /** 重置语言表单。 */
160
+ function resetForm() {
161
+ formDialogRef.value?.resetFields();
162
+ formDialogRef.value?.clearValidate();
163
+ Object.assign(formData, { id: 0, language_code: "", language_name: "", native_name: "", sort: 100, status: Status.ENABLE });
164
+ }
165
+
166
+ /** 提交语言表单。 */
167
+ function handleSubmit() {
168
+ formDialogRef.value?.validate()?.then(valid => {
169
+ if (!valid) return;
170
+ const payload = JSON.parse(JSON.stringify(formData)) as BaseLanguageForm;
171
+ const request = payload.id
172
+ ? defBaseLanguageService.UpdateBaseLanguage({ base_language: payload })
173
+ : defBaseLanguageService.CreateBaseLanguage({ base_language: payload });
174
+ request.then(() => {
175
+ invalidateEnabledBaseLanguages();
176
+ void refreshAdminLanguageConfig();
177
+ ElMessage.success(t(payload.id ? "common.message.update_success" : "common.message.create_success", { resource: t("system.base.language.resource") }));
178
+ handleCloseDialog();
179
+ proTable.value?.getTableList();
180
+ });
181
+ });
182
+ }
183
+
184
+ /** 设置语言状态前保护主语言。 */
185
+ function handleBeforeSetStatus(row: BaseLanguage) {
186
+ if (row.is_primary && row.status === Status.ENABLE) {
187
+ ElMessage.warning(t("system.base.language.message.primary_cannot_disable"));
188
+ return Promise.resolve(false);
189
+ }
190
+ return ElMessageBox.confirm(
191
+ t("system.base.language.message.confirm_status", { action: row.status === Status.ENABLE ? t("common.status.disabled") : t("common.status.enabled"), name: row.native_name }),
192
+ t("common.title.warning"),
193
+ { type: "warning", confirmButtonText: t("common.action.confirm"), cancelButtonText: t("common.action.cancel") }
194
+ ).then(
195
+ () =>
196
+ defBaseLanguageService
197
+ .SetBaseLanguageStatus({ id: row.id, status: row.status === Status.ENABLE ? Status.DISABLE : Status.ENABLE })
198
+ .then(() => {
199
+ invalidateEnabledBaseLanguages();
200
+ void refreshAdminLanguageConfig();
201
+ return true;
202
+ }),
203
+ () => false
204
+ );
205
+ }
206
+
207
+ /** 设置主语言前确认切换。 */
208
+ function handleBeforeSetPrimary(row: BaseLanguage) {
209
+ if (row.is_primary) return Promise.resolve(false);
210
+ return ElMessageBox.confirm(
211
+ t("system.base.language.message.confirm_primary", { name: row.native_name }),
212
+ t("common.title.warning"),
213
+ { type: "warning", confirmButtonText: t("common.action.confirm"), cancelButtonText: t("common.action.cancel") }
214
+ ).then(
215
+ () =>
216
+ defBaseLanguageService
217
+ .SetBaseLanguagePrimary({ id: row.id })
218
+ .then(() => {
219
+ invalidateEnabledBaseLanguages();
220
+ void refreshAdminLanguageConfig();
221
+ proTable.value?.getTableList();
222
+ return true;
223
+ }),
224
+ () => false
225
+ );
226
+ }
227
+
228
+ /** 删除语言,兼容单项和批量操作。 */
229
+ function handleDelete(selected?: BaseLanguage | BaseLanguage[] | number | string | Array<number | string>) {
230
+ const rows = Array.isArray(selected) ? (selected.filter(item => typeof item === "object") as BaseLanguage[]) : selected && typeof selected === "object" ? [selected] : [];
231
+ if (rows.some(item => item.is_primary)) {
232
+ ElMessage.warning(t("system.base.language.message.primary_cannot_delete"));
233
+ return;
234
+ }
235
+ const ids = (rows.length ? rows.map(item => item.id) : normalizeSelectedIds(selected as number | string | Array<number | string>)).join(",");
236
+ if (!ids) {
237
+ ElMessage.warning(t("common.message.select_delete_item"));
238
+ return;
239
+ }
240
+ ElMessageBox.confirm(t("system.base.language.message.confirm_delete", { name: rows.length === 1 ? rows[0].native_name : ids }), t("common.title.warning"), {
241
+ type: "warning",
242
+ confirmButtonText: t("common.action.confirm"),
243
+ cancelButtonText: t("common.action.cancel")
244
+ }).then(() => defBaseLanguageService.DeleteBaseLanguage({ id: ids })).then(() => {
245
+ invalidateEnabledBaseLanguages();
246
+ void refreshAdminLanguageConfig();
247
+ ElMessage.success(t("common.message.delete_success", { resource: t("system.base.language.resource") }));
248
+ proTable.value?.getTableList();
249
+ });
250
+ }
251
+
252
+ /** refreshAdminLanguageConfig 刷新核心语言切换器的运行时配置。 */
253
+ async function refreshAdminLanguageConfig() {
254
+ try {
255
+ applyLanguageConfig(await defLanguageService.OptionLanguage({}));
256
+ } catch {
257
+ // 语言管理操作成功但公共语言查询失败时,保留当前切换器配置。
258
+ }
259
+ }
260
+ </script>
@@ -2,69 +2,92 @@
2
2
  <div class="table-box">
3
3
  <ProTable ref="proTable" row-key="id" :columns="columns" :request-api="requestBaseLogTable" />
4
4
 
5
- <ProDialog v-model="dialog.visible" :title="dialog.title" width="1500px" @close="handleCloseDialog">
5
+ <ProDialog v-model="dialog.visible" :title="t('system.base.log.title.detail')" width="1500px" @close="handleCloseDialog">
6
6
  <div class="detail-container">
7
- <el-descriptions title="基础信息" border :column="2">
8
- <el-descriptions-item label="操作结果">
7
+ <el-descriptions :title="t('system.base.log.section.basic')" border :column="2">
8
+ <el-descriptions-item :label="t('system.base.log.field.result')">
9
9
  <el-tag :type="detail.is_success ? 'success' : 'danger'" effect="light">
10
- {{ detail.is_success ? "成功" : "失败" }}
10
+ {{ t(detail.is_success ? "system.base.log.status.success" : "system.base.log.status.failed") }}
11
11
  </el-tag>
12
12
  </el-descriptions-item>
13
- <el-descriptions-item label="状态码">
13
+ <el-descriptions-item :label="t('system.base.log.field.status_code')">
14
14
  <el-tag :type="statusCodeColor" effect="light">{{ detail.status_code || "--" }}</el-tag>
15
15
  </el-descriptions-item>
16
- <el-descriptions-item label="耗时">{{ detail.cost_time || "--" }}</el-descriptions-item>
17
- <el-descriptions-item label="操作时间">{{ detail.request_time || "--" }}</el-descriptions-item>
16
+ <el-descriptions-item :label="t('system.base.log.field.cost_time')">{{ detail.cost_time || "--" }}</el-descriptions-item>
17
+ <el-descriptions-item :label="t('system.base.log.field.request_time')">{{
18
+ detail.request_time || "--"
19
+ }}</el-descriptions-item>
18
20
  </el-descriptions>
19
21
 
20
- <el-descriptions title="请求信息" border :column="2" direction="vertical" class="mt-4 compact-descriptions">
21
- <el-descriptions-item label="请求ID">{{ detail.request_id || "--" }}</el-descriptions-item>
22
- <el-descriptions-item label="操作方法">
22
+ <el-descriptions
23
+ :title="t('system.base.log.section.request')"
24
+ border
25
+ :column="2"
26
+ direction="vertical"
27
+ class="mt-4 compact-descriptions"
28
+ >
29
+ <el-descriptions-item :label="t('system.base.log.field.request_id')">{{ detail.request_id || "--" }}</el-descriptions-item>
30
+ <el-descriptions-item :label="t('system.base.log.field.operation')">
23
31
  <el-tag effect="plain">{{ detail.operation || "--" }}</el-tag>
24
32
  </el-descriptions-item>
25
- <el-descriptions-item label="请求方法">
33
+ <el-descriptions-item :label="t('system.base.log.field.method')">
26
34
  <el-tag effect="plain">{{ detail.method || "--" }}</el-tag>
27
35
  </el-descriptions-item>
28
- <el-descriptions-item label="请求路径">{{ detail.path || "--" }}</el-descriptions-item>
29
- <el-descriptions-item v-if="detail.request_uri" label="请求 URI" :span="2">{{
36
+ <el-descriptions-item :label="t('system.base.log.field.path')">{{ detail.path || "--" }}</el-descriptions-item>
37
+ <el-descriptions-item v-if="detail.request_uri" :label="t('system.base.log.field.request_uri')" :span="2">{{
30
38
  detail.request_uri
31
39
  }}</el-descriptions-item>
32
- <el-descriptions-item v-if="detail.referer" label="来源页" :span="2">{{ detail.referer }}</el-descriptions-item>
33
- <el-descriptions-item label="请求头" :span="2">
40
+ <el-descriptions-item v-if="detail.referer" :label="t('system.base.log.field.referer')" :span="2">{{
41
+ detail.referer
42
+ }}</el-descriptions-item>
43
+ <el-descriptions-item :label="t('system.base.log.field.request_header')" :span="2">
34
44
  <pre class="code-block">{{ formatPayload(detail.request_header) }}</pre>
35
45
  </el-descriptions-item>
36
- <el-descriptions-item label="请求体" :span="2">
46
+ <el-descriptions-item :label="t('system.base.log.field.request_body')" :span="2">
37
47
  <pre class="code-block">{{ formatPayload(detail.request_body) }}</pre>
38
48
  </el-descriptions-item>
39
- <el-descriptions-item label="请求结果" :span="2">
49
+ <el-descriptions-item :label="t('system.base.log.field.request_result')" :span="2">
40
50
  <pre class="code-block">{{ formatPayload(detail.response) }}</pre>
41
51
  </el-descriptions-item>
42
52
  </el-descriptions>
43
53
 
44
- <el-descriptions title="用户信息" border :column="2" class="mt-4">
45
- <el-descriptions-item label="用户ID">{{ detail.user_id || "--" }}</el-descriptions-item>
46
- <el-descriptions-item label="用户名">{{ detail.user_name || "--" }}</el-descriptions-item>
47
- <el-descriptions-item label="客户端IP">{{ detail.client_ip || "--" }}</el-descriptions-item>
48
- <el-descriptions-item label="地理位置">{{ detail.location || "--" }}</el-descriptions-item>
54
+ <el-descriptions :title="t('system.base.log.section.user')" border :column="2" class="mt-4">
55
+ <el-descriptions-item :label="t('system.base.log.field.user_id')">{{ detail.user_id || "--" }}</el-descriptions-item>
56
+ <el-descriptions-item :label="t('system.base.log.field.user_name')">{{ detail.user_name || "--" }}</el-descriptions-item>
57
+ <el-descriptions-item :label="t('system.base.log.field.client_ip')">{{ detail.client_ip || "--" }}</el-descriptions-item>
58
+ <el-descriptions-item :label="t('system.base.log.field.location')">{{ detail.location || "--" }}</el-descriptions-item>
49
59
  </el-descriptions>
50
60
 
51
- <el-descriptions title="客户端信息" border :column="2" direction="vertical" class="mt-4 compact-descriptions">
52
- <el-descriptions-item label="浏览器">
61
+ <el-descriptions
62
+ :title="t('system.base.log.section.client')"
63
+ border
64
+ :column="2"
65
+ direction="vertical"
66
+ class="mt-4 compact-descriptions"
67
+ >
68
+ <el-descriptions-item :label="t('system.base.log.field.browser')">
53
69
  {{ [detail.browser_name, detail.browser_version].filter(Boolean).join(" ") || "--" }}
54
70
  </el-descriptions-item>
55
- <el-descriptions-item label="操作系统">
71
+ <el-descriptions-item :label="t('system.base.log.field.os')">
56
72
  {{ [detail.os_name, detail.os_version].filter(Boolean).join(" ") || "--" }}
57
73
  </el-descriptions-item>
58
- <el-descriptions-item label="客户端名称">{{ detail.client_name || "--" }}</el-descriptions-item>
59
- <el-descriptions-item label="客户端ID">{{ detail.client_id || "--" }}</el-descriptions-item>
74
+ <el-descriptions-item :label="t('system.base.log.field.client_name')">{{ detail.client_name || "--" }}</el-descriptions-item>
75
+ <el-descriptions-item :label="t('system.base.log.field.client_id')">{{ detail.client_id || "--" }}</el-descriptions-item>
60
76
  <el-descriptions-item label="User Agent" :span="2">{{ detail.user_agent || "--" }}</el-descriptions-item>
61
77
  </el-descriptions>
62
78
 
63
- <el-alert v-if="!detail.is_success" title="失败原因" type="error" :description="detail.reason" class="mt-4" show-icon />
79
+ <el-alert
80
+ v-if="!detail.is_success"
81
+ :title="t('system.base.log.field.reason')"
82
+ type="error"
83
+ :description="detail.reason"
84
+ class="mt-4"
85
+ show-icon
86
+ />
64
87
  </div>
65
88
 
66
89
  <template #footer>
67
- <el-button @click="handleCloseDialog">关闭</el-button>
90
+ <el-button @click="handleCloseDialog">{{ t("common.action.close") }}</el-button>
68
91
  </template>
69
92
  </ProDialog>
70
93
  </div>
@@ -80,6 +103,7 @@ import { defBaseLogService } from "@liujitcn/kratos-admin-system/api/system/base
80
103
  import { buildPageRequest } from "@liujitcn/kratos-admin-core/table";
81
104
  import { formatJson } from "@liujitcn/kratos-admin-core/format";
82
105
  import type { BaseLog, PageBaseLogRequest } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_log";
106
+ import { t } from "@liujitcn/kratos-admin-core";
83
107
 
84
108
  defineOptions({
85
109
  name: "BaseLog",
@@ -89,7 +113,6 @@ defineOptions({
89
113
  const proTable = ref<ProTableInstance>();
90
114
 
91
115
  const dialog = reactive({
92
- title: "",
93
116
  visible: false
94
117
  });
95
118
 
@@ -194,22 +217,22 @@ function formatPayload(value: string): string {
194
217
  }
195
218
 
196
219
  /** 日志表格列配置。 */
197
- const columns: ColumnProps[] = [
220
+ const columns = computed<ColumnProps[]>(() => [
198
221
  {
199
222
  prop: "operation",
200
- label: "操作方法",
223
+ label: t("system.base.log.field.operation"),
201
224
  minWidth: 240,
202
225
  search: { el: "input" }
203
226
  },
204
227
  {
205
228
  prop: "status_code",
206
- label: "状态码",
229
+ label: t("system.base.log.field.status_code"),
207
230
  minWidth: 100,
208
231
  search: { el: "input-number", props: { min: 0, controlsPosition: "right" } }
209
232
  },
210
233
  {
211
234
  prop: "request_time",
212
- label: "操作时间",
235
+ label: t("system.base.log.field.request_time"),
213
236
  minWidth: 140,
214
237
  search: {
215
238
  el: "date-picker",
@@ -218,27 +241,27 @@ const columns: ColumnProps[] = [
218
241
  editable: false,
219
242
  class: "!w-[240px]",
220
243
  rangeSeparator: "~",
221
- startPlaceholder: "开始时间",
222
- endPlaceholder: "截止时间",
244
+ startPlaceholder: t("common.placeholder.start_date"),
245
+ endPlaceholder: t("common.placeholder.end_date"),
223
246
  valueFormat: "YYYY-MM-DD"
224
247
  }
225
248
  }
226
249
  },
227
- { prop: "user_name", label: "操作人", minWidth: 80 },
228
- { prop: "client_ip", label: "IP 地址", minWidth: 80 },
229
- { prop: "location", label: "地区", minWidth: 80 },
230
- { prop: "browser_name", label: "浏览器", minWidth: 80 },
231
- { prop: "os_name", label: "终端系统", minWidth: 80 },
232
- { prop: "cost_time", label: "执行时间(ms)", minWidth: 100, align: "right" },
250
+ { prop: "user_name", label: t("system.base.log.field.user_name"), minWidth: 80 },
251
+ { prop: "client_ip", label: t("system.base.log.field.client_ip"), minWidth: 80 },
252
+ { prop: "location", label: t("system.base.log.field.location"), minWidth: 80 },
253
+ { prop: "browser_name", label: t("system.base.log.field.browser"), minWidth: 80 },
254
+ { prop: "os_name", label: t("system.base.log.field.os"), minWidth: 80 },
255
+ { prop: "cost_time", label: t("system.base.log.field.cost_time"), minWidth: 100, align: "right" },
233
256
  {
234
257
  prop: "detailAction",
235
- label: "操作",
258
+ label: t("common.field.action"),
236
259
  width: 100,
237
260
  fixed: "right",
238
261
  cellType: "actions",
239
262
  actions: [
240
263
  {
241
- label: "详情",
264
+ label: t("common.action.view"),
242
265
  type: "primary",
243
266
  link: true,
244
267
  icon: InfoFilled,
@@ -246,7 +269,7 @@ const columns: ColumnProps[] = [
246
269
  }
247
270
  ]
248
271
  }
249
- ];
272
+ ]);
250
273
 
251
274
  /**
252
275
  * 请求系统日志列表,并通过 buildPageRequest 统一处理分页参数。
@@ -261,7 +284,6 @@ async function requestBaseLogTable(params: PageBaseLogRequest) {
261
284
  */
262
285
  function handleOpenDialog(logId?: number) {
263
286
  resetDetail();
264
- dialog.title = "系统日志详情";
265
287
  dialog.visible = true;
266
288
  if (!logId) return;
267
289