- 重新组织了代码。
1. 将控制器类集中到api包下。
2. 将dto,实体类抽到原本的model包下。
- 重写了swagger接口的文本信息。
- 为项目配置热重载的依赖
Change-Id: Ifc9a4eed57846cfcd3566bf66a9a672430aa3e51
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/user/UserController.java b/src/main/java/edu/bjtu/groupone/backend/api/user/UserController.java
new file mode 100644
index 0000000..4d85c18
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/api/user/UserController.java
@@ -0,0 +1,297 @@
+// src/main/java/edu/bjtu/groupone/backend/api/user/UserController.java
+package edu.bjtu.groupone.backend.api.user;
+
+import edu.bjtu.groupone.backend.domain.dto.*;
+import edu.bjtu.groupone.backend.domain.entity.User;
+import edu.bjtu.groupone.backend.service.UserService;
+import edu.bjtu.groupone.backend.utils.JwtUtils;
+import edu.bjtu.groupone.backend.domain.entity.Result;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.ExampleObject;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@CrossOrigin
+@Tag(name = "用户相关接口") //输入http://localhost:8080/swagger-ui/index.html或http://localhost:8080/v3/api-docs/可查看接口文档
+@RestController
+@Slf4j
+public class UserController {
+
+ @Autowired
+ private UserService userService;
+
+ /**
+ * 邮箱+密码 登录
+ */
+ @Operation(
+ summary = "用户登录",
+ description = "使用邮箱和密码进行登录,成功后返回 JWT token",
+ responses = {
+ @ApiResponse(
+ responseCode = "200",
+ description = "登录成功",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "登录成功示例",
+ value = "{\"code\":200,\"message\":\"操作成功\",\"data\":\"lyJhbGciOUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJ0ZXN0IiwiZW1haWwiOiJ0ZXN0QGV4YW1wbGUuY29tIiwiaWF0IjoxNjU2NjU0MjQ0LCJleHAiOjE2NTY2NTc4NDR9.qBjQJZ6ZJZ6ZJZ6ZJZ6ZJZ6ZJZ6ZJZ6ZJZ6ZJZw\"}"
+ )
+ )
+ ),
+ @ApiResponse(
+ responseCode = "400",
+ description = "邮箱或密码错误",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "登录失败示例",
+ value = "{\"code\":400,\"message\":\"邮箱或密码错误\",\"data\":null}"
+ )
+ )
+ )
+ }
+ )
+ @PostMapping("/login")
+ public Result<String> login(@Valid @RequestBody LoginRequest request) {
+ User u = new User();
+ u.setEmail(request.getEmail());
+ u.setPassword(request.getPassword());
+ User user = userService.login(u);
+ if (user != null) {
+ var payload = java.util.Map.<String, Object>of(
+ "id", user.getUserId(),
+ "username", user.getUsername(),
+ "email", user.getEmail()
+ );
+ String token = JwtUtils.generateJwt(payload);
+ return Result.success(token);
+ }
+ return Result.error("邮箱或密码错误");
+ }
+
+ /**
+ * 注册
+ */
+ @Operation(
+ summary = "用户注册",
+ description = "注册新用户,必须提供用户名、邮箱、验证码、密码和身份证号码",
+ responses = {
+ @ApiResponse(
+ responseCode = "200",
+ description = "注册成功",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "注册成功示例",
+ value = "{\"code\":200,\"message\":\"注册成功\",\"data\":null}"
+ )
+ )
+ ),
+ @ApiResponse(
+ responseCode = "400",
+ description = "参数错误或用户已存在",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "注册失败示例",
+ value = "{\"code\":400,\"message\":\"邮箱已被注册\",\"data\":null}"
+ )
+ )
+ )
+ }
+ )
+ @PostMapping("/register")
+ public Result<String> register(@Valid @RequestBody RegisterRequest request) {
+ String email = request.getEmail();
+ String code = request.getVerificationCode();
+ String pwd = request.getPassword();
+ String idNumStr = request.getIdentificationNumber();
+
+ // 验证验证码
+ if (!userService.verifyCode(email, code)) {
+ return Result.error("验证码错误或已过期");
+ }
+
+ // 检查邮箱是否已注册
+ if (userService.isEmailExists(email)) {
+ return Result.error("邮箱已被注册");
+ }
+
+ // 检查用户名是否已存在
+ String username = request.getUsername();
+ if (username != null && userService.isUsernameExists(username)) {
+ return Result.error("用户名已被占用");
+ }
+
+ // 验证身份证号码
+ int idNum = Integer.parseInt(idNumStr);
+ if (userService.isIdentificationNumberExists(idNum)) {
+ return Result.error("身份证号码已被注册");
+ }
+
+ // 创建新用户
+ User newUser = new User();
+ newUser.setUsername(username);
+ newUser.setEmail(email);
+ newUser.setPassword(pwd);
+ newUser.setIdentificationNumber(idNum);
+
+ userService.register(newUser);
+ return Result.success("注册成功");
+ }
+
+ /**
+ * 发送注册验证码
+ */
+ @Operation(
+ summary = "发送注册验证码",
+ description = "向指定邮箱发送注册验证码",
+ responses = {
+ @ApiResponse(
+ responseCode = "200",
+ description = "验证码已发送",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "发送成功示例",
+ value = "{\"code\":200,\"message\":\"验证码已发送\",\"data\":null}"
+ )
+ )
+ ),
+ @ApiResponse(
+ responseCode = "400",
+ description = "邮箱不能为空",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "发送失败示例",
+ value = "{\"code\":400,\"message\":\"邮箱不能为空\",\"data\":null}"
+ )
+ )
+ )
+ }
+ )
+ @PostMapping("/sendVerification")
+ public Result<String> sendVerification(@RequestBody @Parameter(description = "邮箱请求体") EmailRequest request) {
+ String email = request.getEmail();
+ if (email == null) {
+ return Result.error("邮箱不能为空");
+ }
+ userService.sendVerificationCode(email);
+ return Result.success("验证码已发送");
+ }
+
+ @Operation(
+ summary = "发送重置密码验证码",
+ description = "向指定邮箱发送重置密码的验证码",
+ responses = {
+ @ApiResponse(
+ responseCode = "200",
+ description = "重置验证码已发送",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "发送成功示例",
+ value = "{\"code\":200,\"message\":\"重置验证码已发送\",\"data\":null}"
+ )
+ )
+ )
+ }
+ )
+ @PostMapping("/sendResetCode")
+ public Result<String> sendResetCode(@RequestBody EmailRequest request) {
+ String email = request.getEmail();
+ userService.sendResetCode(email);
+ return Result.success("重置验证码已发送");
+ }
+
+ @Operation(
+ summary = "重置密码",
+ description = "根据邮箱和验证码重置密码",
+ responses = {
+ @ApiResponse(
+ responseCode = "200",
+ description = "密码已重置",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "重置成功示例",
+ value = "{\"code\":200,\"message\":\"密码已重置\",\"data\":null}"
+ )
+ )
+ ),
+ @ApiResponse(
+ responseCode = "400",
+ description = "验证码错误或已过期",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "重置失败示例",
+ value = "{\"code\":400,\"message\":\"验证码错误或已过期\",\"data\":null}"
+ )
+ )
+ )
+ }
+ )
+ @PostMapping("/resetPassword")
+ public Result<String> resetPassword(@Valid @RequestBody ResetPasswordRequest request) {
+ boolean ok = userService.resetPassword(request.getEmail(), request.getCode(), request.getNewPassword());
+ return ok
+ ? Result.success("密码已重置")
+ : Result.error("验证码错误或已过期");
+ }
+
+ /**
+ * 前端受保护页面获取当前用户信息
+ */
+ @Operation(
+ summary = "获取当前用户信息",
+ description = "需要提供有效的 JWT token",
+ responses = {
+ @ApiResponse(
+ responseCode = "200",
+ description = "获取用户信息成功",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "获取成功示例",
+ value = "{\"code\":200,\"message\":\"操作成功\",\"data\":{\"username\":\"test\",\"token\":\"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJ0ZXN0IiwiZW1haWwiOiJ0ZXN0QGV4YW1wbGUuY29tIiwiaWF0IjoxNjU2NjU0MjQ0LCJleHAiOjE2NTY2NTc4NDR9.qBjQJZ6ZJZ6ZJZ6ZJZ6ZJZ6ZJZ6ZJZ6ZJZ6ZJZw\"}}"
+ )
+ )
+ ),
+ @ApiResponse(
+ responseCode = "401",
+ description = "无效的 token",
+ content = @Content(
+ schema = @Schema(implementation = Result.class),
+ examples = @ExampleObject(
+ name = "获取失败示例",
+ value = "{\"code\":401,\"message\":\"无效的 token\",\"data\":null}"
+ )
+ )
+ )
+ }
+ )
+ @GetMapping("/api/me")
+ public Result<UserInfoResponse> me(@Parameter(in = ParameterIn.HEADER, description = "JWT认证令牌") @RequestHeader("token") String token) {
+ var claims = JwtUtils.parseJwt(token);
+ if (claims == null) {
+ return Result.error("无效的 token");
+ }
+ UserInfoResponse info = new UserInfoResponse(
+ (String) claims.get("username"),
+ token
+ );
+ return Result.success(info);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/controller/UserController.java b/src/main/java/edu/bjtu/groupone/backend/controller/UserController.java
deleted file mode 100644
index 0f32a74..0000000
--- a/src/main/java/edu/bjtu/groupone/backend/controller/UserController.java
+++ /dev/null
@@ -1,137 +0,0 @@
-// src/main/java/edu/bjtu/groupone/backend/controller/UserController.java
-package edu.bjtu.groupone.backend.controller;
-
-import edu.bjtu.groupone.backend.model.Result;
-import edu.bjtu.groupone.backend.model.User;
-import edu.bjtu.groupone.backend.service.UserService;
-import edu.bjtu.groupone.backend.utils.JwtUtils;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-@CrossOrigin
-@Tag(name = "用户相关接口") //输入http://localhost:8080/swagger-ui/index.html或http://localhost:8080/v3/api-docs/可查看接口文档
-@RestController
-@Slf4j
-public class UserController {
-
- @Autowired
- private UserService userService;
-
- /** 邮箱+密码 登录 */
- @Operation(summary = "用户登录", description = "使用邮箱和密码进行登录,成功后返回 JWT token")
- @PostMapping("/login")
- public Result login(@RequestBody Map<String,String> body) {
- String email = body.get("email");
- String password = body.get("password");
- if (email == null || password == null) {
- return Result.error("参数不完整");
- }
- User u = new User();
- u.setEmail(email);
- u.setPassword(password);
- User user = userService.login(u);
- if (user != null) {
- var payload = Map.<String,Object>of(
- "id", user.getUserId(),
- "username", user.getUsername(),
- "email", user.getEmail()
- );
- String token = JwtUtils.generateJwt(payload);
- return Result.success(token);
- }
- return Result.error("邮箱或密码错误");
- }
-
- /** 注册 */
- @Operation(summary = "用户注册", description = "注册新用户,必须提供用户名、邮箱、验证码、密码和身份证号码")
- @PostMapping("/register")
- public Result register(@RequestBody Map<String,String> body) {
- String username = body.get("username");
- String email = body.get("email");
- String code = body.get("verificationCode");
- String pwd = body.get("password");
- String idNumStr = body.get("identificationNumber");
- if (email==null||code==null||pwd==null||idNumStr==null) {
- return Result.error("参数不完整");
- }
- int idNum = Integer.parseInt(idNumStr);
- if (!userService.verifyCode(email, code)) {
- return Result.error("验证码错误或已过期");
- }
- if (userService.isEmailExists(email)) {
- return Result.error("邮箱已被注册");
- }
- if (username!=null && userService.isUsernameExists(username)) {
- return Result.error("用户名已被占用");
- }
- if (idNumStr == null || idNumStr.isBlank()) {
- return Result.error("身份证号码不能为空");
- }
- if (idNumStr.length() !=8){
- return Result.error("身份证号码长度不正确,应为8位");
- }
- if (userService.isIdentificationNumberExists(idNum)) {
- return Result.error("身份证号码已被注册");
- }
-
- User newUser = new User();
- newUser.setUsername(username);
- newUser.setEmail(email);
- newUser.setPassword(pwd);
- newUser.setIdentificationNumber(idNum);
- userService.register(newUser);
- return Result.success("注册成功");
- }
-
- /** 发送注册验证码 */
- @Operation(summary = "发送注册验证码", description = "向指定邮箱发送注册验证码")
- @PostMapping("/sendVerification")
- public Result sendVerification(@RequestBody Map<String,String> p) {
- String email = p.get("email");
- if (email==null) {
- return Result.error("邮箱不能为空");
- }
- userService.sendVerificationCode(email);
- return Result.success("验证码已发送");
- }
-
- @Operation(summary = "发送重置密码验证码", description = "向指定邮箱发送重置密码的验证码")
- @PostMapping("/sendResetCode")
- public Result sendResetCode(@RequestBody Map<String, String> body) {
- String email = body.get("email");
- userService.sendResetCode(email);
- return Result.success("重置验证码已发送");
- }
-
- @Operation(summary = "重置密码", description = "根据邮箱和验证码重置密码")
- @PostMapping("/resetPassword")
- public Result resetPassword(@RequestBody Map<String, String> body) {
- String email = body.get("email");
- String code = body.get("code");
- String newPassword = body.get("newPassword");
- boolean ok = userService.resetPassword(email, code, newPassword);
- return ok
- ? Result.success("密码已重置")
- : Result.error("验证码错误或已过期");
- }
-
- /** 前端受保护页面获取当前用户信息 */
- @Operation(summary = "获取当前用户信息", description = "需要提供有效的 JWT token")
- @GetMapping("/api/me")
- public Result me(@RequestHeader("token") String token) {
- var claims = JwtUtils.parseJwt(token);
- if (claims == null) {
- return Result.error("无效的 token");
- }
- var info = Map.<String,Object>of(
- "username", claims.get("username"),
- "token", token
- );
- return Result.success(info);
- }
-}
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/dto/EmailRequest.java b/src/main/java/edu/bjtu/groupone/backend/domain/dto/EmailRequest.java
new file mode 100644
index 0000000..39a400f
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/dto/EmailRequest.java
@@ -0,0 +1,17 @@
+package edu.bjtu.groupone.backend.domain.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotNull;
+
+@Data
+@Schema(description = "邮箱请求参数")
+public class EmailRequest {
+
+ @NotNull(message = "邮箱不能为空")
+ @Email(message = "请输入有效的邮箱地址")
+ @Schema(description = "用户邮箱", required = true, example = "john@example.com")
+ private String email;
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/dto/LoginRequest.java b/src/main/java/edu/bjtu/groupone/backend/domain/dto/LoginRequest.java
new file mode 100644
index 0000000..ea51006
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/dto/LoginRequest.java
@@ -0,0 +1,21 @@
+package edu.bjtu.groupone.backend.domain.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotNull;
+
+@Data
+@Schema(description = "用户登录请求参数")
+public class LoginRequest {
+
+ @NotNull(message = "邮箱不能为空")
+ @Email(message = "请输入有效的邮箱地址")
+ @Schema(description = "用户邮箱", required = true, example = "john@example.com")
+ private String email;
+
+ @NotNull(message = "密码不能为空")
+ @Schema(description = "用户密码", required = true, example = "password123")
+ private String password;
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/dto/RegisterRequest.java b/src/main/java/edu/bjtu/groupone/backend/domain/dto/RegisterRequest.java
new file mode 100644
index 0000000..fd4cc5a
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/dto/RegisterRequest.java
@@ -0,0 +1,37 @@
+package edu.bjtu.groupone.backend.domain.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.*;
+
+@Data
+@Schema(description = "用户注册请求参数")
+public class RegisterRequest {
+
+ @NotNull(message = "用户名不能为空")
+ @Size(min = 3, max = 20, message = "用户名长度必须在3到20个字符之间")
+ @Schema(description = "用户名", required = true, example = "john_doe")
+ private String username;
+
+ @NotNull(message = "邮箱不能为空")
+ @Email(message = "请输入有效的邮箱地址")
+ @Schema(description = "用户邮箱", required = true, example = "john@example.com")
+ private String email;
+
+ @NotNull(message = "验证码不能为空")
+ @Size(min = 6, max = 6, message = "验证码长度必须为6位")
+ @Schema(description = "邮箱验证码", required = true, example = "123456")
+ private String verificationCode;
+
+ @NotNull(message = "密码不能为空")
+ @Size(min = 6, message = "密码长度至少为6位")
+ @Schema(description = "用户密码", required = true, example = "password123")
+ private String password;
+
+ @NotNull(message = "身份证号码不能为空")
+ @Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X|x)$",
+ message = "请输入有效的身份证号码")
+ @Schema(description = "用户身份证号码", required = true, example = "110101199001011234")
+ private String identificationNumber;
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/dto/ResetPasswordRequest.java b/src/main/java/edu/bjtu/groupone/backend/domain/dto/ResetPasswordRequest.java
new file mode 100644
index 0000000..e964c40
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/dto/ResetPasswordRequest.java
@@ -0,0 +1,25 @@
+package edu.bjtu.groupone.backend.domain.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotNull;
+
+@Data
+@Schema(description = "重置密码请求参数")
+public class ResetPasswordRequest {
+
+ @NotNull(message = "邮箱不能为空")
+ @Email(message = "请输入有效的邮箱地址")
+ @Schema(description = "用户邮箱", required = true, example = "john@example.com")
+ private String email;
+
+ @NotNull(message = "验证码不能为空")
+ @Schema(description = "重置密码验证码", required = true, example = "654321")
+ private String code;
+
+ @NotNull(message = "新密码不能为空")
+ @Schema(description = "新密码", required = true, example = "newPassword123")
+ private String newPassword;
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/dto/UserInfoResponse.java b/src/main/java/edu/bjtu/groupone/backend/domain/dto/UserInfoResponse.java
new file mode 100644
index 0000000..99ab656
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/dto/UserInfoResponse.java
@@ -0,0 +1,20 @@
+package edu.bjtu.groupone.backend.domain.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "用户信息响应")
+public class UserInfoResponse {
+
+ @Schema(description = "用户名", example = "john_doe")
+ private String username;
+
+ @Schema(description = "JWT认证令牌", example = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")
+ private String token;
+
+ public UserInfoResponse(String username, String token) {
+ this.username = username;
+ this.token = token;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Result.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Result.java
new file mode 100644
index 0000000..f53f1b0
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Result.java
@@ -0,0 +1,61 @@
+//package edu.bjtu.groupone.backend.domain.entry;
+//
+//import lombok.AllArgsConstructor;
+//import lombok.Data;
+//import lombok.NoArgsConstructor;
+
+//@Data
+//@AllArgsConstructor
+//@NoArgsConstructor
+//public class Result {
+// private Integer code;//0表示成功,1表示失败
+// private String msg;//提示信息
+// private Object data;//要返回的数据
+// public static Result success() {//增删改响应成功
+//
+// return new Result(0, "success", null);
+// }
+// public static Result success(Object data) {//增删改响应成功
+//
+// return new Result(0, "success", data);
+// }
+// public static Result error(String msg) {//增删改响应成功
+//
+// return new Result(1, msg, null);
+// }
+//
+//}
+
+package edu.bjtu.groupone.backend.domain.entity;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "通用响应结果")
+public class Result<T> {
+ @Schema(description = "状态码:0表示成功,1表示失败", example = "0")
+ private Integer code;
+
+ @Schema(description = "提示信息", example = "操作成功")
+ private String msg;
+
+ @Schema(description = "返回数据")
+ private T data;
+
+ public static <T> Result<T> success() {
+ return new Result<>(0, "success", null);
+ }
+
+ public static <T> Result<T> success(T data) {
+ return new Result<>(0, "success", data);
+ }
+
+ public static <T> Result<T> error(String msg) {
+ return new Result<>(1, msg, null);
+ }
+}
diff --git a/src/main/java/edu/bjtu/groupone/backend/model/User.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/User.java
similarity index 90%
rename from src/main/java/edu/bjtu/groupone/backend/model/User.java
rename to src/main/java/edu/bjtu/groupone/backend/domain/entity/User.java
index 95b2f00..2e4ddef 100644
--- a/src/main/java/edu/bjtu/groupone/backend/model/User.java
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/User.java
@@ -1,4 +1,4 @@
-package edu.bjtu.groupone.backend.model;
+package edu.bjtu.groupone.backend.domain.entity;
import lombok.AllArgsConstructor;
diff --git a/src/main/java/edu/bjtu/groupone/backend/interceptor/Interceptor.java b/src/main/java/edu/bjtu/groupone/backend/interceptor/Interceptor.java
index 09c65c9..7ee8ebb 100644
--- a/src/main/java/edu/bjtu/groupone/backend/interceptor/Interceptor.java
+++ b/src/main/java/edu/bjtu/groupone/backend/interceptor/Interceptor.java
@@ -2,7 +2,7 @@
package edu.bjtu.groupone.backend.interceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
-import edu.bjtu.groupone.backend.model.Result;
+import edu.bjtu.groupone.backend.domain.entity.Result;
import edu.bjtu.groupone.backend.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
index b1bda89..8f0044d 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
@@ -1,7 +1,7 @@
package edu.bjtu.groupone.backend.mapper;
-import edu.bjtu.groupone.backend.model.User;
+import edu.bjtu.groupone.backend.domain.entity.User;
import org.apache.ibatis.annotations.*;
@Mapper
diff --git a/src/main/java/edu/bjtu/groupone/backend/model/Result.java b/src/main/java/edu/bjtu/groupone/backend/model/Result.java
deleted file mode 100644
index f3d44ec..0000000
--- a/src/main/java/edu/bjtu/groupone/backend/model/Result.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package edu.bjtu.groupone.backend.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class Result {
- private Integer code;//0表示成功,1表示失败
- private String msg;//提示信息
- private Object data;//要返回的数据
- public static Result success() {//增删改响应成功
-
- return new Result(0, "success", null);
- }
- public static Result success(Object data) {//增删改响应成功
-
- return new Result(0, "success", data);
- }
- public static Result error(String msg) {//增删改响应成功
-
- return new Result(1, msg, null);
- }
-
-}
diff --git a/src/main/java/edu/bjtu/groupone/backend/model/UserDTO.java b/src/main/java/edu/bjtu/groupone/backend/model/UserDTO.java
deleted file mode 100644
index 279ac26..0000000
--- a/src/main/java/edu/bjtu/groupone/backend/model/UserDTO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package edu.bjtu.groupone.backend.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class UserDTO {
- private User user; // 原来的 User 对象
- private boolean isFollowed; // 是否关注的状态
-
- // 构造函数
-
-}
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/UserService.java b/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
index 37831ec..be8877d 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
@@ -1,7 +1,7 @@
// src/main/java/edu/bjtu/groupone/backend/service/UserService.java
package edu.bjtu.groupone.backend.service;
-import edu.bjtu.groupone.backend.model.User;
+import edu.bjtu.groupone.backend.domain.entity.User;
public interface UserService {
User login(User user);
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java b/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
index 27ba52f..aa113cd 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
@@ -1,7 +1,7 @@
package edu.bjtu.groupone.backend.service.impl;
import edu.bjtu.groupone.backend.mapper.UserMapper;
-import edu.bjtu.groupone.backend.model.User;
+import edu.bjtu.groupone.backend.domain.entity.User;
import edu.bjtu.groupone.backend.service.UserService;
import edu.bjtu.groupone.backend.utils.EmailUtil;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
index 7e82896..f1cf6d4 100644
--- a/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
@@ -4,12 +4,11 @@
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import java.time.LocalDateTime;
import ch.qos.logback.classic.Logger;
import org.slf4j.LoggerFactory;
import edu.bjtu.groupone.backend.mapper.UserMapper;
-import edu.bjtu.groupone.backend.model.User;
+import edu.bjtu.groupone.backend.domain.entity.User;
import edu.bjtu.groupone.backend.service.impl.UserServImpl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java b/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
index beacf28..ab5a354 100644
--- a/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
@@ -3,7 +3,7 @@
import edu.bjtu.groupone.backend.mapper.UserMapper;
import edu.bjtu.groupone.backend.utils.EmailUtil;
import edu.bjtu.groupone.backend.service.impl.UserServImpl;
-import edu.bjtu.groupone.backend.model.User;
+import edu.bjtu.groupone.backend.domain.entity.User;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;