Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
54ada5c
api(#29): 폼 submit 매소드 및 스키마 리팩토링 & API 연동 대기중
RubiYH Aug 21, 2025
e0dcb28
UI(#37) 퀴즈 페이지 UI
downy1218 Aug 24, 2025
8bae33a
chore(taliwind): 1440px 미디어 쿼리용 desktop 유틸 추가
RubiYH Aug 24, 2025
28eeaea
Merge branch 'develop' of https://github.com/LikeLion13th-Hackathon-c…
RubiYH Aug 24, 2025
60c2cef
ui(#37) 퀴즈 페이지 UI 정답 오답창, 모달
downy1218 Aug 24, 2025
e040682
api(#29): 분석 페이지 폼 제출 API 연동 완료 & 플로우 구현 완료 & 예시파일 업로드
RubiYH Aug 24, 2025
7b79a7b
api(#41) 퀴즈 페이지 api 연동
downy1218 Aug 24, 2025
7ba134d
Merge pull request #43 from LikeLion13th-Hackathon-cesco/quiz
RubiYH Aug 25, 2025
0354591
ui(#44): 분석 결과 페이지 API 완료
RubiYH Aug 25, 2025
69d2624
api(#29): API 요청 후 모달 수정 & 예시파일 이름 변경
RubiYH Aug 25, 2025
d34b6c5
Merge pull request #45 from LikeLion13th-Hackathon-cesco/api/analysis…
downy1218 Aug 25, 2025
47ab504
Merge pull request #46 from LikeLion13th-Hackathon-cesco/api/analyze
downy1218 Aug 25, 2025
f25b43e
ui(#32): CTA 누르면 /analyze로 이동
RubiYH Aug 25, 2025
cf313cc
Merge pull request #47 from LikeLion13th-Hackathon-cesco/ui/landing
downy1218 Aug 25, 2025
f39a72c
ui(#21): 게시글 수 기준 수정
RubiYH Aug 25, 2025
e9d37f9
remove: 불필요한 파일 제거
RubiYH Aug 25, 2025
051eb90
Merge pull request #48 from LikeLion13th-Hackathon-cesco/ui/my-page
downy1218 Aug 25, 2025
7ff4f89
ui(#7): 하단에 광고 배너 추가
RubiYH Aug 25, 2025
9cef76d
api(#44): 사기 신고 칩 추가
RubiYH Aug 25, 2025
b90800b
Merge pull request #49 from LikeLion13th-Hackathon-cesco/ui/analyze
downy1218 Aug 25, 2025
bcc1211
chore(config): nuxt devtool 끔 (얘 때문에 자꾸 안됨)
RubiYH Aug 25, 2025
d7cd325
Merge pull request #51 from LikeLion13th-Hackathon-cesco/api/analysis…
RubiYH Aug 25, 2025
fcd5547
chore(css): pretendard 폰트 font face로 불러오는걸로 변경
RubiYH Aug 25, 2025
5533b8f
chore(css): 페이지 비율 80%
RubiYH Aug 25, 2025
6a1a0bf
ui: 커뮤니티 게시글 등록 모달ui, 제휴매장, 댓글 갯수 불러오기
downy1218 Aug 25, 2025
de5fd40
ui: 신고페이지 전체 하단 여백 추가, 퀴즈풀기 버튼 수정
downy1218 Aug 25, 2025
dad4fb3
ui 체크리스트 구분선 더 연하게
downy1218 Aug 25, 2025
573fad0
chore(ui): 네비바 px 삭제, head viewport 설정
RubiYH Aug 25, 2025
d6c6b11
ui(navbar): 검색바 구현
RubiYH Aug 25, 2025
c88a6b9
체크리스트 페이지 색상 변수로 변경경
downy1218 Aug 25, 2025
459c68c
커뮤니티 색상변수
downy1218 Aug 25, 2025
3a4d98a
Merge pull request #53 from LikeLion13th-Hackathon-cesco/qa/credit
RubiYH Aug 25, 2025
d1bec93
chore(config): ts 파일은 라우팅에서 제외
RubiYH Aug 25, 2025
3d415bf
chore(build): 빌드 에러
RubiYH Aug 25, 2025
2d0399d
chore(prettier): prettier 해결
RubiYH Aug 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .nuxtignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
app/pages/**/*.ts
40 changes: 32 additions & 8 deletions app/app.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,38 @@ useHead({

<template>
<component :is="'style'">
@font-face { font-family: "Pretendard"; src: url("/font/PretendardVariable.woff2")
format("woff2"); font-weight: 400; font-style: normal; font-display: swap; } :root { --primary:
45 138 231; --secondary: 239 247 255; --accent-1: 163 209 255; --accent-2: 249 199 91;
--destructive: 255 97 94; --gray-fe: 254 254 254; --background: 254 254 254; --gray-f5: 245 245
245; --gray-d9: 217 217 217; --gray-b4: 180 180 180; --gray-8f: 143 143 143; --gray-66: 102 102
102; --gray-1a: 26 26 26; --foreground: 26 26 26; } * { font-family: "Pretendard", sans-serif;
-webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { min-height:
100vh; background-color: var(--background); color: var(--foreground); }
/* Copyright (c) 2021 Kil Hyung-jin, with Reserved Font Name Pretendard.
https://github.com/orioncactus/pretendard This Font Software is licensed under the SIL Open Font
License, Version 1.1. This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL */ @font-face { font-family: 'Pretendard'; font-weight: 900;
font-display: swap; src: local('Pretendard Black'), url(./woff2/Pretendard-Black.woff2)
format('woff2'), url(./woff/Pretendard-Black.woff) format('woff'); } @font-face { font-family:
'Pretendard'; font-weight: 800; font-display: swap; src: local('Pretendard ExtraBold'),
url(./woff2/Pretendard-ExtraBold.woff2) format('woff2'), url(./woff/Pretendard-ExtraBold.woff)
format('woff'); } @font-face { font-family: 'Pretendard'; font-weight: 700; font-display: swap;
src: local('Pretendard Bold'), url(./woff2/Pretendard-Bold.woff2) format('woff2'),
url(./woff/Pretendard-Bold.woff) format('woff'); } @font-face { font-family: 'Pretendard';
font-weight: 600; font-display: swap; src: local('Pretendard SemiBold'),
url(./woff2/Pretendard-SemiBold.woff2) format('woff2'), url(./woff/Pretendard-SemiBold.woff)
format('woff'); } @font-face { font-family: 'Pretendard'; font-weight: 500; font-display: swap;
src: local('Pretendard Medium'), url(./woff2/Pretendard-Medium.woff2) format('woff2'),
url(./woff/Pretendard-Medium.woff) format('woff'); } @font-face { font-family: 'Pretendard';
font-weight: 400; font-display: swap; src: local('Pretendard Regular'),
url(./woff2/Pretendard-Regular.woff2) format('woff2'), url(./woff/Pretendard-Regular.woff)
format('woff'); } @font-face { font-family: 'Pretendard'; font-weight: 300; font-display: swap;
src: local('Pretendard Light'), url(./woff2/Pretendard-Light.woff2) format('woff2'),
url(./woff/Pretendard-Light.woff) format('woff'); } @font-face { font-family: 'Pretendard';
font-weight: 200; font-display: swap; src: local('Pretendard ExtraLight'),
url(./woff2/Pretendard-ExtraLight.woff2) format('woff2'), url(./woff/Pretendard-ExtraLight.woff)
format('woff'); } @font-face { font-family: 'Pretendard'; font-weight: 100; font-display: swap;
src: local('Pretendard Thin'), url(./woff2/Pretendard-Thin.woff2) format('woff2'),
url(./woff/Pretendard-Thin.woff) format('woff'); } :root { --primary: 45 138 231; --secondary:
239 247 255; --accent-1: 163 209 255; --accent-2: 249 199 91; --destructive: 255 97 94;
--gray-fe: 254 254 254; --background: 254 254 254; --gray-f5: 245 245 245; --gray-d9: 217 217
217; --gray-b4: 180 180 180; --gray-8f: 143 143 143; --gray-66: 102 102 102; --gray-1a: 26 26
26; --foreground: 26 26 26; } * { font-family: "Pretendard", sans-serif; -webkit-font-smoothing:
antialiased; -moz-osx-font-smoothing: grayscale; } html { zoom: 0.8 } body { min-height: 100vh;
background-color: var(--background); color: var(--foreground); }
</component>
<Navbar />
<NuxtPage class="mx-auto max-w-[1440px]" />
Expand Down
3 changes: 3 additions & 0 deletions app/assets/icon/warning-house.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/assets/image/ad-banner.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/assets/image/amisan.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/assets/image/flowerGimbap.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/assets/image/victorySuper.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
111 changes: 97 additions & 14 deletions app/components/Navbar.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<template>
<nav
class="sticky top-0 z-[999] flex w-full items-center justify-center bg-background px-[80px] py-[40px]"
>
<nav class="sticky top-0 z-[999] flex w-full items-center justify-center bg-background py-[40px]">
<!-- 로고 -->
<NuxtLink to="/" class="inline-flex items-center gap-[2px]">
<LogoOutline :font-controlled="false" filled="false" class="h-[35px] w-[35px]" />
Expand Down Expand Up @@ -61,30 +59,115 @@
</div>

<!-- 검색바 -->
<div
class="ml-[70px] flex items-center gap-[12px] rounded-full border-[1.5px] border-gray-b4 px-[30px] py-[15px]"
>
<SearchIcon class="h-[20px] w-[20px]" filled="false" />
<input
type="search"
placeholder="실거주 후기가 궁금하다면, 주소를 입력하세요."
class="w-full text-[16px] font-[500] text-foreground outline-none placeholder:text-gray-b4"
/>
<div class="relative ml-[70px]">
<div
class="flex items-center gap-[12px] rounded-full border-[1.5px] border-gray-b4 px-[30px] py-[15px]"
>
<SearchIcon class="h-[20px] w-[20px]" filled="false" />
<input
:value="address"
type="search"
placeholder="실거주 후기가 궁금하다면, 주소를 입력하세요."
class="w-full text-[16px] font-[500] text-foreground outline-none placeholder:text-gray-b4 desktop:w-[20rem]"
@input="handleInput"
/>
</div>

<!-- 검색 결과 -->
<div
v-if="searchResponse?.data && searchResponse.data.length > 0"
class="absolute left-0 right-0 top-full z-50 mt-[2px] flex max-h-[300px] flex-col gap-[10px] overflow-y-auto rounded-[15px] bg-white px-[20px] py-[15px] shadow-[0px_4px_20px_0px_rgba(0,0,0,0.15)]"
>
<div
v-for="suggestion in searchResponse?.data"
:key="suggestion.rnMgtSn"
class="px-[10px] py-[8px]"
>
<div
class="cursor-pointer rounded-[8px] p-[8px] hover:bg-gray-50"
@click="navigateToAddress(suggestion)"
>
<span
v-for="part in splitByKeyword(suggestion.roadAddrPart1, address)"
:key="part"
:class="[
'text-[14px] font-[400]',
part.toLowerCase() === address.toLowerCase()
? 'font-[600] text-primary'
: 'text-foreground',
]"
>
{{ part }}
</span>
</div>
</div>
</div>
</div>
</nav>
</template>

<script setup>
<script setup lang="ts">
import { ref, computed } from "vue";
import { useQuery } from "@tanstack/vue-query";
import SearchIcon from "~/assets/icon/search.svg";
import LogoOutline from "~/assets/icon/logo-outline.svg";
import Setbangsari from "~/assets/icon/setbangsari.svg";
import { apiInstance } from "~/utils/api";
import type { BaseResponse } from "~/utils/api";
import type { SearchAddressResponse } from "~/pages/community/_api/types/SearchAddressResponse";
import { useDebounce } from "~/composables/useDebounce";
import { splitByKeyword } from "~/pages/community/_utils/splitByKeyword";

// PLUS 구독중 여부
const isPlus = ref(true);

const route = useRoute();
const router = useRouter();

const isActive = (path) => {
const isActive = (path: string) => {
return route.path === path || route.path.startsWith(path + "/");
};

// 검색 기능
const address = ref("");
const debouncedAddress = useDebounce(address, 500);

const { data: searchResponse } = useQuery<BaseResponse<SearchAddressResponse>>({
queryKey: ["search-address", debouncedAddress],
queryFn: async () =>
apiInstance
.get("v1/address-search", {
params: {
currentPage: 1,
countPerPage: 20,
keyword: debouncedAddress.value,
resultType: "json",
},
})
.then((res) => res.data),
enabled: computed(() => !!debouncedAddress.value),
});

const handleInput = (e: Event) => {
address.value = (e.target as HTMLInputElement).value.trim();
};

const navigateToAddress = (suggestion: {
rnMgtSn: string;
buldMnnm: string;
roadAddrPart1: string;
}) => {
// 검색 결과 숨기기
address.value = "";

// 커뮤니티 페이지로 이동하면서 주소 정보를 쿼리 파라미터로 전달
router.push({
path: "/community",
query: {
roadCode: suggestion.rnMgtSn,
buildingNumber: suggestion.buldMnnm,
address: suggestion.roadAddrPart1,
},
});
};
</script>
14 changes: 11 additions & 3 deletions app/components/SafetyTypeChip.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
? 'rgb(var(--primary))'
: safetyType === SafetyType.Caution
? 'rgb(var(--accent-2))'
: 'rgb(var(--destructive))',
: safetyType === SafetyType.Dangerous
? 'rgb(var(--destructive))'
: 'rgb(var(--gray-8f))',
}"
>
<span
Expand All @@ -22,9 +24,15 @@
>
이 부동산은 거래에 주의가 필요합니다.
</span>
<span v-else class="text-center text-[24px] font-[600] text-gray-fe">
<span
v-else-if="safetyType === SafetyType.Dangerous"
class="text-center text-[24px] font-[600] text-gray-fe"
>
이 부동산은 거래에 위험합니다.
</span>
<span v-else class="text-center text-[24px] font-[600] text-gray-fe">
분석 결과를 불러오는 중...
</span>
</div>
</template>

Expand All @@ -33,7 +41,7 @@ import getSafetyTypeByScore from "~/utils/getSafetyTypeByScore";
import { SafetyType } from "~/types/SafetyType";

const props = defineProps<{
score: number;
score: number | null;
}>();

const safetyType = computed(() => getSafetyTypeByScore(props.score));
Expand Down
4 changes: 4 additions & 0 deletions app/pages/analyze/_api/types/AnalyzeSubmitResponse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export interface AnalyzeSubmitResponse {
reportId: number;
processingStatus: string;
}
Loading