492 lines
11 KiB
Markdown
492 lines
11 KiB
Markdown
# EasyCode 前台生成工作台设计
|
||
|
||
## 目标
|
||
|
||
新增一个独立前台项目 `easycode-web`,面向普通用户提供从项目需求输入、数据库表生成、表结构编辑、项目代码预览到源码下载的生成工作台。
|
||
|
||
现有 `ruoyi-ui` 继续作为后台管理端,用于管理员维护模板、代码片段、项目配置、用户数据和平台设置。前台用户不跳转到后台登录页,前台登录、项目生成和预览都在 `easycode-web` 内完成。
|
||
|
||
## 范围
|
||
|
||
本次设计覆盖:
|
||
|
||
- 独立前台工程 `easycode-web`
|
||
- 前台用户登录注册
|
||
- 项目草稿数据表
|
||
- 后端前台接口
|
||
- `AiGenerateService` 调用 DeepSeek 生成 MySQL 表结构
|
||
- 数据库结构展示和编辑
|
||
- 后端项目、前台前端、后台前端三类项目结构预览
|
||
- 文件级代码预览
|
||
|
||
不在第一阶段实现:
|
||
|
||
- 前台直接调用 DeepSeek
|
||
- 在线部署运行生成项目
|
||
- 支付、套餐、限流计费
|
||
- 多人协作编辑
|
||
|
||
## 架构
|
||
|
||
系统分为三层:
|
||
|
||
- `easycode-web`:独立 Vue 3 + Vite 前台应用,负责首页、登录、项目生成流程、表结构编辑和代码预览。
|
||
- `ruoyi-admin`:提供前台认证、项目草稿、AI 生成、代码预览和下载接口。
|
||
- `ruoyi-generator`:继续承担模板渲染、项目结构解析、文件内容生成等能力,供前台接口复用。
|
||
|
||
DeepSeek 调用只允许发生在后端:
|
||
|
||
```text
|
||
easycode-web
|
||
-> ruoyi-admin front API
|
||
-> AiGenerateService
|
||
-> DeepSeek API
|
||
-> 结构化结果校验
|
||
-> 项目草稿表 / 生成器元数据
|
||
-> easycode-web 展示和编辑
|
||
```
|
||
|
||
## 前台页面
|
||
|
||
### 首页
|
||
|
||
路径:`/`
|
||
|
||
参考 `easycode_home_prototype.html`,整理为真实中文文案和组件化结构:
|
||
|
||
- 顶部导航:Logo、首页、功能介绍、模板市场、在线预览、价格方案、帮助文档、登录
|
||
- 首屏生成入口:输入项目名称或需求描述,点击“立即生成”
|
||
- 代码预览展示:模拟后端、前台、后台、SQL 项目结构
|
||
- 核心功能区:后端代码生成、前端页面生成、数据库脚本、在线预览、权限系统、源码下载
|
||
- 生成流程区:输入需求、生成数据库、编辑确认、预览项目、下载源码
|
||
- 模板市场区:车辆管理、订单管理、OA、仓库管理等示例
|
||
|
||
点击“登录”进入前台登录页。点击“立即生成”进入前台项目生成页;未登录时先进入前台登录页,登录成功后回到项目生成页。
|
||
|
||
### 登录注册页
|
||
|
||
路径:
|
||
|
||
- `/login`
|
||
- `/register`
|
||
|
||
前台用户和后台用户分离。前台登录成功后保存前台 token,只用于 `/front/**` 接口。
|
||
|
||
### 项目生成页
|
||
|
||
路径:`/generate`
|
||
|
||
页面采用步骤条:
|
||
|
||
1. 生成数据库并编辑表结构
|
||
2. 预览项目
|
||
3. 下载源码
|
||
|
||
第一步表单字段:
|
||
|
||
- 项目名称
|
||
- 项目描述
|
||
- 行业模板,可选
|
||
- 技术栈偏好,可选
|
||
- 额外需求描述
|
||
|
||
点击“生成数据库”后调用后端 AI 生成接口。生成完成后展示表结构和 SQL。
|
||
|
||
### 数据库编辑区
|
||
|
||
展示内容:
|
||
|
||
- 表列表
|
||
- 当前表字段列表
|
||
- SQL 预览
|
||
|
||
可编辑字段:
|
||
|
||
- 表名
|
||
- 表备注
|
||
- 字段名
|
||
- 字段类型
|
||
- Java 类型
|
||
- 是否主键
|
||
- 是否自增
|
||
- 是否必填
|
||
- 是否插入
|
||
- 是否编辑
|
||
- 是否列表展示
|
||
- 是否查询字段
|
||
- 查询方式
|
||
- 显示控件
|
||
- 字典类型
|
||
- 默认值
|
||
- 字段备注
|
||
|
||
保存时后端重新校验表名、字段名、字段类型和 SQL 安全性,再写入项目草稿表。
|
||
|
||
### 项目预览页
|
||
|
||
路径:`/project/:projectId/preview`
|
||
|
||
预览页左侧是项目结构树,右侧是代码预览。
|
||
|
||
结构树分为四个根节点:
|
||
|
||
- 后端项目
|
||
- 前台前端
|
||
- 后台前端
|
||
- SQL 脚本
|
||
|
||
点击文件节点,调用文件内容接口并在右侧展示代码。代码预览支持 Java、XML、SQL、Vue、JavaScript、JSON、YAML、Markdown 的语法高亮。
|
||
|
||
## 后端接口
|
||
|
||
接口统一放在 `/front/**` 下,和后台管理接口分离。
|
||
|
||
### 前台认证
|
||
|
||
```text
|
||
POST /front/auth/register
|
||
POST /front/auth/login
|
||
POST /front/auth/logout
|
||
GET /front/auth/profile
|
||
```
|
||
|
||
### 项目草稿
|
||
|
||
```text
|
||
POST /front/project/create
|
||
GET /front/project/list
|
||
GET /front/project/{projectId}
|
||
PUT /front/project/{projectId}
|
||
DELETE /front/project/{projectId}
|
||
```
|
||
|
||
### 数据库生成和编辑
|
||
|
||
```text
|
||
POST /front/project/{projectId}/generate-database
|
||
GET /front/project/{projectId}/database
|
||
PUT /front/project/{projectId}/database
|
||
POST /front/project/{projectId}/database/validate
|
||
```
|
||
|
||
`generate-database` 输入:
|
||
|
||
```json
|
||
{
|
||
"projectName": "车辆管理系统",
|
||
"projectDesc": "管理车辆、司机、维修、保险和年检",
|
||
"industryTemplate": "vehicle",
|
||
"extraRequirements": "需要车辆维修记录和年检提醒"
|
||
}
|
||
```
|
||
|
||
后端返回结构化表设计和 SQL:
|
||
|
||
```json
|
||
{
|
||
"projectId": 1001,
|
||
"tables": [
|
||
{
|
||
"tableName": "car_info",
|
||
"tableComment": "车辆信息表",
|
||
"columns": [
|
||
{
|
||
"columnName": "car_id",
|
||
"columnType": "bigint(20)",
|
||
"javaType": "Long",
|
||
"javaField": "carId",
|
||
"isPk": "1",
|
||
"isIncrement": "1",
|
||
"isRequired": "1",
|
||
"columnComment": "车辆ID"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"sql": "CREATE TABLE ..."
|
||
}
|
||
```
|
||
|
||
### 项目预览
|
||
|
||
```text
|
||
POST /front/project/{projectId}/preview
|
||
GET /front/project/{projectId}/structure
|
||
GET /front/project/{projectId}/file-content
|
||
GET /front/project/{projectId}/download
|
||
```
|
||
|
||
`file-content` 参数:
|
||
|
||
- `templateType`:`backend`、`frontend`、`admin_frontend`、`sql`
|
||
- `nodeId`
|
||
- `tableId`
|
||
- `category`
|
||
|
||
## 数据表
|
||
|
||
新增前台用户和项目草稿相关表,避免 AI 生成的半成品直接污染后台正式生成配置。
|
||
|
||
### front_user
|
||
|
||
前台用户表。
|
||
|
||
关键字段:
|
||
|
||
- `user_id`
|
||
- `username`
|
||
- `password`
|
||
- `nickname`
|
||
- `email`
|
||
- `phone`
|
||
- `status`
|
||
- `del_flag`
|
||
- `last_login_time`
|
||
- `create_time`
|
||
- `update_time`
|
||
|
||
### front_project
|
||
|
||
前台项目草稿表。
|
||
|
||
关键字段:
|
||
|
||
- `project_id`
|
||
- `user_id`
|
||
- `project_name`
|
||
- `project_file_name`
|
||
- `package_name`
|
||
- `version`
|
||
- `project_desc`
|
||
- `industry_template`
|
||
- `front_framework`
|
||
- `back_framework`
|
||
- `generate_status`
|
||
- `preview_status`
|
||
- `status`
|
||
- `create_time`
|
||
- `update_time`
|
||
|
||
### front_project_table
|
||
|
||
前台项目表设计。
|
||
|
||
字段参考 `gen_table`,增加草稿状态和用户归属:
|
||
|
||
- `table_id`
|
||
- `project_id`
|
||
- `user_id`
|
||
- `table_name`
|
||
- `table_comment`
|
||
- `class_name`
|
||
- `module_name`
|
||
- `business_name`
|
||
- `function_name`
|
||
- `tpl_category`
|
||
- `tpl_web_type`
|
||
- `options`
|
||
- `create_table_sql`
|
||
- `sort`
|
||
- `status`
|
||
|
||
### front_project_column
|
||
|
||
前台项目字段设计。
|
||
|
||
字段参考 `gen_table_column`:
|
||
|
||
- `column_id`
|
||
- `table_id`
|
||
- `project_id`
|
||
- `column_name`
|
||
- `column_comment`
|
||
- `column_type`
|
||
- `java_type`
|
||
- `java_field`
|
||
- `is_pk`
|
||
- `is_increment`
|
||
- `is_required`
|
||
- `is_insert`
|
||
- `is_edit`
|
||
- `is_list`
|
||
- `is_query`
|
||
- `query_type`
|
||
- `html_type`
|
||
- `dict_type`
|
||
- `default_value`
|
||
- `sort`
|
||
|
||
### front_project_generation
|
||
|
||
生成记录表,用于审计 AI 调用和排查问题。
|
||
|
||
关键字段:
|
||
|
||
- `generation_id`
|
||
- `project_id`
|
||
- `user_id`
|
||
- `generate_type`
|
||
- `provider`
|
||
- `prompt_summary`
|
||
- `request_payload`
|
||
- `response_payload`
|
||
- `success`
|
||
- `error_message`
|
||
- `token_usage`
|
||
- `elapsed_ms`
|
||
- `create_time`
|
||
|
||
### front_project_file
|
||
|
||
项目预览文件缓存表,可按需启用。第一版可以不缓存,实时调用生成器生成;如果预览性能不足,再落库缓存。
|
||
|
||
关键字段:
|
||
|
||
- `file_id`
|
||
- `project_id`
|
||
- `template_type`
|
||
- `node_id`
|
||
- `table_id`
|
||
- `file_name`
|
||
- `file_path`
|
||
- `file_content`
|
||
- `content_hash`
|
||
- `create_time`
|
||
- `update_time`
|
||
|
||
## AiGenerateService
|
||
|
||
新增 `AiGenerateService`,职责如下:
|
||
|
||
- 读取 DeepSeek 配置
|
||
- 组装数据库生成 Prompt
|
||
- 调用 DeepSeek API
|
||
- 要求模型返回 JSON
|
||
- 解析并校验 JSON
|
||
- 规范化表名、字段名、字段类型和 Java 字段名
|
||
- 生成 MySQL DDL
|
||
- 写入 `front_project_table` 和 `front_project_column`
|
||
- 写入 `front_project_generation`
|
||
|
||
配置项:
|
||
|
||
- `deepseek.apiKey`
|
||
- `deepseek.baseUrl`
|
||
- `deepseek.model`
|
||
- `deepseek.timeout`
|
||
- `deepseek.maxTables`
|
||
- `deepseek.maxColumnsPerTable`
|
||
|
||
安全规则:
|
||
|
||
- 前端不保存 DeepSeek key
|
||
- 前端不直接访问 DeepSeek
|
||
- 表名和字段名只允许小写字母、数字、下划线
|
||
- 禁止生成 `drop`、`truncate`、`alter user`、`grant`、`revoke` 等危险语句
|
||
- 字段类型只允许白名单内的 MySQL 类型
|
||
- 每次 AI 结果必须后端校验后才能保存
|
||
|
||
## 生成器复用
|
||
|
||
前台预览不重写一套代码生成逻辑,复用 `ruoyi-generator`。
|
||
|
||
适配方式:
|
||
|
||
1. 将 `front_project_table` 和 `front_project_column` 转换为 `GenTable` 和 `GenTableColumn` 结构。
|
||
2. 根据前台项目选择的模板类型,加载后台维护的模板和项目结构。
|
||
3. 调用现有项目结构构建和文件内容生成能力。
|
||
4. 返回结构树和文件内容给 `easycode-web`。
|
||
|
||
模板类型约定:
|
||
|
||
- `backend`:后端项目
|
||
- `frontend`:前台前端项目
|
||
- `admin_frontend`:后台前端项目
|
||
- `sql`:SQL 脚本
|
||
|
||
## 错误处理
|
||
|
||
前端显示明确状态:
|
||
|
||
- AI 生成中
|
||
- 生成成功
|
||
- 生成失败,可重试
|
||
- 表结构校验失败
|
||
- 预览生成失败
|
||
- 文件加载失败
|
||
|
||
后端错误分层:
|
||
|
||
- 参数错误:返回具体字段错误
|
||
- AI 服务错误:记录日志并返回可重试提示
|
||
- AI JSON 解析错误:保存原始响应到生成记录
|
||
- SQL 安全校验失败:返回失败原因和问题表字段
|
||
- 预览生成失败:返回模板文件、表名和异常摘要
|
||
|
||
## 测试
|
||
|
||
后端测试:
|
||
|
||
- `AiGenerateService` JSON 解析测试
|
||
- 表名和字段名安全校验测试
|
||
- MySQL 类型白名单测试
|
||
- 项目草稿保存测试
|
||
- 草稿表转换为 `GenTable` 测试
|
||
- 文件结构和文件内容预览测试
|
||
|
||
前端测试:
|
||
|
||
- 首页跳转
|
||
- 未登录进入生成页时跳前台登录
|
||
- 登录后回到生成页
|
||
- 数据库生成步骤状态切换
|
||
- 表字段新增、编辑、删除
|
||
- 项目结构点击文件并展示代码
|
||
|
||
手工验收:
|
||
|
||
1. 访问前台首页。
|
||
2. 输入“车辆管理系统”,点击立即生成。
|
||
3. 登录前台账号。
|
||
4. 进入项目生成页。
|
||
5. 点击生成数据库。
|
||
6. 页面展示车辆相关 MySQL 表结构。
|
||
7. 编辑字段并保存。
|
||
8. 点击预览项目。
|
||
9. 左侧展示后端项目、前台前端、后台前端和 SQL 脚本。
|
||
10. 点击文件名,右侧展示对应代码。
|
||
|
||
## 分期实施
|
||
|
||
### 一期:前台壳和静态流程
|
||
|
||
- 新增 `easycode-web`
|
||
- 首页、登录注册页、项目生成页、预览页
|
||
- 使用 mock 数据展示数据库结构和代码预览
|
||
- 不调用 DeepSeek
|
||
|
||
### 二期:项目草稿和 AI 数据库生成
|
||
|
||
- 新增前台用户表和项目草稿表
|
||
- 新增前台认证接口
|
||
- 新增项目草稿接口
|
||
- 新增 `AiGenerateService`
|
||
- 接 DeepSeek 生成数据库表结构
|
||
- 前台支持编辑并保存表结构
|
||
|
||
### 三期:生成器预览和下载
|
||
|
||
- 前台草稿表转换为生成器模型
|
||
- 复用后台模板和项目结构
|
||
- 实现后端项目、前台前端、后台前端、SQL 预览
|
||
- 实现源码打包下载
|
||
|
||
## 决策
|
||
|
||
- 前台使用独立项目 `easycode-web`。
|
||
- 前台登录不跳转后台。
|
||
- “立即生成”进入前台项目生成页。
|
||
- DeepSeek 只由后端 `AiGenerateService` 调用。
|
||
- 新增前台用户和项目草稿表。
|
||
- 第一版优先保证生成链路闭环,再扩展在线部署、套餐和模板市场。
|