明廷盛 嘻嘻😁

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;

/**
* 返回数据
*/
@Data
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor
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);
}

@Transient
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
*/
@GetMapping(value = "page")
@Log(title = "用户管理", businessType = BusinessType.SELECT)
@PreAuthorize("@permission.hasPermission('system:user:page')")
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;

@Configuration
public class CorsConfig implements WebMvcConfigurer {

// 通过WebMvcConfigurer配置 解决跨域
@Override
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 © 明廷盛