1. 后端请求返回类封装
1-1 数据结构
{
"code": "200",
"msg": "操作成功",
"data": {}
}
{
"code": "500",
"msg": "操作失败",
"data": null
}
1-2 具体封装类
- 位置: com.mts.common.response.ResponseResult
package cn.xuexiluxian.open.common.response;
import cn.xuexiluxian.open.common.enums.ResultStatusCodeEnum;
import cn.xuexiluxian.open.common.exception.BusinessException;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.beans.Transient;
import java.io.Serializable;
/**
* 返回数据
*/
public class ResponseResult<T> implements Serializable {
/**
* 状态码
*/
private String code;
/**
* 状态信息
*/
private String msg;
/**
* 结果数据
*/
private T data;
/**
* 返回成功状态
*/
public static ResponseResult ok() {
return new ResponseResult(ResultStatusCodeEnum.HTTP_SUCCESS.getCode(), ResultStatusCodeEnum.HTTP_SUCCESS.getDesc(), null);
}
/**
* 返回成功数据
*
* @param data 数据
*/
public static <T> ResponseResult<T> ok(T data) {
return new ResponseResult(ResultStatusCodeEnum.HTTP_SUCCESS.getCode(), ResultStatusCodeEnum.HTTP_SUCCESS.getDesc(), data);
}
public static <T> ResponseResult<T> error(String code,String desc,T data) {
return new ResponseResult(code, desc, data);
}
/**
* 返回错误结果
*
* @param ResultStatusCodeEnum 状态码
*/
public static <T> ResponseResult<T> error(ResultStatusCodeEnum ResultStatusCodeEnum) {
return new ResponseResult(ResultStatusCodeEnum.getCode(), ResultStatusCodeEnum.getDesc(), null);
}
/**
* 返回错误结果
*
* @param msg 错误信息
*/
public static <T> ResponseResult<T> error(String msg) {
return new ResponseResult(ResultStatusCodeEnum.HTTP_ERROR.getCode(), msg, null);
}
/**
* 返回错误结果: 带错误数据
*
* @param ResultStatusCodeEnum 状态码
* @param data 错误数据
*/
public static <T> ResponseResult<T> error(ResultStatusCodeEnum ResultStatusCodeEnum, T data) {
return new ResponseResult(ResultStatusCodeEnum.getCode(), "", data);
}
public static <T> ResponseResult<T> error(BusinessException e) {
return new ResponseResult(e.getCode(), e.getMessage(), null);
}
public static <T> ResponseResult<T> error(String code, String msg) {
return new ResponseResult(code, msg, null);
}
public boolean isOk() {
return ResultStatusCodeEnum.HTTP_SUCCESS.getCode().equals(code);
}
}
- 位置: com.mts.common.enums
package cn.xuexiluxian.open.common.enums;
public enum ResultStatusCodeEnum {
//HTTP返回值
HTTP_SUCCESS("200","操作成功"),
HTTP_ERROR("500","操作失败"),
HTTP_EXCEPTION("400","服务器错误"),
HTTP_MEDIATYPENOTSUPPORT("415","不支持的媒体类型"),
HTTP_NOTUPDATE("304","资源未修改"),
HTTP_NOTNOTAUTHORIZE("401","请求未授权"),
HTTP_FORBIDDEN("403","禁止访问"),
HTTP_NOTFOUND("404","资源不存在"),
HTTP_METHODNOTSUPPORT("405","方法不支持"),
USER_NOLOGIN("10001","用户未登录"),
USERNAME_PASSWORD_ERROR("10002","用户名或密码错误"),
USER_STATUS_DISABLE("10003","用户已禁用"),
USER_LOGIN_ERROR("10004","登录失败"),
USER_EXIST("10005","用户已存在"),
USER_PASSWORD_NOTMATCH("10007","密码不匹配"),
USER_LOGIN_EXPIRED("10008","登录超时"),
USER_TWOPASSWORD_NOTMATCH("10009","两次密码输入不一致"),
USER_NOT_EXIST("10010","用户不存在"),
MOBILE_NOT_EMPTY("10011","手机号为空"),
CAPTCHA_NOT_EMPTY("10012","验证码为空"),
CAPTCHA_ERROR("10013", "验证码输入错误"),
MOBILE_ERROR("10014", "手机号输入不正确"),
PASSWORD_NOT_EXIST("10015", "密码为空"),
MOBILE_BINDED("10016", "手机号已绑定其它用户"),
USER_NOT_MATCH("10017", "用户不匹配"),
SERVER_CAPTCHA_ERROR("10018", "服务器验证码错误"),
USERNAME_NOT_SET("10021", "未设置用户名"),
CAPTCHA_EXPIRED("10022", "验证码已过期"),
EMAIL_NOT_EMPTY("10023","邮箱为空"),
EMAIL_BINDED("10024", "邮箱已绑定其它用户"),
WECHAT_NOT_BIND("10025", "该微信未绑定账号"),
WECHAT_BINDED("10026", "该微信已绑定其它账号"),
USER_NOT_BIND_WECHAT("10027", "该账号还未绑定微信"),
PARAM_REQUIRE_ERROR("20001", "缺少必要参数"),
PARAM_ILLEGAL("20002", "参数信息不合法"),
PARAM_FILE_OVER_SIZE_ERROR("20003", "上传文件过大"),
PERMISSION_DENIED("20004", "无操作权限"),
REPEATED_PHONE("20004", "该手机号已登记"),
DATA_NO_EXIST("30001", "数据不存在"),
BUILT_IN_DATA_NODELETE("30002", "内置数据不允许删除"),
BUILT_IN_DATA_NOUPDATE("30003", "内置数据不允许修改"),
DATA_EXIST("30004", "数据已存在"),
DATA_HAS_CHILDREN("30005", "数据存在下级资源"),
DATA_HAS_RESOURCES("30006", "数据存在引用资源"),
DELETE_FAIL("30007","数据删除失败"),
DELETE_BATCH_ISNULL("30008","请勾选要删除的数据"),
CHANNEL_NUM_IS_NULL("30009","渠道下学员数量为空无法合并"),
MONEY_ERROR("30010","金额录入错误请核实"),
STOCK_ERROR("30011","库存不足"),
TARGET_REPEAT("30012","标签重复"),
TERM_ERROR("30013","请按顺序缴纳分期"),
STUDENT_NOT_ENROLL("30014","学员还未报名"),
MAX_DAY_ERROR("30015","学员还未报名"),
ORDER_REFUNDED("30016","订单已经退款"),
ORDER_REFUND_REVOKE("30017","退款申请已撤销"),
ORDER_REFUND_VERIFYED("30018","退款申请已审核"),
ORDER_REFUND_FAIL("30019","退款申请审核未通过"),
TOKEN_NOT_EXIST("50001", "Authorization Token不存在"),
TOKEN_INVALID("50002", "Authorization Token无效"),
TOKEN_EXPIRED("50003", "Authorization Token已过期"),
LOGIN_PARAM_REQUIRE_ERROR("50004", "开启了登录验证码校验,缺少参数[key,captcha]"),
;
private String code;
private String desc;
private ResultStatusCodeEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
/**
* 分页查询用户
* @param page
* @param params
* @return
*/
public ResponseResult page(Page page, SystemUserREQ params) {
params.setDelFlag(0);
Page<SystemUser> pageList = systemUserService.pageList(page, params);
return ResponseResult.ok(pageList); // 1 成功并携带数据
}
2. Lombok
2-1 maven
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2-2 常用注解
| ① 注解 | ② 位置 | ③ 作用 (替代原来的什么代码) |
|---|---|---|
| @Data | 类 | 是一个复合注解,集合了 @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 的功能。 替代:为 POJO 类手写上述所有模板代码。 |
| @Getter / @Setter | 类或字段 | 自动生成所有字段或特定字段的 getter/setter 方法。 替代:手写的 public String getName() { return this.name; }等方法。 |
| @ToString | 类 | 自动生成 toString() 方法,包含所有字段。 替代:手写的 return “Person(name=” + name + ...)。 |
| @EqualsAndHashCode | 类 | 自动生成 equals() 和 hashCode() 方法。 替代:手写的判断对象逻辑相等和计算哈希值的冗长代码。 |
| @NoArgsConstructor | 类 | 自动生成无参构造方法。 替代:手写的 public Person() {}。 |
| @AllArgsConstructor | 类 | 自动生成包含所有字段的构造方法。 替代:手写的 public Person(String name, int age) {...}。 |
| @RequiredArgsConstructor | 类 | 为所有 final字段和标记了 @NonNull的字段生成构造方法。 替代:为必需字段手写构造方法。 |
| @Builder | 类 | 提供建造者模式 API,用于以链式调用方式创建对象。 替代:手写 Builder 模式的内部类和相关方法。 |
| @Slf4j | 类 | 自动生成一个名为 log的 SLF4J 日志对象。替代:手写的 private static final Logger log = LoggerFactory.getLogger(ClassName.class);。 |
| @Value | 类 | 创建不可变类(类似 @Data的不可变版本)。所有字段默认 private final,只生成 getter,不生成 setter,类本身声明为 final。 替代:手写一个所有字段为 final且只有 getter 的不可变类。 |
3. 跨越问题
3-1 SpringBoot配置
- 位置: com.mts.config.CorsConfig
package com.mts.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
public class CorsConfig implements WebMvcConfigurer {
// 通过WebMvcConfigurer配置 解决跨域
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 匹配所有路径
.allowedOriginPatterns("*") // 支持所有域名
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 支持方法
.allowedHeaders("*") // 允许所有请求头
.allowCredentials(true) // 允许携带凭证
.maxAge(3600); // 预检请求的有效期
}
}
- Title:
- Author: 明廷盛
- Created at : 2026-04-06 10:09:35
- Updated at : 2026-04-06 10:09:35
- Link: https://blog.20040424.xyz/2026/04/06/😼Java全栈工程师/第四部分 中间件/7. 后端零碎技术/
- License: All Rights Reserved © 明廷盛