Charles7c
|
e6f7429fa3
|
style: 使用常量优化部分魔法值
|
2023-03-31 23:31:30 +08:00 |
|
Charles7c
|
a623acd4a5
|
fix: 优化通用查询注解解析器
|
2023-03-31 21:31:07 +08:00 |
|
Charles7c
|
bc54acd60b
|
重构:重构获取登录用户信息的代码逻辑
1.用户基本信息调整为实时获取
2.登录用户不再保存基本信息,降低维护成本
3.移除冗余的维护登录用户基本信息的代码
|
2023-03-26 10:58:23 +08:00 |
|
Charles7c
|
267ad9be13
|
优化:优化修改角色的代码逻辑
1.变更角色编码、功能权限或数据权限后,关联在线用户会自动下线
2.优化角色和菜单关联、角色和部门关联、用户和角色关联的业务代码(增加返回结果)
3.重构在线用户功能,抽取在线用户业务实现
|
2023-03-26 00:14:05 +08:00 |
|
Charles7c
|
c5b748fe52
|
完善:发版前配置梳理
|
2023-03-24 00:40:49 +08:00 |
|
Charles7c
|
069104c598
|
优化:优化部分常量命名及使用
|
2023-03-23 21:56:37 +08:00 |
|
Charles7c
|
a09711c04e
|
完善:完善菜单相关代码逻辑,优化部分细节
|
2023-03-20 21:56:20 +08:00 |
|
Charles7c
|
6d3ba478e9
|
优化:优化校验工具类的使用及部分模板文本写法
1.优化校验工具类,支持传入 {} 模板文本
2.校验工具类增加 throwIf 重载方法,适合于 boolean 类型参数的情况
3.优化一些模板文本的写法
4.优化一些其他细节
|
2023-03-20 20:44:52 +08:00 |
|
Charles7c
|
6b73aeb8a9
|
优化:优化校验工具类的部分写法
|
2023-03-19 11:19:20 +08:00 |
|
Charles7c
|
405c821e2a
|
重构:🔥 基于阿里巴巴 Java 开发手册(黄山版)重构各表基本结构(简化列名)
1.MySQL数据库>建表规约>第9条:
【强制】表必备三字段:id,create_time,update_time。
说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time,update_time 的类型均为datetime 类型,如果要记录时区信息,那么类型设置为 timestamp。
个人理解:简化列名的目的是为了后续能抽取更多公共能力
2.MySQL数据库>SQL语句>第10条:
【推荐】SQL 语句中表的别名前加 as,并且以 t1、t2、t3、...的顺序依次命名。
说明:
1)别名可以是表的简称,或者是依照表在 SQL 语句中出现的顺序,以 t1、t2、t3 的方式命名。
2)别名前加 as 使别名更容易识别。
正例:select t1.name from first_table as t1 , second_table as t2 where t1.id = t2.id;
|
2023-03-06 00:09:11 +08:00 |
|
Charles7c
|
95784e5c7d
|
修复:不再查询父 ID 为 0 的记录的父名称
|
2023-03-05 13:10:28 +08:00 |
|
Charles7c
|
39f267699a
|
优化:优化成员变量相关注释及部分操作写法
成员变量有时候会被称为 Field 有时候会被称为 Property,它们的区别如下:
1.Field:Field 是 Java 反射中描述类的属性信息的类。成员变量(Instance Variable)就是定义的字段(Field),例如 private String name;。Field 可以获取当前对象的成员变量的类型,对成员变量重新设值等。使用 Field 可以直接操作类的属性,不需要通过 getter 和 setter 方法,但是需要了解反射机制。
2.Property:Property 是成员变量的 getter 和 setter 方法。例如,public String getName() { return name; } 和 public void setName(String name) { this.name = name; } 分别是获取和设置 MyField 类中的实例变量 name 的 getter 和 setter 方法。使用 Property 可以在类的外部访问和修改类的属性,但是需要注意访问权限和数据类型的正确性。
综上所述,Field 和 Property 都可以用来表示 Java 类中的成员变量,选择哪种方式取决于具体的应用场景和需求。如果需要直接操作类的属性,可以使用 Field;如果需要在类的外部访问和修改类的属性,可以使用 Property。
个人理解:从 MyBatis 的映射角度来说,column 表示数据库表列/字段,property 表示 Java 对象属性/字段,所以此前在涉及到 MyBatis 操作时,尽可能多的用了 Property 而不是 Field。但除了 MyBatis 之外还有很多地方也需要用到成员变量,与其纠结 Field 还是 Property,那就用 Field,简单粗暴一点。
|
2023-03-05 12:59:10 +08:00 |
|
Charles7c
|
44fa7266b6
|
优化:基于阿里巴巴 Java 开发手册(黄山版)优化日志配置
1.异常日志>日志规约>第2条:
【强制】日志文件至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。对于当天日志,以“应用名.log”来保存,保存在/{统一目录}/{应用名}/logs/目录下,过往日志格式为:{logname}.log.{保存日期},日期格式:yyyy-MM-dd
正例:以 mppserver 应用为例,日志保存/home/admin/mppserver/logs/mppserver.log,历史日志名称为 mppserver.log.2021-11-28
2.异常日志>日志规约>第3条:
【强制】根据国家法律,网络运行状态、网络安全事件、个人敏感信息操作等相关记录,留存的日志不少于六个月,并且进行网络多机备份。
3.异常日志>日志规约>第9条:
【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws 往上抛出。
正例:logger.error("inputParams: {} and errorMessage: {}", 各类参数或者对象 toString(), e.getMessage(), e);
4.异常日志>日志规约>第12条:
【推荐】可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。如非必要,请不要在此场景打出 error 级别,避免频繁报警。
说明:注意日志输出的级别,error 级别只记录系统逻辑出错、异常或者重要的错误信息。
|
2023-03-05 00:15:01 +08:00 |
|
Charles7c
|
47fa1422bb
|
优化:基于阿里巴巴 Java 开发手册(黄山版)优化部分变量和方法命名
1.编程规约>命名风格>第14条:
【推荐】在常量与变量命名时,表示类型的名词放在词尾,以提升辨识度。
正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT
反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD
2.编程规约>命名风格>第19条:
【参考】各层命名规约:
A)Service / DAO 层方法命名规约:
1)获取单个对象的方法用 get 做前缀。
2)获取多个对象的方法用 list 做前缀,复数结尾,如:listObjects
3)获取统计值的方法用 count 做前缀。
4)插入的方法用 save / insert 做前缀。
5)删除的方法用 remove / delete 做前缀。
6)修改的方法用 update 做前缀。
个人理解及应用 🔥:
1)在变量命名方面:
a)方法体内局部变量,命名时表示类型的名词放在词尾,以提升辨识度;
正例:nameList、nameArr。
b)方法声明上参数(局部变量),命名时尽量采用复数形式,以和方法名保持一致;
正例:List<String> listNameByIds(List<Long> ids);
c)成员变量,命名时尽量采用复数形式。
2)在方法命名方面:
a)CRUD 类方法可以简化命名;
正例:UserService:page、list、add、update、delete...;
说明:UserService 是围绕 User 为核心的业务接口,简化命名的方法也很容易理解操作的是什么。
b)其他方法,查询信息名词采用单数(与其纠结单数、复数,那就用单数,简单粗暴一点),以上述第2条要求为命名前缀。
正例:RoleService:listNameByIds(根据 ID 查询名称列表)
RoleService:listRoleCodeByUserId(根据用户 ID 查询角色编码列表)
UserRoleService:listRoleIdByUserId(根据用户 ID 查询角色 ID 列表)
UserService:getByUsername(根据用户名查询用户)
|
2023-03-04 23:03:33 +08:00 |
|
Charles7c
|
25f6e3402b
|
优化:优化使用 MyBatis Plus ChainWrapper 的方式
|
2023-03-04 17:38:10 +08:00 |
|
Charles7c
|
304615ea23
|
优化:优化部分 @Query 的使用
|
2023-03-04 16:41:31 +08:00 |
|
Charles7c
|
89a327920e
|
优化:基于阿里巴巴 Java 开发手册(黄山版)优化常量
1.编程规约>常量定义>第1条:
【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
|
2023-03-04 14:35:45 +08:00 |
|
Charles7c
|
4779d77265
|
优化:基于阿里巴巴 Java 开发手册(黄山版)优化方法排序及访问权限修饰符
1.编程规约>OOP规约>第20条:
【推荐】当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读,
此条规则优先于下一条。
2.编程规约>OOP规约>第21条:
【推荐】类内方法定义的顺序依次是:公有方法或保护方法 > 私有方法 > getter / setter 方法。
说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设
计模式”下的核心方法;而私有方法外部一般不需要特别关心,是一个黑盒实现;因为承载的信息价值较低,所有
Service 和 DAO 的 getter / setter 方法放在类体最后。
3.编程规约>OOP规约>第26条:
【推荐】类成员与方法访问控制从严:
1)如果不允许外部直接通过 new 来创建对象,那么构造方法必须是 private。
2)工具类不允许有 public 或 default 构造方法。
3)类非 static 成员变量并且与子类共享,必须是 protected。
4)类非 static 成员变量并且仅在本类使用,必须是 private。
5)类 static 成员变量如果仅在本类使用,必须是 private。
6)若是 static 成员变量,考虑是否为 final。
7)类成员方法只供类内部调用,必须是 private。
8)类成员方法只对继承类公开,那么限制为 protected。
说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦。思考:如果是一个
private 的方法,想删除就删除,可是一个 public 的 service 成员方法或成员变量,删除一下,不得手心冒点汗吗?
变量像自己的小孩,尽量在自己的视线内,变量作用域太大,无限制的到处跑,那么你会担心的。
|
2023-03-04 10:41:43 +08:00 |
|
Charles7c
|
6da85463c9
|
优化:基于阿里巴巴 Java 开发手册(黄山版)优化部分空集合处理
1.编程规约>集合处理>第7条:(个人理解:emptyList() 固然可以减少资源浪费,但未来由于不确定的需求变更,一旦增删元素必然会引发异常)
【强制】Collections 类返回的对象,如:emptyList() / singletonList() 等都是 immutable list,不可
对其进行添加或者删除元素的操作。
反例:如果查询无结果,返回 Collections.emptyList() 空集合对象,调用方一旦在返回的集合中进行了添加元素的操
作,就会触发 UnsupportedOperationException 异常。
2.编程规约>集合处理>第17条:
【推荐】集合初始化时,指定集合初始值大小。
说明:HashMap 使用构造方法 HashMap(int initialCapacity) 进行初始化时,如果暂时无法确定集合大小,那么指
定默认值(16)即可。
正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loaderfactor)默认为 0.75,如果
暂时无法确定初始值大小,请设置为 16(即默认值)。
反例:HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素增加而被迫不断扩容,resize() 方法
总共会调用 8 次,反复重建哈希表和数据迁移。当放置的集合元素个数达千万级时会影响程序性能。
|
2023-03-03 23:41:01 +08:00 |
|
Charles7c
|
1257a4bc35
|
优化:基于阿里巴巴 Java 开发手册(黄山版)优化常量及包命名
1.编程规约>常量定义>第4条:
【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。
说明:大而全的常量类,杂乱无章,使用查找功能才能定位到要修改的常量,不利于理解,也不利于维护。
正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 SystemConfigConsts 下。
2.编程规约>常量定义>第5条:
【推荐】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常
量、类内共享常量。
1)跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下。
2)应用内共享常量:放置在一方库中,通常是子模块中的 constant 目录下。
反例:易懂常量也要统一定义成应用内共享常量,两个程序员在两个类中分别定义了表示“是”的常量:
类 A 中:public static final String YES = "yes";
类 B 中:public static final String YES = "y";
A.YES.equals(B.YES),预期是 true,但实际返回为 false,导致线上问题。
3)子工程内部共享常量:即在当前子工程的 constant 目录下。
4)包内共享常量:即在当前包下单独的 constant 目录下。
5)类内共享常量:直接在类内部 private static final 定义。
|
2023-03-03 22:34:19 +08:00 |
|
Charles7c
|
d4fd76dcc1
|
重构:🔥 重构查询树列表相关 API,并抽取到后端 CRUD 公共组件中
1.基于 Hutool TreeUtil 重构查询树列表相关 API
2.抽取查询树列表 API 到后端 CRUD 公共组件中,大大简化部门管理和菜单管理部分代码
|
2023-02-27 22:03:27 +08:00 |
|
Charles7c
|
6723903c62
|
优化:优化部分空集合返回
|
2023-02-26 23:39:41 +08:00 |
|
Charles7c
|
03b57fb021
|
优化:🔥 深度优化后端 CRUD 公共组件,并抽取前端下载功能到 CRUD 公共组件
1. 后端抽取导出功能到 CRUD 公共组件
2. 查询列表及导出接口支持排序参数
3. 深度优化 BaseServiceImpl 中的 CRUD 公共实现
4. 前端抽取公共下载组件
5. 优化部分细节并修复部分错误
|
2023-02-13 21:15:06 +08:00 |
|
Charles7c
|
ebc7c2b3b0
|
优化:基于 ESLint 和阿里编码规约插件对部分代码规范进行优化
|
2023-02-10 20:45:15 +08:00 |
|
Charles7c
|
ceba8e9e53
|
新增:新增系统管理/部门管理/导出功能(引入 Easy Excel 依赖用于导出 Excel,详情可见 README 介绍。另请注意:测试导出功能时,前端需要关闭 mockjs,否则 responseType 会被 mockjs 设置为 '',导致导出的文件无法打开)
|
2023-02-06 23:02:23 +08:00 |
|
Charles7c
|
21fe29b56f
|
优化:优化日志表结构(新增 module 所属模块字段);优化日志引擎部分代码;使用 defaultIfNull() 和 blankToDefault 替换部分三元运算符代码(便于阅读及理解);将 BaseEntity 重命名为 BaseDO
|
2023-01-31 20:29:48 +08:00 |
|
Charles7c
|
d7851bc811
|
重构:初步封装后端 CRUD 公共组件(BaseController、BaseService、BaseServiceImpl)
|
2023-01-29 23:40:29 +08:00 |
|
Charles7c
|
dab3e597c2
|
优化:优化部分校验类型(业务验证迁移到 Service 层,使用 CheckUtils 来验证)
|
2023-01-25 23:07:25 +08:00 |
|
Charles7c
|
922b28126b
|
新增:新增系统管理/部门管理/新增功能
|
2023-01-24 01:14:48 +08:00 |
|
Charles7c
|
3116fd3eae
|
新增:新增系统监控/在线用户功能,并优化部分注释规范
|
2023-01-21 14:15:00 +08:00 |
|
Charles7c
|
185b79320f
|
优化:优化校验器相关方法名
|
2023-01-21 12:09:49 +08:00 |
|
Charles7c
|
c57383abad
|
新增:新增系统监控/登录日志功能,优化日志表结构,并新增记录错误信息(非未知异常不记录异常详情,只记录错误信息)
|
2023-01-17 23:16:37 +08:00 |
|
Charles7c
|
aa726fc6b6
|
新增:新增系统监控/操作日志功能,优化日志表结构
|
2023-01-16 23:00:54 +08:00 |
|
Charles7c
|
f4ea2d44d6
|
新增:个人中心新增查询操作日志功能,优化日志表结构,并支持关闭记录内网 IP 操作
|
2023-01-16 00:18:53 +08:00 |
|
Charles7c
|
8b82557883
|
新增:新增修改邮箱功能,并优化部分以往代码(引入 spring-boot-starter-mail 用于发送邮件验证码)
|
2023-01-14 01:05:39 +08:00 |
|
Charles7c
|
a08fd7773e
|
新增:新增修改密码功能,并优化部分以往代码
|
2023-01-10 23:25:58 +08:00 |
|
Charles7c
|
5252c54c48
|
新增:新增上传头像 API,采用本地存储方式存储头像
|
2023-01-05 22:32:23 +08:00 |
|
Charles7c
|
abff6f997a
|
升级:升级 MyBatis Plus 版本为 3.5.3.1,升级 Hutool 版本为 5.8.11(已将 ServletUtils.getHeadersMap(HttpServletResponse) PR 到了 Hutool,详情见:dromara/hutool#2828)
|
2023-01-02 11:09:11 +08:00 |
|
Charles7c
|
21f5aceccf
|
优化:使用枚举存储性别、状态等信息(采用 MyBatis Plus#通用枚举扩展),常量类则专注于存储全局变量,例如:缓存键、默认值等
|
2023-01-02 00:19:56 +08:00 |
|
Charles7c
|
d9a48f7a95
|
修复:修复生产环境报 java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple 的错误问题(移除 Sa-Token 集成 Redis 依赖,改为本地 Redis 适配 SaTokenDao)
|
2022-12-28 23:32:05 +08:00 |
|
Charles7c
|
727850933f
|
新增:新增系统监控模块(存放系统监控模块相关功能,例如:日志管理、服务监控等),新增操作日志引擎,记录 HTTP 请求信息
|
2022-12-25 13:16:15 +08:00 |
|
Charles7c
|
78e84e8941
|
完善:完善用户登录 API,优化部分包结构(引入 MyBatis Plus、多数据源、P6Spy、Liquibase 等依赖,详情可见 README 介绍)
|
2022-12-25 12:35:35 +08:00 |
|
Charles7c
|
00e2b44d0e
|
新增:新增用户登录和退出 API(引入 Sa-Token 依赖,详情可见 README 介绍)
|
2022-12-22 19:39:27 +08:00 |
|
Charles7c
|
1e5eaab9d3
|
新增:新增获取图片验证码 API(引入 Redisson、Hutool、Easy Captcha 依赖,详情可见 README 介绍)
|
2022-12-11 15:06:21 +08:00 |
|