diff --git a/.env b/.env index 3701b26..5b6f328 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -BASE_URL=http://localhost:8080/api \ No newline at end of file +VITE_API_BASE_URL=https://back.newjeaps.com \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7a36dce..fe03fb4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -35,6 +35,8 @@ jobs: # 종속성 재설치 npm install + npm install vue-simple-range-slider + - name: Build the Vue app run: npm run build diff --git a/index.html b/index.html index b19040a..e03dcfd 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - Vite App + Newjeaps
diff --git a/package-lock.json b/package-lock.json index 3b6f52e..e809a7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "newjeaps", "version": "0.0.0", "dependencies": { - "@rollup/rollup-darwin-arm64": "^4.27.3", + "@vueform/slider": "^2.1.10", "aos": "^2.3.4", "axios": "^1.7.7", "dotenv": "^16.4.5", @@ -20,7 +20,9 @@ "typed.js": "^2.1.0", "vue": "^3.5.12", "vue-fullpage.js": "^0.2.20", + "vue-range-slider": "^0.6.0", "vue-router": "^4.4.5", + "vue-simple-range-slider": "^1.1.0", "vue-typer": "^1.2.0", "vue3-kakao-maps": "^2.3.10" }, @@ -1100,18 +1102,6 @@ "android" ] }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.27.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz", - "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "os": [ - "darwin" - ] - }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.25.0.tgz", @@ -1528,6 +1518,11 @@ "version": "3.5.12", "license": "MIT" }, + "node_modules/@vueform/slider": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@vueform/slider/-/slider-2.1.10.tgz", + "integrity": "sha512-L2G3Ju51Yq6yWF2wzYYsicUUaH56kL1QKGVtimUVHT1K1ADcRT94xVyIeJpS0klliVEeF6iMZFbdXtHq8AsDHw==" + }, "node_modules/acorn": { "version": "8.14.0", "dev": true, @@ -4886,6 +4881,32 @@ } } }, + "node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/vue-eslint-parser": { "version": "9.4.3", "dev": true, @@ -4973,6 +4994,11 @@ "vue": "^3.2.26" } }, + "node_modules/vue-range-slider": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/vue-range-slider/-/vue-range-slider-0.6.0.tgz", + "integrity": "sha512-VH5ZI7ZxZ/2I+4kmHMvRNShB87N+N71wgENFaycMI2NEBCxKyF+gN/NbbralGQP63X9IrCWgggo8uBjm7SdM7g==" + }, "node_modules/vue-router": { "version": "4.4.5", "license": "MIT", @@ -4986,6 +5012,17 @@ "vue": "^3.2.0" } }, + "node_modules/vue-simple-range-slider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vue-simple-range-slider/-/vue-simple-range-slider-1.1.0.tgz", + "integrity": "sha512-q2Gch3PhV3YNwG8XoWt7ZXzJeTH2qoMCnMaZb+ArNHmfQRMYEOg0D/jLlL9VtMw1oLNMcYfx4KJ33dTckU/rlA==", + "dependencies": { + "vue-demi": "^0.13.5" + }, + "peerDependencies": { + "vue": ">=3.2.0||>=2.7.0" + } + }, "node_modules/vue-typer": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vue-typer/-/vue-typer-1.2.0.tgz", @@ -5706,11 +5743,6 @@ "dev": true, "optional": true }, - "@rollup/rollup-darwin-arm64": { - "version": "4.27.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz", - "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==" - }, "@rollup/rollup-darwin-x64": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.25.0.tgz", @@ -5972,6 +6004,11 @@ "@vue/shared": { "version": "3.5.12" }, + "@vueform/slider": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@vueform/slider/-/slider-2.1.10.tgz", + "integrity": "sha512-L2G3Ju51Yq6yWF2wzYYsicUUaH56kL1QKGVtimUVHT1K1ADcRT94xVyIeJpS0klliVEeF6iMZFbdXtHq8AsDHw==" + }, "acorn": { "version": "8.14.0", "dev": true @@ -7853,6 +7890,12 @@ "@vue/shared": "3.5.12" } }, + "vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "requires": {} + }, "vue-eslint-parser": { "version": "9.4.3", "dev": true, @@ -7901,12 +7944,25 @@ "fullpage.js": "^4.0.30" } }, + "vue-range-slider": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/vue-range-slider/-/vue-range-slider-0.6.0.tgz", + "integrity": "sha512-VH5ZI7ZxZ/2I+4kmHMvRNShB87N+N71wgENFaycMI2NEBCxKyF+gN/NbbralGQP63X9IrCWgggo8uBjm7SdM7g==" + }, "vue-router": { "version": "4.4.5", "requires": { "@vue/devtools-api": "^6.6.4" } }, + "vue-simple-range-slider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vue-simple-range-slider/-/vue-simple-range-slider-1.1.0.tgz", + "integrity": "sha512-q2Gch3PhV3YNwG8XoWt7ZXzJeTH2qoMCnMaZb+ArNHmfQRMYEOg0D/jLlL9VtMw1oLNMcYfx4KJ33dTckU/rlA==", + "requires": { + "vue-demi": "^0.13.5" + } + }, "vue-typer": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vue-typer/-/vue-typer-1.2.0.tgz", diff --git a/package.json b/package.json index db24e3b..756f544 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "lint": "eslint . --fix" }, "dependencies": { + "@vueform/slider": "^2.1.10", "aos": "^2.3.4", "axios": "^1.7.7", "dotenv": "^16.4.5", @@ -21,7 +22,9 @@ "typed.js": "^2.1.0", "vue": "^3.5.12", "vue-fullpage.js": "^0.2.20", + "vue-range-slider": "^0.6.0", "vue-router": "^4.4.5", + "vue-simple-range-slider": "^1.1.0", "vue-typer": "^1.2.0", "vue3-kakao-maps": "^2.3.10" }, diff --git a/src/App.vue b/src/App.vue index 3359236..e62fbd8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -13,7 +13,7 @@ import ChatbotButton from './Component/Chatbot/ChatbotButton.vue' - + + \ No newline at end of file diff --git a/src/Component/TabMenu.vue b/src/Component/TabMenu.vue index e69de29..10e921f 100644 --- a/src/Component/TabMenu.vue +++ b/src/Component/TabMenu.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/api.js b/src/api.js new file mode 100644 index 0000000..5fd3855 --- /dev/null +++ b/src/api.js @@ -0,0 +1,16 @@ +// src/api.js +import axios from 'axios'; + +// BASE_URL 설정 +const BASE_URL = import.meta.env.VITE_API_BASE_URL; + +// Axios 인스턴스 생성 +const apiClient = axios.create({ + baseURL: BASE_URL, + headers: { + 'Content-Type': 'application/json', + }, + withCredentials: true, // 쿠키 포함 요청 허용 +}); + +export default apiClient; diff --git a/src/router/index.js b/src/router/index.js index fb44ad8..5b44e07 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -6,6 +6,9 @@ import MapView from '../views/MapView.vue' import NoticeView from '../views/NoticeView.vue' import IntroductionView from '@/views/IntroductionView.vue' import NoticeDetailView from '@/views/notice/NoticeDetailView.vue' +import FaqDetailView from '@/views/notice/FaqDetailView.vue' +import SignupView from '@/views/Signup/SignupView.vue' +import MyPageView from '@/views/MyPageView.vue' const routes = [ { @@ -23,7 +26,7 @@ const routes = [ component: LoginView, }, { - path: 'map', + path: 'map/:param', // :param은 동적 라우트 파라미터 name: 'map', component: MapView, }, @@ -33,14 +36,30 @@ const routes = [ component: NoticeView, }, { - path: 'notice/:id', + path: 'notice/noticeDetail/:id', name: 'noticeDetail', component: NoticeDetailView, }, + + { + path: 'notice/faqDetail/:id', + name: 'faqDetail', + component: FaqDetailView, + }, + { + path: 'signup', + name: 'signup', + component: SignupView, + }, { path: 'introduction', name: 'introduction', component: IntroductionView, + }, + { + path: 'mypage', + name: 'mypage', + component: MyPageView } ], }, diff --git a/src/stores/faq.js b/src/stores/faq.js new file mode 100644 index 0000000..f499744 --- /dev/null +++ b/src/stores/faq.js @@ -0,0 +1,78 @@ +import { defineStore } from "pinia"; +import axios from "axios"; + +export const useFaqStore = defineStore("faq", { + state: () => ({ + faqs: [], // FAQ 목록 + pagination: { + currentPage: 1, // 현재 페이지 + pageSize: 10, // 페이지당 항목 수 + totalItems: 0, // 전체 FAQ 수 + totalPages: 0, // 전체 페이지 수 + }, + keyword: "", // 검색 키워드 + activeTab: "faqInfo", // 기본 활성화 탭 + faqDetail: null, // FAQ 상세 데이터 + }), + + actions: { + // FAQ 목록 가져오기 + async fetchFaqs() { + try { + console.log("FAQ 데이터 요청 시작"); + const response = await axios.get("https://back.newjeaps.com/api/service/faq", { + params: { + currentPage: this.pagination.currentPage, + pageSize: this.pagination.pageSize, + keyword: this.keyword || null, + }, + }); + console.log("API 응답:", response.data); + + const responseData = response.data.data; + this.faqs = responseData.content; // FAQ 목록 업데이트 + console.log("FAQ 데이터:", this.faqs); + + this.pagination = { + ...this.pagination, + totalItems: responseData.pagination.totalItems, + totalPages: responseData.pagination.totalPages, + }; + console.log("페이지네이션 상태:", this.pagination); + } catch (error) { + console.error("FAQ 데이터를 가져오는 중 오류 발생:", error); + } + }, + + // FAQ 상세 데이터 가져오기 + async fetchFaqDetail(faqId) { + try { + console.log("FAQ 상세 데이터 요청 시작:", faqId); + const response = await axios.get(`https://back.newjeaps.com/api/service/faq/${faqId}`); + console.log("API 응답 (상세):", response.data); + this.faqDetail = response.data.data; // 상세 FAQ 데이터 저장 + } catch (error) { + console.error("FAQ 상세 데이터를 가져오는 중 오류 발생:", error); + } + }, + + // 페이지 변경 + setPage(page) { + this.pagination.currentPage = page; + this.fetchFaqs(); + }, + + // 검색 키워드 설정 + setKeyword(keyword) { + this.keyword = keyword; + this.pagination.currentPage = 1; + this.fetchFaqs(); + }, + + // 활성화된 탭 설정 + setActiveTab(tab) { + console.log("탭 변경:", tab); + this.activeTab = tab; + }, + }, +}); diff --git a/src/stores/mapCard.js b/src/stores/mapCard.js index 637968f..55198f0 100644 --- a/src/stores/mapCard.js +++ b/src/stores/mapCard.js @@ -1,7 +1,6 @@ import { defineStore } from 'pinia'; import axios from 'axios'; - -// const BASE_URL = import.meta.env.VITE_API_BASE_URL; +import apiClient from '@/api'; // 위에서 만든 axios 인스턴스를 import export const useHouseInfoStore = defineStore('houseInfo', { state: () => ({ @@ -11,10 +10,18 @@ export const useHouseInfoStore = defineStore('houseInfo', { async fetchHouseInfo(type) { try { // URL을 BASE_URL과 합쳐서 사용 - const response = await axios.get(`https://back.newjeaps.com/api/houseinfos/${type}`); + console.log("맵카드") + console.log(apiClient) + const response = await apiClient.get(`/api/houseinfos/${type}`); // response.data.data를 houseInfos에 할당 (주요 수정 부분) - this.houseInfos = response.data.data; + this.houseInfos= response.data.data; + // response.data를 콘솔에 출력하여 디버깅 + + console.log(response.data.data); + + + } catch (error) { console.log('데이터를 가져오는데 실패했습니다.', error); } diff --git a/src/stores/notice.js b/src/stores/notice.js index 1dfa019..e87367e 100644 --- a/src/stores/notice.js +++ b/src/stores/notice.js @@ -4,7 +4,8 @@ import axios from "axios"; export const useNoticeStore = defineStore("notice", { state: () => ({ - notices: [], // 공지사항 목록 + notices: [], + faqs: [], pagination: { currentPage: 1, // 현재 페이지 pageSize: 10, // 페이지당 항목 수 @@ -57,6 +58,10 @@ export const useNoticeStore = defineStore("notice", { } }, + + + + // 페이지 변경 setPage(page) { this.pagination.currentPage = page; diff --git a/src/stores/sliderStore b/src/stores/sliderStore new file mode 100644 index 0000000..5455769 --- /dev/null +++ b/src/stores/sliderStore @@ -0,0 +1,12 @@ +import { defineStore } from "pinia"; + +export const useSliderStore = defineStore("slider", { + state: () => ({ + range: [10, 1000], // 초기 최소/최대 값 + }), + actions: { + updateRange(newRange) { + this.range = newRange; + }, + }, +}); \ No newline at end of file diff --git a/src/stores/userStore.js b/src/stores/userStore.js new file mode 100644 index 0000000..e7063bf --- /dev/null +++ b/src/stores/userStore.js @@ -0,0 +1,25 @@ +import { defineStore } from 'pinia'; +import axios from 'axios'; +import apiClient from '@/api'; // 위에서 만든 axios 인스턴스를 import + +export const useUserStore = defineStore('userInfo', { + state: () => ({ + userInfos: { data: [] }, // 상태 정의 (초기값) + }), + actions: { + async fetchUserInfo() { + try { + // URL을 BASE_URL과 합쳐서 사용 + console.log("userStore 동작") + const response = await apiClient.get(`/api/members/nickname`); + // response.data.data를 houseInfos에 할당 (주요 수정 부분) + this.userInfos.data = response.data.data; + // response.data를 콘솔에 출력하여 디버깅 + console.log('userStore'+response.data.data); + + } catch (error) { + console.log('데이터를 가져오는데 실패했습니다.', error); + } + }, + }, +}); diff --git a/src/views/HeaderView.vue b/src/views/HeaderView.vue index 15fd6fe..7128008 100644 --- a/src/views/HeaderView.vue +++ b/src/views/HeaderView.vue @@ -5,15 +5,23 @@ logo @@ -21,6 +29,9 @@ diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 28fc13f..b54930d 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -14,12 +14,20 @@ const router = useRouter(); const goToNotice = () => { router.push({ name: "notice" }); }; + +const goToMapView = (param) => { + //console.log('mapView 등장') + console.log(param) + router.push({ name: 'map', params: {param} } ); +} + - - diff --git a/src/views/notice/FaqDetailView.vue b/src/views/notice/FaqDetailView.vue new file mode 100644 index 0000000..1fcf1d1 --- /dev/null +++ b/src/views/notice/FaqDetailView.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/vite.config.js b/vite.config.js index 6dc7baa..ca4ec5f 100644 --- a/vite.config.js +++ b/vite.config.js @@ -11,9 +11,9 @@ export default defineConfig({ port: 3000, proxy: { '/api': { - target: 'http://localhost:8080', // 첫 번째 서버 주소 + target: 'https://back.newjeaps.com', // 첫 번째 서버 주소 changeOrigin: true, - secure: false, // https 사용하지 않는 경우 false로 설정 + secure: true, // https 사용하지 않는 경우 false로 설정 rewrite: (path) => path.replace(/^\/api/, ''), // 프록시 경로를 적절히 수정 }, // 추가적인 프록시 설정이 필요하면 아래와 같이 작성할 수 있습니다.