diff --git a/apps/web-antd/src/views/code-generation/api/index.ts b/apps/web-antd/src/views/code-generation/api/index.ts index 3f3c7e7c..f4470fe9 100644 --- a/apps/web-antd/src/views/code-generation/api/index.ts +++ b/apps/web-antd/src/views/code-generation/api/index.ts @@ -39,6 +39,14 @@ export async function generationApi(data: Record) { return requestClient.post(`${prefix}generation`, data); } +/** + * 批量代码生成 + * @param data 数组格式的代码生成数据 + */ +export async function batchGenerationApi(data: Record[]) { + return requestClient.post(`${prefix}batch-generation`, data); +} + /** * 下载压缩包信息 */ @@ -52,3 +60,26 @@ export async function downloadInfoApi(id: any) { export async function codeGenerationDownloadApi(id: any) { return requestClient.download(`${prefix}download?id=${id}`); } + +/** + * 获取数据库表列表 + */ +export async function getTablesApi() { + return requestClient.get(`${prefix}get-tables`); +} + +/** + * 获取表结构 + * @param tableName 表名 + */ +export async function getTableStructureApi(tableName: string) { + return requestClient.get(`${prefix}get-table-structure`, { params: { table_name: tableName } }); +} + +/** + * 从数据库表生成代码生成数据 + * @param data 包含表名和其他配置的数据 + */ +export async function generateFromTableApi(data: Record) { + return requestClient.post(`${prefix}generate-from-table`, data); +} diff --git a/apps/web-antd/src/views/code-generation/components/database-select.vue b/apps/web-antd/src/views/code-generation/components/database-select.vue new file mode 100644 index 00000000..8c70f143 --- /dev/null +++ b/apps/web-antd/src/views/code-generation/components/database-select.vue @@ -0,0 +1,422 @@ + + + + + diff --git a/apps/web-antd/src/views/code-generation/components/json-import.vue b/apps/web-antd/src/views/code-generation/components/json-import.vue index 42536e0e..5cf8e037 100644 --- a/apps/web-antd/src/views/code-generation/components/json-import.vue +++ b/apps/web-antd/src/views/code-generation/components/json-import.vue @@ -3,7 +3,7 @@ import type { UploadChangeParam, UploadFile } from 'ant-design-vue'; import { computed, onMounted, ref, watch } from 'vue'; -import { Button, Card, Input, message, Select, Tabs, Upload } from 'ant-design-vue'; +import { Button, Card, Checkbox, Input, message, Select, Tabs, Upload } from 'ant-design-vue'; import { JsonViewer } from '@vben/common-ui'; @@ -23,7 +23,7 @@ import { const mode: GenerationMode = 'json'; const emit = defineEmits<{ - generate: [data: CodeGenData]; + generate: [data: CodeGenData | CodeGenData[]]; back: []; }>(); @@ -34,7 +34,9 @@ const formData = ref>({}); // JSON输入 const jsonText = ref(''); const jsonError = ref(''); -const parsedData = ref(null); +const parsedData = ref(null); +const isBatchMode = ref(false); // 是否为批量模式 +const selectedModules = ref([]); // 批量模式下选中的模块索引 const activeTab = ref('text'); // 文件上传相关 @@ -49,6 +51,9 @@ const selectedDraft = ref(''); // 预览数据 const previewData = computed(() => { if (parsedData.value) { + if (Array.isArray(parsedData.value)) { + return parsedData.value; + } return { ...parsedData.value, field: parsedData.value.field || [], @@ -57,6 +62,19 @@ const previewData = computed(() => { return null; }); +// 批量模式下的模块列表 +const batchModules = computed(() => { + if (Array.isArray(parsedData.value)) { + return parsedData.value.map((item, index) => ({ + index, + class_name: item.class_name, + class_comment: item.class_comment, + fieldCount: item.field?.length || 0, + })); + } + return []; +}); + // 加载草稿列表 const loadDraftList = () => { drafts.value = listDrafts(mode); @@ -96,26 +114,42 @@ const parseJson = () => { jsonError.value = ''; if (!jsonText.value.trim()) { parsedData.value = null; + isBatchMode.value = false; + selectedModules.value = []; return; } try { const json = JSON.parse(jsonText.value); const transformed = transformJsonToStandard(json); - parsedData.value = transformed; - - // 更新表单数据 - formData.value = { - class_name: transformed.class_name, - class_comment: transformed.class_comment, - icon: transformed.icon, - sort: transformed.sort, - pid: transformed.pid, - }; - formApi.setValues(formData.value); + + // 判断是否为数组(批量模式) + if (Array.isArray(transformed)) { + isBatchMode.value = true; + parsedData.value = transformed; + // 默认全选 + selectedModules.value = transformed.map((_, index) => index); + formApi.resetFields(); + } else { + isBatchMode.value = false; + parsedData.value = transformed; + selectedModules.value = []; + + // 更新表单数据(单个模式) + formData.value = { + class_name: transformed.class_name, + class_comment: transformed.class_comment, + icon: transformed.icon, + sort: transformed.sort, + pid: transformed.pid, + }; + formApi.setValues(formData.value); + } } catch (error: any) { jsonError.value = error.message || 'JSON格式错误'; parsedData.value = null; + isBatchMode.value = false; + selectedModules.value = []; } }; @@ -223,6 +257,8 @@ const formatJson = () => { const clearJson = () => { jsonText.value = ''; parsedData.value = null; + isBatchMode.value = false; + selectedModules.value = []; formData.value = {}; formApi.resetFields(); draftId.value = null; @@ -238,25 +274,49 @@ const handleGenerate = async () => { return; } - // 验证数据 - const validation = validateData(parsedData.value); - if (!validation.valid) { - message.error(validation.message); + // 批量模式 + if (isBatchMode.value && Array.isArray(parsedData.value)) { + if (selectedModules.value.length === 0) { + message.warning('请至少选择一个模块进行生成'); + return; + } + + // 验证选中的模块 + const selectedData = selectedModules.value.map(index => parsedData.value![index]); + for (const item of selectedData) { + const validation = validateData(item); + if (!validation.valid) { + message.error(`模块 "${item.class_comment || item.class_name}" 验证失败:${validation.message}`); + return; + } + } + + emit('generate', selectedData); return; } - // 合并表单数据(用户可能修改了基础信息) - const formValues = await formApi.getValues(); - const finalData: CodeGenData = { - ...parsedData.value, - class_name: formValues.class_name || parsedData.value.class_name, - class_comment: formValues.class_comment || parsedData.value.class_comment, - icon: formValues.icon || parsedData.value.icon, - sort: formValues.sort ?? parsedData.value.sort, - pid: formValues.pid ?? parsedData.value.pid, - }; + // 单个模式 + if (!isBatchMode.value && !Array.isArray(parsedData.value)) { + // 验证数据 + const validation = validateData(parsedData.value); + if (!validation.valid) { + message.error(validation.message); + return; + } - emit('generate', finalData); + // 合并表单数据(用户可能修改了基础信息) + const formValues = await formApi.getValues(); + const finalData: CodeGenData = { + ...parsedData.value, + class_name: formValues.class_name || parsedData.value.class_name, + class_comment: formValues.class_comment || parsedData.value.class_comment, + icon: formValues.icon || parsedData.value.icon, + sort: formValues.sort ?? parsedData.value.sort, + pid: formValues.pid ?? parsedData.value.pid, + }; + + emit('generate', finalData); + } }; // 删除草稿 @@ -387,7 +447,68 @@ onMounted(() => { -
+ +
+ +
+
+ 共 {{ batchModules.length }} 个模块,已选择 {{ selectedModules.length }} 个 +
+
+ + +
+
+
+
+
+ +
+
+ {{ module.class_comment || module.class_name || `模块 ${module.index + 1}` }} +
+
+ 类名: {{ module.class_name }} | 字段数: {{ module.fieldCount }} +
+
+
+
+
+
+ +
+ +
+
+
+ + +
@@ -403,7 +524,7 @@ onMounted(() => {
- 共 {{ parsedData.field?.length || 0 }} 个字段 + 共 {{ (parsedData as CodeGenData).field?.length || 0 }} 个字段
@@ -436,12 +557,30 @@ onMounted(() => { " > - 已解析 {{ parsedData.field?.length || 0 }} 个字段 + + 请先导入JSON数据
- {{ parsedData ? '数据已就绪,可以生成代码' : '等待数据导入...' }} + +
@@ -467,10 +606,11 @@ onMounted(() => { type="primary" size="large" class="action-btn-primary" - :disabled="!parsedData" + :disabled="!parsedData || (isBatchMode && selectedModules.length === 0)" @click="handleGenerate" > - 生成代码 + + {{ isBatchMode ? `批量生成 (${selectedModules.length})` : '生成代码' }} diff --git a/apps/web-antd/src/views/code-generation/components/mode-selector.vue b/apps/web-antd/src/views/code-generation/components/mode-selector.vue index e8fed9da..4f62f8e8 100644 --- a/apps/web-antd/src/views/code-generation/components/mode-selector.vue +++ b/apps/web-antd/src/views/code-generation/components/mode-selector.vue @@ -1,5 +1,5 @@ + + diff --git a/apps/web-antd/src/views/system/database/components/AddIndexModal.vue b/apps/web-antd/src/views/system/database/components/AddIndexModal.vue new file mode 100644 index 00000000..0b15fd54 --- /dev/null +++ b/apps/web-antd/src/views/system/database/components/AddIndexModal.vue @@ -0,0 +1,142 @@ + + + diff --git a/apps/web-antd/src/views/system/database/components/ChangeLog.vue b/apps/web-antd/src/views/system/database/components/ChangeLog.vue new file mode 100644 index 00000000..3b18bd19 --- /dev/null +++ b/apps/web-antd/src/views/system/database/components/ChangeLog.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/apps/web-antd/src/views/system/database/components/DataSearch.vue b/apps/web-antd/src/views/system/database/components/DataSearch.vue new file mode 100644 index 00000000..68a1ef96 --- /dev/null +++ b/apps/web-antd/src/views/system/database/components/DataSearch.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/apps/web-antd/src/views/system/database/components/EditColumnCommentModal.vue b/apps/web-antd/src/views/system/database/components/EditColumnCommentModal.vue new file mode 100644 index 00000000..e61c3909 --- /dev/null +++ b/apps/web-antd/src/views/system/database/components/EditColumnCommentModal.vue @@ -0,0 +1,105 @@ + + + diff --git a/apps/web-antd/src/views/system/database/components/EditColumnModal.vue b/apps/web-antd/src/views/system/database/components/EditColumnModal.vue new file mode 100644 index 00000000..47005d1d --- /dev/null +++ b/apps/web-antd/src/views/system/database/components/EditColumnModal.vue @@ -0,0 +1,263 @@ + + + diff --git a/apps/web-antd/src/views/system/database/components/EditDataModal.vue b/apps/web-antd/src/views/system/database/components/EditDataModal.vue new file mode 100644 index 00000000..ad41d521 --- /dev/null +++ b/apps/web-antd/src/views/system/database/components/EditDataModal.vue @@ -0,0 +1,133 @@ + + + diff --git a/apps/web-antd/src/views/system/database/components/EditTableCommentModal.vue b/apps/web-antd/src/views/system/database/components/EditTableCommentModal.vue new file mode 100644 index 00000000..94c050f6 --- /dev/null +++ b/apps/web-antd/src/views/system/database/components/EditTableCommentModal.vue @@ -0,0 +1,90 @@ + + + diff --git a/apps/web-antd/src/views/system/database/components/SqlQuery.vue b/apps/web-antd/src/views/system/database/components/SqlQuery.vue new file mode 100644 index 00000000..1519357d --- /dev/null +++ b/apps/web-antd/src/views/system/database/components/SqlQuery.vue @@ -0,0 +1,273 @@ + + +