From 3aed02e3f121149b94e1878844a9cb3a8cd50087 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 13 Jan 2025 09:57:47 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=EC=8A=A4=ED=94=84=EB=A7=81=EB=B6=80?= =?UTF-8?q?=ED=8A=B8=20=EC=97=B0=EA=B2=B0=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite.config.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vite.config.js b/vite.config.js index 617eec4..061e29f 100644 --- a/vite.config.js +++ b/vite.config.js @@ -5,6 +5,14 @@ import vueDevTools from 'vite-plugin-vue-devtools' // https://vite.dev/config/ export default defineConfig({ + server: { + proxy: { + '/api': { + target: 'http://localhost:10325', // Spring Boot 서버 주소 + changeOrigin: true, + }, + }, + }, plugins: [ vue(), vueDevTools(), From 4df399ac363e421356335442f098ca64e9c0f881 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 13 Jan 2025 12:52:44 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20insert?= =?UTF-8?q?=EC=98=88=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/board/BoardWrite.vue | 78 ++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/src/views/board/BoardWrite.vue b/src/views/board/BoardWrite.vue index f522ea4..e93b086 100644 --- a/src/views/board/BoardWrite.vue +++ b/src/views/board/BoardWrite.vue @@ -55,9 +55,10 @@ import FormSelect from '@c/input/FormSelect.vue'; import FormFile from '@c/input/FormFile.vue'; import { ref, watch } from 'vue'; import router from '@/router'; +import axios from 'axios'; const categoryList = ['자유', '익명', '공지사항']; -// input 경고문 만들어야함 +// input 경고문 만들어야함!! const title = ref(''); const password = ref(''); const category = ref(0); @@ -76,9 +77,80 @@ const goList = () => { router.push('/board'); }; -const write = () => { - console.log('작성'); +const write = async () => { + // 입력값 유효성 검사 + if (!title.value) { + titleAlert.value = true; + return; + } else { + titleAlert.value = false; + } + + if (category.value === 1 && !password.value) { + passwordAlert.value = true; + return; + } else { + passwordAlert.value = false; + } + + if (!content.value) { + contentAlert.value = true; + return; + } else { + contentAlert.value = false; + } + + try { + // 게시물 작성 데이터 준비 + const boardData = { + LOCBRDTTL: title.value, + LOCBRDCON: content.value, + LOCBRDPWD: category.value === 1 ? password.value : null, + LOCBRDTYP: category.value === 1 ? 'S' : 'F', //공지사항 추가해야함!! + }; + + // 게시물 작성 API 호출 + const { data: boardResponse } = await axios.post('/api/board', boardData); + const boardId = boardResponse.data.boardId; + + // 첨부파일 처리 + if (attachFiles.value && attachFiles.value.length > 0) { + for (const file of attachFiles.value) { + const realName = file.name.substring(0, file.name.lastIndexOf('.')); + const fileInfo = { + path: "/uploads", // 파일 경로 (수정 필요) + originalName: realName, // 확장자를 제외한 파일명 + extension: file.name.split('.').pop(), // 파일 확장자 + registrantId: 1, // 등록자 ID (수정 필요) + }; + + + const formData = new FormData(); + formData.append("file", file); // 첨부 파일 + formData.append("CMNFLEPAT", fileInfo.path); // 파일 경로 + formData.append("CMNFLENAM", fileInfo.originalName); // 파일 명(확장자제외) + formData.append("CMNFLEORG", fileInfo.originalName); // 원본 파일명(확장자제외) + formData.append("CMNFLEEXT", fileInfo.extension); // 파일 확장자 + formData.append("CMNFLESIZ", file.size); // 파일 크기 + formData.append("CMNFLEREG", fileInfo.registrantId); // 등록자 ID + + const response = await axios.post(`/api/board/${boardId}/attachments`, formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + }); + } + } + + alert("게시물이 작성되었습니다."); + goList(); + } catch (error) { + console.error(error); + alert("게시물 작성 중 오류가 발생했습니다."); + } }; + + \ No newline at end of file + diff --git a/src/components/board/BoardProfile.vue b/src/components/board/BoardProfile.vue index d747800..cfe80e3 100644 --- a/src/components/board/BoardProfile.vue +++ b/src/components/board/BoardProfile.vue @@ -24,72 +24,96 @@
diff --git a/src/components/list/BoardCard.vue b/src/components/list/BoardCard.vue index c2ed3c0..02c8b18 100644 --- a/src/components/list/BoardCard.vue +++ b/src/components/list/BoardCard.vue @@ -1,23 +1,43 @@ - diff --git a/src/router/index.js b/src/router/index.js index 417ef6c..a19d7da 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,5 +1,4 @@ import { createRouter, createWebHistory } from 'vue-router' -import BoardWrite from '@v/board/BoardWrite.vue'; // 초기 렌더링 속도를 위해 지연 로딩 사용 const routes = [ @@ -14,6 +13,7 @@ const routes = [ children: [ { path: '', + name: 'BoardList', component: () => import('@v/board/BoardList.vue') }, { @@ -21,8 +21,14 @@ const routes = [ component: () => import('@v/board/BoardWrite.vue') }, { - path: 'get/:id', + path: ':id', + name: 'BoardDetail', component: () => import('@v/board/BoardView.vue') + }, + { + path: 'edit/:id', + name: 'BoardEdit', + component: () => import('@v/board/BoardEdit.vue') } ] }, diff --git a/src/stores/calendarStore.js b/src/stores/calendarStore.js index 80c8525..a3616f9 100644 --- a/src/stores/calendarStore.js +++ b/src/stores/calendarStore.js @@ -4,12 +4,12 @@ import axios from 'axios'; const events = ref([]); const fetchEvents = async () => { - const response = await axios.get('/api/calendar/events'); + const response = await axios.get('/calendar/events'); events.value = response.data; }; const addEvent = async (event) => { - await axios.post('/api/calendar/event', event); + await axios.post('/calendar/event', event); fetchEvents(); }; diff --git a/src/views/board/BoardEdit.vue b/src/views/board/BoardEdit.vue new file mode 100644 index 0000000..36e81bd --- /dev/null +++ b/src/views/board/BoardEdit.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/src/views/board/BoardList.vue b/src/views/board/BoardList.vue index 25109bd..691fdba 100644 --- a/src/views/board/BoardList.vue +++ b/src/views/board/BoardList.vue @@ -1,30 +1,30 @@