五、实现基础controller、service、前端封装返回json体等
我们实现了代码生成的功能后,对于一个web项目来说,我们还要对返回前端的格式进行一个简单的封装Result,所有返回的类型都是统一的格式,以及我们在自动生成的代码可以继承我们自定义的基础controller等类,便于我们自己扩展。
5.1.基础枚举类
在common子模块下的base包下创建基础的BaseEnum枚举类用来定义描述信息维护到枚举里面,尽量不要在代码中直接出现魔法值(如一些编码、中文等),以后的枚举常量类也可以按照这种模式来写。
package com.ywh.common.base;
/**
* CreateTime: 2018-12-15 16:06
* ClassName: BaseEnum
* Package: com.ywh.common.base
* Describe:
* 基础枚举类
*
* @author YWH
*/
public enum BaseEnum {
/**
*后台处理成功
*/
SUCCESS("后台处理成功!",200),
。。。。。。。。省略代码,具体代码请前往github查看
/**
* 404错误拦截
*/
NO_HANDLER("这个页面石沉大海了!接口没找到",404);
private String msg;
private int index;
BaseEnum(String msg, int index) {
this.msg = msg;
this.index = index;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
5.2.封装前端返回json格式
在common下utils包下的创建Result类,作为前端的返回对象,Controller的直接返回对象都是Result。
package com.ywh.common.utils;
import com.alibaba.fastjson.JSONObject;
import com.ywh.common.base.BaseEnum;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* CreateTime: 2018-12-15 15:46
* ClassName: Result
* Package: com.ywh.common.utils
* Describe:
* 前端返回json格式封装类
*
* @author YWH
*/
public class Result extends Object implements Serializable{
private static final long serialVersionUID = 1348172152215944560L;
/**
* 返回状态码,200为正确,100为失败
*/
private int code;
/**
* 返回处理信息,成功或者失败
*/
private String msg;
/**
* 成功返回true,失败返回false
*/
private Boolean success;
/**
* 返回给前端的数据
*/
private Map<String, Object> extend = new HashMap<String ,Object>();
/**
* 成功返回的json封装体
* @param value 原始数据
* @return json格式
*/
public static Result successJson(Object value){
Result results = new Result();
results.setCode(BaseEnum.SUCCESS.getIndex());
results.setMsg(BaseEnum.SUCCESS.getMsg());
results.setSuccess(true);
results.getExtend().put("data",value);
return results;
}
/**
* 失败返回的json封装体
* @return json格式
*/
public static Result errorJson(){
Result results = new Result();
results.setCode(BaseEnum.FAIL.getIndex());
results.setSuccess(false);
results.setMsg(BaseEnum.FAIL.getMsg());
return results;
}
。。。。。。省略代码,具体代码请前往github查看。
}
在我们的ExampleController中写一个方法,用postman测试一下我们的前端结构体
@RestController
@RequestMapping("ExampleController")
public class ExampleController{
@GetMapping("findAll")
public Result findAll(){
return Result.successJson("成功了");
}
}
postman返回结果
{
"extend": {
"data": "成功了"
},
"msg": "后台处理成功!",
"code": 200,
"success": true
}
5.3.MybatisPlus分页插件
MybatisPlus为我们提供了分页插件,使用也很方便,创建一个配置类即可使用MybatisPlus为我提供的分页查询了,在common下的config包下创建MybatisPlusConfig类
package com.ywh.common.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* CreateTime: 2018-11-20 19:50
* ClassName: MybatisPlusConfig
* Package: com.ywh.common.config
* Describe:
* MybatisPlus的配置类
*
* @author YWH
*/
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
在common下的Entity中创建BasePage类,用于前端传入参数的接收实体类,我们可以控制当前页和一页中显示几条数据
package com.ywh.common.entity;
import lombok.Data;
/**
* CreateTime: 2018-11-22 10:23
* ClassName: BasePage
* Package: com.ywh.common.entity
* Describe:
* 分页实体类
*
* @author YWH
*/
@Data
public class BasePage {
/**
* 当前每页显示数
*/
private Integer size;
/**
* 当前页数
*/
private Integer current;
}
5.4.定义基础Controller、service等
对于我们自动生成的代码我们可以继承我自定义的Controller等等,在common下base包中创建以下类,封装如下:
BaseController、BaseService、BaseServiceImpl、BaseDao: 因为代码过长的原因,剩下具体代码可前往github查看
package com.ywh.common.base;
/**
* CreateTime: 2018-11-21 9:09
* ClassName: BaseController
* Package: com.ywh.common.base
* Describe:
* 基础Controller 所有的Controller继承这个类,如果有什么通用的方法,可自行扩展
* getList addData addDataBatch updateById updateByColumn deleteByColumn deleteById deleteByIds
* @author YWH
*/
@SuppressWarnings("unchecked")
public class BaseController<Service extends IService,T> {
private static final Logger log = LoggerFactory.getLogger(BaseMapper.class);
@Autowired
private Service service;
/**
* 获取所有的数据
* @return 返回前端json数据
*/
@GetMapping("getList")
public Result getList(){
List<T> list = service.list();
return Result.successJson(list);
}
/**
* 分页查询
* @param pn 分页的实体类
* @return 返回前端json数据
*/
@GetMapping("getPageList")
public Result getPageList(@RequestBody BasePage pn){
Page<T> pojo = new Page<T>(pn.getCurrent(),pn.getSize());
IPage<T> page = service.page(pojo);
log.info("总条数 ------> " + page.getTotal());
log.info("当前页数 ------> " + page.getCurrent());
log.info("当前每页显示数 ------> " + page.getSize());
log.info("数据 ------> " + page.getRecords());
return Result.successJson(page);
}
。。。。。。。省略代码,具体代码请前往github查看
}
以上类和xml中我只在BaseController中写了自己的方法,其他的类中也是可以编写的,可以把一些通用的CRUD方法写在这些基础类中,在我们有了基础的这些类以后,我们自动生成的代码并没有在生成的时候继承我们这些定义好的基础类,所以我们要修改一下CodeGenerator工具类以便在生成的时候就继承。
在CodeGenerator的策略配置中添加以下代码就可以了
//继承自定义的controller,service,impl,dao
strategy.setSuperControllerClass("com.ywh.common.base.BaseController");
strategy.setSuperServiceClass("com.ywh.common.base.BaseService");
strategy.setSuperServiceImplClass("com.ywh.common.base.BaseServiceImpl");
strategy.setSuperMapperClass("com.ywh.common.base.BaseDao");
5.5.测试示例
我们上面添加了基础类和分页插件以后,测试一下是不是好用的,把之前生成的Controller等文件删除也好,把myBatisPlus.properties中的是否覆盖文件设置成true也行,重新生成代码然后通过postman测试我们的查询,分页查询,添加数据等等好不好用。
分页查询
可以看到我只有三条数据,但是我规定了当前页只显示一条数据,分页查询已经生效了,其他方法我这里就不测试了。