댓글 대댓글 수정 삭제 완료

This commit is contained in:
kimdaae328 2025-02-25 11:10:14 +09:00
parent 84c43d5baf
commit 13f9eecaf3
5 changed files with 113 additions and 37 deletions

View File

@ -11,7 +11,7 @@
:isLike="!isLike" :isLike="!isLike"
:isCommentPassword="comment.isCommentPassword" :isCommentPassword="comment.isCommentPassword"
:isCommentProfile="true" :isCommentProfile="true"
@editClick="$emit('editClick', comment)" @editClick="aaaa"
@deleteClick="$emit('deleteClick', comment)" @deleteClick="$emit('deleteClick', comment)"
@updateReaction="handleUpdateReaction" @updateReaction="handleUpdateReaction"
/> />
@ -56,11 +56,19 @@
:key="child.commentId" :key="child.commentId"
class="mt-8 pt-6 ps-10 border-top" class="mt-8 pt-6 ps-10 border-top"
> >
<!-- <p>대댓글 데이터(JSON): {{ JSON.stringify(child, null, 2) }}</p> -->
<!-- <p>comment child: {{ comment.children }}</p> -->
<BoardComment <BoardComment
:comment="child" :comment="child"
:unknown="unknown" :unknown="unknown"
:isPlusButton="false" :isPlusButton="false"
:isLike="true" :isLike="true"
:isCommentProfile="true"
:isCommentAuthor="child.isCommentAuthor"
@editClick="$emit('editClick', $event)"
@deleteClick="$emit('deleteClick', child)"
@submitEdit="(comment, editedContent) => $emit('submitEdit', comment, editedContent)"
@cancelEdit="$emit('cancelEdit', child)"
@submitComment="submitComment" @submitComment="submitComment"
@updateReaction="handleUpdateReaction" @updateReaction="handleUpdateReaction"
/> />
@ -155,4 +163,8 @@ const submitEdit = () => {
emit('submitEdit', props.comment, localEditedContent.value); emit('submitEdit', props.comment, localEditedContent.value);
}; };
const aaaa = () => {
emit('editClick', props.comment);
}
</script> </script>

View File

@ -79,7 +79,7 @@ const props = defineProps({
const comment = ref(''); const comment = ref('');
const password = ref(''); const password = ref('');
const isCheck = ref(props.unknown); const isCheck = ref('');
const emit = defineEmits(['submitComment']); const emit = defineEmits(['submitComment']);

View File

@ -5,6 +5,8 @@
:key="comment.commentId" :key="comment.commentId"
class="mt-6 border-bottom pb-6" class="mt-6 border-bottom pb-6"
> >
<!-- <p>comment데이터 확인: {{ comment }}</p> -->
<!-- 여기 부분 수정 확인 부분 부터 해야함 -->
<BoardComment <BoardComment
:unknown="unknown" :unknown="unknown"
:comment="comment" :comment="comment"
@ -12,13 +14,13 @@
:isCommentPassword="comment.isCommentPassword" :isCommentPassword="comment.isCommentPassword"
:isEditTextarea="comment.isEditTextarea" :isEditTextarea="comment.isEditTextarea"
:passwordCommentAlert="passwordCommentAlert" :passwordCommentAlert="passwordCommentAlert"
@editClick="$emit('editClick', comment)" @editClick="handleEditClick"
@deleteClick="$emit('deleteClick', comment)" @deleteClick="handleDeleteClick"
@submitPassword="submitPassword" @submitPassword="submitPassword"
@submitComment="submitComment" @submitComment="submitComment"
@commentDeleted="handleCommentDeleted" @commentDeleted="handleCommentDeleted"
@submitEdit="(comment, editedContent) => $emit('submitEdit', comment, editedContent)" @submitEdit="handleSubmitEdit"
@cancelEdit="$emit('cancelEdit', comment)" @cancelEdit="handleCancelEdit"
@updateReaction="(reactionData) => handleUpdateReaction(reactionData, comment.commentId, comment.boardId)" @updateReaction="(reactionData) => handleUpdateReaction(reactionData, comment.commentId, comment.boardId)"
/> />
</li> </li>
@ -76,4 +78,29 @@ const handleUpdateReaction = (reactionData, commentId, boardId) => {
const submitPassword = (comment, password) => { const submitPassword = (comment, password) => {
emit('submitPassword', comment, password); emit('submitPassword', comment, password);
}; };
const handleEditClick = (comment) => {
emit('editClick', comment);
};
const handleSubmitEdit = (comment, editedContent) => {
emit("submitEdit", comment, editedContent);
};
const handleDeleteClick = (comment) => {
if (comment.parentId) {
emit('deleteClick', comment); //
} else {
emit('deleteClick', comment); //
}
};
const handleCancelEdit = (comment) => {
if (comment.parentId) {
emit('cancelEdit', comment); //
} else {
emit('cancelEdit', comment); //
}
};
</script> </script>

View File

@ -23,7 +23,7 @@
<div class="ms-auto text-end"> <div class="ms-auto text-end">
<!-- 수정, 삭제 버튼 --> <!-- 수정, 삭제 버튼 -->
<!-- <template v-if="isAuthor || showDetail"> --> <!-- <template v-if="isAuthor || showDetail"> -->
<template v-if="isCommentProfile ? isCommentAuthor : isAuthor"> <template v-if="isCommentAuthor || isAuthor">
<EditButton @click.stop="editClick" /> <EditButton @click.stop="editClick" />
<DeleteButton @click.stop="deleteClick" /> <DeleteButton @click.stop="deleteClick" />
</template> </template>
@ -62,7 +62,7 @@ const props = defineProps({
}, },
profileName: { profileName: {
type: String, type: String,
default: '', default: '익명',
}, },
unknown: { unknown: {
type: Boolean, type: Boolean,
@ -101,13 +101,12 @@ const emit = defineEmits(['updateReaction', 'editClick', 'deleteClick']);
// //
const editClick = () => { const editClick = () => {
console.log('클릭 확인') emit('editClick', props.comment);
emit('editClick', props.unknown);
}; };
// //
const deleteClick = () => { const deleteClick = () => {
emit('deleteClick', props.unknown); emit('deleteClick', props.comment);
}; };
const handleUpdateReaction = (reactionData) => { const handleUpdateReaction = (reactionData) => {

View File

@ -158,16 +158,19 @@ const route = useRoute();
const router = useRouter(); const router = useRouter();
const userStore = useUserInfoStore(); const userStore = useUserInfoStore();
const currentBoardId = ref(Number(route.params.id)); const currentBoardId = ref(Number(route.params.id));
// const unknown = computed(() => profileName.value === ''); const unknown = computed(() => profileName.value === '익명');
const currentUserId = computed(() => userStore.user.id); // id const currentUserId = computed(() => userStore.user.id); // id
const authorId = ref(''); // id const authorId = ref(''); // id
const isAuthor = computed(() => currentUserId.value === authorId.value); const isAuthor = computed(() => currentUserId.value === authorId.value);
// const isCommentAuthor =
const commentsWithAuthStatus = computed(() => { const commentsWithAuthStatus = computed(() => {
const updatedComments = comments.value.map(comment => ({ const updatedComments = comments.value.map(comment => ({
...comment, ...comment,
isCommentAuthor: comment.authorId === currentUserId.value isCommentAuthor: comment.authorId === currentUserId.value,
children: comment.children.map(reply => ({
...reply,
isCommentAuthor: reply.authorId === currentUserId.value
}))
})); }));
// console.log(" commentsWithAuthStatus :", updatedComments); // console.log(" commentsWithAuthStatus :", updatedComments);
return updatedComments; return updatedComments;
@ -205,12 +208,12 @@ const fetchBoardDetails = async () => {
const response = await axios.get(`board/${currentBoardId.value}`); const response = await axios.get(`board/${currentBoardId.value}`);
const data = response.data.data; const data = response.data.data;
console.log(data) // console.log(data)
// API // API
// const boardDetail = data.boardDetail || {}; // const boardDetail = data.boardDetail || {};
profileName.value = data.author; profileName.value = data.author || '익명';
// //
// profileName.value = ''; // profileName.value = '';
@ -292,7 +295,7 @@ const fetchComments = async (page = 1) => {
} }
}); });
console.log(response.data.data) // console.log(response.data.data)
const commentsList = response.data.data.list.map(comment => ({ const commentsList = response.data.data.list.map(comment => ({
commentId: comment.LOCCMTSEQ, // ID commentId: comment.LOCCMTSEQ, // ID
@ -317,10 +320,12 @@ const fetchComments = async (page = 1) => {
params: { LOCCMTPNT: comment.commentId } params: { LOCCMTPNT: comment.commentId }
}); });
console.log(`대댓글 데이터 (${comment.commentId}의 대댓글):`, replyResponse.data); // console.log(` (${comment.commentId} ):`, replyResponse.data);
if (replyResponse.data.data) { if (replyResponse.data.data) {
comment.children = replyResponse.data.data.map(reply => ({ comment.children = replyResponse.data.data.map(reply => ({
author: reply.author || '익명',
authorId: reply.authorId,
commentId: reply.LOCCMTSEQ, commentId: reply.LOCCMTSEQ,
boardId: reply.LOCBRDSEQ, boardId: reply.LOCBRDSEQ,
parentId: reply.LOCCMTPNT, // ID parentId: reply.LOCCMTPNT, // ID
@ -460,26 +465,37 @@ const deleteClick = (unknown) => {
} }
}; };
const findCommentById = (commentId, commentsList) => {
for (const comment of commentsList) {
if (comment.commentId === commentId) {
return comment; //
}
if (comment.children && comment.children.length) {
const found = findCommentById(commentId, comment.children);
if (found) return found; //
}
}
return null;
};
// //
const editComment = (comment) => { const editComment = (comment) => {
const targetComment = comments.value.find(c => c.commentId === comment.commentId); // console.log(' ')
//
const targetComment = findCommentById(comment.commentId, comments.value);
if (!targetComment) { if (!targetComment) {
console.log("대댓글을 찾을 수 없음:", comment.commentId);
return; return;
} }
// text , // text ,
if (targetComment.isEditTextarea) { targetComment.isEditTextarea = !targetComment.isEditTextarea;
targetComment.isEditTextarea = false;
} else {
targetComment.isEditTextarea = true;
}
// //
if (unknown.value) { if (unknown.value) {
toggleCommentPassword(comment, "edit"); toggleCommentPassword(comment, "edit");
} else {
comment.isEditTextarea = true;
} }
} }
@ -665,10 +681,16 @@ const handleSubmitEdit = async (comment, editedContent) => {
// //
// comment.content = editedContent; // comment.content = editedContent;
// comment.isEditTextarea = false; // comment.isEditTextarea = false; f
if (response.status === 200) { if (response.status === 200) {
//
await fetchComments(); const targetComment = findCommentById(comment.commentId, comments.value);
if (targetComment) {
targetComment.content = editedContent; //
targetComment.isEditTextarea = false; //
} else {
console.warn("❌ 수정할 댓글을 찾을 수 없음");
}
} else { } else {
console.log("❌ 댓글 수정 실패:", response.data); console.log("❌ 댓글 수정 실패:", response.data);
} }
@ -679,13 +701,10 @@ const handleSubmitEdit = async (comment, editedContent) => {
// ( ) // ( )
const handleCancelEdit = (comment) => { const handleCancelEdit = (comment) => {
console.log("BoardView.vue - 댓글 수정 취소:", comment); const targetComment = findCommentById(comment.commentId, comments.value);
// comments comment
const targetComment = comments.value.find(c => c.commentId === comment.commentId);
if (targetComment) { if (targetComment) {
console.log("✅ 원본 데이터 찾음, 수정 취소 처리 가능"); console.log("✅ 원본 데이터 찾음, 수정 취소 처리 가능:", targetComment);
targetComment.isEditTextarea = false; targetComment.isEditTextarea = false;
} else { } else {
console.error("❌ 원본 데이터 찾을 수 없음, 수정 취소 실패"); console.error("❌ 원본 데이터 찾을 수 없음, 수정 취소 실패");
@ -700,10 +719,29 @@ const handlePageChange = (page) => {
} }
}; };
// ( )
const handleCommentDeleted = (deletedCommentId) => { const handleCommentDeleted = (deletedCommentId) => {
comments.value = comments.value.filter(comment => comment.commentId !== deletedCommentId); //
const parentIndex = comments.value.findIndex(comment => comment.commentId === deletedCommentId);
if (parentIndex !== -1) {
comments.value.splice(parentIndex, 1);
return;
}
// 2
for (let parent of comments.value) {
const childIndex = parent.children.findIndex(child => child.commentId === deletedCommentId);
if (childIndex !== -1) {
parent.children.splice(childIndex, 1);
return;
}
}
console.error("❌ 삭제할 댓글을 찾을 수 없음:", deletedCommentId);
}; };
// //
const formattedDate = (dateString) => { const formattedDate = (dateString) => {
if (!dateString) return "날짜 없음"; if (!dateString) return "날짜 없음";