创建日期:2026-04-21 变更名称:ai-crud-generator-ui 设计状态:pending-approval
当前 /ai/crud-config 页面的 AI 生成功能仅通过简单弹窗实现:
打造类似豆包/Cursor 的专业 AI CRUD 配置生成器体验:
| 路由 | 页面 | 说明 |
|---|---|---|
/ai/crud-generator |
crud-generator.vue |
AI CRUD 配置生成器主页面 |
三栏布局结构:
┌─────────────────────────────────────────────────────────────────────┐
│ AI CRUD 配置生成器 [Provider] [Model] │
├──────────┬─────────────────────────────────┬──────────────────────────┤
│ 会话历史 │ 配置区 │ 文件树 │
│ (200px) │ ┌─────────────────────────────┐ │ (400px) │
│ │ │ configKey: [____________] │ │ │
│ ○ 会话1 │ │ tableName: [____________] │ │ □ search-schema.json │
│ ○ 会话2 │ │ [温度: 0.3] [MaxTokens:4k] │ │ □ columns-schema.json │
│ + 新会话 │ └─────────────────────────────┘ │ □ edit-schema.json │
│ │ 对话区 │ □ api-config.json │
│ │ ┌─────────────────────────────┐ │ │
│ │ │ [AI]: 正在分析表结构... │ │ ┌────────────────────────┐│
│ │ │ [AI]: 正在生成 searchSchema..│ │ │ 当前文件内容 ││
│ │ │ [用户]: 生成员工管理页面 │ │ │ (JSON + 可编辑) ││
│ │ │ │ │ │ ││
│ │ │ │ │ │ ││
│ │ │ │ │ └────────────────────────┘│
│ │ └─────────────────────────────┘ │ │
│ │ ┌─────────────────────────────┐ │ [查看Diff] [保存配置] │
│ │ │ [输入框________________] [发送]│ │ │
│ │ └─────────────────────────────┘ │ │
└──────────┴─────────────────────────────────┴──────────────────────────┘
crud-config.vue 工具栏的"AI 生成配置"按钮改为跳转到 /ai/crud-generator| 资源 | 复用方式 |
|---|---|
| 会话历史 | 复用 ai_chat_session/ai_chat_record 表 + /ai/admin/session 相关接口 |
| 流式输出 | 复用 /ai/client/stream SSE 接口 + AiClient |
| Provider/Model | 复用 modelListByProvider 接口 |
| CRUD 配置保存 | 复用 crudConfigAdd/crudConfigUpdate 接口 |
| 操作 | 接口 |
|---|---|
| 获取历史会话列表 | GET /ai/admin/session/page |
| 获取会话消息 | GET /ai/admin/session/{sessionId}/messages |
| 创建新会话 | POST /ai/admin/session/create(需确认是否存在,若无则新增) |
| 删除会话 | DELETE /ai/admin/session/{sessionId} |
| 配置项 | 类型 | 说明 |
|---|---|---|
| configKey | 输入框 | 必填,小写字母开头+数字+下划线,2-64字符 |
| tableName | 输入框 | 可选,用于表结构生成模式,输入后自动查询表字段 |
| Provider | 下拉 | 可选,指定 AI 供应商 |
| Model | 下拉 | 可选,指定模型 |
| 温度 | 滑块 | 0-1,默认 0.3 |
| MaxTokens | 输入 | 默认 4096 |
消息列表:
流式分阶段输出显示:
analyzing:"正在分析需求..."generating-search:"正在生成 searchSchema..."(实时输出 JSON)generating-columns:"正在生成 columnsSchema..."generating-edit:"正在生成 editSchema..."generating-api:"正在生成 apiConfig..."complete:"生成完成!"文件节点:
search-schema.json(搜索配置)columns-schema.json(表格列配置)edit-schema.json(编辑表单配置)api-config.json(API 配置)交互:
功能:
触发条件:configKey 对应的配置已存在时显示"查看 Diff"按钮
展示方式:
| 按钮 | 功能 |
|---|---|
| 保存配置 | 校验 configKey + JSON 格式,调用 crudConfigAdd 或 crudConfigUpdate |
| 复制 JSON | 复制当前文件内容到剪贴板 |
| 导出全部 | 导出完整配置为单 JSON 文件下载 |
| 接口 | 方法 | 说明 |
|---|---|---|
/ai/crud-config/ai/stream-generate |
POST SSE | 流式生成 CRUD 配置 |
{
"sessionId": "可选-关联会话ID",
"configKey": "employee_manage",
"tableName": "可选-表名",
"description": "员工管理页面,包含姓名、部门...",
"providerId": "可选-供应商ID",
"modelId": "可选-模型ID",
"temperature": 0.3,
"maxTokens": 4096
}
事件类型:
| event | 说明 |
|---|---|
progress |
进度阶段更新 |
chunk |
JSON 内容增量输出 |
complete |
生成完成,返回完整结果 |
error |
错误信息 |
事件示例:
event: progress
data: {"stage": "analyzing", "message": "正在分析需求..."}
event: progress
data: {"stage": "generating-search", "message": "正在生成 searchSchema..."}
event: chunk
data: {"file": "searchSchema", "content": "[{\"field\": \"name\", "}
event: chunk
data: {"file": "searchSchema", "content": "\"label\": \"姓名\"}"}
event: progress
data: {"stage": "generating-columns", "message": "正在生成 columnsSchema..."}
event: complete
data: {"configKey": "employee_manage", "tableName": "employee", "tableComment": "员工表", "searchSchema": "...", "columnsSchema": "...", "editSchema": "...", "apiConfig": "..."}
复用现有 crud_config_builder Agent,增强 System Prompt:
| 文件路径 | 说明 |
|---|---|
src/views/ai/crud-generator.vue |
主页面(三栏布局) |
src/views/ai/components/CrudGeneratorSidebar.vue |
左侧会话历史组件 |
src/views/ai/components/CrudGeneratorChat.vue |
中间对话+配置区组件 |
src/views/ai/components/CrudGeneratorPreview.vue |
右侧代码预览组件 |
src/views/ai/components/CrudGeneratorFileTree.vue |
文件树子组件 |
src/views/ai/components/CrudGeneratorDiff.vue |
Diff 对比弹窗组件 |
src/composables/useCrudGenerator.js |
生成器逻辑封装 |
src/api/crud-generator.js |
API 接口封装 |
状态:
const sessionId = ref(null)
const messages = ref([])
const configKey = ref('')
const tableName = ref('')
const providerId = ref(null)
const modelId = ref(null)
const temperature = ref(0.3)
const maxTokens = ref(4096)
const generating = ref(false)
const currentStage = ref('')
const generatedFiles = ref({
searchSchema: '',
columnsSchema: '',
editSchema: '',
apiConfig: ''
})
const activeFile = ref('searchSchema')
const inputText = ref('')
const sessionList = ref([])
方法:
loadSessionList() — 加载历史会话列表startNewSession() — 新建会话loadSession(id) — 加载历史会话详情deleteSession(id) — 删除会话sendMessage() — 发送消息并开始流式生成handleSSEChunk(event, data) — 处理 SSE 事件saveConfig() — 保存配置到数据库loadExistingConfig() — 加载现有配置(用于 Diff)copyCurrentFile() — 复制当前文件exportAllFiles() — 导出全部配置| 属性 | 值 |
|---|---|
| 资源名称 | CRUD 生成器 |
| 父级 | AI 管理(path=/ai) |
| 资源类型 | 2(菜单) |
| 排序 | 11 |
| 路由路径 | /ai/crud-generator |
| 组件 | ai/crud-generator |
| 权限标识 | ai:crud-generator:use |
| 图标 | mdi:magic-staff |
追加到 ai_crud_config.sql:
-- CRUD 生成器菜单
INSERT INTO sys_resource (tenant_id, resource_name, parent_id, resource_type, sort, path, component, is_external, is_public, menu_status, visible, perms, icon, keep_alive, always_show, remark, create_time, update_time)
SELECT 0, 'CRUD 生成器', id, 2, 11, '/ai/crud-generator', 'ai/crud-generator', 0, 0, 1, 1, 'ai:crud-generator:use', 'mdi:magic-staff', 0, 0, 'AI CRUD 配置生成器', NOW(), NOW()
FROM sys_resource WHERE tenant_id = 0 AND path = '/ai' AND resource_type = 1 LIMIT 1;
-- 原 CRUD 配置菜单排序调整为 12
UPDATE sys_resource SET sort = 12 WHERE tenant_id = 0 AND path = '/ai/crud-config' AND resource_type = 2;
| 风险 | 说明 | 应对措施 |
|---|---|---|
| SSE 连接中断 | 流式输出过程中网络中断 | 前端显示错误提示,提供"重新生成"按钮 |
| JSON 解析失败 | AI 输出 JSON 格式不规范 | 后端校验 + 前端容错,显示原始文本让用户手动修复 |
| Monaco Editor 加载慢 | 编辑器库体积较大 | 使用 CDN 或懒加载,显示加载动画 |
ai_crud_config 关联(MVP 阶段)