From 618bf4285a26ebe432168068d9b4f91445a76b0d Mon Sep 17 00:00:00 2001
From: Kunagisa <1549184870@qq.com>
Date: Tue, 10 Jun 2025 20:13:04 +0800
Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/backend/CodeGenerator.vue | 320 ++++++++++++++---------
1 file changed, 202 insertions(+), 118 deletions(-)
diff --git a/src/components/backend/CodeGenerator.vue b/src/components/backend/CodeGenerator.vue
index a0872cf..022c92c 100644
--- a/src/components/backend/CodeGenerator.vue
+++ b/src/components/backend/CodeGenerator.vue
@@ -25,6 +25,13 @@
>
下载 .vue 文件
+
@@ -106,6 +113,8 @@ import { ref } from 'vue';
const sqlInput = ref('');
const generatedCode = ref('');
const generatedFileName = ref('');
+const generatedApiCode = ref('');
+const generatedApiFileName = ref('');
const parsedTableInfo = ref(null);
/**
@@ -196,6 +205,64 @@ const parseSql = (sql) => {
}
};
+/**
+ * 根据表结构生成 API 文件代码
+ * @param {object} tableInfo - 解析后的表结构
+ * @returns {string} API 文件代码字符串
+ */
+const generateApiFile = (tableInfo) => {
+ const componentName = toPascalCase(tableInfo.tableName);
+ const resourceName = tableInfo.tableName;
+ const primaryKey = tableInfo.primaryKey || 'id';
+
+ return `
+import axiosInstance from './axiosConfig';
+
+const API_BASE_URL = '/api/${resourceName}';
+
+/**
+ * 获取${tableInfo.tableComment || componentName}列表
+ * @param {object} params - 查询参数
+ */
+export const get${componentName}List = (params) => {
+ return axiosInstance.get(API_BASE_URL, { params });
+};
+
+/**
+ * 获取单个${tableInfo.tableComment || componentName}详情
+ * @param {number|string} id - 主键ID
+ */
+export const get${componentName}ById = (id) => {
+ return axiosInstance.get(\`\${API_BASE_URL}/\${id}\`);
+};
+
+/**
+ * 创建新的${tableInfo.tableComment || componentName}
+ * @param {object} data - ${tableInfo.tableComment || componentName}数据
+ */
+export const create${componentName} = (data) => {
+ return axiosInstance.post(API_BASE_URL, data);
+};
+
+/**
+ * 更新${tableInfo.tableComment || componentName}
+ * @param {number|string} id - 主键ID
+ * @param {object} data - 需要更新的数据
+ */
+export const update${componentName} = (id, data) => {
+ return axiosInstance.put(\`\${API_BASE_URL}/\${id}\`, data);
+};
+
+/**
+ * 删除${tableInfo.tableComment || componentName}
+ * @param {number|string} id - 主键ID
+ */
+export const delete${componentName} = (id) => {
+ return axiosInstance.delete(\`\${API_BASE_URL}/\${id}\`);
+};
+`;
+};
+
/**
* 根据表结构生成 Vue 组件代码
* @param {object} tableInfo - 解析后的表结构
@@ -211,115 +278,17 @@ const generateVueComponent = (tableInfo) => {
.map(c => `
-
+
`).join('');
const dataFields = tableInfo.columns.map(c => ` ${c.name}: '',`).join('\n');
- const scriptContent = `
-import { ref, onMounted } from 'vue';
-
-// 假设的API函数,需要您自己在/api/index.js或类似文件中创建
-// import { get${componentName}List, create${componentName}, update${componentName}, delete${componentName} } from '@/api';
-
-const items = ref([]);
-const loading = ref(false);
-const showModal = ref(false);
-const isEditing = ref(false);
-const editableItem = ref({
-${dataFields}
-});
-const editError = ref('');
-
-onMounted(() => {
- fetchItems();
-});
-
-const API_URL = '/api/${tableInfo.tableName}'; // 模拟API路径
-
-const fetchItems = async () => {
- loading.value = true;
- try {
- // const response = await get${componentName}List();
- // items.value = response.data;
-
- // --- 示例数据 ---
- items.value = [
- { ${tableInfo.columns.map((c, i) => `${c.name}: "示例值 ${i + 1}"`).join(', ')} },
- { ${tableInfo.columns.map((c, i) => `${c.name}: "示例值 ${i + 2}"`).join(', ')} }
- ];
- // --- 示例数据结束 ---
-
- } catch (error) {
- console.error('获取列表失败:', error);
- items.value = [];
- } finally {
- loading.value = false;
- }
-};
-
-const openModal = (item = null) => {
- if (item) {
- isEditing.value = true;
- editableItem.value = { ...item };
- } else {
- isEditing.value = false;
- editableItem.value = {
-${dataFields}
- };
- }
- editError.value = '';
- showModal.value = true;
-};
-
-const closeModal = () => {
- showModal.value = false;
-};
-
-const saveItem = async () => {
- editError.value = '';
- try {
- if (isEditing.value) {
- // await update${componentName}(editableItem.value.${tableInfo.primaryKey}, editableItem.value);
- console.log('更新项目:', editableItem.value);
- } else {
- // await create${componentName}(editableItem.value);
- console.log('创建项目:', editableItem.value);
+ const tableColumns = tableInfo.columns.map(c => {
+ if (c.type.toLowerCase().includes('datetime') || c.type.toLowerCase().includes('timestamp')) {
+ return `
{{ formatDate(item.${c.name}) }} | `;
}
- closeModal();
- fetchItems();
- alert('操作成功!');
- } catch (error) {
- console.error('保存失败:', error);
- editError.value = error.message || '操作失败,请重试。';
- }
-};
-
-const confirmDeleteItem = async (id) => {
- if (window.confirm('确定要删除此项吗?')) {
- try {
- // await delete${componentName}(id);
- console.log('删除项目, id:', id);
- fetchItems();
- alert('删除成功!');
- } catch (error) {
- console.error('删除失败:', error);
- alert('删除失败: ' + (error.message || '请稍后重试'));
- }
- }
-};
-
-// 辅助函数
-const formatDate = (dateString) => {
- if (!dateString) return 'N/A';
- try {
- const date = new Date(dateString);
- return isNaN(date.getTime()) ? dateString : date.toLocaleString();
- } catch (e) {
- return dateString;
- }
-};
-`;
+ return `
{{ item.${c.name} }} | `;
+ }).join('\n');
const styleContent = `
.generated-component-container {
@@ -489,11 +458,9 @@ const formatDate = (dateString) => {
.error-message {
color: #dc3545;
margin-top: 15px;
-}
-`;
+}`;
- return `
-
+ return `
${tableTitle}
@@ -519,7 +486,7 @@ ${tableInfo.columns.map(c => ` ${c.comment || c.name} | `).join
暂无数据 |
-${tableInfo.columns.map(c => ` {{ item.${c.name} }} | `).join('\n')}
+${tableColumns}
@@ -547,19 +514,117 @@ ${formFields}
@@ -681,6 +757,14 @@ textarea {
background-color: #0069d9;
}
+.download-api-button {
+ background-color: #28a745;
+}
+
+.download-api-button:hover {
+ background-color: #218838;
+}
+
.action-button:disabled {
background-color: #ccc;
cursor: not-allowed;
|