java开源项目jeecg结构与代码全解析

一.搭建 1.前端
npm install
npm run serve
2.后端
老生常谈的配置 , 修改MySQL与redis即可 。
二.业务功能介绍
功能上jeecgboot主要提供了系列的代码生成器、模板页面、报表页面 。
1.报表功能
主要提供报表的相关操作 。提供了积木报表插件 , 可以自定义数据报表、图形报表 。并将报表挂载到菜单上 。
2.在线开发
也就是代码生成器 , 可以可视化的在页面上新建数据库表 , 并通过数据库表生成前后台代码 。减少业务代码开发的时间 。
3.系统管理
用户管理、角色管理、机构管理、消息管理等基础模块 。
4.系统监控
主要负责各种日志、监控的统一处理 。
5.页面组件样式
常见案例、详情页、结果页、异常页、列表页、表单页主要提供了样式页面与控件页面示例 。在开发过程中如果需要模板直接复制代码即可 。详情请
三.后台架构介绍 1.概括
其中报表和代码生成器没有提供源码 , 如果有兴趣可以自行查看jar包源码 。
2.架构核心包jeecg-boot-base
jeecg-boot-base包括了下文的几个部分 。
1.接口包jeecg-boot-base-api 1.对外接口jeecg-system-cloud-api
使用feign+hystrix实现了服务间调用加熔断 , 单机环境并没有使用 。
2.服务内接口jeecg-system-local-api
该包提供了下文使用的常用方法接口 。仅提供了接口并无其他配置 。
2.核心配置包jeecg-boot-base-core 1.通用类common 1.api
其中为通用接口与通用返回对象 。
1.Result
其中Result为所有类的返回实体 , 这样能够通过code编码和message获取是否成功和成功/失败的信息 。此类是常用的架构设计
2.aspect
为项目的自定义注解 , 使用了AOP的切面方式实现 , 这里就不详细说了 , 比较简单都可以看懂 。
3.constant
存放着枚举类与常量池 , 这里不多说了 。
4.es
为操作es的通用类 , 主要是配置es连接和查询时动态拼接and/or的方法 。
5.exception
exception为自定义的异常类 。
1.JeecgBootExceptionHandler
这里详细说一下JeecgBootExceptionHandler , 该类也是常见的架构设计之一 , 核心为@RestControllerAdvice、@ExceptionHandler 。当业务代码中没有对异常拦截时 , 该类会自动拦截异常 , 并数据log日志 。所以某些日志在该类配置后 , 就不需要在每个接口中都捕获这个异常了 。
6.handler
为下文规范提供了接口类 。没有其他特别说明 。
7.system类
这里主要说controller、entity、service等业务代码的父类
1.JeecgController
所以controller的父类 , 提供了导入导出的功能 。还可以在里面扩展分页、排序、常用调用方法等 , 这样就可以避免相同的代码多次添加 。这也是架构设计中常用的技巧 。
2.JeecgEntity
将通用字段如id、创建人、修改人、创建时间、修改时间等字段统一封装在一个实体中 , 使用其他实体继承 。这也是架构设计中常用的技巧 。
3.service
主要提供MyBatis-plus提供的curd方法 。
8.utli
提供了一大波的工具类 , 如果在工作中需要 , 直接复制使用 。
2.通用配置类config 1.mybatis
1.MybatisInterceptor
MybatisInterceptor这里主要说MybatisInterceptor , 该类负责在mybatis执行语句前 , 拦截并获取参数 , 将创建人、创建时间等字符动态插入 。这里上部分核心代码 。
MAppedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
String sqlId = mappedStatement.getId();
log.debug("------sqlId------" + sqlId);
//获取sql类型是插入还是修改
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
//获取插入参数
Object parameter = invocation.getArgs()[1];
if (parameter == null) {
return invocation.proceed();
}
if (SqlCommandType.INSERT == sqlCommandType) {
LoginUser sysUser = this.getLoginUser();
//通过反射获取入参的类
Field[] fields = oConvertUtils.getAllFields(parameter);
for (Field field : fields) {
log.debug("------field.name------" + field.getName());
try {
//将创建人信息动态加入
if ("createBy".equals(field.getName())) {
field.setAccessible(true);
Object local_createBy = field.get(parameter);
field.setAccessible(false);


推荐阅读