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;
