diff --git a/src/main/java/com/pt5/pthouduan/controller/CommentController.java b/src/main/java/com/pt5/pthouduan/controller/CommentController.java
new file mode 100644
index 0000000..ae80c30
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/controller/CommentController.java
@@ -0,0 +1,71 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Comment;
+import com.pt5.pthouduan.service.CommentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.stereotype.Controller;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  评论前端控制器
+ * </p>
+ *
+ * 功能：增、删、改、查（按帖子ID）
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+@CrossOrigin(origins = "http://localhost:5173")
+@Controller
+@RequestMapping("/comment")
+public class CommentController {
+
+    @Autowired
+    private CommentService commentService;
+
+    // 创建评论
+    @PostMapping("/create")
+    @ResponseBody
+    public Comment createComment(@RequestBody Comment comment) {
+    System.out.println("Received comment: " + comment);  // 输出接收到的评论数据
+    return commentService.createComment(comment);
+}
+
+    // 删除评论（根据commentid）
+    @DeleteMapping("/delete/{commentid}")
+    @ResponseBody
+    public boolean deleteComment(@PathVariable Integer commentid) {
+        return commentService.deleteComment(commentid);
+    }
+
+    // 更新评论
+    @PutMapping("/update")
+    @ResponseBody
+    public boolean updateComment(@RequestBody Comment comment) {
+        return commentService.updateComment(comment);
+    }
+
+    // 获取某个帖子的所有评论
+    @GetMapping("/post/{postid}")
+    @ResponseBody
+    public List<Comment> getCommentsByPostId(@PathVariable Integer postid) {
+        return commentService.getCommentsByPostId(postid);
+    }
+
+    // 点赞评论
+    @PostMapping("/like/{commentid}")
+    @ResponseBody
+    public boolean likeComment(@PathVariable Integer commentid) {
+        return commentService.likeComment(commentid);
+    }
+
+    // 取消点赞评论
+    @PostMapping("/unlike/{commentid}")
+    @ResponseBody
+    public boolean unlikeComment(@PathVariable Integer commentid) {
+        return commentService.unlikeComment(commentid);
+    }
+}
diff --git a/src/main/java/com/pt5/pthouduan/entity/Comment.java b/src/main/java/com/pt5/pthouduan/entity/Comment.java
index 6b96288..6f56a68 100644
--- a/src/main/java/com/pt5/pthouduan/entity/Comment.java
+++ b/src/main/java/com/pt5/pthouduan/entity/Comment.java
@@ -11,7 +11,7 @@
  * 
  * </p>
  *
- * @author ljx
+ * @author ym
  * @since 2025-04-14
  */
 @TableName("comment")
@@ -20,7 +20,11 @@
     private static final long serialVersionUID = 1L;
 
     @TableId("commentid")
-    private String commentid;
+    private Integer commentid;
+
+    private Integer likes;
+
+    private Long userid;
 
     private Integer postid;
 
@@ -28,14 +32,23 @@
 
     private LocalDateTime commenttime;
 
-    public String getCommentid() {
+    public Integer getCommentid() {
         return commentid;
     }
 
-    public void setCommentid(String commentid) {
+    public void setCommentid(Integer commentid) {
         this.commentid = commentid;
     }
 
+
+    public Long getUserid() {
+        return userid;
+    }
+
+    public void setUserid(Long userid) {
+        this.userid = userid;
+    }
+
     public Integer getPostid() {
         return postid;
     }
@@ -44,6 +57,14 @@
         this.postid = postid;
     }
 
+    public Integer getLikes() {
+        return likes;
+    }
+
+    public void setLikes(Integer likes) {
+        this.likes = likes;
+    }
+
     public String getPostCommentcontent() {
         return postCommentcontent;
     }
@@ -64,6 +85,7 @@
     public String toString() {
         return "Comment{" +
         "commentid = " + commentid +
+                ", userid = " + userid +
         ", postid = " + postid +
         ", postCommentcontent = " + postCommentcontent +
         ", commenttime = " + commenttime +
diff --git a/src/main/java/com/pt5/pthouduan/mapper/CommentMapper.java b/src/main/java/com/pt5/pthouduan/mapper/CommentMapper.java
index 755a2b5..d59e110 100644
--- a/src/main/java/com/pt5/pthouduan/mapper/CommentMapper.java
+++ b/src/main/java/com/pt5/pthouduan/mapper/CommentMapper.java
@@ -3,16 +3,39 @@
 import com.pt5.pthouduan.entity.Comment;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
- *  Mapper 接口
+ *  评论 Mapper 接口
  * </p>
  *
- * @author ljx
+ * 功能：增、删、改、查（按帖子ID）
+ *
+ * @author ym
  * @since 2025-04-14
  */
 @Mapper
 public interface CommentMapper extends BaseMapper<Comment> {
 
+    // 创建评论
+    void save(Comment comment);
+
+    // 根据评论ID删除
+    int deleteByCommentid(@Param("commentid") Integer commentid);
+
+    // 更新评论
+    int updateComment(Comment comment);
+
+    // 获取指定帖子下的所有评论
+    List<Comment> selectByPostid(@Param("postid") Integer postid);
+
+    // 点赞 +1
+    int incrementLikes(@Param("commentid") Integer commentid);
+
+    // 取消点赞 -1（最小为0）
+    int decrementLikes(@Param("commentid") Integer commentid);
+
 }
diff --git a/src/main/java/com/pt5/pthouduan/service/CommentService.java b/src/main/java/com/pt5/pthouduan/service/CommentService.java
new file mode 100644
index 0000000..c47d3a8
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/CommentService.java
@@ -0,0 +1,37 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.Comment;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评论服务接口
+ * </p>
+ *
+ * 功能：增、删、改、查（按帖子ID）
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+public interface CommentService {
+
+    // 创建评论
+    Comment createComment(Comment comment);
+
+    // 删除评论
+    boolean deleteComment(Integer commentid);
+
+    // 更新评论
+    boolean updateComment(Comment comment);
+
+    // 根据帖子ID获取所有评论
+    List<Comment> getCommentsByPostId(Integer postid);
+
+    // 点赞评论
+    boolean likeComment(Integer commentid);
+
+    // 取消点赞评论
+    boolean unlikeComment(Integer commentid);
+
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/impl/CommentServiceImpl.java b/src/main/java/com/pt5/pthouduan/service/impl/CommentServiceImpl.java
new file mode 100644
index 0000000..f817e3a
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/impl/CommentServiceImpl.java
@@ -0,0 +1,61 @@
+package com.pt5.pthouduan.service.impl;
+
+import com.pt5.pthouduan.entity.Comment;
+import com.pt5.pthouduan.mapper.CommentMapper;
+import com.pt5.pthouduan.service.CommentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评论服务实现类
+ * </p>
+ *
+ * 实现了评论的增删改查逻辑
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+@Service
+public class CommentServiceImpl implements CommentService {
+
+    @Autowired
+    private CommentMapper commentMapper;
+
+    @Override
+    public Comment createComment(Comment comment) {
+        commentMapper.save(comment);
+        return comment;
+    }
+
+    @Override
+    public boolean deleteComment(Integer commentid) {
+        return commentMapper.deleteByCommentid(commentid) > 0;
+    }
+
+    @Override
+    public boolean updateComment(Comment comment) {
+        return commentMapper.updateComment(comment) > 0;
+    }
+
+    @Override
+    public List<Comment> getCommentsByPostId(Integer postid) {
+        return commentMapper.selectByPostid(postid);
+    }
+
+
+    @Override
+    public boolean likeComment(Integer commentid) {
+        return commentMapper.incrementLikes(commentid) > 0;
+    }
+
+    @Override
+    public boolean unlikeComment(Integer commentid) {
+        return commentMapper.decrementLikes(commentid) > 0;
+
+    }
+
+
+}
diff --git a/src/main/resources/mapper/CommentMapper.xml b/src/main/resources/mapper/CommentMapper.xml
new file mode 100644
index 0000000..81e4581
--- /dev/null
+++ b/src/main/resources/mapper/CommentMapper.xml
@@ -0,0 +1,54 @@
+<?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.pt5.pthouduan.mapper.CommentMapper">
+
+    <!-- 创建评论 -->
+    <insert id="save" parameterType="com.pt5.pthouduan.entity.Comment">
+        INSERT INTO comment (commentid, userid, postid, post_commentcontent, commenttime)
+        VALUES (#{commentid}, #{userid}, #{postid}, #{postCommentcontent}, #{commenttime})
+    </insert>
+
+    <!-- 删除评论 -->
+    <delete id="deleteByCommentid" parameterType="int">
+        DELETE FROM comment WHERE commentid = #{commentid}
+    </delete>
+
+    <!-- 更新评论 -->
+    <update id="updateComment" parameterType="com.pt5.pthouduan.entity.Comment">
+        UPDATE comment
+        SET userid = #{userid},
+            postid = #{postid},
+            post_commentcontent = #{postCommentcontent},
+            commenttime = #{commenttime}
+        WHERE commentid = #{commentid}
+    </update>
+
+    <!-- 按帖子ID查询所有评论 -->
+    <select id="selectByPostid" parameterType="int" resultType="com.pt5.pthouduan.entity.Comment">
+        SELECT * FROM comment
+        WHERE postid = #{postid}
+        ORDER BY commenttime ASC
+    </select>
+
+    <!-- 点赞 +1 -->
+    <update id="incrementLikes" parameterType="int">
+        UPDATE comment
+        SET likes = likes + 1
+        WHERE commentid = #{commentid}
+    </update>
+
+    <!-- 取消点赞 -1（最小为0） -->
+    <update id="decrementLikes" parameterType="int">
+        UPDATE comment
+        SET likes = CASE
+                        WHEN likes > 0 THEN likes - 1
+                        ELSE 0
+            END
+        WHERE commentid = #{commentid}
+    </update>
+
+
+</mapper>
diff --git a/src/test/java/com/pt5/pthouduan/controller/CommentControllerTest.java b/src/test/java/com/pt5/pthouduan/controller/CommentControllerTest.java
new file mode 100644
index 0000000..055dacf
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/controller/CommentControllerTest.java
@@ -0,0 +1,127 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Comment;
+import com.pt5.pthouduan.service.CommentService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+class CommentControllerTest {
+
+    @Mock
+    private CommentService commentService;
+
+    @InjectMocks
+    private CommentController commentController;
+
+    private MockMvc mockMvc;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+        mockMvc = MockMvcBuilders.standaloneSetup(commentController).build();
+    }
+
+    @Test
+    void createComment_ShouldReturnCreatedComment() {
+        Comment inputComment = new Comment();
+        inputComment.setPostid(1);
+        inputComment.setUserid(100L);
+        inputComment.setPostCommentcontent("Test Comment");
+        inputComment.setCommenttime(LocalDateTime.now());
+
+        Comment savedComment = new Comment();
+        savedComment.setCommentid(1);
+        savedComment.setPostid(1);
+        savedComment.setUserid(100L);
+        savedComment.setPostCommentcontent("Test Comment");
+        savedComment.setCommenttime(inputComment.getCommenttime());
+
+        when(commentService.createComment(any(Comment.class))).thenReturn(savedComment);
+
+        Comment result = commentController.createComment(inputComment);
+
+        assertNotNull(result);
+        assertEquals("Test Comment", result.getPostCommentcontent());
+        assertEquals(100L, result.getUserid());
+    }
+
+    @Test
+    void deleteComment_ShouldReturnTrue_WhenSuccess() {
+        when(commentService.deleteComment(1)).thenReturn(true);
+
+        boolean result = commentController.deleteComment(1);
+
+        assertTrue(result);
+        verify(commentService).deleteComment(1);
+    }
+
+    @Test
+    void updateComment_ShouldReturnTrue_WhenSuccess() {
+        Comment updatedComment = new Comment();
+        updatedComment.setCommentid(1);
+        updatedComment.setPostCommentcontent("Updated content");
+
+        when(commentService.updateComment(any(Comment.class))).thenReturn(true);
+
+        boolean result = commentController.updateComment(updatedComment);
+
+        assertTrue(result);
+        verify(commentService).updateComment(updatedComment);
+    }
+
+    @Test
+    void getCommentsByPostId_ShouldReturnListOfComments() {
+        Comment comment1 = new Comment();
+        comment1.setCommentid(1);
+        comment1.setPostid(10);
+        comment1.setPostCommentcontent("Comment 1");
+
+        Comment comment2 = new Comment();
+        comment2.setCommentid(2);
+        comment2.setPostid(10);
+        comment2.setPostCommentcontent("Comment 2");
+
+        List<Comment> commentList = Arrays.asList(comment1, comment2);
+
+        when(commentService.getCommentsByPostId(10)).thenReturn(commentList);
+
+        List<Comment> result = commentController.getCommentsByPostId(10);
+
+        assertEquals(2, result.size());
+        assertEquals("Comment 1", result.get(0).getPostCommentcontent());
+    }
+
+    @Test
+    void likeComment_ShouldReturnTrue_WhenSuccess() {
+        when(commentService.likeComment(1)).thenReturn(true);
+
+        boolean result = commentController.likeComment(1);
+
+        assertTrue(result);
+        verify(commentService).likeComment(1);
+    }
+
+    @Test
+    void unlikeComment_ShouldReturnTrue_WhenSuccess() {
+        when(commentService.unlikeComment(1)).thenReturn(true);
+
+        boolean result = commentController.unlikeComment(1);
+
+        assertTrue(result);
+        verify(commentService).unlikeComment(1);
+    }
+}
diff --git a/src/test/java/com/pt5/pthouduan/service/CommentServiceTest.java b/src/test/java/com/pt5/pthouduan/service/CommentServiceTest.java
new file mode 100644
index 0000000..bfce395
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/service/CommentServiceTest.java
@@ -0,0 +1,100 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.Comment;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class CommentServiceTest {
+
+    @Mock
+    private CommentService commentService;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void createComment_ShouldReturnCreatedComment() {
+        Comment newComment = new Comment();
+        newComment.setUserid(1L);
+        newComment.setPostid(10);
+        newComment.setPostCommentcontent("这是一个评论");
+        newComment.setCommenttime(LocalDateTime.now());
+
+        when(commentService.createComment(any(Comment.class))).thenReturn(newComment);
+
+        Comment result = commentService.createComment(newComment);
+
+        assertNotNull(result);
+        assertEquals("这是一个评论", result.getPostCommentcontent());
+        verify(commentService).createComment(newComment);
+    }
+
+    @Test
+    void deleteComment_ShouldReturnTrue() {
+        when(commentService.deleteComment(1)).thenReturn(true);
+
+        boolean result = commentService.deleteComment(1);
+
+        assertTrue(result);
+        verify(commentService).deleteComment(1);
+    }
+
+    @Test
+    void updateComment_ShouldReturnTrue() {
+        Comment comment = new Comment();
+        comment.setCommentid(1);
+        comment.setPostCommentcontent("更新的评论");
+
+        when(commentService.updateComment(comment)).thenReturn(true);
+
+        boolean result = commentService.updateComment(comment);
+
+        assertTrue(result);
+        verify(commentService).updateComment(comment);
+    }
+
+    @Test
+    void getCommentsByPostId_ShouldReturnCommentsList() {
+        Comment comment = new Comment();
+        comment.setPostid(10);
+        comment.setPostCommentcontent("测试评论");
+
+        when(commentService.getCommentsByPostId(10)).thenReturn(Collections.singletonList(comment));
+
+        List<Comment> result = commentService.getCommentsByPostId(10);
+
+        assertEquals(1, result.size());
+        assertEquals("测试评论", result.get(0).getPostCommentcontent());
+    }
+
+    @Test
+    void likeComment_ShouldReturnTrue() {
+        when(commentService.likeComment(1)).thenReturn(true);
+
+        boolean result = commentService.likeComment(1);
+
+        assertTrue(result);
+        verify(commentService).likeComment(1);
+    }
+
+    @Test
+    void unlikeComment_ShouldReturnTrue() {
+        when(commentService.unlikeComment(1)).thenReturn(true);
+
+        boolean result = commentService.unlikeComment(1);
+
+        assertTrue(result);
+        verify(commentService).unlikeComment(1);
+    }
+}
