diff --git a/.idea/MyBatisCodeHelperDatasource.xml b/.idea/MyBatisCodeHelperDatasource.xml
index ed5a7b9..efe123d 100644
--- a/.idea/MyBatisCodeHelperDatasource.xml
+++ b/.idea/MyBatisCodeHelperDatasource.xml
@@ -11,11 +11,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -46,6 +46,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -122,6 +138,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -375,7 +429,7 @@
-
+
diff --git a/han-note-comment/han-note-comment-biz/pom.xml b/han-note-comment/han-note-comment-biz/pom.xml
index 6e176dd..ebec865 100644
--- a/han-note-comment/han-note-comment-biz/pom.xml
+++ b/han-note-comment/han-note-comment-biz/pom.xml
@@ -78,6 +78,13 @@
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ org.apache.rocketmq
+ rocketmq-spring-boot-starter
+
+
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/config/RocketMQConfig.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/config/RocketMQConfig.java
new file mode 100644
index 0000000..d107517
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/config/RocketMQConfig.java
@@ -0,0 +1,10 @@
+package com.hanserwei.hannote.comment.biz.config;
+
+import org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+@Configuration
+@Import(RocketMQAutoConfiguration.class)
+public class RocketMQConfig {
+}
\ No newline at end of file
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/constants/MQConstants.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/constants/MQConstants.java
new file mode 100644
index 0000000..6b12e6d
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/constants/MQConstants.java
@@ -0,0 +1,10 @@
+package com.hanserwei.hannote.comment.biz.constants;
+
+public interface MQConstants {
+
+ /**
+ * Topic: 评论发布
+ */
+ String TOPIC_PUBLISH_COMMENT = "PublishCommentTopic";
+
+}
\ No newline at end of file
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/controller/CommentController.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/controller/CommentController.java
new file mode 100644
index 0000000..671e17f
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/controller/CommentController.java
@@ -0,0 +1,29 @@
+package com.hanserwei.hannote.comment.biz.controller;
+
+import com.hanserwei.framework.biz.operationlog.aspect.ApiOperationLog;
+import com.hanserwei.framework.common.response.Response;
+import com.hanserwei.hannote.comment.biz.model.vo.PublishCommentReqVO;
+import com.hanserwei.hannote.comment.biz.service.CommentService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/comment")
+@Slf4j
+public class CommentController {
+
+ @Resource
+ private CommentService commentService;
+
+ @PostMapping("/publish")
+ @ApiOperationLog(description = "发布评论")
+ public Response> publishComment(@Validated @RequestBody PublishCommentReqVO publishCommentReqVO) {
+ return commentService.publishComment(publishCommentReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/dataobject/CommentDO.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/dataobject/CommentDO.java
new file mode 100644
index 0000000..36650aa
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/dataobject/CommentDO.java
@@ -0,0 +1,112 @@
+package com.hanserwei.hannote.comment.biz.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * 评论表
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "t_comment")
+public class CommentDO {
+ /**
+ * id
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联的笔记ID
+ */
+ @TableField(value = "note_id")
+ private Long noteId;
+
+ /**
+ * 发布者用户ID
+ */
+ @TableField(value = "user_id")
+ private Long userId;
+
+ /**
+ * 评论内容UUID
+ */
+ @TableField(value = "content_uuid")
+ private String contentUuid;
+
+ /**
+ * 内容是否为空(0:不为空 1:为空)
+ */
+ @TableField(value = "is_content_empty")
+ private Boolean isContentEmpty;
+
+ /**
+ * 评论附加图片URL
+ */
+ @TableField(value = "image_url")
+ private String imageUrl;
+
+ /**
+ * 级别(1:一级评论 2:二级评论)
+ */
+ @TableField(value = "`level`")
+ private Integer level;
+
+ /**
+ * 评论被回复次数,仅一级评论需要
+ */
+ @TableField(value = "reply_total")
+ private Long replyTotal;
+
+ /**
+ * 评论被点赞次数
+ */
+ @TableField(value = "like_total")
+ private Long likeTotal;
+
+ /**
+ * 父ID (若是对笔记的评论,则此字段存储笔记ID; 若是二级评论,则此字段存储一级评论的ID)
+ */
+ @TableField(value = "parent_id")
+ private Long parentId;
+
+ /**
+ * 回复哪个的评论 (0表示是对笔记的评论,若是对他人评论的回复,则存储回复评论的ID)
+ */
+ @TableField(value = "reply_comment_id")
+ private Long replyCommentId;
+
+ /**
+ * 回复的哪个用户, 存储用户ID
+ */
+ @TableField(value = "reply_user_id")
+ private Long replyUserId;
+
+ /**
+ * 是否置顶(0:不置顶 1:置顶)
+ */
+ @TableField(value = "is_top")
+ private Boolean isTop;
+
+ /**
+ * 创建时间
+ */
+ @TableField(value = "create_time")
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ @TableField(value = "update_time")
+ private LocalDateTime updateTime;
+}
\ No newline at end of file
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/dataobject/CommentLikeDO.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/dataobject/CommentLikeDO.java
new file mode 100644
index 0000000..a646b09
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/dataobject/CommentLikeDO.java
@@ -0,0 +1,46 @@
+package com.hanserwei.hannote.comment.biz.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * 评论点赞表
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "t_comment_like")
+public class CommentLikeDO {
+ /**
+ * 主键ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 用户ID
+ */
+ @TableField(value = "user_id")
+ private Long userId;
+
+ /**
+ * 评论ID
+ */
+ @TableField(value = "comment_id")
+ private Long commentId;
+
+ /**
+ * 创建时间
+ */
+ @TableField(value = "create_time")
+ private LocalDateTime createTime;
+}
\ No newline at end of file
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/mapper/CommentDOMapper.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/mapper/CommentDOMapper.java
new file mode 100644
index 0000000..e484c93
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/mapper/CommentDOMapper.java
@@ -0,0 +1,9 @@
+package com.hanserwei.hannote.comment.biz.domain.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hanserwei.hannote.comment.biz.domain.dataobject.CommentDO;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface CommentDOMapper extends BaseMapper {
+}
\ No newline at end of file
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/mapper/CommentLikeDOMapper.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/mapper/CommentLikeDOMapper.java
new file mode 100644
index 0000000..fa0da8d
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/domain/mapper/CommentLikeDOMapper.java
@@ -0,0 +1,9 @@
+package com.hanserwei.hannote.comment.biz.domain.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hanserwei.hannote.comment.biz.domain.dataobject.CommentLikeDO;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface CommentLikeDOMapper extends BaseMapper {
+}
\ No newline at end of file
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/enums/ResponseCodeEnum.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/enums/ResponseCodeEnum.java
new file mode 100644
index 0000000..bc19064
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/enums/ResponseCodeEnum.java
@@ -0,0 +1,23 @@
+package com.hanserwei.hannote.comment.biz.enums;
+
+import com.hanserwei.framework.common.exception.BaseExceptionInterface;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum ResponseCodeEnum implements BaseExceptionInterface {
+
+ // ----------- 通用异常状态码 -----------
+ SYSTEM_ERROR("COMMENT-10000", "出错啦,后台小哥正在努力修复中..."),
+ PARAM_NOT_VALID("COMMENT-10001", "参数错误"),
+
+ // ----------- 业务异常状态码 -----------
+ ;
+
+ // 异常码
+ private final String errorCode;
+ // 错误信息
+ private final String errorMsg;
+
+}
\ No newline at end of file
diff --git a/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/exception/GlobalExceptionHandler.java b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..3c52a00
--- /dev/null
+++ b/han-note-comment/han-note-comment-biz/src/main/java/com/hanserwei/hannote/comment/biz/exception/GlobalExceptionHandler.java
@@ -0,0 +1,103 @@
+package com.hanserwei.hannote.comment.biz.exception;
+
+import com.hanserwei.framework.common.exception.ApiException;
+import com.hanserwei.framework.common.response.Response;
+import com.hanserwei.hannote.comment.biz.enums.ResponseCodeEnum;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Optional;
+
+@SuppressWarnings("LoggingSimilarMessage")
+@ControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+ /**
+ * 捕获自定义业务异常
+ *
+ * @return Response.fail(e)
+ */
+ @ExceptionHandler({ApiException.class})
+ @ResponseBody
+ public Response