瑞吉外卖中r类的作用

在瑞吉外卖项目中,R 类通常用于封装响应结果,以便在控制器层返回统一的响应格式。通过使用 R 类,可以确保所有 API 返回的数据格式一致,便于前端解析和处理。这种设计模式在实际开发中非常常见,有助于提高代码的可维护性和可读性。

主要作用

  1. 封装响应结果:将响应数据和状态信息封装在一起,形成一个标准的响应格式。
  2. 统一响应格式:确保所有 API 返回的数据格式一致,便于前端解析。
  3. 简化控制器层代码 :通过 R 类提供的静态方法,可以在控制器层快速返回响应结果,减少重复代码。

示例代码

假设 R 类的定义如下:

java 复制代码
package com.itheima.reggie.utils;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * 统一响应结果类
 */
@Data
public class R<T> {
    private Integer code; // 响应码
    private String msg;   // 响应消息
    private T data;       // 响应数据
    private Map<String, Object> map = new HashMap<>(); // 扩展数据

    // 成功响应
    public static <T> R<T> success(T data) {
        R<T> r = new R<>();
        r.setCode(200);
        r.setMsg("成功");
        r.setData(data);
        return r;
    }

    // 成功响应(无数据)
    public static <T> R<T> success() {
        return success(null);
    }

    // 失败响应
    public static <T> R<T> error(String msg) {
        R<T> r = new R<>();
        r.setCode(500);
        r.setMsg(msg);
        return r;
    }

    // 失败响应(自定义状态码和消息)
    public static <T> R<T> error(Integer code, String msg) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setMsg(msg);
        return r;
    }

    // 添加扩展数据
    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }
}

详细解释

  1. 属性:

    • code:响应码,用于标识请求的状态。
    • msg:响应消息,用于描述请求的结果。
    • data:响应数据,用于返回具体的业务数据。
    • map:扩展数据,用于返回额外的信息。
  2. 构造方法:

    • R 类没有显式的构造方法,通过静态方法创建实例。
  3. 静态方法:

    • success(T data):创建一个成功的响应结果,包含数据。
    • success():创建一个成功的响应结果,不包含数据。
    • error(String msg):创建一个失败的响应结果,包含错误消息。
    • error(Integer code, String msg):创建一个失败的响应结果,包含自定义的状态码和错误消息。
  4. 扩展数据:

    • add(String key, Object value):添加扩展数据,返回当前对象,支持链式调用。

使用示例

在控制器类中,可以通过 R 类提供的静态方法快速返回响应结果:

java 复制代码
package com.itheima.reggie.controller;

import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.EmployeeService;
import com.itheima.reggie.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @PostMapping("/login")
    public R<Employee> login(@RequestBody Employee employee) {
        // 处理登录逻辑...
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));

        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
        Employee emp = employeeService.getOne(queryWrapper);

        if (emp == null) {
            return R.error("用户不存在");
        }

        if (!emp.getPassword().equals(password)) {
            return R.error("密码不正确");
        }

        if (emp.getStatus() == 0) {
            return R.error("账号已禁用");
        }

        return R.success(emp);
    }

    @PostMapping("/register")
    public R<String> register(@RequestBody Employee employee) {
        // 检查用户名是否已存在
        if (employeeService.checkUsernameExists(employee.getUsername())) {
            return R.error("用户名已存在");
        }

        // 设置默认密码并加密
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes(StandardCharsets.UTF_8)));

        // 保存新用户
        employeeService.save(employee);

        return R.success("注册成功").add("userId", employee.getId());
    }
}

总结

R 类的主要作用是封装响应结果,确保所有 API 返回的数据格式一致。通过使用 R 类提供的静态方法,可以在控制器层快速返回响应结果,减少重复代码,提高代码的可维护性和可读性。

相关推荐
夕除8 分钟前
redis--主从还是集群,内存
java·spring·mybatis
马优晨23 分钟前
Java中的dto是什么
java·开发语言·java中的dto是什么·java的dto是什么·dto在java中是什么
itmigrate35 分钟前
PHP 导出大 CSV 时内存溢出的一次排查
android·开发语言·php
霸道流氓气质41 分钟前
AI 简历制作平台:结构化输出解析、多模板渲染与 PDF 导出的 Vue3 + Spring AI 全栈实战
人工智能·spring·pdf
打工仔折腾 AI1 小时前
Spring AI + Qwen 周报生成实战:从原始日志到人工确认卡
人工智能·后端·python·spring·elasticsearch·ai agent 实战
YSL0701241 小时前
一文通关-----栈和队列
开发语言·数据结构
开开心心就好1 小时前
手机电池健康怎么查?看容量温度循环次数
spring·智能手机·ffmpeg·计算机外设·电脑·maven·音视频
维克兜率天1 小时前
【维克】统计套利建模:从因子到信号的完整流程
android·开发语言·python·算法·kotlin
Pin_Qing1 小时前
同一天,谷歌半价卖旗舰,阶跃翻倍收缓存
大数据·开发语言·人工智能·程序人生·缓存
2501_930707781 小时前
使用C#代码在 Word 文档中添加、插入或删除页面
开发语言·c#·word