diff --git a/src/stores/useBoardAccessStore.js b/src/stores/useBoardAccessStore.js new file mode 100644 index 0000000..3960cfe --- /dev/null +++ b/src/stores/useBoardAccessStore.js @@ -0,0 +1,44 @@ +/* + 작성자 : 박성용 + 작성일 : 2025-03-14 + 수정자 : + 수정일 : + 설명 : 게시글 수정 시 비밀번호 적재용. +*/ +import { ref, computed, watch } from 'vue'; +import { defineStore } from 'pinia'; + +export const useBoardAccessStore = defineStore( + 'access', + () => { + const password = ref(''); + + if (localStorage.getItem('tempPassword')) { + // 저장된 값을 불러와 상태에 할당 + const storedState = JSON.parse(localStorage.getItem('tempPassword')); + password.value = storedState; + } + + watch(password, newValue => { + localStorage.setItem('tempPassword', JSON.stringify(newValue.value)); + }); + + function setBoardPassword(input) { + password.value = input; + } + + function $reset() { + password.value = ''; + localStorage.removeItem('tempPassword', newValue); + } + + return { + password, + setBoardPassword, + $reset, + }; + }, + { + persist: true, + }, +); diff --git a/src/views/board/BoardEdit.vue b/src/views/board/BoardEdit.vue index 4b19c15..f043e27 100644 --- a/src/views/board/BoardEdit.vue +++ b/src/views/board/BoardEdit.vue @@ -85,11 +85,13 @@ import { ref, onMounted, computed, watch, inject } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import { useToastStore } from '@s/toastStore'; + import { useBoardAccessStore } from '@s/useBoardAccessStore'; import axios from '@api'; // 공통 const $common = inject('common'); const toastStore = useToastStore(); + const accessStore = useBoardAccessStore(); // 상태 변수 const title = ref(''); @@ -117,22 +119,30 @@ // 게시물 데이터 로드 const fetchBoardDetails = async () => { - try { - const response = await axios.get(`board/${currentBoardId.value}`); - const data = response.data.data; + // 수정 데이터 전송 + const password = accessStore.password.value; + const params = { + password: password || '', + }; + console.log('params: ', params); + //const response = await axios.get(`board/${currentBoardId.value}`); + const { data } = await axios.post(`board/${currentBoardId.value}`, params); - // 기존 첨부파일 추가 - if (data.hasAttachment && data.attachments.length > 0) { - attachFiles.value = addDisplayFileName([...data.attachments]); - } - - // 데이터 설정 - title.value = data.title || '제목 없음'; - content.value = data.content || '내용 없음'; - contentLoaded.value = true; - } catch (error) { - console.error('게시물 가져오기 오류:', error.response || error.message); + if (data.code !== 200) { + toastStore.onToast(data.message, 'e'); + router.go(-1); + return; } + const boardData = data.data; + // 기존 첨부파일 추가 + if (boardData.hasAttachment && boardData.attachments.length > 0) { + attachFiles.value = addDisplayFileName([...boardData.attachments]); + } + + // 데이터 설정 + title.value = boardData.title || '제목 없음'; + content.value = boardData.content || '내용 없음'; + contentLoaded.value = true; }; // 기존 첨부파일명을 노출 @@ -254,7 +264,7 @@ }; // 컴포넌트 마운트 시 데이터 로드 - onMounted(() => { + onMounted(async () => { if (currentBoardId.value) { fetchBoardDetails(); } else { diff --git a/src/views/board/BoardView.vue b/src/views/board/BoardView.vue index 20af8e2..b88bc15 100644 --- a/src/views/board/BoardView.vue +++ b/src/views/board/BoardView.vue @@ -139,6 +139,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useUserInfoStore } from '@/stores/useUserInfoStore'; import { useToastStore } from '@s/toastStore'; + import { useBoardAccessStore } from '@s/useBoardAccessStore'; import axios from '@api'; const $common = inject('common'); @@ -161,6 +162,8 @@ const router = useRouter(); const userStore = useUserInfoStore(); const toastStore = useToastStore(); + const accessStore = useBoardAccessStore(); + const currentBoardId = ref(Number(route.params.id)); const unknown = computed(() => profileName.value === '익명'); const currentUserId = computed(() => userStore?.user?.id); // 현재 로그인한 사용자 id @@ -242,21 +245,25 @@ // 게시물 상세 데이터 불러오기 const fetchBoardDetails = async () => { - const response = await axios.get(`board/${currentBoardId.value}`); - const data = response.data.data; - - profileName.value = data.author || '익명'; - authorId.value = data.authorId; - boardTitle.value = data.title || '제목 없음'; - boardContent.value = data.content || ''; - profileImg.value = data.profileImg || ''; - date.value = data.date || ''; - views.value = data.cnt || 0; - likes.value = data.likeCount || 0; - dislikes.value = data.dislikeCount || 0; - attachment.value = data.hasAttachment || null; - commentNum.value = data.commentCount || 0; - attachments.value = data.attachments || []; + const { data } = await axios.get(`board/${currentBoardId.value}`); + if (data?.data) { + const boardData = data.data; + profileName.value = boardData.author || '익명'; + authorId.value = boardData.authorId; + boardTitle.value = boardData.title || '제목 없음'; + boardContent.value = boardData.content || ''; + profileImg.value = boardData.profileImg || ''; + date.value = boardData.date || ''; + views.value = boardData.cnt || 0; + likes.value = boardData.likeCount || 0; + dislikes.value = boardData.dislikeCount || 0; + attachment.value = boardData.hasAttachment || null; + commentNum.value = boardData.commentCount || 0; + attachments.value = boardData.attachments || []; + } else { + toastStore.onToast(data.message, 'e'); + router.back(); + } }; // 좋아요, 싫어요 @@ -609,14 +616,19 @@ }); if (response.data.code === 200 && response.data.data === true) { + accessStore.setBoardPassword(password); + console.log('password: ', password.value); + console.log('accessStore.password: ', accessStore.password.value); boardPasswordAlert.value = ''; isPassword.value = false; if (lastClickedButton.value === 'edit') { router.push({ name: 'BoardEdit', params: { id: currentBoardId.value } }); + return; } else if (lastClickedButton.value === 'delete') { await deletePost(); } + accessStore.$reset(); lastClickedButton.value = null; } else { boardPasswordAlert.value = '비밀번호가 일치하지 않습니다.';