ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JEECG框架模块化开发实践与业务Module创建指南

JEECG框架模块化开发实践与业务Module创建指南 1. JEECG框架模块化开发概述JEECG作为一款基于代码生成器的低代码开发平台其模块化架构设计一直是提高开发效率的关键特性。在实际企业级应用开发中业务模块的合理划分直接影响着项目的可维护性和扩展性。最近在重构一个供应链管理系统时我深刻体会到新增业务Module的重要性——当采购管理、库存管理和物流跟踪三个核心业务混杂在同一个模块时不仅代码耦合度高团队协作也频繁出现冲突。JEECG的模块化机制允许我们将不同业务领域拆分为独立Module每个Module包含完整的MVC结构controller/service/dao/entity。这种设计既保持了单一职责原则又能通过依赖管理实现模块间通信。比如在电商系统中用户中心、商品管理、订单处理等业务都可以作为独立Module存在开发团队可以并行工作而互不干扰。2. 新建业务Module的完整流程2.1 环境准备与项目分析在开始创建新Module前需要确认几个关键前提已安装JDK8和Maven3.5已有可运行的JEECG-Boot项目建议版本3.4.2明确新模块的业务边界建议绘制业务上下文关系图以创建一个供应商管理模块为例首先在IDE中打开主项目我习惯使用IntelliJ IDEA进行操作。关键是要确保项目能正常编译特别检查pom.xml中的parent配置parent groupIdorg.jeecgframework.boot/groupId artifactIdjeecg-boot-parent/artifactId version3.4.2/version /parent2.2 使用Maven Archetype创建模块JEECG提供了标准化的模块创建方式通过执行以下Maven命令mvn archetype:generate \ -DarchetypeGroupIdorg.jeecgframework.archetype \ -DarchetypeArtifactIdjeecg-module-archetype \ -DarchetypeVersion3.4.2 \ -DgroupIdcom.your.company \ -DartifactIdsupplier-module \ -Dversion1.0.0 \ -Dpackagecom.your.company.supplier创建完成后需要手动将模块添加到父pom.xml的 节点中modules modulesupplier-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/*.xmlMyBatis映射文件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: dev1233.2 依赖声明最佳实践模块的pom.xml需要明确定义与核心模块和其他业务模块的依赖关系dependencies !-- 必须依赖的核心模块 -- dependency groupIdorg.jeecgframework.boot/groupId artifactIdjeecg-boot-base-common/artifactId /dependency !-- 可选依赖的其他业务模块 -- dependency groupIdcom.your.company/groupId artifactIdcontract-module/artifactId version${project.version}/version /dependency /dependencies重要原则避免循环依赖公共依赖提升到父pom版本号统一使用${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 JeecgControllerSupplier, ISupplierService { Autowired private ISupplierService supplierService; GetMapping(value /list) public ResultIPageSupplier queryPageList(Supplier supplier, RequestParam(defaultValue 1) Integer pageNo, RequestParam(defaultValue 10) Integer pageSize) { PageSupplier page new Page(pageNo, pageSize); return Result.OK(supplierService.page(page, Wrappers.query(supplier))); } }4.3 Service层事务控制使用Spring的声明式事务管理public interface ISupplierService extends IServiceSupplier { void complexSupplierOperation(SupplierDTO dto); } Service public class SupplierServiceImpl extends ServiceImplSupplierMapper, 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 ./supplier5.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无法访问 排查步骤检查父pom.xml是否包含该模块确认模块的src/main/resources/META-INF/spring.factories存在查看启动日志是否有模块包扫描记录6.2 依赖冲突解决使用mvn dependency:tree分析依赖树常见冲突包括mybatis-plus版本不一致fastjson版本冲突spring-boot-starter版本差异解决方案示例dependency groupIdcom.alibaba/groupId artifactIdfastjson/artifactId version1.2.78/version exclusions exclusion groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId /exclusion /exclusions /dependency6.3 热部署失效处理在开发环境下按以下步骤确保热部署生效IDEA设置中开启Build project automatically注册CtrlShiftA搜索Registry勾选compiler.automake.allow.when.app.running在application-dev.yml添加spring: devtools: restart: enabled: true additional-paths: src/main/java7. 高级应用技巧7.1 模块间服务调用推荐两种方式FeignClient方式适合微服务架构FeignClient(name contract-module, path /contract) public interface ContractClient { GetMapping(/getBySupplier) ResultListContract getBySupplier(RequestParam String supplierId); }直接注入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下次生成模块时将使用自定义模板。我通常会调整默认包结构添加公司特定的代码风格预置常用工具类8. 实际项目经验分享在最近实施的ERP系统中我们按功能域划分了12个业务Module。其中三个关键教训值得分享模块粒度控制最初把采购申请和采购订单放在同一个Module后来发现变更频繁且团队协作冲突多。拆分为两个Module后效率提升明显。版本管理策略每个Module应有独立的版本号MAJOR.MINOR.PATCH通过Jenkins实现自动化构建和依赖更新。测试数据隔离为每个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文档保持沟通。当供应商管理模块需要升级时只需修改其版本号并通知依赖方测试不会影响其他模块的正常开发。
返回列表