• 微服务项目:尚融宝(9)(后端接口:统一返回结果)


    认清现实,放弃幻想,准备斗争

    一、定义统一返回结果

    1、数据格式的定义

    项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端对数据的操作更一致、轻松。
    一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含 状态码、返回消息、数据 这几部分内容
    例如,我们的系统要求返回的基本数据格式如下:
    成功:
        {
          "code": 0,
          "message": "成功",
          "data": 数据
        }
    失败:
    {
      "code": -1,
      "message": "失败",
      "data": null
    }

     因此,我们定义统一结果

    {
      "code": 数字, //业务响应码
      "message": 字符串, //返回消息
      "data": 对象 //返回数据
    }

    2、创建枚举

    在guigu-common中创建result包,创建枚举 ResponseEnum
    1. @Getter
    2. @AllArgsConstructor
    3. @ToString
    4. public enum ResponseEnum {
    5. SUCCESS(0, "成功"),
    6. ERROR(-1, "服务器内部错误"),
    7. ;
    8. // 响应状态码
    9. private Integer code;
    10. // 响应信息
    11. private String message;
    12. }

    完整版本

    1. @Getter
    2. @AllArgsConstructor
    3. @ToString
    4. public enum ResponseEnum {
    5. SUCCESS(0,"成功"),
    6. ERROR(-1,"服务器内部乘错误"),
    7. //-1xx 服务器错误
    8. BAD_SQL_GRAMMAR_ERROR(-101, "sql语法错误"),
    9. SERVLET_ERROR(-102, "servlet请求异常"), //-2xx 参数校验
    10. UPLOAD_ERROR(-103, "文件上传错误"),
    11. EXPORT_DATA_ERROR(104, "数据导出失败"),
    12. //-2xx 参数校验
    13. BORROW_AMOUNT_NULL_ERROR(-201, "借款额度不能为空"),
    14. MOBILE_NULL_ERROR(-202, "手机号码不能为空"),
    15. MOBILE_ERROR(-203, "手机号码不正确"),
    16. PASSWORD_NULL_ERROR(204, "密码不能为空"),
    17. CODE_NULL_ERROR(205, "验证码不能为空"),
    18. CODE_ERROR(206, "验证码错误"),
    19. MOBILE_EXIST_ERROR(207, "手机号已被注册"),
    20. LOGIN_MOBILE_ERROR(208, "用户不存在"),
    21. LOGIN_PASSWORD_ERROR(209, "密码错误"),
    22. LOGIN_LOKED_ERROR(210, "用户被锁定"),
    23. LOGIN_AUTH_ERROR(-211, "未登录"),
    24. USER_BIND_IDCARD_EXIST_ERROR(-301, "身份证号码已绑定"),
    25. USER_NO_BIND_ERROR(302, "用户未绑定"),
    26. USER_NO_AMOUNT_ERROR(303, "用户信息未审核"),
    27. USER_AMOUNT_LESS_ERROR(304, "您的借款额度不足"),
    28. LEND_INVEST_ERROR(305, "当前状态无法投标"),
    29. LEND_FULL_SCALE_ERROR(306, "已满标,无法投标"),
    30. NOT_SUFFICIENT_FUNDS_ERROR(307, "余额不足,请充值"),
    31. PAY_UNIFIEDORDER_ERROR(401, "统一下单错误"),
    32. ALIYUN_SMS_LIMIT_CONTROL_ERROR(-502, "短信发送过于频繁"),//业务限流
    33. ALIYUN_SMS_ERROR(-503, "短信发送失败"),//其他失败
    34. WEIXIN_CALLBACK_PARAM_ERROR(-601, "回调参数不正确"),
    35. WEIXIN_FETCH_ACCESSTOKEN_ERROR(-602, "获取access_token失败"),
    36. WEIXIN_FETCH_USERINFO_ERROR(-603, "获取用户信息失败");
    37. //响应状态码
    38. private Integer code;
    39. //响应信息
    40. private String message;
    41. }

    3、定义同统一结果类

    1. @Data
    2. public class R {
    3. private Integer code;
    4. private String message;
    5. private Map data = new HashMap();
    6. /**
    7. * 构造器私有
    8. */
    9. private R(){}
    10. /**
    11. * 返回成功
    12. */
    13. public static R ok(){
    14. R r = new R();
    15. r.setCode(ResponseEnum.SUCCESS.getCode());
    16. r.setMessage(ResponseEnum.SUCCESS.getMessage());
    17. return r;
    18. }
    19. /**
    20. * 返回失败
    21. */
    22. public static R error(){
    23. R r = new R();
    24. r.setCode(ResponseEnum.ERROR.getCode());
    25. r.setMessage(ResponseEnum.ERROR.getMessage());
    26. return r;
    27. }
    28. /**
    29. * 设置特定结果
    30. */
    31. public static R setResult(ResponseEnum responseEnum){
    32. R r = new R();
    33. r.setCode(responseEnum.getCode());
    34. r.setMessage(responseEnum.getMessage());
    35. return r;
    36. }
    37. public R message(String message){
    38. this.setMessage(message);
    39. return this;
    40. }
    41. public R code(Integer code){
    42. this.setCode(code);
    43. return this;
    44. }
    45. public R data(String key, Object value){
    46. this.data.put(key, value);
    47. return this;
    48. }
    49. public R data(Map map){
    50. this.setData(map);
    51. return this;
    52. }
    53. }

    这里采用了链式编程思想

    三、使用统一返回结果

    1、修改listAll

    1. @ApiOperation("积分等级列表")
    2. @GetMapping("/list")
    3. public R listAll(){
    4. List list = integralGradeService.list();
    5. return R.ok().data("list", list);
    6. }

    2、修改removeById

    1. @ApiOperation(value = "根据id删除积分等级", notes="逻辑删除")
    2. @DeleteMapping("/remove/{id}")
    3. public R removeById(
    4. @ApiParam(value = "数据id", required = true, example = "1")
    5. @PathVariable Long id){
    6. boolean result = integralGradeService.removeById(id);
    7. if(result){
    8. //return R.setResult(ResponseEnum.UPLOAD_ERROR);
    9. return R.ok().message("删除成功");
    10. }else{
    11. return R.error().message("删除失败");
    12. }
    13. }

    3、新增数据

    1. @ApiOperation("新增积分等级")
    2. @PostMapping("/save")
    3. public R save(
    4. @ApiParam(value = "积分等级对象", required = true)
    5. @RequestBody IntegralGrade integralGrade){
    6. boolean result = integralGradeService.save(integralGrade);
    7. if (result) {
    8. return R.ok().message("保存成功");
    9. } else {
    10. return R.error().message("保存失败");
    11. }
    12. }

    4、根据id查询

    1. @ApiOperation("根据id获取积分等级")
    2. @GetMapping("/get/{id}")
    3. public R getById(
    4. @ApiParam(value = "数据id", required = true, example = "1")
    5. @PathVariable Long id
    6. ){
    7. IntegralGrade integralGrade = integralGradeService.getById(id);
    8. if(integralGrade != null){
    9. return R.ok().data("record", integralGrade);
    10. }else{
    11. return R.error().message("数据不存在");
    12. }
    13. }

    5、根据id修改

    1. @ApiOperation("更新积分等级")
    2. @PutMapping("/update")
    3. public R updateById(
    4. @ApiParam(value = "积分等级对象", required = true)
    5. @RequestBody IntegralGrade integralGrade){
    6. boolean result = integralGradeService.updateById(integralGrade);
    7. if(result){
    8. return R.ok().message("修改成功");
    9. }else{
    10. return R.error().message("修改失败");
    11. }
    12. }

  • 相关阅读:
    【qt5基础---堆栈与目录列表】简洁的电子书qt5框架设计
    bash和dash的区别(及示例)
    函数式编程之递归的几种方式
    双十一游戏党必备的数码好物有哪些?2022双11游戏党必备外设清单
    WPF/C#:在WPF中如何实现依赖注入
    科大讯飞--技术二面面经
    建模仿真分析软件:Wolfram SystemModeler mac
    Sigma中的数字增益放大/降低方法
    docker 部署node项目
    招投标系统软件源码,招投标全流程在线化管理
  • 原文地址:https://blog.csdn.net/m0_62436868/article/details/126616365