Skip to content

Commit e9b7e9c

Browse files
committed
重构backend
1 parent 74a4f3f commit e9b7e9c

27 files changed

+980
-665
lines changed

REFINED_REFACTORING_DOCUMENT.md

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
# Spring Boot代码生成器项目重构说明文档
2+
3+
## 1. 重构概述
4+
5+
本项目旨在对Spring Boot代码生成器进行现代化重构,使其具有更清晰的架构、更好的可维护性和更强的扩展性。重构遵循现代Spring Boot应用的最佳实践,采用了分层架构设计和多种设计模式。
6+
7+
## 2. 重构目标
8+
9+
1. **清晰的分层架构**:明确Controller、Service、DTO、VO等各层职责
10+
2. **良好的可扩展性**:通过策略模式处理不同类型的SQL解析
11+
3. **现代化开发规范**:遵循Spring Boot和Java开发最佳实践
12+
4. **易于维护**:通过合理的包结构和命名规范提高代码可读性
13+
5. **前后端兼容性**:保持与现有前端代码的数据交互格式
14+
15+
## 3. 重构后项目结构
16+
17+
```
18+
com.softdev.system.generator
19+
├── GeneratorApplication.java # 启动类
20+
├── config # 配置类包
21+
│ ├── WebMvcConfig.java # MVC配置
22+
│ └── GlobalExceptionHandler.java # 全局异常处理器
23+
├── controller # 控制层
24+
│ ├── PageController.java # 页面跳转控制器
25+
│ ├── CodeGenController.java # 代码生成相关接口
26+
│ └── TemplateController.java # 模板相关接口
27+
├── service # 服务层接口
28+
│ ├── CodeGenService.java # 代码生成服务接口
29+
│ ├── TemplateService.java # 模板服务接口
30+
│ └── parser
31+
│ ├── SqlParserService.java # SQL解析服务接口
32+
│ └── JsonParserService.java # JSON解析服务接口
33+
├── service.impl # 服务实现层
34+
│ ├── CodeGenServiceImpl.java # 代码生成服务实现
35+
│ ├── TemplateServiceImpl.java # 模板服务实现
36+
│ └── parser
37+
│ ├── SqlParserServiceImpl.java # SQL解析服务实现
38+
│ └── JsonParserServiceImpl.java # JSON解析服务实现
39+
├── entity # 实体类
40+
│ ├── dto
41+
│ │ ├── ParamInfo.java # 参数信息DTO
42+
│ │ ├── ClassInfo.java # 类信息DTO
43+
│ │ └── FieldInfo.java # 字段信息DTO
44+
│ ├── vo
45+
│ │ └── ResultVo.java # 统一返回结果VO
46+
│ └── enums
47+
│ └── ParserTypeEnum.java # 解析类型枚举
48+
├── util # 工具类包
49+
│ ├── FreemarkerUtil.java # Freemarker工具类
50+
│ ├── StringUtilsPlus.java # 字符串工具类
51+
│ ├── MapUtil.java # Map工具类
52+
│ ├── mysqlJavaTypeUtil.java # MySQL类型转换工具类
53+
│ └── exception
54+
│ ├── CodeGenException.java # 自定义业务异常
55+
│ └── SqlParseException.java # SQL解析异常
56+
└── constant # 常量定义
57+
└── CodeGenConstants.java # 代码生成常量(待实现)
58+
```
59+
60+
## 4. 各层详细说明
61+
62+
### 4.1 控制层 (Controller)
63+
64+
控制层负责处理HTTP请求,协调业务逻辑并返回结果:
65+
66+
1. **[PageController](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/controller/PageController.java)**:
67+
- 处理页面跳转请求
68+
- 返回视图页面
69+
70+
2. **[CodeGenController](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/controller/CodeGenController.java)**:
71+
- 提供代码生成相关REST API
72+
- 处理代码生成请求
73+
74+
3. **[TemplateController](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/controller/TemplateController.java)**:
75+
- 提供模板管理相关REST API
76+
- 处理模板获取请求
77+
78+
### 4.2 服务层 (Service)
79+
80+
服务层采用接口与实现分离的设计,便于测试和扩展:
81+
82+
1. **接口层**:
83+
- [CodeGenService](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/CodeGenService.java): 核心代码生成服务接口
84+
- [TemplateService](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/TemplateService.java): 模板管理服务接口
85+
- [SqlParserService](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/parser/SqlParserService.java): SQL解析服务接口
86+
- [JsonParserService](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/parser/JsonParserService.java): JSON解析服务接口
87+
88+
2. **实现层**:
89+
- [CodeGenServiceImpl](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/impl/CodeGenServiceImpl.java): 核心代码生成服务实现
90+
- [TemplateServiceImpl](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/impl/TemplateServiceImpl.java): 模板管理服务实现
91+
- [SqlParserServiceImpl](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/impl/parser/SqlParserServiceImpl.java): SQL解析服务实现
92+
- [JsonParserServiceImpl](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/impl/parser/JsonParserServiceImpl.java): JSON解析服务实现
93+
94+
### 4.3 实体层 (Entity)
95+
96+
实体层按照用途分类,避免不同类型对象混用:
97+
98+
1. **DTO (Data Transfer Object)**:
99+
- [ParamInfo](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/entity/dto/ParamInfo.java): 参数信息传输对象
100+
- [ClassInfo](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/entity/dto/ClassInfo.java): 类信息传输对象
101+
- [FieldInfo](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/entity/dto/FieldInfo.java): 字段信息传输对象
102+
103+
2. **VO (View Object)**:
104+
- [ResultVo](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/entity/vo/ResultVo.java): 统一返回结果视图对象
105+
106+
3. **Enums**:
107+
- [ParserTypeEnum](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/entity/enums/ParserTypeEnum.java): 解析类型枚举
108+
109+
### 4.4 工具层 (Util)
110+
111+
工具层包含各种通用工具类和自定义异常:
112+
113+
1. **工具类**:
114+
- [FreemarkerUtil](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/util/FreemarkerUtil.java): Freemarker模板处理工具
115+
- [StringUtilsPlus](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/util/StringUtilsPlus.java): 字符串处理工具
116+
- [MapUtil](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/util/MapUtil.java): Map操作工具
117+
- [mysqlJavaTypeUtil](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/util/mysqlJavaTypeUtil.java): MySQL与Java类型映射工具
118+
119+
2. **异常类**:
120+
- [CodeGenException](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/util/exception/CodeGenException.java): 代码生成自定义业务异常
121+
- [SqlParseException](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/util/exception/SqlParseException.java): SQL解析异常
122+
123+
## 5. 关键设计模式应用
124+
125+
### 5.1 策略模式
126+
127+
在SQL解析功能中应用策略模式,将不同的解析方式封装成独立的策略类:
128+
129+
1. [SqlParserServiceImpl](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/impl/parser/SqlParserServiceImpl.java)中实现了多种SQL解析方法:
130+
- `processTableIntoClassInfo`: 默认SQL解析
131+
- `generateSelectSqlBySQLPraser`: SELECT SQL解析
132+
- `generateCreateSqlBySQLPraser`: CREATE SQL解析
133+
- `processTableToClassInfoByRegex`: 正则表达式解析
134+
- `processInsertSqlToClassInfo`: INSERT SQL解析
135+
136+
2. [JsonParserServiceImpl](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/service/impl/parser/JsonParserServiceImpl.java)中实现了JSON解析:
137+
- `processJsonToClassInfo`: JSON解析
138+
139+
通过策略模式,可以:
140+
- 避免大量的if-else判断
141+
- 便于添加新的解析策略
142+
- 提高代码的可维护性
143+
144+
### 5.2 接口与实现分离
145+
146+
所有服务层都采用接口与实现分离的设计,便于:
147+
- 单元测试模拟
148+
- 多种实现方式切换
149+
- 降低模块间耦合度
150+
151+
## 6. 重要技术实现细节
152+
153+
### 6.1 统一响应格式
154+
155+
所有控制器方法均返回 [ResultVo](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/entity/vo/ResultVo.java) 统一响应对象,保持与前端的兼容性:
156+
157+
```java
158+
// 成功响应
159+
ResultVo.ok(data)
160+
161+
// 错误响应
162+
ResultVo.error(message)
163+
```
164+
165+
### 6.2 前后端兼容性处理
166+
167+
为了保持与现有前端JavaScript代码的兼容性,在处理响应数据时特别注意了数据结构:
168+
169+
1. 模板获取接口返回数据结构:
170+
```json
171+
{
172+
"code": 200,
173+
"msg": "success",
174+
"templates": [...]
175+
}
176+
```
177+
178+
2. 代码生成接口返回数据结构:
179+
```json
180+
{
181+
"code": 200,
182+
"msg": "success",
183+
"outputJson": {
184+
"tableName": "...",
185+
"controller": "...",
186+
"service": "...",
187+
// 其他模板生成的代码
188+
}
189+
}
190+
```
191+
192+
### 6.3 组件扫描配置
193+
194+
由于服务实现类位于不同的包层级中,已在 [Application](file:///D:/Workspace/Project/SpringBootCodeGenerator/generator-web/src/main/java/com/softdev/system/generator/Application.java) 类中配置了组件扫描路径:
195+
196+
```java
197+
@SpringBootApplication(scanBasePackages = "com.softdev.system.generator")
198+
```
199+
200+
确保所有服务实现类都能被正确扫描和注入。
201+
202+
## 7. 重构优势总结
203+
204+
1. **结构清晰**:通过合理的包结构和分层设计,使项目结构更加清晰易懂
205+
2. **易于维护**:各层职责明确,便于定位和修复问题
206+
3. **易于扩展**:采用策略模式等设计模式,便于添加新的功能模块
207+
4. **现代化**:遵循Spring Boot和Java的最新最佳实践
208+
5. **前后端兼容**:保持与现有前端代码的数据交互格式,无缝升级
209+
210+
## 8. 后续优化建议
211+
212+
1. **添加单元测试**:为各层添加完整的单元测试,确保代码质量
213+
2. **集成日志系统**:完善日志记录,便于问题排查
214+
3. **添加缓存机制**:对模板等不常变化的数据添加缓存,提高性能
215+
4. **完善异常处理**:统一异常处理机制,提供更友好的错误提示
216+
5. **添加接口文档**:使用Swagger等工具生成接口文档,便于前后端协作
217+
6. **增加常量定义**:将硬编码的字符串提取为常量,提高可维护性

generator-web/src/main/java/com/softdev/system/generator/Application.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/**
77
* @author zhengkai.blog.csdn.net
88
*/
9-
@SpringBootApplication
9+
@SpringBootApplication(scanBasePackages = "com.softdev.system.generator")
1010
public class Application {
1111

1212
public static void main(String[] args) {

generator-web/src/main/java/com/softdev/system/generator/config/WebMvcConfig.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
11
package com.softdev.system.generator.config;
22

3-
4-
// import com.alibaba.fastjson.support.config.FastJsonConfig;
5-
// import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
6-
import jakarta.servlet.DispatcherType;
7-
import org.springframework.boot.web.servlet.FilterRegistrationBean;
8-
import org.springframework.context.annotation.Bean;
3+
import com.alibaba.fastjson2.JSONReader;
4+
import com.alibaba.fastjson2.JSONWriter;
5+
import com.alibaba.fastjson2.support.config.FastJsonConfig;
6+
import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter;
97
import org.springframework.context.annotation.Configuration;
108
import org.springframework.http.MediaType;
119
import org.springframework.http.converter.HttpMessageConverter;
12-
import org.springframework.http.converter.StringHttpMessageConverter;
1310
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
1411
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
1512

16-
import com.alibaba.fastjson2.JSONReader;
17-
import com.alibaba.fastjson2.JSONWriter;
18-
import com.alibaba.fastjson2.support.config.FastJsonConfig;
19-
import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter;
20-
2113
import java.nio.charset.StandardCharsets;
22-
import java.util.ArrayList;
2314
import java.util.Collections;
2415
import java.util.List;
2516
/**
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.softdev.system.generator.controller;
2+
3+
import com.softdev.system.generator.entity.dto.ParamInfo;
4+
import com.softdev.system.generator.entity.vo.ResultVo;
5+
import com.softdev.system.generator.service.CodeGenService;
6+
import lombok.RequiredArgsConstructor;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.web.bind.annotation.*;
9+
import org.springframework.web.servlet.ModelAndView;
10+
11+
/**
12+
* 代码生成控制器
13+
*
14+
* @author zhengkai.blog.csdn.net
15+
*/
16+
@Slf4j
17+
@RequiredArgsConstructor
18+
@RestController
19+
@RequestMapping("/code")
20+
public class CodeGenController {
21+
22+
private final CodeGenService codeGenService;
23+
24+
@PostMapping("/generate")
25+
public ResultVo generateCode(@RequestBody ParamInfo paramInfo) throws Exception {
26+
return codeGenService.generateCode(paramInfo);
27+
}
28+
29+
}
Lines changed: 0 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +0,0 @@
1-
package com.softdev.system.generator.controller;
2-
3-
import com.alibaba.fastjson2.JSONArray;
4-
import com.softdev.system.generator.entity.ClassInfo;
5-
import com.softdev.system.generator.entity.ParamInfo;
6-
import com.softdev.system.generator.entity.ReturnT;
7-
import com.softdev.system.generator.service.GeneratorService;
8-
import com.softdev.system.generator.util.MapUtil;
9-
import com.softdev.system.generator.util.TableParseUtil;
10-
import com.softdev.system.generator.util.ValueUtil;
11-
import lombok.extern.slf4j.Slf4j;
12-
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
13-
import net.sf.jsqlparser.statement.Statement;
14-
import org.apache.commons.lang3.StringUtils;
15-
import org.springframework.beans.factory.annotation.Autowired;
16-
import org.springframework.stereotype.Controller;
17-
import org.springframework.web.bind.annotation.*;
18-
import org.springframework.web.servlet.ModelAndView;
19-
20-
import java.util.Date;
21-
import java.util.Map;
22-
23-
/**
24-
* 代码生成控制器
25-
* @author zhengkai.blog.csdn.net
26-
*/
27-
@Controller
28-
@Slf4j
29-
public class GeneratorController {
30-
@Autowired
31-
private ValueUtil valueUtil;
32-
33-
@Autowired
34-
private GeneratorService generatorService;
35-
36-
@GetMapping("/")
37-
public ModelAndView defaultPage() {
38-
return new ModelAndView("newui2").addObject("value",valueUtil);
39-
}
40-
@GetMapping("/index")
41-
public ModelAndView indexPage() {
42-
return new ModelAndView("newui2").addObject("value",valueUtil);
43-
}
44-
45-
@RequestMapping("/template/all")
46-
@ResponseBody
47-
public ReturnT getAllTemplates() throws Exception {
48-
String templates = generatorService.getTemplateConfig();
49-
return ReturnT.ok().put("templates", JSONArray.parseArray(templates));
50-
}
51-
@PostMapping("/code/generate")
52-
@ResponseBody
53-
public ReturnT generateCode(@RequestBody ParamInfo paramInfo) throws Exception {
54-
//log.info(JSON.toJSONString(paramInfo.getOptions()));
55-
if (StringUtils.isEmpty(paramInfo.getTableSql())) {
56-
return ReturnT.error("表结构信息为空");
57-
}
58-
//1.Parse Table Structure 表结构解析
59-
ClassInfo classInfo = null;
60-
String dataType = MapUtil.getString(paramInfo.getOptions(),"dataType");
61-
switch (dataType) {
62-
case "sql":
63-
//默认模式:parse DDL table structure from sql
64-
classInfo = generatorService.processTableIntoClassInfo(paramInfo);
65-
break;
66-
case "json":
67-
//JSON模式:parse field from json string
68-
classInfo = generatorService.processJsonToClassInfo(paramInfo);
69-
break;
70-
case "insert-sql":
71-
//INSERT SQL模式:parse field from insert sql
72-
classInfo = generatorService.processInsertSqlToClassInfo(paramInfo);
73-
break;
74-
case "sql-regex":
75-
//正则表达式模式(非完善版本):parse sql by regex
76-
classInfo = generatorService.processTableToClassInfoByRegex(paramInfo);
77-
break;
78-
case "select-sql":
79-
//SelectSqlBySQLPraser模式:parse select sql by JSqlParser
80-
classInfo = generatorService.generateSelectSqlBySQLPraser(paramInfo);
81-
break;
82-
case "create-sql":
83-
//CreateSqlBySQLPraser模式:parse create sql by JSqlParser
84-
classInfo = generatorService.generateCreateSqlBySQLPraser(paramInfo);
85-
break;
86-
default:
87-
//默认模式:parse DDL table structure from sql
88-
classInfo = generatorService.processTableIntoClassInfo(paramInfo);
89-
break;
90-
}
91-
//2.Set the params 设置表格参数
92-
paramInfo.getOptions().put("classInfo", classInfo);
93-
paramInfo.getOptions().put("tableName", classInfo == null ? System.currentTimeMillis() : classInfo.getTableName());
94-
95-
//log the generated table and filed size记录解析了什么表,有多少个字段
96-
//log.info("generated table :{} , size :{}",classInfo.getTableName(),(classInfo.getFieldList() == null ? "" : classInfo.getFieldList().size()));
97-
98-
//3.generate the code by freemarker templates with parameters . Freemarker根据参数和模板生成代码
99-
Map<String, String> result = generatorService.getResultByParams(paramInfo.getOptions());
100-
// log.info("result {}",result);
101-
log.info("table:{} - time:{} ", MapUtil.getString(result,"tableName"),new Date());
102-
return ReturnT.ok().put("outputJson",result);
103-
}
104-
105-
}

0 commit comments

Comments
 (0)