diff --git a/src/main/java/edu/bjtu/groupone/backend/api/CommentController.java b/src/main/java/edu/bjtu/groupone/backend/api/CommentController.java
new file mode 100644
index 0000000..d182c7e
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/api/CommentController.java
@@ -0,0 +1,58 @@
+package edu.bjtu.groupone.backend.api;
+
+import edu.bjtu.groupone.backend.domain.entity.Comment;
+import edu.bjtu.groupone.backend.domain.entity.Result;
+import edu.bjtu.groupone.backend.service.CommentService;
+import io.swagger.v3.oas.annotations.Operation;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@CrossOrigin
+@Tag(name = "评论相关接口")
+@RestController
+public class CommentController {
+
+    @Autowired
+    private CommentService commentService;
+
+    @Operation(summary = "添加评论")
+    @PostMapping("/comments")
+    public Result<String> addComment(@RequestBody Comment comment) {
+        commentService.addComment(comment);
+        return Result.success("评论添加成功");
+    }
+
+    @Operation(summary = "删除评论")
+    @DeleteMapping("/comments/{commentId}")
+    public Result<String> deleteComment(@PathVariable Long commentId) {
+        commentService.deleteComment(commentId);
+        return Result.success("评论删除成功");
+    }
+
+    @Operation(summary = "更新评论")
+    @PutMapping("/comments/{commentId}")
+    public Result<String> updateComment(@PathVariable Long commentId, @RequestBody Comment comment) {
+        comment.setCommentId(commentId);
+        commentService.updateComment(comment);
+        return Result.success("评论更新成功");
+    }
+
+    @Operation(summary = "获取评论详情")
+    @GetMapping("/comments/{commentId}")
+    public Result<Comment> getComment(@PathVariable Long commentId) {
+        return Result.success(commentService.getCommentById(commentId));
+    }
+
+    @Operation(summary = "获取帖子所有评论")
+    @GetMapping("/comments/post/{postId}")
+    public Result<List<Comment>> getCommentsByPostId(@PathVariable Long postId) {
+        return Result.success(commentService.getCommentsByPostId(postId));
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/PostController.java b/src/main/java/edu/bjtu/groupone/backend/api/PostController.java
new file mode 100644
index 0000000..0258f2d
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/api/PostController.java
@@ -0,0 +1,58 @@
+package edu.bjtu.groupone.backend.api;
+
+import edu.bjtu.groupone.backend.domain.entity.Post;
+import edu.bjtu.groupone.backend.domain.entity.Result;
+import edu.bjtu.groupone.backend.service.PostService;
+import io.swagger.v3.oas.annotations.Operation;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@CrossOrigin
+@Tag(name = "帖子相关接口")
+@RestController
+public class PostController {
+
+    @Autowired
+    private PostService postService;
+
+    @Operation(summary = "添加帖子")
+    @PostMapping("/posts")
+    public Result<String> addPost(@RequestBody Post post) {
+        postService.addPost(post);
+        return Result.success("帖子添加成功");
+    }
+
+    @Operation(summary = "删除帖子")
+    @DeleteMapping("/posts/{postId}")
+    public Result<String> deletePost(@PathVariable Long postId) {
+        postService.deletePost(postId);
+        return Result.success("帖子删除成功");
+    }
+
+    @Operation(summary = "更新帖子")
+    @PutMapping("/posts/{postId}")
+    public Result<String> updatePost(@PathVariable Long postId, @RequestBody Post post) {
+        post.setPostId(postId);
+        postService.updatePost(post);
+        return Result.success("帖子更新成功");
+    }
+
+    @Operation(summary = "获取帖子详情")
+    @GetMapping("/posts/{postId}")
+    public Result<Post> getPost(@PathVariable Long postId) {
+        return Result.success(postService.getPostById(postId));
+    }
+
+    @Operation(summary = "获取所有帖子")
+    @GetMapping("/posts")
+    public Result<List<Post>> getAllPosts() {
+        return Result.success(postService.getAllPosts());
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/UserController.java b/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
index 46fb153..c4ebbec 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
@@ -389,4 +389,40 @@
         String newToken = JwtUtils.generateJwt(payload);
         return Result.success(newToken);
     }
+    @Operation(
+            summary = "查询用户剩余任务数量",
+            description = "根据用户ID查询剩余未完成的任务数量（包括种子、帖子、评论）",
+            responses = {
+                    @ApiResponse(
+                            responseCode = "200",
+                            description = "查询成功",
+                            content = @Content(
+                                    schema = @Schema(implementation = Result.class),
+                                    examples = @ExampleObject(
+                                            name = "查询成功示例",
+                                            value = "{\"code\":200,\"message\":\"操作成功\",\"data\":3}"
+                                    )
+                            )
+                    ),
+                    @ApiResponse(
+                            responseCode = "400",
+                            description = "用户不存在",
+                            content = @Content(
+                                    schema = @Schema(implementation = Result.class),
+                                    examples = @ExampleObject(
+                                            name = "查询失败示例",
+                                            value = "{\"code\":400,\"message\":\"用户不存在\",\"data\":null}"
+                                    )
+                            )
+                    )
+            }
+    )
+    @GetMapping("/api/tasks/remaining/{userId}")
+    public Result<Integer> getRemainingTasks(@PathVariable int userId) {
+        int remainingTasks = userService.getRemainingTasks(userId);
+        if (remainingTasks < 0) {
+            return Result.error("用户不存在");
+        }
+        return Result.success(remainingTasks);
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java b/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
index 1eb4bee..d15c4ce 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
@@ -1,16 +1,23 @@
 package edu.bjtu.groupone.backend.api;
 
 import edu.bjtu.groupone.backend.domain.dto.WorkResponse;
+import edu.bjtu.groupone.backend.domain.entity.Result;
 import edu.bjtu.groupone.backend.domain.entity.Work;
 import edu.bjtu.groupone.backend.service.WorkService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
+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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @RestController
 @RequestMapping("/api/works")
 @Tag(name = "Work", description = "作品相关接口")
@@ -57,4 +64,40 @@
     public ResponseEntity<Work> getWork(@PathVariable Long id) {
         return ResponseEntity.ok(workService.getWorkById(id));
     }
+    @Operation(
+            summary = "根据作者查询所有作品",
+            description = "根据作者名称查询其所有作品",
+            responses = {
+                    @ApiResponse(
+                            responseCode = "200",
+                            description = "查询成功",
+                            content = @Content(
+                                    schema = @Schema(implementation = Result.class),
+                                    examples = @ExampleObject(
+                                            name = "查询成功示例",
+                                            value = "{\"code\":200,\"message\":\"操作成功\",\"data\":[{\"id\":101,\"title\":\"《我的世界》\",\"author\":\"张三\",\"views\":1234,\"categoryId\":1,\"description\":\"一部关于...\",\"createTime\":\"2023-06-15\"}]}"
+                                    )
+                            )
+                    ),
+                    @ApiResponse(
+                            responseCode = "400",
+                            description = "作者不存在",
+                            content = @Content(
+                                    schema = @Schema(implementation = Result.class),
+                                    examples = @ExampleObject(
+                                            name = "查询失败示例",
+                                            value = "{\"code\":400,\"message\":\"作者不存在\",\"data\":null}"
+                                    )
+                            )
+                    )
+            }
+    )
+    @GetMapping("/works/byAuthor")
+    public Result<List<WorkResponse>> getWorksByAuthor(@RequestParam String author) {
+        List<WorkResponse> works = workService.getWorksByAuthor(author);
+        if (works == null || works.isEmpty()) {
+            return Result.error("作者不存在");
+        }
+        return Result.success(works);
+    }
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Comment.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Comment.java
new file mode 100644
index 0000000..4c30e53
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Comment.java
@@ -0,0 +1,16 @@
+package edu.bjtu.groupone.backend.domain.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Comment {
+    private Long commentId;
+    private Long postId;
+    private int userId;
+    private String content;
+    private String createTime;
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Post.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Post.java
new file mode 100644
index 0000000..56a009f
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Post.java
@@ -0,0 +1,18 @@
+// Post.java
+package edu.bjtu.groupone.backend.domain.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Post {
+    private Long postId;
+    private int userId;
+    private String title;
+    private String content;
+    private String createTime;
+    private int views;
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Task.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Task.java
new file mode 100644
index 0000000..1470d79
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Task.java
@@ -0,0 +1,15 @@
+package edu.bjtu.groupone.backend.domain.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Task {
+    private int taskId;
+    private int userId;
+    private String type; // "seed" (种子), "post", "comment"
+    private boolean completed;
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/CommentMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/CommentMapper.java
new file mode 100644
index 0000000..e45ba4e
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/CommentMapper.java
@@ -0,0 +1,24 @@
+package edu.bjtu.groupone.backend.mapper;
+
+import edu.bjtu.groupone.backend.domain.entity.Comment;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface CommentMapper {
+    @Insert("INSERT INTO `comment` (`post_id`, `user_id`, `content`, `create_time`) VALUES (#{postId}, #{userId}, #{content}, #{createTime})")
+    void insertComment(Comment comment);
+
+    @Delete("DELETE FROM `comment` WHERE `comment_id` = #{commentId}")
+    void deleteComment(Long commentId);
+
+    @Update("UPDATE `comment` SET `post_id` = #{postId}, `user_id` = #{userId}, `content` = #{content}, `create_time` = #{createTime} WHERE `comment_id` = #{commentId}")
+    void updateComment(Comment comment);
+
+    @Select("SELECT * FROM `comment` WHERE `comment_id` = #{commentId}")
+    Comment selectCommentById(Long commentId);
+
+    @Select("SELECT * FROM `comment` WHERE `post_id` = #{postId}")
+    List<Comment> selectCommentsByPostId(Long postId);
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/PostMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/PostMapper.java
new file mode 100644
index 0000000..4d1f73d
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/PostMapper.java
@@ -0,0 +1,24 @@
+package edu.bjtu.groupone.backend.mapper;
+
+import edu.bjtu.groupone.backend.domain.entity.Post;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface PostMapper {
+    @Insert("INSERT INTO `post` (`user_id`, `title`, `content`, `create_time`, `views`) VALUES (#{userId}, #{title}, #{content}, #{createTime}, #{views})")
+    void insertPost(Post post);
+
+    @Delete("DELETE FROM `post` WHERE `post_id` = #{postId}")
+    void deletePost(Long postId);
+
+    @Update("UPDATE `post` SET `user_id` = #{userId}, `title` = #{title}, `content` = #{content}, `create_time` = #{createTime}, `views` = #{views} WHERE `post_id` = #{postId}")
+    void updatePost(Post post);
+
+    @Select("SELECT * FROM `post` WHERE `post_id` = #{postId}")
+    Post selectPostById(Long postId);
+
+    @Select("SELECT * FROM `post`")
+    List<Post> selectAllPosts();
+}
\ No newline at end of file
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 8049e6a..dfcedad 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
@@ -40,6 +40,9 @@
     @Select("SELECT * FROM user")
     List<User> selectAllUsers();
 
+    @Select("SELECT COUNT(*) FROM task WHERE user_id = #{userId} AND completed = false")
+    int countRemainingTasks(int userId);
+
     @Select({"SELECT * FROM user WHERE user_id = #{id}"})
     User selectById(@Param("id") Long id);
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
index 90836a8..c127c8c 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
@@ -34,4 +34,8 @@
     // 查询
     @Select("SELECT * FROM works WHERE id = #{id}")
     Work findById(Long id);
+    @Select("SELECT * FROM works WHERE author = #{author}")
+    List<Work> findByAuthor(String author);
+
+
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/CommentService.java b/src/main/java/edu/bjtu/groupone/backend/service/CommentService.java
new file mode 100644
index 0000000..1cbd321
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/service/CommentService.java
@@ -0,0 +1,14 @@
+package edu.bjtu.groupone.backend.service;
+
+import edu.bjtu.groupone.backend.domain.entity.Comment;
+import java.util.List;
+
+public interface CommentService {
+    void addComment(Comment comment);
+    void deleteComment(Long commentId);
+    void updateComment(Comment comment);
+    Comment getCommentById(Long commentId);
+    List<Comment> getCommentsByPostId(Long postId);
+}
+
+// CommentServiceImpl.jav
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/PostService.java b/src/main/java/edu/bjtu/groupone/backend/service/PostService.java
new file mode 100644
index 0000000..a87d48f
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/service/PostService.java
@@ -0,0 +1,13 @@
+// PostService.java
+package edu.bjtu.groupone.backend.service;
+
+import edu.bjtu.groupone.backend.domain.entity.Post;
+import java.util.List;
+
+public interface PostService {
+    void addPost(Post post);
+    void deletePost(Long postId);
+    void updatePost(Post post);
+    Post getPostById(Long postId);
+    List<Post> getAllPosts();
+}
\ No newline at end of file
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 77d3bba..9bcc79e 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
@@ -20,4 +20,5 @@
     void updateUser(User user);
     User getUserById(int userId);
     List<User> getAllUsers();
+    int getRemainingTasks(int userId);
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java b/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
index ec0494f..eaff2e2 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
@@ -13,6 +13,7 @@
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class WorkService {
@@ -61,4 +62,10 @@
     public Work getWorkById(Long id) {
         return workMybatisMapper.findById(id);
     }
+    public List<WorkResponse> getWorksByAuthor(String author) {
+        List<Work> works = workMybatisMapper.findByAuthor(author);
+        return works.stream()
+                .map(this::convertToResponse)
+                .collect(Collectors.toList());
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/impl/CommentServiceImpl.java b/src/main/java/edu/bjtu/groupone/backend/service/impl/CommentServiceImpl.java
new file mode 100644
index 0000000..f792a29
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/service/impl/CommentServiceImpl.java
@@ -0,0 +1,40 @@
+package edu.bjtu.groupone.backend.service.impl;
+
+import edu.bjtu.groupone.backend.mapper.CommentMapper;
+import edu.bjtu.groupone.backend.domain.entity.Comment;
+import edu.bjtu.groupone.backend.service.CommentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CommentServiceImpl implements CommentService {
+    @Autowired
+    private CommentMapper commentMapper;
+
+    @Override
+    public void addComment(Comment comment) {
+        commentMapper.insertComment(comment);
+    }
+
+    @Override
+    public void deleteComment(Long commentId) {
+        commentMapper.deleteComment(commentId);
+    }
+
+    @Override
+    public void updateComment(Comment comment) {
+        commentMapper.updateComment(comment);
+    }
+
+    @Override
+    public Comment getCommentById(Long commentId) {
+        return commentMapper.selectCommentById(commentId);
+    }
+
+    @Override
+    public List<Comment> getCommentsByPostId(Long postId) {
+        return commentMapper.selectCommentsByPostId(postId);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/impl/PostServiceImpl.java b/src/main/java/edu/bjtu/groupone/backend/service/impl/PostServiceImpl.java
new file mode 100644
index 0000000..8eb57ac
--- /dev/null
+++ b/src/main/java/edu/bjtu/groupone/backend/service/impl/PostServiceImpl.java
@@ -0,0 +1,40 @@
+package edu.bjtu.groupone.backend.service.impl;
+
+import edu.bjtu.groupone.backend.mapper.PostMapper;
+import edu.bjtu.groupone.backend.domain.entity.Post;
+import edu.bjtu.groupone.backend.service.PostService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class PostServiceImpl implements PostService {
+    @Autowired
+    private PostMapper postMapper;
+
+    @Override
+    public void addPost(Post post) {
+        postMapper.insertPost(post);
+    }
+
+    @Override
+    public void deletePost(Long postId) {
+        postMapper.deletePost(postId);
+    }
+
+    @Override
+    public void updatePost(Post post) {
+        postMapper.updatePost(post);
+    }
+
+    @Override
+    public Post getPostById(Long postId) {
+        return postMapper.selectPostById(postId);
+    }
+
+    @Override
+    public List<Post> getAllPosts() {
+        return postMapper.selectAllPosts();
+    }
+}
\ No newline at end of file
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 5cdc9c1..ba2f9e9 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
@@ -139,4 +139,13 @@
     public List<User> getAllUsers() {
         return userMapper.selectAllUsers();
     }
+    @Override
+    public int getRemainingTasks(int userId) {
+        User user = userMapper.selectUserById(userId);
+        if (user == null) {
+            return -1; // 表示用户不存在
+        }
+        // 假设任务表名为 task，查询未完成的任务数量
+        return userMapper.countRemainingTasks(userId);
+    }
 }
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
index a36d6ea..53bd187 100644
--- a/src/main/resources/schema.sql
+++ b/src/main/resources/schema.sql
@@ -23,6 +23,37 @@
                                FOREIGN KEY (`followed_id`) REFERENCES `user`(`user_id`)
 );
 
+-- 新增任务表
+CREATE TABLE `task` (
+                        `task_id` INT AUTO_INCREMENT PRIMARY KEY,
+                        `user_id` INT NOT NULL,
+                        `type` VARCHAR(50) NOT NULL, -- "seed", "post", "comment"
+                        `completed` BOOLEAN NOT NULL DEFAULT FALSE,
+                        FOREIGN KEY (`user_id`) REFERENCES `user`(`user_id`)
+);
+
+-- 新增帖子表
+CREATE TABLE `post` (
+                        `post_id` BIGINT AUTO_INCREMENT PRIMARY KEY,
+                        `user_id` INT NOT NULL,
+                        `title` VARCHAR(255) NOT NULL,
+                        `content` TEXT NOT NULL,
+                        `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+                        `views` INT DEFAULT 0,
+                        FOREIGN KEY (`user_id`) REFERENCES `user`(`user_id`)
+);
+
+-- 新增评论表
+CREATE TABLE `comment` (
+                           `comment_id` BIGINT AUTO_INCREMENT PRIMARY KEY,
+                           `post_id` BIGINT NOT NULL,
+                           `user_id` INT NOT NULL,
+                           `content` TEXT NOT NULL,
+                           `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+                           FOREIGN KEY (`post_id`) REFERENCES `post`(`post_id`),
+                           FOREIGN KEY (`user_id`) REFERENCES `user`(`user_id`)
+);
+
 -- 插入语句使用反引号包裹表名和列名
 INSERT INTO `user` (
     `username`, `email`, `password`, `registration_date`, `identification_number`, `role`
diff --git a/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java
deleted file mode 100644
index 23b8e65..0000000
--- a/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package edu.bjtu.groupone.backend;
-
-import edu.bjtu.groupone.backend.api.CategoryController;
-import edu.bjtu.groupone.backend.domain.dto.CategoryDTO;
-import edu.bjtu.groupone.backend.domain.entity.Category;
-import edu.bjtu.groupone.backend.service.CategoryService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
-
-@ExtendWith(MockitoExtension.class)
-class CategoryControllerTest {
-
-    @Mock
-    private CategoryService categoryService;
-
-    @InjectMocks
-    private CategoryController categoryController;
-
-    private Category testCategory;
-
-    @BeforeEach
-    void setUp() {
-        testCategory = new Category();
-        testCategory.setId(1L);
-        testCategory.setName("Test Category");
-    }
-
-    @Test
-    void createCategory_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = categoryController.createCategory(testCategory);
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals("分区创建成功", response.getBody());
-        verify(categoryService, times(1)).addCategory(any(Category.class));
-    }
-
-    @Test
-    void deleteCategory_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = categoryController.deleteCategory(1L);
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals("分区删除成功", response.getBody());
-        verify(categoryService, times(1)).deleteCategory(1L);
-    }
-
-    @Test
-    void updateCategory_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = categoryController.updateCategory(1L, testCategory);
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals("分区更新成功", response.getBody());
-        verify(categoryService, times(1)).updateCategory(any(Category.class));
-    }
-
-    @Test
-    void getCategory_shouldReturnCategory() {
-        // 模拟
-        when(categoryService.getCategoryById(1L)).thenReturn(testCategory);
-
-        // 调用
-        ResponseEntity<Category> response = categoryController.getCategory(1L);
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals(testCategory, response.getBody());
-        verify(categoryService, times(1)).getCategoryById(1L);
-    }
-
-    @Test
-    void getCategories_shouldReturnTree() {
-        // 模拟
-        CategoryDTO root = new CategoryDTO(1L, "Root");
-        root.getChildren().add(new CategoryDTO(2L, "Child"));
-        when(categoryService.getCategoryTree()).thenReturn(List.of(root));
-
-        // 调用
-        ResponseEntity<List<CategoryDTO>> response = categoryController.getCategories();
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals(1, response.getBody().size());
-        assertEquals(1, response.getBody().get(0).getChildren().size());
-        verify(categoryService, times(1)).getCategoryTree();
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/CommentServiceTest.java b/src/test/java/edu/bjtu/groupone/backend/CommentServiceTest.java
new file mode 100644
index 0000000..50ea9ba
--- /dev/null
+++ b/src/test/java/edu/bjtu/groupone/backend/CommentServiceTest.java
@@ -0,0 +1,81 @@
+package edu.bjtu.groupone.backend;
+
+import edu.bjtu.groupone.backend.domain.entity.Comment;
+import edu.bjtu.groupone.backend.mapper.CommentMapper;
+import edu.bjtu.groupone.backend.service.impl.CommentServiceImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class CommentServiceTest {
+
+    @Mock
+    private CommentMapper commentMapper;
+
+    @InjectMocks
+    private CommentServiceImpl commentService;
+
+    private Comment comment;
+    private List<Comment> comments;
+
+    @BeforeEach
+    void setUp() {
+        comment = new Comment(1L, 1L, 1, "测试评论", "2023-06-15");
+        comments = Arrays.asList(comment);
+    }
+
+    @Test
+    void addComment() {
+        doNothing().when(commentMapper).insertComment(any(Comment.class));
+
+        commentService.addComment(comment);
+
+        verify(commentMapper, times(1)).insertComment(comment);
+    }
+
+    @Test
+    void deleteComment() {
+        doNothing().when(commentMapper).deleteComment(1L);
+
+        commentService.deleteComment(1L);
+
+        verify(commentMapper, times(1)).deleteComment(1L);
+    }
+
+    @Test
+    void updateComment() {
+        doNothing().when(commentMapper).updateComment(any(Comment.class));
+
+        commentService.updateComment(comment);
+
+        verify(commentMapper, times(1)).updateComment(comment);
+    }
+
+    @Test
+    void getCommentById() {
+        when(commentMapper.selectCommentById(1L)).thenReturn(comment);
+
+        Comment result = commentService.getCommentById(1L);
+
+        assertEquals(comment, result);
+    }
+
+    @Test
+    void getCommentsByPostId() {
+        when(commentMapper.selectCommentsByPostId(1L)).thenReturn(comments);
+
+        List<Comment> result = commentService.getCommentsByPostId(1L);
+
+        assertEquals(comments, result);
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/PostServiceTest.java b/src/test/java/edu/bjtu/groupone/backend/PostServiceTest.java
new file mode 100644
index 0000000..5426db8
--- /dev/null
+++ b/src/test/java/edu/bjtu/groupone/backend/PostServiceTest.java
@@ -0,0 +1,81 @@
+package edu.bjtu.groupone.backend;
+
+import edu.bjtu.groupone.backend.domain.entity.Post;
+import edu.bjtu.groupone.backend.mapper.PostMapper;
+import edu.bjtu.groupone.backend.service.impl.PostServiceImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class PostServiceTest {
+
+    @Mock
+    private PostMapper postMapper;
+
+    @InjectMocks
+    private PostServiceImpl postService;
+
+    private Post post;
+    private List<Post> posts;
+
+    @BeforeEach
+    void setUp() {
+        post = new Post(1L, 1, "测试帖子", "内容", "2023-06-15", 100);
+        posts = Arrays.asList(post);
+    }
+
+    @Test
+    void addPost() {
+        doNothing().when(postMapper).insertPost(any(Post.class));
+
+        postService.addPost(post);
+
+        verify(postMapper, times(1)).insertPost(post);
+    }
+
+    @Test
+    void deletePost() {
+        doNothing().when(postMapper).deletePost(1L);
+
+        postService.deletePost(1L);
+
+        verify(postMapper, times(1)).deletePost(1L);
+    }
+
+    @Test
+    void updatePost() {
+        doNothing().when(postMapper).updatePost(any(Post.class));
+
+        postService.updatePost(post);
+
+        verify(postMapper, times(1)).updatePost(post);
+    }
+
+    @Test
+    void getPostById() {
+        when(postMapper.selectPostById(1L)).thenReturn(post);
+
+        Post result = postService.getPostById(1L);
+
+        assertEquals(post, result);
+    }
+
+    @Test
+    void getAllPosts() {
+        when(postMapper.selectAllPosts()).thenReturn(posts);
+
+        List<Post> result = postService.getAllPosts();
+
+        assertEquals(posts, result);
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
deleted file mode 100644
index 73c99ae..0000000
--- a/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package edu.bjtu.groupone.backend;
-
-import edu.bjtu.groupone.backend.api.UserController;
-import edu.bjtu.groupone.backend.domain.entity.Result;
-import edu.bjtu.groupone.backend.domain.entity.User;
-import edu.bjtu.groupone.backend.service.UserService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
-
-@ExtendWith(MockitoExtension.class)
-class UserControllerTest {
-
-    @Mock
-    private UserService userService;
-
-    @InjectMocks
-    private UserController userController;
-
-    private User testUser;
-
-    @BeforeEach
-    void setUp() {
-        testUser = new User();
-        testUser.setUserId(1);
-        testUser.setUsername("testuser");
-        testUser.setEmail("test@example.com");
-    }
-
-    @Test
-    void deleteUser_shouldReturnSuccess() {
-        // 调用
-        Result<String> result = userController.deleteUser(1);
-
-        // 验证：修改预期为英文 "success"
-        assertEquals(0, result.getCode());
-        assertEquals("success", result.getMsg());  // 修改这里
-        verify(userService, times(1)).deleteUser(1);
-    }
-
-    @Test
-    void updateUser_shouldReturnSuccess() {
-        // 调用
-        Result<String> result = userController.updateUser(1, testUser);
-
-        // 验证：修改预期为英文 "success"
-        assertEquals(0, result.getCode());
-        assertEquals("success", result.getMsg());  // 修改这里
-        verify(userService, times(1)).updateUser(any(User.class));
-    }
-
-    @Test
-    void getUser_shouldReturnUser() {
-        // 模拟
-        when(userService.getUserById(1)).thenReturn(testUser);
-
-        // 调用
-        Result<User> result = userController.getUser(1);
-
-        // 验证
-        assertEquals(0, result.getCode());
-        assertEquals(testUser, result.getData());
-        verify(userService, times(1)).getUserById(1);
-    }
-
-    @Test
-    void getAllUsers_shouldReturnUserList() {
-        // 模拟
-        List<User> users = Arrays.asList(testUser, new User());
-        when(userService.getAllUsers()).thenReturn(users);
-
-        // 调用
-        Result<List<User>> result = userController.getAllUsers();
-
-        // 验证
-        assertEquals(0, result.getCode());
-        assertEquals(2, result.getData().size());
-        verify(userService, times(1)).getAllUsers();
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java b/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
index e877de8..8475680 100644
--- a/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
@@ -3,6 +3,7 @@
 import edu.bjtu.groupone.backend.domain.entity.User;
 import edu.bjtu.groupone.backend.mapper.UserMapper;
 import edu.bjtu.groupone.backend.service.impl.UserServImpl;
+import edu.bjtu.groupone.backend.utils.EmailUtil;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -15,7 +16,6 @@
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.*;
 
 @ExtendWith(MockitoExtension.class)
@@ -26,15 +26,20 @@
 
     @InjectMocks
     private UserServImpl userService;
+    @Mock
+    private EmailUtil emailUtil;
 
     private User testUser;
-
+    private User user;
     @BeforeEach
     void setUp() {
         testUser = new User();
         testUser.setUserId(1);
         testUser.setUsername("testuser");
         testUser.setEmail("test@example.com");
+        user = new User();
+        user.setUserId(1);
+        user.setEmail("test@example.com");
     }
 
     @Test
@@ -87,4 +92,22 @@
         assertEquals(2, result.size());
         verify(userMapper, times(1)).selectAllUsers();
     }
+    @Test
+    void getRemainingTasks_Success() {
+        when(userMapper.selectUserById(1)).thenReturn(user);
+        when(userMapper.countRemainingTasks(1)).thenReturn(3);
+
+        int result = userService.getRemainingTasks(1);
+
+        assertEquals(3, result);
+    }
+
+    @Test
+    void getRemainingTasks_UserNotFound() {
+        when(userMapper.selectUserById(999)).thenReturn(null);
+
+        int result = userService.getRemainingTasks(999);
+
+        assertEquals(-1, result);
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/WorkControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/WorkControllerTest.java
deleted file mode 100644
index 4c527c6..0000000
--- a/src/test/java/edu/bjtu/groupone/backend/WorkControllerTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package edu.bjtu.groupone.backend;
-
-import edu.bjtu.groupone.backend.api.WorkController;
-import edu.bjtu.groupone.backend.domain.dto.WorkResponse;
-import edu.bjtu.groupone.backend.domain.entity.Category;
-import edu.bjtu.groupone.backend.domain.entity.Work;
-import edu.bjtu.groupone.backend.service.WorkService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageImpl;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.http.ResponseEntity;
-
-import java.util.Collections;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-@ExtendWith(MockitoExtension.class)
-class WorkControllerTest {
-
-    @Mock
-    private WorkService workService;
-
-    @InjectMocks
-    private WorkController workController;
-
-    private Work testWork;
-    private WorkResponse testResponse;
-
-    @BeforeEach
-    void setUp() {
-        testWork = new Work();
-        testWork.setId(1L);
-        testWork.setTitle("Test Work");
-        testWork.setAuthor("Test Author");
-        testWork.setViews(100);
-
-        // 创建 Category 对象
-        Category category = new Category();
-        category.setId(1L);
-        testWork.setCategory(category);
-
-        // 使用正确的参数创建 WorkResponse
-        testResponse = new WorkResponse(
-                1L,
-                "Test Work",
-                "Test Author",
-                100,
-                1L,
-                "Test Description", // 新增 description 参数
-                "2023-06-15"
-        );
-    }
-
-    @Test
-    void createWork_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = workController.createWork(testWork);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("作品创建成功", response.getBody());
-        verify(workService, times(1)).addWork(any(Work.class));
-    }
-
-    @Test
-    void deleteWork_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = workController.deleteWork(1L);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("作品删除成功", response.getBody());
-        verify(workService, times(1)).deleteWork(1L);
-    }
-
-    @Test
-    void updateWork_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = workController.updateWork(1L, testWork);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("作品更新成功", response.getBody());
-        verify(workService, times(1)).updateWork(any(Work.class));
-    }
-
-    @Test
-    void getWork_shouldReturnWork() {
-        // 模拟
-        when(workService.getWorkById(1L)).thenReturn(testWork);
-
-        // 调用
-        ResponseEntity<Work> response = workController.getWork(1L);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals(testWork, response.getBody());
-        verify(workService, times(1)).getWorkById(1L);
-    }
-
-    @Test
-    void getWorks_shouldReturnPage() {
-        // 创建模拟分页数据
-        Page<WorkResponse> mockPage = new PageImpl<>(
-                Collections.singletonList(testResponse),
-                PageRequest.of(0, 10),
-                1
-        );
-
-        // 模拟服务层方法
-        when(workService.getWorks(eq(null), eq(1), eq(10)))
-                .thenReturn(mockPage);
-
-        // 调用
-        ResponseEntity<Page<WorkResponse>> response = workController.getWorks(null, 1, 10);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertNotNull(response.getBody());
-        assertEquals(1, response.getBody().getTotalElements());
-        assertEquals(1, response.getBody().getContent().size());
-        assertEquals("Test Work", response.getBody().getContent().get(0).getTitle());
-        verify(workService, times(1)).getWorks(null, 1, 10);
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java b/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java
index 5277d54..b3871da 100644
--- a/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java
@@ -15,31 +15,29 @@
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 @ExtendWith(MockitoExtension.class)
 class WorkServiceTest {
 
     @Mock
-    private WorkMybatisMapper mapper;
+    private WorkMybatisMapper workMybatisMapper;
 
     @Mock
     private CategoryService categoryService;
 
     @InjectMocks
-    private WorkService service;
+    private WorkService workService;
 
     private Work testWork;
     private Category testCategory;
+    private List<Work> works;
 
     @BeforeEach
     void setUp() {
@@ -52,61 +50,71 @@
                 .views(100)
                 .category(testCategory)
                 .build();
+
+        Category category = new Category(1L, "文学艺术", null);
+        works = Arrays.asList(
+                new Work(1L, "《我的世界》", "张三", 1234, category, "一部关于...", "2023-06-15"),
+                new Work(2L, "《你的世界》", "张三", 567, category, "另一部关于...", "2023-06-16")
+        );
     }
 
     @Test
     void addWork_shouldCallMapper() {
-        // 调用
-        service.addWork(testWork);
-
-        // 验证
-        verify(mapper, times(1)).save(testWork);
+        workService.addWork(testWork);
+        verify(workMybatisMapper, times(1)).save(testWork);
     }
 
     @Test
     void deleteWork_shouldCallMapper() {
-        // 调用
-        service.deleteWork(1L);
-
-        // 验证
-        verify(mapper, times(1)).deleteById(1L);
+        workService.deleteWork(1L);
+        verify(workMybatisMapper, times(1)).deleteById(1L);
     }
 
     @Test
     void updateWork_shouldCallMapper() {
-        // 调用
-        service.updateWork(testWork);
-
-        // 验证
-        verify(mapper, times(1)).update(testWork);
+        workService.updateWork(testWork);
+        verify(workMybatisMapper, times(1)).update(testWork);
     }
 
     @Test
     void getWorkById_shouldReturnWork() {
-        // 模拟
-        when(mapper.findById(1L)).thenReturn(testWork);
-
-        // 调用
-        Work result = service.getWorkById(1L);
-
-        // 验证
+        when(workMybatisMapper.findById(1L)).thenReturn(testWork);
+        Work result = workService.getWorkById(1L);
         assertEquals(testWork, result);
-        verify(mapper, times(1)).findById(1L);
+        verify(workMybatisMapper, times(1)).findById(1L);
     }
 
     @Test
     void getWorks_shouldReturnPage() {
-        // 模拟
-        Page<Work> workPage = new PageImpl<>(Collections.singletonList(testWork));
-        when(categoryService.getAllSubcategoryIds(1L)).thenReturn(Arrays.asList(1L, 2L));
-        when(mapper.findByCategoryIdIn(anyList(), any(Pageable.class))).thenReturn(workPage);
+        Long categoryId = 1L;
+        int page = 1; // Fix: Use page = 1 to account for WorkService expecting 1-based indexing
+        int size = 10;
+        List<Long> categoryIds = Arrays.asList(1L);
 
-        // 调用
-        Page<WorkResponse> result = service.getWorks(1L, 1, 10);
+        when(categoryService.getAllSubcategoryIds(categoryId)).thenReturn(categoryIds);
+        Page<Work> workPage = new PageImpl<>(Arrays.asList(testWork));
+        when(workMybatisMapper.findByCategoryIdIn(categoryIds, PageRequest.of(0, size))).thenReturn(workPage);
 
-        // 验证
-        assertEquals(1, result.getTotalElements());
-        assertEquals("Test Work", result.getContent().get(0).getTitle());
-        verify(mapper, times(1)).findByCategoryIdIn(anyList(), any(Pageable.class));
+        Page<WorkResponse> result = workService.getWorks(categoryId, page, size);
+
+        assertEquals(1, result.getContent().size());
+        verify(categoryService, times(1)).getAllSubcategoryIds(categoryId);
+        verify(workMybatisMapper, times(1)).findByCategoryIdIn(categoryIds, PageRequest.of(0, size));
+    }
+
+    @Test
+    void getWorksByAuthor_Success() {
+        when(workMybatisMapper.findByAuthor("张三")).thenReturn(works);
+        List<WorkResponse> result = workService.getWorksByAuthor("张三");
+        assertEquals(2, result.size());
+        assertEquals("《我的世界》", result.get(0).getTitle());
+        assertEquals("《你的世界》", result.get(1).getTitle());
+    }
+
+    @Test
+    void getWorksByAuthor_Empty() {
+        when(workMybatisMapper.findByAuthor(anyString())).thenReturn(List.of());
+        List<WorkResponse> result = workService.getWorksByAuthor("李四");
+        assertTrue(result.isEmpty());
     }
 }
\ No newline at end of file
diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties
index b216159..a390de5 100644
--- a/src/test/resources/application-test.properties
+++ b/src/test/resources/application-test.properties
@@ -2,7 +2,7 @@
 spring.datasource.driver-class-name=org.h2.Driver
 spring.datasource.username=sa
 spring.datasource.password=
-spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
-spring.jpa.hibernate.ddl-auto=create-drop
 spring.h2.console.enabled=true
-spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
\ No newline at end of file
+spring.sql.init.mode=always
+spring.sql.init.schema-locations=classpath:schema.sql
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
\ No newline at end of file
