技术团队开发规范

2020-08-05

本规范作用,促进团队合作,降低维护成本,提高团队开发效率。

适用范围,Web技术团队:后端程序员,前端程序员。

代码审查不以代码量为目的,请写出简洁,优雅,结构清晰的代码。

1.统一开发环境

操作系统:

​ 开发机:Windows 7 或 Windows 10

​ 服务器:Ubuntu 16.04

Java版本: JDK 1.8.0_26x

Java框架:Spring Boot 2.2.x、MyBatis

PHP版本:5.6.x

PHP框架:ThinkPHP 5.1.x

依赖管理:Maven 3.6.x

前端框架:Vue 2.x、Node 12.18.x

数据库:MySQL 5.7 存储引擎:InnoDB

中间件:Redis 6.x

代码库管理:Git

2.技术规范细节

2.1 前后分离

为保证开发进度和可复用性,整体项目采用前后分离并行开发。

2.2 上传资源分离

客户上传文件与项目分离,比如用户上传的文件,使用单独服务器接收,数据库只保存文件相对路径。

2.3 前端

浏览器兼容,须支持主流浏览器,IE9+。

静态文件均归档至约定的目录中。

字符编码统一指定为’UTF-8’。

尽可能组件化开发,降低代码量,提高复用率。

2.4 并发性能

项目需承受一定并发能力,需对关键接口做并发测试。

热点数据做缓存处理,且要考虑数据一致性。

内存、连接池、锁等系统资源及时释放。

接口做幂等处理。

2.5 微服务

如果技术允许,可采用微服务架构。

2.6 安全

接口处做入参检查,防止SQL注入。

一些关键业务接口如短信发送,须做机器防刷机制。

源码保证可编译的情况下,每天定时提交。

数据库连接信息不可外泄,由专人管理。

数据库用户密码等关键数据需做加密处理,不可明文保存。

2.7 命名

命名具有语义化,PHP项目遵循PSR-2代码规范。

类名规范:首字符大写,后面每个单词首字母大写(大驼峰式)。

变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。

方法名规范:同变量名。

文件命名:同类名。

数据库命名:数据库命名的时候尽量保证数据库的名称和项目工程的名称一致,全部使用小写字母,数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头。

2.8 注释

每个功能函数、方法、接口、类都要有对应注释,各个关键业务代码段,也需注释。

2.9 数据库

数据库设计满足数据库三范式

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余;

没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

正确认识数据冗余

主键与外键在多表中的重复出现, 不属于数据冗余。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

例:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

使用“三少原则”防止数据库打补丁式设计

一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E-R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;

一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;

一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促设计者学会将主表中的一部分内容拉出去,另外单独建一个子表;

适当使用索引,合理使用联合索引

省市区、经纬地图坐标统一

省市区参考全国统计用区划代码和城乡划分代码

2.10 日志

JAVA服务端日志使用lombok->Slf4j注解,存放至:/var/log/spring/项目名/模块名.log。

PHP服务端日志统一存放在 项目路径/runtime/log/ 下。

2.11 JAVA

善用lombok简化代码量。

统一入参处理,使用 jsr 303 规范验证入参。

统一异常处理。

统一分页处理。

2.12 接口

统一接口返回结构(Java可使用mtool工具类):

{
  "code": 200,
  "message": "success",
  "data": Object
}

code: 返回状态码

参考 RFC 2616 规范

  code区间 类型 含义
1** 100-199 信息 服务器接收到请求,需要请求者继续执行操作
2** 200-299 成功 请求被成功接收并处理
3** 300-399 重定向 需要进一步的操作以完成请求
4** 400-499 客户端错误 请求包含语法错误或无法完成请求
5** 500-599 服务器错误 服务器在处理的时候发生错误

message:状态描述

data: 返回数据,数据类型根据实际项目约定。