统一查询条件和返回信息格式

前言

在开发的过程中普遍的会遇到前后端数据的传递。例如点击查询按钮便会携带要查询的参数信息请求后端接口,当后端完成逻辑计算便会以json的方式将数据返回给前端。

但随着项目的逐渐状态,可能会遇到很多扩展性的需求。

比如一个查询功能要添加多个查询条件,如果之前只有一个查询条件并且代码写的不是多么完美,那开发这个需求对代码的改动量就比较大。

再比如之前返回值仅仅返回了要查询的数据,但是现在新需求要求不仅仅返回数据还要返回状态信息等等。

下面我根据自己的一些经验编写统一查询条件和返回信息格式,方便对数据的处理。

统一查询条件

所有POST请求使用统一查询条件,如下:

java 复制代码
/**
 * 统一查询条件
 */
@Data
public class PageReq<T> {
    /**
     * 页数
     */
    private Integer page;
    /**
     * 显示条数
     */
    private  Integer limit;
    /**
     * 排序字段名
     */
    private String sortField;
    /**
     * 排序(asc,desc)
     */
    private String sortType;
    /**
     * 查询条件
     */
    private T queryFilter;
}

统一查询条件中包含了分页、排序、查询条件。具体使用如下:

  • controller:controller接收PageReq参数
java 复制代码
@ApiOperation(value = "查询系统用户", notes = "")
@PostMapping(value={"/userList"})
public List<SystemUser> userList(@RequestBody PageReq pageReq) {
    List<SystemUser> basePageVO = service.selectUserList(pageReq);
    return basePageVO;
}
  • serviceImpl:将queryFilter查询条件转化为具体的对象使用
java 复制代码
public List<SystemUser> selectUserList(PageReq pageReq) {
  //通过fastJson将queryFilter查询条件转化为具体的对象
  SystemUser systemUser = JSONObject.parseObject(JSONObject.toJSONString(pageReq.getQueryFilter()),SystemUser.class);
  //使用转化后的systemUser进行查询
  List<SystemUser> list = systemUserMapper.selectUsers(systemUser);
  return list;
}
  • Swagger查询案例

返回信息格式

设置了统一返回信息格式,如下:

java 复制代码
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ResultMessage<T> {
    /**
     * 信息说明
     */
    private String msg;
    /**
     * 状态说明
     */
    private String status;
    /**
     * token
     */
    private String token;
    /**
     * 返回数据
     */
    private T data;
​
    /**
     * 默认成功
     */
    public void setSuccess(){
        this.status = RespStatusEnum.SUCCESS.getCode();
        this.msg = RespStatusEnum.SUCCESS.getMsg();
    }
    /**
     * 默认成功 + 提示信息
     */
    public void setSuccess(String msg){
        this.status = RespStatusEnum.SUCCESS.getCode();
        this.msg = msg;
    }
    /**
     * 默认失败
     */
    public void setFail(){
        this.status = RespStatusEnum.FAIL.getCode();
        this.msg = RespStatusEnum.FAIL.getMsg();
    }
    /**
     * 默认失败 + 提示信息
     */
    public void setFail(String msg){
        this.status = RespStatusEnum.FAIL.getCode();
        this.msg = msg;
    }
    /**
     * 枚举设置返回信息
     */
    public void setResultInfo(RespStatusEnum statusEnum,T data){
        this.status = statusEnum.getCode();
        this.msg = statusEnum.getMsg();
        this.data = data;
    }
}

为方便统一返回状态码和返回信息设置了返回状态枚举类,如下:

java 复制代码
@Getter
@ToString
@AllArgsConstructor
public enum RespStatusEnum {
​
    SUCCESS("1", "操作成功"),
    FAIL("0", "操作失败"),
​
    //1xxx  基础配置异常
    SYSTEM_ERROR("1000", "系统错误"),
    DATABASE_ERROR("1001", "数据库异常"),
    CONNECTION_ERROR("1002", "网络连接请求失败"),
​
    //2xxx  业务逻辑成功
    LOGOUT_SUCCESS("2000", "已退出登录"),
    SEND_EMAIL_SUCCESS("2001", "邮件已发送,请注意查收"),
​
    //3xxx  业务逻辑失败
    NO_LOGIN("3000", "未登陆"),
    ERROR_IDCODE("3001", "验证码不正确"),
    NO_RECORD("3002", "没有查到相关记录"),
    REPEAT_MOBILE("3003", "已存在此手机号"),
    REPEAT_EMAIL("3004", "已存在此邮箱地址"),
    INVALID_MOBILE("3005", "无效的手机号码"),
    INVALID_EMAIL("3006", "无效的邮箱"),
    INVALID_GENDER("3007", "无效的性别"),
​
    //4xxx  客户端错误
    BAD_REQUEST("4000", "错误的请求参数"),
    UNAUTHORIZED("4001", "未经授权"),
    FORBIDDEN("4002", "资源不可用"),
    NOT_FOUND("4003", "无效的访问路径"),
    METHOD_NOT_ALLOWED("4004", "不合法的请求方式"),
    PROXY_AUTHENTICATION_REQUIRED("4005", "需要代理身份验证"),
    REQUEST_TIMEOUT("4006", "请求超时"),
    CONFLICT("4007", "指令冲突"),
    REQUEST_ENTITY_TOO_LARGE("4008", "请求实体太大"),
    REQUEST_URI_TOO_LONG("4009", "请求URI太长"),
    UNSUPPORTED_MEDIA_TYPE("4010", "不支持的媒体类型"),
​
    //服务器错误
    INTERNAL_SERVER_ERROR("5000", "内部服务器错误"),
    BAD_GATEWAY("5001", "错误的网关"),
    SERVICE_UNAVAILABLE("5002", "服务不可用"),
    GATEWAY_TIMEOUT("5003", "网关超时"),
    HTTP_VERSION_NOT_SUPPORTED("5004", "HTTP版本不支持"),
​
    //未知错误
    UNKNOWN_ERROR("0000", "未知错误")
​
    ;
​
​
    /**
     * 响应状态
     */
    private final String code;
    /**
     * 响应编码
     */
    private final String msg;
}

后端使用统一返回信息格式返回给前端数据,前端也好通过返回的信息状态和信息来对返回的数据进行判断和解析,方便前后端之间的对接。

  • 前端使用案例:
js 复制代码
async loginForm () {
  // ......
  
  // 请求后端登录接口
  const res = await userLogin(params);
  if(res.data.status === '1'){
    // 将token存储到sessionStorage中
    setSessionStorage('token', res.data.token)
    // 成功之后跳转页面
    this.$router.push({name:"layout"})
    this.$message.success(res.data.msg)
  }else{
    this.$message.error(res.data.msg)
  }
}

微信搜索公众号【君耀软件设计】了解更多

相关推荐
丶213630 分钟前
【SQL】深入理解SQL:从基础概念到常用命令
数据库·后端·sql
木子020433 分钟前
Nacos的应用
后端
哎呦没33 分钟前
Spring Boot框架在医院管理中的应用
java·spring boot·后端
陈序缘1 小时前
Go语言实现长连接并发框架 - 消息
linux·服务器·开发语言·后端·golang
络71 小时前
Spring14——案例:利用AOP环绕通知计算业务层接口执行效率
java·后端·spring·mybatis·aop
2401_857600952 小时前
明星周边销售网站开发:SpringBoot技术全解析
spring boot·后端·php
程序员大金2 小时前
基于SpringBoot+Vue+MySQL的在线学习交流平台
java·vue.js·spring boot·后端·学习·mysql·intellij-idea
qq_2518364572 小时前
基于SpringBoot vue 医院病房信息管理系统设计与实现
vue.js·spring boot·后端
qq_2518364573 小时前
基于springboot vue3 在线考试系统设计与实现 源码数据库 文档
数据库·spring boot·后端
2401_858120533 小时前
古典舞在线交流平台:SpringBoot设计与实现详解
java·spring boot·后端