@liujitcn/kratos-admin-system 0.0.1

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 (208) hide show
  1. package/README.md +137 -0
  2. package/dist/package/declarations/index.d.ts +1 -0
  3. package/dist/package/declarations/src/ai.d.ts +10 -0
  4. package/dist/package/declarations/src/api/base/ai_message.d.ts +27 -0
  5. package/dist/package/declarations/src/api/base/ai_session.d.ts +17 -0
  6. package/dist/package/declarations/src/api/base/ai_tool.d.ts +7 -0
  7. package/dist/package/declarations/src/api/base/oauth.d.ts +13 -0
  8. package/dist/package/declarations/src/api/base/sse.d.ts +31 -0
  9. package/dist/package/declarations/src/api/system/auth.d.ts +17 -0
  10. package/dist/package/declarations/src/api/system/base_api.d.ts +22 -0
  11. package/dist/package/declarations/src/api/system/base_area.d.ts +19 -0
  12. package/dist/package/declarations/src/api/system/base_config.d.ts +20 -0
  13. package/dist/package/declarations/src/api/system/base_dept.d.ts +21 -0
  14. package/dist/package/declarations/src/api/system/base_dict.d.ts +32 -0
  15. package/dist/package/declarations/src/api/system/base_job.d.ts +28 -0
  16. package/dist/package/declarations/src/api/system/base_log.d.ts +9 -0
  17. package/dist/package/declarations/src/api/system/base_menu.d.ts +21 -0
  18. package/dist/package/declarations/src/api/system/base_migration.d.ts +10 -0
  19. package/dist/package/declarations/src/api/system/base_post.d.ts +21 -0
  20. package/dist/package/declarations/src/api/system/base_role.d.ts +23 -0
  21. package/dist/package/declarations/src/api/system/base_tenant.d.ts +21 -0
  22. package/dist/package/declarations/src/api/system/base_user.d.ts +23 -0
  23. package/dist/package/declarations/src/api/system/code_gen.d.ts +14 -0
  24. package/dist/package/declarations/src/api/system/code_gen_column.d.ts +12 -0
  25. package/dist/package/declarations/src/api/system/code_gen_proto.d.ts +10 -0
  26. package/dist/package/declarations/src/api/system/code_gen_sse.d.ts +8 -0
  27. package/dist/package/declarations/src/api/system/code_gen_table.d.ts +18 -0
  28. package/dist/package/declarations/src/api/system/project_document.d.ts +9 -0
  29. package/dist/package/declarations/src/components/Ai.vue.d.ts +3 -0
  30. package/dist/package/declarations/src/index.d.ts +3 -0
  31. package/dist/package/declarations/src/module.d.ts +2 -0
  32. package/dist/package/declarations/src/rpc/base/v1/ai_message.d.ts +82 -0
  33. package/dist/package/declarations/src/rpc/base/v1/ai_session.d.ts +176 -0
  34. package/dist/package/declarations/src/rpc/base/v1/ai_tool.d.ts +59 -0
  35. package/dist/package/declarations/src/rpc/base/v1/oauth.d.ts +167 -0
  36. package/dist/package/declarations/src/rpc/base/v1/sse.d.ts +13 -0
  37. package/dist/package/declarations/src/rpc/common/v1/common.d.ts +57 -0
  38. package/dist/package/declarations/src/rpc/common/v1/enum.d.ts +58 -0
  39. package/dist/package/declarations/src/rpc/common/v1/types.d.ts +60 -0
  40. package/dist/package/declarations/src/rpc/google/protobuf/empty.d.ts +11 -0
  41. package/dist/package/declarations/src/rpc/google/protobuf/timestamp.d.ts +107 -0
  42. package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +156 -0
  43. package/dist/package/declarations/src/rpc/system/admin/v1/base_api.d.ts +193 -0
  44. package/dist/package/declarations/src/rpc/system/admin/v1/base_area.d.ts +82 -0
  45. package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +112 -0
  46. package/dist/package/declarations/src/rpc/system/admin/v1/base_dept.d.ts +112 -0
  47. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +215 -0
  48. package/dist/package/declarations/src/rpc/system/admin/v1/base_job.d.ts +177 -0
  49. package/dist/package/declarations/src/rpc/system/admin/v1/base_log.d.ts +87 -0
  50. package/dist/package/declarations/src/rpc/system/admin/v1/base_menu.d.ts +151 -0
  51. package/dist/package/declarations/src/rpc/system/admin/v1/base_migration.d.ts +64 -0
  52. package/dist/package/declarations/src/rpc/system/admin/v1/base_post.d.ts +112 -0
  53. package/dist/package/declarations/src/rpc/system/admin/v1/base_role.d.ts +128 -0
  54. package/dist/package/declarations/src/rpc/system/admin/v1/base_tenant.d.ts +112 -0
  55. package/dist/package/declarations/src/rpc/system/admin/v1/base_user.d.ts +161 -0
  56. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen.d.ts +155 -0
  57. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_column.d.ts +143 -0
  58. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_proto.d.ts +86 -0
  59. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_table.d.ts +149 -0
  60. package/dist/package/declarations/src/rpc/system/admin/v1/project_document.d.ts +64 -0
  61. package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +67 -0
  62. package/dist/package/declarations/src/views/ai/chat/attachment.d.ts +14 -0
  63. package/dist/package/declarations/src/views/ai/chat/components/AiMarkdown.vue.d.ts +13 -0
  64. package/dist/package/declarations/src/views/ai/chat/components/ChatPanel.vue.d.ts +45 -0
  65. package/dist/package/declarations/src/views/ai/chat/components/SessionPanel.vue.d.ts +34 -0
  66. package/dist/package/declarations/src/views/ai/chat/components/XSender.vue.d.ts +12 -0
  67. package/dist/package/declarations/src/views/ai/chat/index.vue.d.ts +4 -0
  68. package/dist/package/declarations/src/views/ai/chat/message.d.ts +59 -0
  69. package/dist/package/declarations/src/views/ai/chat/stream.d.ts +10 -0
  70. package/dist/package/declarations/src/views/ai/chat/types.d.ts +115 -0
  71. package/dist/package/declarations/src/views/base/api/index.vue.d.ts +3 -0
  72. package/dist/package/declarations/src/views/base/area/index.vue.d.ts +3 -0
  73. package/dist/package/declarations/src/views/base/config/index.vue.d.ts +3 -0
  74. package/dist/package/declarations/src/views/base/dept/index.vue.d.ts +3 -0
  75. package/dist/package/declarations/src/views/base/dict/index.vue.d.ts +3 -0
  76. package/dist/package/declarations/src/views/base/dict/item.vue.d.ts +3 -0
  77. package/dist/package/declarations/src/views/base/job/index.vue.d.ts +3 -0
  78. package/dist/package/declarations/src/views/base/job/log.vue.d.ts +3 -0
  79. package/dist/package/declarations/src/views/base/log/index.vue.d.ts +3 -0
  80. package/dist/package/declarations/src/views/base/menu/index.vue.d.ts +3 -0
  81. package/dist/package/declarations/src/views/base/migration/index.vue.d.ts +4 -0
  82. package/dist/package/declarations/src/views/base/post/index.vue.d.ts +3 -0
  83. package/dist/package/declarations/src/views/base/role/index.vue.d.ts +3 -0
  84. package/dist/package/declarations/src/views/base/tenant/index.vue.d.ts +3 -0
  85. package/dist/package/declarations/src/views/base/user/components/dept-tree.vue.d.ts +19 -0
  86. package/dist/package/declarations/src/views/base/user/index.vue.d.ts +3 -0
  87. package/dist/package/declarations/src/views/profile/components/base.vue.d.ts +13 -0
  88. package/dist/package/declarations/src/views/profile/components/password.vue.d.ts +3 -0
  89. package/dist/package/declarations/src/views/profile/components/security.vue.d.ts +15 -0
  90. package/dist/package/declarations/src/views/profile/index.vue.d.ts +3 -0
  91. package/dist/package/declarations/src/views/tool/api-doc/index.vue.d.ts +4 -0
  92. package/dist/package/declarations/src/views/tool/code-gen/code-preview/index.vue.d.ts +3 -0
  93. package/dist/package/declarations/src/views/tool/code-gen/columns/index.vue.d.ts +3 -0
  94. package/dist/package/declarations/src/views/tool/code-gen/columns/option-copy.d.ts +25 -0
  95. package/dist/package/declarations/src/views/tool/code-gen/components/CodeGenProgressDialog.vue.d.ts +16 -0
  96. package/dist/package/declarations/src/views/tool/code-gen/components/CodePreviewPane.vue.d.ts +9 -0
  97. package/dist/package/declarations/src/views/tool/code-gen/config.d.ts +32 -0
  98. package/dist/package/declarations/src/views/tool/code-gen/preview/capabilities.d.ts +20 -0
  99. package/dist/package/declarations/src/views/tool/code-gen/preview/data.d.ts +42 -0
  100. package/dist/package/declarations/src/views/tool/code-gen/preview/index.vue.d.ts +3 -0
  101. package/dist/package/declarations/src/views/tool/code-gen/proto/index.vue.d.ts +3 -0
  102. package/dist/package/declarations/src/views/tool/code-gen/table/index.vue.d.ts +3 -0
  103. package/dist/package/declarations/src/views/tool/project-doc/index.vue.d.ts +4 -0
  104. package/dist/package/src/ai.ts +16 -0
  105. package/dist/package/src/api/base/ai_message.ts +139 -0
  106. package/dist/package/src/api/base/ai_session.ts +77 -0
  107. package/dist/package/src/api/base/ai_tool.ts +22 -0
  108. package/dist/package/src/api/base/oauth.ts +47 -0
  109. package/dist/package/src/api/base/sse.ts +192 -0
  110. package/dist/package/src/api/system/auth.ts +65 -0
  111. package/dist/package/src/api/system/base_api.ts +95 -0
  112. package/dist/package/src/api/system/base_area.ts +73 -0
  113. package/dist/package/src/api/system/base_config.ts +82 -0
  114. package/dist/package/src/api/system/base_dept.ts +83 -0
  115. package/dist/package/src/api/system/base_dict.ts +144 -0
  116. package/dist/package/src/api/system/base_job.ts +125 -0
  117. package/dist/package/src/api/system/base_log.ts +32 -0
  118. package/dist/package/src/api/system/base_menu.ts +83 -0
  119. package/dist/package/src/api/system/base_migration.ts +35 -0
  120. package/dist/package/src/api/system/base_post.ts +83 -0
  121. package/dist/package/src/api/system/base_role.ts +93 -0
  122. package/dist/package/src/api/system/base_tenant.ts +83 -0
  123. package/dist/package/src/api/system/base_user.ts +93 -0
  124. package/dist/package/src/api/system/code_gen.ts +56 -0
  125. package/dist/package/src/api/system/code_gen_column.ts +43 -0
  126. package/dist/package/src/api/system/code_gen_proto.ts +32 -0
  127. package/dist/package/src/api/system/code_gen_sse.ts +33 -0
  128. package/dist/package/src/api/system/code_gen_table.ts +74 -0
  129. package/dist/package/src/api/system/project_document.ts +33 -0
  130. package/dist/package/src/components/Ai.vue +57 -0
  131. package/dist/package/src/index.ts +3 -0
  132. package/dist/package/src/module.ts +17 -0
  133. package/dist/package/src/rpc/base/v1/ai_message.ts +98 -0
  134. package/dist/package/src/rpc/base/v1/ai_session.ts +214 -0
  135. package/dist/package/src/rpc/base/v1/ai_tool.ts +74 -0
  136. package/dist/package/src/rpc/base/v1/oauth.ts +199 -0
  137. package/dist/package/src/rpc/base/v1/sse.ts +22 -0
  138. package/dist/package/src/rpc/common/v1/common.ts +71 -0
  139. package/dist/package/src/rpc/common/v1/enum.ts +71 -0
  140. package/dist/package/src/rpc/common/v1/types.ts +77 -0
  141. package/dist/package/src/rpc/google/protobuf/empty.ts +19 -0
  142. package/dist/package/src/rpc/google/protobuf/timestamp.ts +115 -0
  143. package/dist/package/src/rpc/system/admin/v1/auth.ts +208 -0
  144. package/dist/package/src/rpc/system/admin/v1/base_api.ts +241 -0
  145. package/dist/package/src/rpc/system/admin/v1/base_area.ts +105 -0
  146. package/dist/package/src/rpc/system/admin/v1/base_config.ts +140 -0
  147. package/dist/package/src/rpc/system/admin/v1/base_dept.ts +140 -0
  148. package/dist/package/src/rpc/system/admin/v1/base_dict.ts +249 -0
  149. package/dist/package/src/rpc/system/admin/v1/base_job.ts +206 -0
  150. package/dist/package/src/rpc/system/admin/v1/base_log.ts +101 -0
  151. package/dist/package/src/rpc/system/admin/v1/base_menu.ts +195 -0
  152. package/dist/package/src/rpc/system/admin/v1/base_migration.ts +81 -0
  153. package/dist/package/src/rpc/system/admin/v1/base_post.ts +134 -0
  154. package/dist/package/src/rpc/system/admin/v1/base_role.ts +151 -0
  155. package/dist/package/src/rpc/system/admin/v1/base_tenant.ts +134 -0
  156. package/dist/package/src/rpc/system/admin/v1/base_user.ts +190 -0
  157. package/dist/package/src/rpc/system/admin/v1/code_gen.ts +176 -0
  158. package/dist/package/src/rpc/system/admin/v1/code_gen_column.ts +170 -0
  159. package/dist/package/src/rpc/system/admin/v1/code_gen_proto.ts +104 -0
  160. package/dist/package/src/rpc/system/admin/v1/code_gen_table.ts +179 -0
  161. package/dist/package/src/rpc/system/admin/v1/project_document.ts +79 -0
  162. package/dist/package/src/rpc/system/common/v1/enum.ts +80 -0
  163. package/dist/package/src/typings/swagger-ui-dist.d.ts +28 -0
  164. package/dist/package/src/typings/x-markdown-vue.d.ts +1 -0
  165. package/dist/package/src/views/ai/chat/attachment.ts +65 -0
  166. package/dist/package/src/views/ai/chat/components/AiMarkdown.vue +162 -0
  167. package/dist/package/src/views/ai/chat/components/ChatPanel.vue +1861 -0
  168. package/dist/package/src/views/ai/chat/components/SessionPanel.vue +316 -0
  169. package/dist/package/src/views/ai/chat/components/XSender.vue +554 -0
  170. package/dist/package/src/views/ai/chat/index.vue +848 -0
  171. package/dist/package/src/views/ai/chat/message.ts +416 -0
  172. package/dist/package/src/views/ai/chat/stream.ts +115 -0
  173. package/dist/package/src/views/ai/chat/types.ts +126 -0
  174. package/dist/package/src/views/base/api/index.vue +455 -0
  175. package/dist/package/src/views/base/area/index.vue +269 -0
  176. package/dist/package/src/views/base/config/index.vue +530 -0
  177. package/dist/package/src/views/base/dept/index.vue +461 -0
  178. package/dist/package/src/views/base/dict/index.vue +304 -0
  179. package/dist/package/src/views/base/dict/item.vue +373 -0
  180. package/dist/package/src/views/base/job/index.vue +535 -0
  181. package/dist/package/src/views/base/job/log.vue +202 -0
  182. package/dist/package/src/views/base/log/index.vue +317 -0
  183. package/dist/package/src/views/base/menu/index.vue +944 -0
  184. package/dist/package/src/views/base/migration/index.vue +791 -0
  185. package/dist/package/src/views/base/post/index.vue +324 -0
  186. package/dist/package/src/views/base/role/index.vue +684 -0
  187. package/dist/package/src/views/base/tenant/index.vue +328 -0
  188. package/dist/package/src/views/base/user/components/dept-tree.vue +75 -0
  189. package/dist/package/src/views/base/user/index.vue +783 -0
  190. package/dist/package/src/views/profile/components/base.vue +320 -0
  191. package/dist/package/src/views/profile/components/password.vue +269 -0
  192. package/dist/package/src/views/profile/components/security.vue +443 -0
  193. package/dist/package/src/views/profile/index.vue +199 -0
  194. package/dist/package/src/views/tool/api-doc/index.vue +275 -0
  195. package/dist/package/src/views/tool/code-gen/code-preview/index.vue +233 -0
  196. package/dist/package/src/views/tool/code-gen/columns/index.vue +1456 -0
  197. package/dist/package/src/views/tool/code-gen/columns/option-copy.ts +125 -0
  198. package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +328 -0
  199. package/dist/package/src/views/tool/code-gen/components/CodePreviewPane.vue +42 -0
  200. package/dist/package/src/views/tool/code-gen/config.ts +175 -0
  201. package/dist/package/src/views/tool/code-gen/preview/capabilities.ts +34 -0
  202. package/dist/package/src/views/tool/code-gen/preview/data.ts +331 -0
  203. package/dist/package/src/views/tool/code-gen/preview/index.vue +831 -0
  204. package/dist/package/src/views/tool/code-gen/proto/index.vue +703 -0
  205. package/dist/package/src/views/tool/code-gen/table/index.vue +864 -0
  206. package/dist/package/src/views/tool/project-doc/index.vue +561 -0
  207. package/package.json +60 -0
  208. package/tsconfig.json +13 -0
@@ -0,0 +1,202 @@
1
+ <template>
2
+ <div class="table-box">
3
+ <ProTable ref="proTable" row-key="id" :columns="columns" :request-api="requestBaseJobLogTable" />
4
+
5
+ <ProDialog v-model="dialog.visible" :title="dialog.title" width="1200px" @close="handleCloseDialog">
6
+ <div class="detail-container">
7
+ <el-descriptions title="基础信息" border :column="2">
8
+ <el-descriptions-item label="状态">
9
+ <DictLabel v-model="detail.status" code="base_job_log_status" />
10
+ </el-descriptions-item>
11
+ <el-descriptions-item label="耗时">{{ detail.process_time }}</el-descriptions-item>
12
+ <el-descriptions-item label="操作时间">{{ detail.execute_time }}</el-descriptions-item>
13
+ </el-descriptions>
14
+
15
+ <el-descriptions title="请求信息" border :column="1" class="mt-4">
16
+ <el-descriptions-item label="执行参数">
17
+ <pre class="code-block">{{ formatJson(detail.input) }}</pre>
18
+ </el-descriptions-item>
19
+ <el-descriptions-item label="输出结果">
20
+ <pre class="code-block">{{ formatJson(detail.output) }}</pre>
21
+ </el-descriptions-item>
22
+ </el-descriptions>
23
+
24
+ <el-alert
25
+ v-if="detail.status === BaseJobLogStatus.FAIL"
26
+ title="失败原因"
27
+ type="error"
28
+ :description="detail.error"
29
+ class="mt-4"
30
+ show-icon
31
+ />
32
+ </div>
33
+
34
+ <template #footer>
35
+ <el-button @click="handleCloseDialog">关闭</el-button>
36
+ </template>
37
+ </ProDialog>
38
+ </div>
39
+ </template>
40
+
41
+ <script setup lang="ts">
42
+ import { reactive, ref, watch } from "vue";
43
+ import { useRoute } from "vue-router";
44
+ import { InfoFilled } from "@element-plus/icons-vue";
45
+ import type { ColumnProps, ProTableInstance } from "@liujitcn/kratos-admin-core/components/ProTable/interface";
46
+ import ProTable from "@liujitcn/kratos-admin-core/components/ProTable";
47
+ import ProDialog from "@liujitcn/kratos-admin-core/components/Dialog/ProDialog.vue";
48
+ import { defBaseJobService } from "@liujitcn/kratos-admin-system/api/system/base_job";
49
+ import { buildPageRequest } from "@liujitcn/kratos-admin-core/table";
50
+ import { formatJson } from "@liujitcn/kratos-admin-core/format";
51
+ import type { BaseJobLog, PageBaseJobLogRequest } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_job";
52
+ import { BaseJobLogStatus } from "@liujitcn/kratos-admin-system/rpc/system/common/v1/enum";
53
+
54
+ defineOptions({
55
+ name: "BaseJobLog",
56
+ inheritAttrs: false
57
+ });
58
+
59
+ const route = useRoute();
60
+ const proTable = ref<ProTableInstance>();
61
+ const jobId = ref(Number(route.query.jobId ?? 0));
62
+
63
+ const dialog = reactive({
64
+ title: "",
65
+ visible: false
66
+ });
67
+
68
+ /** 创建默认任务日志详情,避免弹窗切换时残留上一条记录。 */
69
+ function createDefaultDetail(): BaseJobLog {
70
+ return {
71
+ /** 任务日志ID */
72
+ id: 0,
73
+ /** 任务ID */
74
+ job_id: 0,
75
+ /** 执行参数 */
76
+ input: "",
77
+ /** 输出结果 */
78
+ output: "",
79
+ /** 错误信息 */
80
+ error: "",
81
+ /** 状态 */
82
+ status: BaseJobLogStatus.UNKNOWN_BJLS,
83
+ /** 消耗时间 */
84
+ process_time: "",
85
+ /** 执行时间 */
86
+ execute_time: ""
87
+ };
88
+ }
89
+
90
+ const detail = reactive<BaseJobLog>(createDefaultDetail());
91
+
92
+ /** 定时任务日志表格列配置。 */
93
+ const columns: ColumnProps[] = [
94
+ {
95
+ prop: "status",
96
+ label: "状态",
97
+ minWidth: 120,
98
+ dictCode: "base_job_log_status",
99
+ search: { el: "select" }
100
+ },
101
+ {
102
+ prop: "execute_time",
103
+ label: "执行时间",
104
+ minWidth: 180,
105
+ search: {
106
+ el: "date-picker",
107
+ props: {
108
+ type: "daterange",
109
+ editable: false,
110
+ class: "!w-[240px]",
111
+ rangeSeparator: "~",
112
+ startPlaceholder: "开始时间",
113
+ endPlaceholder: "截止时间",
114
+ valueFormat: "YYYY-MM-DD"
115
+ }
116
+ }
117
+ },
118
+ { prop: "process_time", label: "消耗时间(ms)", minWidth: 130, align: "right" },
119
+ {
120
+ prop: "detailAction",
121
+ label: "操作",
122
+ width: 100,
123
+ fixed: "right",
124
+ cellType: "actions",
125
+ actions: [
126
+ {
127
+ label: "详情",
128
+ type: "primary",
129
+ link: true,
130
+ icon: InfoFilled,
131
+ onClick: scope => handleOpenDialog((scope.row as BaseJobLog).id)
132
+ }
133
+ ]
134
+ }
135
+ ];
136
+
137
+ watch(
138
+ () => route.query.jobId,
139
+ value => {
140
+ jobId.value = Number(value ?? 0);
141
+ proTable.value?.search();
142
+ }
143
+ );
144
+
145
+ /**
146
+ * 请求定时任务日志列表,并补充当前任务 ID。
147
+ */
148
+ async function requestBaseJobLogTable(params: PageBaseJobLogRequest) {
149
+ const data = await defBaseJobService.PageBaseJobLog({ ...buildPageRequest(params), job_id: jobId.value });
150
+ return { data: { list: data.base_job_logs ?? [], total: data.total } };
151
+ }
152
+
153
+ /**
154
+ * 打开定时任务日志详情弹窗。
155
+ */
156
+ function handleOpenDialog(logId?: number) {
157
+ resetDetail();
158
+ dialog.title = "定时任务日志详情";
159
+ dialog.visible = true;
160
+ if (!logId) return;
161
+
162
+ defBaseJobService.GetBaseJobLog({ id: logId }).then(data => {
163
+ Object.assign(detail, data);
164
+ });
165
+ }
166
+
167
+ /**
168
+ * 关闭定时任务日志详情弹窗。
169
+ */
170
+ function handleCloseDialog() {
171
+ dialog.visible = false;
172
+ resetDetail();
173
+ }
174
+
175
+ /**
176
+ * 重置任务日志详情,避免关闭后残留旧数据。
177
+ */
178
+ function resetDetail() {
179
+ Object.assign(detail, createDefaultDetail());
180
+ }
181
+ </script>
182
+
183
+ <style scoped>
184
+ .detail-container {
185
+ max-height: 70vh;
186
+ padding: 20px;
187
+ overflow-y: auto;
188
+ background: #ffffff;
189
+ border-radius: 4px;
190
+ }
191
+ .mt-4 {
192
+ margin-top: 16px;
193
+ }
194
+ .code-block {
195
+ max-height: 200px;
196
+ padding: 12px;
197
+ margin: 0;
198
+ overflow: auto;
199
+ background: #f5f7fa;
200
+ border-radius: 4px;
201
+ }
202
+ </style>
@@ -0,0 +1,317 @@
1
+ <template>
2
+ <div class="table-box">
3
+ <ProTable ref="proTable" row-key="id" :columns="columns" :request-api="requestBaseLogTable" />
4
+
5
+ <ProDialog v-model="dialog.visible" :title="dialog.title" width="1500px" @close="handleCloseDialog">
6
+ <div class="detail-container">
7
+ <el-descriptions title="基础信息" border :column="2">
8
+ <el-descriptions-item label="操作结果">
9
+ <el-tag :type="detail.is_success ? 'success' : 'danger'" effect="light">
10
+ {{ detail.is_success ? "成功" : "失败" }}
11
+ </el-tag>
12
+ </el-descriptions-item>
13
+ <el-descriptions-item label="状态码">
14
+ <el-tag :type="statusCodeColor" effect="light">{{ detail.status_code || "--" }}</el-tag>
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>
18
+ </el-descriptions>
19
+
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="操作方法">
23
+ <el-tag effect="plain">{{ detail.operation || "--" }}</el-tag>
24
+ </el-descriptions-item>
25
+ <el-descriptions-item label="请求方法">
26
+ <el-tag effect="plain">{{ detail.method || "--" }}</el-tag>
27
+ </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">{{
30
+ detail.request_uri
31
+ }}</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">
34
+ <pre class="code-block">{{ formatPayload(detail.request_header) }}</pre>
35
+ </el-descriptions-item>
36
+ <el-descriptions-item label="请求体" :span="2">
37
+ <pre class="code-block">{{ formatPayload(detail.request_body) }}</pre>
38
+ </el-descriptions-item>
39
+ <el-descriptions-item label="请求结果" :span="2">
40
+ <pre class="code-block">{{ formatPayload(detail.response) }}</pre>
41
+ </el-descriptions-item>
42
+ </el-descriptions>
43
+
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>
49
+ </el-descriptions>
50
+
51
+ <el-descriptions title="客户端信息" border :column="2" direction="vertical" class="mt-4 compact-descriptions">
52
+ <el-descriptions-item label="浏览器">
53
+ {{ [detail.browser_name, detail.browser_version].filter(Boolean).join(" ") || "--" }}
54
+ </el-descriptions-item>
55
+ <el-descriptions-item label="操作系统">
56
+ {{ [detail.os_name, detail.os_version].filter(Boolean).join(" ") || "--" }}
57
+ </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>
60
+ <el-descriptions-item label="User Agent" :span="2">{{ detail.user_agent || "--" }}</el-descriptions-item>
61
+ </el-descriptions>
62
+
63
+ <el-alert v-if="!detail.is_success" title="失败原因" type="error" :description="detail.reason" class="mt-4" show-icon />
64
+ </div>
65
+
66
+ <template #footer>
67
+ <el-button @click="handleCloseDialog">关闭</el-button>
68
+ </template>
69
+ </ProDialog>
70
+ </div>
71
+ </template>
72
+
73
+ <script setup lang="ts">
74
+ import { computed, reactive, ref } from "vue";
75
+ import { InfoFilled } from "@element-plus/icons-vue";
76
+ import type { ColumnProps, ProTableInstance } from "@liujitcn/kratos-admin-core/components/ProTable/interface";
77
+ import ProTable from "@liujitcn/kratos-admin-core/components/ProTable";
78
+ import ProDialog from "@liujitcn/kratos-admin-core/components/Dialog/ProDialog.vue";
79
+ import { defBaseLogService } from "@liujitcn/kratos-admin-system/api/system/base_log";
80
+ import { buildPageRequest } from "@liujitcn/kratos-admin-core/table";
81
+ import { formatJson } from "@liujitcn/kratos-admin-core/format";
82
+ import type { BaseLog, PageBaseLogRequest } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_log";
83
+
84
+ defineOptions({
85
+ name: "BaseLog",
86
+ inheritAttrs: false
87
+ });
88
+
89
+ const proTable = ref<ProTableInstance>();
90
+
91
+ const dialog = reactive({
92
+ title: "",
93
+ visible: false
94
+ });
95
+
96
+ /** 状态码颜色计算。 */
97
+ const statusCodeColor = computed(() => {
98
+ const code = detail.status_code;
99
+ if (code >= 200 && code < 300) return "success";
100
+ if (code >= 400 && code < 500) return "warning";
101
+ if (code >= 500) return "danger";
102
+ return "info";
103
+ });
104
+
105
+ /** 创建默认日志详情,避免多次查看时残留上一条数据。 */
106
+ function createDefaultDetail(): BaseLog {
107
+ return {
108
+ /** 日志ID */
109
+ id: 0,
110
+ /** 请求ID */
111
+ request_id: "",
112
+ /** 请求时间 */
113
+ request_time: "",
114
+ /** 请求方法 */
115
+ method: "",
116
+ /** 操作方法 */
117
+ operation: "",
118
+ /** 请求路径 */
119
+ path: "",
120
+ /** 请求源 */
121
+ referer: "",
122
+ /** 请求URI */
123
+ request_uri: "",
124
+ /** 请求头 */
125
+ request_header: "",
126
+ /** 请求体 */
127
+ request_body: "",
128
+ /** 响应信息 */
129
+ response: "",
130
+ /** 操作耗时 */
131
+ cost_time: "",
132
+ /** 操作是否成功 */
133
+ is_success: false,
134
+ /** 状态码 */
135
+ status_code: 0,
136
+ /** 操作失败原因 */
137
+ reason: "",
138
+ /** 操作地理位置 */
139
+ location: "",
140
+ /** 操作者用户ID */
141
+ user_id: 0,
142
+ /** 操作者账号名 */
143
+ user_name: "",
144
+ /** 操作者IP */
145
+ client_ip: "",
146
+ /** 浏览器的用户代理信息 */
147
+ user_agent: "",
148
+ /** 浏览器名称 */
149
+ browser_name: "",
150
+ /** 浏览器版本 */
151
+ browser_version: "",
152
+ /** 客户端ID */
153
+ client_id: "",
154
+ /** 客户端名称 */
155
+ client_name: "",
156
+ /** 操作系统名称 */
157
+ os_name: "",
158
+ /** 操作系统版本 */
159
+ os_version: ""
160
+ };
161
+ }
162
+
163
+ const detail = reactive<BaseLog>(createDefaultDetail());
164
+
165
+ function normalizeBoolean(value: unknown): boolean {
166
+ if (typeof value === "boolean") return value;
167
+ if (typeof value === "number") return value !== 0;
168
+ if (typeof value === "string") {
169
+ const normalized = value.trim().toLowerCase();
170
+ return normalized === "true" || normalized === "1" || normalized === "success";
171
+ }
172
+ return false;
173
+ }
174
+
175
+ function normalizeNumber(value: unknown): number {
176
+ if (typeof value === "number") return Number.isFinite(value) ? value : 0;
177
+ if (typeof value === "string") {
178
+ const parsed = Number(value);
179
+ return Number.isFinite(parsed) ? parsed : 0;
180
+ }
181
+ return 0;
182
+ }
183
+
184
+ function normalizeDetail(data: BaseLog): BaseLog {
185
+ return {
186
+ ...data,
187
+ is_success: normalizeBoolean((data as BaseLog & { is_success?: unknown }).is_success),
188
+ status_code: normalizeNumber(data.status_code)
189
+ };
190
+ }
191
+
192
+ function formatPayload(value: string): string {
193
+ return value ? formatJson(value) : "--";
194
+ }
195
+
196
+ /** 日志表格列配置。 */
197
+ const columns: ColumnProps[] = [
198
+ {
199
+ prop: "operation",
200
+ label: "操作方法",
201
+ minWidth: 240,
202
+ search: { el: "input" }
203
+ },
204
+ {
205
+ prop: "status_code",
206
+ label: "状态码",
207
+ minWidth: 100,
208
+ search: { el: "input-number", props: { min: 0, controlsPosition: "right" } }
209
+ },
210
+ {
211
+ prop: "request_time",
212
+ label: "操作时间",
213
+ minWidth: 140,
214
+ search: {
215
+ el: "date-picker",
216
+ props: {
217
+ type: "daterange",
218
+ editable: false,
219
+ class: "!w-[240px]",
220
+ rangeSeparator: "~",
221
+ startPlaceholder: "开始时间",
222
+ endPlaceholder: "截止时间",
223
+ valueFormat: "YYYY-MM-DD"
224
+ }
225
+ }
226
+ },
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" },
233
+ {
234
+ prop: "detailAction",
235
+ label: "操作",
236
+ width: 100,
237
+ fixed: "right",
238
+ cellType: "actions",
239
+ actions: [
240
+ {
241
+ label: "详情",
242
+ type: "primary",
243
+ link: true,
244
+ icon: InfoFilled,
245
+ onClick: scope => handleOpenDialog((scope.row as BaseLog).id)
246
+ }
247
+ ]
248
+ }
249
+ ];
250
+
251
+ /**
252
+ * 请求系统日志列表,并通过 buildPageRequest 统一处理分页参数。
253
+ */
254
+ async function requestBaseLogTable(params: PageBaseLogRequest) {
255
+ const data = await defBaseLogService.PageBaseLog(buildPageRequest(params));
256
+ return { data: { list: data.base_logs ?? [], total: data.total } };
257
+ }
258
+
259
+ /**
260
+ * 打开系统日志详情弹窗。
261
+ */
262
+ function handleOpenDialog(logId?: number) {
263
+ resetDetail();
264
+ dialog.title = "系统日志详情";
265
+ dialog.visible = true;
266
+ if (!logId) return;
267
+
268
+ defBaseLogService.GetBaseLog({ id: logId }).then(data => {
269
+ Object.assign(detail, normalizeDetail(data));
270
+ });
271
+ }
272
+
273
+ /**
274
+ * 关闭系统日志弹窗。
275
+ */
276
+ function handleCloseDialog() {
277
+ dialog.visible = false;
278
+ resetDetail();
279
+ }
280
+
281
+ /**
282
+ * 重置日志详情,避免关闭后保留旧数据。
283
+ */
284
+ function resetDetail() {
285
+ Object.assign(detail, createDefaultDetail());
286
+ }
287
+ </script>
288
+
289
+ <style scoped>
290
+ .detail-container {
291
+ max-height: 70vh;
292
+ padding: 20px;
293
+ overflow-y: auto;
294
+ background: #ffffff;
295
+ border-radius: 4px;
296
+ }
297
+ .mt-4 {
298
+ margin-top: 16px;
299
+ }
300
+ .code-block {
301
+ max-height: 240px;
302
+ padding: 12px;
303
+ margin: 0;
304
+ overflow: auto;
305
+ line-height: 1.6;
306
+ word-break: break-all;
307
+ white-space: pre-wrap;
308
+ background: #f5f7fa;
309
+ border-radius: 4px;
310
+ }
311
+ :deep(.compact-descriptions .el-descriptions__label) {
312
+ font-weight: 600;
313
+ }
314
+ :deep(.compact-descriptions .el-descriptions__content) {
315
+ vertical-align: top;
316
+ }
317
+ </style>