mall-cloud
Go to file
bunny 585dd4290d 🎉 初始化第三方插件模块 2025-07-06 23:15:28 +08:00
ReadMe/环境搭建 📝 添加nacos创建文档说明 2025-07-06 01:33:14 +08:00
generator-code-server 🔧 修改配置文件;添加模块起始页 2025-07-06 13:29:57 +08:00
images 🔧 生成器和项目配置修改 2025-07-04 15:23:21 +08:00
mall-auth-server 🎉 init 2025-07-04 09:11:03 +08:00
mall-cart 🔧 修改配置文件;添加模块起始页 2025-07-06 13:29:57 +08:00
mall-common 🎉 初始化第三方插件模块 2025-07-06 23:15:28 +08:00
mall-coupon 🚚 重命名商品Entity实体类名称 2025-07-06 16:11:37 +08:00
mall-gateway 🎉 初始化第三方插件模块 2025-07-06 23:15:28 +08:00
mall-member 🚚 重命名商品Entity实体类名称 2025-07-06 16:11:37 +08:00
mall-order 🚚 重命名商品Entity实体类名称 2025-07-06 16:11:37 +08:00
mall-product 🎉 初始化第三方插件模块 2025-07-06 23:15:28 +08:00
mall-search 🔥 删除测试文件夹 2025-07-04 09:12:05 +08:00
mall-seckill 添加配置;更新包依赖;添加日志文件 2025-07-06 01:32:54 +08:00
mall-third-party 🎉 初始化第三方插件模块 2025-07-06 23:15:28 +08:00
mall-ware 🔥 删除测试文件夹 2025-07-04 09:12:05 +08:00
.gitignore 添加代碼生成器 2025-07-04 14:35:41 +08:00
LICENSE 🎉 init 2025-07-04 09:11:03 +08:00
README.md 🎉 init 2025-07-04 09:11:03 +08:00
pom.xml 🎉 初始化第三方插件模块 2025-07-06 23:15:28 +08:00
push.sh 🎉 init 2025-07-04 09:11:03 +08:00

README.md

🚀 Bunny Code Generator 代码生成器系统文档

LicenseJava VersionSpring Boot

📁 项目结构说明

  • src/main/java/cn/bunny/controller:包含所有控制器
  • src/main/java/cn/bunny/core:核心模块,包含元数据提取、数据库方言等
  • src/main/java/cn/bunny/domain:数据模型定义
  • src/main/java/cn/bunny/exception:异常处理模块
  • src/main/java/cn/bunny/service:接口定义
  • src/main/java/cn/bunny/service/impl:接口实现
  • src/main/java/cn/bunny/utils:工具类
  • src/main/resources/static/src:前端组件和视图
  • src/main/resources/vmsVelocity 模板文件
  • src/main/resources/templates:前端页面模板

1. 系统架构 🏗️

1.1 架构图

graph TD
    A[🖥️ 前端界面] -->|HTTP请求| B[🌐 WebController]
    A -->|API调用| C[⚙️ GeneratorController]
    A -->|SQL解析| D[🔍 SqlParserController]
    A -->|元数据查询| E[🗃️ TableController]
    A -->|模板管理| F[📂 VmsController]
    
    B -->|页面跳转| G[📝 Thymeleaf模板]
    C -->|生成请求| H[🏭 GeneratorService]
    D -->|SQL解析| I[✂️ SqlMetadataProvider]
    E -->|数据库查询| J[🔗 DatabaseMetadataProvider]
    F -->|模板扫描| K[🗃️ VmsService]
    
    H -->|模板渲染| L[🌀 Velocity引擎]
    H -->|打包下载| M[📦 ZipFileUtil]
    I & J -->|数据源| N[💾 MySQL数据库]
    J -->|连接池| O[🛟 HikariCP]

1.2 核心分层 🔍

层级 组件 技术实现
接入层 🚪 Controllers Spring Web, Swagger
业务层 ⚙️ Services 并行流, 设计模式
核心层 🧠 模板生成/元数据 Velocity, JSqlParser
数据层 💾 数据源/连接池 HikariCP, JDBC

2. 核心控制器详解 🎯

2.1 GeneratorController

1. 核心控制器

  • GeneratorController主控制器提供生成代码和下载ZIP文件的接口
  • TableController:获取数据库元数据信息
  • SqlParserController解析SQL语句提取表和列信息
  • WebController:页面路由控制器
  • VmsController:获取前端代码模板路径

2. 元数据解析

  • DatabaseMetadataProvider:数据库元数据提取器
  • SqlMetadataProviderSQL语句元数据提取器
  • DatabaseDialect:数据库方言接口,支持多数据库扩展
  • MySqlDialectMySQL方言实现提取注释等信息

3. 代码生成引擎

  • AbstractTemplateGenerator:抽象模板生成器,定义模板方法
  • VmsTBaseTemplateGenerator:具体模板实现,负责上下文填充和模板合并
  • ZipFileUtil生成ZIP文件并下载
  • MysqlTypeConvertUtil类型转换工具SQL → Java/JS

核心业务流:

flowchart TB
    A[接收VmsArgumentDto] --> B{判断生成方式}
    B -->|SQL生成| C[调用generateCodeBySql]
    B -->|数据库生成| D[调用generateCodeByDatabase]
    C/D --> E[模板渲染]
    E --> F{是否打包下载}
    F -->|是| G[生成ZIP响应]
    F -->|否| H[返回代码预览]

关键方法说明:

  1. generator() 方法:

    • 🔄 根据sql参数判断生成方式

    • 📊 使用VmsArgumentDto接收模板选择、包名等参数

    • 🌟 核心逻辑:

      Strings.isEmpty(sql) 
          ? generatorService.generateCodeByDatabase(dto)
          : generatorService.generateCodeBySql(dto);
      
  2. downloadByZip() 方法:

    • 🗜️ 使用ZipFileUtil进行内存压缩

    • 响应头设置:

      headers.add("Content-Disposition", "attachment; filename=" + zipFilename);
      

2.2 TableController 🗃️

元数据查询体系:

classDiagram
    TableController --> TableService : 依赖
    TableService --> DatabaseMetadataProvider : 调用
    DatabaseMetadataProvider --> HikariDataSource : 使用
    
    class TableController{
        +databaseInfoMetaData() 数据库基础信息
        +databaseTableList() 表清单
        +tableMetaData() 单表结构
        +tableColumnInfo() 列详情
    }

典型调用链:

  1. 获取数据库信息:

    DatabaseMetaData metaData = connection.getMetaData();
    return DatabaseInfoMetaData.builder()
        .databaseProductName(metaData.getDatabaseProductName())
        .driverVersion(metaData.getDriverVersion())
        .build();
    
  2. 查询表结构:

    ResultSet tables = metaData.getTables(dbName, null, "%", new String[]{"TABLE"});
    while(tables.next()){
        // 构建TableMetaData对象
    }
    

3. 关键技术实现 🔧

3.1 模板生成流程 🌀

抽象模板方法模式:

public abstract class AbstractTemplateGenerator {
    // 模板方法
    public final StringWriter generateCode() {
        prepareContext();  // 准备数据
        return mergeTemplate(); // 渲染模板
    }
    protected abstract void addContext(); // 子类实现
}

Velocity上下文示例

context.put("classLowercaseName", "userInfo"); 
context.put("columns", columnList);
context.put("date", "2023-01-01");

3.2 类型转换策略 🔄

MySQL类型映射

数据库类型 Java类型 转换方法
varchar String MysqlTypeConvertUtil.convertToJavaType()
datetime LocalDateTime 同上
tinyint Integer 同上

命名转换示例:

// 下划线转驼峰
convertToCamelCase("user_name", true);  // → "UserName"
convertToCamelCase("user_name", false); // → "userName"

4. 核心业务逻辑说明

4.1 代码生成流程

4.1.1 简洁流畅

sequenceDiagram
    participant F as 前端
    participant C as Controller
    participant S as Service
    participant T as Template
    
    F->>C: 提交生成请求(VmsArgumentDto)
    C->>S: 调用generateCodeBy[Sql/Database]
    S->>T: 准备Velocity上下文
    T->>S: 返回渲染结果
    S->>C: 返回Map<String, List<GeneratorVo>>
    C->>F: 返回结果或ZIP包

4.1.2 详细流程

sequenceDiagram
    participant 前端
    participant GeneratorController
    participant GeneratorService
    participant MetadataProvider
    participant TemplateEngine
    
    前端->>GeneratorController: 提交生成请求
    GeneratorController->>GeneratorService: 调用生成方法
    GeneratorService->>MetadataProvider: 获取表/列元数据
    MetadataProvider-->>GeneratorService: 返回元数据
    GeneratorService->>TemplateEngine: 填充模板
    TemplateEngine-->>GeneratorService: 生成代码
    GeneratorService-->>GeneratorController: 返回生成结果
    GeneratorController-->>前端: 返回代码/ZIP包

4.2 关键类协作

classDiagram
    class GeneratorController {
        +generateCode()
        +downloadByZip()
    }
    
    class GeneratorService {
        +generateCodeByDatabase()
        +generateCodeBySql()
    }
    
    class AbstractTemplateGenerator {
        +generateCode()
        #addContext()
        #templateMerge()
    }
    
    class VmsTBaseTemplateGenerator {
        +addContext()
        +templateMerge()
    }
    
    GeneratorController --> GeneratorService
    GeneratorService --> AbstractTemplateGenerator
    AbstractTemplateGenerator <|-- VmsTBaseTemplateGenerator

5. 扩展指南 🛠️

5.1 添加新数据库支持

  1. 实现DatabaseDialect接口 ✏️

  2. 配置新的IMetadataProvider ⚙️

  3. 示例代码结构:

    @Component
    public class OracleDialect implements DatabaseDialect {
        // 实现提取注释等方法
    }
    

5.2 依赖管理 📦

关键依赖说明:

<!-- SQL解析 -->
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>4.9</version>
</dependency>

<!-- 模板引擎 -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.2</version>
</dependency>

6. 注意事项 ⚠️

6.1 性能优化点 🚀

  • parallelStream() 用于批量生成

  • HikariCP 配置:

    hikari:
      maximum-pool-size: 20
      connection-timeout: 30000
    

6.2 版本兼容性 🔗

组件 已验证版本
MySQL 8.0+
JDK 17+
Spring Boot 3.4.3

6.3 文件名重复问题解决方案⚠️

graph TD
    A[用户选择模板] --> B{是否包含$className}
    B -->|是| C[替换为表名的小驼峰格式]
    B -->|否| D[保持原文件名]
    C --> E[生成唯一文件路径]
    D --> E

核心逻辑实现(位于VmsGeneratorPathHelper.java

public static String processVmPath(VmsArgumentDto dto, String path, String tableName) {
    String className = removeTablePrefixes(dto, tableName);
    String lowerCamelCase = MysqlTypeConvertUtil.convertToCamelCase(tableName, false);
    // 关键替换逻辑👇
    String[] pathParts = path.replace("$className", lowerCamelCase).split("/");
    ...
}

必须遵守的规则

[!Note]

如果不想使用$className可自己修改源码,进行更改。

  1. 前端文件必须使用$className作为动态目录名(如:web/$className/api.ts
  2. 相同基础名称的文件必须放在不同目录下
  3. Java/XML文件会自动添加类型后缀UserController.java

6.4 文件命名冲突场景示例

错误案例 正确方案 原因
web/index.vue web/$className/index.vue 多表生成时会冲突
mapper/UserMapper.xml 自动处理 系统会自动添加表名前缀
service/Service.java 自动处理 会转换为UserService.java

7. 代码质量评估 🔍

7.1 后端代码评估85/100

优势

  • 清晰的层次划分Controller/Service/Provider
  • 合理使用设计模式(模板方法模式)
  • 完善的异常处理体系
  • 类型转换工具类封装良好

待改进

  • ⚠️ 部分SQL解析逻辑可抽取为策略模式
  • ⚠️ 元数据提供者接口可进一步抽象
  • ⚠️ ZIP打包逻辑与业务耦合稍紧

坏味道检测

pie
    title 后端代码坏味道分布
    "重复代码" : 15
    "过长方法" : 10
    "过度耦合" : 5
    "其他" : 70

7.2 前端代码评估78/100

亮点

  • 组件化设计合理(表单/表格分离)
  • 响应式状态管理有效
  • 良好的用户交互反馈
  • 类型提示完善

问题点

  • ⚠️ 部分表单验证逻辑重复
  • ⚠️ 表格分页逻辑可抽取为独立组件

复杂度分析

文件 方法数 平均行数 复杂度
DatabaseTable.js 12 18 中等
DatabaseForm.js 25 12 较高
AppGeneratorPage.js 8 15

7.3 总结评价

整体评分82/100

可维护性

扩展性

代码规范

8. 支持项目

如果这个项目对您有帮助,可以考虑支持我们:

WeChat & Alipay

Happy Coding! 🎉