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
index e05e55e..9df8f03 100644
--- 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
@@ -430,7 +430,11 @@
         int result = postService.insertPost(post);
         
         if (result > 0) {
-            return success("帖子发布成功，等待管理员审核");
+            // 返回新创建的帖子信息，包含postId
+            Map<String, Object> data = new HashMap<>();
+            data.put("postId", post.getPostId());
+            data.put("message", "帖子发布成功，等待管理员审核");
+            return success(data);
         } else {
             return error("帖子发布失败");
         }
@@ -593,20 +597,38 @@
         }
         
         try {
-            // 级联删除相关数据
-            // 1. 删除帖子评论
-            postCommentService.deletePostCommentByPostId(postId);
-            
-            // 2. 删除帖子收藏记录
-            postFavoriteService.deletePostFavoriteByPostId(postId);
-            
-            // 3. 删除帖子本身
-        int result = postService.deletePostById(postId);
-        
-        if (result > 0) {
-            return success("帖子删除成功");
-        } else {
-            return error("帖子删除失败");
+            // 如果是草稿帖子（状态为待审核"0"），直接删除，无需级联删除
+            if ("0".equals(existingPost.getStatus())) {
+                // 删除相关支付记录（如果有）
+                postPaymentMapper.deletePostPaymentByPostId(postId);
+                
+                // 直接删除帖子
+                int result = postService.deletePostById(postId);
+                
+                if (result > 0) {
+                    return success("草稿帖子删除成功");
+                } else {
+                    return error("草稿帖子删除失败");
+                }
+            } else {
+                // 对于已发布的帖子，进行级联删除
+                // 1. 删除帖子评论
+                postCommentService.deletePostCommentByPostId(postId);
+                
+                // 2. 删除帖子收藏记录
+                postFavoriteService.deletePostFavoriteByPostId(postId);
+                
+                // 3. 删除支付记录
+                postPaymentMapper.deletePostPaymentByPostId(postId);
+                
+                // 4. 删除帖子本身
+                int result = postService.deletePostById(postId);
+                
+                if (result > 0) {
+                    return success("帖子删除成功");
+                } else {
+                    return error("帖子删除失败");
+                }
             }
         } catch (Exception e) {
             return error("删除失败：" + e.getMessage());
@@ -883,6 +905,12 @@
             return error("只能为自己的帖子购买推广");
         }
         
+        // 检查该帖子是否已有有效的推广支付记录
+        PostPayment existingPayment = postPaymentMapper.selectLatestPaymentByPostId(request.getPostId());
+        if (existingPayment != null && "paid".equals(existingPayment.getPaymentStatus())) {
+            return error("该帖子已购买推广服务");
+        }
+        
         // 创建支付记录
         PostPayment payment = new PostPayment();
         payment.setPostId(request.getPostId());
@@ -979,19 +1007,23 @@
         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("支付成功，推广已生效");
+        // 更新帖子的推广计划ID（不管是新帖子还是现有帖子都要更新）
+        if (payment.getPostId() != null && payment.getPostId() > 0) {
+            Post updatePost = new Post();
+            updatePost.setPostId(payment.getPostId());
+            updatePost.setPromotionPlanId(payment.getPlanId());
+            updatePost.setUpdateBy(getUsername());
+            
+            int result = postService.updatePost(updatePost);
+            
+            if (result <= 0) {
+                return error("支付确认失败：无法更新帖子推广信息");
+            }
         } else {
-            return error("支付确认失败");
+            return error("支付记录中的帖子ID无效");
         }
+        
+        return success("支付成功，推广已生效");
     }
 
     /**
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
index 538338c..fe39d3f 100644
--- 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
@@ -73,4 +73,12 @@
      * @return 结果
      */
     public int deletePostPaymentByIds(Long[] paymentIds);
+
+    /**
+     * 根据帖子ID删除支付记录
+     * 
+     * @param postId 帖子ID
+     * @return 结果
+     */
+    public int deletePostPaymentByPostId(Long postId);
 } 
\ 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
index c12dc2e..5c93b35 100644
--- a/ruoyi-admin/src/main/resources/mapper/post/PostPaymentMapper.xml
+++ b/ruoyi-admin/src/main/resources/mapper/post/PostPaymentMapper.xml
@@ -101,4 +101,8 @@
         </foreach>
     </delete>
     
+    <delete id="deletePostPaymentByPostId" parameterType="Long">
+        delete from post_payment where post_id = #{postId}
+    </delete>
+    
 </mapper> 
\ No newline at end of file
