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

前言

在开发的过程中普遍的会遇到前后端数据的传递。例如点击查询按钮便会携带要查询的参数信息请求后端接口,当后端完成逻辑计算便会以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)
  }
}

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

相关推荐
到账一个亿1 小时前
后端树形结构
后端
武子康1 小时前
大数据-31 ZooKeeper 内部原理 Leader选举 ZAB协议
大数据·后端·zookeeper
我是哪吒1 小时前
分布式微服务系统架构第155集:JavaPlus技术文档平台日更-Java线程池实现原理
后端·面试·github
代码老y1 小时前
Spring Boot + 本地部署大模型实现:安全性与可靠性保障
spring boot·后端·bootstrap
LaoZhangAI1 小时前
OpenAI API 账号分层完全指南:2025年最新Tier系统、速率限制与升级攻略
前端·后端
红衣信1 小时前
前端与后端存储全解析:从 Cookie 到缓存策略
前端·后端·面试
Kyrie_Li1 小时前
(十五)Spring Test
java·后端·spring
WildBlue1 小时前
🎉 手写call的魔法冒险:前端开发者的“换身份”指南🚀
前端·后端
fortmin1 小时前
使用Apache Pdfbox生成pdf
后端
weixin_437398212 小时前
转Go学习笔记
linux·服务器·开发语言·后端·架构·golang