2.MidBook经验之MybatisPlus

1.创建项目

1.创建springboot 父工程 (放公共依赖)
2.创建子工程 点击项目右键module—>maven 起名common
创建子工程的子工程,删除所有不需要的src目录(和mould平级的删除)
3.子项目创建springboot启动类

2.使用gitee版本控制

  1. 创建查看
  2. 复制git链接
  3. idea提交仓库 VCS–>import into —>createGit rep–>选择文件夹(!!!记住是空文件夹,比如commit失败)–>yes
    右键项目 git–>add提交到本地, -->repository–>remotes设置复制的远程地址
    右键项目 git–>commit dir–>加msg–>commit and push提交代码

3.mp也有service和serviceImpl需要继承,因为mapper继承了,其他方法要调用直接mp帮我们注入

4.找不到bean mapperScan注解可以写在配置类(@Configuration)上 也可以写在启动类上

5.删除 delete无法直接删除(测试失败),需要配合swagger测试

@DeleteMapping("{id}") 
@Configuration
@EnableSwagger2
public class Swagger2Config {

    @Bean
    public Docket webApiConfig(){

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("webApi")
                .apiInfo(webApiInfo())
                .select()
                //只显示api路径下的页面
                .paths(Predicates.and(PathSelectors.regex("/api/.*")))
                .build();

    }

    @Bean
    public Docket adminApiConfig(){

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("adminApi")
                .apiInfo(adminApiInfo())
                .select()
                //只显示admin路径下的页面
                .paths(Predicates.and(PathSelectors.regex("/admin/.*")))   //我觉得非常必要的功能就是把在这个admin路径下面的接口全部显示出来
                .build();

    }

    private ApiInfo webApiInfo(){

        return new ApiInfoBuilder()
                .title("网站-API文档")
                .description("本文档描述了网站微服务接口定义")
                .version("1.0")
                .contact(new Contact("aaa", "http://aaa.com", "[email protected]"))
                .build();
    }

    private ApiInfo adminApiInfo(){

        return new ApiInfoBuilder()
                .title("后台管理系统-API文档")
                .description("本文档描述了后台管理系统微服务接口定义")
                .version("1.0")
                .contact(new Contact("aaa", "http://aaa.com", "[email protected]"))
                .build();
    }


}

6.微服务项目想要不同模块引入swagger 可以扫描相同的包来引入

  @ComponentScan(basePackages="top.jams")
  @Api()
  @ApiOperation()
  @ApiParam
   //ui中发送json数据 swagger有模板直接点击即可

7.统一返回结果(每个controller都返回相同 Result对象),方便管理

8.需要完成的任务

  1. 插入生成加密秘钥
    hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis()+“”+random.nextInt(1000)));
  2. 逻辑删除,搭建swagger环境
  3. 实现带条件的分页查询
    如果没有条件需要 !StringUtils.isEmpty() 判空
  4. 添加医院
    1.设置签名秘钥使用MD5加密(时间戳和随机数串)
  5. 根据id获取医院设置
  6. 批量删除医院
    json [1,2]
  7. 医院设置锁定和解锁(就是更新一个状态,是否可以使用医院接口)
  8. 发送签名秘钥
    //TODO 发送短信 代表以后要完善的地方

9.为了前端方便,当传数据为空的时候我们controller使用

  @PostMapping("")   //没有这个@RequestBody不生效
    配合 @RequestBody(required=false)   User u 前端使用json传过来在参数中使用(可为空)

10.全局异常处理(前端直接显示500页面对用户很不友好) 直接给json数据提示有异常

   @ControllerAdvice   //controller的过滤 aop
    class xx{
         //返回json数据
         @ExceptionHandler(Exception.class)  //捕获到的异常类型
         @ResponseBody
         public Result error(Exception e){
                 e.print...;
                  return Result.fail();
         }
@ExceptionHandler(MyException.class)  //捕获自定义的异常类型,需要手动抛出异常
         @ResponseBody
         public Result error(Exception e){
                 e.print...;
                  return Result.fail();
         }
 
    }
//自定义异常
@Data
@ApiModel(value = "自定义全局异常类")
public class HospitalException extends RuntimeException {

    @ApiModelProperty(value = "异常状态码")
    private Integer code;

    /**
     * 通过状态码和错误消息创建异常对象
     * @param message
     * @param code
     */
    public HospitalException(String message, Integer code) {
        super(message);
        this.code = code;
    }

    /**
     * 接收枚举类型对象
     * @param resultCodeEnum
     */
    public HospitalException(ResultCodeEnum resultCodeEnum) {

        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }

    @Override
    public String toString() {
        return "HospitalException{" +
                "code=" + code +
                ", message=" + this.getMessage() +
                '}';
    }
}
  			if(1==1){
                throw new HospitalException("不能为空",500);
             }

11.!!!统一日志管理(之前linux 每次日志生成在jar包的当前文件夹,或者docker 里面操作生成日志困难)

 //日志等级(高的可以看到低的日志) 低到高  OFF FATAL ERROR WARN INFO DEBUG ALL
//springboot默认只打印INFO及以上的消息
    //记得注释 logging.level.root=WARN(这个是在控制台调试使用) !!!先创建文件夹
//怎么把日志输出到硬盘指定位置,springboot默认Logback日志 在resources放xml文件可配置路径
<property name="log.path" value="D://aa">
 //输出3个文件,!!!直接对日志进行分级

12.要修改数据 就先得到数据后修改

13.可不用指定名字

@PathVariable long current,

14.查询使用多个Vo对象来代表查询条件

 @PostMapping("findPageHospSet/{current}/{limit}")
    public Result findPageHospSet(@PathVariable long current,
                                  @PathVariable long limit,
                                  @RequestBody
(required = false) HospitalSetQueryVo hospitalSetQueryVo)

15.分页

@ApiOperation("分页查询医院设置")
    @PostMapping("findPageHospSet/{current}/{limit}")
    public Result findPageHospSet(@PathVariable long current
                                , @PathVariable long limit
                                , @RequestBody (required = false)HospitalSetQueryVo vo){
        Page<HospitalSet> setPage = new Page<HospitalSet>(current,limit);

        QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
        //得到医院名字
        String hosname = vo.getHosname();
        //得到医院编号
        String hoscode = vo.getHoscode();
        if(!StringUtils.isEmpty(hosname)){ //对必须要查询的搜索框判空
            wrapper.like("hosname",vo.getHosname());
        }
        if(!StringUtils.isEmpty(hoscode)){
            wrapper.like("hoscode",vo.getHoscode());
        }


        Page<HospitalSet> page = hospitalSetService.page(setPage,wrapper);

        return Result.ok(page);




    }

你可能感兴趣的:(MidBook项目经验,项目经验)