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

前言

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

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

相关推荐
你的人类朋友12 分钟前
✍️Node.js CMS框架概述:Directus与Strapi详解
javascript·后端·node.js
面朝大海,春不暖,花不开31 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
钡铼技术ARM工业边缘计算机1 小时前
【成本降40%·性能翻倍】RK3588边缘控制器在安防联动系统的升级路径
后端
CryptoPP2 小时前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
白宇横流学长2 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
草捏子2 小时前
状态机设计:比if-else优雅100倍的设计
后端
考虑考虑4 小时前
Springboot3.5.x结构化日志新属性
spring boot·后端·spring
涡能增压发动积4 小时前
一起来学 Langgraph [第三节]
后端
sky_ph4 小时前
JAVA-GC浅析(二)G1(Garbage First)回收器
java·后端
涡能增压发动积4 小时前
一起来学 Langgraph [第二节]
后端