JEECG框架模块化开发实践与业务Module创建指南
2026/9/16 6:17:38 网站建设 项目流程

1. JEECG框架模块化开发概述

JEECG作为一款基于代码生成器的低代码开发平台,其模块化架构设计一直是提高开发效率的关键特性。在实际企业级应用开发中,业务模块的合理划分直接影响着项目的可维护性和扩展性。最近在重构一个供应链管理系统时,我深刻体会到新增业务Module的重要性——当采购管理、库存管理和物流跟踪三个核心业务混杂在同一个模块时,不仅代码耦合度高,团队协作也频繁出现冲突。

JEECG的模块化机制允许我们将不同业务领域拆分为独立Module,每个Module包含完整的MVC结构(controller/service/dao/entity)。这种设计既保持了单一职责原则,又能通过依赖管理实现模块间通信。比如在电商系统中,用户中心、商品管理、订单处理等业务都可以作为独立Module存在,开发团队可以并行工作而互不干扰。

2. 新建业务Module的完整流程

2.1 环境准备与项目分析

在开始创建新Module前,需要确认几个关键前提:

  1. 已安装JDK8+和Maven3.5+
  2. 已有可运行的JEECG-Boot项目(建议版本3.4.2+)
  3. 明确新模块的业务边界(建议绘制业务上下文关系图)

以创建一个"供应商管理"模块为例,首先在IDE中打开主项目,我习惯使用IntelliJ IDEA进行操作。关键是要确保项目能正常编译,特别检查pom.xml中的parent配置:

<parent> <groupId>org.jeecgframework.boot</groupId> <artifactId>jeecg-boot-parent</artifactId> <version>3.4.2</version> </parent>

2.2 使用Maven Archetype创建模块

JEECG提供了标准化的模块创建方式,通过执行以下Maven命令:

mvn archetype:generate \ -DarchetypeGroupId=org.jeecgframework.archetype \ -DarchetypeArtifactId=jeecg-module-archetype \ -DarchetypeVersion=3.4.2 \ -DgroupId=com.your.company \ -DartifactId=supplier-module \ -Dversion=1.0.0 \ -Dpackage=com.your.company.supplier

创建完成后,需要手动将模块添加到父pom.xml的 节点中:

<modules> <module>supplier-module</module> <!-- 其他已有模块 --> </modules>

注意:模块命名建议遵循"业务名-module"的格式,避免使用特殊字符和空格。我曾见过团队使用"module1"这样的命名,三个月后就没人记得各个模块的用途了。

2.3 模块目录结构规范

新建的模块应包含以下核心目录:

supplier-module ├── src/main/java │ └── com/your/company/supplier │ ├── controller │ ├── entity │ ├── service │ │ ├── impl │ └── mapper ├── src/main/resources │ ├── static │ └── templates └── src/test/java

特别要注意的是resources目录下的配置文件:

  • application.yml:模块特有配置
  • mapper/*.xml:MyBatis映射文件
  • templates/:存放模块专属的前端页面

3. 模块配置与依赖管理

3.1 多环境配置隔离

每个业务Module应该有独立的配置体系。在resources目录下创建:

application-dev.yml # 开发环境 application-test.yml # 测试环境 application-prod.yml # 生产环境

配置示例:

# application-dev.yml jeecg: module: name: supplier version: 1.0.0 spring: datasource: url: jdbc:mysql://dev-db:3306/supplier_db username: dev_user password: dev123

3.2 依赖声明最佳实践

模块的pom.xml需要明确定义与核心模块和其他业务模块的依赖关系:

<dependencies> <!-- 必须依赖的核心模块 --> <dependency> <groupId>org.jeecgframework.boot</groupId> <artifactId>jeecg-boot-base-common</artifactId> </dependency> <!-- 可选依赖的其他业务模块 --> <dependency> <groupId>com.your.company</groupId> <artifactId>contract-module</artifactId> <version>${project.version}</version> </dependency> </dependencies>

重要原则:

  1. 避免循环依赖
  2. 公共依赖提升到父pom
  3. 版本号统一使用${project.version}

4. 业务代码开发规范

4.1 实体类定义技巧

JEECG的实体类需要继承BaseEntity并添加特定注解:

@Table(name = "supplier_info") public class Supplier extends BaseEntity { @Excel(name = "供应商编号", width = 15) private String supplierCode; @Dict(dicCode = "industry_type") @Excel(name = "行业类型", width = 15) private String industryType; // 必须包含的注解 @Override public String toString() { return "Supplier{" + "supplierCode='" + supplierCode + '\'' + ", industryType='" + industryType + '\'' + '}'; } }

经验:@Excel注解用于后续代码生成器的导出功能,即使暂时不需要导出也建议先加上,避免后期大量补加。

4.2 Controller层设计模式

建议采用RESTful风格,继承JEECG提供的基础控制器类:

@RestController @RequestMapping("/supplier") @Slf4j public class SupplierController extends JeecgController<Supplier, ISupplierService> { @Autowired private ISupplierService supplierService; @GetMapping(value = "/list") public Result<IPage<Supplier>> queryPageList(Supplier supplier, @RequestParam(defaultValue = "1") Integer pageNo, @RequestParam(defaultValue = "10") Integer pageSize) { Page<Supplier> page = new Page<>(pageNo, pageSize); return Result.OK(supplierService.page(page, Wrappers.query(supplier))); } }

4.3 Service层事务控制

使用Spring的声明式事务管理:

public interface ISupplierService extends IService<Supplier> { void complexSupplierOperation(SupplierDTO dto); } @Service public class SupplierServiceImpl extends ServiceImpl<SupplierMapper, Supplier> implements ISupplierService { @Transactional(rollbackFor = Exception.class) @Override public void complexSupplierOperation(SupplierDTO dto) { // 业务逻辑... } }

5. 前端集成与菜单配置

5.1 Vue组件注册

在模块的src/main/resources/static目录下创建前端资源:

static/ └── modules/ └── supplier/ ├── api/ │ └── supplier.js └── views/ └── SupplierList.vue

然后在主项目的src/views/modules/下创建符号链接:

ln -s ../../../../supplier-module/src/main/resources/static/modules/supplier ./supplier

5.2 菜单权限配置

通过代码生成器自动生成菜单,或手动在sys_permission表插入记录:

INSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, sort_no, icon_type) VALUES ('supplier_mgmt', '0', '供应商管理', '/supplier', 'modules/supplier/SupplierList', 1, NULL, NULL, '0', NULL, 1, 'anticon-team');

6. 常见问题排查指南

6.1 模块未加载问题

现象:新模块的Controller无法访问 排查步骤:

  1. 检查父pom.xml是否包含该模块
  2. 确认模块的src/main/resources/META-INF/spring.factories存在
  3. 查看启动日志是否有模块包扫描记录

6.2 依赖冲突解决

使用mvn dependency:tree分析依赖树,常见冲突包括:

  • mybatis-plus版本不一致
  • fastjson版本冲突
  • spring-boot-starter版本差异

解决方案示例:

<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.78</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency>

6.3 热部署失效处理

在开发环境下,按以下步骤确保热部署生效:

  1. IDEA设置中开启Build project automatically
  2. 注册Ctrl+Shift+A搜索Registry,勾选compiler.automake.allow.when.app.running
  3. 在application-dev.yml添加:
spring: devtools: restart: enabled: true additional-paths: src/main/java

7. 高级应用技巧

7.1 模块间服务调用

推荐两种方式:

  1. FeignClient方式(适合微服务架构)
@FeignClient(name = "contract-module", path = "/contract") public interface ContractClient { @GetMapping("/getBySupplier") Result<List<Contract>> getBySupplier(@RequestParam String supplierId); }
  1. 直接注入Service(需确保模块依赖)
// 在supplier-module的pom中添加contract-module依赖 @Autowired private ContractService contractService;

7.2 多数据源配置

对于需要独立数据库的模块,在模块配置中添加:

spring: datasource: supplier: url: jdbc:mysql://localhost:3306/supplier username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver

然后创建配置类:

@Configuration @MapperScan(basePackages = "com.your.company.supplier.mapper", sqlSessionTemplateRef = "supplierSqlSessionTemplate") public class SupplierDataSourceConfig { @Bean(name = "supplierDataSource") @ConfigurationProperties(prefix = "spring.datasource.supplier") public DataSource supplierDataSource() { return DataSourceBuilder.create().build(); } // 其他必要Bean配置... }

7.3 自定义代码生成器模板

复制jeecg-module-archetype中的模板文件到:

src/main/resources/archetype-resources/__rootArtifactId__-module

修改后执行:

mvn clean install

下次生成模块时将使用自定义模板。我通常会调整:

  1. 默认包结构
  2. 添加公司特定的代码风格
  3. 预置常用工具类

8. 实际项目经验分享

在最近实施的ERP系统中,我们按功能域划分了12个业务Module。其中三个关键教训值得分享:

  1. 模块粒度控制:最初把"采购申请"和"采购订单"放在同一个Module,后来发现变更频繁且团队协作冲突多。拆分为两个Module后效率提升明显。

  2. 版本管理策略:每个Module应有独立的版本号(MAJOR.MINOR.PATCH),通过Jenkins实现自动化构建和依赖更新。

  3. 测试数据隔离:为每个Module准备独立的测试数据集,避免使用共享的测试数据库导致用例相互影响。

一个典型的模块依赖关系示例如下:

erp-system (父POM) ├── base-module (基础功能) ├── auth-module (权限中心) ├── supplier-module (供应商管理) │ └── 依赖 → base-module ├── contract-module (合同管理) │ └── 依赖 → base-module, supplier-module └── financial-module (财务管理) └── 依赖 → base-module, contract-module

这种架构下,各团队可以并行开发,只需约定好接口版本,通过Swagger文档保持沟通。当供应商管理模块需要升级时,只需修改其版本号并通知依赖方测试,不会影响其他模块的正常开发。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询