目录结构:
1、异常处理
自定义异常类GuliException:
/*自定义异常类*/
@Data
@AllArgsConstructor //生成有参构造函数
@NoArgsConstructor //生成无参构造函数
public class GuliException extends RuntimeException {
private Integer code; //状态码
private String msg; //异常信息
}
全局异常处理GlobalExceptionHandler:
@ControllerAdvice
@Slf4j //将错误日志输出到文件中
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody //为了显示数据
public R error(Exception e){
e.printStackTrace();
return R.error().message("执行了全局异常处理");
}
/*自定义异常*/
@ExceptionHandler(GuliException.class)
@ResponseBody //为了显示数据
public R error(GuliException e){
log.error(e.getMessage()); //将错误日志输出到文件中
e.printStackTrace();
return R.error().code(e.getCode()).message(e.getMsg());
}
}
2、MybatisPlus自动填充配置:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
/*注意,这里是属性名*/
this.setFieldValByName("gmtCreate",new Date(),metaObject);
this.setFieldValByName("gmtModified",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified",new Date(),metaObject);
}
}
3、Swagger配置:
@Configuration//配置类
@EnableSwagger2 //swagger注解
public class SwaggerConfig {
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
.paths(Predicates.not(PathSelectors.regex("/admin/.*")))
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build();
}
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
.title("网站-课程中心API文档")
.description("本文档描述了课程中心微服务接口定义")
.version("1.0")
.contact(new Contact("java", "http://atguigu.com", "1123@qq.com"))
.build();
}
}
4、全局时间格式配置
application.yml
#返回json的全局时间格式
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
实体类中的日期字段直接使用String类型,无需手动进行转化
@Data
public class TeacherQuery {
@ApiModelProperty(value = "教师名称,模糊查询")
private String name;
@ApiModelProperty(value = "头衔 1高级讲师 2首席讲师")
private Integer level;
@ApiModelProperty(value = "查询开始时间", example = "2020-01-01 10:10:10")
private String begin;//注意,这里使用的是String类型,前端传过来的数据无需进行类型转换
@ApiModelProperty(value = "查询结束时间", example = "2020-12-12 10:10:10")
private String end;
}
5、二级分类实现
/*查询分类数据*/
@Override
public List<SubjectQuery> getSubjects() {
//查询出所有记录
List<EduSubject> all = baseMapper.selectList(null);
List<SubjectQuery> subjectQueryList = new ArrayList<>();
QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
//查询出所有的一级分类
wrapper.eq("parent_id","0");
//所有的一级分类
List<EduSubject> list = baseMapper.selectList(wrapper);
list.forEach(i ->{ //遍历一级分类
SubjectQuery subjectQuery = new SubjectQuery();
subjectQuery.setId(i.getId());
subjectQuery.setLabel(i.getTitle());
/*获取children*/
List<SubjectQuery> childrenList = new ArrayList();
all.forEach(j ->{ //遍历二级分类,找出一级分类下面对应的二级分类
if(j.getParentId().equals(subjectQuery.getId())){ //踩坑:id为字符串,比较使用equals,不能直接使用==
SubjectQuery subjectQuery2 = new SubjectQuery();
subjectQuery2.setId(j.getId());
subjectQuery2.setLabel(j.getTitle());
childrenList.add(subjectQuery2);
}
});
subjectQuery.setChildren(childrenList);
subjectQueryList.add(subjectQuery);
});
return subjectQueryList;
}
前端二级分类联动,根据一级分类查二级分类:
subjectLevelOneChanged(){
for(let i=0;i<this.subjectOneList.length;i++){
let oneSubject = this.subjectOneList[i]
if(this.courseInfo.subjectParentId === oneSubject.id){
this.subjectTwoList = oneSubject.children
this.courseInfo.subjectId = '' //清除重选一级分类之后 之前还存在的二级分类(双向绑定id)
}
}
},
欢迎关注公众号Java技术大本营,会不定期分享BAT面试资料等福利。