当前位置: 首页 > news >正文

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

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

一、定义统一返回结果

1、数据格式的定义

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

 因此,我们定义统一结果

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

2、创建枚举

在guigu-common中创建result包,创建枚举 ResponseEnum
@Getter
@AllArgsConstructor
@ToString
public enum ResponseEnum {

    SUCCESS(0, "成功"),
    ERROR(-1, "服务器内部错误"),
    ;

    // 响应状态码
    private Integer code;
    // 响应信息
    private String message;
}

完整版本

@Getter
@AllArgsConstructor
@ToString
public enum ResponseEnum {

    SUCCESS(0,"成功"),
    ERROR(-1,"服务器内部乘错误"),
    //-1xx 服务器错误
    BAD_SQL_GRAMMAR_ERROR(-101, "sql语法错误"),
    SERVLET_ERROR(-102, "servlet请求异常"), //-2xx 参数校验
    UPLOAD_ERROR(-103, "文件上传错误"),
    EXPORT_DATA_ERROR(104, "数据导出失败"),


    //-2xx 参数校验
    BORROW_AMOUNT_NULL_ERROR(-201, "借款额度不能为空"),
    MOBILE_NULL_ERROR(-202, "手机号码不能为空"),
    MOBILE_ERROR(-203, "手机号码不正确"),
    PASSWORD_NULL_ERROR(204, "密码不能为空"),
    CODE_NULL_ERROR(205, "验证码不能为空"),
    CODE_ERROR(206, "验证码错误"),
    MOBILE_EXIST_ERROR(207, "手机号已被注册"),
    LOGIN_MOBILE_ERROR(208, "用户不存在"),
    LOGIN_PASSWORD_ERROR(209, "密码错误"),
    LOGIN_LOKED_ERROR(210, "用户被锁定"),
    LOGIN_AUTH_ERROR(-211, "未登录"),


    USER_BIND_IDCARD_EXIST_ERROR(-301, "身份证号码已绑定"),
    USER_NO_BIND_ERROR(302, "用户未绑定"),
    USER_NO_AMOUNT_ERROR(303, "用户信息未审核"),
    USER_AMOUNT_LESS_ERROR(304, "您的借款额度不足"),
    LEND_INVEST_ERROR(305, "当前状态无法投标"),
    LEND_FULL_SCALE_ERROR(306, "已满标,无法投标"),
    NOT_SUFFICIENT_FUNDS_ERROR(307, "余额不足,请充值"),

    PAY_UNIFIEDORDER_ERROR(401, "统一下单错误"),

    ALIYUN_SMS_LIMIT_CONTROL_ERROR(-502, "短信发送过于频繁"),//业务限流
    ALIYUN_SMS_ERROR(-503, "短信发送失败"),//其他失败

    WEIXIN_CALLBACK_PARAM_ERROR(-601, "回调参数不正确"),
    WEIXIN_FETCH_ACCESSTOKEN_ERROR(-602, "获取access_token失败"),
    WEIXIN_FETCH_USERINFO_ERROR(-603, "获取用户信息失败");

    //响应状态码
    private  Integer code;
    //响应信息
    private  String message;
}

3、定义同统一结果类

@Data
public class R {

    private Integer code;

    private String message;

    private Map<String, Object> data = new HashMap();

    /**
     * 构造器私有
     */
    private R(){}

    /**
     * 返回成功
     */
    public static R ok(){
        R r = new R();
        r.setCode(ResponseEnum.SUCCESS.getCode());
        r.setMessage(ResponseEnum.SUCCESS.getMessage());
        return r;
    }

    /**
     * 返回失败
     */
    public static R error(){
        R r = new R();
        r.setCode(ResponseEnum.ERROR.getCode());
        r.setMessage(ResponseEnum.ERROR.getMessage());
        return r;
    }

    /**
     * 设置特定结果
     */
    public static R setResult(ResponseEnum responseEnum){
        R r = new R();
        r.setCode(responseEnum.getCode());
        r.setMessage(responseEnum.getMessage());
        return r;
    }

    public R message(String message){
        this.setMessage(message);
        return this;
    }

    public R code(Integer code){
        this.setCode(code);
        return this;
    }

    public R data(String key, Object value){
        this.data.put(key, value);
        return this;
    }

    public R data(Map<String, Object> map){
        this.setData(map);
        return this;
    }
}

这里采用了链式编程思想

三、使用统一返回结果

1、修改listAll

@ApiOperation("积分等级列表")
@GetMapping("/list")
public R listAll(){
    List<IntegralGrade> list = integralGradeService.list();
    return R.ok().data("list", list);
}

2、修改removeById

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

3、新增数据

@ApiOperation("新增积分等级")
@PostMapping("/save")
public R save(
    @ApiParam(value = "积分等级对象", required = true)
    @RequestBody IntegralGrade integralGrade){
    boolean result = integralGradeService.save(integralGrade);
    if (result) {
        return R.ok().message("保存成功");
    } else {
        return R.error().message("保存失败");
    }
}

4、根据id查询

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

5、根据id修改

@ApiOperation("更新积分等级")
@PutMapping("/update")
public R updateById(
    @ApiParam(value = "积分等级对象", required = true)
    @RequestBody IntegralGrade integralGrade){
    boolean result = integralGradeService.updateById(integralGrade);
    if(result){
        return R.ok().message("修改成功");
    }else{
        return R.error().message("修改失败");
    }
}

相关文章:

  • 『每日算法 · 基础知识篇』备战面试,坚持算法 第一话——对数器!
  • 【开卷数据结构 】2-3树
  • C/C++教程 从入门到精通《第二十一章》——Qt界面开发
  • STM32学习笔记:读写内部FLASH
  • Git 实战(三) | Github 必会高频基础命令与 IDE 的 Git 集成
  • Docker 镜像构建可以分享的快乐
  • ADC_内部电路Rsh和Csh和转换速率Tconv以及频率fs
  • Hive的基本操作
  • vue、vscode格式规范prettier、eslint、git commit
  • Revit中门窗如何使用遮罩区域?及CAD生成门窗?
  • windows下使用docker
  • c# iot .net 6 树莓派 读取光敏传感器四针+模拟转数字模块 代码实例
  • Hexagon_V65_Programmers_Reference_Manual(37)
  • JSD-2204-(业务逻辑开发)-续开发购物车功能-新增订单功能-Leaf-Day10
  • 计算机中常见英文术语对照表
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Android 控件背景颜色处理
  • ES6 ...操作符
  • express.js的介绍及使用
  • golang 发送GET和POST示例
  • Java超时控制的实现
  • jquery ajax学习笔记
  • Laravel 菜鸟晋级之路
  • miaov-React 最佳入门
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Puppeteer:浏览器控制器
  • python 装饰器(一)
  • React系列之 Redux 架构模式
  • vue--为什么data属性必须是一个函数
  • 解决iview多表头动态更改列元素发生的错误
  • 听说你叫Java(二)–Servlet请求
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #if和#ifdef区别
  • #QT(串口助手-界面)
  • #前后端分离# 头条发布系统
  • (+4)2.2UML建模图
  • (2)Java 简介
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)linux 命令大全
  • 、写入Shellcode到注册表上线
  • .equals()到底是什么意思?
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net 4.0并行库实用性演练
  • .net core 6 集成和使用 mongodb
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET和.COM和.CN域名区别
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • // an array of int
  • [ 蓝桥杯Web真题 ]-布局切换