开发前请认真阅读本规范,严格遵循本规范进行开发。
本规范融合了公司编码规范和阿里最佳实践,要求所有项目组将本规范文件复制到项目根目录。
类注释
/*
* @类名: ${type_name}
* @描述: ${todo} 类的设计目的、功能及注意事项
* @版本: ${enclosing_type}
* @创建日期: ${date}${time}
* @作者: ${user}
* @JDK: 1.6
*
* @修改描述: ${todo} 请描述修改内容
* @版本: ${enclosing_type}
* @修改日期: ${date}${time}
* @修改人: ${user}
* @JDK: 1.6
*/
/*
* 类的横向关系:${todo} 说明与其它类的关联、调用或依赖等关系。
*/
方法注释
/*
* @描述: ${todo} 描述这个方法的功能、适用条件及注意事项
* @作者: ${user}
* @创建时间: ${date}${time}
*
* @修改描述: ${todo} 请描述修改内容
* @修改人: ${user}
* @修改时间: ${date}${time}
* ${tags}
* ${todo} 描述每个输入输出参数的作用、量化单位、值域、精度
*/
/*
* 处理逻辑:${todo} 给出核心方法的处理逻辑
* 线程安全设计:${todo} 如果该方法涉及多线程调用,需给出线程安全设计
* 异常处理设计:${todo} 给出异常处理设计的考虑及异常处理流程
*
*/
HTML/CSS/JS文件注释
/*
* @描述: 全局配置
* @版本: v1.0
* @创建日期: 2022年3月4日17:19:14
* @作者: XXX
*/
<!--
* @描述: 星地资源管理软件布局文件,嵌套路由的第一级容器
* @版本: v1.0.0
* @创建日期: 2022年3月4日17:25:45
* @作者: XXX
-->
方法注释
/*
* @描述: 描述这个方法的功能、适用条件及注意事项
* @作者: XXXX
* @创建时间: 2022年3月9日11:43:11
* @参数:param1 描述
* param2 描述
*/
【约定】主要分支作用说明:
master:主分支,用于对外发布,可用于生产 develop:开发分支,基于master,编码工作在此分支进行 release:测试分支,基于develop,测试阶段测试及小问题修复在此进行,测试完成后,更新版本号,合并回develop feature:功能特征分支,基于develop分支,用于合作功能特性开发 hotfix:热修复分支,基于master分支,紧急修复对外版本缺陷,修复后更新版本号,合并到master和develop
【强制】原则上完成一个完整功能并自测无异常后,方可检入代码,必须保证无编译报错
【强制】提交代码必须写注释,能够完整描述本次提交变更的内容
注释格式:提交类型:提交标题+内容 (如:fix: 修复用户模块启动问题)
提交类型参考以下几种:
- feat: 功能代码
- fix: bug修复
- docs: 文档修改
- style: 代码格式修改;
- refactor: 重构代码;
- test: 测试代码相关;
- log: 日志相关
- db: 数据库相关
- config: 配置相关
- build/shell: 脚本、打包编译相关
- other: 其他,如配置修改,完善等;
目前项目主要使用MySQL8.0,各列项主要适用于MySQL相关规范。
【强制】使用InnoDB存储引擎
InnoDB存储引擎是MySQL默认存储引擎,支持事务和行级锁,并发性能更好,CPU及内存缓存页优化使得资源利用率更高
【强制】MySQL8中,使用默认字符集utf8mb4,比较规则(collation)默认为utf8mb4_0900_ai_ci
万国码,无需转码,无乱码风险。utf8mb4向下兼容utf8,如果有字段需要存储emoji表情之类的,则字段或表必须设置成utf8mb4
比较规则(collation)默认为utf8mb4_0900_ai_ci,官方宣称有性能优化
【强制】MySQL8中,行格式为 DYNAMIC 或者 COMPRESSED 情况下,需要索引的字段(如主键),最大字节不可超过3072byte。
注意utf8mb4格式的varchar的主键长度最大为3072/4=768
另外两种行格式,限制字节数768,utf8mb4格式下字段最长为767/4=191
【强制】数据表、数据字段必须加入中文注释
便于识别表和字段的用途
类status型需指明主要值的含义,如”0-离线,1-在线”
【推荐】适度使用存储过程、视图,禁止使用触发器、事件
【强制】所有表都必须要显式指定主键
【强制】禁止数据库中存储图、文件等大数据
大文件和照片存储在文件系统,数据库里存URI即可
【强制】数据库设计遵循流程:概念模型 --> 物理模型 --> 数据库
概念模型视情况是否必须,否则其他一切涉及数据库的修改,必须有对应的物理模型变更。
避免因为MySQL数据大小写敏感配置导致的影响,同时也是mysql的通用规范
【强制】库名、表名、字段名禁止超过32个字符。须见名知意
【强制】临时库、表名必须以tmp为前缀,并以日期为后缀
【强制】备份库、表必须以bak为前缀,并以日期为后缀
【强制】库名、表名、字段名:小写字母,下划线风格,禁止数字开头,禁止两个下划线中间只出现数字,禁止复数名词。
正例:getter_admin,task_config,level3_name 反例:GetterAdmin,taskConfig,level_3_name
【强制】库名、表名、字段名禁止使用MySQL保留字,为避免与保留字冲突,单个单词应加下滑线后缀
正例:type_ 反例:type
【强制】索引命名:主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名。
说明:pk_ 即primary key;uk_ 即 unique key;idx_ 即index的简称。 主要的几种索引类型:
普通索引、唯一索引、主键索引、组合索引、全文索引
【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
【强制】作为查询条件的字段,一律需要建立索引。
【推荐】避免直接 SELECT * 读取全部字段
减少网络带宽消耗,能有效利用覆盖索引,表结构变更对程序基本无影响
Mybatis中通过使用<sql>标签减少重复的sql语句
【强制】代码中书写的SQL语句要求SQL关键字全部大写,表名和字段名小写
包命名规范
代码命名规范
分层规范
配置文件规范
【强制】应用服务内部用实体DO,服务与服务之间的调用使用Dto,前后端交互使用Vo
【强制】所有接口必须有返回内容,不可使用void
考虑接口失败场景
【强制】Controller层做参数格式的转换,不允许把json,map这类对象传到services去,也不允许services返回json、map
增强可读性,也尽力避免参数字段使用json格式
【注意】使用@ApiModelProperty注解的字段,类型如果为数字类型,需要设置example内容
如:@ApiModelProperty(value="年龄", example = "1")
例:应用名:表名/实体名:id:其他 ——
info:satellite:1:name
【推荐】hash存储,field的命令方式:标识名称:唯一性标识
【推荐】保证语义的前提下,控制key的长度
当key较多时,内存占用也不容忽视,例如:
user:{uid}:friends:messages:{mid}
可简化为u:{uid}:fr:m:{mid}
【强制】: 不要包含特殊字符
反例:包含空格、换行、单双引号以及其他转义字符
【强制】:拒绝bigkey
string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000
【推荐】:控制key的生命周期,业务相关数据必须设置TTL
使用expire设置过期时间(条件允许可以打散过期时间,防止集中过期),不过期的数据重点关注idletime
object idletime命令,通过系统当前时间-lru时间,得到键多久没有被访问的秒数。
【推荐】避免多个应用使用一个Redis实例
正例:不相干的业务拆分,通过内部服务调用获取数据
【强制】禁止操作非当前业务模块的缓存数据
【推荐】设置合理的密码,如有必要可以使用SSL加密访问
【强制】Logger的获取方式两种:
- 类使用 @Slf4j 注解
- 使用slf4j提供的Logger,LoggerFactory类,如:
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
【强制】业务关键环节必须打印日志
【推荐】大部分日志在service中打印
controller层的接口调用日志AOP会打印
【强制】error级别以上的日志,必须记录关键业务信息,如方法的入参,错误发生时的变量现场,以便回溯追踪问题
【强制】禁止打印密码等敏感信息
【强制】禁止使用 e.printStackTrace();
使用
log.warn/error("xxxxx",e);