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