From 7f5f49c82bff85eef13a3c08ca0cc255008613ae Mon Sep 17 00:00:00 2001 From: study2895 <144806675+study2895@users.noreply.github.com> Date: Tue, 3 Dec 2024 05:39:28 +0900 Subject: [PATCH 01/17] =?UTF-8?q?[Feat]=20=EC=9D=B8=EC=A6=9D=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EB=8A=94=20=EB=82=B4=EB=B6=80=EB=A1=9C=20=EC=A0=91=EC=86=8D?= =?UTF-8?q?=ED=95=A0=20=EC=88=98=20=EC=97=86=EB=8F=84=EB=A1=9D=20=EB=9D=BC?= =?UTF-8?q?=EC=9A=B0=ED=84=B0=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/index.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/router/index.js b/src/router/index.js index 739e8c0..f073eb5 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -7,7 +7,6 @@ import FeedLayout from '@/components/layout/FeedLayout.vue' import akopolioCreate from '@/views/akopolio/create/akopolioCreate.vue' import akopolioMain from '@/views/akopolio/main/akopolioMain.vue' - // 자동 임포트 함수 (src/views 내의 모든 .vue 파일을 임포트) function importAllViews() { const viewFiles = require.context('@/views', true, /\.vue$/) @@ -81,8 +80,7 @@ const routes = [ path: 'edit/:id', name: 'akopolioEdit', component: importedViews['akopolioEdit'] // 자동 임포트 적용 - }, - + } ] }, { @@ -140,4 +138,16 @@ const router = createRouter({ //라우터 가드 설정(세션 기반 쿠기, 나중에 수정 필요) // meta: { requiresAuth: true } // 인증이 필요한 페이지 +// 라우터 가드 설정 +router.beforeEach((to, from, next) => { + const isAuthenticated = store.getters['auth/isAuthenticated'] // 인증 여부 확인 + if (to.matched.some((record) => record.path.startsWith('/auth'))) { + next() // /auth 경로는 인증 없이 접근 가능 + } else if (!isAuthenticated) { + next('/auth/login') // 인증되지 않은 경우 로그인 페이지로 리다이렉트 + } else { + next() // 인증된 경우 해당 경로로 이동 + } +}) + export default router From ab3ae18aec1baacd12f6799a21cfbd5cba856606 Mon Sep 17 00:00:00 2001 From: study2895 <144806675+study2895@users.noreply.github.com> Date: Wed, 4 Dec 2024 22:39:04 +0900 Subject: [PATCH 02/17] =?UTF-8?q?[Fix]=20#9=20-=20=EC=9D=BC=EC=A0=95=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EB=82=A0=20=EB=8F=99=EA=B7=B8=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=20=EB=B0=8F=20=EB=B0=94=ED=85=80=20=EC=8B=9C=ED=8A=B8?= =?UTF-8?q?=20=EC=95=88=EB=9C=A8=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/index.js | 20 ++++----- src/views/calendar/CalendarMainScript.js | 54 +++++++++++------------- src/views/calendar/CalendarMainView.vue | 20 ++++++++- 3 files changed, 52 insertions(+), 42 deletions(-) diff --git a/src/router/index.js b/src/router/index.js index f073eb5..aa556ef 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -139,15 +139,15 @@ const router = createRouter({ //라우터 가드 설정(세션 기반 쿠기, 나중에 수정 필요) // meta: { requiresAuth: true } // 인증이 필요한 페이지 // 라우터 가드 설정 -router.beforeEach((to, from, next) => { - const isAuthenticated = store.getters['auth/isAuthenticated'] // 인증 여부 확인 - if (to.matched.some((record) => record.path.startsWith('/auth'))) { - next() // /auth 경로는 인증 없이 접근 가능 - } else if (!isAuthenticated) { - next('/auth/login') // 인증되지 않은 경우 로그인 페이지로 리다이렉트 - } else { - next() // 인증된 경우 해당 경로로 이동 - } -}) +// router.beforeEach((to, from, next) => { +// const isAuthenticated = store.getters['auth/isAuthenticated'] // 인증 여부 확인 +// if (to.matched.some((record) => record.path.startsWith('/auth'))) { +// next() // /auth 경로는 인증 없이 접근 가능 +// } else if (!isAuthenticated) { +// next('/auth/login') // 인증되지 않은 경우 로그인 페이지로 리다이렉트 +// } else { +// next() // 인증된 경우 해당 경로로 이동 +// } +// }) export default router diff --git a/src/views/calendar/CalendarMainScript.js b/src/views/calendar/CalendarMainScript.js index bf3958e..27eb27a 100644 --- a/src/views/calendar/CalendarMainScript.js +++ b/src/views/calendar/CalendarMainScript.js @@ -1,4 +1,4 @@ -import { ref, computed, onMounted } from 'vue' +import { ref, computed } from 'vue' import axios from 'axios' import { format, @@ -20,41 +20,32 @@ export const isScheduleOpen = ref(false) export const currentYear = computed(() => format(currentDate.value, 'yyyy')) export const currentMonth = computed(() => format(currentDate.value, 'M')) -// 임시 학사 일정 데이터 -const temporaryEvents = [ - { title: '개강일', startDate: '2024-03-01', endDate: '2024-03-01' }, - { title: '종강일', startDate: '2024-06-30', endDate: '2024-06-30' }, - { title: '중간고사', startDate: '2024-04-15', endDate: '2024-04-19' }, - { title: '기말고사', startDate: '2024-06-15', endDate: '2024-06-19' }, - { title: '중간고사', startDate: '2024-10-21', endDate: '2024-10-25' } -] - // 학사 일정 데이터 저장소 export const academicEvents = ref([]) // 백엔드에서 학사 일정 가져오기 export const fetchAcademicEvents = async () => { try { - console.log( - 'API 요청 URL:', - `${process.env.VUE_APP_BE_API_URL}/api/calendar` - ) - const response = await axios.get( - `${process.env.VUE_APP_BE_API_URL}/api/calendar`, - { - params: { - year: currentYear.value, - month: currentMonth.value - } - } - ) - academicEvents.value = response.data || [] + const apiUrl = `${process.env.VUE_APP_BE_API_URL}/api/academic-events/${currentYear.value}/${currentMonth.value}` + console.log('API 요청 URL:', apiUrl) + + const response = await axios.get(apiUrl) + + if (response.status === 200 && response.data) { + academicEvents.value = response.data.map((event) => ({ + title: event.eventTitle, + department: event.department, + startDate: event.startDate, + endDate: event.endDate + })) + console.log('학사 일정 데이터:', academicEvents.value) + } else { + console.warn('학사 일정 데이터를 가져오는 데 실패했습니다.') + academicEvents.value = [] + } } catch (error) { - console.log( - '서버에 연결할 수 없어 임시 데이터를 사용합니다:', - error.message - ) - academicEvents.value = [...temporaryEvents] + console.error('학사 일정 데이터 가져오기 오류:', error.message) + academicEvents.value = [] } } @@ -106,12 +97,15 @@ export const hasEvent = (day) => { const selectedDateStr = `${currentYear.value}-${String( currentMonth.value ).padStart(2, '0')}-${String(day).padStart(2, '0')}` - return academicEvents.value.some((event) => + + const result = academicEvents.value.some((event) => isWithinInterval(parseISO(selectedDateStr), { start: parseISO(event.startDate), end: parseISO(event.endDate) }) ) + + return result } export const selectedEvents = computed(() => { diff --git a/src/views/calendar/CalendarMainView.vue b/src/views/calendar/CalendarMainView.vue index bf39f61..af7a085 100644 --- a/src/views/calendar/CalendarMainView.vue +++ b/src/views/calendar/CalendarMainView.vue @@ -85,7 +85,8 @@ onMounted(() => { class="day-button" :class="{ selected: day === selectedDay, - 'sunday-saturday': isSundayOrSaturday(day) + 'sunday-saturday': isSundayOrSaturday(day), + 'has-event': hasEvent(day) }" v-for="day in week" :key="day" @@ -100,7 +101,12 @@ onMounted(() => { class="schedule-popup" v-if="isScheduleOpen && selectedEvents.length > 0" > - +

학사 일정

+
+

{{ event.title }}

+

{{ formatDateRange(event.startDate, event.endDate) }}

+
+
@@ -252,4 +258,14 @@ onMounted(() => { .link-button:hover { background-color: #f1cdb1; } +.day-button.has-event::after { + content: ''; + display: block; + width: 6px; + height: 6px; + background-color: #b3b3b3; + border-radius: 50%; + margin: 0 auto; + margin-top: 4px; +} From 703d9eee836be5884ebc9d1252e3b33f3d63ac3e Mon Sep 17 00:00:00 2001 From: yebin-jeong <2022112390@dgu.ac.kr> Date: Wed, 4 Dec 2024 23:19:28 +0900 Subject: [PATCH 03/17] =?UTF-8?q?[Feature]=20#26=20-=20=EB=94=94=ED=85=8C?= =?UTF-8?q?=EC=9D=BC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B0=B1=EC=97=94?= =?UTF-8?q?=EB=93=9C=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/akopolio/detail/detail.js | 32 +++++++++++++++++------------ src/views/akopolio/main/main.js | 1 + 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/views/akopolio/detail/detail.js b/src/views/akopolio/detail/detail.js index f916125..5bb4867 100644 --- a/src/views/akopolio/detail/detail.js +++ b/src/views/akopolio/detail/detail.js @@ -51,16 +51,19 @@ export default { console.log("Portfolio ID:", portfolioId); - // 포트폴리오 데이터 가져오기 - const fetchPortfolioById = async (portfolioId) => { - try { - const apiUrl = `${process.env.VUE_APP_BE_API_URL}/api/portfolios/${portfolioId}`; - console.log('Fetching portfolio from URL:', apiUrl); // API URL 출력 - - // Fetch 요청 - const response = await fetch(apiUrl); - console.log('Response status:', response.status); // 상태 코드 확인 - + // 포트폴리오 데이터 가져오기 + const fetchPortfolioById = async (portfolioId) => { + try { + const apiUrl = `${process.env.VUE_APP_BE_API_URL}/api/portfolios/${portfolioId}` + console.log('Fetching portfolio from URL:', apiUrl) // API URL 출력 + + // Fetch 요청 + const response = await fetch(apiUrl, { + method: 'GET', + credentials: 'include' + }) + console.log('Response status:', response.status) // 상태 코드 확인 + if (!response.ok) { console.error(`Response status: ${response.status}, ${response.statusText}`); // 예외 처리를 통해 사용자에게 상세한 에러 메시지 제공 @@ -109,8 +112,11 @@ export default { // 백엔드 API 연동 const response = await fetch( `${process.env.VUE_APP_BE_API_URL}/api/portfolios/${portfolioId}`, - { method: 'DELETE' } - ); + { + method: 'DELETE', + credentials: 'include' + } + ) if (!response.ok) { throw new Error(`Failed to delete portfolio: ${response.statusText}`); @@ -139,4 +145,4 @@ export default { handleDeletePortfolio, }; }, -}; +}; \ No newline at end of file diff --git a/src/views/akopolio/main/main.js b/src/views/akopolio/main/main.js index 6c6a72b..cbecde1 100644 --- a/src/views/akopolio/main/main.js +++ b/src/views/akopolio/main/main.js @@ -45,6 +45,7 @@ export default { }; }, computed: { + filteredPortfolioList() { let filteredList = this.portfolioList; From 390ba2e53205210c3576e62e26be203d9ac4344e Mon Sep 17 00:00:00 2001 From: study2895 <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:05:25 +0900 Subject: [PATCH 04/17] =?UTF-8?q?[Feat]=20#9=20-=20=EC=BA=98=EB=A6=B0?= =?UTF-8?q?=EB=8D=94=20=ED=8E=98=EC=9D=B4=EC=A7=80=20api=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/calendar/CalendarMainView.vue | 61 ++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/views/calendar/CalendarMainView.vue b/src/views/calendar/CalendarMainView.vue index af7a085..2f3c6ca 100644 --- a/src/views/calendar/CalendarMainView.vue +++ b/src/views/calendar/CalendarMainView.vue @@ -101,12 +101,16 @@ onMounted(() => { class="schedule-popup" v-if="isScheduleOpen && selectedEvents.length > 0" > -

학사 일정

-
-

{{ event.title }}

-

{{ formatDateRange(event.startDate, event.endDate) }}

+ + -
@@ -225,7 +229,7 @@ onMounted(() => { .schedule-popup { position: fixed; - bottom: 0; + bottom: -100%; /* 시작 위치: 화면 아래 */ left: 0; right: 0; background-color: #ffffff; @@ -235,6 +239,9 @@ onMounted(() => { max-height: 60vh; width: 395px; margin: 0 auto; + box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.1); + animation: slide-up 0.3s ease-out forwards; /* 부드러운 위로 이동 애니메이션 */ + z-index: 1000; } .link-button { @@ -268,4 +275,46 @@ onMounted(() => { margin: 0 auto; margin-top: 4px; } + +@keyframes slide-up { + from { + bottom: -100%; /* 초기 상태 */ + } + to { + bottom: 0; /* 최종 상태 */ + } +} + +.popup-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +} + +.popup-header h2 { + font-size: 1.25rem; + font-weight: bold; + color: #4a4a4a; +} + +.close-button { + background: none; + border: none; + font-size: 1.5rem; + font-weight: bold; + color: #b3b3b3; + cursor: pointer; + transition: color 0.3s; +} + +.close-button:hover { + color: #ff7f00; +} + +.popup-content { + display: flex; + flex-direction: column; + gap: 1rem; +} From 227fd195cf3d6c1992c212622ef37e8848166ad3 Mon Sep 17 00:00:00 2001 From: study2895 <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:06:01 +0900 Subject: [PATCH 05/17] =?UTF-8?q?[Feat]=20#21=20-=20=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=97=B0=EA=B2=B0=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mainpage/MainpageView.vue | 105 +++++++++++----------------- 1 file changed, 41 insertions(+), 64 deletions(-) diff --git a/src/views/mainpage/MainpageView.vue b/src/views/mainpage/MainpageView.vue index eab74ce..185cd7d 100644 --- a/src/views/mainpage/MainpageView.vue +++ b/src/views/mainpage/MainpageView.vue @@ -49,7 +49,12 @@ }" > {{ task.name }} - +
@@ -63,7 +68,12 @@ }" > {{ task.name }} - +
@@ -88,7 +98,6 @@ From cba4d79b446f3732adcbeefd34aaf320730ea00d Mon Sep 17 00:00:00 2001 From: Jiwon Jeong <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:28:14 +0900 Subject: [PATCH 06/17] =?UTF-8?q?Docs:=20README.md=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9771f63..c0c58b6 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,8 @@ - ### 📑 API 명세서 - - 각 API의 설명, 요청 및 응답 예시를 포함합니다. +     ![1](https://github.com/user-attachments/assets/21191f05-1f77-4c98-878c-f3b5ddaa6f99) +
@@ -105,9 +106,15 @@ ## ▶ 실행 방법 -1. **환경 설정**: 프로젝트 실행을 위한 필수 환경 변수 및 설정 정보를 포함합니다. -2. **의존성 설치**: 프로젝트의 종속성을 설치하는 단계입니다. +1. **환경 설정**: Node.js, npm, vue-cli를 설치합니다. + ```bash + npm install -g @vue/cli +2. **의존성 설치**:
+ ```bash + npm install 3. **프로젝트 실행**: 실행 명령어로 프로젝트를 시작합니다. + ```bash + npm install
From d91a4c77d31f9ff2b4ec9b41215b67cebad03695 Mon Sep 17 00:00:00 2001 From: Jiwon Jeong <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:28:45 +0900 Subject: [PATCH 07/17] Docs: Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c0c58b6..577c709 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ ![osori](https://github.com/user-attachments/assets/d90a2ae9-aac0-4ba0-92bf-fd08abee8d4b) -- ### 📑 API 명세서 +- ### 📑 API 명세서 일부     ![1](https://github.com/user-attachments/assets/21191f05-1f77-4c98-878c-f3b5ddaa6f99) From 046b827ef943964a6c405c97885153154625277f Mon Sep 17 00:00:00 2001 From: Jiwon Jeong <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:29:49 +0900 Subject: [PATCH 08/17] ]Docs] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 577c709..fce7abe 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ npm install 3. **프로젝트 실행**: 실행 명령어로 프로젝트를 시작합니다. ```bash - npm install + npm run dev
From 860bace93eea76ade14facf3cc94a3e8d0454df6 Mon Sep 17 00:00:00 2001 From: Jiwon Jeong <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:41:39 +0900 Subject: [PATCH 09/17] =?UTF-8?q?Docs:=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=ED=8A=B8=EB=A6=AC=20=EA=B5=AC=EC=A1=B0=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fce7abe..5628936 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,37 @@ ## 🏗 설계 및 구현 - ### 📂 프로젝트 구조 - - 프로젝트의 주요 디렉토리 구조와 설명을 포함합니다. + +``` +📦 프로젝트 루트 + ┣ 📂src + ┃ ┣ 📂assets + ┃ ┃ ┣ 📂data + ┃ ┃ ┣ 📂fonts + ┃ ┃ ┣ 📂Icons + ┃ ┃ ┃ ┗ 📂akoming + ┃ ┃ ┣ 📂images + ┃ ┃ ┗ 📂styles + ┃ ┣ 📂components # 공용 컴포넌트 모음 + ┃ ┃ ┣ 📂common + ┃ ┃ ┗ 📂layout + ┃ ┣ 📂router # Vue Router 설정 파일 + ┃ ┣ 📂store # Vuex 상태 관리 모듈 + ┃ ┣ 📂views + ┃ ┃ ┣ 📂akopolio # 아코폴리오 관련 페이지 + ┃ ┃ ┣ 📂calendar # 학사 일정 캘린더 관련 페이지 + ┃ ┃ ┣ 📂feed # 피드 관련 페이지 + ┃ ┃ ┣ 📂login # 로그인, 회원가입, 마이페이지 관련 페이지 + ┃ ┃ ┣ 📂mainpage # 메인 페이지 관련 파일 + ┃ ┃ ┗ 📜NotFound.vue # 404 에러 페이지 + ┣ 📂public # 빌드되지 않는 정적 파일 + ┣ 📂docs # 문서 폴더 + ┃ ┗ 📜README.md + ┣ 📜App.vue # Vue 앱의 루트 컴포넌트 + ┣ 📜main.js # Vue 앱 초기화 파일 +``` + + - ### 🧩 다이어그램 아키텍처 다이어그램, 서비스 흐름, 데이터 흐름 등을 그림으로 표현합니다. From 7b47db9fef475a224be86f2314f9ff7f9d865cff Mon Sep 17 00:00:00 2001 From: Jiwon Jeong <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:42:55 +0900 Subject: [PATCH 10/17] Docs: Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5628936..390bc2f 100644 --- a/README.md +++ b/README.md @@ -65,11 +65,11 @@ ┃ ┃ ┃ ┗ 📂akoming ┃ ┃ ┣ 📂images ┃ ┃ ┗ 📂styles - ┃ ┣ 📂components # 공용 컴포넌트 모음 + ┃ ┣ 📂components # 공용 컴포넌트 ┃ ┃ ┣ 📂common ┃ ┃ ┗ 📂layout - ┃ ┣ 📂router # Vue Router 설정 파일 - ┃ ┣ 📂store # Vuex 상태 관리 모듈 + ┃ ┣ 📂router # Vue Router + ┃ ┣ 📂store # Vuex ┃ ┣ 📂views ┃ ┃ ┣ 📂akopolio # 아코폴리오 관련 페이지 ┃ ┃ ┣ 📂calendar # 학사 일정 캘린더 관련 페이지 @@ -77,11 +77,11 @@ ┃ ┃ ┣ 📂login # 로그인, 회원가입, 마이페이지 관련 페이지 ┃ ┃ ┣ 📂mainpage # 메인 페이지 관련 파일 ┃ ┃ ┗ 📜NotFound.vue # 404 에러 페이지 - ┣ 📂public # 빌드되지 않는 정적 파일 - ┣ 📂docs # 문서 폴더 + ┣ 📂public + ┣ 📂docs # 보고서 등 문서 폴더 ┃ ┗ 📜README.md - ┣ 📜App.vue # Vue 앱의 루트 컴포넌트 - ┣ 📜main.js # Vue 앱 초기화 파일 + ┣ 📜App.vue + ┣ 📜main.js ``` From fc1e696d5e5c5fe794a11ccac3394bba0a6662c6 Mon Sep 17 00:00:00 2001 From: study2895 <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 01:06:44 +0900 Subject: [PATCH 11/17] =?UTF-8?q?[Feat]=20=EB=A9=94=EC=9D=B8=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=A1=9C=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mainpage/MainpageView.vue | 134 +++++++++++++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) diff --git a/src/views/mainpage/MainpageView.vue b/src/views/mainpage/MainpageView.vue index 185cd7d..86f1d7a 100644 --- a/src/views/mainpage/MainpageView.vue +++ b/src/views/mainpage/MainpageView.vue @@ -149,6 +149,7 @@ const fetchQuestStatus = async () => { tasks.value[1].completed = questStatus.goalWritten tasks.value[2].completed = questStatus.commentedOnFriendGoal tasks.value[3].completed = questStatus.portfolioWritten + console.log('Updated tasks:', tasks.value) // 확인용 로그 // 스탬프 상태 업데이트 stamps.value.forEach((stamp, index) => { @@ -189,4 +190,135 @@ onMounted(() => { }) - + From 1d2a79257b5fa794bd7f32974a413f0f2147c244 Mon Sep 17 00:00:00 2001 From: study2895 <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 01:07:15 +0900 Subject: [PATCH 12/17] =?UTF-8?q?[Feat]=20=EB=9D=BC=EC=9A=B0=ED=84=B0?= =?UTF-8?q?=EC=97=90=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9D=80=20=EC=82=AC=EC=9A=A9=EC=9E=90=EB=8A=94=20?= =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=ED=95=98=EC=A7=80=20=EB=AA=BB=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/index.js | 48 +++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/router/index.js b/src/router/index.js index aa556ef..f35e74f 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -136,18 +136,40 @@ const router = createRouter({ routes }) -//라우터 가드 설정(세션 기반 쿠기, 나중에 수정 필요) -// meta: { requiresAuth: true } // 인증이 필요한 페이지 -// 라우터 가드 설정 -// router.beforeEach((to, from, next) => { -// const isAuthenticated = store.getters['auth/isAuthenticated'] // 인증 여부 확인 -// if (to.matched.some((record) => record.path.startsWith('/auth'))) { -// next() // /auth 경로는 인증 없이 접근 가능 -// } else if (!isAuthenticated) { -// next('/auth/login') // 인증되지 않은 경우 로그인 페이지로 리다이렉트 -// } else { -// next() // 인증된 경우 해당 경로로 이동 -// } -// }) +//라우터 가드 설정 +// 글로벌 가드 추가 +router.beforeEach(async (to, from, next) => { + const isAuthPage = to.matched.some((record) => + record.path.startsWith('/auth') + ) + + try { + // 세션 상태 확인 API 호출 + const response = await fetch( + `${process.env.VUE_APP_BE_API_URL}/api/quests/status`, + { + method: 'GET', + credentials: 'include' // 세션 쿠키 포함 + } + ) + + if (response.ok) { + if (isAuthPage) { + next('/main') // 이미 인증된 상태라면 메인 페이지로 이동 + } else { + next() // 정상적으로 페이지 이동 + } + } else { + if (isAuthPage) { + next() // 인증 경로로는 접근 가능 + } else { + next('/auth/login') // 인증되지 않았으면 로그인 페이지로 이동 + } + } + } catch (error) { + console.error('Error during authentication check:', error) + next('/auth/login') // 오류 발생 시 로그인 페이지로 이동 + } +}) export default router From 7f22ba7879ad9d407a2586c7c0ad25108ca613de Mon Sep 17 00:00:00 2001 From: Jiwon Jeong <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 01:30:14 +0900 Subject: [PATCH 13/17] =?UTF-8?q?Docs:=20Update=20=ED=9A=8C=EC=9D=98?= =?UTF-8?q?=EB=A1=9D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/\355\232\214\354\235\230\353\241\235.md" | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git "a/docs/\355\232\214\354\235\230\353\241\235.md" "b/docs/\355\232\214\354\235\230\353\241\235.md" index 7d5556e..c66493a 100644 --- "a/docs/\355\232\214\354\235\230\353\241\235.md" +++ "b/docs/\355\232\214\354\235\230\353\241\235.md" @@ -15,11 +15,12 @@ | 8차 | 2024년 10월 16일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 이소은 | https://www.notion.so/8-12db4ba0516b81178342cc75df07750b | | 9차 | 2024년 10월 21일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정지원 | https://www.notion.so/9-12db4ba0516b8164b602fd248747296b | | 10차 | 2024년 10월 23일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 최민 | https://www.notion.so/10-12db4ba0516b81d9a131f2c52ae5ee89 | -| 11차 | 2024년 10월 28일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정예빈 | https://www.notion.so/11-12db4ba0516b8071b0f8fcce55a7a442?pvs=4 | -| 12차 | 2024년 10월 30일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 이소은 | https://www.notion.so/12-bf84f851b63442adba1b69159a772725?pvs=4 | -| 13차 | 2024년 11월 4일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정지원 | https://www.notion.so/13-a6297b09e7bd45fa904862463bca54c4?pvs=4 | -| 14차 | 2024년 11월 6일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 최민 | https://www.notion.so/14-416a0ab074c54e1f945a72cd3c3acb18?pvs=4 | -| 15차 | 2024년 11월 11일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정예빈 | https://www.notion.so/15-29633aca525242d983483ebc20b8871d?pvs=4 | -| 16차 | 2024년 11월 18일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 이소은 | https://www.notion.so/16-dce780571dbe4f9a84e4bb58be834e66?pvs=4 | -| 17차 | 2024년 11월 20일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정지원 | https://www.notion.so/17-476981be247b4d339ff70ae25a91d80e?pvs=4 | - +| 11차 | 2024년 10월 28일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정예빈 | https://www.notion.so/11-12db4ba0516b8071b0f8fcce55a7a442 | +| 12차 | 2024년 10월 30일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 이소은 | https://www.notion.so/12-bf84f851b63442adba1b69159a772725 | +| 13차 | 2024년 11월 4일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정지원 | https://www.notion.so/13-a6297b09e7bd45fa904862463bca54c4 | +| 14차 | 2024년 11월 6일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 최민 | https://www.notion.so/14-416a0ab074c54e1f945a72cd3c3acb18 | +| 15차 | 2024년 11월 11일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정예빈 | https://www.notion.so/15-29633aca525242d983483ebc20b8871d | +| 16차 | 2024년 11월 18일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 이소은 | https://www.notion.so/16-dce780571dbe4f9a84e4bb58be834e66 | +| 17차 | 2024년 11월 20일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정지원 | https://www.notion.so/17-476981be247b4d339ff70ae25a91d80e | +| 18차 | 2024년 11월 27일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 최민 | https://www.notion.so/17-476981be247b4d339ff70ae25a91d80e | +| 19차 | 2024년 12월 4일 | 정기 회의 | 이소은, 최민, 정지원, 정예빈 | 정예빈 | https://www.notion.so/17-476981be247b4d339ff70ae25a91d80e | From 676038bd07df73a222c41d26dfed7d940cd1eb79 Mon Sep 17 00:00:00 2001 From: yebin-jeong <2022112390@dgu.ac.kr> Date: Thu, 5 Dec 2024 01:51:04 +0900 Subject: [PATCH 14/17] =?UTF-8?q?[Feature]=20#26=20-=20=EC=83=81=EC=84=B8,?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B0=B1?= =?UTF-8?q?=EC=97=94=EB=93=9C=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/akopolio/Edit/akopolioEdit.vue | 7 +++- src/views/akopolio/Edit/edit.js | 42 +++++++++++++++----- src/views/akopolio/detail/akopolioDetail.vue | 14 +++---- src/views/akopolio/detail/detail.js | 17 ++++---- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/views/akopolio/Edit/akopolioEdit.vue b/src/views/akopolio/Edit/akopolioEdit.vue index 3bbea85..6193fe3 100644 --- a/src/views/akopolio/Edit/akopolioEdit.vue +++ b/src/views/akopolio/Edit/akopolioEdit.vue @@ -75,7 +75,12 @@
- +
diff --git a/src/views/akopolio/Edit/edit.js b/src/views/akopolio/Edit/edit.js index 3a5437b..6f6b641 100644 --- a/src/views/akopolio/Edit/edit.js +++ b/src/views/akopolio/Edit/edit.js @@ -84,13 +84,17 @@ export default { textarea.style.height = `${textarea.scrollHeight}px`; }; - const fetchPortfolioById = async (id) => { + // 포트폴리오 데이터 가져오기 + const fetchPortfolioById = async (portfolioId) => { try { - const apiUrl = `${process.env.VUE_APP_BE_API_URL}/api/portfolios/${id}`; - console.log('Fetching portfolio from URL:', apiUrl); + const apiUrl = `${process.env.VUE_APP_BE_API_URL}/api/portfolios/${portfolioId}`; + console.log('Fetching portfolio from URL:', apiUrl); // API URL 출력 - const response = await fetch(apiUrl); - console.log('Response status:', response.status); + const response = await fetch(apiUrl, { + method: 'GET', + credentials: 'include', + }); + console.log('Response status:', response.status); // 상태 코드 확인 if (!response.ok) { console.error(`Response status: ${response.status}, ${response.statusText}`); @@ -100,6 +104,7 @@ export default { const data = await response.json(); console.log('Received portfolio data:', data); + // 포트폴리오 데이터 할당 portfolio.value = { baseInfo: data.baseInfo || {}, experience: data.experience || { situation: '', task: '', action: '', result: '' }, @@ -107,7 +112,22 @@ export default { photoUrls: data.photoUrls || [], }; - images.value = portfolio.value.photoUrls || []; + // 각 변수에 포트폴리오 데이터 할당 + activityName.value = portfolio.value.baseInfo.name || ''; // 활동명 + activityDate.value = portfolio.value.baseInfo.startDate || ''; // 활동일 (startDate로 변경) + star.value = portfolio.value.experience || { situation: '', task: '', action: '', result: '' }; // STAR 모델 + pmi.value = portfolio.value.pmi || { plus: '', minus: '', interesting: '' }; // PMI 모델 + images.value = portfolio.value.photoUrls.map((imageUrl) => { + return { + previewUrl: imageUrl, // 서버에서 제공하는 URL을 미리보기 URL로 사용 + name: imageUrl.split('/').pop(), // 파일 이름을 추출 + size: 0, // 기존 이미지는 파일 크기 필요 없음 + containerWidth: '300px', // 기본 크기 설정 + containerHeight: '300px', // 기본 크기 설정 + }; + }); + selectedTags.value = portfolio.value.baseInfo.tags || []; + } catch (error) { console.error('Error fetching portfolio:', error); alert('포트폴리오를 가져오는 중 오류가 발생했습니다.'); @@ -124,7 +144,7 @@ export default { } const newImagesPromises = selectedFiles.map((file) => { - const previewUrl = URL.createObjectURL(file); + const previewUrl = URL.createObjectURL(file); // 새로 추가된 이미지는 미리보기 URL 생성 const imageElement = new Image(); imageElement.src = previewUrl; @@ -171,7 +191,9 @@ export default { }; const removeImage = (index) => { - URL.revokeObjectURL(images.value[index].previewUrl); + if (images.value[index].previewUrl) { + URL.revokeObjectURL(images.value[index].previewUrl); // 생성한 URL을 해제 + } images.value.splice(index, 1); }; @@ -219,6 +241,7 @@ export default { return; } + try { const response = await axios.put( `${process.env.VUE_APP_BE_API_URL}/api/portfolios/${id}`, @@ -237,7 +260,7 @@ export default { minus: pmi.value.minus, interesting: pmi.value.interesting, }, - photoUrls: images.value.map(image => image.name), + photoUrls: images.value.map(image => image.url), }, { headers: { @@ -273,6 +296,7 @@ export default { selectedTags.value = []; await fetchUserData(); await fetchPortfolioById(portfolioId); + }); return { diff --git a/src/views/akopolio/detail/akopolioDetail.vue b/src/views/akopolio/detail/akopolioDetail.vue index e53ee7d..d9934e1 100644 --- a/src/views/akopolio/detail/akopolioDetail.vue +++ b/src/views/akopolio/detail/akopolioDetail.vue @@ -17,11 +17,11 @@

활동명

-

{{ portfolio ? portfolio.title : '' }}

+

{{ portfolio ? portfolio.name : '' }}

활동일

-

{{ portfolio ? portfolio.createdDate : '' }}

+

{{ portfolio ? portfolio.startDate : '' }}

분야 설정

@@ -36,22 +36,22 @@

경험 (STAR)

-
+

Situation

-

{{ portfolio.star.situation || '상황 정보가 없습니다.' }}

+

{{ portfolio.experience.situation || '상황 정보가 없습니다.' }}

Task

-

{{ portfolio.star.task || '내용이 없습니다.' }}

+

{{ portfolio.experience.task || '내용이 없습니다.' }}

Action

-

{{ portfolio.star.action || '내용이 없습니다.' }}

+

{{ portfolio.experience.action || '내용이 없습니다.' }}

Result

-

{{ portfolio.star.result || '내용이 없습니다.' }}

+

{{ portfolio.experience.result || '내용이 없습니다.' }}

diff --git a/src/views/akopolio/detail/detail.js b/src/views/akopolio/detail/detail.js index 5bb4867..e77ef83 100644 --- a/src/views/akopolio/detail/detail.js +++ b/src/views/akopolio/detail/detail.js @@ -81,21 +81,20 @@ export default { // 응답 데이터 확인 console.log('Received portfolio data:', data); - // 포트폴리오 데이터를 구조에 맞게 저장 portfolio.value = { - baseInfo: data.baseInfo || {}, // 기본 정보 저장 - experience: data.experience || {}, // 경험 정보 저장 - pmi: data.pmi || {}, // PMI 정보 저장 - photoUrls: data.photoUrls || [], // 사진 URL 배열 저장 + name: data.baseInfo.name, // 활동명 + startDate: data.baseInfo.startDate, // 활동일 + tags: data.baseInfo.tags || [], // 태그 + experience: data.experience || { situation: '', task: '', action: '', result: '' }, + pmi: data.pmi || { plus: '', minus: '', interesting: '' }, + photoUrls: data.photoUrls || [], // 이미지 }; - // 이미지 데이터 따로 저장 - images.value = portfolio.value.photoUrls; - + images.value = data.photoUrls || []; } catch (error) { console.error('Error fetching portfolio:', error); alert('포트폴리오를 가져오는 중 오류가 발생했습니다.'); - portfolio.value = null; // 오류 발생 시 초기화 + portfolio.value = null; images.value = []; } }; From 7603f50ace6432c8a7fa4074e97fb7d34820736d Mon Sep 17 00:00:00 2001 From: yebin-jeong <2022112390@dgu.ac.kr> Date: Thu, 5 Dec 2024 02:54:59 +0900 Subject: [PATCH 15/17] =?UTF-8?q?[style]=20button=20div=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/akopolio/Edit/akopolioEdit.vue | 46 +++++++++++--------- src/views/akopolio/create/akopolioCreate.vue | 33 +++++++++----- src/views/akopolio/detail/akopolioDetail.vue | 17 +++++--- src/views/akopolio/main/akopolioMain.vue | 23 ++++++---- src/views/akopolio/paginationNav.vue | 45 +++++++++++-------- 5 files changed, 98 insertions(+), 66 deletions(-) diff --git a/src/views/akopolio/Edit/akopolioEdit.vue b/src/views/akopolio/Edit/akopolioEdit.vue index 6193fe3..58bbe6f 100644 --- a/src/views/akopolio/Edit/akopolioEdit.vue +++ b/src/views/akopolio/Edit/akopolioEdit.vue @@ -29,14 +29,14 @@
- +
+ {{ tag }} +
@@ -81,15 +81,15 @@ :alt="`Uploaded Image ${index + 1}`" class="image-preview" /> - +
X
- -
+
저장하기
+ @@ -160,7 +160,7 @@ textarea { font-size: 12px; } -button { +.tag-div { display: inline-block; margin: 3px; padding: 5px 10px; @@ -170,8 +170,13 @@ button { border: 1px solid #eec092; } -button.active { - background-color: #f6b87a; +.tag-div.active { + background-color: #f7c088; +} + +.tag-div:hover { + background-color: #f7c088; + cursor: pointer; } /* 분야 설정 박스 */ @@ -213,12 +218,14 @@ button.active { font-size: 0.875rem; font-weight: 500; border-radius: 9999px; + text-align: center; transition: background-color 0.3s ease; margin-bottom: 20px; } .save-button:hover { background-color: #e5a769; + cursor: pointer; } .experience-container h3, @@ -274,16 +281,15 @@ label { top: 5px; right: 5px; color: black; - border: none; - background: none; /* 배경색 제거 */ - font-size: 16px; /* X 아이콘이 더 잘 보이도록 크기 조정 */ + background: none; + font-size: 15px; cursor: pointer; - transition: color 0.3s; /* 색상 전환 애니메이션 추가 */ + transition: color 0.3s; } .delete-image-btn:hover { - color: white; + color:#d9d9d9; } @@ -307,12 +313,10 @@ label { object-fit: contain; /* 이미지가 컨테이너 내에서 비율을 유지하면서 크기 조정 */ } -/* 기본 input[type="file"] 숨기기 */ input[type="file"] { display: none; } -/* 커스텀 버튼 스타일 */ .custom-file-upload { background-color: #faf5f0; color: #f3ab62; diff --git a/src/views/akopolio/create/akopolioCreate.vue b/src/views/akopolio/create/akopolioCreate.vue index 29ddaee..5cca151 100644 --- a/src/views/akopolio/create/akopolioCreate.vue +++ b/src/views/akopolio/create/akopolioCreate.vue @@ -29,14 +29,15 @@
- +
+ {{ tag }} +
@@ -105,14 +106,14 @@
- +
X
- +
저장하기
@@ -183,7 +184,7 @@ textarea { font-size: 12px; } -button { +.tag-item { display: inline-block; margin: 3px; padding: 5px 10px; @@ -191,12 +192,18 @@ button { background-color: white; transition: background-color 0.3s; border: 1px solid #eec092; + cursor: pointer; } -button.active { +.tag-item.active { background-color: #f6b87a; } +.tag-item:hover { + background-color: #f6b87a; + cursor: pointer; +} + /* 분야 설정 박스 */ .category-box { background-color: white; @@ -236,12 +243,14 @@ button.active { font-size: 0.875rem; font-weight: 500; border-radius: 9999px; + text-align: center; transition: background-color 0.3s ease; margin-bottom: 20px; } .save-button:hover { background-color: #e5a769; + cursor: pointer; } h3 { diff --git a/src/views/akopolio/detail/akopolioDetail.vue b/src/views/akopolio/detail/akopolioDetail.vue index d9934e1..3720fc6 100644 --- a/src/views/akopolio/detail/akopolioDetail.vue +++ b/src/views/akopolio/detail/akopolioDetail.vue @@ -4,11 +4,11 @@
- - +
@@ -122,24 +122,29 @@ .edit-button, .delete-button { display: flex; + align-items: center; + justify-content: center; padding: 5px 10px; border-radius: 10px; - border: none; cursor: pointer; font-size: 10px; gap: 4px; + background-color: white; } .edit-button { - background-color: white; color: black; } .delete-button { - background-color: white; color: red; } +.edit-button:hover, +.delete-button:hover { + background-color: #f2eeee; +} + .image-upload-container, .experience-container, .pmi-container { diff --git a/src/views/akopolio/main/akopolioMain.vue b/src/views/akopolio/main/akopolioMain.vue index 8f6d145..74b2264 100644 --- a/src/views/akopolio/main/akopolioMain.vue +++ b/src/views/akopolio/main/akopolioMain.vue @@ -10,7 +10,7 @@ @input="applyFilters" placeholder="활동명을 입력하세요 (두 글자 이상)" /> - +
초기화
@@ -33,14 +33,14 @@
- +
@@ -75,13 +75,13 @@ @change-page="handlePageChanged" /> - + @@ -153,7 +153,7 @@ input[type='date'] { font-size: 12px; } -button { +.tag-container div { display: inline-block; margin: 3px; padding: 5px 10px; @@ -161,12 +161,18 @@ button { background-color: white; transition: background-color 0.3s; border: 1px solid #eec092; + cursor: pointer; } -button.active { +.tag-container div.active { background-color: #f6b87a; } +.tag-container div:hover { + background-color: #f6b87a; + cursor: pointer; +} + .filter-container { background-color: white; padding: 15px; @@ -284,12 +290,11 @@ button.active { margin-left: 10px; /* 오른쪽 여백 */ background-color: #f4b28c; color: black; - border: none; padding: 6px 11px; border-radius: 5px; cursor: pointer; font-size: 13px; - border-radius: 8px; + text-align: center; } .reset-btn:hover { diff --git a/src/views/akopolio/paginationNav.vue b/src/views/akopolio/paginationNav.vue index 8b3cdc3..8730f06 100644 --- a/src/views/akopolio/paginationNav.vue +++ b/src/views/akopolio/paginationNav.vue @@ -1,21 +1,27 @@ @@ -28,11 +34,10 @@ export default { computed: { visiblePages() { const pages = []; - const maxVisible = 5; // 최대 표시할 페이지 수 + const maxVisible = 5; let startPage = Math.max(1, this.currentPage - Math.floor(maxVisible / 2)); let endPage = Math.min(this.totalPages, startPage + maxVisible - 1); - // 끝 페이지가 부족할 때 시작 페이지 조정 if (endPage - startPage < maxVisible - 1) { startPage = Math.max(1, endPage - maxVisible + 1); } @@ -60,21 +65,25 @@ export default { margin-top: 20px; } -button { +.page-item { margin: 0 5px; padding: 5px; - cursor: pointer; - background: none; - border: none; font-size: 16px; + cursor: pointer; + user-select: none; } -button.active{ +.page-item.active { font-weight: bold; } -button:disabled { +.page-item.disabled { cursor: not-allowed; opacity: 0.5; } - \ No newline at end of file + +.page-item:not(.disabled):hover { + background-color: none; +} + + From 5824518b12e88e7fc0a2fe0118071617493a9b5f Mon Sep 17 00:00:00 2001 From: study2895 <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 15:06:18 +0900 Subject: [PATCH 16/17] =?UTF-8?q?[Remove]=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mainpage/MainpageStyled.css | 130 ------------ src/views/test/AboutView.vue | 5 - src/views/test/ErrorMessage.vue | 30 --- src/views/test/HelloWorld.vue | 138 ------------- src/views/test/HomeView.vue | 18 -- src/views/test/NotFound2.vue | 29 --- src/views/test/PortfolioByTag.vue | 165 --------------- src/views/test/PortfolioCreate.vue | 202 ------------------ src/views/test/PortfolioTest.vue | 280 ------------------------- src/views/test/Profile.vue | 143 ------------- src/views/test/SignIn.vue | 226 -------------------- src/views/test/SignUpForm.vue | 195 ----------------- src/views/test/SignUpForm2.vue | 287 -------------------------- src/views/test/TaliwindResopon.vue | 114 ---------- src/views/test/VerifyEmail.vue | 208 ------------------- src/views/test/WeeklyCalenderTest.vue | 25 --- src/views/test/auth.js | 72 ------- src/views/test/posts.js | 0 src/views/test/tags.js | 0 src/views/test/testrouter.js | 126 ----------- 20 files changed, 2393 deletions(-) delete mode 100644 src/views/mainpage/MainpageStyled.css delete mode 100644 src/views/test/AboutView.vue delete mode 100644 src/views/test/ErrorMessage.vue delete mode 100644 src/views/test/HelloWorld.vue delete mode 100644 src/views/test/HomeView.vue delete mode 100644 src/views/test/NotFound2.vue delete mode 100644 src/views/test/PortfolioByTag.vue delete mode 100644 src/views/test/PortfolioCreate.vue delete mode 100644 src/views/test/PortfolioTest.vue delete mode 100644 src/views/test/Profile.vue delete mode 100644 src/views/test/SignIn.vue delete mode 100644 src/views/test/SignUpForm.vue delete mode 100644 src/views/test/SignUpForm2.vue delete mode 100644 src/views/test/TaliwindResopon.vue delete mode 100644 src/views/test/VerifyEmail.vue delete mode 100644 src/views/test/WeeklyCalenderTest.vue delete mode 100644 src/views/test/auth.js delete mode 100644 src/views/test/posts.js delete mode 100644 src/views/test/tags.js delete mode 100644 src/views/test/testrouter.js diff --git a/src/views/mainpage/MainpageStyled.css b/src/views/mainpage/MainpageStyled.css deleted file mode 100644 index 26690ee..0000000 --- a/src/views/mainpage/MainpageStyled.css +++ /dev/null @@ -1,130 +0,0 @@ -/* 외부 컨테이너 */ -.page-container { - min-height: 100vh; - background-color: #fff9f2; - font-family: 'NanumSquareRound', sans-serif; - display: flex; - justify-content: center; -} - -/* 모바일 컨테이너 */ -.mobile-container { - width: 395px; - min-width: 340px; - background-color: #fae8da; - min-height: 100vh; - position: relative; - overflow-y: auto; -} - -/* 메인 컨텐츠 */ -.main-content { - display: flex; - flex-direction: column; - padding: 6rem 1.5rem 6rem; - font-family: 'NanumSquareRound', sans-serif; -} - -.main-content .title { - margin-bottom: 70px; - font-size: 1.25rem; - font-weight: 500; - text-align: center; - color: #4a4a4a; - font-family: 'UhBeeSehyun', sans-serif; -} - -/* 스탬프 영역 */ -.stamp-container { - position: relative; - width: 390px; - height: 520px; - margin: 0 auto; -} - -.stamp-container .stamp { - position: absolute; - width: 95px; - height: 95px; - display: flex; - justify-content: center; - align-items: center; -} - -.stamp-container .stamp img { - width: 100%; - height: 100%; -} - -/* 할 일 표시 영역 */ -.task-container { - margin-top: -80px; - margin-bottom: 3rem; - display: flex; - flex-direction: column; - align-items: center; - gap: 0.75rem; -} - -.task-container .task-row { - display: flex; - gap: 0.75rem; - width: 100%; - max-width: 290px; -} - -.task-container .task-row .task { - display: flex; - align-items: center; - justify-content: space-between; - flex: 1; - height: 40px; - padding: 0 1rem; - background-color: white; - border-radius: 17px; -} - -.task-container .task-row .task span { - font-size: 0.875rem; - font-family: 'NanumSquareRound', sans-serif; - color: var(--task-color, #b3b3b3); -} - -.task-container .task-row .task img { - width: 20px; - height: 20px; - filter: var(--task-filter, grayscale(100%)); -} - -/* 아코 이미지 영역 */ -.ako-image-container { - text-align: center; - display: flex; - flex-direction: column; - align-items: center; - margin-top: 2.5rem; -} - -.ako-image-container .ako-status { - display: flex; - align-items: center; - margin-bottom: 0.5rem; -} - -.ako-image-container .ako-status img { - width: 32px; - height: 32px; - margin-right: 0.5rem; -} - -.ako-image-container .ako-status p { - font-size: 0.875rem; - color: #757575; - font-family: 'NanumSquareRound', sans-serif; -} - -.ako-image-container .ako-image { - width: 256px; - height: 256px; - margin: 0 auto; -} diff --git a/src/views/test/AboutView.vue b/src/views/test/AboutView.vue deleted file mode 100644 index 3fa2807..0000000 --- a/src/views/test/AboutView.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/src/views/test/ErrorMessage.vue b/src/views/test/ErrorMessage.vue deleted file mode 100644 index 95385a2..0000000 --- a/src/views/test/ErrorMessage.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - diff --git a/src/views/test/HelloWorld.vue b/src/views/test/HelloWorld.vue deleted file mode 100644 index 75cbd09..0000000 --- a/src/views/test/HelloWorld.vue +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - diff --git a/src/views/test/HomeView.vue b/src/views/test/HomeView.vue deleted file mode 100644 index 270fa07..0000000 --- a/src/views/test/HomeView.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/src/views/test/NotFound2.vue b/src/views/test/NotFound2.vue deleted file mode 100644 index c971c97..0000000 --- a/src/views/test/NotFound2.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - diff --git a/src/views/test/PortfolioByTag.vue b/src/views/test/PortfolioByTag.vue deleted file mode 100644 index e9cd24a..0000000 --- a/src/views/test/PortfolioByTag.vue +++ /dev/null @@ -1,165 +0,0 @@ - - - - - diff --git a/src/views/test/PortfolioCreate.vue b/src/views/test/PortfolioCreate.vue deleted file mode 100644 index 3a39f9a..0000000 --- a/src/views/test/PortfolioCreate.vue +++ /dev/null @@ -1,202 +0,0 @@ - - - - - diff --git a/src/views/test/PortfolioTest.vue b/src/views/test/PortfolioTest.vue deleted file mode 100644 index c32f984..0000000 --- a/src/views/test/PortfolioTest.vue +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - diff --git a/src/views/test/Profile.vue b/src/views/test/Profile.vue deleted file mode 100644 index 5a8f5da..0000000 --- a/src/views/test/Profile.vue +++ /dev/null @@ -1,143 +0,0 @@ - - - - - diff --git a/src/views/test/SignIn.vue b/src/views/test/SignIn.vue deleted file mode 100644 index bb86d7b..0000000 --- a/src/views/test/SignIn.vue +++ /dev/null @@ -1,226 +0,0 @@ - - - - - diff --git a/src/views/test/SignUpForm.vue b/src/views/test/SignUpForm.vue deleted file mode 100644 index bcb6b3f..0000000 --- a/src/views/test/SignUpForm.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - - - diff --git a/src/views/test/SignUpForm2.vue b/src/views/test/SignUpForm2.vue deleted file mode 100644 index ba563f6..0000000 --- a/src/views/test/SignUpForm2.vue +++ /dev/null @@ -1,287 +0,0 @@ - - - - - diff --git a/src/views/test/TaliwindResopon.vue b/src/views/test/TaliwindResopon.vue deleted file mode 100644 index aeaa5b8..0000000 --- a/src/views/test/TaliwindResopon.vue +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - diff --git a/src/views/test/VerifyEmail.vue b/src/views/test/VerifyEmail.vue deleted file mode 100644 index 7efdd32..0000000 --- a/src/views/test/VerifyEmail.vue +++ /dev/null @@ -1,208 +0,0 @@ - - - - - diff --git a/src/views/test/WeeklyCalenderTest.vue b/src/views/test/WeeklyCalenderTest.vue deleted file mode 100644 index 298da47..0000000 --- a/src/views/test/WeeklyCalenderTest.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/src/views/test/auth.js b/src/views/test/auth.js deleted file mode 100644 index f570c59..0000000 --- a/src/views/test/auth.js +++ /dev/null @@ -1,72 +0,0 @@ -import axios from 'axios' - -const state = { - user: null, - isAuthenticated: false -} - -const mutations = { - login(state, user) { - state.user = user - state.isAuthenticated = true - }, - logout(state) { - state.user = null - state.isAuthenticated = false - } -} - -const actions = { - async login({ commit }, { email, password, rememberMe = false }) { - try { - const response = await axios.post( - 'http://localhost:8080/api/users/login', - { - email, - password - } - ) - const user = response.data.user - commit('login', user) - - //remeber me 로그인 상태 유지 로직 - if (rememberMe) { - // 로그인 상태 유지 체크 시 로컬 스토리지에 저장 - localStorage.setItem('user', JSON.stringify(user)) - } else { - // 체크 안한 경우 세션 스토리지에 저장 - sessionStorage.setItem('user', JSON.stringify(user)) - } - - //localStorage.setItem('user', JSON.stringify(user)) - return { success: true } // 로그인 성공 시 - } catch (error) { - console.log(error.response) - const errorMessage = error.response?.data?.message || '로그인 실패' - return { success: false, message: errorMessage } // 에러 발생 시 에러 메시지 반환 - } - }, - logout({ commit }) { - commit('logout') - localStorage.removeItem('user') - sessionStorage.removeItem('user') // 세션 스토리지에서도 삭제 - }, - initializeStore({ commit }) { - const user = JSON.parse(localStorage.getItem('user')) - if (user) { - commit('login', user) - } - } -} - -const getters = { - isAuthenticated: (state) => state.isAuthenticated, - user: (state) => state.user -} - -export default { - state, - mutations, - actions, - getters -} diff --git a/src/views/test/posts.js b/src/views/test/posts.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/views/test/tags.js b/src/views/test/tags.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/views/test/testrouter.js b/src/views/test/testrouter.js deleted file mode 100644 index 22e8e46..0000000 --- a/src/views/test/testrouter.js +++ /dev/null @@ -1,126 +0,0 @@ -/* eslint-disable */ -import { createRouter, createWebHashHistory } from 'vue-router' -import AuthLayout from '@/components/layout/AuthLayout.vue' // 중첩 라우팅의 부모 레이아웃 -import PortfolioLayout from '@/components/layout/PortfolioLayout.vue' // 중첩 라우팅의 부모 레이아웃 - -// 자동 임포트 함수 (src/views 내의 모든 .vue 파일을 임포트) -function importAllViews() { - const viewFiles = require.context('@/views', true, /\.vue$/) - const views = {} - - // 각 파일을 순회하면서 임포트 - viewFiles.keys().forEach((filePath) => { - const viewName = filePath - .split('/') - .pop() // 파일 이름만 추출 - .replace('.vue', '') // .vue 확장자 제거 - - // 컴포넌트 이름과 해당 컴포넌트를 맵핑 - views[viewName] = viewFiles(filePath).default - }) - - return views -} - -// 자동으로 임포트된 모든 Vue 컴포넌트 객체 -const importedViews = importAllViews() - -const routes = [ - { - path: '/', - name: 'home', - component: importedViews['HomeView'] // 자동 임포트 적용 - }, - { - path: '/about', - name: 'about', - component: importedViews['AboutView'] // 자동 임포트 적용 - }, - { - path: '/auth', - component: AuthLayout, // 부모 레이아웃 - children: [ - { - path: 'signin', - name: 'signin', - component: importedViews['SignIn'] // 자동 임포트 적용 - }, - { - path: 'signupform', - name: 'signupform', - component: importedViews['SignUpForm'] // 자동 임포트 적용 - }, - { - path: 'verifyemail', - name: 'verifyemail', - component: importedViews['VerifyEmail'] // 자동 임포트 적용 - }, - { - path: 'signupform2', - name: 'SignUpForm2', - component: importedViews['SignUpForm2'] // 자동 임포트 적용 - }, - { - path: 'signup', - name: 'SignupView', - component: importedViews['SignupView'] // 자동 임포트 적용 - }, - { - path: 'login', - name: 'LoginView', - component: importedViews['LoginView'] // 자동 임포트 적용 - } - ] - }, - { - path: '/profile', - name: 'profile', - component: importedViews['Profile'], // 자동 임포트 적용 - meta: { requiresAuth: true } // 인증이 필요한 페이지 - }, - { - path: '/portfolios', - component: PortfolioLayout, // 공통 레이아웃 컴포넌트 - children: [ - { - path: 'new', - name: 'CreatePortfolio', - component: importedViews['PortfolioCreate'] // 자동 임포트 적용 - }, - { - path: 'tag', - name: 'SearchByTag', - component: importedViews['PortfolioByTag'] // 자동 임포트 적용 - }, - { - path: 'test', - name: 'Test', - component: importedViews['PortfolioTest'] // 자동 임포트 적용 - } - ] - }, - { - path: '/responsivetest', - name: 'TaliwindResopon', - component: importedViews['TaliwindResopon'] // 자동 임포트 적용 - }, - { - path: '/weeklycalendertest', - name: 'WeeklyCalenderTest', - component: importedViews['WeeklyCalenderTest'] // 자동 임포트 적용 - }, - { - path: '/:catchAll(.*)', - name: 'NotFound', - component: importedViews['NotFound'] // 자동 임포트 적용 - } -] - -const router = createRouter({ - history: createWebHashHistory('/akoming/'), // Hash 모드를 사용 - routes -}) - -//라우터 가드 설정(세션 기반 쿠기, 나중에 수정 필요) - -export default router From c31eb4915d58d309277374480d2a987fcc7ae23f Mon Sep 17 00:00:00 2001 From: study2895 <144806675+study2895@users.noreply.github.com> Date: Thu, 5 Dec 2024 16:50:22 +0900 Subject: [PATCH 17/17] =?UTF-8?q?[Fix]=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=ED=9B=84=20auth.js=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/index.js | 69 +++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index f605fac..ca3228e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,60 +1,61 @@ -import { createStore } from 'vuex'; -import auth from '../views/test/auth.js'; // auth 모듈 import -import login from './modules/login.js'; // 로그인 모듈 import -import { v4 as uuidv4 } from 'uuid'; // UUID를 사용하여 고유 ID 생성 +import { createStore } from 'vuex' +import login from './modules/login.js' // 로그인 모듈 import +import { v4 as uuidv4 } from 'uuid' // UUID를 사용하여 고유 ID 생성 // 로컬 스토리지에서 포트폴리오 가져오기 const getStoredPortfolios = () => { - const storedPortfolios = localStorage.getItem('portfolios'); - return storedPortfolios ? JSON.parse(storedPortfolios) : []; -}; + const storedPortfolios = localStorage.getItem('portfolios') + return storedPortfolios ? JSON.parse(storedPortfolios) : [] +} const store = createStore({ state: { - portfolios: getStoredPortfolios(), // 로컬 스토리지에서 포트폴리오 초기화 + portfolios: getStoredPortfolios() // 로컬 스토리지에서 포트폴리오 초기화 }, mutations: { ADD_PORTFOLIO(state, portfolio) { - const newPortfolio = { ...portfolio, id: uuidv4() }; // 고유 ID 추가 - state.portfolios.push(newPortfolio); // 포트폴리오 추가 - localStorage.setItem('portfolios', JSON.stringify(state.portfolios)); // 로컬 스토리지에 저장 + const newPortfolio = { ...portfolio, id: uuidv4() } // 고유 ID 추가 + state.portfolios.push(newPortfolio) // 포트폴리오 추가 + localStorage.setItem('portfolios', JSON.stringify(state.portfolios)) // 로컬 스토리지에 저장 }, DELETE_PORTFOLIO(state, portfolioId) { - state.portfolios = state.portfolios.filter(portfolio => portfolio.id !== portfolioId); - localStorage.setItem('portfolios', JSON.stringify(state.portfolios)); // 로컬 스토리지에 삭제 후 저장 + state.portfolios = state.portfolios.filter( + (portfolio) => portfolio.id !== portfolioId + ) + localStorage.setItem('portfolios', JSON.stringify(state.portfolios)) // 로컬 스토리지에 삭제 후 저장 }, - // 수정 기능을 위한 UPDATE_PORTFOLIO 뮤테이션 추가 - UPDATE_PORTFOLIO(state, updatedPortfolio) { - const index = state.portfolios.findIndex(portfolio => portfolio.id === updatedPortfolio.id); + // 수정 기능을 위한 UPDATE_PORTFOLIO 뮤테이션 추가 + UPDATE_PORTFOLIO(state, updatedPortfolio) { + const index = state.portfolios.findIndex( + (portfolio) => portfolio.id === updatedPortfolio.id + ) if (index !== -1) { - state.portfolios.splice(index, 1, updatedPortfolio); // 기존 항목을 업데이트된 항목으로 교체 - localStorage.setItem('portfolios', JSON.stringify(state.portfolios)); // 로컬 스토리지에 업데이트 후 저장 + state.portfolios.splice(index, 1, updatedPortfolio) // 기존 항목을 업데이트된 항목으로 교체 + localStorage.setItem('portfolios', JSON.stringify(state.portfolios)) // 로컬 스토리지에 업데이트 후 저장 } - }, + } }, actions: { addPortfolio({ commit }, portfolio) { - commit('ADD_PORTFOLIO', portfolio); // mutation 호출 + commit('ADD_PORTFOLIO', portfolio) // mutation 호출 }, deletePortfolio({ commit }, portfolioId) { - commit('DELETE_PORTFOLIO', portfolioId); - }, - // 수정 기능을 위한 updatePortfolio 액션 추가 - updatePortfolio({ commit }, updatedPortfolio) { - commit('UPDATE_PORTFOLIO', updatedPortfolio); // UPDATE_PORTFOLIO 뮤테이션 호출 + commit('DELETE_PORTFOLIO', portfolioId) }, + // 수정 기능을 위한 updatePortfolio 액션 추가 + updatePortfolio({ commit }, updatedPortfolio) { + commit('UPDATE_PORTFOLIO', updatedPortfolio) // UPDATE_PORTFOLIO 뮤테이션 호출 + } }, getters: { getPortfolios(state) { - return state.portfolios; // 포트폴리오 목록 반환 - }, + return state.portfolios // 포트폴리오 목록 반환 + } }, modules: { - login, // 로그인 모듈 - auth, // auth 모듈 - }, -}); - -export default store; - + login // 로그인 모듈 + // auth 모듈 + } +}) +export default store