diff --git a/pom.xml b/pom.xml
index 61d8a71..222d677 100644
--- a/pom.xml
+++ b/pom.xml
@@ -186,27 +186,33 @@
                 <version>${ruoyi.version}</version>
             </dependency>
 
-<!--            junit5 配置-->
-
+            <!-- 测试依赖 -->
             <dependency>
-                <groupId>org.junit.platform</groupId>
-                <artifactId>junit-platform-launcher</artifactId>
-                <version>1.0.1</version>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-test</artifactId>
+                <version>3.3.0</version>
                 <scope>test</scope>
             </dependency>
 
             <dependency>
                 <groupId>org.junit.jupiter</groupId>
-                <artifactId>junit-jupiter-engine</artifactId>
-                <version>5.0.1</version>
+                <artifactId>junit-jupiter</artifactId>
+                <version>5.10.0</version>
                 <scope>test</scope>
             </dependency>
 
             <dependency>
-            <groupId>org.junit.vintage</groupId>
-            <artifactId>junit-vintage-engine</artifactId>
-            <version>4.12.1</version>
-            <scope>test</scope>
+                <groupId>org.mockito</groupId>
+                <artifactId>mockito-core</artifactId>
+                <version>5.5.0</version>
+                <scope>test</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.mockito</groupId>
+                <artifactId>mockito-junit-jupiter</artifactId>
+                <version>5.5.0</version>
+                <scope>test</scope>
             </dependency>
 
         </dependencies>
@@ -238,7 +244,36 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>3.3.0</version>
+                <version>2.5.15</version>
+                <configuration>
+                    <fork>true</fork>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            
+            <!-- 测试相关插件 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>3.0.0-M7</version>
+                <configuration>
+                    <includes>
+                        <include>**/*Test.java</include>
+                        <include>**/*Tests.java</include>
+                    </includes>
+                    <excludes>
+                        <exclude>**/Abstract*.java</exclude>
+                    </excludes>
+                    <systemPropertyVariables>
+                        <spring.profiles.active>test</spring.profiles.active>
+                    </systemPropertyVariables>
+                </configuration>
             </plugin>
         </plugins>
     </build>
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 8053e2b..aa3f738 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -58,6 +58,12 @@
             <systemPath>${project.basedir}/torrent/ttorrent-client.jar</systemPath>
         </dependency>
 
+        <!-- 通用工具-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-common</artifactId>
+        </dependency>
+
         <!-- 核心模块-->
         <dependency>
             <groupId>com.ruoyi</groupId>
@@ -76,6 +82,38 @@
             <artifactId>ruoyi-generator</artifactId>
         </dependency>
 
+        <!-- 测试依赖 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- Spring Security Test Support -->
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostCenterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostCenterController.java
new file mode 100644
index 0000000..e05e55e
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostCenterController.java
@@ -0,0 +1,1133 @@
+package com.ruoyi.web.controller.post.controller;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.github.pagehelper.PageHelper;
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.web.controller.post.domain.Post;
+import com.ruoyi.web.controller.post.domain.PostComment;
+import com.ruoyi.web.controller.post.domain.PostFavorite;
+import com.ruoyi.web.controller.post.domain.PostTag;
+import com.ruoyi.web.controller.post.domain.PostPayment;
+import com.ruoyi.web.controller.post.domain.PostReport;
+import com.ruoyi.web.controller.post.service.IPostCommentService;
+import com.ruoyi.web.controller.post.service.IPostFavoriteService;
+import com.ruoyi.web.controller.post.service.IPostService;
+import com.ruoyi.web.controller.post.service.IPostTagService;
+import com.ruoyi.web.controller.post.mapper.PostPaymentMapper;
+import com.ruoyi.web.controller.post.mapper.PostReportMapper;
+
+/**
+ * 帖子中心控制器，面向前端用户
+ * 
+ * @author thunderhub
+ */
+@RestController
+@RequestMapping("/post-center")
+public class PostCenterController extends BaseController
+{
+    @Autowired
+    private IPostService postService;
+    
+    @Autowired
+    private IPostTagService postTagService;
+    
+    @Autowired
+    private IPostCommentService postCommentService;
+    
+    @Autowired
+    private IPostFavoriteService postFavoriteService;
+    
+    @Autowired
+    private PostPaymentMapper postPaymentMapper;
+    
+    @Autowired
+    private PostReportMapper postReportMapper;
+
+    /**
+     * 获取帖子列表
+     */
+    @Anonymous
+    @GetMapping("/list")
+    public TableDataInfo list(Post post, 
+                             @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
+                             @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+                             @RequestParam(value = "tags", required = false) String tags) 
+    {
+        // 手动设置分页参数 - 确保分页参数正确传递
+        PageHelper.startPage(pageNum, pageSize);
+        
+        // 只查询状态为正常的帖子
+        if (post.getStatus() == null) {
+            post.setStatus("1");
+        }
+        
+        // 如果有标签筛选参数，设置到查询条件中
+        if (tags != null && !tags.trim().isEmpty() && !"all".equals(tags)) {
+            post.setTags(tags);
+        }
+        
+        List<Post> list = postService.selectPostList(post);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取推广帖子列表（用于轮播展示）
+     */
+    @Anonymous
+    @GetMapping("/promotion")
+    public AjaxResult getPromotionPosts()
+    {
+        Post query = new Post();
+        query.setStatus("1"); // 只查询已发布的帖子
+        
+        List<Post> allPosts = postService.selectPostList(query);
+        
+        // 筛选出购买了最高等级推广（promotionPlanId = 1）的帖子用于轮播
+        List<Post> carouselPosts = allPosts.stream()
+                .filter(post -> post.getPromotionPlanId() != null && post.getPromotionPlanId().equals(1L))
+                .limit(5) // 限制轮播数量
+                .collect(java.util.stream.Collectors.toList());
+        
+        return success(carouselPosts);
+    }
+
+    /**
+     * 获取帖子详情
+     */
+    @Anonymous
+    @GetMapping("/{postId}")
+    public AjaxResult getDetail(@PathVariable Long postId)
+    {
+        Map<String, Object> result = new HashMap<>();
+        
+        // 更新浏览量
+        postService.updatePostViews(postId);
+        
+        // 获取帖子信息
+        Post post = postService.selectPostById(postId);
+        if (post == null || !"1".equals(post.getStatus())) {
+            return error("帖子不存在或已下架");
+        }
+        result.put("post", post);
+        
+        // 获取帖子标签
+        List<PostTag> tags = postTagService.selectPostTagsByPostId(postId);
+        result.put("tags", tags);
+        
+        // 获取评论，只返回顶级评论，限制10条
+        List<PostComment> comments = postCommentService.selectCommentsByPostId(postId, 10);
+        
+        // 获取每个评论的回复
+        List<Map<String, Object>> commentList = new ArrayList<>();
+        for (PostComment comment : comments) {
+            if ("1".equals(comment.getStatus())) { // 只返回正常状态的评论
+                Map<String, Object> commentMap = new HashMap<>();
+                commentMap.put("comment", comment);
+                
+                List<PostComment> replies = postCommentService.selectCommentsByParentId(comment.getCommentId());
+                // 过滤回复，只返回正常状态的回复
+                List<PostComment> validReplies = new ArrayList<>();
+                for (PostComment reply : replies) {
+                    if ("1".equals(reply.getStatus())) {
+                        validReplies.add(reply);
+                    }
+                }
+                commentMap.put("replies", validReplies);
+                commentList.add(commentMap);
+            }
+        }
+        result.put("comments", commentList);
+        
+        // 获取推荐帖子（最多9个）
+        List<Post> recommendedPosts = postService.getRecommendedPosts(post.getAuthorId(), post.getTags(), postId, 9);
+        result.put("recommendedPosts", recommendedPosts);
+        
+        // 判断当前用户是否已收藏
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            // 用户未登录，忽略异常
+        }
+        
+        if (userId != null) {
+            PostFavorite favorite = postFavoriteService.selectPostFavoriteByPostIdAndUserId(postId, userId);
+            result.put("favorited", favorite != null && "0".equals(favorite.getStatus()));
+        } else {
+            result.put("favorited", false);
+        }
+        
+        return success(result);
+    }
+
+    /**
+     * 添加评论
+     */
+    @PostMapping("/comment")
+    public AjaxResult addComment(@RequestBody PostComment postComment)
+    {
+        if (postComment.getPostId() == null) {
+            return error("帖子ID不能为空");
+        }
+        
+        if (postComment.getContent() == null || postComment.getContent().trim().isEmpty()) {
+            return error("评论内容不能为空");
+        }
+        
+        // 检查用户是否登录
+        Long userId = null;
+        String username = null;
+        try {
+            userId = getUserId();
+            username = getUsername();
+        } catch (Exception e) {
+            return error("请先登录后再评论");
+        }
+        
+        if (userId == null) {
+            return error("请先登录后再评论");
+        }
+        
+        postComment.setCreateBy(username);
+        postComment.setUserId(userId);
+        postComment.setUserName(username);
+        postComment.setLikes(0L);
+        postComment.setStatus("1"); // 默认正常状态
+        
+        // 如果父评论ID为空，设置为0（顶级评论）
+        if (postComment.getParentId() == null) {
+            postComment.setParentId(0L);
+        }
+        
+        int result = postCommentService.insertPostComment(postComment);
+        
+        if (result > 0) {
+            // 更新帖子评论数
+            postService.updatePostComments(postComment.getPostId(), 1);
+            
+            // 返回新添加的评论，包括评论ID
+            return success(postCommentService.selectPostCommentById(postComment.getCommentId()));
+        } else {
+            return error("添加评论失败");
+        }
+    }
+    
+    /**
+     * 收藏/取消收藏帖子
+     */
+    @PostMapping("/favorite/{postId}")
+    public AjaxResult toggleFavorite(@PathVariable Long postId, @RequestParam(required = false, defaultValue = "true") boolean favorite)
+    {
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            // 用户未登录
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 检查帖子是否存在
+        Post post = postService.selectPostById(postId);
+        if (post == null || !"1".equals(post.getStatus())) {
+            return error("帖子不存在或已下架");
+        }
+        
+        // 检查是否已收藏
+        PostFavorite exist = postFavoriteService.selectPostFavoriteByPostIdAndUserId(postId, userId);
+        
+        Map<String, Object> resultData = new HashMap<>();
+        resultData.put("favorited", favorite);
+        
+        if (favorite) {
+            // 收藏操作
+            if (exist != null) {
+                // 已存在记录，检查状态
+                if ("0".equals(exist.getStatus())) {
+                    return AjaxResult.success("已收藏该帖子");
+                } else {
+                    // 取消收藏状态，改为收藏状态
+                    exist.setStatus("0");
+                    exist.setUpdateBy(getUsername());
+                    postFavoriteService.updatePostFavorite(exist);
+                    
+                    // 更新帖子收藏数量
+                    postService.updatePostFavorites(postId, 1);
+                    
+                    return AjaxResult.success("收藏成功");
+                }
+            } else {
+                // 创建收藏记录
+                PostFavorite favoriteRecord = new PostFavorite();
+                favoriteRecord.setPostId(postId);
+                favoriteRecord.setUserId(userId);
+                favoriteRecord.setPostTitle(post.getTitle());
+                favoriteRecord.setPostCover(post.getCoverImage());
+                favoriteRecord.setStatus("0");
+                favoriteRecord.setCreateBy(getUsername());
+                postFavoriteService.insertPostFavorite(favoriteRecord);
+                
+                // 更新帖子收藏数量
+                postService.updatePostFavorites(postId, 1);
+                
+                return AjaxResult.success("收藏成功");
+            }
+        } else {
+            // 取消收藏操作
+            if (exist != null && "0".equals(exist.getStatus())) {
+                // 更新为取消收藏状态
+                exist.setStatus("1");
+                exist.setUpdateBy(getUsername());
+                postFavoriteService.updatePostFavorite(exist);
+                
+                // 更新帖子收藏数量
+                postService.updatePostFavorites(postId, -1);
+                
+                return AjaxResult.success("取消收藏成功");
+            } else {
+                return AjaxResult.success("未收藏该帖子");
+            }
+        }
+    }
+    
+    /**
+     * 获取热门标签
+     */
+    @Anonymous
+    @GetMapping("/tags/hot")
+    public AjaxResult getHotTags(@RequestParam(required = false, defaultValue = "10") int limit)
+    {
+        // 获取帖子数量最多的标签
+        PostTag query = new PostTag();
+        query.setStatus("0"); // 正常状态
+        
+        // 使用startPage方法
+        startPage();
+        
+        // 手动限制结果数量
+        List<PostTag> allTags = postTagService.selectPostTagList(query);
+        List<PostTag> sortedTags = allTags.stream()
+                .sorted((a, b) -> b.getPostCount().compareTo(a.getPostCount()))
+                .limit(limit)
+                .collect(java.util.stream.Collectors.toList());
+        
+        return AjaxResult.success(sortedTags);
+    }
+    
+    /**
+     * 根据标签获取帖子
+     */
+    @Anonymous
+    @GetMapping("/bytag/{tagId}")
+    public TableDataInfo getPostsByTag(@PathVariable Long tagId)
+    {
+        startPage();
+        // 查询该标签的所有帖子
+        // 假设已经实现了这个方法
+        // 实际情况下，可能需要通过关联表查询
+        PostTag tag = postTagService.selectPostTagById(tagId);
+        
+        if (tag == null) {
+            return getDataTable(new ArrayList<>());
+        }
+        
+        Post query = new Post();
+        query.setTags(tag.getTagName());
+        query.setStatus("1"); // 只查询正常状态的帖子
+        List<Post> posts = postService.selectPostList(query);
+        
+        return getDataTable(posts);
+    }
+
+    /**
+     * 发布新帖子
+     */
+    @PostMapping("/publish")
+    public AjaxResult publishPost(@RequestBody Post post)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        String username = null;
+        try {
+            userId = getUserId();
+            username = getUsername();
+        } catch (Exception e) {
+            return error("请先登录后再发布帖子");
+        }
+        
+        if (userId == null) {
+            return error("请先登录后再发布帖子");
+        }
+        
+        // 验证必填字段
+        if (post.getTitle() == null || post.getTitle().trim().isEmpty()) {
+            return error("帖子标题不能为空");
+        }
+        
+        if (post.getContent() == null || post.getContent().trim().isEmpty()) {
+            return error("帖子内容不能为空");
+        }
+        
+        if (post.getSummary() == null || post.getSummary().trim().isEmpty()) {
+            return error("帖子摘要不能为空");
+        }
+        
+        // 设置帖子基本信息
+        post.setAuthorId(userId);
+        post.setAuthor(username);
+        post.setViews(0L);
+        post.setComments(0L);
+        post.setFavorites(0L);
+        post.setLikes(0L);
+        post.setStatus("0"); // 默认待审核状态
+        post.setCreateBy(username);
+        
+        // 自动设置发布时间
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        post.setPublishTime(sdf.format(new Date()));
+        
+        // 如果没有设置封面图，使用默认图片
+        if (post.getCoverImage() == null || post.getCoverImage().trim().isEmpty()) {
+            post.setCoverImage("/images/default-cover.jpg");
+        }
+        
+        // 处理标签
+        if (post.getTags() != null && !post.getTags().trim().isEmpty()) {
+            // 这里可以处理标签逻辑，比如创建标签关联关系
+            // 暂时直接保存标签字符串
+        }
+        
+        int result = postService.insertPost(post);
+        
+        if (result > 0) {
+            return success("帖子发布成功，等待管理员审核");
+        } else {
+            return error("帖子发布失败");
+        }
+    }
+    
+    /**
+     * 获取当前用户的帖子列表
+     */
+    @GetMapping("/my-posts")
+    public TableDataInfo getMyPosts(Post post,
+                                   @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
+                                   @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return getDataTable(new ArrayList<>());
+        }
+        
+        if (userId == null) {
+            return getDataTable(new ArrayList<>());
+        }
+        
+        // 手动设置分页参数
+        PageHelper.startPage(pageNum, pageSize);
+        
+        // 只查询当前用户的帖子
+        post.setAuthorId(userId);
+        List<Post> list = postService.selectPostList(post);
+        return getDataTable(list);
+    }
+    
+    /**
+     * 获取当前用户的收藏列表
+     */
+    @GetMapping("/my-favorites")
+    public TableDataInfo getMyFavorites(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
+                                       @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return getDataTable(new ArrayList<>());
+        }
+        
+        if (userId == null) {
+            return getDataTable(new ArrayList<>());
+        }
+        
+        // 手动设置分页参数
+        PageHelper.startPage(pageNum, pageSize);
+        
+        // 查询用户收藏的帖子
+        PostFavorite favoriteQuery = new PostFavorite();
+        favoriteQuery.setUserId(userId);
+        favoriteQuery.setStatus("0"); // 只查询有效收藏
+        List<PostFavorite> favorites = postFavoriteService.selectPostFavoriteList(favoriteQuery);
+        
+        // 获取收藏的帖子详情
+        List<Post> favoritePosts = new ArrayList<>();
+        for (PostFavorite favorite : favorites) {
+            Post post = postService.selectPostById(favorite.getPostId());
+            if (post != null && "1".equals(post.getStatus())) {
+                favoritePosts.add(post);
+            }
+        }
+        
+        return getDataTable(favoritePosts);
+    }
+    
+    /**
+     * 更新帖子
+     */
+    @PutMapping("/update")
+    public AjaxResult updatePost(@RequestBody Post post)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        String username = null;
+        try {
+            userId = getUserId();
+            username = getUsername();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        if (post.getPostId() == null) {
+            return error("帖子ID不能为空");
+        }
+        
+        // 检查帖子是否存在且属于当前用户
+        Post existingPost = postService.selectPostById(post.getPostId());
+        if (existingPost == null) {
+            return error("帖子不存在");
+        }
+        
+        if (!userId.equals(existingPost.getAuthorId())) {
+            return error("只能编辑自己的帖子");
+        }
+        
+        // 验证必填字段
+        if (post.getTitle() == null || post.getTitle().trim().isEmpty()) {
+            return error("帖子标题不能为空");
+        }
+        
+        if (post.getContent() == null || post.getContent().trim().isEmpty()) {
+            return error("帖子内容不能为空");
+        }
+        
+        if (post.getSummary() == null || post.getSummary().trim().isEmpty()) {
+            return error("帖子摘要不能为空");
+        }
+        
+        // 设置更新信息
+        post.setUpdateBy(username);
+        
+        int result = postService.updatePost(post);
+        
+        if (result > 0) {
+            return success("帖子更新成功");
+        } else {
+            return error("帖子更新失败");
+        }
+    }
+    
+    /**
+     * 删除帖子
+     */
+    @DeleteMapping("/delete/{postId}")
+    public AjaxResult deletePost(@PathVariable Long postId)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 检查帖子是否存在且属于当前用户
+        Post existingPost = postService.selectPostById(postId);
+        if (existingPost == null) {
+            return error("帖子不存在");
+        }
+        
+        if (!userId.equals(existingPost.getAuthorId())) {
+            return error("只能删除自己的帖子");
+        }
+        
+        try {
+            // 级联删除相关数据
+            // 1. 删除帖子评论
+            postCommentService.deletePostCommentByPostId(postId);
+            
+            // 2. 删除帖子收藏记录
+            postFavoriteService.deletePostFavoriteByPostId(postId);
+            
+            // 3. 删除帖子本身
+        int result = postService.deletePostById(postId);
+        
+        if (result > 0) {
+            return success("帖子删除成功");
+        } else {
+            return error("帖子删除失败");
+            }
+        } catch (Exception e) {
+            return error("删除失败：" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 获取可用标签列表（用于下拉选择）
+     */
+    @Anonymous
+    @GetMapping("/tags/available")
+    public AjaxResult getAvailableTags()
+    {
+        PostTag query = new PostTag();
+        query.setStatus("0"); // 正常状态
+        List<PostTag> tags = postTagService.selectPostTagList(query);
+        return success(tags);
+    }
+    
+    /**
+     * 点赞/取消点赞帖子
+     */
+    @PostMapping("/like/{postId}")
+    public AjaxResult toggleLike(@PathVariable Long postId, @RequestParam(required = false, defaultValue = "true") boolean like)
+    {
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 检查帖子是否存在
+        Post post = postService.selectPostById(postId);
+        if (post == null || !"1".equals(post.getStatus())) {
+            return error("帖子不存在或已下架");
+        }
+        
+        // 这里简化处理，直接更新点赞数
+        // 实际应用中应该记录用户点赞状态，防止重复点赞
+        if (like) {
+            postService.updatePostLikes(postId, 1);
+            return success("点赞成功");
+        } else {
+            postService.updatePostLikes(postId, -1);
+            return success("取消点赞成功");
+        }
+    }
+    
+    /**
+     * 点赞/取消点赞评论
+     */
+    @PostMapping("/comment/like/{commentId}")
+    public AjaxResult toggleCommentLike(@PathVariable Long commentId, @RequestParam(required = false, defaultValue = "true") boolean like)
+    {
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 检查评论是否存在
+        PostComment comment = postCommentService.selectPostCommentById(commentId);
+        if (comment == null || !"1".equals(comment.getStatus())) {
+            return error("评论不存在或已删除");
+        }
+        
+        // 这里简化处理，直接更新点赞数
+        // 实际应用中应该记录用户点赞状态，防止重复点赞
+        if (like) {
+            postCommentService.updateCommentLikes(commentId, 1);
+            return success("点赞成功");
+        } else {
+            postCommentService.updateCommentLikes(commentId, -1);
+            return success("取消点赞成功");
+        }
+    }
+    
+    /**
+     * 上传图片
+     */
+    @PostMapping("/upload")
+    public AjaxResult uploadImage(@RequestParam("file") MultipartFile file)
+    {
+        try {
+            if (file.isEmpty()) {
+                return error("上传文件不能为空");
+            }
+            
+            // 检查文件类型
+            String originalFilename = file.getOriginalFilename();
+            if (originalFilename == null) {
+                return error("文件名不能为空");
+            }
+            
+            String extension = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
+            if (!extension.matches("(?i)\\.(jpg|jpeg|png|gif|bmp|webp)$")) {
+                return error("只支持jpg、jpeg、png、gif、bmp、webp格式的图片文件");
+            }
+            
+            // 检查文件大小（限制为5MB）
+            if (file.getSize() > 5 * 1024 * 1024) {
+                return error("文件大小不能超过5MB");
+            }
+            
+            // 生成唯一文件名
+            String fileName = System.currentTimeMillis() + "_" + 
+                             (int)(Math.random() * 1000) + extension;
+            
+            // 使用配置文件中的相对路径
+            String frontendImagePath = com.ruoyi.common.config.RuoYiConfig.getFrontendImagePath();
+            if (frontendImagePath == null) {
+                return error("前端图片路径未配置");
+            }
+            
+            // 获取项目根目录的绝对路径
+            String projectRoot = System.getProperty("user.dir");
+            String uploadDir = Paths.get(projectRoot, frontendImagePath).toString();
+            
+            File uploadDirFile = new File(uploadDir);
+            if (!uploadDirFile.exists()) {
+                uploadDirFile.mkdirs();
+            }
+            
+            // 保存文件
+            Path filePath = Paths.get(uploadDir, fileName);
+            Files.copy(file.getInputStream(), filePath);
+            
+            // 返回访问URL - 前端可以直接通过/images/访问
+            String imageUrl = "/images/" + fileName;
+            
+            Map<String, String> result = new HashMap<>();
+            result.put("url", imageUrl);
+            result.put("filename", fileName);
+            result.put("originalName", originalFilename);
+            result.put("size", String.valueOf(file.getSize()));
+            
+            return success(result);
+        } catch (IOException e) {
+            return error("上传失败：" + e.getMessage());
+        } catch (Exception e) {
+            return error("上传失败：" + e.getMessage());
+        }
+    }
+
+    /**
+     * 删除图片
+     */
+    @DeleteMapping("/upload")
+    public AjaxResult deleteImage(@RequestParam("filename") String filename)
+    {
+        try {
+            if (filename == null || filename.trim().isEmpty()) {
+                return error("文件名不能为空");
+            }
+            
+            // 使用配置文件中的相对路径
+            String frontendImagePath = com.ruoyi.common.config.RuoYiConfig.getFrontendImagePath();
+            if (frontendImagePath == null) {
+                return error("前端图片路径未配置");
+            }
+            
+            // 获取项目根目录的绝对路径
+            String projectRoot = System.getProperty("user.dir");
+            String uploadDir = Paths.get(projectRoot, frontendImagePath).toString();
+            Path filePath = Paths.get(uploadDir, filename);
+            
+            // 检查文件是否存在
+            if (Files.exists(filePath)) {
+                Files.delete(filePath);
+                return success("图片删除成功");
+            } else {
+                return error("文件不存在");
+            }
+        } catch (IOException e) {
+            return error("删除失败：" + e.getMessage());
+        } catch (Exception e) {
+            return error("删除失败：" + e.getMessage());
+        }
+    }
+
+    /**
+     * 获取推广计划列表
+     */
+    @Anonymous
+    @GetMapping("/promotion-plans")
+    public AjaxResult getPromotionPlans()
+    {
+        // 这里应该从数据库查询推广计划，暂时返回硬编码数据
+        List<Map<String, Object>> plans = new ArrayList<>();
+        
+        Map<String, Object> plan1 = new HashMap<>();
+        plan1.put("id", 1);
+        plan1.put("name", "首页推荐");
+        plan1.put("description", "帖子显示在首页推荐位置");
+        plan1.put("price", 50.00);
+        plan1.put("duration", 7);
+        plans.add(plan1);
+        
+        Map<String, Object> plan2 = new HashMap<>();
+        plan2.put("id", 2);
+        plan2.put("name", "置顶推广");
+        plan2.put("description", "帖子在分类页面置顶显示");
+        plan2.put("price", 30.00);
+        plan2.put("duration", 3);
+        plans.add(plan2);
+        
+        Map<String, Object> plan3 = new HashMap<>();
+        plan3.put("id", 3);
+        plan3.put("name", "热门推荐");
+        plan3.put("description", "帖子显示在热门推荐区域");
+        plan3.put("price", 80.00);
+        plan3.put("duration", 14);
+        plans.add(plan3);
+        
+        Map<String, Object> plan4 = new HashMap<>();
+        plan4.put("id", 4);
+        plan4.put("name", "限时闪推");
+        plan4.put("description", "特定时间段内高优显示");
+        plan4.put("price", 20.00);
+        plan4.put("duration", 1);
+        plans.add(plan4);
+        
+        Map<String, Object> plan5 = new HashMap<>();
+        plan5.put("id", 5);
+        plan5.put("name", "分类页首条");
+        plan5.put("description", "在所属分类列表第一条显示（非置顶样式）");
+        plan5.put("price", 40.00);
+        plan5.put("duration", 5);
+        plans.add(plan5);
+        
+        return success(plans);
+    }
+
+    /**
+     * 创建支付记录
+     */
+    @PostMapping("/payment")
+    public AjaxResult createPayment(@RequestBody PaymentRequest request)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 验证参数
+        if (request.getPostId() == null || request.getPlanId() == null || request.getAmount() == null) {
+            return error("参数不完整");
+        }
+        
+        // 检查帖子是否存在且属于当前用户
+        Post post = postService.selectPostById(request.getPostId());
+        if (post == null) {
+            return error("帖子不存在");
+        }
+        
+        if (!userId.equals(post.getAuthorId())) {
+            return error("只能为自己的帖子购买推广");
+        }
+        
+        // 创建支付记录
+        PostPayment payment = new PostPayment();
+        payment.setPostId(request.getPostId());
+        payment.setPlanId(request.getPlanId());
+        payment.setUserId(userId);
+        payment.setAmount(BigDecimal.valueOf(request.getAmount()));
+        payment.setPaymentStatus("pending"); // 待支付状态
+        payment.setPaymentTime(new Date());
+        
+        int result = postPaymentMapper.insertPostPayment(payment);
+        
+        if (result > 0) {
+            return success(payment);
+        } else {
+            return error("创建支付记录失败");
+        }
+    }
+
+    /**
+     * 检查帖子推广状态
+     */
+    @GetMapping("/promotion-status/{postId}")
+    public AjaxResult getPromotionStatus(@PathVariable Long postId)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 检查帖子是否存在且属于当前用户
+        Post post = postService.selectPostById(postId);
+        if (post == null) {
+            return error("帖子不存在");
+        }
+        
+        if (!userId.equals(post.getAuthorId())) {
+            return error("只能查看自己的帖子推广状态");
+        }
+        
+        Map<String, Object> result = new HashMap<>();
+        result.put("hasPromotion", post.getPromotionPlanId() != null);
+        result.put("promotionPlanId", post.getPromotionPlanId());
+        
+        // 查询最新的支付记录
+        if (post.getPromotionPlanId() != null) {
+            PostPayment latestPayment = postPaymentMapper.selectLatestPaymentByPostId(postId);
+            result.put("latestPayment", latestPayment);
+        }
+        
+        return success(result);
+    }
+
+    /**
+     * 确认支付成功
+     */
+    @PostMapping("/payment/confirm/{paymentId}")
+    public AjaxResult confirmPayment(@PathVariable Long paymentId)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 查询支付记录
+        PostPayment payment = postPaymentMapper.selectPostPaymentById(paymentId);
+        if (payment == null) {
+            return error("支付记录不存在");
+        }
+        
+        if (!userId.equals(payment.getUserId())) {
+            return error("只能确认自己的支付记录");
+        }
+        
+        if (!"pending".equals(payment.getPaymentStatus())) {
+            return error("支付记录状态异常");
+        }
+        
+        // 更新支付状态为成功
+        payment.setPaymentStatus("paid");
+        payment.setPaymentTime(new Date());
+        postPaymentMapper.updatePostPayment(payment);
+        
+        // 更新帖子的推广计划ID
+        Post updatePost = new Post();
+        updatePost.setPostId(payment.getPostId());
+        updatePost.setPromotionPlanId(payment.getPlanId());
+        updatePost.setUpdateBy(getUsername());
+        
+        int result = postService.updatePost(updatePost);
+        
+        if (result > 0) {
+            return success("支付成功，推广已生效");
+        } else {
+            return error("支付确认失败");
+        }
+    }
+
+    /**
+     * 取消支付
+     */
+    @PostMapping("/payment/cancel/{paymentId}")
+    public AjaxResult cancelPayment(@PathVariable Long paymentId)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        try {
+            userId = getUserId();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 查询支付记录
+        PostPayment payment = postPaymentMapper.selectPostPaymentById(paymentId);
+        if (payment == null) {
+            return error("支付记录不存在");
+        }
+        
+        if (!userId.equals(payment.getUserId())) {
+            return error("只能取消自己的支付记录");
+        }
+        
+        if (!"pending".equals(payment.getPaymentStatus())) {
+            return error("支付记录状态异常");
+        }
+        
+        // 更新支付状态为失败
+        payment.setPaymentStatus("failed");
+        postPaymentMapper.updatePostPayment(payment);
+        
+        return success("支付已取消");
+    }
+
+    /**
+     * 支付请求类
+     */
+    public static class PaymentRequest {
+        private Long postId;
+        private Long planId;
+        private Double amount;
+
+        public Long getPostId() {
+            return postId;
+        }
+
+        public void setPostId(Long postId) {
+            this.postId = postId;
+        }
+
+        public Long getPlanId() {
+            return planId;
+        }
+
+        public void setPlanId(Long planId) {
+            this.planId = planId;
+        }
+
+        public Double getAmount() {
+            return amount;
+        }
+
+        public void setAmount(Double amount) {
+            this.amount = amount;
+        }
+    }
+
+    /**
+     * 举报帖子
+     */
+    @PostMapping("/report/{postId}")
+    public AjaxResult reportPost(@PathVariable Long postId, @RequestBody ReportRequest request)
+    {
+        // 检查用户是否登录
+        Long userId = null;
+        String username = null;
+        try {
+            userId = getUserId();
+            username = getUsername();
+        } catch (Exception e) {
+            return error("请先登录");
+        }
+        
+        if (userId == null) {
+            return error("请先登录");
+        }
+        
+        // 检查帖子是否存在
+        Post post = postService.selectPostById(postId);
+        if (post == null || !"1".equals(post.getStatus())) {
+            return error("帖子不存在或已下架");
+        }
+        
+        // 检查举报理由
+        if (request.getReason() == null || request.getReason().trim().isEmpty()) {
+            return error("举报理由不能为空");
+        }
+        
+        // 创建举报记录
+        PostReport report = new PostReport();
+        report.setPostId(postId);
+        report.setPostTitle(post.getTitle());
+        report.setReportUserId(userId);
+        report.setReportUserName(username);
+        report.setReportReason(request.getReason());
+        report.setStatus("0"); // 待处理状态
+        report.setCreateBy(username);
+        
+        int result = postReportMapper.insertPostReport(report);
+        
+        if (result > 0) {
+            return success("举报提交成功，我们会尽快处理");
+        } else {
+            return error("举报提交失败");
+        }
+    }
+
+    /**
+     * 举报请求类
+     */
+    public static class ReportRequest {
+        private String reason;
+
+        public String getReason() {
+            return reason;
+        }
+
+        public void setReason(String reason) {
+            this.reason = reason;
+        }
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostCommentController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostCommentController.java
new file mode 100644
index 0000000..a3859fa
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostCommentController.java
@@ -0,0 +1,167 @@
+package com.ruoyi.web.controller.post.controller;
+
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.web.controller.post.domain.PostComment;
+import com.ruoyi.web.controller.post.service.IPostCommentService;
+import com.ruoyi.web.controller.post.service.IPostService;
+
+/**
+ * 帖子评论信息操作处理
+ * 
+ * @author thunderhub
+ */
+@RestController
+@RequestMapping("/post/comment")
+public class PostCommentController extends BaseController
+{
+    @Autowired
+    private IPostCommentService postCommentService;
+    
+    @Autowired
+    private IPostService postService;
+
+    /**
+     * 获取帖子评论列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:comment:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(PostComment postComment)
+    {
+        startPage();
+        List<PostComment> list = postCommentService.selectPostCommentList(postComment);
+        return getDataTable(list);
+    }
+    
+    /**
+     * 导出帖子评论列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:comment:export')")
+    @Log(title = "帖子评论", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, PostComment postComment)
+    {
+        List<PostComment> list = postCommentService.selectPostCommentList(postComment);
+        ExcelUtil<PostComment> util = new ExcelUtil<PostComment>(PostComment.class);
+        util.exportExcel(response, list, "评论数据");
+    }
+
+    /**
+     * 获取帖子评论详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('post:comment:query')")
+    @GetMapping(value = "/{commentId}")
+    public AjaxResult getInfo(@PathVariable Long commentId)
+    {
+        return success(postCommentService.selectPostCommentById(commentId));
+    }
+
+    /**
+     * 新增帖子评论
+     */
+    @PreAuthorize("@ss.hasPermi('post:comment:add')")
+    @Log(title = "帖子评论", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody PostComment postComment)
+    {
+        postComment.setCreateBy(getUsername());
+        postComment.setUserId(getUserId());
+        postComment.setUserName(getUsername());
+        postComment.setLikes(0L);
+        
+        // 如果父评论ID为空，设置为0（顶级评论）
+        if (postComment.getParentId() == null) {
+            postComment.setParentId(0L);
+        }
+        
+        int result = postCommentService.insertPostComment(postComment);
+        
+        if (result > 0) {
+            // 更新帖子评论数
+            postService.updatePostComments(postComment.getPostId(), 1);
+        }
+        
+        return toAjax(result);
+    }
+
+    /**
+     * 修改帖子评论
+     */
+    @PreAuthorize("@ss.hasPermi('post:comment:edit')")
+    @Log(title = "帖子评论", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody PostComment postComment)
+    {
+        postComment.setUpdateBy(getUsername());
+        return toAjax(postCommentService.updatePostComment(postComment));
+    }
+
+    /**
+     * 删除帖子评论
+     */
+    @PreAuthorize("@ss.hasPermi('post:comment:remove')")
+    @Log(title = "帖子评论", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{commentIds}")
+    public AjaxResult remove(@PathVariable Long[] commentIds)
+    {
+        // 查询评论信息，用于后续更新帖子评论数
+        for (Long commentId : commentIds) {
+            PostComment comment = postCommentService.selectPostCommentById(commentId);
+            if (comment != null) {
+                // 计算删除的评论和回复总数
+                int count = 1; // 至少有一条评论
+                
+                // 如果是顶级评论，还需要计算回复数
+                if (comment.getParentId() == 0) {
+                    List<PostComment> replies = postCommentService.selectCommentsByParentId(commentId);
+                    count += replies.size();
+                }
+                
+                // 更新帖子评论数
+                postService.updatePostComments(comment.getPostId(), -count);
+            }
+        }
+        
+        return toAjax(postCommentService.deletePostCommentByIds(commentIds));
+    }
+    
+    /**
+     * 获取帖子的评论列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:comment:list')")
+    @GetMapping("/list/{postId}")
+    public AjaxResult listByPostId(@PathVariable Long postId)
+    {
+        List<PostComment> comments = postCommentService.selectCommentsByPostId(postId, 0);
+        return success(comments);
+    }
+    
+    /**
+     * 点赞评论
+     */
+    @PreAuthorize("@ss.hasPermi('post:comment:like')")
+    @Log(title = "评论点赞", businessType = BusinessType.UPDATE)
+    @PostMapping("/like/{commentId}")
+    public AjaxResult like(@PathVariable Long commentId)
+    {
+        int result = postCommentService.updateCommentLikes(commentId, 1);
+        return toAjax(result);
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostController.java
new file mode 100644
index 0000000..e885966
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostController.java
@@ -0,0 +1,590 @@
+package com.ruoyi.web.controller.post.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.web.controller.post.domain.Post;
+import com.ruoyi.web.controller.post.domain.PostComment;
+import com.ruoyi.web.controller.post.domain.PostFavorite;
+import com.ruoyi.web.controller.post.domain.PostTag;
+import com.ruoyi.web.controller.post.domain.PostReport;
+import com.ruoyi.web.controller.post.service.IPostCommentService;
+import com.ruoyi.web.controller.post.service.IPostFavoriteService;
+import com.ruoyi.web.controller.post.service.IPostService;
+import com.ruoyi.web.controller.post.service.IPostTagService;
+import com.ruoyi.web.controller.post.mapper.PostReportMapper;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Date;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 帖子信息操作处理
+ * 
+ * @author thunderhub
+ */
+@RestController
+@RequestMapping("/post")
+public class PostController extends BaseController
+{
+    @Autowired
+    private IPostService postService;
+    
+    @Autowired
+    private IPostTagService postTagService;
+    
+    @Autowired
+    private IPostCommentService postCommentService;
+    
+    @Autowired
+    private IPostFavoriteService postFavoriteService;
+    
+    @Autowired
+    private PostReportMapper postReportMapper;
+
+    /**
+     * 获取帖子列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(Post post)
+    {
+        startPage();
+        List<Post> list = postService.selectPostList(post);
+        return getDataTable(list);
+    }
+    
+    /**
+     * 导出帖子列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:export')")
+    @Log(title = "帖子管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, Post post)
+    {
+        List<Post> list = postService.selectPostList(post);
+        ExcelUtil<Post> util = new ExcelUtil<Post>(Post.class);
+        util.exportExcel(response, list, "帖子数据");
+    }
+
+    /**
+     * 获取帖子详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:query')")
+    @GetMapping(value = "/{postId}")
+    public AjaxResult getInfo(@PathVariable Long postId)
+    {
+        Map<String, Object> result = new HashMap<>();
+        
+        // 更新浏览量
+        postService.updatePostViews(postId);
+        
+        // 获取帖子信息
+        Post post = postService.selectPostById(postId);
+        if (post == null) {
+            return error("帖子不存在");
+        }
+        result.put("post", post);
+        
+        // 获取帖子标签
+        List<PostTag> tags = postTagService.selectPostTagsByPostId(postId);
+        result.put("tags", tags);
+        
+        // 获取评论，只返回顶级评论，不包含回复
+        PostComment commentQuery = new PostComment();
+        commentQuery.setPostId(postId);
+        commentQuery.setParentId(0L);
+        List<PostComment> comments = postCommentService.selectPostCommentList(commentQuery);
+        
+        // 获取每个评论的回复
+        List<Map<String, Object>> commentList = new ArrayList<>();
+        for (PostComment comment : comments) {
+            Map<String, Object> commentMap = new HashMap<>();
+            commentMap.put("comment", comment);
+            List<PostComment> replies = postCommentService.selectCommentsByParentId(comment.getCommentId());
+            commentMap.put("replies", replies);
+            commentList.add(commentMap);
+        }
+        result.put("comments", commentList);
+        
+        // 获取相关帖子
+        // 1. 同一作者的其他帖子
+        List<Post> authorPosts = postService.selectAuthorOtherPosts(post.getAuthorId(), postId, 3);
+        result.put("authorPosts", authorPosts);
+        
+        // 2. 相似标签的帖子
+        List<Post> similarPosts = postService.selectSimilarTagsPosts(post.getTags(), postId, 3);
+        result.put("similarPosts", similarPosts);
+        
+        // 判断当前用户是否已收藏
+        Long userId = getUserId();
+        if (userId != null) {
+            PostFavorite favorite = postFavoriteService.selectPostFavoriteByPostIdAndUserId(postId, userId);
+            result.put("favorited", favorite != null && "0".equals(favorite.getStatus()));
+        } else {
+            result.put("favorited", false);
+        }
+        
+        return success(result);
+    }
+
+    /**
+     * 新增帖子
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:add')")
+    @Log(title = "帖子管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody Post post)
+    {
+        post.setCreateBy(getUsername());
+        post.setAuthorId(getUserId());
+        post.setAuthor(getUsername());
+        post.setViews(0L);
+        post.setComments(0L);
+        post.setFavorites(0L);
+        
+        // 处理标签，如果有传入标签数组
+        String tags = post.getTags();
+        int result = postService.insertPost(post);
+        
+        if (result > 0 && StringUtils.isNotEmpty(tags)) {
+            // 处理标签关联
+            String[] tagArray = tags.split(",");
+            for (String tagName : tagArray) {
+                // 查询标签是否存在
+                PostTag tagQuery = new PostTag();
+                tagQuery.setTagName(tagName);
+                List<PostTag> existTags = postTagService.selectPostTagList(tagQuery);
+                
+                Long tagId;
+                if (existTags.isEmpty()) {
+                    // 创建新标签
+                    PostTag newTag = new PostTag();
+                    newTag.setTagName(tagName);
+                    newTag.setTagColor("blue"); // 默认颜色
+                    newTag.setPostCount(1L);
+                    newTag.setStatus("0"); // 正常状态
+                    newTag.setCreateBy(getUsername());
+                    postTagService.insertPostTag(newTag);
+                    tagId = newTag.getTagId();
+                } else {
+                    // 更新标签帖子数量
+                    PostTag existTag = existTags.get(0);
+                    tagId = existTag.getTagId();
+                    postTagService.updatePostTagCount(tagId, 1);
+                }
+                
+                // 创建帖子标签关联
+                Long[] tagIds = new Long[]{tagId};
+                postTagService.batchInsertPostTagRelation(post.getPostId(), tagIds);
+            }
+        }
+        
+        return toAjax(result);
+    }
+
+    /**
+     * 修改帖子
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:edit')")
+    @Log(title = "帖子管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody Post post)
+    {
+        post.setUpdateBy(getUsername());
+        
+        // 处理标签
+        String tags = post.getTags();
+        
+        // 先删除旧的标签关联
+        postTagService.deletePostTagRelation(post.getPostId());
+        
+        int result = postService.updatePost(post);
+        
+        if (result > 0 && StringUtils.isNotEmpty(tags)) {
+            // 处理标签关联
+            String[] tagArray = tags.split(",");
+            for (String tagName : tagArray) {
+                // 查询标签是否存在
+                PostTag tagQuery = new PostTag();
+                tagQuery.setTagName(tagName);
+                List<PostTag> existTags = postTagService.selectPostTagList(tagQuery);
+                
+                Long tagId;
+                if (existTags.isEmpty()) {
+                    // 创建新标签
+                    PostTag newTag = new PostTag();
+                    newTag.setTagName(tagName);
+                    newTag.setTagColor("blue"); // 默认颜色
+                    newTag.setPostCount(1L);
+                    newTag.setStatus("0"); // 正常状态
+                    newTag.setCreateBy(getUsername());
+                    postTagService.insertPostTag(newTag);
+                    tagId = newTag.getTagId();
+                } else {
+                    // 更新标签帖子数量
+                    PostTag existTag = existTags.get(0);
+                    tagId = existTag.getTagId();
+                    postTagService.updatePostTagCount(tagId, 1);
+                }
+                
+                // 创建帖子标签关联
+                Long[] tagIds = new Long[]{tagId};
+                postTagService.batchInsertPostTagRelation(post.getPostId(), tagIds);
+            }
+        }
+        
+        return toAjax(result);
+    }
+
+    /**
+     * 删除帖子
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:remove')")
+    @Log(title = "帖子管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{postIds}")
+    public AjaxResult remove(@PathVariable Long[] postIds)
+    {
+        // 删除帖子相关的评论和收藏
+        for (Long postId : postIds) {
+            postCommentService.deletePostCommentByPostId(postId);
+            postFavoriteService.deletePostFavoriteByPostId(postId);
+            // 删除帖子标签关联
+            postTagService.deletePostTagRelation(postId);
+        }
+        
+        return toAjax(postService.deletePostByIds(postIds));
+    }
+    
+    /**
+     * 收藏帖子
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:favorite')")
+    @Log(title = "帖子收藏", businessType = BusinessType.INSERT)
+    @PostMapping("/favorite/{postId}")
+    public AjaxResult favorite(@PathVariable Long postId)
+    {
+        Long userId = getUserId();
+        
+        // 检查是否已收藏
+        PostFavorite exist = postFavoriteService.selectPostFavoriteByPostIdAndUserId(postId, userId);
+        
+        if (exist != null) {
+            // 已存在记录，检查状态
+            if ("0".equals(exist.getStatus())) {
+                return error("已收藏该帖子");
+            } else {
+                // 取消收藏状态，改为收藏状态
+                exist.setStatus("0");
+                exist.setUpdateBy(getUsername());
+                postFavoriteService.updatePostFavorite(exist);
+                
+                // 更新帖子收藏数量
+                postService.updatePostFavorites(postId, 1);
+                
+                return success("收藏成功");
+            }
+        } else {
+            // 创建收藏记录
+            Post post = postService.selectPostById(postId);
+            if (post == null) {
+                return error("帖子不存在");
+            }
+            
+            PostFavorite favorite = new PostFavorite();
+            favorite.setPostId(postId);
+            favorite.setUserId(userId);
+            favorite.setPostTitle(post.getTitle());
+            favorite.setPostCover(post.getCoverImage());
+            favorite.setStatus("0");
+            favorite.setCreateBy(getUsername());
+            postFavoriteService.insertPostFavorite(favorite);
+            
+            // 更新帖子收藏数量
+            postService.updatePostFavorites(postId, 1);
+            
+            return success("收藏成功");
+        }
+    }
+    
+    /**
+     * 取消收藏帖子
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:unfavorite')")
+    @Log(title = "取消收藏", businessType = BusinessType.UPDATE)
+    @PostMapping("/unfavorite/{postId}")
+    public AjaxResult unfavorite(@PathVariable Long postId)
+    {
+        Long userId = getUserId();
+        
+        // 检查是否已收藏
+        PostFavorite exist = postFavoriteService.selectPostFavoriteByPostIdAndUserId(postId, userId);
+        
+        if (exist != null && "0".equals(exist.getStatus())) {
+            // 更新为取消收藏状态
+            exist.setStatus("1");
+            exist.setUpdateBy(getUsername());
+            postFavoriteService.updatePostFavorite(exist);
+            
+            // 更新帖子收藏数量
+            postService.updatePostFavorites(postId, -1);
+            
+            return success("取消收藏成功");
+        } else {
+            return error("未收藏该帖子");
+        }
+    }
+    
+    /**
+     * 获取用户收藏的帖子列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:list')")
+    @GetMapping("/favorite/list")
+    public TableDataInfo favoriteList()
+    {
+        startPage();
+        PostFavorite query = new PostFavorite();
+        query.setUserId(getUserId());
+        query.setStatus("0"); // 只查询收藏状态的记录
+        List<PostFavorite> list = postFavoriteService.selectPostFavoriteList(query);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询待审核帖子列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:review')")
+    @GetMapping("/review/list")
+    public TableDataInfo reviewList(Post post)
+    {
+        startPage();
+        // 只查询待审核状态的帖子
+        post.setStatus("0");
+        List<Post> list = postService.selectPostList(post);
+        return getDataTable(list);
+    }
+
+    /**
+     * 审核帖子（通过/拒绝）
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:review')")
+    @Log(title = "帖子审核", businessType = BusinessType.UPDATE)
+    @PutMapping("/review/{postId}")
+    public AjaxResult reviewPost(@PathVariable Long postId, @RequestBody ReviewRequest request)
+    {
+        Post post = postService.selectPostById(postId);
+        if (post == null) {
+            return error("帖子不存在");
+        }
+        
+        Post updatePost = new Post();
+        updatePost.setPostId(postId);
+        updatePost.setUpdateBy(getUsername());
+        
+        if ("approve".equals(request.getAction())) {
+            updatePost.setStatus("1"); // 审核通过，状态改为已发布
+            updatePost.setRemark(request.getReason());
+            
+            int result = postService.updatePost(updatePost);
+            if (result > 0) {
+                return success("帖子审核通过");
+            } else {
+                return error("审核操作失败");
+            }
+        } else if ("reject".equals(request.getAction())) {
+            updatePost.setStatus("2"); // 审核拒绝
+            updatePost.setRemark(request.getReason());
+            
+            int result = postService.updatePost(updatePost);
+            if (result > 0) {
+                return success("帖子审核拒绝");
+            } else {
+                return error("审核操作失败");
+            }
+        } else {
+            return error("无效的审核操作");
+        }
+    }
+
+    /**
+     * 强制下架帖子
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:takedown')")
+    @Log(title = "帖子下架", businessType = BusinessType.UPDATE)
+    @PutMapping("/takedown/{postId}")
+    public AjaxResult takeDownPost(@PathVariable Long postId, @RequestBody TakeDownRequest request)
+    {
+        Post post = postService.selectPostById(postId);
+        if (post == null) {
+            return error("帖子不存在");
+        }
+        
+        Post updatePost = new Post();
+        updatePost.setPostId(postId);
+        updatePost.setStatus("3"); // 状态改为已下架
+        updatePost.setRemark(request.getReason());
+        updatePost.setUpdateBy(getUsername());
+        
+        int result = postService.updatePost(updatePost);
+        if (result > 0) {
+            return success("帖子已下架");
+        } else {
+            return error("下架操作失败");
+        }
+    }
+
+    /**
+     * 查询举报列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:report')")
+    @GetMapping("/report/list")
+    public TableDataInfo reportList(PostReport postReport)
+    {
+        startPage();
+        List<PostReport> list = postReportMapper.selectPostReportList(postReport);
+        return getDataTable(list);
+    }
+
+    /**
+     * 处理举报（通过/驳回）
+     */
+    @PreAuthorize("@ss.hasPermi('post:post:report')")
+    @Log(title = "举报处理", businessType = BusinessType.UPDATE)
+    @PutMapping("/report/handle/{reportId}")
+    public AjaxResult handleReport(@PathVariable Long reportId, @RequestBody ReportHandleRequest request)
+    {
+        PostReport report = postReportMapper.selectPostReportById(reportId);
+        if (report == null) {
+            return error("举报记录不存在");
+        }
+        
+        if ("approve".equals(request.getAction())) {
+            // 举报属实，下架帖子
+            Post post = postService.selectPostById(request.getPostId());
+            if (post != null) {
+                Post updatePost = new Post();
+                updatePost.setPostId(request.getPostId());
+                updatePost.setStatus("3"); // 状态改为已下架
+                updatePost.setRemark("因举报下架：" + (request.getReason() != null ? request.getReason() : ""));
+                updatePost.setUpdateBy(getUsername());
+                
+                int result = postService.updatePost(updatePost);
+                if (result > 0) {
+                    // 更新举报记录状态
+                    report.setStatus("1"); // 已处理
+                    report.setHandleResult("举报属实，帖子已下架");
+                    report.setHandleTime(new Date());
+                    report.setHandleBy(getUsername());
+                    postReportMapper.updatePostReport(report);
+                    
+                    return success("举报处理成功，帖子已下架");
+                } else {
+                    return error("处理失败");
+                }
+            } else {
+                return error("帖子不存在");
+            }
+        } else if ("reject".equals(request.getAction())) {
+            // 举报不属实，驳回举报
+            report.setStatus("2"); // 已驳回
+            report.setHandleResult("举报不属实" + (request.getReason() != null ? "：" + request.getReason() : ""));
+            report.setHandleTime(new Date());
+            report.setHandleBy(getUsername());
+            postReportMapper.updatePostReport(report);
+            
+            return success("举报已驳回");
+        } else {
+            return error("无效的处理操作");
+        }
+    }
+
+    /**
+     * 审核请求类
+     */
+    public static class ReviewRequest {
+        private String action;
+        private String reason;
+
+        public String getAction() {
+            return action;
+        }
+
+        public void setAction(String action) {
+            this.action = action;
+        }
+
+        public String getReason() {
+            return reason;
+        }
+
+        public void setReason(String reason) {
+            this.reason = reason;
+        }
+    }
+
+    /**
+     * 下架请求类
+     */
+    public static class TakeDownRequest {
+        private String reason;
+
+        public String getReason() {
+            return reason;
+        }
+
+        public void setReason(String reason) {
+            this.reason = reason;
+        }
+    }
+
+    /**
+     * 举报处理请求类
+     */
+    public static class ReportHandleRequest {
+        private String action;
+        private String reason;
+        private Long postId;
+
+        public String getAction() {
+            return action;
+        }
+
+        public void setAction(String action) {
+            this.action = action;
+        }
+
+        public String getReason() {
+            return reason;
+        }
+
+        public void setReason(String reason) {
+            this.reason = reason;
+        }
+
+        public Long getPostId() {
+            return postId;
+        }
+
+        public void setPostId(Long postId) {
+            this.postId = postId;
+        }
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostTagController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostTagController.java
new file mode 100644
index 0000000..7b4b496
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/controller/PostTagController.java
@@ -0,0 +1,138 @@
+package com.ruoyi.web.controller.post.controller;
+
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.web.controller.post.domain.PostTag;
+import com.ruoyi.web.controller.post.service.IPostTagService;
+
+/**
+ * 帖子标签管理
+ * 
+ * @author thunderhub
+ */
+@RestController
+@RequestMapping("/post/tag")
+public class PostTagController extends BaseController
+{
+    @Autowired
+    private IPostTagService postTagService;
+
+    /**
+     * 获取帖子标签列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:tag:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(PostTag postTag)
+    {
+        startPage();
+        List<PostTag> list = postTagService.selectPostTagList(postTag);
+        return getDataTable(list);
+    }
+    
+    /**
+     * 导出帖子标签列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:tag:export')")
+    @Log(title = "帖子标签", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, PostTag postTag)
+    {
+        List<PostTag> list = postTagService.selectPostTagList(postTag);
+        ExcelUtil<PostTag> util = new ExcelUtil<PostTag>(PostTag.class);
+        util.exportExcel(response, list, "标签数据");
+    }
+
+    /**
+     * 获取帖子标签详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('post:tag:query')")
+    @GetMapping(value = "/{tagId}")
+    public AjaxResult getInfo(@PathVariable Long tagId)
+    {
+        return success(postTagService.selectPostTagById(tagId));
+    }
+
+    /**
+     * 新增帖子标签
+     */
+    @PreAuthorize("@ss.hasPermi('post:tag:add')")
+    @Log(title = "帖子标签", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody PostTag postTag)
+    {
+        if (!postTagService.checkTagNameUnique(postTag))
+        {
+            return error("新增标签'" + postTag.getTagName() + "'失败，标签名称已存在");
+        }
+        postTag.setCreateBy(getUsername());
+        postTag.setPostCount(0L);
+        return toAjax(postTagService.insertPostTag(postTag));
+    }
+
+    /**
+     * 修改帖子标签
+     */
+    @PreAuthorize("@ss.hasPermi('post:tag:edit')")
+    @Log(title = "帖子标签", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody PostTag postTag)
+    {
+        if (!postTagService.checkTagNameUnique(postTag))
+        {
+            return error("修改标签'" + postTag.getTagName() + "'失败，标签名称已存在");
+        }
+        postTag.setUpdateBy(getUsername());
+        return toAjax(postTagService.updatePostTag(postTag));
+    }
+
+    /**
+     * 删除帖子标签
+     */
+    @PreAuthorize("@ss.hasPermi('post:tag:remove')")
+    @Log(title = "帖子标签", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{tagIds}")
+    public AjaxResult remove(@PathVariable Long[] tagIds)
+    {
+        return toAjax(postTagService.deletePostTagByIds(tagIds));
+    }
+    
+    /**
+     * 获取帖子的标签列表
+     */
+    @PreAuthorize("@ss.hasPermi('post:tag:list')")
+    @GetMapping("/list/{postId}")
+    public AjaxResult listByPostId(@PathVariable Long postId)
+    {
+        List<PostTag> tags = postTagService.selectPostTagsByPostId(postId);
+        return success(tags);
+    }
+    
+    /**
+     * 获取所有可用标签（用于下拉选择）
+     */
+    @GetMapping("/optionselect")
+    public AjaxResult optionselect()
+    {
+        PostTag query = new PostTag();
+        query.setStatus("0"); // 正常状态
+        List<PostTag> tags = postTagService.selectPostTagList(query);
+        return success(tags);
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/Post.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/Post.java
new file mode 100644
index 0000000..40f18bf
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/Post.java
@@ -0,0 +1,256 @@
+package com.ruoyi.web.controller.post.domain;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 帖子表 sys_post
+ * 
+ * @author thunderhub
+ */
+public class Post extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 帖子ID */
+    @Excel(name = "帖子ID", cellType = ColumnType.NUMERIC)
+    private Long postId;
+
+    /** 帖子标题 */
+    @Excel(name = "帖子标题")
+    private String title;
+
+    /** 帖子内容（富文本） */
+    private String content;
+
+    /** 帖子摘要 */
+    @Excel(name = "帖子摘要")
+    private String summary;
+
+    /** 封面图片URL */
+    @Excel(name = "封面图片")
+    private String coverImage;
+
+    /** 作者ID */
+    @Excel(name = "作者ID")
+    private Long authorId;
+
+    /** 作者名称 */
+    @Excel(name = "作者名称")
+    private String author;
+
+    /** 浏览量 */
+    @Excel(name = "浏览量")
+    private Long views;
+
+    /** 评论数 */
+    @Excel(name = "评论数")
+    private Long comments;
+
+    /** 收藏数 */
+    @Excel(name = "收藏数")
+    private Long favorites;
+
+    /** 点赞数 */
+    @Excel(name = "点赞数")
+    private Long likes;
+
+    /** 状态（0待审核 1正常 2拒绝 3下架） */
+    @Excel(name = "状态", readConverterExp = "0=待审核,1=正常,2=拒绝,3=下架")
+    private String status;
+
+    /** 发布时间 */
+    @Excel(name = "发布时间")
+    private String publishTime;
+    
+    /** 标签列表，用逗号分隔 */
+    private String tags;
+
+    /** 推广计划ID */
+    @Excel(name = "推广计划ID")
+    private Long promotionPlanId;
+
+    public Long getPostId()
+    {
+        return postId;
+    }
+
+    public void setPostId(Long postId)
+    {
+        this.postId = postId;
+    }
+
+    @NotBlank(message = "帖子标题不能为空")
+    @Size(min = 0, max = 100, message = "帖子标题长度不能超过100个字符")
+    public String getTitle()
+    {
+        return title;
+    }
+
+    public void setTitle(String title)
+    {
+        this.title = title;
+    }
+
+    public String getContent()
+    {
+        return content;
+    }
+
+    public void setContent(String content)
+    {
+        this.content = content;
+    }
+
+    @Size(min = 0, max = 500, message = "帖子摘要长度不能超过500个字符")
+    public String getSummary()
+    {
+        return summary;
+    }
+
+    public void setSummary(String summary)
+    {
+        this.summary = summary;
+    }
+
+    public String getCoverImage()
+    {
+        return coverImage;
+    }
+
+    public void setCoverImage(String coverImage)
+    {
+        this.coverImage = coverImage;
+    }
+
+    public Long getAuthorId()
+    {
+        return authorId;
+    }
+
+    public void setAuthorId(Long authorId)
+    {
+        this.authorId = authorId;
+    }
+
+    public String getAuthor()
+    {
+        return author;
+    }
+
+    public void setAuthor(String author)
+    {
+        this.author = author;
+    }
+
+    public Long getViews()
+    {
+        return views;
+    }
+
+    public void setViews(Long views)
+    {
+        this.views = views;
+    }
+
+    public Long getComments()
+    {
+        return comments;
+    }
+
+    public void setComments(Long comments)
+    {
+        this.comments = comments;
+    }
+
+    public Long getFavorites()
+    {
+        return favorites;
+    }
+
+    public void setFavorites(Long favorites)
+    {
+        this.favorites = favorites;
+    }
+
+    public Long getLikes()
+    {
+        return likes;
+    }
+
+    public void setLikes(Long likes)
+    {
+        this.likes = likes;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getPublishTime()
+    {
+        return publishTime;
+    }
+
+    public void setPublishTime(String publishTime)
+    {
+        this.publishTime = publishTime;
+    }
+    
+    public String getTags()
+    {
+        return tags;
+    }
+
+    public void setTags(String tags)
+    {
+        this.tags = tags;
+    }
+
+    public Long getPromotionPlanId()
+    {
+        return promotionPlanId;
+    }
+
+    public void setPromotionPlanId(Long promotionPlanId)
+    {
+        this.promotionPlanId = promotionPlanId;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("postId", getPostId())
+            .append("title", getTitle())
+            .append("content", getContent())
+            .append("summary", getSummary())
+            .append("coverImage", getCoverImage())
+            .append("authorId", getAuthorId())
+            .append("author", getAuthor())
+            .append("views", getViews())
+            .append("comments", getComments())
+            .append("favorites", getFavorites())
+            .append("likes", getLikes())
+            .append("status", getStatus())
+            .append("publishTime", getPublishTime())
+            .append("tags", getTags())
+            .append("promotionPlanId", getPromotionPlanId())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostComment.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostComment.java
new file mode 100644
index 0000000..5041087
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostComment.java
@@ -0,0 +1,193 @@
+package com.ruoyi.web.controller.post.domain;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 帖子评论表 sys_post_comment
+ * 
+ * @author thunderhub
+ */
+public class PostComment extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 评论ID */
+    @Excel(name = "评论ID", cellType = ColumnType.NUMERIC)
+    private Long commentId;
+
+    /** 帖子ID */
+    @Excel(name = "帖子ID")
+    private Long postId;
+
+    /** 评论内容 */
+    @Excel(name = "评论内容")
+    private String content;
+
+    /** 评论人ID */
+    @Excel(name = "评论人ID")
+    private Long userId;
+
+    /** 评论人名称 */
+    @Excel(name = "评论人名称")
+    private String userName;
+
+    /** 评论人头像 */
+    private String userAvatar;
+
+    /** 父评论ID，如果为0则为顶级评论 */
+    private Long parentId;
+
+    /** 回复对象的用户ID */
+    private Long replyUserId;
+
+    /** 回复对象的用户名称 */
+    private String replyUserName;
+
+    /** 状态（0待审核 1正常 2拒绝） */
+    @Excel(name = "状态", readConverterExp = "0=待审核,1=正常,2=拒绝")
+    private String status;
+
+    /** 点赞数 */
+    @Excel(name = "点赞数")
+    private Long likes;
+
+    public Long getCommentId()
+    {
+        return commentId;
+    }
+
+    public void setCommentId(Long commentId)
+    {
+        this.commentId = commentId;
+    }
+
+    public Long getPostId()
+    {
+        return postId;
+    }
+
+    public void setPostId(Long postId)
+    {
+        this.postId = postId;
+    }
+
+    @NotBlank(message = "评论内容不能为空")
+    @Size(min = 0, max = 500, message = "评论内容长度不能超过500个字符")
+    public String getContent()
+    {
+        return content;
+    }
+
+    public void setContent(String content)
+    {
+        this.content = content;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getUserAvatar()
+    {
+        return userAvatar;
+    }
+
+    public void setUserAvatar(String userAvatar)
+    {
+        this.userAvatar = userAvatar;
+    }
+
+    public Long getParentId()
+    {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId)
+    {
+        this.parentId = parentId;
+    }
+
+    public Long getReplyUserId()
+    {
+        return replyUserId;
+    }
+
+    public void setReplyUserId(Long replyUserId)
+    {
+        this.replyUserId = replyUserId;
+    }
+
+    public String getReplyUserName()
+    {
+        return replyUserName;
+    }
+
+    public void setReplyUserName(String replyUserName)
+    {
+        this.replyUserName = replyUserName;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public Long getLikes()
+    {
+        return likes;
+    }
+
+    public void setLikes(Long likes)
+    {
+        this.likes = likes;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("commentId", getCommentId())
+            .append("postId", getPostId())
+            .append("content", getContent())
+            .append("userId", getUserId())
+            .append("userName", getUserName())
+            .append("userAvatar", getUserAvatar())
+            .append("parentId", getParentId())
+            .append("replyUserId", getReplyUserId())
+            .append("replyUserName", getReplyUserName())
+            .append("status", getStatus())
+            .append("likes", getLikes())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostFavorite.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostFavorite.java
new file mode 100644
index 0000000..1a6c0f0
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostFavorite.java
@@ -0,0 +1,117 @@
+package com.ruoyi.web.controller.post.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 帖子收藏表 sys_post_favorite
+ * 
+ * @author thunderhub
+ */
+public class PostFavorite extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 收藏ID */
+    @Excel(name = "收藏ID", cellType = ColumnType.NUMERIC)
+    private Long favoriteId;
+
+    /** 帖子ID */
+    @Excel(name = "帖子ID")
+    private Long postId;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /** 帖子标题 */
+    @Excel(name = "帖子标题")
+    private String postTitle;
+
+    /** 帖子封面 */
+    private String postCover;
+
+    /** 收藏状态（0收藏 1取消） */
+    @Excel(name = "收藏状态", readConverterExp = "0=收藏,1=取消")
+    private String status;
+
+    public Long getFavoriteId()
+    {
+        return favoriteId;
+    }
+
+    public void setFavoriteId(Long favoriteId)
+    {
+        this.favoriteId = favoriteId;
+    }
+
+    public Long getPostId()
+    {
+        return postId;
+    }
+
+    public void setPostId(Long postId)
+    {
+        this.postId = postId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public String getPostTitle()
+    {
+        return postTitle;
+    }
+
+    public void setPostTitle(String postTitle)
+    {
+        this.postTitle = postTitle;
+    }
+
+    public String getPostCover()
+    {
+        return postCover;
+    }
+
+    public void setPostCover(String postCover)
+    {
+        this.postCover = postCover;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("favoriteId", getFavoriteId())
+            .append("postId", getPostId())
+            .append("userId", getUserId())
+            .append("postTitle", getPostTitle())
+            .append("postCover", getPostCover())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostPayment.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostPayment.java
new file mode 100644
index 0000000..091fd94
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostPayment.java
@@ -0,0 +1,92 @@
+package com.ruoyi.web.controller.post.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 帖子支付记录对象 post_payment
+ * 
+ * @author thunderhub
+ */
+public class PostPayment extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 支付ID */
+    private Long paymentId;
+
+    /** 帖子ID */
+    private Long postId;
+
+    /** 推广计划ID */
+    private Long planId;
+
+    /** 用户ID */
+    private Long userId;
+
+    /** 支付金额 */
+    private BigDecimal amount;
+
+    /** 支付状态 */
+    private String paymentStatus;
+
+    /** 支付时间 */
+    private Date paymentTime;
+
+    public Long getPaymentId() {
+        return paymentId;
+    }
+
+    public void setPaymentId(Long paymentId) {
+        this.paymentId = paymentId;
+    }
+
+    public Long getPostId() {
+        return postId;
+    }
+
+    public void setPostId(Long postId) {
+        this.postId = postId;
+    }
+
+    public Long getPlanId() {
+        return planId;
+    }
+
+    public void setPlanId(Long planId) {
+        this.planId = planId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public String getPaymentStatus() {
+        return paymentStatus;
+    }
+
+    public void setPaymentStatus(String paymentStatus) {
+        this.paymentStatus = paymentStatus;
+    }
+
+    public Date getPaymentTime() {
+        return paymentTime;
+    }
+
+    public void setPaymentTime(Date paymentTime) {
+        this.paymentTime = paymentTime;
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostPromotionPlan.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostPromotionPlan.java
new file mode 100644
index 0000000..422e156
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostPromotionPlan.java
@@ -0,0 +1,118 @@
+package com.ruoyi.web.controller.post.domain;
+
+import java.math.BigDecimal;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 帖子推广计划对象 post_promotion_plan
+ * 
+ * @author thunderhub
+ */
+public class PostPromotionPlan extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 推广计划ID */
+    private Long planId;
+
+    /** 推广计划名称 */
+    private String planName;
+
+    /** 推广计划描述 */
+    private String planDescription;
+
+    /** 推广价格 */
+    private BigDecimal price;
+
+    /** 推广时长（天） */
+    private Integer duration;
+
+    /** 推广等级（数字越小等级越高） */
+    private Integer level;
+
+    /** 状态（0正常 1停用） */
+    private String status;
+
+    public void setPlanId(Long planId) 
+    {
+        this.planId = planId;
+    }
+
+    public Long getPlanId() 
+    {
+        return planId;
+    }
+
+    public void setPlanName(String planName) 
+    {
+        this.planName = planName;
+    }
+
+    public String getPlanName() 
+    {
+        return planName;
+    }
+
+    public void setPlanDescription(String planDescription) 
+    {
+        this.planDescription = planDescription;
+    }
+
+    public String getPlanDescription() 
+    {
+        return planDescription;
+    }
+
+    public void setPrice(BigDecimal price) 
+    {
+        this.price = price;
+    }
+
+    public BigDecimal getPrice() 
+    {
+        return price;
+    }
+
+    public void setDuration(Integer duration) 
+    {
+        this.duration = duration;
+    }
+
+    public Integer getDuration() 
+    {
+        return duration;
+    }
+
+    public void setLevel(Integer level) 
+    {
+        this.level = level;
+    }
+
+    public Integer getLevel() 
+    {
+        return level;
+    }
+
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return "PostPromotionPlan{" +
+                "planId=" + planId +
+                ", planName='" + planName + '\'' +
+                ", planDescription='" + planDescription + '\'' +
+                ", price=" + price +
+                ", duration=" + duration +
+                ", level=" + level +
+                ", status='" + status + '\'' +
+                '}';
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostReport.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostReport.java
new file mode 100644
index 0000000..d8f8f7f
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostReport.java
@@ -0,0 +1,124 @@
+package com.ruoyi.web.controller.post.domain;
+
+import java.util.Date;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 帖子举报对象 post_report
+ * 
+ * @author thunderhub
+ */
+public class PostReport extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 举报ID */
+    private Long reportId;
+
+    /** 帖子ID */
+    private Long postId;
+
+    /** 帖子标题 */
+    private String postTitle;
+
+    /** 举报用户ID */
+    private Long reportUserId;
+
+    /** 举报用户名 */
+    private String reportUserName;
+
+    /** 举报理由 */
+    private String reportReason;
+
+    /** 举报状态 0-待处理 1-已处理 2-已驳回 */
+    private String status;
+
+    /** 处理结果 */
+    private String handleResult;
+
+    /** 处理时间 */
+    private Date handleTime;
+
+    /** 处理人 */
+    private String handleBy;
+
+    public Long getReportId() {
+        return reportId;
+    }
+
+    public void setReportId(Long reportId) {
+        this.reportId = reportId;
+    }
+
+    public Long getPostId() {
+        return postId;
+    }
+
+    public void setPostId(Long postId) {
+        this.postId = postId;
+    }
+
+    public String getPostTitle() {
+        return postTitle;
+    }
+
+    public void setPostTitle(String postTitle) {
+        this.postTitle = postTitle;
+    }
+
+    public Long getReportUserId() {
+        return reportUserId;
+    }
+
+    public void setReportUserId(Long reportUserId) {
+        this.reportUserId = reportUserId;
+    }
+
+    public String getReportUserName() {
+        return reportUserName;
+    }
+
+    public void setReportUserName(String reportUserName) {
+        this.reportUserName = reportUserName;
+    }
+
+    public String getReportReason() {
+        return reportReason;
+    }
+
+    public void setReportReason(String reportReason) {
+        this.reportReason = reportReason;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getHandleResult() {
+        return handleResult;
+    }
+
+    public void setHandleResult(String handleResult) {
+        this.handleResult = handleResult;
+    }
+
+    public Date getHandleTime() {
+        return handleTime;
+    }
+
+    public void setHandleTime(Date handleTime) {
+        this.handleTime = handleTime;
+    }
+
+    public String getHandleBy() {
+        return handleBy;
+    }
+
+    public void setHandleBy(String handleBy) {
+        this.handleBy = handleBy;
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostTag.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostTag.java
new file mode 100644
index 0000000..e4a4b55
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostTag.java
@@ -0,0 +1,107 @@
+package com.ruoyi.web.controller.post.domain;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 帖子标签表 sys_post_tag
+ * 
+ * @author thunderhub
+ */
+public class PostTag extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 标签ID */
+    @Excel(name = "标签ID", cellType = ColumnType.NUMERIC)
+    private Long tagId;
+
+    /** 标签名称 */
+    @Excel(name = "标签名称")
+    private String tagName;
+
+    /** 标签颜色 */
+    @Excel(name = "标签颜色")
+    private String tagColor;
+
+    /** 帖子数量 */
+    @Excel(name = "帖子数量")
+    private Long postCount;
+
+    /** 状态（0正常 1停用） */
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    public Long getTagId()
+    {
+        return tagId;
+    }
+
+    public void setTagId(Long tagId)
+    {
+        this.tagId = tagId;
+    }
+
+    @NotBlank(message = "标签名称不能为空")
+    @Size(min = 0, max = 50, message = "标签名称长度不能超过50个字符")
+    public String getTagName()
+    {
+        return tagName;
+    }
+
+    public void setTagName(String tagName)
+    {
+        this.tagName = tagName;
+    }
+
+    public String getTagColor()
+    {
+        return tagColor;
+    }
+
+    public void setTagColor(String tagColor)
+    {
+        this.tagColor = tagColor;
+    }
+
+    public Long getPostCount()
+    {
+        return postCount;
+    }
+
+    public void setPostCount(Long postCount)
+    {
+        this.postCount = postCount;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("tagId", getTagId())
+            .append("tagName", getTagName())
+            .append("tagColor", getTagColor())
+            .append("postCount", getPostCount())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostTagRelation.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostTagRelation.java
new file mode 100644
index 0000000..78f4443
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/domain/PostTagRelation.java
@@ -0,0 +1,70 @@
+package com.ruoyi.web.controller.post.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 帖子标签关联表 sys_post_tag_relation
+ * 
+ * @author thunderhub
+ */
+public class PostTagRelation extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 关联ID */
+    private Long id;
+
+    /** 帖子ID */
+    @Excel(name = "帖子ID")
+    private Long postId;
+
+    /** 标签ID */
+    @Excel(name = "标签ID")
+    private Long tagId;
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getPostId()
+    {
+        return postId;
+    }
+
+    public void setPostId(Long postId)
+    {
+        this.postId = postId;
+    }
+
+    public Long getTagId()
+    {
+        return tagId;
+    }
+
+    public void setTagId(Long tagId)
+    {
+        this.tagId = tagId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("postId", getPostId())
+            .append("tagId", getTagId())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostCommentMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostCommentMapper.java
new file mode 100644
index 0000000..c5103a1
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostCommentMapper.java
@@ -0,0 +1,94 @@
+package com.ruoyi.web.controller.post.mapper;
+
+import java.util.List;
+
+import com.ruoyi.web.controller.post.domain.PostComment;
+
+/**
+ * 帖子评论Mapper接口
+ * 
+ * @author thunderhub
+ */
+public interface PostCommentMapper 
+{
+    /**
+     * 查询帖子评论信息
+     * 
+     * @param commentId 帖子评论ID
+     * @return 帖子评论信息
+     */
+    public PostComment selectPostCommentById(Long commentId);
+
+    /**
+     * 查询帖子评论列表
+     * 
+     * @param postComment 帖子评论信息
+     * @return 帖子评论集合
+     */
+    public List<PostComment> selectPostCommentList(PostComment postComment);
+
+    /**
+     * 根据帖子ID查询评论
+     * 
+     * @param postId 帖子ID
+     * @param limit 查询数量，0表示查询全部
+     * @return 帖子评论集合
+     */
+    public List<PostComment> selectCommentsByPostId(Long postId, int limit);
+
+    /**
+     * 根据父评论ID查询回复
+     * 
+     * @param parentId 父评论ID
+     * @return 帖子评论集合
+     */
+    public List<PostComment> selectCommentsByParentId(Long parentId);
+
+    /**
+     * 新增帖子评论
+     * 
+     * @param postComment 帖子评论信息
+     * @return 结果
+     */
+    public int insertPostComment(PostComment postComment);
+
+    /**
+     * 修改帖子评论
+     * 
+     * @param postComment 帖子评论信息
+     * @return 结果
+     */
+    public int updatePostComment(PostComment postComment);
+
+    /**
+     * 删除帖子评论
+     * 
+     * @param commentId 帖子评论ID
+     * @return 结果
+     */
+    public int deletePostCommentById(Long commentId);
+
+    /**
+     * 批量删除帖子评论
+     * 
+     * @param commentIds 需要删除的帖子评论ID
+     * @return 结果
+     */
+    public int deletePostCommentByIds(Long[] commentIds);
+
+    /**
+     * 根据帖子ID删除评论
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostCommentByPostId(Long postId);
+
+    /**
+     * 更新评论点赞数
+     * 
+     * @param postComment 评论信息
+     * @return 结果
+     */
+    public int updateCommentLikes(PostComment postComment);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostContentMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostContentMapper.java
new file mode 100644
index 0000000..6929295
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostContentMapper.java
@@ -0,0 +1,114 @@
+package com.ruoyi.web.controller.post.mapper;
+
+import java.util.List;
+
+import com.ruoyi.web.controller.post.domain.Post;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 帖子内容Mapper接口
+ * 
+ * @author thunderhub
+ */
+public interface PostContentMapper 
+{
+    /**
+     * 查询帖子信息
+     * 
+     * @param postId 帖子ID
+     * @return 帖子信息
+     */
+    public Post selectPostById(Long postId);
+
+    /**
+     * 查询帖子列表
+     * 
+     * @param post 帖子信息
+     * @return 帖子集合
+     */
+    public List<Post> selectPostList(Post post);
+
+    /**
+     * 查询作者的其他帖子
+     * 
+     * @param authorId 作者ID
+     * @param postId 当前帖子ID（排除）
+     * @param limit 查询数量
+     * @return 帖子集合
+     */
+    public List<Post> selectAuthorOtherPosts(@Param("authorId") Long authorId, @Param("postId") Long postId, @Param("limit") int limit);
+
+    /**
+     * 查询相似标签的帖子
+     * 
+     * @param tags 标签字符串
+     * @param postId 当前帖子ID（排除）
+     * @param limit 查询数量
+     * @return 帖子集合
+     */
+    public List<Post> selectSimilarTagsPosts(@Param("tags") String tags, @Param("postId") Long postId, @Param("limit") int limit);
+
+    /**
+     * 新增帖子
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    public int insertPost(Post post);
+
+    /**
+     * 修改帖子
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    public int updatePost(Post post);
+
+    /**
+     * 删除帖子
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostById(Long postId);
+
+    /**
+     * 批量删除帖子
+     * 
+     * @param postIds 需要删除的帖子ID
+     * @return 结果
+     */
+    public int deletePostByIds(Long[] postIds);
+
+    /**
+     * 更新帖子浏览量
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int updatePostViews(Long postId);
+
+    /**
+     * 更新帖子评论数
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    public int updatePostComments(Post post);
+
+    /**
+     * 更新帖子收藏数
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    public int updatePostFavorites(Post post);
+
+    /**
+     * 更新帖子点赞数
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    public int updatePostLikes(Post post);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostContentTagMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostContentTagMapper.java
new file mode 100644
index 0000000..5229c59
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostContentTagMapper.java
@@ -0,0 +1,112 @@
+package com.ruoyi.web.controller.post.mapper;
+
+import java.util.List;
+
+import com.ruoyi.web.controller.post.domain.PostTag;
+import com.ruoyi.web.controller.post.domain.PostTagRelation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 帖子标签Mapper接口
+ * 
+ * @author thunderhub
+ */
+@Mapper
+public interface PostContentTagMapper 
+{
+    /**
+     * 查询帖子标签信息
+     * 
+     * @param tagId 帖子标签ID
+     * @return 帖子标签信息
+     */
+    public PostTag selectPostTagById(Long tagId);
+
+    /**
+     * 查询帖子标签列表
+     * 
+     * @param postTag 帖子标签信息
+     * @return 帖子标签集合
+     */
+    public List<PostTag> selectPostTagList(PostTag postTag);
+
+    /**
+     * 根据帖子ID查询标签
+     * 
+     * @param postId 帖子ID
+     * @return 帖子标签集合
+     */
+    public List<PostTag> selectPostTagsByPostId(Long postId);
+
+    /**
+     * 新增帖子标签
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    public int insertPostTag(PostTag postTag);
+
+    /**
+     * 修改帖子标签
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    public int updatePostTag(PostTag postTag);
+
+    /**
+     * 删除帖子标签
+     * 
+     * @param tagId 帖子标签ID
+     * @return 结果
+     */
+    public int deletePostTagById(Long tagId);
+
+    /**
+     * 批量删除帖子标签
+     * 
+     * @param tagIds 需要删除的帖子标签ID
+     * @return 结果
+     */
+    public int deletePostTagByIds(Long[] tagIds);
+
+    /**
+     * 插入帖子标签关联
+     * 
+     * @param relation 关联信息
+     * @return 结果
+     */
+    public int insertPostTagRelation(PostTagRelation relation);
+
+    /**
+     * 批量插入帖子标签关联
+     * 
+     * @param list 关联列表
+     * @return 结果
+     */
+    public int batchInsertPostTagRelation(List<PostTagRelation> list);
+
+    /**
+     * 删除帖子标签关联
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostTagRelation(Long postId);
+
+    /**
+     * 更新标签帖子数量
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    public int updatePostTagCount(PostTag postTag);
+
+    /**
+     * 校验标签名称是否唯一
+     * 
+     * @param tagName 标签名称
+     * @return 结果
+     */
+    public PostTag checkTagNameUnique(String tagName);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostFavoriteMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostFavoriteMapper.java
new file mode 100644
index 0000000..96885e8
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostFavoriteMapper.java
@@ -0,0 +1,88 @@
+package com.ruoyi.web.controller.post.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+import com.ruoyi.web.controller.post.domain.PostFavorite;
+
+/**
+ * 帖子收藏Mapper接口
+ * 
+ * @author thunderhub
+ */
+public interface PostFavoriteMapper 
+{
+    /**
+     * 查询帖子收藏信息
+     * 
+     * @param favoriteId 帖子收藏ID
+     * @return 帖子收藏信息
+     */
+    public PostFavorite selectPostFavoriteById(Long favoriteId);
+
+    /**
+     * 查询帖子收藏列表
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 帖子收藏集合
+     */
+    public List<PostFavorite> selectPostFavoriteList(PostFavorite postFavorite);
+
+    /**
+     * 查询用户是否收藏帖子
+     * 
+     * @param postId 帖子ID
+     * @param userId 用户ID
+     * @return 收藏信息
+     */
+    public PostFavorite selectPostFavoriteByPostIdAndUserId(@Param("postId") Long postId, @Param("userId") Long userId);
+
+    /**
+     * 新增帖子收藏
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 结果
+     */
+    public int insertPostFavorite(PostFavorite postFavorite);
+
+    /**
+     * 修改帖子收藏
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 结果
+     */
+    public int updatePostFavorite(PostFavorite postFavorite);
+
+    /**
+     * 删除帖子收藏
+     * 
+     * @param favoriteId 帖子收藏ID
+     * @return 结果
+     */
+    public int deletePostFavoriteById(Long favoriteId);
+
+    /**
+     * 批量删除帖子收藏
+     * 
+     * @param favoriteIds 需要删除的帖子收藏ID
+     * @return 结果
+     */
+    public int deletePostFavoriteByIds(Long[] favoriteIds);
+
+    /**
+     * 取消收藏帖子
+     * 
+     * @param postId 帖子ID
+     * @param userId 用户ID
+     * @return 结果
+     */
+    public int cancelPostFavorite(@Param("postId") Long postId, @Param("userId") Long userId);
+
+    /**
+     * 根据帖子ID删除收藏
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostFavoriteByPostId(Long postId);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostPaymentMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostPaymentMapper.java
new file mode 100644
index 0000000..538338c
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostPaymentMapper.java
@@ -0,0 +1,76 @@
+package com.ruoyi.web.controller.post.mapper;
+
+import java.util.List;
+import com.ruoyi.web.controller.post.domain.PostPayment;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 帖子支付记录Mapper接口
+ * 
+ * @author thunderhub
+ */
+public interface PostPaymentMapper 
+{
+    /**
+     * 查询帖子支付记录
+     * 
+     * @param paymentId 帖子支付记录ID
+     * @return 帖子支付记录
+     */
+    public PostPayment selectPostPaymentById(Long paymentId);
+
+    /**
+     * 查询帖子支付记录列表
+     * 
+     * @param postPayment 帖子支付记录
+     * @return 帖子支付记录集合
+     */
+    public List<PostPayment> selectPostPaymentList(PostPayment postPayment);
+
+    /**
+     * 根据帖子ID查询最新的支付记录
+     * 
+     * @param postId 帖子ID
+     * @return 支付记录
+     */
+    public PostPayment selectLatestPaymentByPostId(Long postId);
+
+    /**
+     * 查询过期的推广支付记录
+     * 
+     * @return 过期的支付记录列表
+     */
+    public List<PostPayment> selectExpiredPromotionPayments();
+
+    /**
+     * 新增帖子支付记录
+     * 
+     * @param postPayment 帖子支付记录
+     * @return 结果
+     */
+    public int insertPostPayment(PostPayment postPayment);
+
+    /**
+     * 修改帖子支付记录
+     * 
+     * @param postPayment 帖子支付记录
+     * @return 结果
+     */
+    public int updatePostPayment(PostPayment postPayment);
+
+    /**
+     * 删除帖子支付记录
+     * 
+     * @param paymentId 帖子支付记录ID
+     * @return 结果
+     */
+    public int deletePostPaymentById(Long paymentId);
+
+    /**
+     * 批量删除帖子支付记录
+     * 
+     * @param paymentIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deletePostPaymentByIds(Long[] paymentIds);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostPromotionPlanMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostPromotionPlanMapper.java
new file mode 100644
index 0000000..03f0138
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostPromotionPlanMapper.java
@@ -0,0 +1,60 @@
+package com.ruoyi.web.controller.post.mapper;
+
+import java.util.List;
+import com.ruoyi.web.controller.post.domain.PostPromotionPlan;
+
+/**
+ * 帖子推广计划Mapper接口
+ * 
+ * @author thunderhub
+ */
+public interface PostPromotionPlanMapper 
+{
+    /**
+     * 查询帖子推广计划
+     * 
+     * @param planId 帖子推广计划ID
+     * @return 帖子推广计划
+     */
+    public PostPromotionPlan selectPostPromotionPlanById(Long planId);
+
+    /**
+     * 查询帖子推广计划列表
+     * 
+     * @param postPromotionPlan 帖子推广计划
+     * @return 帖子推广计划集合
+     */
+    public List<PostPromotionPlan> selectPostPromotionPlanList(PostPromotionPlan postPromotionPlan);
+
+    /**
+     * 新增帖子推广计划
+     * 
+     * @param postPromotionPlan 帖子推广计划
+     * @return 结果
+     */
+    public int insertPostPromotionPlan(PostPromotionPlan postPromotionPlan);
+
+    /**
+     * 修改帖子推广计划
+     * 
+     * @param postPromotionPlan 帖子推广计划
+     * @return 结果
+     */
+    public int updatePostPromotionPlan(PostPromotionPlan postPromotionPlan);
+
+    /**
+     * 删除帖子推广计划
+     * 
+     * @param planId 帖子推广计划ID
+     * @return 结果
+     */
+    public int deletePostPromotionPlanById(Long planId);
+
+    /**
+     * 批量删除帖子推广计划
+     * 
+     * @param planIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deletePostPromotionPlanByIds(Long[] planIds);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostReportMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostReportMapper.java
new file mode 100644
index 0000000..0941836
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/mapper/PostReportMapper.java
@@ -0,0 +1,60 @@
+package com.ruoyi.web.controller.post.mapper;
+
+import java.util.List;
+import com.ruoyi.web.controller.post.domain.PostReport;
+
+/**
+ * 帖子举报Mapper接口
+ * 
+ * @author thunderhub
+ */
+public interface PostReportMapper 
+{
+    /**
+     * 查询帖子举报
+     * 
+     * @param reportId 帖子举报ID
+     * @return 帖子举报
+     */
+    public PostReport selectPostReportById(Long reportId);
+
+    /**
+     * 查询帖子举报列表
+     * 
+     * @param postReport 帖子举报
+     * @return 帖子举报集合
+     */
+    public List<PostReport> selectPostReportList(PostReport postReport);
+
+    /**
+     * 新增帖子举报
+     * 
+     * @param postReport 帖子举报
+     * @return 结果
+     */
+    public int insertPostReport(PostReport postReport);
+
+    /**
+     * 修改帖子举报
+     * 
+     * @param postReport 帖子举报
+     * @return 结果
+     */
+    public int updatePostReport(PostReport postReport);
+
+    /**
+     * 删除帖子举报
+     * 
+     * @param reportId 帖子举报ID
+     * @return 结果
+     */
+    public int deletePostReportById(Long reportId);
+
+    /**
+     * 批量删除帖子举报
+     * 
+     * @param reportIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deletePostReportByIds(Long[] reportIds);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostCommentService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostCommentService.java
new file mode 100644
index 0000000..3ab45cf
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostCommentService.java
@@ -0,0 +1,95 @@
+package com.ruoyi.web.controller.post.service;
+
+import java.util.List;
+
+import com.ruoyi.web.controller.post.domain.PostComment;
+
+/**
+ * 帖子评论 服务层
+ * 
+ * @author thunderhub
+ */
+public interface IPostCommentService 
+{
+    /**
+     * 查询帖子评论信息
+     * 
+     * @param commentId 帖子评论ID
+     * @return 帖子评论信息
+     */
+    public PostComment selectPostCommentById(Long commentId);
+
+    /**
+     * 查询帖子评论列表
+     * 
+     * @param postComment 帖子评论信息
+     * @return 帖子评论集合
+     */
+    public List<PostComment> selectPostCommentList(PostComment postComment);
+
+    /**
+     * 根据帖子ID查询评论
+     * 
+     * @param postId 帖子ID
+     * @param limit 查询数量，0表示查询全部
+     * @return 帖子评论集合
+     */
+    public List<PostComment> selectCommentsByPostId(Long postId, int limit);
+
+    /**
+     * 根据父评论ID查询回复
+     * 
+     * @param parentId 父评论ID
+     * @return 帖子评论集合
+     */
+    public List<PostComment> selectCommentsByParentId(Long parentId);
+
+    /**
+     * 新增帖子评论
+     * 
+     * @param postComment 帖子评论信息
+     * @return 结果
+     */
+    public int insertPostComment(PostComment postComment);
+
+    /**
+     * 修改帖子评论
+     * 
+     * @param postComment 帖子评论信息
+     * @return 结果
+     */
+    public int updatePostComment(PostComment postComment);
+
+    /**
+     * 删除帖子评论信息
+     * 
+     * @param commentId 帖子评论ID
+     * @return 结果
+     */
+    public int deletePostCommentById(Long commentId);
+
+    /**
+     * 批量删除帖子评论信息
+     * 
+     * @param commentIds 需要删除的帖子评论ID
+     * @return 结果
+     */
+    public int deletePostCommentByIds(Long[] commentIds);
+
+    /**
+     * 根据帖子ID删除评论
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostCommentByPostId(Long postId);
+
+    /**
+     * 更新评论点赞数
+     * 
+     * @param commentId 评论ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    public int updateCommentLikes(Long commentId, int count);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostFavoriteService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostFavoriteService.java
new file mode 100644
index 0000000..50418fb
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostFavoriteService.java
@@ -0,0 +1,95 @@
+package com.ruoyi.web.controller.post.service;
+
+import java.util.List;
+
+import com.ruoyi.web.controller.post.domain.PostFavorite;
+
+/**
+ * 帖子收藏 服务层
+ * 
+ * @author thunderhub
+ */
+public interface IPostFavoriteService 
+{
+    /**
+     * 查询帖子收藏信息
+     * 
+     * @param favoriteId 帖子收藏ID
+     * @return 帖子收藏信息
+     */
+    public PostFavorite selectPostFavoriteById(Long favoriteId);
+
+    /**
+     * 查询帖子收藏列表
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 帖子收藏集合
+     */
+    public List<PostFavorite> selectPostFavoriteList(PostFavorite postFavorite);
+
+    /**
+     * 查询用户是否收藏帖子
+     * 
+     * @param postId 帖子ID
+     * @param userId 用户ID
+     * @return 收藏信息
+     */
+    public PostFavorite selectPostFavoriteByPostIdAndUserId(Long postId, Long userId);
+
+    /**
+     * 新增帖子收藏
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 结果
+     */
+    public int insertPostFavorite(PostFavorite postFavorite);
+
+    /**
+     * 修改帖子收藏
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 结果
+     */
+    public int updatePostFavorite(PostFavorite postFavorite);
+
+    /**
+     * 删除帖子收藏信息
+     * 
+     * @param favoriteId 帖子收藏ID
+     * @return 结果
+     */
+    public int deletePostFavoriteById(Long favoriteId);
+
+    /**
+     * 批量删除帖子收藏信息
+     * 
+     * @param favoriteIds 需要删除的帖子收藏ID
+     * @return 结果
+     */
+    public int deletePostFavoriteByIds(Long[] favoriteIds);
+
+    /**
+     * 取消收藏帖子
+     * 
+     * @param postId 帖子ID
+     * @param userId 用户ID
+     * @return 结果
+     */
+    public int cancelPostFavorite(Long postId, Long userId);
+
+    /**
+     * 根据帖子ID删除收藏
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostFavoriteByPostId(Long postId);
+
+    /**
+     * 根据用户ID查询收藏列表
+     * 
+     * @param userId 用户ID
+     * @return 收藏列表
+     */
+    public List<PostFavorite> selectPostFavoritesByUserId(Long userId);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostService.java
new file mode 100644
index 0000000..55ce02f
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostService.java
@@ -0,0 +1,142 @@
+package com.ruoyi.web.controller.post.service;
+
+import java.util.List;
+
+import com.ruoyi.web.controller.post.domain.Post;
+
+/**
+ * 帖子 服务层
+ * 
+ * @author thunderhub
+ */
+public interface IPostService 
+{
+    /**
+     * 查询帖子信息
+     * 
+     * @param postId 帖子ID
+     * @return 帖子信息
+     */
+    public Post selectPostById(Long postId);
+
+    /**
+     * 查询帖子列表
+     * 
+     * @param post 帖子信息
+     * @return 帖子集合
+     */
+    public List<Post> selectPostList(Post post);
+
+    /**
+     * 查询作者的其他帖子
+     * 
+     * @param authorId 作者ID
+     * @param postId 当前帖子ID（排除）
+     * @param limit 查询数量
+     * @return 帖子集合
+     */
+    public List<Post> selectAuthorOtherPosts(Long authorId, Long postId, int limit);
+
+    /**
+     * 查询相似标签的帖子
+     * 
+     * @param tags 标签列表
+     * @param postId 当前帖子ID（排除）
+     * @param limit 查询数量
+     * @return 帖子集合
+     */
+    public List<Post> selectSimilarTagsPosts(String tags, Long postId, int limit);
+
+    /**
+     * 获取帖子推荐列表（包含作者其他帖子和相似标签帖子）
+     * 
+     * @param authorId 作者ID
+     * @param tags 标签列表
+     * @param postId 当前帖子ID（排除）
+     * @param maxCount 最大推荐数量
+     * @return 推荐帖子集合
+     */
+    public List<Post> getRecommendedPosts(Long authorId, String tags, Long postId, int maxCount);
+
+    /**
+     * 新增帖子
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    public int insertPost(Post post);
+
+    /**
+     * 修改帖子
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    public int updatePost(Post post);
+
+    /**
+     * 删除帖子信息
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostById(Long postId);
+
+    /**
+     * 批量删除帖子信息
+     * 
+     * @param postIds 需要删除的帖子ID
+     * @return 结果
+     */
+    public int deletePostByIds(Long[] postIds);
+
+    /**
+     * 更新帖子浏览量
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int updatePostViews(Long postId);
+
+    /**
+     * 更新帖子评论数
+     * 
+     * @param postId 帖子ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    public int updatePostComments(Long postId, int count);
+
+    /**
+     * 更新帖子收藏数
+     * 
+     * @param postId 帖子ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    public int updatePostFavorites(Long postId, int count);
+
+    /**
+     * 更新帖子点赞数
+     * 
+     * @param postId 帖子ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    public int updatePostLikes(Long postId, int count);
+
+    /**
+     * 检查并处理过期的推广帖子
+     * 
+     * @return 处理的帖子数量
+     */
+    public int checkAndHandleExpiredPromotions();
+
+    /**
+     * 取消帖子推广
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int cancelPostPromotion(Long postId);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostTagService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostTagService.java
new file mode 100644
index 0000000..1ec82eb
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/IPostTagService.java
@@ -0,0 +1,103 @@
+package com.ruoyi.web.controller.post.service;
+
+import java.util.List;
+
+import com.ruoyi.web.controller.post.domain.PostTag;
+
+/**
+ * 帖子标签 服务层
+ * 
+ * @author thunderhub
+ */
+public interface IPostTagService 
+{
+    /**
+     * 查询帖子标签信息
+     * 
+     * @param tagId 帖子标签ID
+     * @return 帖子标签信息
+     */
+    public PostTag selectPostTagById(Long tagId);
+
+    /**
+     * 查询帖子标签列表
+     * 
+     * @param postTag 帖子标签信息
+     * @return 帖子标签集合
+     */
+    public List<PostTag> selectPostTagList(PostTag postTag);
+
+    /**
+     * 根据帖子ID查询标签
+     * 
+     * @param postId 帖子ID
+     * @return 帖子标签集合
+     */
+    public List<PostTag> selectPostTagsByPostId(Long postId);
+
+    /**
+     * 新增帖子标签
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    public int insertPostTag(PostTag postTag);
+
+    /**
+     * 修改帖子标签
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    public int updatePostTag(PostTag postTag);
+
+    /**
+     * 删除帖子标签信息
+     * 
+     * @param tagId 帖子标签ID
+     * @return 结果
+     */
+    public int deletePostTagById(Long tagId);
+
+    /**
+     * 批量删除帖子标签信息
+     * 
+     * @param tagIds 需要删除的帖子标签ID
+     * @return 结果
+     */
+    public int deletePostTagByIds(Long[] tagIds);
+
+    /**
+     * 批量插入帖子标签关联
+     * 
+     * @param postId 帖子ID
+     * @param tagIds 标签ID数组
+     * @return 结果
+     */
+    public int batchInsertPostTagRelation(Long postId, Long[] tagIds);
+
+    /**
+     * 删除帖子标签关联
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostTagRelation(Long postId);
+
+    /**
+     * 更新标签帖子数量
+     * 
+     * @param tagId 标签ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    public int updatePostTagCount(Long tagId, int count);
+
+    /**
+     * 检查标签名称是否唯一
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    public boolean checkTagNameUnique(PostTag postTag);
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostCommentServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostCommentServiceImpl.java
new file mode 100644
index 0000000..425d61f
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostCommentServiceImpl.java
@@ -0,0 +1,146 @@
+package com.ruoyi.web.controller.post.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ruoyi.web.controller.post.domain.PostComment;
+import com.ruoyi.web.controller.post.mapper.PostCommentMapper;
+import com.ruoyi.web.controller.post.service.IPostCommentService;
+
+/**
+ * 帖子评论 服务层实现
+ * 
+ * @author thunderhub
+ */
+@Service
+public class PostCommentServiceImpl implements IPostCommentService
+{
+    @Autowired
+    private PostCommentMapper postCommentMapper;
+
+    /**
+     * 查询帖子评论信息
+     * 
+     * @param commentId 帖子评论ID
+     * @return 帖子评论信息
+     */
+    @Override
+    public PostComment selectPostCommentById(Long commentId)
+    {
+        return postCommentMapper.selectPostCommentById(commentId);
+    }
+
+    /**
+     * 查询帖子评论列表
+     * 
+     * @param postComment 帖子评论信息
+     * @return 帖子评论集合
+     */
+    @Override
+    public List<PostComment> selectPostCommentList(PostComment postComment)
+    {
+        return postCommentMapper.selectPostCommentList(postComment);
+    }
+
+    /**
+     * 根据帖子ID查询评论
+     * 
+     * @param postId 帖子ID
+     * @param limit 查询数量，0表示查询全部
+     * @return 帖子评论集合
+     */
+    @Override
+    public List<PostComment> selectCommentsByPostId(Long postId, int limit)
+    {
+        return postCommentMapper.selectCommentsByPostId(postId, limit);
+    }
+
+    /**
+     * 根据父评论ID查询回复
+     * 
+     * @param parentId 父评论ID
+     * @return 帖子评论集合
+     */
+    @Override
+    public List<PostComment> selectCommentsByParentId(Long parentId)
+    {
+        return postCommentMapper.selectCommentsByParentId(parentId);
+    }
+
+    /**
+     * 新增帖子评论
+     * 
+     * @param postComment 帖子评论信息
+     * @return 结果
+     */
+    @Override
+    public int insertPostComment(PostComment postComment)
+    {
+        return postCommentMapper.insertPostComment(postComment);
+    }
+
+    /**
+     * 修改帖子评论
+     * 
+     * @param postComment 帖子评论信息
+     * @return 结果
+     */
+    @Override
+    public int updatePostComment(PostComment postComment)
+    {
+        return postCommentMapper.updatePostComment(postComment);
+    }
+
+    /**
+     * 删除帖子评论信息
+     * 
+     * @param commentId 帖子评论ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostCommentById(Long commentId)
+    {
+        return postCommentMapper.deletePostCommentById(commentId);
+    }
+
+    /**
+     * 批量删除帖子评论信息
+     * 
+     * @param commentIds 需要删除的帖子评论ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostCommentByIds(Long[] commentIds)
+    {
+        return postCommentMapper.deletePostCommentByIds(commentIds);
+    }
+
+    /**
+     * 根据帖子ID删除评论
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostCommentByPostId(Long postId)
+    {
+        return postCommentMapper.deletePostCommentByPostId(postId);
+    }
+
+    /**
+     * 更新评论点赞数
+     * 
+     * @param commentId 评论ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    @Override
+    public int updateCommentLikes(Long commentId, int count)
+    {
+        PostComment comment = new PostComment();
+        comment.setCommentId(commentId);
+        comment.setLikes((long) count);
+        return postCommentMapper.updateCommentLikes(comment);
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostFavoriteServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostFavoriteServiceImpl.java
new file mode 100644
index 0000000..9249a94
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostFavoriteServiceImpl.java
@@ -0,0 +1,145 @@
+package com.ruoyi.web.controller.post.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ruoyi.web.controller.post.domain.PostFavorite;
+import com.ruoyi.web.controller.post.mapper.PostFavoriteMapper;
+import com.ruoyi.web.controller.post.service.IPostFavoriteService;
+
+/**
+ * 帖子收藏 服务层实现
+ * 
+ * @author thunderhub
+ */
+@Service
+public class PostFavoriteServiceImpl implements IPostFavoriteService
+{
+    @Autowired
+    private PostFavoriteMapper postFavoriteMapper;
+
+    /**
+     * 查询帖子收藏信息
+     * 
+     * @param favoriteId 帖子收藏ID
+     * @return 帖子收藏信息
+     */
+    @Override
+    public PostFavorite selectPostFavoriteById(Long favoriteId)
+    {
+        return postFavoriteMapper.selectPostFavoriteById(favoriteId);
+    }
+
+    /**
+     * 查询帖子收藏列表
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 帖子收藏集合
+     */
+    @Override
+    public List<PostFavorite> selectPostFavoriteList(PostFavorite postFavorite)
+    {
+        return postFavoriteMapper.selectPostFavoriteList(postFavorite);
+    }
+
+    /**
+     * 查询用户是否收藏帖子
+     * 
+     * @param postId 帖子ID
+     * @param userId 用户ID
+     * @return 收藏信息
+     */
+    @Override
+    public PostFavorite selectPostFavoriteByPostIdAndUserId(Long postId, Long userId)
+    {
+        return postFavoriteMapper.selectPostFavoriteByPostIdAndUserId(postId, userId);
+    }
+
+    /**
+     * 新增帖子收藏
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 结果
+     */
+    @Override
+    public int insertPostFavorite(PostFavorite postFavorite)
+    {
+        return postFavoriteMapper.insertPostFavorite(postFavorite);
+    }
+
+    /**
+     * 修改帖子收藏
+     * 
+     * @param postFavorite 帖子收藏信息
+     * @return 结果
+     */
+    @Override
+    public int updatePostFavorite(PostFavorite postFavorite)
+    {
+        return postFavoriteMapper.updatePostFavorite(postFavorite);
+    }
+
+    /**
+     * 删除帖子收藏信息
+     * 
+     * @param favoriteId 帖子收藏ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostFavoriteById(Long favoriteId)
+    {
+        return postFavoriteMapper.deletePostFavoriteById(favoriteId);
+    }
+
+    /**
+     * 批量删除帖子收藏信息
+     * 
+     * @param favoriteIds 需要删除的帖子收藏ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostFavoriteByIds(Long[] favoriteIds)
+    {
+        return postFavoriteMapper.deletePostFavoriteByIds(favoriteIds);
+    }
+
+    /**
+     * 取消收藏帖子
+     * 
+     * @param postId 帖子ID
+     * @param userId 用户ID
+     * @return 结果
+     */
+    @Override
+    public int cancelPostFavorite(Long postId, Long userId)
+    {
+        return postFavoriteMapper.cancelPostFavorite(postId, userId);
+    }
+
+    /**
+     * 根据帖子ID删除收藏
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostFavoriteByPostId(Long postId)
+    {
+        return postFavoriteMapper.deletePostFavoriteByPostId(postId);
+    }
+
+    /**
+     * 根据用户ID查询收藏列表
+     * 
+     * @param userId 用户ID
+     * @return 收藏列表
+     */
+    @Override
+    public List<PostFavorite> selectPostFavoritesByUserId(Long userId)
+    {
+        PostFavorite postFavorite = new PostFavorite();
+        postFavorite.setUserId(userId);
+        return postFavoriteMapper.selectPostFavoriteList(postFavorite);
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostServiceImpl.java
new file mode 100644
index 0000000..c619f96
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostServiceImpl.java
@@ -0,0 +1,311 @@
+package com.ruoyi.web.controller.post.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.web.controller.post.mapper.PostContentMapper;
+import com.ruoyi.web.controller.post.mapper.PostPaymentMapper;
+import com.ruoyi.web.controller.post.mapper.PostPromotionPlanMapper;
+import com.ruoyi.web.controller.post.domain.Post;
+import com.ruoyi.web.controller.post.domain.PostPayment;
+import com.ruoyi.web.controller.post.domain.PostPromotionPlan;
+import com.ruoyi.web.controller.post.service.IPostService;
+
+import java.util.Date;
+import java.util.Calendar;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
+
+/**
+ * 帖子Service业务层处理
+ * 
+ * @author thunderhub
+ */
+@Service
+public class PostServiceImpl implements IPostService
+{
+    @Autowired
+    private PostContentMapper postMapper;
+
+    @Autowired
+    private PostPaymentMapper postPaymentMapper;
+
+    @Autowired
+    private PostPromotionPlanMapper postPromotionPlanMapper;
+
+    /**
+     * 查询帖子信息
+     * 
+     * @param postId 帖子ID
+     * @return 帖子信息
+     */
+    @Override
+    public Post selectPostById(Long postId)
+    {
+        return postMapper.selectPostById(postId);
+    }
+
+    /**
+     * 查询帖子列表
+     * 
+     * @param post 帖子信息
+     * @return 帖子集合
+     */
+    @Override
+    public List<Post> selectPostList(Post post)
+    {
+        return postMapper.selectPostList(post);
+    }
+
+    /**
+     * 查询作者的其他帖子
+     * 
+     * @param authorId 作者ID
+     * @param postId 当前帖子ID（排除）
+     * @param limit 查询数量
+     * @return 帖子集合
+     */
+    @Override
+    public List<Post> selectAuthorOtherPosts(Long authorId, Long postId, int limit)
+    {
+        return postMapper.selectAuthorOtherPosts(authorId, postId, limit);
+    }
+
+    /**
+     * 查询相似标签的帖子
+     * 
+     * @param tags 标签列表
+     * @param postId 当前帖子ID（排除）
+     * @param limit 查询数量
+     * @return 帖子集合
+     */
+    @Override
+    public List<Post> selectSimilarTagsPosts(String tags, Long postId, int limit)
+    {
+        if (tags == null || tags.trim().isEmpty()) {
+            return List.of();
+        }
+        
+        return postMapper.selectSimilarTagsPosts(tags, postId, limit);
+    }
+
+    /**
+     * 新增帖子
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    @Override
+    public int insertPost(Post post)
+    {
+        return postMapper.insertPost(post);
+    }
+
+    /**
+     * 修改帖子
+     * 
+     * @param post 帖子信息
+     * @return 结果
+     */
+    @Override
+    public int updatePost(Post post)
+    {
+        return postMapper.updatePost(post);
+    }
+
+    /**
+     * 删除帖子信息
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostById(Long postId)
+    {
+        return postMapper.deletePostById(postId);
+    }
+
+    /**
+     * 批量删除帖子信息
+     * 
+     * @param postIds 需要删除的帖子ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostByIds(Long[] postIds)
+    {
+        return postMapper.deletePostByIds(postIds);
+    }
+
+    /**
+     * 更新帖子浏览量
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    @Override
+    public int updatePostViews(Long postId)
+    {
+        return postMapper.updatePostViews(postId);
+    }
+
+    /**
+     * 更新帖子评论数
+     * 
+     * @param postId 帖子ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    @Override
+    public int updatePostComments(Long postId, int count)
+    {
+        Post post = new Post();
+        post.setPostId(postId);
+        post.setComments((long) count);
+        return postMapper.updatePostComments(post);
+    }
+
+    /**
+     * 更新帖子收藏数
+     * 
+     * @param postId 帖子ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    @Override
+    public int updatePostFavorites(Long postId, int count)
+    {
+        Post post = new Post();
+        post.setPostId(postId);
+        post.setFavorites((long) count);
+        return postMapper.updatePostFavorites(post);
+    }
+
+    /**
+     * 更新帖子点赞数
+     * 
+     * @param postId 帖子ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    @Override
+    public int updatePostLikes(Long postId, int count)
+    {
+        Post post = new Post();
+        post.setPostId(postId);
+        post.setLikes((long) count);
+        return postMapper.updatePostLikes(post);
+    }
+
+    /**
+     * 检查并处理过期的推广帖子
+     * 
+     * @return 处理的帖子数量
+     */
+    @Override
+    public int checkAndHandleExpiredPromotions()
+    {
+        Logger logger = LoggerFactory.getLogger(PostServiceImpl.class);
+        int processedCount = 0;
+        
+        try {
+            // 查询所有过期的推广支付记录
+            List<PostPayment> expiredPayments = postPaymentMapper.selectExpiredPromotionPayments();
+            
+            for (PostPayment payment : expiredPayments) {
+                // 获取推广计划信息
+                PostPromotionPlan plan = postPromotionPlanMapper.selectPostPromotionPlanById(payment.getPlanId());
+                if (plan == null) {
+                    continue;
+                }
+                
+                // 计算推广到期时间
+                Calendar cal = Calendar.getInstance();
+                cal.setTime(payment.getPaymentTime());
+                cal.add(Calendar.DAY_OF_MONTH, plan.getDuration());
+                Date expireTime = cal.getTime();
+                
+                // 检查是否已过期
+                if (new Date().after(expireTime)) {
+                    // 取消帖子推广
+                    int result = cancelPostPromotion(payment.getPostId());
+                    if (result > 0) {
+                        processedCount++;
+                        logger.info("帖子ID: {} 的推广已过期，已自动取消", payment.getPostId());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            logger.error("检查推广时效性时发生错误", e);
+        }
+        
+        return processedCount;
+    }
+
+    /**
+     * 取消帖子推广
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    @Override
+    public int cancelPostPromotion(Long postId)
+    {
+        Post post = new Post();
+        post.setPostId(postId);
+        post.setPromotionPlanId(null);
+        return postMapper.updatePost(post);
+    }
+
+    /**
+     * 获取帖子推荐列表（包含作者其他帖子和相似标签帖子）
+     * 
+     * @param authorId 作者ID
+     * @param tags 标签列表
+     * @param postId 当前帖子ID（排除）
+     * @param maxCount 最大推荐数量
+     * @return 推荐帖子集合
+     */
+    @Override
+    public List<Post> getRecommendedPosts(Long authorId, String tags, Long postId, int maxCount)
+    {
+        List<Post> recommendedPosts = new ArrayList<>();
+        
+        // 1. 获取作者的其他帖子（最多5个）
+        List<Post> authorPosts = selectAuthorOtherPosts(authorId, postId, 5);
+        recommendedPosts.addAll(authorPosts);
+        
+        // 2. 如果作者帖子不足maxCount个，则补充相似标签的帖子
+        if (recommendedPosts.size() < maxCount && tags != null && !tags.trim().isEmpty()) {
+            int remainingCount = maxCount - recommendedPosts.size();
+            List<Post> similarPosts = selectSimilarTagsPosts(tags, postId, remainingCount + 5); // 多查询一些以便去重
+            
+            // 去重：排除已经在推荐列表中的帖子
+            for (Post similarPost : similarPosts) {
+                if (recommendedPosts.size() >= maxCount) {
+                    break;
+                }
+                
+                boolean isDuplicate = false;
+                for (Post existingPost : recommendedPosts) {
+                    if (existingPost.getPostId().equals(similarPost.getPostId())) {
+                        isDuplicate = true;
+                        break;
+                    }
+                }
+                
+                if (!isDuplicate) {
+                    recommendedPosts.add(similarPost);
+                }
+            }
+        }
+        
+        // 3. 限制最大数量
+        if (recommendedPosts.size() > maxCount) {
+            recommendedPosts = recommendedPosts.subList(0, maxCount);
+        }
+        
+        return recommendedPosts;
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostTagServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostTagServiceImpl.java
new file mode 100644
index 0000000..3be6dcc
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/service/impl/PostTagServiceImpl.java
@@ -0,0 +1,176 @@
+package com.ruoyi.web.controller.post.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ruoyi.web.controller.post.domain.PostTag;
+import com.ruoyi.web.controller.post.domain.PostTagRelation;
+import com.ruoyi.web.controller.post.mapper.PostContentTagMapper;
+import com.ruoyi.web.controller.post.service.IPostTagService;
+
+/**
+ * 帖子标签 服务层实现
+ * 
+ * @author thunderhub
+ */
+@Service
+public class PostTagServiceImpl implements IPostTagService
+{
+    @Autowired
+    private PostContentTagMapper postContentTagMapper;
+
+    /**
+     * 查询帖子标签信息
+     * 
+     * @param tagId 帖子标签ID
+     * @return 帖子标签信息
+     */
+    @Override
+    public PostTag selectPostTagById(Long tagId)
+    {
+        return postContentTagMapper.selectPostTagById(tagId);
+    }
+
+    /**
+     * 查询帖子标签列表
+     * 
+     * @param postTag 帖子标签信息
+     * @return 帖子标签集合
+     */
+    @Override
+    public List<PostTag> selectPostTagList(PostTag postTag)
+    {
+        return postContentTagMapper.selectPostTagList(postTag);
+    }
+
+    /**
+     * 根据帖子ID查询标签
+     * 
+     * @param postId 帖子ID
+     * @return 帖子标签集合
+     */
+    @Override
+    public List<PostTag> selectPostTagsByPostId(Long postId)
+    {
+        return postContentTagMapper.selectPostTagsByPostId(postId);
+    }
+
+    /**
+     * 新增帖子标签
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    @Override
+    public int insertPostTag(PostTag postTag)
+    {
+        return postContentTagMapper.insertPostTag(postTag);
+    }
+
+    /**
+     * 修改帖子标签
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    @Override
+    public int updatePostTag(PostTag postTag)
+    {
+        return postContentTagMapper.updatePostTag(postTag);
+    }
+
+    /**
+     * 删除帖子标签信息
+     * 
+     * @param tagId 帖子标签ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostTagById(Long tagId)
+    {
+        return postContentTagMapper.deletePostTagById(tagId);
+    }
+
+    /**
+     * 批量删除帖子标签信息
+     * 
+     * @param tagIds 需要删除的帖子标签ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostTagByIds(Long[] tagIds)
+    {
+        return postContentTagMapper.deletePostTagByIds(tagIds);
+    }
+
+    /**
+     * 批量插入帖子标签关联
+     * 
+     * @param postId 帖子ID
+     * @param tagIds 标签ID数组
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int batchInsertPostTagRelation(Long postId, Long[] tagIds)
+    {
+        List<PostTagRelation> list = new ArrayList<PostTagRelation>();
+        for (Long tagId : tagIds)
+        {
+            PostTagRelation relation = new PostTagRelation();
+            relation.setPostId(postId);
+            relation.setTagId(tagId);
+            list.add(relation);
+        }
+        return postContentTagMapper.batchInsertPostTagRelation(list);
+    }
+
+    /**
+     * 删除帖子标签关联
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostTagRelation(Long postId)
+    {
+        return postContentTagMapper.deletePostTagRelation(postId);
+    }
+
+    /**
+     * 更新标签帖子数量
+     * 
+     * @param tagId 标签ID
+     * @param count 增加/减少的数量
+     * @return 结果
+     */
+    @Override
+    public int updatePostTagCount(Long tagId, int count)
+    {
+        PostTag postTag = new PostTag();
+        postTag.setTagId(tagId);
+        postTag.setPostCount((long) count);
+        return postContentTagMapper.updatePostTagCount(postTag);
+    }
+
+    /**
+     * 检查标签名称是否唯一
+     * 
+     * @param postTag 帖子标签信息
+     * @return 结果
+     */
+    @Override
+    public boolean checkTagNameUnique(PostTag postTag)
+    {
+        Long tagId = postTag.getTagId() == null ? -1L : postTag.getTagId();
+        PostTag info = postContentTagMapper.checkTagNameUnique(postTag.getTagName());
+        if (info != null && info.getTagId().longValue() != tagId.longValue())
+        {
+            return false;
+        }
+        return true;
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/task/PromotionExpiryTask.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/task/PromotionExpiryTask.java
new file mode 100644
index 0000000..39855e7
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/post/task/PromotionExpiryTask.java
@@ -0,0 +1,49 @@
+package com.ruoyi.web.controller.post.task;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import com.ruoyi.web.controller.post.service.IPostService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 推广时效性检查定时任务
+ * 
+ * @author thunderhub
+ */
+@Component
+public class PromotionExpiryTask
+{
+    private static final Logger logger = LoggerFactory.getLogger(PromotionExpiryTask.class);
+
+    @Autowired
+    private IPostService postService;
+
+    /**
+     * 检查推广时效性
+     * 每小时执行一次
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void checkPromotionExpiry()
+    {
+        logger.info("开始检查推广时效性...");
+        
+        try {
+            int processedCount = postService.checkAndHandleExpiredPromotions();
+            logger.info("推广时效性检查完成，处理了 {} 个过期推广", processedCount);
+        } catch (Exception e) {
+            logger.error("推广时效性检查失败", e);
+        }
+    }
+
+    /**
+     * 手动触发推广时效性检查
+     * 用于测试或手动执行
+     */
+    public void manualCheckPromotionExpiry()
+    {
+        logger.info("手动触发推广时效性检查...");
+        checkPromotionExpiry();
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 0333eba..f80b3fd 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -1,15 +1,18 @@
 # 项目相关配置
 ruoyi:
   # 名称
-  name: TdHub
+  name: ThunderHub
   # 版本
-  version: 3.8.8
+  version: 1.0.0
   # 版权年份
   copyrightYear: 2024
-  profile: ./download
+  # 文件路径 示例（ Windows配置D:/ruoyi/uploadPath，Linux配置 /home/ruoyi/uploadPath）
+  profile: ./upload
+  # 前端项目图片路径（相对于后端项目根目录）
+  frontendImagePath: ../ThunderHubWeb/public/images
   # 获取ip地址开关
   addressEnabled: false
-  # 验证码类型 math 数字计算 char 字符验证
+  # 验证码类型 math 数组计算 char 字符验证
   captchaType: math
 
 # 开发环境配置
@@ -52,6 +55,12 @@
     basename: i18n/messages
   profiles:
     active: druid
+  # 静态资源映射
+  mvc:
+    static-path-pattern: /static/**
+  web:
+    resources:
+      static-locations: classpath:/static/
   # 文件上传
   servlet:
     multipart:
diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml
index a360583..a8c526e 100644
--- a/ruoyi-admin/src/main/resources/logback.xml
+++ b/ruoyi-admin/src/main/resources/logback.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/home/ruoyi/logs" />
+	<property name="log.path" value="./logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 
diff --git a/ruoyi-admin/src/main/resources/mapper/post/PostCommentMapper.xml b/ruoyi-admin/src/main/resources/mapper/post/PostCommentMapper.xml
new file mode 100644
index 0000000..537dd4c
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/post/PostCommentMapper.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.controller.post.mapper.PostCommentMapper">
+    
+    <resultMap type="PostComment" id="PostCommentResult">
+        <id     property="commentId"     column="comment_id"     />
+        <result property="postId"        column="post_id"        />
+        <result property="content"       column="content"        />
+        <result property="userId"        column="user_id"        />
+        <result property="userName"      column="user_name"      />
+        <result property="userAvatar"    column="user_avatar"    />
+        <result property="parentId"      column="parent_id"      />
+        <result property="replyUserId"   column="reply_user_id"  />
+        <result property="replyUserName" column="reply_user_name"/>
+        <result property="status"        column="status"         />
+        <result property="likes"         column="likes"          />
+        <result property="createBy"      column="create_by"      />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"      column="update_by"      />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"        column="remark"         />
+    </resultMap>
+    
+    <sql id="selectPostCommentVo">
+        select comment_id, post_id, content, user_id, user_name, user_avatar, parent_id, reply_user_id, reply_user_name, status, likes,
+            create_by, create_time, update_by, update_time, remark
+        from post_comment
+    </sql>
+    
+    <select id="selectPostCommentList" parameterType="PostComment" resultMap="PostCommentResult">
+        <include refid="selectPostCommentVo"/>
+        <where>
+            <if test="postId != null">
+                AND post_id = #{postId}
+            </if>
+            <if test="userId != null">
+                AND user_id = #{userId}
+            </if>
+            <if test="userName != null  and userName != ''">
+                AND user_name like concat('%', #{userName}, '%')
+            </if>
+            <if test="parentId != null">
+                AND parent_id = #{parentId}
+            </if>
+            <if test="status != null  and status != ''">
+                AND status = #{status}
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+    
+    <select id="selectPostCommentById" parameterType="Long" resultMap="PostCommentResult">
+        <include refid="selectPostCommentVo"/>
+        where comment_id = #{commentId}
+    </select>
+    
+    <select id="selectCommentsByPostId" resultMap="PostCommentResult">
+        <include refid="selectPostCommentVo"/>
+        where post_id = #{postId} and parent_id = 0 and status = '1'
+        order by create_time desc
+        <if test="limit > 0">
+            limit #{limit}
+        </if>
+    </select>
+    
+    <select id="selectCommentsByParentId" parameterType="Long" resultMap="PostCommentResult">
+        <include refid="selectPostCommentVo"/>
+        where parent_id = #{parentId} and status = '1'
+        order by create_time asc
+    </select>
+    
+    <insert id="insertPostComment" parameterType="PostComment" useGeneratedKeys="true" keyProperty="commentId">
+        insert into post_comment (
+            post_id,
+            content,
+            user_id,
+            user_name,
+            user_avatar,
+            parent_id,
+            reply_user_id,
+            reply_user_name,
+            status,
+            likes,
+            create_by,
+            create_time,
+            update_by,
+            update_time,
+            remark
+        ) values (
+            #{postId},
+            #{content},
+            #{userId},
+            #{userName},
+            #{userAvatar},
+            #{parentId},
+            #{replyUserId},
+            #{replyUserName},
+            #{status},
+            #{likes},
+            #{createBy},
+            now(),
+            #{updateBy},
+            now(),
+            #{remark}
+        )
+    </insert>
+    
+    <update id="updatePostComment" parameterType="PostComment">
+        update post_comment
+        <set>
+            <if test="content != null and content != ''">content = #{content},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="likes != null">likes = #{likes},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = now(),
+            <if test="remark != null">remark = #{remark},</if>
+        </set>
+        where comment_id = #{commentId}
+    </update>
+    
+    <delete id="deletePostCommentById" parameterType="Long">
+        delete from post_comment where comment_id = #{commentId}
+    </delete>
+    
+    <delete id="deletePostCommentByIds" parameterType="Long">
+        delete from post_comment where comment_id in 
+        <foreach collection="array" item="commentId" open="(" separator="," close=")">
+            #{commentId}
+        </foreach>
+    </delete>
+    
+    <delete id="deletePostCommentByPostId" parameterType="Long">
+        delete from post_comment where post_id = #{postId}
+    </delete>
+    
+    <update id="updateCommentLikes" parameterType="PostComment">
+        update post_comment set likes = likes + #{likes} where comment_id = #{commentId}
+    </update>
+    
+</mapper> 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/post/PostFavoriteMapper.xml b/ruoyi-admin/src/main/resources/mapper/post/PostFavoriteMapper.xml
new file mode 100644
index 0000000..a79ee9b
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/post/PostFavoriteMapper.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.controller.post.mapper.PostFavoriteMapper">
+    
+    <resultMap type="PostFavorite" id="PostFavoriteResult">
+        <id     property="favoriteId"   column="favorite_id"   />
+        <result property="postId"       column="post_id"       />
+        <result property="userId"       column="user_id"       />
+        <result property="postTitle"    column="post_title"    />
+        <result property="postCover"    column="post_cover"    />
+        <result property="status"       column="status"        />
+        <result property="createBy"     column="create_by"     />
+        <result property="createTime"   column="create_time"   />
+        <result property="updateBy"     column="update_by"     />
+        <result property="updateTime"   column="update_time"   />
+        <result property="remark"       column="remark"        />
+    </resultMap>
+    
+    <sql id="selectPostFavoriteVo">
+        select favorite_id, post_id, user_id, post_title, post_cover, status,
+            create_by, create_time, update_by, update_time, remark
+        from post_favorite
+    </sql>
+    
+    <select id="selectPostFavoriteList" parameterType="PostFavorite" resultMap="PostFavoriteResult">
+        <include refid="selectPostFavoriteVo"/>
+        <where>
+            <if test="postId != null">
+                AND post_id = #{postId}
+            </if>
+            <if test="userId != null">
+                AND user_id = #{userId}
+            </if>
+            <if test="status != null and status != ''">
+                AND status = #{status}
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+    
+    <select id="selectPostFavoriteById" parameterType="Long" resultMap="PostFavoriteResult">
+        <include refid="selectPostFavoriteVo"/>
+        where favorite_id = #{favoriteId}
+    </select>
+    
+    <select id="selectPostFavoriteByPostIdAndUserId" resultMap="PostFavoriteResult">
+        <include refid="selectPostFavoriteVo"/>
+        where post_id = #{postId} and user_id = #{userId}
+    </select>
+    
+    <insert id="insertPostFavorite" parameterType="PostFavorite" useGeneratedKeys="true" keyProperty="favoriteId">
+        insert into post_favorite (
+            post_id,
+            user_id,
+            post_title,
+            post_cover,
+            status,
+            create_by,
+            create_time,
+            update_by,
+            update_time,
+            remark
+        ) values (
+            #{postId},
+            #{userId},
+            #{postTitle},
+            #{postCover},
+            #{status},
+            #{createBy},
+            now(),
+            #{updateBy},
+            now(),
+            #{remark}
+        )
+    </insert>
+    
+    <update id="updatePostFavorite" parameterType="PostFavorite">
+        update post_favorite
+        <set>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = now(),
+            <if test="remark != null">remark = #{remark},</if>
+        </set>
+        where favorite_id = #{favoriteId}
+    </update>
+    
+    <delete id="deletePostFavoriteById" parameterType="Long">
+        delete from post_favorite where favorite_id = #{favoriteId}
+    </delete>
+    
+    <delete id="deletePostFavoriteByIds" parameterType="Long">
+        delete from post_favorite where favorite_id in 
+        <foreach collection="array" item="favoriteId" open="(" separator="," close=")">
+            #{favoriteId}
+        </foreach>
+    </delete>
+    
+    <delete id="deletePostFavoriteByPostId" parameterType="Long">
+        delete from post_favorite where post_id = #{postId}
+    </delete>
+    
+    <update id="cancelPostFavorite">
+        update post_favorite set status = '1', update_time = now() 
+        where post_id = #{postId} and user_id = #{userId}
+    </update>
+    
+</mapper> 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/post/PostMapper.xml b/ruoyi-admin/src/main/resources/mapper/post/PostMapper.xml
new file mode 100644
index 0000000..5254e6f
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/post/PostMapper.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.controller.post.mapper.PostContentMapper">
+    
+    <resultMap type="Post" id="PostResult">
+        <id     property="postId"          column="post_id"          />
+        <result property="title"           column="title"            />
+        <result property="content"         column="content"          />
+        <result property="summary"         column="summary"          />
+        <result property="coverImage"      column="cover_image"      />
+        <result property="authorId"        column="author_id"        />
+        <result property="author"          column="author"           />
+        <result property="views"           column="views"            />
+        <result property="comments"        column="comments"         />
+        <result property="favorites"       column="favorites"        />
+        <result property="likes"           column="likes"            />
+        <result property="status"          column="status"           />
+        <result property="publishTime"     column="publish_time"     />
+        <result property="tags"            column="tags"             />
+        <result property="promotionPlanId" column="promotion_plan_id"/>
+        <result property="createBy"        column="create_by"        />
+        <result property="createTime"      column="create_time"      />
+        <result property="updateBy"        column="update_by"        />
+        <result property="updateTime"      column="update_time"      />
+        <result property="remark"          column="remark"           />
+    </resultMap>
+    
+    <sql id="selectPostVo">
+        select post_id, title, content, summary, cover_image, author_id, author, views, comments, favorites, likes, 
+               status, publish_time, tags, promotion_plan_id, create_by, create_time, update_by, update_time, remark
+        from post
+    </sql>
+    
+    <select id="selectPostList" parameterType="Post" resultMap="PostResult">
+        <include refid="selectPostVo"/>
+        <where>
+            <if test="title != null and title != ''">
+                AND title like concat('%', #{title}, '%')
+            </if>
+            <if test="author != null and author != ''">
+                AND author like concat('%', #{author}, '%')
+            </if>
+            <if test="status != null and status != ''">
+                AND status = #{status}
+            </if>
+            <if test="tags != null and tags != ''">
+                AND tags like concat('%', #{tags}, '%')
+            </if>
+            <if test="authorId != null">
+                AND author_id = #{authorId}
+            </if>
+        </where>
+        order by 
+            case when promotion_plan_id is not null then 0 else 1 end,
+            create_time desc
+    </select>
+    
+    <select id="selectPostById" parameterType="Long" resultMap="PostResult">
+        <include refid="selectPostVo"/>
+        where post_id = #{postId}
+    </select>
+    
+    <select id="selectAuthorOtherPosts" resultMap="PostResult">
+        <include refid="selectPostVo"/>
+        where author_id = #{authorId} and post_id != #{postId} and status = '1'
+        order by create_time desc
+        limit #{limit}
+    </select>
+    
+    <select id="selectSimilarTagsPosts" resultMap="PostResult">
+        <include refid="selectPostVo"/>
+        <where>
+            post_id != #{postId} and status = '1'
+            <if test="tags != null and tags != ''">
+                AND tags like concat('%', #{tags}, '%')
+            </if>
+        </where>
+        order by create_time desc
+        limit #{limit}
+    </select>
+    
+    <insert id="insertPost" parameterType="Post" useGeneratedKeys="true" keyProperty="postId">
+        insert into post (
+            title,
+            content,
+            summary,
+            cover_image,
+            author_id,
+            author,
+            views,
+            comments,
+            favorites,
+            likes,
+            status,
+            publish_time,
+            tags,
+            promotion_plan_id,
+            create_by,
+            create_time,
+            update_by,
+            update_time,
+            remark
+        ) values (
+            #{title},
+            #{content},
+            #{summary},
+            #{coverImage},
+            #{authorId},
+            #{author},
+            #{views},
+            #{comments},
+            #{favorites},
+            #{likes},
+            #{status},
+            #{publishTime},
+            #{tags},
+            #{promotionPlanId},
+            #{createBy},
+            now(),
+            #{updateBy},
+            now(),
+            #{remark}
+        )
+    </insert>
+    
+    <update id="updatePost" parameterType="Post">
+        update post
+        <set>
+            <if test="title != null and title != ''">title = #{title},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="summary != null">summary = #{summary},</if>
+            <if test="coverImage != null">cover_image = #{coverImage},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="tags != null">tags = #{tags},</if>
+            <if test="promotionPlanId != null">promotion_plan_id = #{promotionPlanId},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = now(),
+            <if test="remark != null">remark = #{remark},</if>
+        </set>
+        where post_id = #{postId}
+    </update>
+    
+    <delete id="deletePostById" parameterType="Long">
+        delete from post where post_id = #{postId}
+    </delete>
+    
+    <delete id="deletePostByIds" parameterType="Long">
+        delete from post where post_id in 
+        <foreach collection="array" item="postId" open="(" separator="," close=")">
+            #{postId}
+        </foreach>
+    </delete>
+    
+    <update id="updatePostViews" parameterType="Long">
+        update post set views = views + 1 where post_id = #{postId}
+    </update>
+    
+    <update id="updatePostComments" parameterType="Post">
+        update post set comments = comments + #{comments} where post_id = #{postId}
+    </update>
+    
+    <update id="updatePostFavorites" parameterType="Post">
+        update post set favorites = favorites + #{favorites} where post_id = #{postId}
+    </update>
+    
+    <update id="updatePostLikes" parameterType="Post">
+        update post set likes = likes + #{likes} where post_id = #{postId}
+    </update>
+    
+</mapper> 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/post/PostPaymentMapper.xml b/ruoyi-admin/src/main/resources/mapper/post/PostPaymentMapper.xml
new file mode 100644
index 0000000..c12dc2e
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/post/PostPaymentMapper.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.controller.post.mapper.PostPaymentMapper">
+    
+    <resultMap type="com.ruoyi.web.controller.post.domain.PostPayment" id="PostPaymentResult">
+        <id     property="paymentId"       column="payment_id"       />
+        <result property="postId"          column="post_id"          />
+        <result property="planId"          column="plan_id"          />
+        <result property="userId"          column="user_id"          />
+        <result property="amount"          column="amount"           />
+        <result property="paymentStatus"   column="payment_status"   />
+        <result property="paymentTime"     column="payment_time"     />
+    </resultMap>
+    
+    <sql id="selectPostPaymentVo">
+        select payment_id, post_id, plan_id, user_id, amount, payment_status, payment_time
+        from post_payment
+    </sql>
+    
+    <select id="selectPostPaymentList" parameterType="com.ruoyi.web.controller.post.domain.PostPayment" resultMap="PostPaymentResult">
+        <include refid="selectPostPaymentVo"/>
+        <where>
+            <if test="postId != null">
+                AND post_id = #{postId}
+            </if>
+            <if test="planId != null">
+                AND plan_id = #{planId}
+            </if>
+            <if test="userId != null">
+                AND user_id = #{userId}
+            </if>
+            <if test="paymentStatus != null and paymentStatus != ''">
+                AND payment_status = #{paymentStatus}
+            </if>
+        </where>
+        order by payment_time desc
+    </select>
+    
+    <select id="selectPostPaymentById" parameterType="Long" resultMap="PostPaymentResult">
+        <include refid="selectPostPaymentVo"/>
+        where payment_id = #{paymentId}
+    </select>
+    
+    <select id="selectLatestPaymentByPostId" parameterType="Long" resultMap="PostPaymentResult">
+        <include refid="selectPostPaymentVo"/>
+        where post_id = #{postId} and payment_status = 'paid'
+        order by payment_time desc
+        limit 1
+    </select>
+    
+    <select id="selectExpiredPromotionPayments" resultMap="PostPaymentResult">
+        <include refid="selectPostPaymentVo"/>
+        where payment_status = 'paid' 
+        and post_id in (
+            select post_id from post where promotion_plan_id is not null
+        )
+        order by payment_time desc
+    </select>
+    
+    <insert id="insertPostPayment" parameterType="com.ruoyi.web.controller.post.domain.PostPayment" useGeneratedKeys="true" keyProperty="paymentId">
+        insert into post_payment (
+            post_id,
+            plan_id,
+            user_id,
+            amount,
+            payment_status,
+            payment_time
+        ) values (
+            #{postId},
+            #{planId},
+            #{userId},
+            #{amount},
+            #{paymentStatus},
+            #{paymentTime}
+        )
+    </insert>
+    
+    <update id="updatePostPayment" parameterType="com.ruoyi.web.controller.post.domain.PostPayment">
+        update post_payment
+        <set>
+            <if test="postId != null">post_id = #{postId},</if>
+            <if test="planId != null">plan_id = #{planId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="amount != null">amount = #{amount},</if>
+            <if test="paymentStatus != null and paymentStatus != ''">payment_status = #{paymentStatus},</if>
+            <if test="paymentTime != null">payment_time = #{paymentTime},</if>
+        </set>
+        where payment_id = #{paymentId}
+    </update>
+    
+    <delete id="deletePostPaymentById" parameterType="Long">
+        delete from post_payment where payment_id = #{paymentId}
+    </delete>
+    
+    <delete id="deletePostPaymentByIds" parameterType="Long">
+        delete from post_payment where payment_id in 
+        <foreach collection="array" item="paymentId" open="(" separator="," close=")">
+            #{paymentId}
+        </foreach>
+    </delete>
+    
+</mapper> 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/post/PostPromotionPlanMapper.xml b/ruoyi-admin/src/main/resources/mapper/post/PostPromotionPlanMapper.xml
new file mode 100644
index 0000000..0d22833
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/post/PostPromotionPlanMapper.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.controller.post.mapper.PostPromotionPlanMapper">
+    
+    <resultMap type="com.ruoyi.web.controller.post.domain.PostPromotionPlan" id="PostPromotionPlanResult">
+        <id     property="planId"           column="plan_id"           />
+        <result property="planName"         column="plan_name"         />
+        <result property="planDescription"  column="plan_description"  />
+        <result property="price"            column="price"             />
+        <result property="duration"         column="duration"          />
+        <result property="level"            column="level"             />
+        <result property="status"           column="status"            />
+        <result property="createBy"         column="create_by"         />
+        <result property="createTime"       column="create_time"       />
+        <result property="updateBy"         column="update_by"         />
+        <result property="updateTime"       column="update_time"       />
+        <result property="remark"           column="remark"            />
+    </resultMap>
+    
+    <sql id="selectPostPromotionPlanVo">
+        select plan_id, plan_name, plan_description, price, duration, level, status, 
+               create_by, create_time, update_by, update_time, remark
+        from post_promotion_plan
+    </sql>
+    
+    <select id="selectPostPromotionPlanList" parameterType="com.ruoyi.web.controller.post.domain.PostPromotionPlan" resultMap="PostPromotionPlanResult">
+        <include refid="selectPostPromotionPlanVo"/>
+        <where>
+            <if test="planName != null and planName != ''">
+                AND plan_name like concat('%', #{planName}, '%')
+            </if>
+            <if test="status != null and status != ''">
+                AND status = #{status}
+            </if>
+        </where>
+        order by level asc, create_time desc
+    </select>
+    
+    <select id="selectPostPromotionPlanById" parameterType="Long" resultMap="PostPromotionPlanResult">
+        <include refid="selectPostPromotionPlanVo"/>
+        where plan_id = #{planId}
+    </select>
+    
+    <insert id="insertPostPromotionPlan" parameterType="com.ruoyi.web.controller.post.domain.PostPromotionPlan" useGeneratedKeys="true" keyProperty="planId">
+        insert into post_promotion_plan (
+            plan_name,
+            plan_description,
+            price,
+            duration,
+            level,
+            status,
+            create_by,
+            create_time,
+            remark
+        ) values (
+            #{planName},
+            #{planDescription},
+            #{price},
+            #{duration},
+            #{level},
+            #{status},
+            #{createBy},
+            sysdate(),
+            #{remark}
+        )
+    </insert>
+    
+    <update id="updatePostPromotionPlan" parameterType="com.ruoyi.web.controller.post.domain.PostPromotionPlan">
+        update post_promotion_plan
+        <set>
+            <if test="planName != null and planName != ''">plan_name = #{planName},</if>
+            <if test="planDescription != null">plan_description = #{planDescription},</if>
+            <if test="price != null">price = #{price},</if>
+            <if test="duration != null">duration = #{duration},</if>
+            <if test="level != null">level = #{level},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            update_time = sysdate()
+        </set>
+        where plan_id = #{planId}
+    </update>
+    
+    <delete id="deletePostPromotionPlanById" parameterType="Long">
+        delete from post_promotion_plan where plan_id = #{planId}
+    </delete>
+    
+    <delete id="deletePostPromotionPlanByIds" parameterType="Long">
+        delete from post_promotion_plan where plan_id in 
+        <foreach collection="array" item="planId" open="(" separator="," close=")">
+            #{planId}
+        </foreach>
+    </delete>
+    
+</mapper> 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/post/PostReportMapper.xml b/ruoyi-admin/src/main/resources/mapper/post/PostReportMapper.xml
new file mode 100644
index 0000000..fbbe021
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/post/PostReportMapper.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.controller.post.mapper.PostReportMapper">
+    
+    <resultMap type="com.ruoyi.web.controller.post.domain.PostReport" id="PostReportResult">
+        <id     property="reportId"         column="report_id"         />
+        <result property="postId"           column="post_id"           />
+        <result property="postTitle"        column="post_title"        />
+        <result property="reportUserId"     column="report_user_id"    />
+        <result property="reportUserName"   column="report_user_name"  />
+        <result property="reportReason"     column="report_reason"     />
+        <result property="status"           column="status"            />
+        <result property="handleResult"     column="handle_result"     />
+        <result property="handleTime"       column="handle_time"       />
+        <result property="handleBy"         column="handle_by"         />
+        <result property="createBy"         column="create_by"         />
+        <result property="createTime"       column="create_time"       />
+        <result property="updateBy"         column="update_by"         />
+        <result property="updateTime"       column="update_time"       />
+        <result property="remark"           column="remark"            />
+    </resultMap>
+    
+    <sql id="selectPostReportVo">
+        select report_id, post_id, post_title, report_user_id, report_user_name, report_reason, 
+               status, handle_result, handle_time, handle_by, create_by, create_time, 
+               update_by, update_time, remark
+        from post_report
+    </sql>
+    
+    <select id="selectPostReportList" parameterType="com.ruoyi.web.controller.post.domain.PostReport" resultMap="PostReportResult">
+        <include refid="selectPostReportVo"/>
+        <where>
+            <if test="postId != null">
+                AND post_id = #{postId}
+            </if>
+            <if test="reportUserId != null">
+                AND report_user_id = #{reportUserId}
+            </if>
+            <if test="status != null and status != ''">
+                AND status = #{status}
+            </if>
+            <if test="postTitle != null and postTitle != ''">
+                AND post_title like concat('%', #{postTitle}, '%')
+            </if>
+            <if test="reportUserName != null and reportUserName != ''">
+                AND report_user_name like concat('%', #{reportUserName}, '%')
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+    
+    <select id="selectPostReportById" parameterType="Long" resultMap="PostReportResult">
+        <include refid="selectPostReportVo"/>
+        where report_id = #{reportId}
+    </select>
+    
+    <insert id="insertPostReport" parameterType="com.ruoyi.web.controller.post.domain.PostReport" useGeneratedKeys="true" keyProperty="reportId">
+        insert into post_report (
+            post_id,
+            post_title,
+            report_user_id,
+            report_user_name,
+            report_reason,
+            status,
+            create_by,
+            create_time
+        ) values (
+            #{postId},
+            #{postTitle},
+            #{reportUserId},
+            #{reportUserName},
+            #{reportReason},
+            #{status},
+            #{createBy},
+            sysdate()
+        )
+    </insert>
+    
+    <update id="updatePostReport" parameterType="com.ruoyi.web.controller.post.domain.PostReport">
+        update post_report
+        <set>
+            <if test="postId != null">post_id = #{postId},</if>
+            <if test="postTitle != null and postTitle != ''">post_title = #{postTitle},</if>
+            <if test="reportUserId != null">report_user_id = #{reportUserId},</if>
+            <if test="reportUserName != null and reportUserName != ''">report_user_name = #{reportUserName},</if>
+            <if test="reportReason != null and reportReason != ''">report_reason = #{reportReason},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="handleResult != null">handle_result = #{handleResult},</if>
+            <if test="handleTime != null">handle_time = #{handleTime},</if>
+            <if test="handleBy != null and handleBy != ''">handle_by = #{handleBy},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            update_time = sysdate()
+        </set>
+        where report_id = #{reportId}
+    </update>
+    
+    <delete id="deletePostReportById" parameterType="Long">
+        delete from post_report where report_id = #{reportId}
+    </delete>
+    
+    <delete id="deletePostReportByIds" parameterType="Long">
+        delete from post_report where report_id in 
+        <foreach collection="array" item="reportId" open="(" separator="," close=")">
+            #{reportId}
+        </foreach>
+    </delete>
+    
+</mapper> 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/post/PostTagMapper.xml b/ruoyi-admin/src/main/resources/mapper/post/PostTagMapper.xml
new file mode 100644
index 0000000..1060c0a
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/post/PostTagMapper.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.controller.post.mapper.PostContentTagMapper">
+    
+    <resultMap type="PostTag" id="PostTagResult">
+        <id     property="tagId"      column="tag_id"      />
+        <result property="tagName"    column="tag_name"    />
+        <result property="tagColor"   column="tag_color"   />
+        <result property="postCount"  column="post_count"  />
+        <result property="status"     column="status"      />
+        <result property="createBy"   column="create_by"   />
+        <result property="createTime" column="create_time" />
+        <result property="updateBy"   column="update_by"   />
+        <result property="updateTime" column="update_time" />
+        <result property="remark"     column="remark"      />
+    </resultMap>
+    
+    <resultMap type="PostTagRelation" id="PostTagRelationResult">
+        <id     property="id"         column="id"          />
+        <result property="postId"     column="post_id"     />
+        <result property="tagId"      column="tag_id"      />
+        <result property="createBy"   column="create_by"   />
+        <result property="createTime" column="create_time" />
+        <result property="updateBy"   column="update_by"   />
+        <result property="updateTime" column="update_time" />
+    </resultMap>
+    
+    <sql id="selectPostTagVo">
+        select tag_id, tag_name, tag_color, post_count, status,
+            create_by, create_time, update_by, update_time, remark
+        from post_tag
+    </sql>
+    
+    <select id="selectPostTagList" parameterType="PostTag" resultMap="PostTagResult">
+        <include refid="selectPostTagVo"/>
+        <where>
+            <if test="tagName != null and tagName != ''">
+                AND tag_name like concat('%', #{tagName}, '%')
+            </if>
+            <if test="status != null and status != ''">
+                AND status = #{status}
+            </if>
+        </where>
+        order by post_count desc, create_time desc
+    </select>
+    
+    <select id="selectPostTagById" parameterType="Long" resultMap="PostTagResult">
+        <include refid="selectPostTagVo"/>
+        where tag_id = #{tagId}
+    </select>
+    
+    <select id="selectPostTagsByPostId" parameterType="Long" resultMap="PostTagResult">
+        select t.tag_id, t.tag_name, t.tag_color, t.post_count, t.status,
+            t.create_by, t.create_time, t.update_by, t.update_time, t.remark
+        from post_tag t
+        inner join post_tag_relation r on t.tag_id = r.tag_id
+        where r.post_id = #{postId} and t.status = '0'
+    </select>
+    
+    <select id="checkTagNameUnique" parameterType="String" resultMap="PostTagResult">
+        <include refid="selectPostTagVo"/>
+        where tag_name = #{tagName}
+    </select>
+    
+    <insert id="insertPostTag" parameterType="PostTag" useGeneratedKeys="true" keyProperty="tagId">
+        insert into post_tag (
+            tag_name,
+            tag_color,
+            post_count,
+            status,
+            create_by,
+            create_time,
+            update_by,
+            update_time,
+            remark
+        ) values (
+            #{tagName},
+            #{tagColor},
+            #{postCount},
+            #{status},
+            #{createBy},
+            now(),
+            #{updateBy},
+            now(),
+            #{remark}
+        )
+    </insert>
+    
+    <update id="updatePostTag" parameterType="PostTag">
+        update post_tag
+        <set>
+            <if test="tagName != null and tagName != ''">tag_name = #{tagName},</if>
+            <if test="tagColor != null">tag_color = #{tagColor},</if>
+            <if test="postCount != null">post_count = #{postCount},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = now(),
+            <if test="remark != null">remark = #{remark},</if>
+        </set>
+        where tag_id = #{tagId}
+    </update>
+    
+    <delete id="deletePostTagById" parameterType="Long">
+        delete from post_tag where tag_id = #{tagId}
+    </delete>
+    
+    <delete id="deletePostTagByIds" parameterType="Long">
+        delete from post_tag where tag_id in 
+        <foreach collection="array" item="tagId" open="(" separator="," close=")">
+            #{tagId}
+        </foreach>
+    </delete>
+    
+    <update id="updatePostTagCount" parameterType="PostTag">
+        update post_tag set post_count = post_count + #{postCount} where tag_id = #{tagId}
+    </update>
+    
+    <!-- 帖子标签关联表操作 -->
+    <insert id="insertPostTagRelation" parameterType="com.ruoyi.web.controller.post.domain.PostTagRelation">
+        insert into post_tag_relation (post_id, tag_id) values (#{postId}, #{tagId})
+    </insert>
+    
+    <insert id="batchInsertPostTagRelation" parameterType="java.util.List">
+        insert into post_tag_relation (post_id, tag_id) values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.postId}, #{item.tagId})
+        </foreach>
+    </insert>
+    
+    <delete id="deletePostTagRelation" parameterType="Long">
+        delete from post_tag_relation where post_id = #{postId}
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCenterControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCenterControllerTest.java
new file mode 100644
index 0000000..880b0fc
--- /dev/null
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCenterControllerTest.java
@@ -0,0 +1,537 @@
+package com.ruoyi.web.controller.post;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.web.controller.post.controller.PostCenterController;
+import com.ruoyi.web.controller.post.domain.*;
+import com.ruoyi.web.controller.post.service.*;
+import com.ruoyi.web.controller.post.mapper.*;
+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.MockedStatic;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.http.MediaType;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+/**
+ * PostCenterController 单元测试
+ * 
+ * 测试覆盖所有帖子中心相关的API接口
+ * 包括：帖子列表、详情、评论、收藏、点赞、发布、上传等功能
+ */
+@ExtendWith(MockitoExtension.class)
+@WithMockUser(username = "testUser", authorities = {"admin"})
+class PostCenterControllerTest {
+
+    @Mock
+    private IPostService postService;
+
+    @Mock
+    private IPostTagService postTagService;
+
+    @Mock
+    private IPostCommentService postCommentService;
+
+    @Mock
+    private IPostFavoriteService postFavoriteService;
+
+    @Mock
+    private PostReportMapper postReportMapper;
+
+    @Mock
+    private PostPaymentMapper postPaymentMapper;
+
+    @InjectMocks
+    private PostCenterController postCenterController;
+
+    private MockMvc mockMvc;
+    private ObjectMapper objectMapper;
+
+    @BeforeEach
+    void setUp() {
+        // 创建模拟的安全上下文
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(1L);
+        sysUser.setUserName("testUser");
+        
+        LoginUser loginUser = new LoginUser(1L, 1L, sysUser, new HashSet<>());
+        
+        UsernamePasswordAuthenticationToken authToken = 
+            new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
+        SecurityContextHolder.getContext().setAuthentication(authToken);
+        
+        mockMvc = MockMvcBuilders.standaloneSetup(postCenterController).build();
+        objectMapper = new ObjectMapper();
+    }
+
+    /**
+     * 测试获取帖子列表
+     */
+    @Test
+    void testGetPostList() throws Exception {
+        List<Post> posts = new ArrayList<>();
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setTitle("测试帖子");
+        posts.add(post);
+
+        when(postService.selectPostList(any(Post.class))).thenReturn(posts);
+
+        mockMvc.perform(get("/post-center/list"))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostList(any(Post.class));
+    }
+
+    /**
+     * 测试获取帖子详情
+     */
+    @Test
+    void testGetPostDetail() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setTitle("测试帖子");
+        post.setStatus("1");
+
+        when(postService.updatePostViews(1L)).thenReturn(1);
+        when(postService.selectPostById(1L)).thenReturn(post);
+        when(postTagService.selectPostTagsByPostId(1L)).thenReturn(new ArrayList<>());
+        when(postCommentService.selectCommentsByPostId(eq(1L), eq(10))).thenReturn(new ArrayList<>());
+        when(postService.getRecommendedPosts(any(), any(), eq(1L), eq(9))).thenReturn(new ArrayList<>());
+
+        mockMvc.perform(get("/post-center/{postId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostById(1L);
+        verify(postService, times(1)).updatePostViews(1L);
+    }
+
+    /**
+     * 测试发布帖子
+     */
+    @Test
+    void testPublishPost() throws Exception {
+        when(postService.insertPost(any(Post.class))).thenReturn(1);
+
+        String postData = "{\"title\":\"新帖子\",\"content\":\"帖子内容\",\"summary\":\"帖子摘要\"}";
+
+        mockMvc.perform(post("/post-center/publish")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(postData))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).insertPost(any(Post.class));
+    }
+
+    /**
+     * 测试更新帖子
+     */
+    @Test
+    void testUpdatePost() throws Exception {
+        Post existingPost = new Post();
+        existingPost.setPostId(1L);
+        existingPost.setAuthorId(1L);
+
+        when(postService.selectPostById(1L)).thenReturn(existingPost);
+        when(postService.updatePost(any(Post.class))).thenReturn(1);
+
+        String postData = "{\"postId\":1,\"title\":\"更新帖子\",\"content\":\"更新内容\",\"summary\":\"更新摘要\"}";
+
+        mockMvc.perform(put("/post-center/update")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(postData))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).updatePost(any(Post.class));
+    }
+
+    /**
+     * 测试删除帖子
+     */
+    @Test
+    void testDeletePost() throws Exception {
+        Post existingPost = new Post();
+        existingPost.setPostId(1L);
+        existingPost.setAuthorId(1L);
+
+        when(postService.selectPostById(1L)).thenReturn(existingPost);
+        when(postCommentService.deletePostCommentByPostId(1L)).thenReturn(1);
+        when(postFavoriteService.deletePostFavoriteByPostId(1L)).thenReturn(1);
+        when(postService.deletePostById(1L)).thenReturn(1);
+
+        mockMvc.perform(delete("/post-center/delete/{postId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).deletePostById(1L);
+    }
+
+    /**
+     * 测试添加评论
+     */
+    @Test
+    void testAddComment() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setPostId(1L);
+        comment.setContent("测试评论");
+        comment.setParentId(0L);
+
+        when(postCommentService.selectPostCommentById(any())).thenReturn(null);
+        when(postCommentService.insertPostComment(any(PostComment.class))).thenReturn(1);
+        when(postService.updatePostComments(eq(1L), anyInt())).thenReturn(1);
+
+        String commentData = objectMapper.writeValueAsString(comment);
+
+        mockMvc.perform(post("/post-center/comment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(commentData))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).insertPostComment(any(PostComment.class));
+    }
+
+    /**
+     * 测试获取评论列表（实际是测试帖子列表）
+     */
+    @Test
+    void testGetComments() throws Exception {
+        List<Post> posts = new ArrayList<>();
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setTitle("测试帖子");
+        posts.add(post);
+
+        when(postService.selectPostList(any(Post.class))).thenReturn(posts);
+
+        // 测试帖子列表接口
+        mockMvc.perform(get("/post-center/list")
+                .param("postId", "1")
+                .param("pageSize", "10"))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostList(any(Post.class));
+    }
+
+    /**
+     * 测试收藏帖子
+     */
+    @Test
+    void testToggleFavorite() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setStatus("1");
+        post.setTitle("测试帖子");
+
+        when(postService.selectPostById(1L)).thenReturn(post);
+        when(postFavoriteService.selectPostFavoriteByPostIdAndUserId(anyLong(), anyLong())).thenReturn(null);
+        when(postFavoriteService.insertPostFavorite(any())).thenReturn(1);
+        when(postService.updatePostFavorites(anyLong(), anyInt())).thenReturn(1);
+
+        mockMvc.perform(post("/post-center/favorite/{postId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postFavoriteService, times(1)).insertPostFavorite(any());
+    }
+
+    /**
+     * 测试点赞帖子
+     */
+    @Test
+    void testToggleLike() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setStatus("1");
+
+        when(postService.selectPostById(1L)).thenReturn(post);
+        when(postService.updatePostLikes(anyLong(), anyInt())).thenReturn(1);
+
+        mockMvc.perform(post("/post-center/like/{postId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).updatePostLikes(eq(1L), anyInt());
+    }
+
+    /**
+     * 测试上传图片
+     */
+    @Test
+    void testUploadImage() throws Exception {
+        mockMvc.perform(multipart("/post-center/upload")
+                .file("file", "test image content".getBytes())
+                .param("filename", "test.jpg"))
+                .andExpect(status().isOk());
+    }
+
+    /**
+     * 测试获取我的帖子
+     */
+    @Test
+    void testGetMyPosts() throws Exception {
+        List<Post> posts = new ArrayList<>();
+        when(postService.selectPostList(any())).thenReturn(posts);
+
+        mockMvc.perform(get("/post-center/my-posts"))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostList(any());
+    }
+
+    /**
+     * 测试获取我的收藏
+     */
+    @Test
+    void testGetMyFavorites() throws Exception {
+        List<PostFavorite> favorites = new ArrayList<>();
+        when(postFavoriteService.selectPostFavoriteList(any())).thenReturn(favorites);
+
+        mockMvc.perform(get("/post-center/my-favorites"))
+                .andExpect(status().isOk());
+
+        verify(postFavoriteService, times(1)).selectPostFavoriteList(any());
+    }
+
+    /**
+     * 测试举报帖子
+     */
+    @Test
+    void testReportPost() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setStatus("1");
+        post.setTitle("测试帖子");
+
+        when(postService.selectPostById(1L)).thenReturn(post);
+        when(postReportMapper.insertPostReport(any())).thenReturn(1);
+
+        String reportData = "{\"reason\":\"垃圾内容\"}";
+
+        mockMvc.perform(post("/post-center/report/{postId}", 1L)
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(reportData))
+                .andExpect(status().isOk());
+
+        verify(postReportMapper, times(1)).insertPostReport(any());
+    }
+
+    /**
+     * 测试获取热门标签
+     */
+    @Test
+    void testGetHotTags() throws Exception {
+        List<PostTag> tags = new ArrayList<>();
+        when(postTagService.selectPostTagList(any())).thenReturn(tags);
+
+        mockMvc.perform(get("/post-center/tags/hot"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagList(any());
+    }
+
+    /**
+     * 测试获取可用标签
+     */
+    @Test
+    void testGetAvailableTags() throws Exception {
+        List<PostTag> tags = new ArrayList<>();
+        when(postTagService.selectPostTagList(any())).thenReturn(tags);
+
+        mockMvc.perform(get("/post-center/tags/available"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagList(any());
+    }
+
+    /**
+     * 测试点赞评论
+     */
+    @Test
+    void testToggleCommentLike() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setCommentId(1L);
+        comment.setStatus("1");
+
+        when(postCommentService.selectPostCommentById(1L)).thenReturn(comment);
+        when(postCommentService.updateCommentLikes(eq(1L), anyInt())).thenReturn(1);
+
+        mockMvc.perform(post("/post-center/comment/like/{commentId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).updateCommentLikes(eq(1L), anyInt());
+    }
+
+    /**
+     * 测试获取帖子详情（帖子不存在）
+     */
+    @Test
+    void testGetPostDetailNotFound() throws Exception {
+        when(postService.updatePostViews(999L)).thenReturn(0);
+        when(postService.selectPostById(999L)).thenReturn(null);
+
+        mockMvc.perform(get("/post-center/{postId}", 999L))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostById(999L);
+    }
+
+    /**
+     * 测试发布空内容帖子
+     */
+    @Test
+    void testPublishEmptyPost() throws Exception {
+        String emptyPostData = "{\"title\":\"\",\"content\":\"\"}";
+
+        mockMvc.perform(post("/post-center/publish")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(emptyPostData))
+                .andExpect(status().isOk());
+    }
+
+    /**
+     * 测试添加空评论
+     */
+    @Test
+    void testAddEmptyComment() throws Exception {
+        String emptyCommentData = "{\"postId\":1,\"content\":\"\"}";
+
+        mockMvc.perform(post("/post-center/comment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(emptyCommentData))
+                .andExpect(status().isOk());
+    }
+
+    /**
+     * 测试上传空文件
+     */
+    @Test
+    void testUploadEmptyFile() throws Exception {
+        mockMvc.perform(multipart("/post-center/upload")
+                .file("file", new byte[0])
+                .param("filename", ""))
+                .andExpect(status().isOk());
+    }
+
+    /**
+     * 测试获取推广计划
+     */
+    @Test
+    void testGetPromotionPlans() throws Exception {
+        mockMvc.perform(get("/post-center/promotion-plans"))
+                .andExpect(status().isOk());
+    }
+
+    /**
+     * 测试创建支付
+     */
+    @Test
+    void testCreatePayment() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setAuthorId(1L);
+
+        when(postService.selectPostById(1L)).thenReturn(post);
+        when(postPaymentMapper.insertPostPayment(any())).thenReturn(1);
+
+        String paymentData = "{\"postId\":1,\"planId\":1,\"amount\":100}";
+
+        mockMvc.perform(post("/post-center/payment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(paymentData))
+                .andExpect(status().isOk());
+
+        verify(postPaymentMapper, times(1)).insertPostPayment(any());
+    }
+
+    /**
+     * 测试取消支付
+     */
+    @Test
+    void testCancelPayment() throws Exception {
+        PostPayment payment = new PostPayment();
+        payment.setPaymentId(1L);
+        payment.setUserId(1L);
+        payment.setPaymentStatus("pending");
+
+        when(postPaymentMapper.selectPostPaymentById(1L)).thenReturn(payment);
+        when(postPaymentMapper.updatePostPayment(any())).thenReturn(1);
+
+        mockMvc.perform(post("/post-center/payment/cancel/{paymentId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postPaymentMapper, times(1)).updatePostPayment(any());
+    }
+
+    /**
+     * 测试获取推广状态
+     */
+    @Test
+    void testGetPromotionStatus() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setAuthorId(1L);
+
+        when(postService.selectPostById(1L)).thenReturn(post);
+
+        mockMvc.perform(get("/post-center/promotion-status/{postId}", 1L))
+                .andExpect(status().isOk());
+    }
+
+    /**
+     * 测试获取推广帖子
+     */
+    @Test
+    void testGetPromotionPosts() throws Exception {
+        List<Post> posts = new ArrayList<>();
+        when(postService.selectPostList(any())).thenReturn(posts);
+
+        mockMvc.perform(get("/post-center/promotion"))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostList(any());
+    }
+
+    /**
+     * 测试根据标签获取帖子
+     */
+    @Test
+    void testGetPostsByTag() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagId(1L);
+        tag.setTagName("测试标签");
+        
+        List<Post> posts = new ArrayList<>();
+        when(postTagService.selectPostTagById(1L)).thenReturn(tag);
+        when(postService.selectPostList(any())).thenReturn(posts);
+
+        mockMvc.perform(get("/post-center/bytag/{tagId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostList(any());
+    }
+
+    /**
+     * 测试删除图片
+     */
+    @Test
+    void testDeleteImage() throws Exception {
+        mockMvc.perform(delete("/post-center/upload")
+                .param("filename", "test.jpg"))
+                .andExpect(status().isOk());
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCommentControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCommentControllerTest.java
new file mode 100644
index 0000000..8e81d5a
--- /dev/null
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostCommentControllerTest.java
@@ -0,0 +1,378 @@
+package com.ruoyi.web.controller.post;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.web.controller.post.controller.PostCommentController;
+import com.ruoyi.web.controller.post.domain.PostComment;
+import com.ruoyi.web.controller.post.service.IPostCommentService;
+import com.ruoyi.web.controller.post.service.IPostService;
+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.MediaType;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+/**
+ * PostCommentController 单元测试
+ * 
+ * 测试覆盖所有评论管理相关的API接口
+ * 包括：评论列表、详情、增删改查、点赞、导出等功能
+ */
+@ExtendWith(MockitoExtension.class)
+class PostCommentControllerTest {
+
+    @Mock
+    private IPostCommentService postCommentService;
+
+    @Mock
+    private IPostService postService;
+
+    @InjectMocks
+    private PostCommentController postCommentController;
+
+    private MockMvc mockMvc;
+    private ObjectMapper objectMapper;
+
+    @BeforeEach
+    void setUp() {
+        // 创建模拟的安全上下文
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(1L);
+        sysUser.setUserName("testUser");
+        
+        LoginUser loginUser = new LoginUser(1L, 1L, sysUser, new HashSet<>());
+        
+        UsernamePasswordAuthenticationToken authToken = 
+            new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
+        SecurityContextHolder.getContext().setAuthentication(authToken);
+        
+        mockMvc = MockMvcBuilders.standaloneSetup(postCommentController).build();
+        objectMapper = new ObjectMapper();
+    }
+
+    /**
+     * 测试获取评论列表
+     */
+    @Test
+    void testGetCommentList() throws Exception {
+        List<PostComment> comments = new ArrayList<>();
+        PostComment comment = new PostComment();
+        comment.setCommentId(1L);
+        comment.setContent("测试评论");
+        comments.add(comment);
+
+        when(postCommentService.selectPostCommentList(any(PostComment.class))).thenReturn(comments);
+
+        mockMvc.perform(get("/post/comment/list"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectPostCommentList(any(PostComment.class));
+    }
+
+    /**
+     * 测试获取评论详情
+     */
+    @Test
+    void testGetCommentInfo() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setCommentId(1L);
+        comment.setContent("测试评论");
+
+        when(postCommentService.selectPostCommentById(1L)).thenReturn(comment);
+
+        mockMvc.perform(get("/post/comment/{commentId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectPostCommentById(1L);
+    }
+
+    /**
+     * 测试添加评论
+     */
+    @Test
+    void testAddComment() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setPostId(1L);
+        comment.setContent("新评论");
+
+        when(postCommentService.insertPostComment(any(PostComment.class))).thenReturn(1);
+        when(postService.updatePostComments(eq(1L), eq(1))).thenReturn(1);
+
+        mockMvc.perform(post("/post/comment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(comment)))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).insertPostComment(any(PostComment.class));
+        verify(postService, times(1)).updatePostComments(eq(1L), eq(1));
+    }
+
+    /**
+     * 测试编辑评论
+     */
+    @Test
+    void testEditComment() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setCommentId(1L);
+        comment.setContent("编辑后的评论");
+
+        when(postCommentService.updatePostComment(any(PostComment.class))).thenReturn(1);
+
+        mockMvc.perform(put("/post/comment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(comment)))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).updatePostComment(any(PostComment.class));
+    }
+
+    /**
+     * 测试删除评论
+     */
+    @Test
+    void testDeleteComment() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setCommentId(1L);
+        comment.setPostId(1L);
+        comment.setParentId(0L);
+
+        when(postCommentService.selectPostCommentById(1L)).thenReturn(comment);
+        when(postCommentService.selectCommentsByParentId(1L)).thenReturn(new ArrayList<>());
+        when(postCommentService.deletePostCommentByIds(any())).thenReturn(1);
+        when(postService.updatePostComments(eq(1L), eq(-1))).thenReturn(1);
+
+        mockMvc.perform(delete("/post/comment/{commentIds}", "1"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectPostCommentById(1L);
+        verify(postCommentService, times(1)).deletePostCommentByIds(any());
+        verify(postService, times(1)).updatePostComments(eq(1L), eq(-1));
+    }
+
+    /**
+     * 测试删除包含回复的顶级评论
+     */
+    @Test
+    void testDeleteTopCommentWithReplies() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setCommentId(1L);
+        comment.setPostId(1L);
+        comment.setParentId(0L);
+
+        List<PostComment> replies = new ArrayList<>();
+        PostComment reply1 = new PostComment();
+        reply1.setCommentId(2L);
+        replies.add(reply1);
+        PostComment reply2 = new PostComment();
+        reply2.setCommentId(3L);
+        replies.add(reply2);
+
+        when(postCommentService.selectPostCommentById(1L)).thenReturn(comment);
+        when(postCommentService.selectCommentsByParentId(1L)).thenReturn(replies);
+        when(postCommentService.deletePostCommentByIds(any())).thenReturn(1);
+        when(postService.updatePostComments(eq(1L), eq(-3))).thenReturn(1); // 1个评论 + 2个回复
+
+        mockMvc.perform(delete("/post/comment/{commentIds}", "1"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectPostCommentById(1L);
+        verify(postCommentService, times(1)).selectCommentsByParentId(1L);
+        verify(postCommentService, times(1)).deletePostCommentByIds(any());
+        verify(postService, times(1)).updatePostComments(eq(1L), eq(-3));
+    }
+
+    /**
+     * 测试根据帖子ID获取评论列表
+     */
+    @Test
+    void testListByPostId() throws Exception {
+        List<PostComment> comments = new ArrayList<>();
+        when(postCommentService.selectCommentsByPostId(eq(1L), eq(0))).thenReturn(comments);
+
+        mockMvc.perform(get("/post/comment/list/{postId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectCommentsByPostId(eq(1L), eq(0));
+    }
+
+    /**
+     * 测试点赞评论
+     */
+    @Test
+    void testLikeComment() throws Exception {
+        when(postCommentService.updateCommentLikes(eq(1L), eq(1))).thenReturn(1);
+
+        mockMvc.perform(post("/post/comment/like/{commentId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).updateCommentLikes(eq(1L), eq(1));
+    }
+
+    /**
+     * 测试导出评论
+     */
+    @Test
+    void testExportComments() throws Exception {
+        List<PostComment> comments = new ArrayList<>();
+        when(postCommentService.selectPostCommentList(any(PostComment.class))).thenReturn(comments);
+
+        mockMvc.perform(post("/post/comment/export"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectPostCommentList(any(PostComment.class));
+    }
+
+    /**
+     * 测试添加回复评论（非顶级评论）
+     */
+    @Test
+    void testAddReplyComment() throws Exception {
+        PostComment replyComment = new PostComment();
+        replyComment.setPostId(1L);
+        replyComment.setContent("回复评论");
+        replyComment.setParentId(1L); // 回复给评论ID为1的评论
+
+        when(postCommentService.insertPostComment(any(PostComment.class))).thenReturn(1);
+        when(postService.updatePostComments(eq(1L), eq(1))).thenReturn(1);
+
+        mockMvc.perform(post("/post/comment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(replyComment)))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).insertPostComment(any(PostComment.class));
+        verify(postService, times(1)).updatePostComments(eq(1L), eq(1));
+    }
+
+    /**
+     * 测试删除不存在的评论
+     */
+    @Test
+    void testDeleteNonExistentComment() throws Exception {
+        when(postCommentService.selectPostCommentById(999L)).thenReturn(null);
+        when(postCommentService.deletePostCommentByIds(any())).thenReturn(0);
+
+        mockMvc.perform(delete("/post/comment/{commentIds}", "999"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectPostCommentById(999L);
+        verify(postCommentService, times(1)).deletePostCommentByIds(any());
+        verify(postService, never()).updatePostComments(any(), anyInt());
+    }
+
+    /**
+     * 测试批量删除评论
+     */
+    @Test
+    void testBatchDeleteComments() throws Exception {
+        PostComment comment1 = new PostComment();
+        comment1.setCommentId(1L);
+        comment1.setPostId(1L);
+        comment1.setParentId(0L);
+
+        PostComment comment2 = new PostComment();
+        comment2.setCommentId(2L);
+        comment2.setPostId(1L);
+        comment2.setParentId(0L);
+
+        when(postCommentService.selectPostCommentById(1L)).thenReturn(comment1);
+        when(postCommentService.selectPostCommentById(2L)).thenReturn(comment2);
+        when(postCommentService.selectCommentsByParentId(1L)).thenReturn(new ArrayList<>());
+        when(postCommentService.selectCommentsByParentId(2L)).thenReturn(new ArrayList<>());
+        when(postCommentService.deletePostCommentByIds(any())).thenReturn(2);
+        when(postService.updatePostComments(eq(1L), eq(-1))).thenReturn(1);
+
+        mockMvc.perform(delete("/post/comment/{commentIds}", "1,2"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectPostCommentById(1L);
+        verify(postCommentService, times(1)).selectPostCommentById(2L);
+        verify(postCommentService, times(1)).deletePostCommentByIds(any());
+        verify(postService, times(2)).updatePostComments(eq(1L), eq(-1));
+    }
+
+    /**
+     * 测试添加空内容评论（应该返回验证错误）
+     */
+    @Test
+    void testAddEmptyContentComment() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setPostId(1L);
+        comment.setContent(""); // 空内容
+
+        mockMvc.perform(post("/post/comment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(comment)))
+                .andExpect(status().isBadRequest());
+
+        verify(postCommentService, never()).insertPostComment(any(PostComment.class));
+    }
+
+    /**
+     * 测试更新评论状态
+     */
+    @Test
+    void testUpdateCommentStatus() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setCommentId(1L);
+        comment.setStatus("0");
+        comment.setContent("有效内容");
+
+        when(postCommentService.updatePostComment(any(PostComment.class))).thenReturn(1);
+
+        mockMvc.perform(put("/post/comment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(comment)))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).updatePostComment(any(PostComment.class));
+    }
+
+    /**
+     * 测试获取不存在评论的详情
+     */
+    @Test
+    void testGetNonExistentCommentInfo() throws Exception {
+        when(postCommentService.selectPostCommentById(999L)).thenReturn(null);
+
+        mockMvc.perform(get("/post/comment/{commentId}", 999L))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).selectPostCommentById(999L);
+    }
+
+    /**
+     * 测试编辑不存在的评论
+     */
+    @Test
+    void testEditNonExistentComment() throws Exception {
+        PostComment comment = new PostComment();
+        comment.setCommentId(999L);
+        comment.setContent("不存在的评论");
+
+        when(postCommentService.updatePostComment(any(PostComment.class))).thenReturn(0);
+
+        mockMvc.perform(put("/post/comment")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(comment)))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).updatePostComment(any(PostComment.class));
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostControllerTest.java
new file mode 100644
index 0000000..34b2992
--- /dev/null
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostControllerTest.java
@@ -0,0 +1,406 @@
+package com.ruoyi.web.controller.post;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.web.controller.post.controller.PostController;
+import com.ruoyi.web.controller.post.domain.Post;
+import com.ruoyi.web.controller.post.domain.PostComment;
+import com.ruoyi.web.controller.post.domain.PostFavorite;
+import com.ruoyi.web.controller.post.domain.PostReport;
+import com.ruoyi.web.controller.post.domain.PostTag;
+import com.ruoyi.web.controller.post.service.IPostService;
+import com.ruoyi.web.controller.post.service.IPostTagService;
+import com.ruoyi.web.controller.post.service.IPostCommentService;
+import com.ruoyi.web.controller.post.service.IPostFavoriteService;
+import com.ruoyi.web.controller.post.mapper.PostReportMapper;
+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.MediaType;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+/**
+ * PostController 单元测试
+ * 
+ * 测试覆盖所有帖子管理相关的API接口
+ * 包括：帖子列表、详情、增删改查、审核、导出等功能
+ */
+@ExtendWith(MockitoExtension.class)
+class PostControllerTest {
+
+    @Mock
+    private IPostService postService;
+
+    @Mock
+    private IPostTagService postTagService;
+
+    @Mock
+    private IPostCommentService postCommentService;
+
+    @Mock
+    private IPostFavoriteService postFavoriteService;
+
+    @Mock
+    private PostReportMapper postReportMapper;
+
+    @InjectMocks
+    private PostController postController;
+
+    private MockMvc mockMvc;
+    private ObjectMapper objectMapper;
+
+    @BeforeEach
+    void setUp() {
+        // 创建模拟的安全上下文
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(1L);
+        sysUser.setUserName("testUser");
+        
+        LoginUser loginUser = new LoginUser(1L, 1L, sysUser, new HashSet<>());
+        
+        UsernamePasswordAuthenticationToken authToken = 
+            new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
+        SecurityContextHolder.getContext().setAuthentication(authToken);
+        
+        mockMvc = MockMvcBuilders.standaloneSetup(postController).build();
+        objectMapper = new ObjectMapper();
+    }
+
+    /**
+     * 测试获取帖子列表
+     */
+    @Test
+    void testGetPostList() throws Exception {
+        List<Post> posts = new ArrayList<>();
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setTitle("测试帖子");
+        posts.add(post);
+
+        when(postService.selectPostList(any(Post.class))).thenReturn(posts);
+
+        mockMvc.perform(get("/post/list"))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostList(any(Post.class));
+    }
+
+    /**
+     * 测试获取帖子详情
+     */
+    @Test
+    void testGetPostInfo() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setTitle("测试帖子");
+        post.setAuthorId(1L);
+        post.setTags("测试标签");
+
+        when(postService.updatePostViews(1L)).thenReturn(1);
+        when(postService.selectPostById(1L)).thenReturn(post);
+        when(postTagService.selectPostTagsByPostId(1L)).thenReturn(new ArrayList<>());
+        when(postCommentService.selectPostCommentList(any())).thenReturn(new ArrayList<>());
+        when(postService.selectAuthorOtherPosts(eq(1L), eq(1L), eq(3))).thenReturn(new ArrayList<>());
+        when(postService.selectSimilarTagsPosts(eq("测试标签"), eq(1L), eq(3))).thenReturn(new ArrayList<>());
+        when(postFavoriteService.selectPostFavoriteByPostIdAndUserId(eq(1L), eq(1L))).thenReturn(null);
+
+        mockMvc.perform(get("/post/{postId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostById(1L);
+        verify(postService, times(1)).updatePostViews(1L);
+    }
+
+    /**
+     * 测试添加帖子
+     */
+    @Test
+    void testAddPost() throws Exception {
+        Post post = new Post();
+        post.setTitle("新帖子");
+        post.setContent("帖子内容");
+
+        when(postService.insertPost(any(Post.class))).thenReturn(1);
+
+        mockMvc.perform(post("/post")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(post)))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).insertPost(any(Post.class));
+    }
+
+    /**
+     * 测试编辑帖子
+     */
+    @Test
+    void testEditPost() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setTitle("编辑后的帖子");
+
+        when(postService.updatePost(any(Post.class))).thenReturn(1);
+        when(postTagService.deletePostTagRelation(1L)).thenReturn(1);
+
+        mockMvc.perform(put("/post")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(post)))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).updatePost(any(Post.class));
+    }
+
+    /**
+     * 测试删除帖子
+     */
+    @Test
+    void testDeletePost() throws Exception {
+        when(postCommentService.deletePostCommentByPostId(1L)).thenReturn(1);
+        when(postFavoriteService.deletePostFavoriteByPostId(1L)).thenReturn(1);
+        when(postTagService.deletePostTagRelation(1L)).thenReturn(1);
+        when(postService.deletePostByIds(any())).thenReturn(1);
+
+        mockMvc.perform(delete("/post/{postIds}", "1"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).deletePostCommentByPostId(1L);
+        verify(postFavoriteService, times(1)).deletePostFavoriteByPostId(1L);
+        verify(postTagService, times(1)).deletePostTagRelation(1L);
+        verify(postService, times(1)).deletePostByIds(any());
+    }
+
+    /**
+     * 测试导出帖子
+     */
+    @Test
+    void testExportPosts() throws Exception {
+        List<Post> posts = new ArrayList<>();
+        when(postService.selectPostList(any(Post.class))).thenReturn(posts);
+
+        mockMvc.perform(post("/post/export"))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostList(any(Post.class));
+    }
+
+    /**
+     * 测试收藏帖子
+     */
+    @Test
+    void testFavoritePost() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setTitle("测试帖子");
+
+        when(postService.selectPostById(1L)).thenReturn(post);
+        when(postFavoriteService.selectPostFavoriteByPostIdAndUserId(eq(1L), eq(1L))).thenReturn(null);
+        when(postFavoriteService.insertPostFavorite(any())).thenReturn(1);
+        when(postService.updatePostFavorites(eq(1L), eq(1))).thenReturn(1);
+
+        mockMvc.perform(post("/post/favorite/{postId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostById(1L);
+        verify(postFavoriteService, times(1)).insertPostFavorite(any());
+    }
+
+    /**
+     * 测试获取收藏列表
+     */
+    @Test
+    void testGetFavoriteList() throws Exception {
+        List<PostFavorite> favorites = new ArrayList<>();
+        when(postFavoriteService.selectPostFavoriteList(any())).thenReturn(favorites);
+
+        mockMvc.perform(get("/post/favorite/list"))
+                .andExpect(status().isOk());
+
+        verify(postFavoriteService, times(1)).selectPostFavoriteList(any());
+    }
+
+    /**
+     * 测试获取待审核帖子列表
+     */
+    @Test
+    void testGetReviewList() throws Exception {
+        List<Post> posts = new ArrayList<>();
+        when(postService.selectPostList(any())).thenReturn(posts);
+
+        mockMvc.perform(get("/post/review/list"))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostList(any());
+    }
+
+    /**
+     * 测试审核通过帖子
+     */
+    @Test
+    void testReviewPostApprove() throws Exception {
+        Post post = new Post();
+        post.setPostId(1L);
+        post.setStatus("0");
+
+        when(postService.selectPostById(1L)).thenReturn(post);
+        when(postService.updatePost(any())).thenReturn(1);
+
+        String requestBody = "{\"action\":\"approve\",\"reason\":\"审核通过\"}";
+
+        mockMvc.perform(put("/post/review/{postId}", 1L)
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(requestBody))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostById(1L);
+        verify(postService, times(1)).updatePost(any());
+    }
+
+    /**
+     * 测试获取举报列表
+     */
+    @Test
+    void testGetReportList() throws Exception {
+        List<PostReport> reports = new ArrayList<>();
+        when(postReportMapper.selectPostReportList(any())).thenReturn(reports);
+
+        mockMvc.perform(get("/post/report/list"))
+                .andExpect(status().isOk());
+
+        verify(postReportMapper, times(1)).selectPostReportList(any());
+    }
+
+    /**
+     * 测试获取帖子详情（帖子不存在）
+     */
+    @Test 
+    void testGetNonExistentPostInfo() throws Exception {
+        when(postService.selectPostById(999L)).thenReturn(null);
+        when(postService.updatePostViews(999L)).thenReturn(0);
+
+        // 控制器现在会检查post是否为null并返回错误
+        mockMvc.perform(get("/post/{postId}", 999L))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostById(999L);
+        verify(postService, times(1)).updatePostViews(999L);
+    }
+
+    /**
+     * 测试编辑不存在的帖子
+     */
+    @Test
+    void testEditNonExistentPost() throws Exception {
+        Post post = new Post();
+        post.setPostId(999L);
+        post.setTitle("不存在的帖子");
+
+        when(postService.updatePost(any(Post.class))).thenReturn(0);
+        when(postTagService.deletePostTagRelation(999L)).thenReturn(0);
+
+        mockMvc.perform(put("/post")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(post)))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).updatePost(any(Post.class));
+    }
+
+    /**
+     * 测试删除不存在的帖子
+     */
+    @Test
+    void testDeleteNonExistentPost() throws Exception {
+        when(postCommentService.deletePostCommentByPostId(999L)).thenReturn(0);
+        when(postFavoriteService.deletePostFavoriteByPostId(999L)).thenReturn(0);
+        when(postTagService.deletePostTagRelation(999L)).thenReturn(0);
+        when(postService.deletePostByIds(any())).thenReturn(0);
+
+        mockMvc.perform(delete("/post/{postIds}", "999"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).deletePostCommentByPostId(999L);
+        verify(postFavoriteService, times(1)).deletePostFavoriteByPostId(999L);
+        verify(postService, times(1)).deletePostByIds(any());
+    }
+
+    /**
+     * 测试审核不存在的帖子
+     */
+    @Test
+    void testReviewNonExistentPost() throws Exception {
+        when(postService.selectPostById(999L)).thenReturn(null);
+
+        String requestBody = "{\"action\":\"approve\",\"reason\":\"审核通过\"}";
+
+        mockMvc.perform(put("/post/review/{postId}", 999L)
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(requestBody))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).selectPostById(999L);
+        verify(postService, never()).updatePost(any());
+    }
+
+    /**
+     * 测试添加带标签的帖子
+     */
+    @Test
+    void testAddPostWithTags() throws Exception {
+        Post post = new Post();
+        post.setTitle("带标签的帖子");
+        post.setContent("内容");
+        post.setTags("Java,Spring");
+        post.setPostId(1L); // 模拟插入后的ID
+
+        when(postService.insertPost(any(Post.class))).thenReturn(1);
+        when(postTagService.selectPostTagList(any(PostTag.class))).thenReturn(new ArrayList<>());
+        when(postTagService.insertPostTag(any(PostTag.class))).thenReturn(1);
+        when(postTagService.batchInsertPostTagRelation(eq(1L), any())).thenReturn(1);
+
+        mockMvc.perform(post("/post")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(post)))
+                .andExpect(status().isOk());
+
+        verify(postService, times(1)).insertPost(any(Post.class));
+    }
+
+    /**
+     * 测试批量删除帖子
+     */
+    @Test
+    void testBatchDeletePosts() throws Exception {
+        when(postCommentService.deletePostCommentByPostId(1L)).thenReturn(1);
+        when(postCommentService.deletePostCommentByPostId(2L)).thenReturn(1);
+        when(postFavoriteService.deletePostFavoriteByPostId(1L)).thenReturn(1);
+        when(postFavoriteService.deletePostFavoriteByPostId(2L)).thenReturn(1);
+        when(postTagService.deletePostTagRelation(1L)).thenReturn(1);
+        when(postTagService.deletePostTagRelation(2L)).thenReturn(1);
+        when(postService.deletePostByIds(any())).thenReturn(2);
+
+        mockMvc.perform(delete("/post/{postIds}", "1,2"))
+                .andExpect(status().isOk());
+
+        verify(postCommentService, times(1)).deletePostCommentByPostId(1L);
+        verify(postCommentService, times(1)).deletePostCommentByPostId(2L);
+        verify(postFavoriteService, times(1)).deletePostFavoriteByPostId(1L);
+        verify(postFavoriteService, times(1)).deletePostFavoriteByPostId(2L);
+        verify(postService, times(1)).deletePostByIds(any());
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostTagControllerTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostTagControllerTest.java
new file mode 100644
index 0000000..a2f3fbb
--- /dev/null
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/controller/post/PostTagControllerTest.java
@@ -0,0 +1,383 @@
+package com.ruoyi.web.controller.post;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.web.controller.post.controller.PostTagController;
+import com.ruoyi.web.controller.post.domain.PostTag;
+import com.ruoyi.web.controller.post.service.IPostTagService;
+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.MediaType;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+import static org.mockito.Mockito.lenient;
+
+/**
+ * PostTagController 单元测试
+ * 
+ * 测试覆盖所有标签管理相关的API接口
+ * 包括：标签列表、详情、增删改查、导出等功能
+ */
+@ExtendWith(MockitoExtension.class)
+class PostTagControllerTest {
+
+    @Mock
+    private IPostTagService postTagService;
+
+    @InjectMocks
+    private PostTagController postTagController;
+
+    private MockMvc mockMvc;
+    private ObjectMapper objectMapper;
+
+    @BeforeEach
+    void setUp() {
+        // 创建模拟的安全上下文
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(1L);
+        sysUser.setUserName("testUser");
+        
+        LoginUser loginUser = new LoginUser(1L, 1L, sysUser, new HashSet<>());
+        
+        UsernamePasswordAuthenticationToken authToken = 
+            new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
+        SecurityContextHolder.getContext().setAuthentication(authToken);
+        
+        mockMvc = MockMvcBuilders.standaloneSetup(postTagController).build();
+        objectMapper = new ObjectMapper();
+    }
+
+    /**
+     * 测试获取标签列表
+     */
+    @Test
+    void testGetTagList() throws Exception {
+        List<PostTag> tags = new ArrayList<>();
+        PostTag tag = new PostTag();
+        tag.setTagId(1L);
+        tag.setTagName("测试标签");
+        tags.add(tag);
+
+        when(postTagService.selectPostTagList(any(PostTag.class))).thenReturn(tags);
+
+        mockMvc.perform(get("/post/tag/list"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagList(any(PostTag.class));
+    }
+
+    /**
+     * 测试获取标签详情
+     */
+    @Test
+    void testGetTagInfo() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagId(1L);
+        tag.setTagName("测试标签");
+
+        when(postTagService.selectPostTagById(1L)).thenReturn(tag);
+
+        mockMvc.perform(get("/post/tag/{tagId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagById(1L);
+    }
+
+    /**
+     * 测试添加标签
+     */
+    @Test
+    void testAddTag() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagName("新标签");
+
+        when(postTagService.checkTagNameUnique(any())).thenReturn(true);
+        when(postTagService.insertPostTag(any(PostTag.class))).thenReturn(1);
+
+        mockMvc.perform(post("/post/tag")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(tag)))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).checkTagNameUnique(any());
+        verify(postTagService, times(1)).insertPostTag(any(PostTag.class));
+    }
+
+    /**
+     * 测试编辑标签
+     */
+    @Test
+    void testEditTag() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagId(1L);
+        tag.setTagName("编辑后的标签");
+
+        when(postTagService.checkTagNameUnique(any())).thenReturn(true);
+        when(postTagService.updatePostTag(any(PostTag.class))).thenReturn(1);
+
+        mockMvc.perform(put("/post/tag")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(tag)))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).checkTagNameUnique(any());
+        verify(postTagService, times(1)).updatePostTag(any(PostTag.class));
+    }
+
+    /**
+     * 测试删除标签
+     */
+    @Test
+    void testDeleteTag() throws Exception {
+        when(postTagService.deletePostTagByIds(any())).thenReturn(1);
+
+        mockMvc.perform(delete("/post/tag/{tagIds}", "1"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).deletePostTagByIds(any());
+    }
+
+    /**
+     * 测试批量删除标签
+     */
+    @Test
+    void testBatchDeleteTags() throws Exception {
+        when(postTagService.deletePostTagByIds(any())).thenReturn(2);
+
+        mockMvc.perform(delete("/post/tag/{tagIds}", "1,2"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).deletePostTagByIds(any());
+    }
+
+    /**
+     * 测试导出标签
+     */
+    @Test
+    void testExportTags() throws Exception {
+        List<PostTag> tags = new ArrayList<>();
+        when(postTagService.selectPostTagList(any(PostTag.class))).thenReturn(tags);
+
+        mockMvc.perform(post("/post/tag/export"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagList(any(PostTag.class));
+    }
+
+    /**
+     * 测试根据帖子ID获取标签列表
+     */
+    @Test
+    void testListByPostId() throws Exception {
+        List<PostTag> tags = new ArrayList<>();
+        when(postTagService.selectPostTagsByPostId(1L)).thenReturn(tags);
+
+        mockMvc.perform(get("/post/tag/list/{postId}", 1L))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagsByPostId(1L);
+    }
+
+    /**
+     * 测试获取可用标签选项
+     */
+    @Test
+    void testOptionSelect() throws Exception {
+        List<PostTag> tags = new ArrayList<>();
+        PostTag tag = new PostTag();
+        tag.setTagId(1L);
+        tag.setTagName("可用标签");
+        tag.setStatus("0");
+        tags.add(tag);
+
+        when(postTagService.selectPostTagList(any(PostTag.class))).thenReturn(tags);
+
+        mockMvc.perform(get("/post/tag/optionselect"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagList(any(PostTag.class));
+    }
+
+    /**
+     * 测试获取不存在的标签详情
+     */
+    @Test
+    void testGetNonExistentTagInfo() throws Exception {
+        when(postTagService.selectPostTagById(999L)).thenReturn(null);
+
+        mockMvc.perform(get("/post/tag/{tagId}", 999L))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagById(999L);
+    }
+
+    /**
+     * 测试编辑不存在的标签
+     */
+    @Test
+    void testEditNonExistentTag() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagId(999L);
+        tag.setTagName("不存在的标签");
+
+        when(postTagService.checkTagNameUnique(any())).thenReturn(true);
+        when(postTagService.updatePostTag(any(PostTag.class))).thenReturn(0);
+
+        mockMvc.perform(put("/post/tag")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(tag)))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).updatePostTag(any(PostTag.class));
+    }
+
+    /**
+     * 测试删除不存在的标签
+     */
+    @Test
+    void testDeleteNonExistentTag() throws Exception {
+        when(postTagService.deletePostTagByIds(any())).thenReturn(0);
+
+        mockMvc.perform(delete("/post/tag/{tagIds}", "999"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).deletePostTagByIds(any());
+    }
+
+    /**
+     * 测试添加重复标签名
+     */
+    @Test
+    void testAddDuplicateTagName() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagName("重复标签");
+
+        when(postTagService.checkTagNameUnique(any())).thenReturn(false);
+
+        mockMvc.perform(post("/post/tag")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(tag)))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).checkTagNameUnique(any());
+        verify(postTagService, never()).insertPostTag(any());
+    }
+
+    /**
+     * 测试编辑为重复标签名
+     */
+    @Test
+    void testEditToDuplicateTagName() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagId(1L);
+        tag.setTagName("重复标签");
+
+        when(postTagService.checkTagNameUnique(any())).thenReturn(false);
+
+        mockMvc.perform(put("/post/tag")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(tag)))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).checkTagNameUnique(any());
+        verify(postTagService, never()).updatePostTag(any());
+    }
+
+    /**
+     * 测试添加标签失败
+     */
+    @Test
+    void testAddTagFailed() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagName("新标签");
+
+        when(postTagService.checkTagNameUnique(any())).thenReturn(true);
+        when(postTagService.insertPostTag(any(PostTag.class))).thenReturn(0);
+
+        mockMvc.perform(post("/post/tag")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(tag)))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).checkTagNameUnique(any());
+        verify(postTagService, times(1)).insertPostTag(any(PostTag.class));
+    }
+
+    /**
+     * 测试编辑标签失败
+     */
+    @Test
+    void testEditTagFailed() throws Exception {
+        PostTag tag = new PostTag();
+        tag.setTagId(1L);
+        tag.setTagName("编辑后的标签");
+
+        when(postTagService.checkTagNameUnique(any())).thenReturn(true);
+        when(postTagService.updatePostTag(any(PostTag.class))).thenReturn(0);
+
+        mockMvc.perform(put("/post/tag")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(objectMapper.writeValueAsString(tag)))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).checkTagNameUnique(any());
+        verify(postTagService, times(1)).updatePostTag(any(PostTag.class));
+    }
+
+    /**
+     * 测试删除标签失败
+     */
+    @Test
+    void testDeleteTagFailed() throws Exception {
+        when(postTagService.deletePostTagByIds(any())).thenReturn(0);
+
+        mockMvc.perform(delete("/post/tag/{tagIds}", "1"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).deletePostTagByIds(any());
+    }
+
+    /**
+     * 测试获取空的标签列表
+     */
+    @Test
+    void testGetEmptyTagList() throws Exception {
+        List<PostTag> tags = new ArrayList<>();
+        when(postTagService.selectPostTagList(any(PostTag.class))).thenReturn(tags);
+
+        mockMvc.perform(get("/post/tag/list"))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagList(any(PostTag.class));
+    }
+
+    /**
+     * 测试根据不存在的帖子ID获取标签列表
+     */
+    @Test
+    void testListByNonExistentPostId() throws Exception {
+        List<PostTag> tags = new ArrayList<>();
+        when(postTagService.selectPostTagsByPostId(999L)).thenReturn(tags);
+
+        mockMvc.perform(get("/post/tag/list/{postId}", 999L))
+                .andExpect(status().isOk());
+
+        verify(postTagService, times(1)).selectPostTagsByPostId(999L);
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/upload/images/.gitkeep b/ruoyi-admin/upload/images/.gitkeep
new file mode 100644
index 0000000..f3f3088
--- /dev/null
+++ b/ruoyi-admin/upload/images/.gitkeep
@@ -0,0 +1,2 @@
+# This file ensures the images directory is tracked by git
+# Directory for storing uploaded post images 
\ No newline at end of file
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 2b8c2c0..a746e6d 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -121,4 +121,16 @@
 
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
index 29281cf..34dde33 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
@@ -24,6 +24,9 @@
     /** 上传路径 */
     private static String profile;
 
+    /** 前端项目图片路径 */
+    private static String frontendImagePath;
+
     /** 获取地址开关 */
     private static boolean addressEnabled;
 
@@ -70,6 +73,16 @@
         RuoYiConfig.profile = profile;
     }
 
+    public static String getFrontendImagePath()
+    {
+        return frontendImagePath;
+    }
+
+    public void setFrontendImagePath(String frontendImagePath)
+    {
+        RuoYiConfig.frontendImagePath = frontendImagePath;
+    }
+
     public static boolean isAddressEnabled()
     {
         return addressEnabled;
@@ -119,4 +132,12 @@
     {
         return getProfile() + "/upload";
     }
+
+    /**
+     * 获取前端图片上传路径
+     */
+    public static String getFrontendImageUploadPath()
+    {
+        return getFrontendImagePath();
+    }
 }
diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml
index 17cf509..0f21573 100644
--- a/ruoyi-framework/pom.xml
+++ b/ruoyi-framework/pom.xml
@@ -61,4 +61,16 @@
 
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
index 74fb93e..20c1a01 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
@@ -1,6 +1,7 @@
 package com.ruoyi.framework.config;
 
 import java.util.concurrent.TimeUnit;
+import java.nio.file.Paths;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -33,6 +34,17 @@
         registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
                 .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/");
 
+        /** 帖子图片上传路径 - 使用配置文件中的相对路径 */
+        String frontendImagePath = RuoYiConfig.getFrontendImagePath();
+        if (frontendImagePath != null) {
+            // 获取项目根目录的绝对路径
+            String projectRoot = System.getProperty("user.dir");
+            String absoluteImagePath = Paths.get(projectRoot, frontendImagePath).toString();
+            
+            registry.addResourceHandler("/images/**")
+                    .addResourceLocations("file:" + absoluteImagePath + "/");
+        }
+
         /** swagger配置 */
         registry.addResourceHandler("/swagger-ui/**")
                 .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml
index 69ab1d9..b5ab669 100644
--- a/ruoyi-generator/pom.xml
+++ b/ruoyi-generator/pom.xml
@@ -43,4 +43,16 @@
 
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/ruoyi-quartz/pom.xml b/ruoyi-quartz/pom.xml
index a6d75e4..0a7cc04 100644
--- a/ruoyi-quartz/pom.xml
+++ b/ruoyi-quartz/pom.xml
@@ -43,4 +43,16 @@
 
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index 8f65273..e0af348 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -25,4 +25,16 @@
 
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
