在瑞吉外卖项目中,R
类通常用于封装响应结果,以便在控制器层返回统一的响应格式。通过使用 R
类,可以确保所有 API 返回的数据格式一致,便于前端解析和处理。这种设计模式在实际开发中非常常见,有助于提高代码的可维护性和可读性。
主要作用
- 封装响应结果:将响应数据和状态信息封装在一起,形成一个标准的响应格式。
- 统一响应格式:确保所有 API 返回的数据格式一致,便于前端解析。
- 简化控制器层代码:通过
R
类提供的静态方法,可以在控制器层快速返回响应结果,减少重复代码。
示例代码
假设 R
类的定义如下:
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;}
}
详细解释
-
属性:
code
:响应码,用于标识请求的状态。msg
:响应消息,用于描述请求的结果。data
:响应数据,用于返回具体的业务数据。map
:扩展数据,用于返回额外的信息。
-
构造方法:
R
类没有显式的构造方法,通过静态方法创建实例。
-
静态方法:
success(T data)
:创建一个成功的响应结果,包含数据。success()
:创建一个成功的响应结果,不包含数据。error(String msg)
:创建一个失败的响应结果,包含错误消息。error(Integer code, String msg)
:创建一个失败的响应结果,包含自定义的状态码和错误消息。
-
扩展数据:
add(String key, Object value)
:添加扩展数据,返回当前对象,支持链式调用。
使用示例
在控制器类中,可以通过 R
类提供的静态方法快速返回响应结果:
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 {@Autowiredprivate 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
类提供的静态方法,可以在控制器层快速返回响应结果,减少重复代码,提高代码的可维护性和可读性。