依照下方提示依次创建entity、mapper、service、service实现类、controller,创建后的目录结构应当如下图所示:
入门开发指南-后端开发-功能开发-01.png

创建entity

  1. package com.ustcinfo.eip.todo.entity;
  2. import com.baomidou.mybatisplus.annotation.TableId;
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. import com.ustcinfo.ishare.eip.admin.common.validator.group.AddGroup;
  5. import com.ustcinfo.ishare.eip.admin.common.validator.group.UpdateGroup;
  6. import io.swagger.annotations.ApiModel;
  7. import io.swagger.annotations.ApiModelProperty;
  8. import lombok.Data;
  9. import javax.validation.constraints.NotBlank;
  10. /**
  11. * 待办事项实体
  12. *
  13. * @author liuchengbiao
  14. * @date 2019/4/25 下午3:25
  15. */
  16. @Data
  17. @ApiModel
  18. @TableName("todo")
  19. public class TodoEntity {
  20. @TableId
  21. @ApiModelProperty(notes = "待办事项ID")
  22. private Long id;
  23. @ApiModelProperty(notes = "待办事项名称")
  24. @NotBlank(message = "待办事项不能为空", groups = {AddGroup.class, UpdateGroup.class})
  25. private String name;
  26. @ApiModelProperty(notes = "待办事项状态")
  27. private Integer status;
  28. }
  • 这里使用了 lombok 的 @Data注解,会自动生成xxxGetter、xxxSetter、toString等方法
  • 这里使用了swagger注解 @ApiModel 以及 @ApiModelProperty 用于生成接口文档时参数的说明
  • @TableName注解规定了该实体对应的表名
  • 如果指定主键,只需要在主键属性上添加 @TableId 注解即可

该实体在生成的接口文档中的描述
63.png

创建mapper

  1. package com.ustcinfo.eip.todo.mapper;
  2. import com.ustcinfo.eip.todo.entity.TodoEntity;
  3. import com.ustcinfo.ishare.eip.admin.starter.mybatis.mapper.AdminBaseMapper;
  4. import org.apache.ibatis.annotations.Mapper;
  5. /**
  6. * @author liuchengbiao
  7. * @date 2019/4/25 下午3:29
  8. */
  9. @Mapper
  10. public interface TodoMapper extends AdminBaseMapper<TodoEntity> {
  11. }

只需要集成 AdminBaseMapper 并指明对应的泛型实体类即可,其他代码都不需要编写,就这么简单

创建service

  1. package com.ustcinfo.eip.todo.service;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import com.ustcinfo.eip.todo.entity.TodoEntity;
  4. import com.ustcinfo.ishare.eip.admin.common.utils.MapUtils;
  5. import com.ustcinfo.ishare.eip.admin.starter.mybatis.page.PageUtils;
  6. /**
  7. * @author liuchengbiao
  8. * @date 2019/4/25 下午3:32
  9. */
  10. public interface TodoService extends IService<TodoEntity> {
  11. /**
  12. * 分页查询
  13. *
  14. * @param params
  15. * @return
  16. */
  17. PageUtils<TodoEntity> queryPage(MapUtils params);
  18. }

只需要继承 IService 接口并指明对应的泛型实体即可,如果有其他特殊的需求需要添加方法的话,还可以在这里定义抽象方法(这里以分页为例,其他CURD都可以不用写的)。

创建service实现类

  1. package com.ustcinfo.eip.todo.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.ustcinfo.eip.todo.entity.TodoEntity;
  6. import com.ustcinfo.eip.todo.mapper.TodoMapper;
  7. import com.ustcinfo.eip.todo.service.TodoService;
  8. import com.ustcinfo.ishare.eip.admin.common.utils.MapUtils;
  9. import com.ustcinfo.ishare.eip.admin.starter.mybatis.page.PageUtils;
  10. import com.ustcinfo.ishare.eip.admin.starter.mybatis.page.Query;
  11. import com.ustcinfo.ishare.eip.admin.starter.mybatis.utils.QueryWrapperUtils;
  12. import org.springframework.stereotype.Service;
  13. /**
  14. * @author liuchengbiao
  15. * @date 2019/4/25 下午3:33
  16. */
  17. @Service("todoService")
  18. public class TodoServiceImpl extends ServiceImpl<TodoMapper, TodoEntity> implements TodoService {
  19. @Override
  20. public PageUtils<TodoEntity> queryPage(MapUtils params) {
  21. String searchKey = params.getString("searchKey");
  22. // 模糊查询
  23. QueryWrapper<TodoEntity> queryWrapper = QueryWrapperUtils.wrapperLike(new QueryWrapper<TodoEntity>(), searchKey, "name");
  24. // 安装类型查询
  25. Integer status = params.getInteger("status");
  26. queryWrapper.eq(status != null, "status", status);
  27. // 排序
  28. queryWrapper.orderByDesc("id");
  29. IPage<TodoEntity> page = this.page(new Query<TodoEntity>(params).getPage(), queryWrapper);
  30. return new PageUtils(page);
  31. }
  32. }
  • 实现接口 TodoService 并实现其抽象方法即可
  • 主要类上的 @Service注解不可少
  • 需要指明对应的实体以及实体对应的mapper

创建controller

  1. package com.ustcinfo.eip.todo.controller;
  2. import com.google.common.collect.Lists;
  3. import com.ustcinfo.eip.todo.entity.TodoEntity;
  4. import com.ustcinfo.eip.todo.service.TodoService;
  5. import com.ustcinfo.ishare.eip.admin.common.utils.MapUtils;
  6. import com.ustcinfo.ishare.eip.admin.controller.AbstractController;
  7. import com.ustcinfo.ishare.eip.admin.service.sys.annotation.SysLog;
  8. import com.ustcinfo.ishare.eip.admin.common.form.JsonResult;
  9. import com.ustcinfo.ishare.eip.admin.starter.mybatis.page.PageUtils;
  10. import com.ustcinfo.ishare.eip.admin.common.validator.ValidatorUtils;
  11. import io.swagger.annotations.*;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.http.MediaType;
  14. import org.springframework.web.bind.annotation.*;
  15. import springfox.documentation.annotations.ApiIgnore;
  16. import java.util.Map;
  17. /**
  18. * 待办事项的接口
  19. *
  20. * @author liuchengbiao
  21. * @date 2019/4/25 下午3:35
  22. */
  23. @RestController
  24. @RequestMapping("/todo")
  25. @Api(tags = "待办事项")
  26. public class TodoController extends AbstractController {
  27. @Autowired
  28. private TodoService todoService;
  29. @GetMapping("/list")
  30. @ApiOperation(value = "列表", notes = "分页待办功能列表", produces = MediaType.APPLICATION_JSON_VALUE)
  31. @ApiImplicitParams({
  32. @ApiImplicitParam(name = "page", value = "页码", paramType = "query", required = true, dataType = "int"),
  33. @ApiImplicitParam(name = "limit", value = "每页条数", paramType = "query", required = true, dataType = "int"),
  34. @ApiImplicitParam(name = "sidx", value = "排序字段", paramType = "query", dataType = "string"),
  35. @ApiImplicitParam(name = "order", value = "排序方式,如:asc、desc", paramType = "query", dataType = "string"),
  36. @ApiImplicitParam(name = "status", value = "状态", paramType = "query", dataType = "int"),
  37. @ApiImplicitParam(name = "searchKey", value = "查询条件", paramType = "query", dataType = "string")
  38. })
  39. public JsonResult<PageUtils<TodoEntity>> list(@ApiIgnore @RequestParam Map<String, Object> params) {
  40. PageUtils<TodoEntity> page = todoService.queryPage(MapUtils.getInstance(params));
  41. return JsonResult.ok().put(page);
  42. }
  43. @SysLog("添加待办事项")
  44. @PostMapping("/save")
  45. @ApiOperation(value = "添加", notes = "添加待办事项", produces = MediaType.APPLICATION_JSON_VALUE)
  46. public JsonResult<Void> save(@ApiParam(name = "添加的待办事项对象", value = "传入json格式", required = true) @RequestBody TodoEntity todo) {
  47. ValidatorUtils.validateEntity(todo);
  48. todoService.save(todo);
  49. return JsonResult.ok();
  50. }
  51. @SysLog("修改待办事项")
  52. @PostMapping("/update")
  53. @ApiOperation(value = "修改", notes = "修改待办事项", produces = MediaType.APPLICATION_JSON_VALUE)
  54. public JsonResult<Void> update(@ApiParam(name = "修改的待办事项对象", value = "传入json格式", required = true) @RequestBody TodoEntity todo) {
  55. ValidatorUtils.validateEntity(todo);
  56. todoService.updateById(todo);
  57. return JsonResult.ok();
  58. }
  59. @GetMapping("/info/{id}")
  60. @ApiOperation(value = "详情", notes = "获取指定ID的详细信息", produces = MediaType.APPLICATION_JSON_VALUE)
  61. public JsonResult<TodoEntity> info(@PathVariable("id") Long id) {
  62. TodoEntity todo = todoService.getById(id);
  63. return JsonResult.ok().put(todo);
  64. }
  65. @SysLog("删除待办事项")
  66. @PostMapping("/delete")
  67. @ApiOperation(value = "删除", notes = "删除待办事项", produces = MediaType.APPLICATION_JSON_VALUE)
  68. public JsonResult<Void> delete(@RequestBody Long[] ids) {
  69. todoService.removeByIds(Lists.newArrayList(ids));
  70. return JsonResult.ok();
  71. }
  72. @SysLog("改变状态")
  73. @PostMapping("/toggle/{id}")
  74. @ApiOperation(value = "改变状态", notes = "改变状态", produces = MediaType.APPLICATION_JSON_VALUE)
  75. public JsonResult<Void> toggle(@PathVariable(name = "id") Long id) {
  76. TodoEntity todo = todoService.getById(id);
  77. if (todo != null) {
  78. todo.setStatus(todo.getStatus() * -1);
  79. todoService.updateById(todo);
  80. }
  81. return JsonResult.ok();
  82. }
  83. }
  • 在类上添加 @RestController 相当于 @Controller @ResponseBody 注解合体
  • 在类上使用swagger 的@Api注解用来标识生成的文档中的左侧接口描述
  • 在方法上使用@SysLog注解用来记录操作的日志,括号中填写操作的名称
  • 在方法上使用@PostMapping 表示仅接受post请求,括号中是请求的部分URI
  • 在方法上使用 swagger 的 @ApiOperation 注解用来表示该方法的作用以及传参类型
  • 在方法上使用 swagger 的 @ApiImplicitParams 注解用来标识该方法的入参信息,包括入参名称、类型、必填项、默认值等
  • 基础框架controller中方法的返回值是 JsonResult ,他接受一个返回数据的泛型,前端会收到他的json数据