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

前言

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

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

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

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

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

统一查询条件

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

/**
 * 统一查询条件
 */
@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参数

@ApiOperation(value = "查询系统用户", notes = "")
@PostMapping(value={"/userList"})
public List<SystemUser> userList(@RequestBody PageReq pageReq) {
    List<SystemUser> basePageVO = service.selectUserList(pageReq);
    return basePageVO;
}
  • serviceImpl:将queryFilter查询条件转化为具体的对象使用

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查询案例

返回信息格式

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

@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;
    }
}

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

@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;
}

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

  • 前端使用案例:

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)
  }
}

微信搜索“君耀软件设计”了解更多

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值