编写eduteacher后台管理api接口
查询所有
@RestController
@RequestMapping("/eduservice/teacher")
public class EduTeacherController {
@Autowired
private EduTeacherService eduTeacherService;
@GetMapping("findAll")
public List<EduTeacher>findAllTeacher(){
//调用service方法实现查询所有
List<EduTeacher> list = eduTeacherService.list(null);
return list;
}
}
逻辑删除讲师
@DeleteMapping("{id}")
public boolean removeTeacher(@PathVariable("id") String id){
boolean flag = eduTeacherService.removeById(id);
return flag;
}
跨域
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 。前后端分离开发中,需要考虑ajax跨域的问题。
这里我们可以从服务端解决这个问题
配置
在Controller类上添加注解
@CrossOrigin //跨域
或者跨域添加配置类
整合swagger2
创建common模块
在guli-parent下创建模块common
在common中引入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided </scope>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<scope>provided </scope>
</dependency>
<!--lombok用来简化实体类:需要安装lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided </scope>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<scope>provided </scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<scope>provided </scope>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring2.X集成redis所需common-pool2
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>-->
</dependencies>
在模块service-base中,创建swagger的配置类
创建包com.atguigu.servicebase.config,创建类SwaggerConfig
package com.atguigu.servicebase;
import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@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("dyk", "https://blog.csdn.net/qq_44866153", "1106649325@qq.com"))
.build();
}
}
在模块service模块中引入service-base
因为要使用swagger
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>service_base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在service-edu启动类上添加注解
因为swaggerconfig使用了@Configuration,要使启动类扫描到,要加注解,不然只扫描当前包下的内容
@SpringBootApplication
@ComponentScan(basePackages = {"com.atguigu"})
public class EduApplication {
public static void main(String[] args) {
SpringApplication.run(EduApplication.class,args);
}
}
swagger访问地址
http://localhost:8001/swagger-ui.html
统一返回数据格式
项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。
一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容
{
"success": 布尔, //响应是否成功
"code": 数字, //响应码
"message": 字符串, //返回消息
"data": HashMap //返回数据,放在键值对中
}
在common模块下创建子模块common-utils
创建接口定义返回码
package com.atguigu.commonutils;
public interface ResultCode {
public static Integer SUCCESS = 20000;
public static Integer ERROR = 20001;
}
创建统一结果返回类
构造方法私有,是为了让别人无法new对象
方法返回this,返回的是当前类对象,以后返回结果可以链式调用
package com.atguigu.commonutils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
//统一返回结果
public class ResultVo {
@ApiModelProperty(value = "是否成功")
private Boolean success;
@ApiModelProperty(value = "返回码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回数据")
private Map<String, Object> data = new HashMap<String, Object>();
//构造方法私有
private ResultVo(){}
//成功静态方法
public static ResultVo ok(){
ResultVo resultVo=new ResultVo();
resultVo.setSuccess(true);
resultVo.setCode(ResultCode.SUCCESS);
resultVo.setMessage("成功");
return resultVo;
}
//失败静态方法
public static ResultVo error(){
ResultVo resultVo=new ResultVo();
resultVo.setSuccess(false);
resultVo.setCode(ResultCode.ERROR);
resultVo.setMessage("失败");
return resultVo;
}
public ResultVo success(Boolean success){
this.setSuccess(success);
return this;
}
public ResultVo message(String message){
this.setMessage(message);
return this;
}
public ResultVo code(Integer code){
this.setCode(code);
return this;
}
public ResultVo data(String key,Object value){
this.data.put(key,value);
return this;
}
public ResultVo data(Map<String,Object> map){
this.setData(map);
return this;
}
}
统一返回结果使用
在service模块中添加common_utils依赖
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>common_utils</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
修改Controller中的返回结果
//查询讲师表所有数据
@ApiOperation(value = "所有讲师列表")
@GetMapping("/findAll")
public ResultVo findAllTeacher(){
//调用service方法实现查询所有
List<EduTeacher> list = eduTeacherService.list(null);
return ResultVo.ok().data("items",list);
}
//逻辑删除讲师
@ApiOperation(value = "根据ID删除讲师")
@DeleteMapping("{id}")
public ResultVo removeTeacher(@PathVariable("id") String id){
boolean flag = eduTeacherService.removeById(id);
if(flag){
return ResultVo.ok();
}
else{
return ResultVo.error();
}
}
讲师分页功能
分页插件
在配置类 EduConfig添加
新版
@Configuration
@MapperScan("com.atguigu.eduservice.mapper")
public class EduConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
旧版
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
讲师分页Controller
//分页查询讲师
//curremt 当前页
//limit 每页记录
@ApiOperation(value = "分页查询讲师")
@ApiImplicitParams({
@ApiImplicitParam(name="current",value = "当前页"),
@ApiImplicitParam(name="limit",value = "每页记录")
})
@GetMapping("/pageTeacher/{current}/{limit}")
public ResultVo pageListTeacher(@PathVariable Long current,@PathVariable Long limit){
//创建page对象
Page<EduTeacher> teacherPage =new Page<>(current,limit);
//调用方法实现分页
//调用方法时,底层封装,把分页所有数据封装到teacherPage对象里面
eduTeacherService.page(teacherPage,null);
//总记录数
long total = teacherPage.getTotal();
//数据list集合
List<EduTeacher> records = teacherPage.getRecords();
Map map=new HashMap();
map.put("total",total);
map.put("rows",records);
return ResultVo.ok().data(map);
}
条件查询带分页方法
根据讲师名称name,讲师头衔level、讲师入驻时间gmt_create(时间段)查询
在entity下面新建一个vo包,创建TeacherQueryVo
package com.atguigu.eduservice.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "Teacher查询对象", description = "讲师查询对象封装")
public class TeacherQueryVo {
@ApiModelProperty(value = "教师名称,模糊查询")
private String name;
@ApiModelProperty(value = "头衔 1高级讲师 2首席讲师")
private Integer level;
@ApiModelProperty(value = "查询开始时间", example = "2019-01-01 10:10:10")
private String begin;//注意,这里使用的是String类型,前端传过来的数据无需进行类型转换
@ApiModelProperty(value = "查询结束时间", example = "2019-12-01 10:10:10")
private String end;
}
带条件分页查询讲师
注意这里条件可以为空,那么就和不带条件一样了,但是要加上 @RequestBody(required = false)否则会报错
// 带条件分页查询讲师
@ApiOperation(value = "带条件分页查询讲师")
@ApiImplicitParams({
@ApiImplicitParam(name="current",value = "当前页"),
@ApiImplicitParam(name="limit",value = "每页记录")
})
@PostMapping("pageTeacherCondition/{current}/{limit}")
public ResultVo pageTeacherCondition(@PathVariable Long current, @PathVariable Long limit, @RequestBody(required = false) TeacherQueryVo teacherQueryVo){
//创建page对象
Page<EduTeacher> teacherPage =new Page<>(current,limit);
//构建条件
QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
//多条件组合查询
String name = teacherQueryVo.getName();
Integer level = teacherQueryVo.getLevel();
String begin = teacherQueryVo.getBegin();
String end = teacherQueryVo.getEnd();
//判断条件值是否为空,如果不为空拼接条件
if(!StringUtils.isEmpty(name)){
wrapper.like("name",name);
}
if(!StringUtils.isEmpty(level)){
wrapper.eq("level",level);
}
if(!StringUtils.isEmpty(begin)){
wrapper.ge("gmt_create", begin);
}
if(!StringUtils.isEmpty(end)){
wrapper.le("gmt_create", end);
}
//调用方法实现分页
//调用方法时,底层封装,把分页所有数据封装到teacherPage对象里面
eduTeacherService.page(teacherPage,wrapper);
//总记录数
long total = teacherPage.getTotal();
//数据list集合
List<EduTeacher> records = teacherPage.getRecords();
Map map=new HashMap();
map.put("total",total);
map.put("rows",records);
return ResultVo.ok().data(map);
}
添加讲师
在service-base模块中添加
创建包handler,创建自动填充类 MyMetaObjectHandler
注意这里的是实体类的属性名字而不是数据库的字段名字
package com.atguigu.servicebase.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//gmtCreate传的是类中的属性名
this.setFieldValByName("gmtCreate",new Date(),metaObject);
this.setFieldValByName("gmtModified",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified",new Date(),metaObject);
}
}
在实体类添加自动填充注解
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
添加讲师controller
//添加讲师接口
@PostMapping("addTeacher")
public ResultVo addTeacher(@RequestBody EduTeacher eduTeacher){
boolean save = eduTeacherService.save(eduTeacher);
if(save){
return ResultVo.ok();
}else {
return ResultVo.error();
}
}
根据id查询 controller
//根据讲师id进行查询
@ApiOperation(value = "根据讲师id进行查询")
@ApiImplicitParam(name="id",value = "讲师id",dataType = "string")
@GetMapping("/{id}")
public ResultVo getTeacher(@PathVariable String id){
EduTeacher eduTeacher = eduTeacherService.getById(id);
return ResultVo.ok().data("teacher",eduTeacher);
}
根据id修改 controller
//讲师修改功能
@ApiOperation(value = "讲师修改功能")
@PutMapping("/updateTeacher")
public ResultVo updateTeacher(@RequestBody EduTeacher eduTeacher){
boolean flag=eduTeacherService.updateById(eduTeacher);
if(flag){
return ResultVo.ok();
}
else{
return ResultVo.error();
}
}