规范
- 第一次项目结束总结.一定会有错误的地方.希望以后得到补充。
- 好的规范是一个顺利维护的基础
- 未来开发最好采用Scrum(敏捷开发)+瀑布模型的方式
- 先拟定文档
- 快速迭代
- 拥抱变化
- 加强沟通(前后端)
命名规范
- 忘记中文、忘记拼音
- 见名知意
- 类名大驼峰,其它小驼峰
- 大驼峰:每个单词首字母大写 eg: UserController
- 小驼峰:除了首单词全小写,其它单词首字母大写。 eg: selectUserInfo
- 缩写只能用大家约定熟成的。eg: UserDao(Dao 数据持久层)
- 接口命名尽量简短、且全小写
- 忘记中文、忘记拼音
注释规范
类注释、方法功能注释
- 用文档注释/** */ 方便自动导出注解文档
- 类和方法定义好时就加上注释,后面细节写到就补充。避免最后再写忘记细节或者甚至忘记注释
方法内部注释
- 用文本注释// 或者 /* */
Pom注释
-
每个特殊依赖都要特殊注解其功能
<!--pagehelper--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency>
-
插件也要注解其功能
<!-- mybatis generator 自动生成代码插件 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> </plugin>
-
可以的话导出文件名、打包类型都加点注解
配置文件注解
# 驱动配置信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver
#连接池的配置信息
## 初始化大小,最小,最大
spring.druid.initialSize=5
spring.druid.minIdle=5
spring.druid.maxActive=20
错误代码、功能修改时,不要全删除,用//注释掉就好
文件层次规范
SpringBoot 包层次规范(暂时只会这个,可能有些不对)
-
cn.cafuc.flyeat.xxx.src.main(xxx项目名,源码文件)
-
aop
- 说明
-
bean
- 自定义bean
- ResultBean web层返回统一对象
- Page 分页对象,封装常用的具体参数
- PageResultBean web层返回统一的分页查询对象
- 自定义bean
-
controller
-
控制层
-
我理解的Controller就是一个数据交换层,拿前端的数据然后给Srevice处理。拿到Service处理后的数据再给前端。
-
所有Controller层应该只出现数据的传输,不设计数据的处理。
-
失败案例(BM)
/** * 新建楼栋 * 留给内部第一次导入数据时用 * 后期加权限的时候注意区分 * @param buildNum * @param floorNum * @param region * @param roomNum * @param bunkNum * @return */ @GetMapping("/create") public ResponseBean creatBuild(String buildNum,int floorNum,String region,int roomNum,int bunkNum){ //学校的楼栋信息应该不存在加高的可能,所以未进行相应的逻辑判断 buildNum=buildNum.toUpperCase(); if(buildService.getBuilding(buildNum)!=null)return new ResponseBean(400,"building is repeat",null); Building building=new Building(); /*Room room=new Room(); Bunk bunk=new Bunk();*/ ///这两句不能写在外面,不然会报duplicate entry 1 for key primary 错,错误原因不详。 building.setBuildingNumber(buildNum); building.setNumberOfFloor(floorNum); // building.setRegion(region==("西"||"西区")?false:true);//西区为0东区为1 if(region.equals("西")||region.equals("西区")){ building.setRegion(false); }else building.setRegion(true); buildService.insert(building); building=buildService.getBuilding(buildNum); // System.out.println(building); for (int i=1;i<=floorNum;i++){ for(int j=1;j<=roomNum;j++){ Room room=new Room(); room.setBuildingId(building.getBuildingId()); room.setRoomNumber(String.valueOf(i*100+j)); room.setFloorNumber(i); room.setNumberOfBunk(bunkNum); roomService.insert(room); room=roomService.getRoomIdByNum(building.getBuildingId(),String.valueOf(i*100+j)); for(int k=1;k<=bunkNum;k++){ Bunk bunk=new Bunk(); bunk.setBunkNumber(String.valueOf(k)); bunk.setRoomId(room.getRoomId()); bunk.setIsEmptyBunk(true); bunkService.insert(bunk); } } } return new ResponseBean(200,"success",null); }
-
基本正确示范(问题就是确实对返回数据类型的封装,Controller应该不需要知道业务返回逻辑)
/** * 新增器材信息 * 暂定留给管理员使用 * @param implement * @return */ @PostMapping("/add") public ResponseBean addImplement(@RequestBody Implement implement){ return new ResponseBean(200,"success",implementServices.insert(implement)); }
-
-
-
dao/mapper
-
数据持久层
-
错误示范
@Mapper public interface BunkMapper { int insert(Bunk record); List<Bunk> getByRoom(int roomId); int insertSelective(Bunk record); int getByRoomId(int roomId,String bunkNum); int empty(int roomId); //SQL多参传值的时候注意事项,原生Mybatis是要求这样 Bunk getBunk(@Param("roomId") int roomId,@Param("bunkNum") String bunkNum); int add(int id); Bunk getById(int id); int emptyByBunk(int id); int deleInfo(int id); }
-
应该算正确示范(最明显的问题暂缺事务处理。因为我还不会!)
@Mapper public interface ImplementMapper { /** * 新器材信息的插入 * @param record * @return */ int insert(Implement record); /** * 通过器材id精确查询 * @param id * @return */ Implement selectByPrimaryKey(int id); /** * 获取所有器材信息 * @return */ List<Implement> selectAll(); /** * 按照器材名字或者器材类别(是否是耗材)查询 * @param name * @param type * @return */ List<Implement> selectByNameOrType(@Param("name") String name, @Param("type") Boolean type); }
-
-
entity/model
- 实体类(对应数据库表)
- 自定义数据类型
-
exception(技术不足没写过)
- 自定义异常
-
service
-
业务层
-
错误不示范了。Services长得和Mapper一样 (我第一个项目遇到得这个问题。)
-
基本正确示范(伪代码形式,源代码太长了)
/** * 租借信息EXCEL导入功能 * @BelongsPackage:cn.cafuc.lis.Services.ServicesImpl * @Author:zzy */ @Service public class RentImport implements ImportService { @Resource ConsumableMapper consumableMapper; @Resource RentMapper rentMapper; /** * 租借信息导入 * @param fileName * @throws IOException * @throws InvalidFormatException */ @Override public List<XSSFRow> importRent(String fileName) throws IOException, InvalidFormatException { //大量EXCEL文件处理逻辑 if(row.isNotNull()&&info.isRight()){ setInfo(rent,row) }else{ addErrorInfo("错误详细信息",row,errorInfo); } return errorInfo; } private boolean setInfo(Rent rent, XSSFRow row) { for (int i = 1; i <= 7; i++) { boolean f = helpSet(rent, row, i); if (f == false) return false; } return true; } private boolean helpSet(Rent rent, XSSFRow row, int index) { if(row.infoIsRight()){ setIntoRentTable; return true; }else return false; } private XSSFRow addHead() { //错误信息导出表第一行逻辑处理 errorInfoFirstRowHandler; return row; } private void addErrorInfo(String errorInfo, XSSFRow row, List<XSSFRow> errorRow) { row.createCell(9).setCellValue(errorInfo); errorRow.add(row); } }
-
-
utils
- 自定义工具包
-
Application.java Springboot启动类
-
-
cn.cafuc.flyeat.xxx.main.resources 存放配置文件
- static
- 静态文件
- mapping/mapper
- Mybatis xml映射文件
- templaltes
- JSP页面
- Html页面
- static
处理规范
统一返回消息格式规范
1.设计返回对象
/**
* http请求返回的最外层对象
*/
@Data
public class Result {
//错误码
private int code;
//提示信息
private String msg;
//具体内容
private Object data;
}
/**
*下面这种写法也行
*/
@Data
public class Result<T> {
private int code;
private String msg;
private T data;
}
2.封装返回消息的格式(今天刚学到的,所以项目中未出现,但是感觉很对)
public class ResponseUtil{
public static Result success(Object object){
Result result=new Result();
result.setCode(0);
result.setMsg("成功");
result.setData(object);
return result;
}
public static Result success(){
return success(null);
}
public static Result error(Integer code,String msg){
Result result=new Result();
result.setCode(code);
result.setMsg(msg);
//这一步可以不写的
result.setData(null);
return result;
}
}
3.调用情况
/**
*伪代码,只描述情况
*这里用的第二种Result格式,方便他人知道返回对象的类型。
*/
public Result<Student> addStudent(Sudent student){
if(student.hasError()){
//错误返回其错误码和错误详细信息
return ResponseUtil.error(code,student.errorInfoHint);
}else{
return ResponseUtil.success(Student.info);
}
}
其他
- 在数据访问层处理异常(Dao/Mapper)和控制器中处理异常(Controller)。service中只抛出异常。