- 重新组织了代码。
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;