jeecg-boot是什么?
官方介绍
JeecgBoot 是一款基于代码生成器的低代码开发平台,零代码开发!采用前后端分离架构:SpringBoot2.x,Ant Design&Vue,Mybatis-plus,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! JeecgBoot引领新的开发模式(Online Coding模式-> 代码生成器模式-> 手工MERGE智能开发), 帮助解决Java项目70%的重复工作,让开发更多关注业务逻辑。既能快速提高开发效率,帮助公司节省成本,同时又不失灵活性!JeecgBoot还独创在线开发模式(No代码概念):在线表单配置(表单设计器)、移动配置能力、工作流配置(在线设计流程)、报表配置能力、在线图表配置、插件能力(可插拔)等等!
JeecgBoot在提高UI能力的同时,降低了前后分离的开发成本,JeecgBoot还独创在线开发模式(No代码概念),一系列在线智能开发:在线配置表单、在线配置报表、在线图表设计、在线设计流程等等。
JEECG宗旨是:简单功能由Online Coding配置实现(在线配置表单、在线配置报表、在线图表设计、在线设计流程、在线设计表单),复杂功能由代码生成器生成进行手工Merge,既保证了智能又兼顾了灵活;
业务流程采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。
- 官方网站: http://www.jeecg.com
- 源码下载: https://github.com/zhangdaiscott/jeecg-boot
- QQ交流群:②769925425、①284271917、③816531124
- 在线演示: http://boot.jeecg.com
- 版本日志: http://www.jeecg.com/doc/log
- 新手指南: 快速入门 | 常见问题| 视频教程 | 反馈问题
技术架构:
后端技术: SpringBoot_2.1.3.RELEASE + Mybatis-plus_3.1.2 + Shiro_1.4.0 + Jwt_3.7.0 + Swagger-ui + Redis 前端技术: Ant-design-vue + Vue + Webpack 其他技术: Druid(数据库连接池)、Logback(日志工具) 、poi(Excel工具)、 Quartz(定时任务)、lombok(简化代码) 项目构建: Maven、Jdk8
前端开发必读文档:
前端UI组件: Ant Design of Vuehttps://www.antdv.com/docs/vue/introduce 报表UI组件:viser-vuehttps://viserjs.gitee.io/demo.html#/viser/bar/basic-bar
VUE基础知识:https://cn.vuejs.org/v2/guide Ant Design Vue Pro:https://pro.loacg.com/docs/getting-started
为什么要用jeecg-boot?
作为一个后端开发人员,每次在为一家新的公司开发系统的时候,都在想尽快给公司开发出来一套简单,美观,好用的后台管理系统,让后进的开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。
既然是想尽快搞出来一套完美的系统,如果靠重新开发,耗费的精力是非常多的。
因此重新开发这条路是行不通的。
所以去开源项目寻找一套现成的系统是一种不错的捷径。人生有时候是需要靠捷径的,站在前人的肩膀之上来成就自己。我们可以少走更多弯路。路走直了,通往胜利的灯塔还远吗?
在开源社区里面,这样的系统是非常多的。怎么样才茫茫项目之中,挑选出来一套适合自己的项目呢?
其实每个公司选择项目的标准基本都是统一的
1:开源
2:最新技术栈(前后端分离+微服务)
3:ui美观
4:功能完善
5:简单上手
6:易于二次开发
看了很多优秀的开源项目,最终选择了jeectboot这套低代码快速开发平台。
选择它的理由,当然最基本的是必须满足以上6点。
除此之外还有
7:简化第三方登录和单点登录
8:简化导出导出功能
9:简化文件上传功能
10:后端代码生成
11:前端表单生成
改进建议
项目
1:将单体版和微服务版分离开。不要放在同一项目中,不要通过修改代码的方式实现单体和微服务切换
开发文档
2:开发文档分离。将单体版和微服务版开发文档单独分开
配置
3:去掉本地host配置
命名规范
4:类名【JeecgFeignService】应以Impl结尾。
对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别
5:DySmsHelper类中的常量【product】【domain】命名应该全部大写并以下划线分隔
常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长
6:FreemarkerParseFactory类中的常量【_tplConfig】【_sqlConfig】【p】命名应该全部大写并以下划线分隔
7:JacksonUtil类中的常量【objectMapper】命名应该全部大写并以下划线分隔
8:MD5Util类中的常量【hexDigits】命名应该全部大写并以下划线分隔
9:MybatisPlusConfig类中的常量【tenant_field】【tenantTable】命名应该全部大写并以下划线分隔
10:PasswordUtil类中的常量【Salt】命名应该全部大写并以下划线分隔
11:RandImageUtil类中的常量【key】【width】【height】【count】【lineWidth】命名应该全部大写并以下划线分隔
12:SqlInjectionUtil类中的常量【xssStr】命名应该全部大写并以下划线分隔
13:YouBianCodeUtil类中的常量【zhanweiLength】命名应该全部大写并以下划线分隔
14:枚举【BrowserType】【DySmsEnum】【ExecutorRouteStrategyEnum】【QueryRuleEnum】
【QueryRuleEnum】【TriggerTypeEnum】【UrlMatchEnum】的字段缺少注释信息
15:类DateUtils中的【_date】命名不能以_开头
所有编程相关的命名均不能以_或者$开始
16:抽象类【ExecutorRouter】命名应以Abstract或者Base开头
17:类AutoPoiDictConfig中的变量名【commonAPI】不符合lowerCamelCase命名风格
方法名,参数名,成员变量,局部变量都统一使用lowerCamelCase,必须遵从驼峰形式
18:类BaseAspect方法名【getValueBySpEL】不符合lowerCamelCase命名风格
19:类BaseCommonService变量名【LogContent】不符合lowerCamelCase命名风格
20:类CommonController变量名【sysBaseAPI】【httpURL】和方法名【transitRESTful】不符合lowerCamelCase命名风格
21:类CookieUtil变量名【arr_cookie】不符合lowerCamelCase命名风格
22:类CronExpression变量名【dayOfWSpec】不符合lowerCamelCase命名风格
23:类DataSourceCachePool变量名【commonAPI】不符合lowerCamelCase命名风格
24:类DepartIdModel方法名【getSerialVersionUID】不符合lowerCamelCase命名风格
25:类DistributedLockHandler变量名【valueBySpEL】不符合lowerCamelCase命名风格
26:类DlMockController变量名【tug_status】【dataDB】不符合lowerCamelCase命名风格
27:类EmailSendMsgHandle方法名【SendMsg】变量名【es_receiver】【es_title】【es_content】不符合lowerCamelCase命名风格
28:类ExecutorRouteBusyover变量名【idleBeatResultSB】不符合lowerCamelCase命名风格
29:类ExecutorRouteFailover变量名【beatResultSB】不符合lowerCamelCase命名风格
30:接口ISendMsgHandle方法名【SendMsg】和变量名【es_receiver】【es_title】【es_content】不符合lowerCamelCase命名风格
31:接口ISysBaseAPI方法名【queryAllDSysCategory】不符合lowerCamelCase命名风格
32:类JeecgDataAutorUtils方法名【loadDataSearchConditonSQLString】不符合lowerCamelCase命名风格
33:类JimuReportTokenService变量名【sysBaseAPI】不符合lowerCamelCase命名风格
34:类JobGroupController变量名【list_count】【jobGroupList_all】不符合lowerCamelCase命名风格
35:类JobLogController变量名【jobGroupList_all】【list_count】不符合lowerCamelCase命名风格
36:类JobTriggerPoolHelper变量名【triggerPool_】【minTim_now】不符合lowerCamelCase命名风格
37:类JwtFilter变量名【tenant_id】不符合lowerCamelCase命名风格
38:类LoginController变量名【sysBaseAPI】不符合lowerCamelCase命名风格
39:类MD5Util方法名【MD5Encode】不符合lowerCamelCase命名风格
40:类MinioUtil变量名【file_url】方法名【getObjectURL】不符合lowerCamelCase命名风格
41:类MockController方法名【permission_no_page】不符合lowerCamelCase命名风格
42:类MybatisInterceptor变量名【local_createBy】【local_createDate】【local_sysOrgCode】不符合lowerCamelCase命名风格
43:类MybatisPlusConfig变量名【tenant_id】【sql_lowercase】不符合lowerCamelCase命名风格
44:类PasswordUtil方法名【getPBEKey】不符合lowerCamelCase命名风格
45:类PermissionDataAspect变量名commonAPI不符合lowerCamelCase命名风格
46:类Result方法名【OK】不符合lowerCamelCase命名风格
47:类ShiroRealm变量名【commonAPI】不符合lowerCamelCase命名风格
48:类SmsSendMsgHandle方法名【SendMsg】变量名【es_receiver】【es_title】【es_content】不符合lowerCamelCase命名风格
49:类SysAnnouncementController变量名【sysBaseAPI】【tokenOK】不符合lowerCamelCase命名风格
50:类SysDepartPermissionController变量名【SysDepartRolePermission】不符合lowerCamelCase命名风格
51:类SysDepartTreeModel方法名【getSerialVersionUID】不符合lowerCamelCase命名风格
52:类SysLogServiceImpl变量名【sysBaseAPI】不符合lowerCamelCase命名风格
53:类SysMessageTemplateController变量名【is_sendSuccess】不符合lowerCamelCase命名风格
54:类SystemAPIController变量名【sysBaseAPI】和方法名【queryAllDSysCategory】不符合lowerCamelCase命名风格
55:类SysUploadController变量名【file_url】不符合lowerCamelCase命名风格
56:类SysUserDepartServiceImpl变量名【queryUDep】不符合lowerCamelCase命名风格
57:类ThirdAppController变量名【msg_task_id】不符合lowerCamelCase命名风格
58:类ThirdAppTypeConfig变量名【WECHAT_ENTERPRISE】【DINGTALK】不符合lowerCamelCase命名风格
59:枚举UrlMatchEnum变量名【match_url】不符合lowerCamelCase命名风格
60:类UserController变量名【list_count】不符合lowerCamelCase命名风格
61:类UUIDGenerator方法名【getJVM】和【getIP】不符合lowerCamelCase命名风格
62:类VxeMockController变量名【tug_status】和【dataDB】不符合lowerCamelCase命名风格
63:类WxSendMsgHandle方法名【SendMsg】和变量名【es_receiver】【es_title】【es_content】不符合lowerCamelCase命名风格
64:类XxlJobExecutor变量名【ip_port_address】不符合lowerCamelCase命名风格
65:类XxlJobTrigger变量名【runResultSB】不符合lowerCamelCase命名风格
线程池
66:JobFailMonitorHelper,JobLosedMonitorHelper,JobRegistryMonitorHelper不要显示创建显示创建线程,请使用线程池。
线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。
魔法值
67:不允许任何魔法值(即未经定义的常量)直接出现在代码中
比如AdminBizImpl中的魔法值【15000】
AutoLogAspect中的魔法值【"list"】魔法值【"add"】【"edit"】【"delete"】【"import"】【"export"】【"POST"】【"PUT"】【"PATCH"】【"500"】等
事务
68:事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
1:JeecgDemoServiceImpl方法【testTran】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback
2:JeecgOrderMainServiceImpl方法【saveMain】【updateMain】【updateCopyMain】【delMain】【delbatchMain】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback
3:SysAnnouncementServiceImpl方法【saveAnnouncement】【upDateAnnouncement】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback
4:SysPermissionDataRuleImpl方法【savePermissionDataRule】【deletePermissionDataRule】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback
5:SysPermissionServiceImpl方法【deletePermission】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback
6:SysUserServiceImpl方法【addUserWithRole】【editUserWithRole】【addUserWithDepart】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback
单个方法总行数
单个方法的总行数不超过80行。
1:类JobLogReportHelper中的方法【start】的总行数不要超过80行
2:类JobScheduleHelper中的方法【start】的总行数不要超过80行
3:类MybatisInterceptor中的方法【intercept】的总行数不要超过80行
4:类VxeMockController中的方法【getMockDdjhData】的总行数不要超过80行
垃圾代码
及时清理不再使用的代码片段或配置信息,对于垃圾代码或者过时的配置,坚决清理干净,避免程序过度臃肿,代码冗余。
比如:DynamicRouteLoader类中的这些被注释掉的代码
// private void loadRoutesByDataBase() {
// List<GatewayRouteVo> routeList = jdbcTemplate.query(SELECT_ROUTES, new RowMapper<GatewayRouteVo>() {
// @Override
// public GatewayRouteVo mapRow(ResultSet rs, int i) throws SQLException {
// GatewayRouteVo result = new GatewayRouteVo();
// result.setId(rs.getString("id"));
// result.setName(rs.getString("name"));
// result.setUri(rs.getString("uri"));
// result.setStatus(rs.getInt("status"));
// result.setRetryable(rs.getInt("retryable"));
// result.setPredicates(rs.getString("predicates"));
// result.setStripPrefix(rs.getInt("strip_prefix"));
// result.setPersist(rs.getInt("persist"));
// return result;
// }
// });
// if (ObjectUtil.isNotEmpty(routeList)) {
// // 加载路由
// routeList.forEach(route -> {
// RouteDefinition definition = new RouteDefinition();
// List<PredicateDefinition> predicatesList = Lists.newArrayList();
// List<FilterDefinition> filtersList = Lists.newArrayList();
// definition.setId(route.getId());
// String predicates = route.getPredicates();
// String filters = route.getFilters();
// if (StringUtils.isNotEmpty(predicates)) {
// predicatesList = JSON.parseArray(predicates, PredicateDefinition.class);
// definition.setPredicates(predicatesList);
// }
// if (StringUtils.isNotEmpty(filters)) {
// filtersList = JSON.parseArray(filters, FilterDefinition.class);
// definition.setFilters(filtersList);
// }
// URI uri = UriComponentsBuilder.fromUriString(route.getUri()).build().toUri();
// definition.setUri(uri);
// this.repository.save(Mono.just(definition)).subscribe();
// });
// log.info("加载路由:{}==============", routeList.size());
// Mono.empty();
// }
// }
被//注释的代码项目中有很多处,此处不再一一列出。
注释规范
1:所有的抽象方法(包括接口中的方法)必须使用javadoc注释,除了返回值,参数,异常说明外,还必须指出该方法做什么事情,实现什么功能。
2:所有的类都必须添加创作者信息
3:方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/**/注释。注意与代码对齐
代码可读性
除常用方法(如getXxx/isXxx)等外,不要再条件判断中执行复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量,以提高可读性
比如:NgAlainServiceImpl中的以下代码
if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) {
String url= new String(Base64.getUrlEncoder().encode(permission.getUrl().getBytes()));
json.put("path", "/sys/link/" +url.replaceAll("=",""));
}else {
json.put("path", permission.getUrl());
}
和
if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) {
meta.put("url", permission.getUrl());
}
SysCategoryServiceImpl中的如下代码片段
if((dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(metaPid)
&& !sb.toString().contains(metaPid)){
//如果当前节点原本有子节点 现在木有了,更新状态
sb.append(metaPid).append(",");
}
SysPermissionController中的如下代码片段
if (url != null && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("{{"))) {
return true;
}
SysPermissionDataRuleImpl中的如下代码片段
if(permission!=null && (permission.getRuleFlag()==null || permission.getRuleFlag().equals(CommonConstant.RULE_FLAG_0))) {
permission.setRuleFlag(CommonConstant.RULE_FLAG_1);
sysPermissionMapper.updateById(permission);
}
SysPermissionServiceImpl中的如下代码片段
if((oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid)&&oConvertUtils.isNotEmpty(p.getParentId())) {
}
XxlJobServiceImpl类中的如下代码片段
if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler()==null || jobInfo.getExecutorHandler().trim().length()==0) ) {
return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+"JobHandler") );
}
集合初始化大小
集合初始化时,指定集合初始化值大小
HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可
比如项目中多处用到
Map<String,Object> map = new HashMap<>();
建议更改为
Map<String,Object> map = new HashMap<>(16);
标签:方法,boot,符合,风格,lowerCamelCase,命名,变量名,心得,jeecg From: https://blog.51cto.com/u_15785444/5935017