Browse Source

更新 '开发文档.md'

root 4 years ago
parent
commit
1e30324c07
1 changed files with 113 additions and 1 deletions
  1. 113 1
      开发文档.md

+ 113 - 1
开发文档.md

@@ -90,10 +90,13 @@ com.miaxis
 
 ![Image text](img/gen-gen.jpg)
 
-解压后可以看到代码生产结果,然后拷贝到项目中对应的文件夹即可——main是java代码,vue是前端代码,deptMenu.sql是在菜单表中添加一条菜单数据,后端而言,可以直接复制整个main文件夹到我们项目模块src下
+解压后可以看到代码生产结果,然后拷贝到项目中对应的文件夹即可——main是java代码,vue是前端代码,deptMenu.sql是在菜单表中添加一条菜单数据,后端而言,可以直接复制整个main文件夹到我们项目模块src下,并且将controller 剪切到 admin 模块中
 
 ![Image text](img/gen-zip.jpg)
 
+如果该表是实体表,在前端有相应的列表,则需要将xxxMenu.sql在数据库中执行,即可以把相应的菜单按钮权限等数据写入数据库(这样可以不用在后台管理系统中去手动添加)
+
+
 到此,基本的增删改查代码已经生成。
 
 3. swagger文档使用
@@ -114,3 +117,112 @@ com.miaxis
 
 ![Image text](img/login-after.png)
 
+
+# 后端开发规范
+1. 命名规范
+* 命名使用英文词组合,使用驼峰式,严禁使用中文拼音或拼音首字母组合命名(专有名词例外) 如: OrganizationTreeNode, OrganizationVO, OrganizationDTO, 常量应该用全大写,下划线命名,如: APP_SECRET
+* Controller, Service, Mapper统一添加到对应分层目录
+* 接口实现类添加Impl后缀标识
+* 枚举类添加Enum后缀标识
+* 接口api路径,使用restful风格命名规范,简单来说,url上不允许出现动词,只能使用名次,动作由请求方式来制定:GET-获取 POST-新增
+PUT-更新 DELETE-删除(可以参考代码生成器生成的代码)
+
+2. 返回值类型Response<T> ,泛型T一定要指定类型,否则swagger无法识别返回值具体数据格式以及注解,如
+```java
+@GetMapping(value = "/{id}")
+@ApiOperation("获取电子教学日志详细信息")
+public Response<TMClassRecordDetail> getInfo(
+        @ApiParam(name = "id", value = "电子教学日志参数", required = true)
+        @PathVariable("id") Long id
+){
+    return Response.success(tMClassRecordDetailService.getById(id));
+}
+
+```
+3. 异常
+Controller层,可直接使用Response.error ,重载了多个方法,根据具体情形使用
+```java
+@Log(title = "电子教学日志", businessType = BusinessTypeEnum.INSERT)
+@PostMapping
+@ApiOperation("新增电子教学日志")
+public Response<Integer> add(@RequestBody TMClassRecordDetail tMClassRecordDetail){
+    if (tMClassRecordDetail == null){
+        return Response.error();
+    }
+    return toResponse(tMClassRecordDetailService.save(tMClassRecordDetail) ? 1 : 0);
+}
+
+
+```
+service层,若有运行时异常,无需捕获,直接抛出自定义异常,如业务异常:CustomException,统一由全局 异常处理器GlobalExceptionHandler 进行处理,例子如下:
+
+```java
+private void validateCode(String principal, String credential) {
+    if (StringUtils.isEmpty(credential)){
+        throw new CustomException("验证码不能为空");
+    }
+    String cacheCode = (String) redisTemplate.opsForValue().get(RedisPrefixUtils.getSmsKeyPrefix("login", principal));
+    if (StringUtils.isEmpty(cacheCode)){
+        throw new CustomException("验证码已过期,请重新发送");
+    }else if (!credential.equals(cacheCode)){
+        throw new CustomException("验证码不正确");
+    }
+}
+
+```
+4. 枚举类
+原则上,代码中不应该出现魔法数字,比如下面代码
+```java
+if (type == 1){
+   xxx
+}
+```
+正确做法应该新建一个枚举类,如
+```java
+public enum UserStatusEnum
+{
+    OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除");
+
+    private final String code;
+    private final String info;
+
+    UserStatusEnum(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}
+```
+
+使用的时候
+```java
+if (type == UserStatusEnum.OK.getCode()){
+   xxx
+}
+```
+
+5. 入参,出参 ,如果传入参数与实体字段相差较大,可以新建DTO对象,DTO 意思为数据传输对象,包含了出参,入参,如果为了区分,也可以把入参命名为DTO,返参命名为VO
+```java
+@PostMapping("/login")
+@ApiOperation("系统-登录方法")
+public Response<TokenDTO> login(@RequestBody LoginBody loginBody)
+{   TokenDTO tokenDTO = new TokenDTO();
+    // 生成令牌
+    String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+            loginBody.getUuid());
+    tokenDTO.setToken(token);
+    return Response.success(tokenDTO);
+}
+```
+
+