依照下方提示依次创建entity、mapper、service、service实现类、controller,创建后的目录结构应当如下图所示:
创建entity
package com.ustcinfo.eip.todo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ustcinfo.ishare.eip.admin.common.validator.group.AddGroup;
import com.ustcinfo.ishare.eip.admin.common.validator.group.UpdateGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 待办事项实体
*
* @author liuchengbiao
* @date 2019/4/25 下午3:25
*/
@Data
@ApiModel
@TableName("todo")
public class TodoEntity {
@TableId
@ApiModelProperty(notes = "待办事项ID")
private Long id;
@ApiModelProperty(notes = "待办事项名称")
@NotBlank(message = "待办事项不能为空", groups = {AddGroup.class, UpdateGroup.class})
private String name;
@ApiModelProperty(notes = "待办事项状态")
private Integer status;
}
- 这里使用了 lombok 的 @Data注解,会自动生成xxxGetter、xxxSetter、toString等方法
- 这里使用了swagger注解 @ApiModel 以及 @ApiModelProperty 用于生成接口文档时参数的说明
- @TableName注解规定了该实体对应的表名
- 如果指定主键,只需要在主键属性上添加 @TableId 注解即可
该实体在生成的接口文档中的描述
创建mapper
package com.ustcinfo.eip.todo.mapper;
import com.ustcinfo.eip.todo.entity.TodoEntity;
import com.ustcinfo.ishare.eip.admin.starter.mybatis.mapper.AdminBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author liuchengbiao
* @date 2019/4/25 下午3:29
*/
@Mapper
public interface TodoMapper extends AdminBaseMapper<TodoEntity> {
}
只需要集成 AdminBaseMapper 并指明对应的泛型实体类即可,其他代码都不需要编写,就这么简单
创建service
package com.ustcinfo.eip.todo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ustcinfo.eip.todo.entity.TodoEntity;
import com.ustcinfo.ishare.eip.admin.common.utils.MapUtils;
import com.ustcinfo.ishare.eip.admin.starter.mybatis.page.PageUtils;
/**
* @author liuchengbiao
* @date 2019/4/25 下午3:32
*/
public interface TodoService extends IService<TodoEntity> {
/**
* 分页查询
*
* @param params
* @return
*/
PageUtils<TodoEntity> queryPage(MapUtils params);
}
只需要继承 IService 接口并指明对应的泛型实体即可,如果有其他特殊的需求需要添加方法的话,还可以在这里定义抽象方法(这里以分页为例,其他CURD都可以不用写的)。
创建service实现类
package com.ustcinfo.eip.todo.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ustcinfo.eip.todo.entity.TodoEntity;
import com.ustcinfo.eip.todo.mapper.TodoMapper;
import com.ustcinfo.eip.todo.service.TodoService;
import com.ustcinfo.ishare.eip.admin.common.utils.MapUtils;
import com.ustcinfo.ishare.eip.admin.starter.mybatis.page.PageUtils;
import com.ustcinfo.ishare.eip.admin.starter.mybatis.page.Query;
import com.ustcinfo.ishare.eip.admin.starter.mybatis.utils.QueryWrapperUtils;
import org.springframework.stereotype.Service;
/**
* @author liuchengbiao
* @date 2019/4/25 下午3:33
*/
@Service("todoService")
public class TodoServiceImpl extends ServiceImpl<TodoMapper, TodoEntity> implements TodoService {
@Override
public PageUtils<TodoEntity> queryPage(MapUtils params) {
String searchKey = params.getString("searchKey");
// 模糊查询
QueryWrapper<TodoEntity> queryWrapper = QueryWrapperUtils.wrapperLike(new QueryWrapper<TodoEntity>(), searchKey, "name");
// 安装类型查询
Integer status = params.getInteger("status");
queryWrapper.eq(status != null, "status", status);
// 排序
queryWrapper.orderByDesc("id");
IPage<TodoEntity> page = this.page(new Query<TodoEntity>(params).getPage(), queryWrapper);
return new PageUtils(page);
}
}
- 实现接口 TodoService 并实现其抽象方法即可
- 主要类上的 @Service注解不可少
- 需要指明对应的实体以及实体对应的mapper
创建controller
package com.ustcinfo.eip.todo.controller;
import com.google.common.collect.Lists;
import com.ustcinfo.eip.todo.entity.TodoEntity;
import com.ustcinfo.eip.todo.service.TodoService;
import com.ustcinfo.ishare.eip.admin.common.utils.MapUtils;
import com.ustcinfo.ishare.eip.admin.controller.AbstractController;
import com.ustcinfo.ishare.eip.admin.service.sys.annotation.SysLog;
import com.ustcinfo.ishare.eip.admin.common.form.JsonResult;
import com.ustcinfo.ishare.eip.admin.starter.mybatis.page.PageUtils;
import com.ustcinfo.ishare.eip.admin.common.validator.ValidatorUtils;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.Map;
/**
* 待办事项的接口
*
* @author liuchengbiao
* @date 2019/4/25 下午3:35
*/
@RestController
@RequestMapping("/todo")
@Api(tags = "待办事项")
public class TodoController extends AbstractController {
@Autowired
private TodoService todoService;
@GetMapping("/list")
@ApiOperation(value = "列表", notes = "分页待办功能列表", produces = MediaType.APPLICATION_JSON_VALUE)
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "页码", paramType = "query", required = true, dataType = "int"),
@ApiImplicitParam(name = "limit", value = "每页条数", paramType = "query", required = true, dataType = "int"),
@ApiImplicitParam(name = "sidx", value = "排序字段", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "order", value = "排序方式,如:asc、desc", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "status", value = "状态", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "searchKey", value = "查询条件", paramType = "query", dataType = "string")
})
public JsonResult<PageUtils<TodoEntity>> list(@ApiIgnore @RequestParam Map<String, Object> params) {
PageUtils<TodoEntity> page = todoService.queryPage(MapUtils.getInstance(params));
return JsonResult.ok().put(page);
}
@SysLog("添加待办事项")
@PostMapping("/save")
@ApiOperation(value = "添加", notes = "添加待办事项", produces = MediaType.APPLICATION_JSON_VALUE)
public JsonResult<Void> save(@ApiParam(name = "添加的待办事项对象", value = "传入json格式", required = true) @RequestBody TodoEntity todo) {
ValidatorUtils.validateEntity(todo);
todoService.save(todo);
return JsonResult.ok();
}
@SysLog("修改待办事项")
@PostMapping("/update")
@ApiOperation(value = "修改", notes = "修改待办事项", produces = MediaType.APPLICATION_JSON_VALUE)
public JsonResult<Void> update(@ApiParam(name = "修改的待办事项对象", value = "传入json格式", required = true) @RequestBody TodoEntity todo) {
ValidatorUtils.validateEntity(todo);
todoService.updateById(todo);
return JsonResult.ok();
}
@GetMapping("/info/{id}")
@ApiOperation(value = "详情", notes = "获取指定ID的详细信息", produces = MediaType.APPLICATION_JSON_VALUE)
public JsonResult<TodoEntity> info(@PathVariable("id") Long id) {
TodoEntity todo = todoService.getById(id);
return JsonResult.ok().put(todo);
}
@SysLog("删除待办事项")
@PostMapping("/delete")
@ApiOperation(value = "删除", notes = "删除待办事项", produces = MediaType.APPLICATION_JSON_VALUE)
public JsonResult<Void> delete(@RequestBody Long[] ids) {
todoService.removeByIds(Lists.newArrayList(ids));
return JsonResult.ok();
}
@SysLog("改变状态")
@PostMapping("/toggle/{id}")
@ApiOperation(value = "改变状态", notes = "改变状态", produces = MediaType.APPLICATION_JSON_VALUE)
public JsonResult<Void> toggle(@PathVariable(name = "id") Long id) {
TodoEntity todo = todoService.getById(id);
if (todo != null) {
todo.setStatus(todo.getStatus() * -1);
todoService.updateById(todo);
}
return JsonResult.ok();
}
}
- 在类上添加 @RestController 相当于 @Controller 和 @ResponseBody 注解合体
- 在类上使用swagger 的@Api注解用来标识生成的文档中的左侧接口描述
- 在方法上使用@SysLog注解用来记录操作的日志,括号中填写操作的名称
- 在方法上使用@PostMapping 表示仅接受post请求,括号中是请求的部分URI
- 在方法上使用 swagger 的 @ApiOperation 注解用来表示该方法的作用以及传参类型
- 在方法上使用 swagger 的 @ApiImplicitParams 注解用来标识该方法的入参信息,包括入参名称、类型、必填项、默认值等
- 基础框架controller中方法的返回值是 JsonResult ,他接受一个返回数据的泛型,前端会收到他的json数据