1.创建项目
1.创建springboot 父工程 (放公共依赖)
2.创建子工程 点击项目右键module—>maven 起名common
创建子工程的子工程,删除所有不需要的src目录(和mould平级的删除)
3.子项目创建springboot启动类
2.使用gitee版本控制
- 创建查看
- 复制git链接
- 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.需要完成的任务
- 插入生成加密秘钥
hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis()+“”+random.nextInt(1000)));- 逻辑删除,搭建swagger环境
- 实现带条件的分页查询
如果没有条件需要 !StringUtils.isEmpty() 判空- 添加医院
1.设置签名秘钥使用MD5加密(时间戳和随机数串)- 根据id获取医院设置
- 批量删除医院
json [1,2]- 医院设置锁定和解锁(就是更新一个状态,是否可以使用医院接口)
- 发送签名秘钥
//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);
}