From 082cd011d2add301440a31f0724fa0139411be61 Mon Sep 17 00:00:00 2001
From: zzc <1761997216@qq.com>
Date: Mon, 15 Jun 2026 08:56:18 +0800
Subject: [PATCH] feat: repley
---
api/topicItem.js | 14 +-
components/AttitudePanel/AttitudePanel.vue | 60 +---
components/CommentItem/CommentItem.vue | 48 ++-
pages/rating/detail.vue | 336 +++++++++++++++++++--
4 files changed, 369 insertions(+), 89 deletions(-)
diff --git a/api/topicItem.js b/api/topicItem.js
index 6a0340c..9a9ca12 100644
--- a/api/topicItem.js
+++ b/api/topicItem.js
@@ -30,13 +30,25 @@ export const topicItemCommentLike = async (data) => {
};
// 获取评论列表
-export const topicItemCommentList = async (topicId, itemId, page = 1, orderBy = 1) => {
+export const topicItemCommentList = async (topicId, itemId, page = 1, orderBy = 'hot') => {
return request({
url: `/api/rating/topic/comment/item/list?topicId=${topicId}&itemId=${itemId}&page=${page}&orderBy=${orderBy}`,
method: "GET",
});
};
+/*
+ * 获取评论回复列表
+ * @param {rootCommentId: string, page: number} data
+ */
+export const topicItemCommentReplyList = async (data) => {
+ return request({
+ url: "/api/rating/topic/comment/replies",
+ method: "GET",
+ data,
+ });
+};
+
// 获取评分项详情
export const fetchTopicRatingItems = async (itemId) => {
return request({
diff --git a/components/AttitudePanel/AttitudePanel.vue b/components/AttitudePanel/AttitudePanel.vue
index 33d26e3..906e3bd 100644
--- a/components/AttitudePanel/AttitudePanel.vue
+++ b/components/AttitudePanel/AttitudePanel.vue
@@ -15,13 +15,6 @@
{{ action.label }}
-
-
- 正在回复
- @{{ replyTarget.replyToName || replyTarget.name }}
-
- 取消
-
+
+
@@ -73,7 +92,7 @@ const props = defineProps({
}
});
-const emit = defineEmits(['need-login', 'like-change', 'reply']);
+const emit = defineEmits(['need-login', 'like-change', 'reply', 'toggle-replies', 'more-replies']);
const userStore = useUserStore();
const isLoggedIn = computed(() => !!userStore.token || !!userStore.userInfo?.nickName);
@@ -97,6 +116,10 @@ const buildCommentState = (comment = {}) => ({
likes: Number(comment.likes || 0),
isLiked: !!comment.isLiked,
replyCount: Number(comment.replyCount || 0),
+ repliesLoading: !!comment.repliesLoading,
+ repliesLoaded: !!comment.repliesLoaded,
+ repliesHasMore: !!comment.repliesHasMore,
+ repliesPage: Number(comment.repliesPage || 1),
replies: Array.isArray(comment.replies) ? comment.replies.map(buildReplyItem) : []
});
@@ -335,13 +358,15 @@ const handleLike = async (target = null) => {
.c-action-btn,
.reply-btn,
-.c-action-count {
+.c-action-count,
+.c-action-link {
font-size: 22rpx;
color: #8b8f98;
}
.c-action-btn,
-.reply-btn {
+.reply-btn,
+.c-action-link {
font-weight: 600;
}
@@ -423,4 +448,19 @@ const handleLike = async (target = null) => {
width: 28rpx;
height: 28rpx;
}
+
+.reply-panel-footer {
+ padding: 8rpx 0 10rpx 72rpx;
+}
+
+.reply-more-btn,
+.reply-more-loading {
+ font-size: 22rpx;
+ color: #4f46e5;
+ font-weight: 600;
+}
+
+.reply-more-loading {
+ color: #9ca3af;
+}
diff --git a/pages/rating/detail.vue b/pages/rating/detail.vue
index 17361dc..6ca2533 100644
--- a/pages/rating/detail.vue
+++ b/pages/rating/detail.vue
@@ -50,10 +50,8 @@
ref="attitudePanelRef"
:initial-action="currentAction"
:sending="isSendingComment"
- :reply-target="replyTarget"
@action-change="handleActionChange"
@send-comment="handleSendComment"
- @cancel-reply="clearReplyTarget"
/>
@@ -124,6 +122,8 @@
@need-login="openLoginPopup"
@like-change="handleCommentLikeChange"
@reply="handleReplyComment"
+ @toggle-replies="handleToggleReplies"
+ @more-replies="handleLoadMoreReplies"
/>
@@ -135,22 +135,62 @@
+
+
+