首页 > 其他分享 >我对jeecg-boot项目的理解、使用心得和改进建议

我对jeecg-boot项目的理解、使用心得和改进建议

时间:2022-12-13 20:38:17浏览次数:57  
标签:方法 boot 符合 风格 lowerCamelCase 命名 变量名 心得 jeecg


jeecg-boot是什么?

官方介绍

我对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

相关文章