@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,275 @@
1
+ <template>
2
+ <div v-loading="loading" class="app-container code-gen-sub-page">
3
+ <div class="api-doc-page__layout">
4
+ <el-card class="code-gen-sub-card api-doc-page__navigation" shadow="never">
5
+ <template #header>
6
+ <div class="api-doc-page__panel-title">文档服务</div>
7
+ </template>
8
+ <div v-if="documents.length" class="api-doc-page__document-list">
9
+ <button
10
+ v-for="document in documents"
11
+ :key="document.key"
12
+ type="button"
13
+ class="api-doc-page__document"
14
+ :class="{ 'is-active': selectedDocumentKey === document.key }"
15
+ @click="handleDocumentChange(document.key)"
16
+ >
17
+ <span class="api-doc-page__document-name">{{ document.name }}</span>
18
+ <span class="api-doc-page__document-key">{{ document.key }}</span>
19
+ </button>
20
+ </div>
21
+ <el-empty v-else :image-size="56" description="暂无文档" />
22
+ </el-card>
23
+ <el-card class="code-gen-sub-card api-doc-page__card" shadow="never">
24
+ <template #header>
25
+ <div class="api-doc-page__panel-title">{{ selectedDocumentName }}</div>
26
+ </template>
27
+ <div ref="swaggerRootRef" class="api-doc-page__swagger" />
28
+ </el-card>
29
+ </div>
30
+ </div>
31
+ </template>
32
+
33
+ <script setup lang="ts">
34
+ import SwaggerUIBundle from "swagger-ui-dist/swagger-ui-bundle.js";
35
+ import "swagger-ui-dist/swagger-ui.css";
36
+ import { getRequestAccessToken } from "@liujitcn/kratos-admin-core/request";
37
+ import { defBaseApiService } from "@liujitcn/kratos-admin-system/api/system/base_api";
38
+ import type { OpenApiServiceOption } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_api";
39
+
40
+ const swaggerRootRef = ref<HTMLElement>();
41
+ const loading = ref(true);
42
+ const documents = ref<OpenApiServiceOption[]>([]);
43
+ const selectedDocumentKey = ref("");
44
+ const selectedDocumentName = computed(
45
+ () => documents.value.find(document => document.key === selectedDocumentKey.value)?.name ?? "API 文档"
46
+ );
47
+
48
+ /** 初始化携带当前登录令牌的 Swagger UI。 */
49
+ function initializeSwaggerUI(documentKey: string) {
50
+ const swaggerRoot = swaggerRootRef.value;
51
+ if (!swaggerRoot) return;
52
+
53
+ loading.value = true;
54
+ swaggerRoot.replaceChildren();
55
+ SwaggerUIBundle({
56
+ domNode: swaggerRoot,
57
+ url: `/api/docs/openapi/${encodeURIComponent(documentKey)}`,
58
+ deepLinking: true,
59
+ displayOperationId: true,
60
+ displayRequestDuration: true,
61
+ docExpansion: "list",
62
+ defaultModelsExpandDepth: -1,
63
+ filter: true,
64
+ onComplete: () => {
65
+ loading.value = false;
66
+ },
67
+ persistAuthorization: false,
68
+ tryItOutEnabled: true,
69
+ validatorUrl: null,
70
+ requestInterceptor: async request => {
71
+ const accessToken = await getRequestAccessToken();
72
+ if (accessToken) {
73
+ request.headers = {
74
+ ...request.headers,
75
+ Authorization: accessToken
76
+ };
77
+ }
78
+ return request;
79
+ }
80
+ });
81
+ }
82
+
83
+ /** 切换当前展示的 OpenAPI 文档。 */
84
+ function handleDocumentChange(documentKey: string) {
85
+ if (documentKey === selectedDocumentKey.value) return;
86
+ selectedDocumentKey.value = documentKey;
87
+ initializeSwaggerUI(documentKey);
88
+ }
89
+
90
+ /** 加载可访问的 OpenAPI 文档并初始化默认文档。 */
91
+ async function loadOpenAPIDocuments() {
92
+ try {
93
+ const response = await defBaseApiService.OptionOpenApiService({});
94
+ documents.value = response.list;
95
+ const defaultDocument = response.list[0];
96
+ if (!defaultDocument) {
97
+ loading.value = false;
98
+ return;
99
+ }
100
+ selectedDocumentKey.value = defaultDocument.key;
101
+ initializeSwaggerUI(defaultDocument.key);
102
+ } catch {
103
+ loading.value = false;
104
+ }
105
+ }
106
+
107
+ onMounted(() => {
108
+ loadOpenAPIDocuments();
109
+ });
110
+
111
+ onBeforeUnmount(() => {
112
+ swaggerRootRef.value?.replaceChildren();
113
+ });
114
+ </script>
115
+
116
+ <style scoped lang="scss">
117
+ .code-gen-sub-page {
118
+ box-sizing: border-box;
119
+ display: flex;
120
+ width: 100%;
121
+ height: 100%;
122
+ min-height: 0;
123
+ }
124
+ .code-gen-sub-card {
125
+ background: var(--admin-page-card-bg);
126
+ border: 1px solid var(--admin-page-card-border);
127
+ border-radius: var(--admin-page-radius);
128
+ box-shadow: var(--admin-page-shadow);
129
+ }
130
+ .api-doc-page__layout {
131
+ display: grid;
132
+ flex: 1;
133
+ grid-template-columns: 240px minmax(0, 1fr);
134
+ gap: 12px;
135
+ min-height: 0;
136
+ overflow: hidden;
137
+ }
138
+ .api-doc-page__navigation,
139
+ .api-doc-page__card {
140
+ display: flex;
141
+ flex-direction: column;
142
+ min-width: 0;
143
+ min-height: 0;
144
+ }
145
+ .api-doc-page__panel-title {
146
+ overflow: hidden;
147
+ text-overflow: ellipsis;
148
+ font-size: 14px;
149
+ font-weight: 600;
150
+ color: var(--admin-page-text-primary);
151
+ white-space: nowrap;
152
+ }
153
+ .api-doc-page__document-list {
154
+ display: flex;
155
+ flex-direction: column;
156
+ gap: 4px;
157
+ }
158
+ .api-doc-page__document {
159
+ display: flex;
160
+ flex-direction: column;
161
+ gap: 3px;
162
+ width: 100%;
163
+ min-width: 0;
164
+ padding: 10px 12px;
165
+ font: inherit;
166
+ color: var(--admin-page-text-primary);
167
+ text-align: left;
168
+ cursor: pointer;
169
+ background: transparent;
170
+ border: 0;
171
+ border-radius: 4px;
172
+ transition: background-color 0.2s ease;
173
+ }
174
+ .api-doc-page__document:hover {
175
+ background: var(--el-fill-color-light);
176
+ }
177
+ .api-doc-page__document.is-active {
178
+ color: var(--admin-page-accent-soft-text);
179
+ background: var(--admin-page-accent-soft-bg);
180
+ box-shadow: inset 3px 0 0 var(--el-color-primary);
181
+ }
182
+ .api-doc-page__document-name,
183
+ .api-doc-page__document-key {
184
+ overflow: hidden;
185
+ text-overflow: ellipsis;
186
+ white-space: nowrap;
187
+ }
188
+ .api-doc-page__document-name {
189
+ font-size: 14px;
190
+ font-weight: 500;
191
+ }
192
+ .api-doc-page__document-key {
193
+ font-size: 12px;
194
+ color: var(--admin-page-text-secondary);
195
+ }
196
+ .api-doc-page__swagger {
197
+ height: 100%;
198
+ min-height: 0;
199
+ overflow: auto;
200
+ }
201
+ :deep(.api-doc-page__navigation .el-card__body),
202
+ :deep(.api-doc-page__card .el-card__body) {
203
+ flex: 1;
204
+ min-height: 0;
205
+ }
206
+ :deep(.api-doc-page__navigation .el-card__body) {
207
+ padding: 8px;
208
+ overflow-y: auto;
209
+ }
210
+ :deep(.api-doc-page__card .el-card__body) {
211
+ height: 100%;
212
+ padding: 0;
213
+ }
214
+ :deep(.api-doc-page__navigation .el-empty) {
215
+ padding: 32px 0;
216
+ }
217
+ :deep(.swagger-ui) {
218
+ color: var(--el-text-color-primary);
219
+ }
220
+ :deep(.swagger-ui .information-container) {
221
+ display: none;
222
+ }
223
+ :deep(.swagger-ui .info .title),
224
+ :deep(.swagger-ui .info p),
225
+ :deep(.swagger-ui .opblock-tag),
226
+ :deep(.swagger-ui .opblock .opblock-summary-description),
227
+ :deep(.swagger-ui .opblock .opblock-summary-path),
228
+ :deep(.swagger-ui .parameter__name),
229
+ :deep(.swagger-ui .parameter__type),
230
+ :deep(.swagger-ui table thead tr td),
231
+ :deep(.swagger-ui table thead tr th) {
232
+ color: var(--el-text-color-primary);
233
+ }
234
+ :deep(.swagger-ui .scheme-container),
235
+ :deep(.swagger-ui .opblock .opblock-section-header),
236
+ :deep(.swagger-ui .opblock-body pre),
237
+ :deep(.swagger-ui .model-box),
238
+ :deep(.swagger-ui .dialog-ux .modal-ux) {
239
+ background: var(--el-fill-color-light);
240
+ box-shadow: none;
241
+ }
242
+ :deep(.swagger-ui .opblock),
243
+ :deep(.swagger-ui .opblock-tag),
244
+ :deep(.swagger-ui .model-box),
245
+ :deep(.swagger-ui .dialog-ux .modal-ux),
246
+ :deep(.swagger-ui .dialog-ux .modal-ux-content) {
247
+ border-color: var(--el-border-color-light);
248
+ }
249
+ :deep(.swagger-ui input[type="text"]),
250
+ :deep(.swagger-ui textarea),
251
+ :deep(.swagger-ui select) {
252
+ color: var(--el-text-color-primary);
253
+ background: var(--el-bg-color);
254
+ border-color: var(--el-border-color);
255
+ }
256
+
257
+ @media (width <= 720px) {
258
+ .code-gen-sub-page {
259
+ height: auto;
260
+ min-height: 100%;
261
+ }
262
+ .api-doc-page__layout {
263
+ display: flex;
264
+ flex-direction: column;
265
+ overflow: visible;
266
+ }
267
+ .api-doc-page__navigation {
268
+ flex: 0 0 auto;
269
+ max-height: 240px;
270
+ }
271
+ .api-doc-page__card {
272
+ min-height: 600px;
273
+ }
274
+ }
275
+ </style>
@@ -0,0 +1,233 @@
1
+ <!-- 代码生成文件预览 -->
2
+ <template>
3
+ <div class="app-container code-gen-code-preview-page">
4
+ <el-card class="code-gen-sub-card" shadow="never">
5
+ <div v-if="BUTTONS['tool:code-gen-table:generate']" class="code-gen-toolbar">
6
+ <div class="code-gen-code-preview-actions">
7
+ <el-button :icon="Clock" :disabled="!progressTaskAvailable" @click="handleOpenProgress">最近任务</el-button>
8
+ <el-button :icon="Promotion" type="primary" :loading="generating" @click="handleGenerate">生成</el-button>
9
+ </div>
10
+ </div>
11
+
12
+ <el-alert v-if="previewError" class="code-gen-code-preview-alert" :title="previewError" type="warning" :closable="false" />
13
+ <CodePreviewPane v-if="loading || files.length" class="code-gen-code-preview-table" :files="files" :loading="loading" />
14
+ <el-empty v-else class="code-gen-code-preview-empty" description="暂无生成文件,请先确认表配置和 Proto 接口配置后再生成或预览" />
15
+ </el-card>
16
+
17
+ <CodeGenProgressDialog
18
+ v-model="progressDialogVisible"
19
+ :task-id="progressTaskId"
20
+ @update:model-value="handleProgressDialogVisibleChange"
21
+ @completed="handleProgressCompleted"
22
+ @unavailable="handleProgressUnavailable"
23
+ />
24
+ </div>
25
+ </template>
26
+
27
+ <script setup lang="ts">
28
+ import { computed, ref, watch } from "vue";
29
+ import { Clock, Promotion } from "@element-plus/icons-vue";
30
+ import { useRoute } from "vue-router";
31
+ import { useAuthButtons } from "@liujitcn/kratos-admin-core/auth";
32
+ import { useTabsStore } from "@liujitcn/kratos-admin-core/stores/runtime";
33
+ import { defCodeGenService } from "@liujitcn/kratos-admin-system/api/system/code_gen";
34
+ import { defCodeGenTableService } from "@liujitcn/kratos-admin-system/api/system/code_gen_table";
35
+ import type { CodeGenPreviewFile } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/code_gen";
36
+ import type { CodeGenTableForm } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/code_gen_table";
37
+ import { CodeGenTableStatus } from "@liujitcn/kratos-admin-system/rpc/system/common/v1/enum";
38
+ import CodeGenProgressDialog from "../components/CodeGenProgressDialog.vue";
39
+ import CodePreviewPane from "../components/CodePreviewPane.vue";
40
+
41
+ defineOptions({
42
+ name: "CodeGenCodePreview",
43
+ inheritAttrs: false
44
+ });
45
+
46
+ const codeGenTaskStorageKey = "code-gen-progress-task-id";
47
+ const codeGenProgressDialogVisibleStorageKey = "code-gen-progress-dialog-visible";
48
+ const codeGenProgressSelectedTableIdsStorageKey = "code-gen-progress-selected-table-ids";
49
+ const codeGenStatusDisabled = CodeGenTableStatus.DISABLED_CGTS;
50
+
51
+ const route = useRoute();
52
+ const tabsStore = useTabsStore();
53
+ const { BUTTONS } = useAuthButtons();
54
+ const table = ref<CodeGenTableForm>();
55
+ const files = ref<CodeGenPreviewFile[]>([]);
56
+ const loading = ref(false);
57
+ const previewError = ref("");
58
+ const progressTaskId = ref(typeof window === "undefined" ? "" : (window.sessionStorage.getItem(codeGenTaskStorageKey) ?? ""));
59
+ const progressDialogVisible = ref(
60
+ !!progressTaskId.value &&
61
+ typeof window !== "undefined" &&
62
+ window.sessionStorage.getItem(codeGenProgressDialogVisibleStorageKey) === "true"
63
+ );
64
+ const progressTaskAvailable = ref(!!progressTaskId.value);
65
+ const generating = ref(!!progressTaskId.value);
66
+
67
+ /** 当前代码生成表配置 ID。 */
68
+ const tableId = computed(() => {
69
+ const value = route.params.tableId;
70
+ const id = Number(Array.isArray(value) ? value[0] : value);
71
+ return Number.isFinite(id) && id > 0 ? id : 0;
72
+ });
73
+
74
+ /** 当前代码预览页标题。 */
75
+ const pageTitle = computed(() => table.value?.comment || table.value?.name || "代码预览");
76
+
77
+ // 路由生成对象变化时重新载入对应代码预览。
78
+ watch(
79
+ tableId,
80
+ () => {
81
+ void loadCodePreview();
82
+ },
83
+ { immediate: true }
84
+ );
85
+
86
+ /** 加载当前表配置与固定项目路径下的代码预览。 */
87
+ async function loadCodePreview() {
88
+ table.value = undefined;
89
+ files.value = [];
90
+ previewError.value = "";
91
+ if (!tableId.value) return;
92
+ loading.value = true;
93
+ try {
94
+ const currentTable = await defCodeGenTableService.GetCodeGenTable({ id: tableId.value });
95
+ table.value = currentTable;
96
+ try {
97
+ const preview = await defCodeGenService.PreviewCodeGen({ table_id: tableId.value, output_paths: undefined });
98
+ files.value = preview.files ?? [];
99
+ if (!files.value.length) previewError.value = "当前没有可预览的生成文件,请先检查是否已配置生成字段、接口和输出路径。";
100
+ } catch {
101
+ // 预览错误在页面内转成可操作提示,避免全局错误弹窗只显示“系统出错”。
102
+ previewError.value = "代码预览加载失败,请先检查表配置、字段配置、Proto 接口配置和父级菜单是否完整。";
103
+ }
104
+ syncWorkspaceTitle();
105
+ } finally {
106
+ loading.value = false;
107
+ }
108
+ }
109
+
110
+ /** 同步代码预览页签和浏览器标题。 */
111
+ function syncWorkspaceTitle() {
112
+ const title = `${pageTitle.value}代码预览`;
113
+ tabsStore.setTabsTitle(title);
114
+ document.title = `${title} - ${import.meta.env.VITE_GLOB_APP_TITLE}`;
115
+ }
116
+
117
+ /** 启动当前生成对象的代码生成任务。 */
118
+ async function handleGenerate() {
119
+ if (!table.value) return;
120
+ if (table.value.status === codeGenStatusDisabled) {
121
+ ElMessage.warning(`代码生成表配置 ${table.value.name} 已停用`);
122
+ return;
123
+ }
124
+ try {
125
+ await ElMessageBox.confirm(`确认生成业务表:${table.value.name}?`, "提示", {
126
+ confirmButtonText: "确认",
127
+ cancelButtonText: "取消",
128
+ type: "warning"
129
+ });
130
+ } catch {
131
+ return;
132
+ }
133
+ generating.value = true;
134
+ try {
135
+ const data = await defCodeGenService.StartCodeGenTask({
136
+ table_ids: [table.value.id]
137
+ });
138
+ progressTaskId.value = data.task_id;
139
+ progressTaskAvailable.value = true;
140
+ window.sessionStorage.setItem(codeGenTaskStorageKey, data.task_id);
141
+ window.sessionStorage.removeItem(codeGenProgressSelectedTableIdsStorageKey);
142
+ handleProgressDialogVisibleChange(true);
143
+ } catch (error) {
144
+ generating.value = false;
145
+ throw error;
146
+ }
147
+ }
148
+
149
+ /** 打开最近一次代码生成任务。 */
150
+ function handleOpenProgress() {
151
+ if (progressTaskId.value) handleProgressDialogVisibleChange(true);
152
+ }
153
+
154
+ /** 同步进度弹窗可见状态,确保热更新后仅恢复任务运行期间主动打开的弹窗。 */
155
+ function handleProgressDialogVisibleChange(visible: boolean) {
156
+ progressDialogVisible.value = visible;
157
+ if (visible) {
158
+ window.sessionStorage.setItem(codeGenProgressDialogVisibleStorageKey, "true");
159
+ return;
160
+ }
161
+ window.sessionStorage.removeItem(codeGenProgressDialogVisibleStorageKey);
162
+ }
163
+
164
+ /** 生成任务结束后解除当前页面生成锁定。 */
165
+ function handleProgressCompleted() {
166
+ generating.value = false;
167
+ window.sessionStorage.removeItem(codeGenProgressDialogVisibleStorageKey);
168
+ window.sessionStorage.removeItem(codeGenProgressSelectedTableIdsStorageKey);
169
+ }
170
+
171
+ /** 清理不可恢复的最近任务。 */
172
+ function handleProgressUnavailable() {
173
+ generating.value = false;
174
+ progressTaskId.value = "";
175
+ progressTaskAvailable.value = false;
176
+ handleProgressDialogVisibleChange(false);
177
+ window.sessionStorage.removeItem(codeGenProgressSelectedTableIdsStorageKey);
178
+ window.sessionStorage.removeItem(codeGenTaskStorageKey);
179
+ }
180
+
181
+ </script>
182
+
183
+ <style scoped lang="scss">
184
+ .code-gen-code-preview-page {
185
+ display: flex;
186
+ flex-direction: column;
187
+ width: 100%;
188
+ min-width: 0;
189
+ height: 100%;
190
+ min-height: 0;
191
+ overflow: hidden;
192
+ }
193
+ .code-gen-sub-card {
194
+ display: flex;
195
+ flex: 1;
196
+ flex-direction: column;
197
+ min-height: 0;
198
+ background: var(--admin-page-card-bg);
199
+ border: 1px solid var(--admin-page-card-border);
200
+ border-radius: var(--admin-page-radius);
201
+ box-shadow: var(--admin-page-shadow);
202
+ }
203
+ :deep(.code-gen-sub-card .el-card__body) {
204
+ display: flex;
205
+ flex: 1;
206
+ flex-direction: column;
207
+ min-height: 0;
208
+ }
209
+ :deep(.code-gen-toolbar) {
210
+ display: flex;
211
+ flex: none;
212
+ gap: 10px;
213
+ align-items: center;
214
+ justify-content: flex-end;
215
+ margin-bottom: 14px;
216
+ }
217
+ .code-gen-code-preview-table,
218
+ .code-gen-code-preview-empty {
219
+ flex: 1;
220
+ min-height: 0;
221
+ }
222
+ .code-gen-code-preview-alert {
223
+ flex: none;
224
+ margin-bottom: 12px;
225
+ }
226
+
227
+ @media (width <= 640px) {
228
+ .code-gen-code-preview-actions {
229
+ display: flex;
230
+ justify-content: flex-end;
231
+ }
232
+ }
233
+ </style>