@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.
- package/README.md +51 -50
- package/dist/package/declarations/src/api/system/base_language.d.ts +52 -0
- package/dist/package/declarations/src/api/system/base_translation.d.ts +10 -0
- package/dist/package/declarations/src/api/system/code_gen_i18n.d.ts +8 -0
- package/dist/package/declarations/src/api/system/ops_monitoring.d.ts +19 -0
- package/dist/package/declarations/src/api/system/ops_monitoring_sse.d.ts +12 -0
- package/dist/package/declarations/src/components/DynamicTranslationCell.vue.d.ts +16 -0
- package/dist/package/declarations/src/components/DynamicTranslationEditor.vue.d.ts +20 -0
- package/dist/package/declarations/src/components/dynamicTranslation.d.ts +38 -0
- package/dist/package/declarations/src/locales/generated.d.ts +6536 -0
- package/dist/package/declarations/src/rpc/base/v1/ai_session.d.ts +12 -2
- package/dist/package/declarations/src/rpc/base/v1/ai_tool.d.ts +9 -1
- package/dist/package/declarations/src/rpc/base/v1/config.d.ts +35 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +1 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +23 -2
- package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +9 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_job.d.ts +9 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_language.d.ts +119 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_menu.d.ts +6 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_migration.d.ts +6 -6
- package/dist/package/declarations/src/rpc/system/admin/v1/base_role.d.ts +13 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +75 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_user.d.ts +11 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/code_gen.d.ts +13 -11
- package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_column.d.ts +7 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_table.d.ts +24 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/common.d.ts +13 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/ops_monitoring.d.ts +222 -0
- package/dist/package/declarations/src/views/base/language/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue.d.ts +23 -0
- package/dist/package/declarations/src/views/tool/code-gen/config.d.ts +7 -7
- package/dist/package/declarations/src/views/tool/ops-monitoring/index.vue.d.ts +3 -0
- package/dist/package/src/api/base/ai_message.ts +7 -12
- package/dist/package/src/api/base/sse.ts +3 -1
- package/dist/package/src/api/system/base_language.ts +135 -0
- package/dist/package/src/api/system/base_translation.ts +33 -0
- package/dist/package/src/api/system/code_gen_column.ts +17 -3
- package/dist/package/src/api/system/code_gen_i18n.ts +18 -0
- package/dist/package/src/api/system/code_gen_table.ts +12 -4
- package/dist/package/src/api/system/ops_monitoring.ts +88 -0
- package/dist/package/src/api/system/ops_monitoring_sse.ts +49 -0
- package/dist/package/src/components/DynamicTranslationCell.vue +249 -0
- package/dist/package/src/components/DynamicTranslationEditor.vue +197 -0
- package/dist/package/src/components/dynamicTranslation.ts +66 -0
- package/dist/package/src/locales/README.md +30 -0
- package/dist/package/src/locales/en-US.json +933 -0
- package/dist/package/src/locales/es-ES.json +933 -0
- package/dist/package/src/locales/fr-FR.json +933 -0
- package/dist/package/src/locales/generated.ts +22 -0
- package/dist/package/src/locales/ja-JP.json +933 -0
- package/dist/package/src/locales/ko-KR.json +933 -0
- package/dist/package/src/locales/zh-CN.json +933 -0
- package/dist/package/src/locales/zh-TW.json +933 -0
- package/dist/package/src/module.ts +6 -2
- package/dist/package/src/rpc/base/v1/ai_session.ts +13 -2
- package/dist/package/src/rpc/base/v1/ai_tool.ts +10 -1
- package/dist/package/src/rpc/base/v1/config.ts +47 -0
- package/dist/package/src/rpc/system/admin/v1/auth.ts +1 -1
- package/dist/package/src/rpc/system/admin/v1/base_config.ts +24 -2
- package/dist/package/src/rpc/system/admin/v1/base_dict.ts +9 -0
- package/dist/package/src/rpc/system/admin/v1/base_job.ts +10 -1
- package/dist/package/src/rpc/system/admin/v1/base_language.ts +141 -0
- package/dist/package/src/rpc/system/admin/v1/base_menu.ts +6 -1
- package/dist/package/src/rpc/system/admin/v1/base_migration.ts +8 -8
- package/dist/package/src/rpc/system/admin/v1/base_role.ts +14 -1
- package/dist/package/src/rpc/system/admin/v1/base_translation.ts +90 -0
- package/dist/package/src/rpc/system/admin/v1/base_user.ts +12 -1
- package/dist/package/src/rpc/system/admin/v1/code_gen.ts +16 -12
- package/dist/package/src/rpc/system/admin/v1/code_gen_column.ts +8 -0
- package/dist/package/src/rpc/system/admin/v1/code_gen_table.ts +27 -1
- package/dist/package/src/rpc/system/admin/v1/common.ts +21 -0
- package/dist/package/src/rpc/system/admin/v1/ops_monitoring.ts +255 -0
- package/dist/package/src/views/ai/chat/components/AiMarkdown.vue +1 -6
- package/dist/package/src/views/ai/chat/components/ChatPanel.vue +75 -58
- package/dist/package/src/views/ai/chat/components/SessionPanel.vue +20 -9
- package/dist/package/src/views/ai/chat/components/XSender.vue +36 -23
- package/dist/package/src/views/ai/chat/index.vue +58 -41
- package/dist/package/src/views/ai/chat/message.ts +29 -27
- package/dist/package/src/views/base/api/index.vue +121 -84
- package/dist/package/src/views/base/area/index.vue +81 -32
- package/dist/package/src/views/base/config/index.vue +300 -96
- package/dist/package/src/views/base/dept/index.vue +110 -62
- package/dist/package/src/views/base/dict/index.vue +145 -62
- package/dist/package/src/views/base/dict/item.vue +155 -64
- package/dist/package/src/views/base/job/index.vue +134 -82
- package/dist/package/src/views/base/job/log.vue +24 -25
- package/dist/package/src/views/base/language/index.vue +260 -0
- package/dist/package/src/views/base/log/index.vue +68 -46
- package/dist/package/src/views/base/menu/index.vue +344 -200
- package/dist/package/src/views/base/migration/index.vue +49 -29
- package/dist/package/src/views/base/post/index.vue +128 -60
- package/dist/package/src/views/base/role/index.vue +145 -79
- package/dist/package/src/views/base/tenant/index.vue +132 -64
- package/dist/package/src/views/base/user/components/dept-tree.vue +2 -1
- package/dist/package/src/views/base/user/index.vue +194 -116
- package/dist/package/src/views/profile/components/base.vue +45 -28
- package/dist/package/src/views/profile/components/password.vue +45 -30
- package/dist/package/src/views/profile/components/security.vue +90 -54
- package/dist/package/src/views/profile/index.vue +10 -9
- package/dist/package/src/views/tool/api-doc/index.vue +6 -2
- package/dist/package/src/views/tool/code-gen/code-preview/index.vue +32 -16
- package/dist/package/src/views/tool/code-gen/columns/index.vue +382 -273
- package/dist/package/src/views/tool/code-gen/columns/option-copy.ts +1 -6
- package/dist/package/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue +118 -0
- package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +65 -36
- package/dist/package/src/views/tool/code-gen/components/CodePreviewPane.vue +8 -5
- package/dist/package/src/views/tool/code-gen/config.ts +116 -79
- package/dist/package/src/views/tool/code-gen/preview/data.ts +19 -17
- package/dist/package/src/views/tool/code-gen/preview/index.vue +96 -59
- package/dist/package/src/views/tool/code-gen/proto/index.vue +110 -62
- package/dist/package/src/views/tool/code-gen/table/index.vue +201 -121
- package/dist/package/src/views/tool/ops-monitoring/index.vue +1175 -0
- package/dist/package/src/views/tool/project-doc/index.vue +17 -15
- package/package.json +6 -2
- package/dist/package/declarations/src/rpc/base/v1/enum.d.ts +0 -43
- package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +0 -67
- package/dist/package/src/rpc/base/v1/enum.ts +0 -54
- 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="
|
|
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="
|
|
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="
|
|
17
|
-
<el-descriptions-item label="
|
|
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
|
|
21
|
-
|
|
22
|
-
|
|
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="
|
|
29
|
-
<el-descriptions-item v-if="detail.request_uri" label="
|
|
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="
|
|
33
|
-
|
|
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="
|
|
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="
|
|
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="
|
|
45
|
-
<el-descriptions-item label="
|
|
46
|
-
<el-descriptions-item label="
|
|
47
|
-
<el-descriptions-item label="
|
|
48
|
-
<el-descriptions-item label="
|
|
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
|
|
52
|
-
|
|
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="
|
|
59
|
-
<el-descriptions-item label="
|
|
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
|
|
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"
|
|
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
|
|
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: "
|
|
228
|
-
{ prop: "client_ip", label: "
|
|
229
|
-
{ prop: "location", label: "
|
|
230
|
-
{ prop: "browser_name", label: "
|
|
231
|
-
{ prop: "os_name", label: "
|
|
232
|
-
{ prop: "cost_time", label: "
|
|
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
|
|