瑞吉外卖中r类的作用
在瑞吉外卖项目中,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 {
@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 类提供的静态方法,可以在控制器层快速返反响应结果,减少重复代码,提高代码的可维护性和可读性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]