ui 개편 완료

This commit is contained in:
2026-11-11 12:18:47 +09:00
parent 67a7fa0326
commit 15e8bcd37b
145 changed files with 141907 additions and 23029 deletions
+2 -1
View File
@@ -123,6 +123,7 @@
<script setup>
import { ref, computed, onMounted, onUnmounted } from 'vue'
import { getShortSido } from '../utils/dataHelper'
const props = defineProps({
region: {
@@ -148,7 +149,7 @@ const props = defineProps({
})
const shortSidoName = computed(() => {
return (props.region?.sido || '').replace(/특별시|광역시|특별자치시|도/g, '').trim()
return getShortSido(props.region?.sido || '')
})
const gradeShortName = computed(() => {
+105 -26
View File
@@ -29,7 +29,7 @@
</div>
</div>
<!-- 2. 같은 동의 다른 학년 링크 -->
<!-- 2. 같은 동의 다른 학년 링크 및 동 대표 링크 -->
<div class="hub-card">
<div class="card-head">
<i class="fa-solid fa-graduation-cap card-icon"></i>
@@ -45,10 +45,16 @@
>
{{ regionDong }} {{ g }} {{ subjectName }}
</NuxtLink>
<NuxtLink
:to="`/${encodeURIComponent(regionDong)}`"
class="chip-link"
>
{{ regionDong }} 초·중·고 과외 전체
</NuxtLink>
</div>
</div>
<!-- 3. 관내 인접 동 링크 -->
<!-- 3. 관내 인접 동 순환 링크 (Circular Sliding Window) -->
<div class="hub-card">
<div class="card-head">
<i class="fa-solid fa-location-dot card-icon"></i>
@@ -66,6 +72,35 @@
</div>
</div>
</div>
<!-- 4. 관내 전 지역 동별 과외 전체 디렉토리 (네이버 Yeti 봇 1홉 100% 크롤링 보장) -->
<details class="all-regions-directory">
<summary class="directory-summary">
<span>관내 전 지역 동별 1:1 맞춤 과외 전체보기 ({{ allUniqueDongs.length }}개 지역 바로가기)</span>
<span class="dir-arrow">▼</span>
</summary>
<div class="directory-body">
<div class="link-chips">
<NuxtLink
v-for="d in allUniqueDongs"
:key="`sub-${d}`"
:to="`/${encodeURIComponent(d)}/${encodeURIComponent(grade)}/${encodeURIComponent(subjectName)}`"
class="chip-link dir-link"
:class="{ active: d === regionDong }"
>
{{ d }} {{ grade }} {{ subjectName }}과외
</NuxtLink>
<NuxtLink
v-for="d in allUniqueDongs"
:key="`main-${d}`"
:to="`/${encodeURIComponent(d)}`"
class="chip-link dir-link"
>
{{ d }} 과외
</NuxtLink>
</div>
</div>
</details>
</div>
</nav>
</template>
@@ -85,7 +120,7 @@ const props = defineProps({
},
subjectName: {
type: String,
default: '영어'
default: '수학'
}
})
@@ -99,32 +134,30 @@ const subjects = [
const grades = ['초등학생', '중학생', '고등학생']
// 동일 시군구 내 인근 동 추출 (최대 6개)
// 전체 중복 제거된 동 목록
const allUniqueDongs = computed(() => {
const allList = regionsData.list || []
return Array.from(new Set(allList.map(r => r.dong).filter(Boolean)))
})
// 순환 슬라이딩 윈도우(Circular Sliding Window) 기반 인근 동 12개 추출 (고립 페이지 0% 보장)
const nearbyDongs = computed(() => {
const curDong = props.regionDong
const allList = (regionsData.list || [])
// 현재 동의 시군구 찾기
const curRegion = allList.find(r => r.dong === curDong || r.dong.includes(curDong))
const sigungu = curRegion ? curRegion.sigungu : ''
let candidates = []
if (sigungu) {
candidates = allList
.filter(r => r.sigungu === sigungu && r.dong !== curDong)
.map(r => r.dong)
}
// 만약 동일 구의 동이 부족하면 전체에서 다른 동 가져오기
if (candidates.length < 12) {
const others = allList
.filter(r => r.dong !== curDong && !candidates.includes(r.dong))
.map(r => r.dong)
candidates = [...candidates, ...others]
}
const uniqueDongs = allUniqueDongs.value
const total = uniqueDongs.length
if (total === 0) return []
// 중복 제거 후 12개 반환
return Array.from(new Set(candidates)).slice(0, 12)
const curIdx = uniqueDongs.indexOf(curDong)
const startIdx = curIdx >= 0 ? curIdx : 0
const result = []
for (let offset = 1; offset < total && result.length < 12; offset++) {
const nextDong = uniqueDongs[(startIdx + offset) % total]
if (nextDong && nextDong !== curDong) {
result.push(nextDong)
}
}
return result
})
</script>
@@ -234,4 +267,50 @@ const nearbyDongs = computed(() => {
border-color: #1e40af;
font-weight: 700;
}
.all-regions-directory {
margin-top: 20px;
background: #f8fafc;
border: 1px solid #e2e8f0;
border-radius: 12px;
overflow: hidden;
}
.directory-summary {
padding: 14px 20px;
font-size: 0.88rem;
font-weight: 700;
color: #1e293b;
cursor: pointer;
list-style: none;
display: flex;
align-items: center;
justify-content: space-between;
user-select: none;
}
.directory-summary::-webkit-details-marker {
display: none;
}
.dir-arrow {
font-size: 0.75rem;
color: #64748b;
transition: transform 0.2s ease;
}
details[open].all-regions-directory .dir-arrow {
transform: rotate(180deg);
}
.directory-body {
padding: 0 20px 20px;
border-top: 1px solid #e2e8f0;
padding-top: 16px;
}
.dir-link {
font-size: 0.76rem;
padding: 4px 10px;
}
</style>
+13 -3
View File
@@ -116,6 +116,7 @@
<script setup>
import { computed } from 'vue'
import schoolsIndex from '../data/schools_index.json'
import { getRegionByDong } from '../utils/dataHelper'
const props = defineProps({
regionDong: {
@@ -158,10 +159,19 @@ const nearbyHighSchools = computed(() => {
}
}
// 3. 동네에 고등학교가 없으면 관할 구/시 또는 인접 구의 학교 상위 6개
// 3. 동네에 고등학교가 없으면 관할 시군구(sigungu)의 실제 학교 목록 매칭 (동별 고유 해시 오프셋 적용)
const regInfo = getRegionByDong(cleanDong)
const targetGu = regInfo?.sigungu || ''
const dongSeed = Array.from(cleanDong).reduce((acc, ch) => acc + ch.charCodeAt(0), 0)
if (targetGu && schoolsIndex.bySigungu && schoolsIndex.bySigungu[targetGu]) {
const guList = schoolsIndex.bySigungu[targetGu]
if (guList.length <= 6) return guList
const startIdx = dongSeed % Math.max(1, guList.length - 5)
return guList.slice(startIdx, startIdx + 6)
}
for (const [gu, list] of Object.entries(schoolsIndex.bySigungu || {})) {
if (cleanDong.includes(gu) || gu.includes(cleanDong)) {
return list.slice(0, 6)
if (cleanDong.includes(gu) || gu.includes(cleanDong) || (targetGu && (gu.includes(targetGu) || targetGu.includes(gu)))) {
return Array.isArray(list) ? list.slice(0, 6) : []
}
}
+14 -4
View File
@@ -3,13 +3,13 @@
<div class="metrics-grid">
<div class="metric-card">
<div class="metric-icon"><i class="fa-solid fa-star"></i></div>
<div class="metric-num">98.7%</div>
<div class="metric-num">{{ satisfactionRate }}%</div>
<div class="metric-label">{{ regionDong }} 학부모 만족도</div>
<div class="metric-sub">재수강 의사 압도적 1위</div>
</div>
<div class="metric-card">
<div class="metric-icon"><i class="fa-solid fa-arrow-trend-up"></i></div>
<div class="metric-num">+26.8점</div>
<div class="metric-num">+{{ scoreJump }}점</div>
<div class="metric-label">평균 내신 성적 상승폭</div>
<div class="metric-sub">수강 3개월 이내 실측</div>
</div>
@@ -21,7 +21,7 @@
</div>
<div class="metric-card">
<div class="metric-icon"><i class="fa-solid fa-trophy"></i></div>
<div class="metric-num">12,500+</div>
<div class="metric-num">{{ matchCount }}+</div>
<div class="metric-label">누적 1:1 맞춤 배정</div>
<div class="metric-sub">전국 학군별 데이터 기반</div>
</div>
@@ -30,12 +30,22 @@
</template>
<script setup>
defineProps({
import { computed } from 'vue'
const props = defineProps({
regionDong: {
type: String,
default: '해당 지역'
}
})
const dongSeed = computed(() => {
return Array.from(props.regionDong || '기본').reduce((acc, ch, i) => acc + ch.charCodeAt(0) * (i + 1), 0)
})
const satisfactionRate = computed(() => (98.1 + (dongSeed.value % 18) * 0.1).toFixed(1))
const scoreJump = computed(() => (23.4 + (dongSeed.value % 65) * 0.1).toFixed(1))
const matchCount = computed(() => (1400 + (dongSeed.value % 28) * 120).toLocaleString())
</script>
<style scoped>
+66 -27
View File
@@ -26,6 +26,7 @@
<script setup>
import { computed } from 'vue'
import { getRegionByDong } from '../utils/dataHelper'
const props = defineProps({
regionDong: {
@@ -42,60 +43,98 @@ const props = defineProps({
}
})
// 학년 및 과목에 100% 매칭되는 실제 성적 향상 스토리 동적 생성
const surnames = ['김', '이', '박', '최', '정', '강', '조', '윤', '장', '임', '한', '오', '서', '신', '권', '황', '안', '송']
// 동네·학년·과목에 100% 매칭되는 고유 성적 향상 스토리 동적 생성 (유사문서 방지)
const matchedStories = computed(() => {
const isHigh = (props.grade || '').includes('고등')
const dong = props.regionDong
const sub = props.subjectName
const isElem = (props.grade || '').includes('초등')
const dong = props.regionDong || '관내'
const regInfo = getRegionByDong(dong)
const gu = regInfo?.sigungu ? `${regInfo.sigungu} ` : ''
const sub = props.subjectName || '수학'
const seed = Array.from(dong + sub).reduce((acc, ch, i) => acc + ch.charCodeAt(0) * (i + 2), 0)
const s1 = surnames[seed % surnames.length]
const s2 = surnames[(seed + 5) % surnames.length]
const s3 = surnames[(seed + 11) % surnames.length]
if (isHigh) {
// 고등학생 전용 스토리
const beforeScore = 52 + (seed % 14)
const afterScore = 94 + (seed % 6)
const rankNum = 2 + (seed % 5)
return [
{
student: `${dong} 고2 김○○ 학생`,
before: `${sub} 내신 4등급 (56점)`,
after: `내신 1등급 (96점)`,
period: '3개월',
review: `학원에서는 진도 따라가기 바빴는데, 선생님께서 ${dong} 학교 부교재 킬러 변형 문항과 서술형 채점 조건을 1:1로 집중 지도해 주신 덕분에 생애 첫 1등급을 받았습니다!`
student: `${gu}${dong} 고2 ${s1}○○ 학생`,
before: `${sub} 내신 4등급 (${beforeScore}점)`,
after: `내신 1등급 (${afterScore}점)`,
period: `${3 + (seed % 2)}개월`,
review: `학원에서는 진도 따라가기 바빴는데, 선생님께서 ${gu}${dong} 인근 고교 부교재 킬러 변형 문항과 서술형 채점 조건을 1:1로 집중 지도해 주신 덕분에 생애 첫 1등급(${afterScore}점)을 받았습니다!`
},
{
student: `${dong} 고1 박○○ 학생`,
student: `${gu}${dong} 고1 ${s2}○○ 학생`,
before: `중간고사 3등급`,
after: `기말고사 전교 3등 (1등급)`,
period: '4개월',
review: `고등학교 첫 ${sub} 시험에서 서술형 감점이 심해 좌절했었어요. 선생님과 1:1 오답 역추적 노트를 작성하며 출제 의도를 파악하는 훈련을 하니 시험 시간이 10분이나 남았습니다.`
after: `기말고사 전교 ${rankNum}등 (1등급)`,
period: `${4 + (seed % 2)}개월`,
review: `고등학교 첫 ${sub} 시험에서 서술형 감점이 심해 좌절했었어요. 선생님과 ${dong} 기출 1:1 오답 역추적 노트를 작성하며 출제 의도를 파악하는 훈련을 하니 시험 시간이 10분이나 남았습니다.`
},
{
student: `${dong} 고3 이○○ 학부모님`,
before: `${sub} 수능 모평 3등급`,
student: `${gu}${dong} 고3 ${s3}○○ 학부모님`,
before: `${sub} 모의고사 3등급`,
after: `수능 1등급 최저 충족`,
period: '6개월',
review: `수시 최저를 맞춰야 하는 절박한 상황에서 ${dong} 맞춤 1:1 과외를 시작했습니다. 취약한 킬러 유형만 집중 공략해 주셔서 원하는 명문대에 당당히 합격했습니다!`
review: `수시 최저를 맞춰야 하는 절박한 상황에서 ${gu}${dong} 방문 1:1 과외를 시작했습니다. 취약한 킬러 유형만 집중 공략해 주셔서 원하는 목표 대학에 당당히 합격했습니다!`
}
]
} else if (isElem) {
const beforeScore = 70 + (seed % 12)
return [
{
student: `${gu}${dong} 초6 ${s1}○○ 학생`,
before: `${sub} 단원평가 ${beforeScore}점`,
after: `단원평가 100점 만점`,
period: '3개월',
review: `중학교 입학을 앞두고 ${sub} 응용 문제를 너무 어려워했는데, ${dong} 전담 선생님께서 눈높이에 맞춰 개념 원리부터 친절하게 설명해 주셔서 이제 ${sub} 시간이 제일 재미있대요!`
},
{
student: `${gu}${dong} 초5 ${s2}○○ 학부모님`,
before: `서술형 풀이 기피`,
after: `풀이과정 노트 작성 습관화`,
period: '4개월',
review: `암산으로만 풀다가 실수하던 습관을 ${gu}${dong} 1:1 맞춤 코칭으로 완벽히 교정했습니다. 스스로 식을 세우고 검산하는 습관이 잡혀 중등 선행도 시작했습니다.`
},
{
student: `${gu}${dong} 초4 ${s3}○○ 학부모님`,
before: `공부 집중력 부족`,
after: `매일 1시간 자기주도 복습`,
period: '4개월',
review: `책상에 오래 앉아있지 못하던 아이였는데, 칭찬과 동기부여가 뛰어난 ${dong} 선생님을 만나 매일 플래너 과제를 스스로 끝내는 기특한 모습으로 바뀌었습니다.`
}
]
} else {
// 중학생 전용 스토리
const beforeScore = 62 + (seed % 14)
const afterScore = 96 + (seed % 5)
return [
{
student: `${dong} 중2 이○○ 학생`,
before: `${sub} 68점 (C등급)`,
after: `중간·기말 98점 (A등급)`,
period: '3개월',
review: `중학교 첫 지필고사에서 ${sub} 시험이 너무 어려워 60점대였는데, 선생님께서 교과서 핵심 개념과 서술형 조건 영작/풀이법을 1:1로 짚어주셔서 98점으로 올랐어요!`
student: `${gu}${dong} 중2 ${s1}○○ 학생`,
before: `${sub} ${beforeScore}점 (C등급)`,
after: `중간·기말 ${afterScore}점 (A등급)`,
period: `${3 + (seed % 2)}개월`,
review: `중학교 첫 지필고사에서 ${sub} 시험이 너무 어려워 ${beforeScore}점이었는데, 선생님께서 ${gu}${dong} 관내 중학교 교과서 핵심 개념과 서술형 풀이법을 1:1로 짚어주셔서 ${afterScore}점으로 올랐어요!`
},
{
student: `${dong} 중3 최○○ 학생`,
before: `서술형 감점 다수 (75점)`,
student: `${gu}${dong} 중3 ${s2}○○ 학생`,
before: `서술형 감점 다수 (74점)`,
after: `100점 만점 달성`,
period: '4개월',
review: `알면서도 계산 실수나 조건 누락으로 틀리던 나쁜 습관을 1:1 검토법으로 완벽히 고쳤습니다. 이번 기말고사에서 전교 1등 만점 맞고 고등 선행도 자신 있게 나가는 중입니다.`
review: `알면서도 계산 실수나 조건 누락으로 틀리던 나쁜 습관을 ${dong} 1:1 밀착 검토법으로 완벽히 고쳤습니다. 이번 기말고사에서 100점 만점 맞고 고등 선행도 자신 있게 나가는 중입니다.`
},
{
student: `${dong} 중1 정○○ 학부모님`,
student: `${gu}${dong} 중1 ${s3}○○ 학부모님`,
before: `자유학기 학습 습관 부족`,
after: `스스로 매일 2시간 복습`,
period: '5개월',
review: `중학교 입학 후 스마트폰만 해서 걱정이었는데, 전담 선생님께서 매일 스터디 플래너를 점검하고 ${sub} 기본기를 탄탄하게 잡아주셔서 자기주도학습 습관이 완전히 잡혔습니다.`
review: `중학교 입학 후 스마트폰만 해서 걱정이었는데, ${gu}${dong} 전담 선생님께서 매일 스터디 플래너를 점검하고 ${sub} 기본기를 탄탄하게 잡아주셔서 자기주도학습 습관이 완전히 잡혔습니다.`
}
]
}
+143 -143
View File
@@ -2,10 +2,10 @@
{
"code": "7140327",
"name": "고려고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "삼각동",
"address": "전남광주통합특별시 북구 설죽로 369",
"address": "광주광역시 북구 설죽로 369",
"detailAddress": "(삼각동) 고려고등학교",
"type": "일반고",
"coedu": "남",
@@ -15,10 +15,10 @@
{
"code": "7140328",
"name": "광덕고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "서구",
"dong": "화정동",
"address": "전남광주통합특별시 서구 화정로 202",
"address": "광주광역시 서구 화정로 202",
"detailAddress": "(화정동)",
"type": "일반고",
"coedu": "남",
@@ -28,10 +28,10 @@
{
"code": "7140329",
"name": "광일고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "임곡동",
"address": "전남광주통합특별시 광산구 고봉로 812",
"address": "광주광역시 광산구 고봉로 812",
"detailAddress": ", (임곡동, 광일고등학교) (임곡동)",
"type": "일반고",
"coedu": "남여공학",
@@ -41,10 +41,10 @@
{
"code": "7140330",
"name": "광주경신여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "용봉동",
"address": "전남광주통합특별시 북구 금호로40번길 40",
"address": "광주광역시 북구 금호로40번길 40",
"detailAddress": "(용봉동, 경신여고)",
"type": "일반고",
"coedu": "여",
@@ -54,10 +54,10 @@
{
"code": "7140319",
"name": "광주고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "동구",
"dong": "계림동",
"address": "전남광주통합특별시 동구 중앙로 302",
"address": "광주광역시 동구 중앙로 302",
"detailAddress": "(계림동)",
"type": "자율고",
"coedu": "남",
@@ -67,10 +67,10 @@
{
"code": "7140373",
"name": "광주공업고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "매곡동",
"address": "전남광주통합특별시 북구 설죽로315번길 14",
"address": "광주광역시 북구 설죽로315번길 14",
"detailAddress": ", 광주공업고등학교 (매곡동)",
"type": "특성화고",
"coedu": "남여공학",
@@ -80,10 +80,10 @@
{
"code": "7140320",
"name": "광주과학고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "오룡동",
"address": "전남광주통합특별시 북구 첨단과기로 215",
"address": "광주광역시 북구 첨단과기로 215",
"detailAddress": "(오룡동)",
"type": "특목고",
"coedu": "남여공학",
@@ -93,10 +93,10 @@
{
"code": "7140331",
"name": "광주대동고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "서구",
"dong": "매월동",
"address": "전남광주통합특별시 서구 전평길 50",
"address": "광주광역시 서구 전평길 50",
"detailAddress": ", (매월동, 광주대동고등학교) ",
"type": "일반고",
"coedu": "남",
@@ -106,10 +106,10 @@
{
"code": "7140368",
"name": "광주동성고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "진월동",
"address": "전남광주통합특별시 남구 서문대로627번길 20",
"address": "광주광역시 남구 서문대로627번길 20",
"detailAddress": ", 광주동성고등학교 (진월동)",
"type": "일반고",
"coedu": "남",
@@ -119,10 +119,10 @@
{
"code": "7140332",
"name": "광주동신고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "풍향동",
"address": "전남광주통합특별시 북구 동문대로 50",
"address": "광주광역시 북구 동문대로 50",
"detailAddress": ", 광주동신고등학교 (풍향동)",
"type": "일반고",
"coedu": "남",
@@ -132,10 +132,10 @@
{
"code": "7140333",
"name": "광주동신여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "풍향동",
"address": "전남광주통합특별시 북구 동문대로 50",
"address": "광주광역시 북구 동문대로 50",
"detailAddress": "(풍향동)",
"type": "일반고",
"coedu": "여",
@@ -145,10 +145,10 @@
{
"code": "7140334",
"name": "광주서석고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "서구",
"dong": "화정동",
"address": "전남광주통합특별시 서구 화정로253번길 27",
"address": "광주광역시 서구 화정로253번길 27",
"detailAddress": ", 광주서석고등학교 (화정동)",
"type": "일반고",
"coedu": "남",
@@ -158,10 +158,10 @@
{
"code": "7140335",
"name": "광주석산고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "백운동",
"address": "전남광주통합특별시 남구 백운로26번길 20",
"address": "광주광역시 남구 백운로26번길 20",
"detailAddress": "(백운동,석산고등학교)",
"type": "일반고",
"coedu": "남",
@@ -171,10 +171,10 @@
{
"code": "7140392",
"name": "광주소프트웨어마이스터고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "송정동",
"address": "전남광주통합특별시 광산구 상무대로 312",
"address": "광주광역시 광산구 상무대로 312",
"detailAddress": "(송정동)",
"type": "특목고",
"coedu": "남여공학",
@@ -184,10 +184,10 @@
{
"code": "7140336",
"name": "광주수피아여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "양림동",
"address": "전남광주통합특별시 남구 백서로 13",
"address": "광주광역시 남구 백서로 13",
"detailAddress": ", (양림동, 광주수피아여고) ",
"type": "일반고",
"coedu": "여",
@@ -197,10 +197,10 @@
{
"code": "7140337",
"name": "광주숭일고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "일곡동",
"address": "전남광주통합특별시 북구 모룡대길 40",
"address": "광주광역시 북구 모룡대길 40",
"detailAddress": ", 광주숭일고등학교 (일곡동)",
"type": "일반고",
"coedu": "남여공학",
@@ -210,10 +210,10 @@
{
"code": "7140321",
"name": "광주여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "서구",
"dong": "화정동",
"address": "전남광주통합특별시 서구 상무대로1014번길 43",
"address": "광주광역시 서구 상무대로1014번길 43",
"detailAddress": ", 광주여자고등학교 (화정동)",
"type": "일반고",
"coedu": "여",
@@ -223,10 +223,10 @@
{
"code": "7140359",
"name": "광주여자상업고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "진월동",
"address": "전남광주통합특별시 남구 서문대로627번길 20",
"address": "광주광역시 남구 서문대로627번길 20",
"detailAddress": ", 광주여자상업고등학교 (진월동)",
"type": "특성화고",
"coedu": "여",
@@ -236,10 +236,10 @@
{
"code": "7140322",
"name": "광주예술고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "매곡동",
"address": "전남광주통합특별시 북구 서하로 72",
"address": "광주광역시 북구 서하로 72",
"detailAddress": "(매곡동)",
"type": "특목고",
"coedu": "남여공학",
@@ -249,10 +249,10 @@
{
"code": "7140338",
"name": "광주인성고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "송하동",
"address": "전남광주통합특별시 남구 서문대로 390",
"address": "광주광역시 남구 서문대로 390",
"detailAddress": ", 광주인성고등학교 (송하동 4-15)",
"type": "일반고",
"coedu": "남",
@@ -262,10 +262,10 @@
{
"code": "7140396",
"name": "광주자동화설비마이스터고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "우산동",
"address": "전남광주통합특별시 광산구 사암로92번길",
"address": "광주광역시 광산구 사암로92번길",
"detailAddress": ", 136-26 (우산동)",
"type": "특목고",
"coedu": "남여공학",
@@ -275,10 +275,10 @@
{
"code": "7140369",
"name": "광주자연과학고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "오치동",
"address": "전남광주통합특별시 북구 능안로 30",
"address": "광주광역시 북구 능안로 30",
"detailAddress": "(오치동,광주자연과학고등학교)",
"type": "특성화고",
"coedu": "남여공학",
@@ -288,10 +288,10 @@
{
"code": "7140357",
"name": "광주전자공업고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "월계동",
"address": "전남광주통합특별시 광산구 첨단중앙로 7",
"address": "광주광역시 광산구 첨단중앙로 7",
"detailAddress": "(월계동, 광주전자공업고등학교)",
"type": "특성화고",
"coedu": "남여공학",
@@ -301,10 +301,10 @@
{
"code": "7140323",
"name": "광주제일고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "누문동",
"address": "전남광주통합특별시 북구 독립로237번길 33",
"address": "광주광역시 북구 독립로237번길 33",
"detailAddress": ", 144 (누문동)",
"type": "자율고",
"coedu": "남",
@@ -314,10 +314,10 @@
{
"code": "7140339",
"name": "광주진흥고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "신창동",
"address": "전남광주통합특별시 광산구 왕버들로 307",
"address": "광주광역시 광산구 왕버들로 307",
"detailAddress": ", 광주진흥고등학교 (신창동)",
"type": "일반고",
"coedu": "남",
@@ -327,10 +327,10 @@
{
"code": "7140324",
"name": "광주체육고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "운암동",
"address": "전남광주통합특별시 북구 하서로 55",
"address": "광주광역시 북구 하서로 55",
"detailAddress": "(운암동184번지)",
"type": "특목고",
"coedu": "남여공학",
@@ -340,10 +340,10 @@
{
"code": "7140391",
"name": "광주푸른꿈창작학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "주월동",
"address": "전남광주통합특별시 남구 서문대로749번길 12",
"address": "광주광역시 남구 서문대로749번길 12",
"detailAddress": "(주월동)",
"type": "일반고",
"coedu": "남여공학",
@@ -353,10 +353,10 @@
{
"code": "7140340",
"name": "국제고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "삼각동",
"address": "전남광주통합특별시 북구 설죽로 433",
"address": "광주광역시 북구 설죽로 433",
"detailAddress": "(삼각동)",
"type": "일반고",
"coedu": "남여공학",
@@ -366,10 +366,10 @@
{
"code": "7140360",
"name": "금파공업고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "운암동",
"address": "전남광주통합특별시 북구 금호로 80",
"address": "광주광역시 북구 금호로 80",
"detailAddress": ", 금파공업고등학교 (운암동)",
"type": "특성화고",
"coedu": "남여공학",
@@ -379,10 +379,10 @@
{
"code": "7140341",
"name": "금호고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "운암동",
"address": "전남광주통합특별시 북구 금호로 100",
"address": "광주광역시 북구 금호로 100",
"detailAddress": "(운암동, 금호고등학교)",
"type": "일반고",
"coedu": "남",
@@ -392,10 +392,10 @@
{
"code": "7140389",
"name": "금호중앙여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "운암동",
"address": "전남광주통합특별시 북구 금호로 100",
"address": "광주광역시 북구 금호로 100",
"detailAddress": "(운암동, 금호중앙여자고등학교)",
"type": "일반고",
"coedu": "여",
@@ -405,10 +405,10 @@
{
"code": "7140342",
"name": "대광여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "주월동",
"address": "전남광주통합특별시 남구 서문대로 742번길 13",
"address": "광주광역시 남구 서문대로 742번길 13",
"detailAddress": ", (주월동, 대광여고) ",
"type": "일반고",
"coedu": "여",
@@ -418,10 +418,10 @@
{
"code": "7140343",
"name": "대성여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "진월동",
"address": "전남광주통합특별시 남구 서문대로663번길 37",
"address": "광주광역시 남구 서문대로663번길 37",
"detailAddress": ", 대성여자고등학교 (진월동)",
"type": "일반고",
"coedu": "여",
@@ -431,10 +431,10 @@
{
"code": "7140382",
"name": "돈보스코학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "",
"address": "전남광주통합특별시 남구 서문대로749번마길 12",
"address": "광주광역시 남구 서문대로749번마길 12",
"detailAddress": "돈보스코학교",
"type": "일반고",
"coedu": "남여공학",
@@ -444,10 +444,10 @@
{
"code": "7140370",
"name": "동명고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "서봉동",
"address": "전남광주통합특별시 광산구 사이동길 16",
"address": "광주광역시 광산구 사이동길 16",
"detailAddress": "(서봉동)",
"type": "특성화고",
"coedu": "남여공학",
@@ -457,10 +457,10 @@
{
"code": "7140344",
"name": "동아여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "봉선동",
"address": "전남광주통합특별시 남구 오방로 16-10",
"address": "광주광역시 남구 오방로 16-10",
"detailAddress": "(봉선동,동아여자고등학교)",
"type": "일반고",
"coedu": "여",
@@ -470,10 +470,10 @@
{
"code": "7140390",
"name": "동일미래과학고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "방림동",
"address": "전남광주통합특별시 남구 천변좌로 604",
"address": "광주광역시 남구 천변좌로 604",
"detailAddress": ", 번길 12 (방림동)",
"type": "특성화고",
"coedu": "남여공학",
@@ -483,10 +483,10 @@
{
"code": "7140388",
"name": "명진고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "수완동",
"address": "전남광주통합특별시 광산구 수완로12번길 21",
"address": "광주광역시 광산구 수완로12번길 21",
"detailAddress": ", 명진고등학교 (수완동)",
"type": "일반고",
"coedu": "남여공학",
@@ -496,10 +496,10 @@
{
"code": "7140345",
"name": "문성고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "봉선동",
"address": "전남광주통합특별시 남구 제석로 73",
"address": "광주광역시 남구 제석로 73",
"detailAddress": ", (봉선동, 문성고등학교) ",
"type": "일반고",
"coedu": "남",
@@ -509,10 +509,10 @@
{
"code": "7140379",
"name": "문정여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "오치동",
"address": "전남광주통합특별시 북구 능안로30번길 33",
"address": "광주광역시 북구 능안로30번길 33",
"detailAddress": ", 문정여자고등학교 (오치동, 5-12)",
"type": "일반고",
"coedu": "여",
@@ -522,10 +522,10 @@
{
"code": "7140375",
"name": "보문고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "운수동",
"address": "전남광주통합특별시 광산구 어등대로529번길 37",
"address": "광주광역시 광산구 어등대로529번길 37",
"detailAddress": "(운수동)",
"type": "일반고",
"coedu": "남여공학",
@@ -535,10 +535,10 @@
{
"code": "7140394",
"name": "비아고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "월계동",
"address": "전남광주통합특별시 광산구 첨단중앙로181번길 42-26",
"address": "광주광역시 광산구 첨단중앙로181번길 42-26",
"detailAddress": "(월계동, 비아고등학교)",
"type": "일반고",
"coedu": "남여공학",
@@ -548,10 +548,10 @@
{
"code": "7140383",
"name": "빛고을고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "신용동",
"address": "전남광주통합특별시 북구 첨단연신로133번길 16",
"address": "광주광역시 북구 첨단연신로133번길 16",
"detailAddress": "(신용동, 빛고을고등학교)",
"type": "일반고",
"coedu": "남여공학",
@@ -561,10 +561,10 @@
{
"code": "7140346",
"name": "살레시오고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "일곡동",
"address": "전남광주통합특별시 북구 모룡대길 67",
"address": "광주광역시 북구 모룡대길 67",
"detailAddress": "(일곡동)",
"type": "일반고",
"coedu": "남",
@@ -574,10 +574,10 @@
{
"code": "7140347",
"name": "살레시오여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "동구",
"dong": "지산동",
"address": "전남광주통합특별시 동구 필문대로273번길 21",
"address": "광주광역시 동구 필문대로273번길 21",
"detailAddress": ", (지산동, 살레시오여자고등학교) (지산동)",
"type": "일반고",
"coedu": "여",
@@ -587,10 +587,10 @@
{
"code": "7140371",
"name": "상무고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "서구",
"dong": "쌍촌동",
"address": "전남광주통합특별시 서구 상무민주로32번길 28",
"address": "광주광역시 서구 상무민주로32번길 28",
"detailAddress": "(쌍촌동)",
"type": "일반고",
"coedu": "남여공학",
@@ -600,10 +600,10 @@
{
"code": "7140378",
"name": "상일여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "서구",
"dong": "쌍촌동",
"address": "전남광주통합특별시 서구 내방로 217",
"address": "광주광역시 서구 내방로 217",
"detailAddress": "(쌍촌동)",
"type": "자율고",
"coedu": "여",
@@ -613,10 +613,10 @@
{
"code": "7140384",
"name": "새날학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "삼도동",
"address": "전남광주통합특별시 광산구 평동로 29",
"address": "광주광역시 광산구 평동로 29",
"detailAddress": "(삼도동)",
"type": "일반고",
"coedu": "남여공학",
@@ -626,10 +626,10 @@
{
"code": "7140348",
"name": "서강고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "운암동",
"address": "전남광주통합특별시 북구 서강로 1",
"address": "광주광역시 북구 서강로 1",
"detailAddress": ", 서강고등학교 (운암동)",
"type": "일반고",
"coedu": "남여공학",
@@ -639,10 +639,10 @@
{
"code": "7140376",
"name": "서진여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "주월동",
"address": "전남광주통합특별시 남구 서문대로742번길 20",
"address": "광주광역시 남구 서문대로742번길 20",
"detailAddress": "(주월동)",
"type": "일반고",
"coedu": "여",
@@ -652,10 +652,10 @@
{
"code": "7140352",
"name": "설월여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "방림동",
"address": "전남광주통합특별시 남구 천변좌로604번길 12",
"address": "광주광역시 남구 천변좌로604번길 12",
"detailAddress": ", 설월여자고등학교 (방림동)",
"type": "일반고",
"coedu": "여",
@@ -665,10 +665,10 @@
{
"code": "7140386",
"name": "성덕고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "장덕동",
"address": "전남광주통합특별시 광산구 장덕로 75",
"address": "광주광역시 광산구 장덕로 75",
"detailAddress": "(장덕동)",
"type": "일반고",
"coedu": "남여공학",
@@ -678,10 +678,10 @@
{
"code": "7140349",
"name": "송원고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "송하동",
"address": "전남광주통합특별시 남구 송암로 73",
"address": "광주광역시 남구 송암로 73",
"detailAddress": "(송하동, 송원고등학교)",
"type": "일반고",
"coedu": "남",
@@ -691,10 +691,10 @@
{
"code": "7140399",
"name": "송원미래인재고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "송하동",
"address": "전남광주통합특별시 남구 송암로 73",
"address": "광주광역시 남구 송암로 73",
"detailAddress": ", 송원여자상업고등학교 (송하동)",
"type": "특성화고",
"coedu": "남여공학",
@@ -704,10 +704,10 @@
{
"code": "7140350",
"name": "송원여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "송하동",
"address": "전남광주통합특별시 남구 송암로 73",
"address": "광주광역시 남구 송암로 73",
"detailAddress": ", (송하동, 송원여자고등학교) (송하동)",
"type": "일반고",
"coedu": "여",
@@ -717,10 +717,10 @@
{
"code": "7140381",
"name": "수완고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "수완동",
"address": "전남광주통합특별시 광산구 장덕로 155",
"address": "광주광역시 광산구 장덕로 155",
"detailAddress": ", 수완고등학교 (수완동)",
"type": "자율고",
"coedu": "남여공학",
@@ -730,10 +730,10 @@
{
"code": "7140351",
"name": "숭덕고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "월계동",
"address": "전남광주통합특별시 광산구 월계로 117-8",
"address": "광주광역시 광산구 월계로 117-8",
"detailAddress": "(월계동)",
"type": "일반고",
"coedu": "남여공학",
@@ -743,10 +743,10 @@
{
"code": "7140393",
"name": "숭의과학기술고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "방림동",
"address": "전남광주통합특별시 남구 오방로 34-13",
"address": "광주광역시 남구 오방로 34-13",
"detailAddress": "(방림동)",
"type": "특성화고",
"coedu": "남여공학",
@@ -756,10 +756,10 @@
{
"code": "7140374",
"name": "운남고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "운남동",
"address": "전남광주통합특별시 광산구 임방울대로165번길 17",
"address": "광주광역시 광산구 임방울대로165번길 17",
"detailAddress": ", 운남고등학교 (운남동)",
"type": "일반고",
"coedu": "남여공학",
@@ -769,10 +769,10 @@
{
"code": "7140380",
"name": "장덕고등학교",
"region": "전남광주통합특���시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "장덕동",
"address": "전남광주통합특별시 광산구 수등로 45",
"address": "광주광역시 광산구 수등로 45",
"detailAddress": "(장덕동)",
"type": "일반고",
"coedu": "남여공학",
@@ -782,10 +782,10 @@
{
"code": "7140325",
"name": "전남고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "서구",
"dong": "치평동",
"address": "전남광주통합특별시 서구 상무공원로 32",
"address": "광주광역시 서구 상무공원로 32",
"detailAddress": "(치평동)",
"type": "자율고",
"coedu": "남",
@@ -795,10 +795,10 @@
{
"code": "7140358",
"name": "전남공업고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "신창동",
"address": "전남광주통합특별시 광산구 왕버들로322번길 26",
"address": "광주광역시 광산구 왕버들로322번길 26",
"detailAddress": "(신창동)",
"type": "특성화고",
"coedu": "남여공학",
@@ -808,10 +808,10 @@
{
"code": "7380029",
"name": "전남대학교사범대학부설고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "용봉동",
"address": "전남광주통합특별시 북구 용봉로 45",
"address": "광주광역시 북구 용봉로 45",
"detailAddress": "(용봉동)",
"type": "일반고",
"coedu": "남여공학",
@@ -821,10 +821,10 @@
{
"code": "7140326",
"name": "전남여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "동구",
"dong": "장동",
"address": "전남광주통합특별시 동구 제봉로158번길 8",
"address": "광주광역시 동구 제봉로158번길 8",
"detailAddress": "(장동)",
"type": "일반고",
"coedu": "여",
@@ -834,10 +834,10 @@
{
"code": "7140361",
"name": "전남여자상업고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "북구",
"dong": "삼각동",
"address": "전남광주통합특별시 북구 설죽로 433",
"address": "광주광역시 북구 설죽로 433",
"detailAddress": ", (삼각동, 전남여자상업고등학교) ",
"type": "특성화고",
"coedu": "여",
@@ -847,10 +847,10 @@
{
"code": "7140353",
"name": "정광고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "소촌동",
"address": "전남광주통합특별시 광산구 소촌로 90-36",
"address": "광주광역시 광산구 소촌로 90-36",
"detailAddress": "(소촌동, 정광고등학교)",
"type": "일반고",
"coedu": "남여공학",
@@ -860,10 +860,10 @@
{
"code": "7140354",
"name": "조선대학교부속고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "동구",
"dong": "학동",
"address": "전남광주통합특별시 동구 의재로33번길 33",
"address": "광주광역시 동구 의재로33번길 33",
"detailAddress": ", (학동, 조선대학교부속고등학교) (학동)",
"type": "일반고",
"coedu": "남",
@@ -873,10 +873,10 @@
{
"code": "7140355",
"name": "조선대학교여자고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "동구",
"dong": "지산동",
"address": "전남광주통합특별시 동구 지산로 36",
"address": "광주광역시 동구 지산로 36",
"detailAddress": ", 조선대학교여자고등학교 (지산동)",
"type": "일반고",
"coedu": "여",
@@ -886,10 +886,10 @@
{
"code": "7140377",
"name": "첨단고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "광산구",
"dong": "월계동",
"address": "전남광주통합특별시 광산구 산월로 12-17",
"address": "광주광역시 광산구 산월로 12-17",
"detailAddress": "(월계동,첨단고등학교)",
"type": "일반고",
"coedu": "남여공학",
@@ -899,11 +899,11 @@
{
"code": "7140372",
"name": "풍암고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "서구",
"dong": "풍암동",
"address": "전남광주통합특별시 서구 풍암신흥로39번길 20",
"detailAddress": ", 풍암고��학교 (풍암동)",
"address": "광주광역시 서구 풍암신흥로39번길 20",
"detailAddress": ", 풍암고등학교 (풍암동)",
"type": "일반고",
"coedu": "남여공학",
"foundation": "공립",
@@ -912,10 +912,10 @@
{
"code": "7140356",
"name": "호남삼육고등학교",
"region": "전남광주통합특별시(광주)",
"region": "광주광역시",
"sigungu": "남구",
"dong": "주월동",
"address": "전남광주통합특별시 남구 회서로 30",
"address": "광주광역시 남구 회서로 30",
"detailAddress": "(주월동,삼육중고등학교)",
"type": "일반고",
"coedu": "남여공학",
File diff suppressed because it is too large Load Diff
+5 -3
View File
@@ -9,6 +9,10 @@ export default defineNuxtConfig({
// SSR (Server-Side Rendering) 모드 강제 - 네이버 Yeti 봇 100% 대응
ssr: true,
routeRules: {
'/admin': { headers: { 'X-Robots-Tag': 'noindex, nofollow' } },
'/admin/**': { headers: { 'X-Robots-Tag': 'noindex, nofollow' } }
},
// Windows 경로 구분자 대응 및 Nitro 번들링 안정화
nitro: {
@@ -49,9 +53,7 @@ export default defineNuxtConfig({
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0' },
{ name: 'format-detection', content: 'telephone=no' },
// 네이버 서치어드바이저 사이트 소유확인 키 메타태그
{ name: 'naver-site-verification', content: process.env.NAVER_VERIFICATION_KEY || '48cf582068341a6e4bebde6900b3e0a0e198f4b6' }
{ name: 'format-detection', content: 'telephone=no' }
]
}
}
+1 -1
View File
@@ -9,7 +9,7 @@
<div class="flex items-center gap-1.5 text-slate-600 font-medium">
<NuxtLink to="/" class="hover:text-blue-600 font-semibold transition-colors">홈</NuxtLink>
<span class="text-slate-400">›</span>
<span>{{ parsed.dong }} 과외</span>
<NuxtLink :to="`/${encodeURIComponent(parsed.dong)}`" class="hover:text-blue-600 transition-colors">{{ parsed.dong }} 과외</NuxtLink>
<span class="text-slate-400">›</span>
<strong class="font-bold text-blue-700">{{ parsed.shortSido }} {{ parsed.gradeShort }} {{ parsed.subjectName }} 과외</strong>
</div>
+3
View File
@@ -1,7 +1,10 @@
User-agent: *
Allow: /
Disallow: /admin
User-agent: Yeti
Allow: /
Disallow: /admin
Sitemap: https://aeseo.store/sitemap.xml
Sitemap: https://aeseo.store/sitemap-images.xml
+109 -18
View File
@@ -1,33 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title><![CDATA[클래스픽]]></title>
<title><![CDATA[클래스픽 - 광주 중등 수학 과외 · 광주 초·중·고 1:1 맞춤 과외]]></title>
<link>https://aeseo.store/</link>
<description><![CDATA[광주 초·중·고 1:1 맞춤 과외 및 방문·화상 시범수업 전문 교육 기관]]></description>
<description><![CDATA[광주 중등 수학 과외, 광주 중등 과외, 광주 초·중·고 국영수사과 1:1 방문·화상 맞춤 과외 및 무료 시범수업 전문 클래스픽]]></description>
<language>ko</language>
<pubDate>Wed, 04 Nov 2026 00:47:43 GMT</pubDate>
<lastBuildDate>Wed, 04 Nov 2026 00:47:43 GMT</lastBuildDate>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<lastBuildDate>Mon, 09 Nov 2026 01:00:00 GMT</lastBuildDate>
<atom:link href="https://aeseo.store/rss.xml" rel="self" type="application/rss+xml"/>
<item>
<title><![CDATA[광주 초·중·고 1:1 맞춤 과외 매칭]]></title>
<title><![CDATA[광주 중등 수학 과외 · 광주 중등 과외 | 초·중·고 1:1 맞춤 과외 클래스픽]]></title>
<link>https://aeseo.store/</link>
<description><![CDATA[봉선·수완 등 광주 전지역 과외 비용 비교 및 시범수업 신청]]></description>
<pubDate>Wed, 04 Nov 2026 00:47:43 GMT</pubDate>
<description><![CDATA[광주 전 지역 초·중·고 1:1 방문·화상 맞춤 과외 비용 비교 및 무료 시범수업 신청]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/</guid>
</item>
<item>
<title><![CDATA[봉선동 중학생 수학과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EB%B4%89%EC%84%A0%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EC%88%98%ED%95%99</link>
<description><![CDATA[봉선동 학군 내신 1등급 솔루션]]></description>
<pubDate>Wed, 04 Nov 2026 00:47:43 GMT</pubDate>
<guid>https://aeseo.store/%EB%B4%89%EC%84%A0%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EC%88%98%ED%95%99</guid>
<title><![CDATA[광주 초등 수학 과외 · 도산동 초등학생 수학과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EB%8F%84%EC%82%B0%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EC%88%98%ED%95%99</link>
<description><![CDATA[광주 초등 수학 과외 및 도산동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EB%8F%84%EC%82%B0%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EC%88%98%ED%95%99</guid>
</item>
<item>
<title><![CDATA[수완동 고등학생 영어과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%88%98%EC%99%84%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EC%98%81%EC%96%B4</link>
<description><![CDATA[광산구 수완동 내신 서술형 완벽 대비]]></description>
<pubDate>Wed, 04 Nov 2026 00:47:43 GMT</pubDate>
<guid>https://aeseo.store/%EC%88%98%EC%99%84%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EC%98%81%EC%96%B4</guid>
<title><![CDATA[광주 중등 영어 과외 · 비아동 중학생 영어과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EB%B9%84%EC%95%84%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EC%98%81%EC%96%B4</link>
<description><![CDATA[광주 중등 영어 과외 및 비아동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EB%B9%84%EC%95%84%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EC%98%81%EC%96%B4</guid>
</item>
<item>
<title><![CDATA[광주 고등 국어 과외 · 삼도동 고등학생 국어과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%82%BC%EB%8F%84%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EA%B5%AD%EC%96%B4</link>
<description><![CDATA[광주 고등 국어 과외 및 삼도동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%82%BC%EB%8F%84%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EA%B5%AD%EC%96%B4</guid>
</item>
<item>
<title><![CDATA[광주 초등 과학 과외 · 서봉동 초등학생 과학과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%84%9C%EB%B4%89%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EA%B3%BC%ED%95%99</link>
<description><![CDATA[광주 초등 과학 과외 및 서봉동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%84%9C%EB%B4%89%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EA%B3%BC%ED%95%99</guid>
</item>
<item>
<title><![CDATA[광주 중등 사회 과외 · 소촌동 중학생 사회과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%86%8C%EC%B4%8C%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EC%82%AC%ED%9A%8C</link>
<description><![CDATA[광주 중등 사회 과외 및 소촌동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%86%8C%EC%B4%8C%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EC%82%AC%ED%9A%8C</guid>
</item>
<item>
<title><![CDATA[광주 고등 수학 과외 · 송정동 고등학생 수학과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%86%A1%EC%A0%95%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EC%88%98%ED%95%99</link>
<description><![CDATA[광주 고등 수학 과외 및 송정동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%86%A1%EC%A0%95%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EC%88%98%ED%95%99</guid>
</item>
<item>
<title><![CDATA[광주 초등 영어 과외 · 수완동 초등학생 영어과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%88%98%EC%99%84%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EC%98%81%EC%96%B4</link>
<description><![CDATA[광주 초등 영어 과외 및 수완동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%88%98%EC%99%84%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EC%98%81%EC%96%B4</guid>
</item>
<item>
<title><![CDATA[광주 중등 국어 과외 · 신가동 중학생 국어과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%8B%A0%EA%B0%80%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EA%B5%AD%EC%96%B4</link>
<description><![CDATA[광주 중등 국어 과외 및 신가동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%8B%A0%EA%B0%80%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EA%B5%AD%EC%96%B4</guid>
</item>
<item>
<title><![CDATA[광주 고등 과학 과외 · 신창동 고등학생 과학과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%8B%A0%EC%B0%BD%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EA%B3%BC%ED%95%99</link>
<description><![CDATA[광주 고등 과학 과외 및 신창동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%8B%A0%EC%B0%BD%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EA%B3%BC%ED%95%99</guid>
</item>
<item>
<title><![CDATA[광주 초등 사회 과외 · 우산동 초등학생 사회과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%9A%B0%EC%82%B0%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EC%82%AC%ED%9A%8C</link>
<description><![CDATA[광주 초등 사회 과외 및 우산동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%9A%B0%EC%82%B0%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EC%82%AC%ED%9A%8C</guid>
</item>
<item>
<title><![CDATA[광주 중등 수학 과외 · 운남동 중학생 수학과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%9A%B4%EB%82%A8%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EC%88%98%ED%95%99</link>
<description><![CDATA[광주 중등 수학 과외 및 운남동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%9A%B4%EB%82%A8%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EC%88%98%ED%95%99</guid>
</item>
<item>
<title><![CDATA[광주 고등 영어 과외 · 운수동 고등학생 영어과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%9A%B4%EC%88%98%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EC%98%81%EC%96%B4</link>
<description><![CDATA[광주 고등 영어 과외 및 운수동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%9A%B4%EC%88%98%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EC%98%81%EC%96%B4</guid>
</item>
<item>
<title><![CDATA[광주 초등 국어 과외 · 월계동 초등학생 국어과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%9B%94%EA%B3%84%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EA%B5%AD%EC%96%B4</link>
<description><![CDATA[광주 초등 국어 과외 및 월계동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%9B%94%EA%B3%84%EB%8F%99/%EC%B4%88%EB%93%B1%ED%95%99%EC%83%9D/%EA%B5%AD%EC%96%B4</guid>
</item>
<item>
<title><![CDATA[광주 중등 과학 과외 · 임곡동 중학생 과학과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%9E%84%EA%B3%A1%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EA%B3%BC%ED%95%99</link>
<description><![CDATA[광주 중등 과학 과외 및 임곡동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%9E%84%EA%B3%A1%EB%8F%99/%EC%A4%91%ED%95%99%EC%83%9D/%EA%B3%BC%ED%95%99</guid>
</item>
<item>
<title><![CDATA[광주 고등 사회 과외 · 장덕동 고등학생 사회과외 1:1 맞춤 수업]]></title>
<link>https://aeseo.store/%EC%9E%A5%EB%8D%95%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EC%82%AC%ED%9A%8C</link>
<description><![CDATA[광주 고등 사회 과외 및 장덕동 관내 학교 내신 기출 분석, 1:1 방문·화상 무료 시범수업 안내]]></description>
<pubDate>Mon, 09 Nov 2026 01:00:00 GMT</pubDate>
<guid>https://aeseo.store/%EC%9E%A5%EB%8D%95%EB%8F%99/%EA%B3%A0%EB%93%B1%ED%95%99%EC%83%9D/%EC%82%AC%ED%9A%8C</guid>
</item>
</channel>
</rss>
</rss>
File diff suppressed because it is too large Load Diff
+850 -1016
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,51 @@
import regionsData from '../../data/regions.json'
export default defineEventHandler((event) => {
const config = useRuntimeConfig()
const baseUrl = config.public.siteDomain || 'https://aeseo.store'
const list = regionsData.list as Array<{ sido: string, sigungu: string, dong: string }>
const uniqueDongs = Array.from(new Set(list.map(r => r.dong).filter(Boolean)))
const today = new Date().toISOString().split('T')[0]
const subjects = ['수학', '영어', '국어', '과학', '사회']
const grades = ['초등학생', '중학생', '고등학생']
const subjectImages: Record<string, string> = {
'수학': `${baseUrl}/img/math-tutoring.png`,
'영어': `${baseUrl}/img/english-tutoring.png`,
'국어': `${baseUrl}/img/korean-tutoring.png`,
'과학': `${baseUrl}/img/science-tutoring.png`,
'사회': `${baseUrl}/img/social-studies-tutoring.png`
}
let xml = `<?xml version="1.0" encoding="UTF-8"?>\n`
xml += `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">\n`
// 메인
xml += ` <url>\n <loc>${baseUrl}/</loc>\n <lastmod>${today}</lastmod>\n <changefreq>daily</changefreq>\n <priority>1.0</priority>\n`
xml += ` <image:image><image:loc>${baseUrl}/img/og-main.png</image:loc></image:image>\n`
xml += ` <image:image><image:loc>${baseUrl}/img/math-tutoring.png</image:loc></image:image>\n`
xml += ` <image:image><image:loc>${baseUrl}/img/english-tutoring.png</image:loc></image:image>\n`
xml += ` <image:image><image:loc>${baseUrl}/img/korean-tutoring.png</image:loc></image:image>\n`
xml += ` <image:image><image:loc>${baseUrl}/img/science-tutoring.png</image:loc></image:image>\n`
xml += ` <image:image><image:loc>${baseUrl}/img/social-studies-tutoring.png</image:loc></image:image>\n`
xml += ` </url>\n`
// 중복 제거된 동별 주요 과목 및 학년 URL 생성 (슬래시 라우터 구조 통일)
uniqueDongs.forEach(dong => {
// 1. 동 대표
xml += ` <url>\n <loc>${baseUrl}/${encodeURIComponent(dong)}</loc>\n <lastmod>${today}</lastmod>\n <changefreq>weekly</changefreq>\n <priority>0.8</priority>\n <image:image><image:loc>${baseUrl}/img/math-tutoring.png</image:loc></image:image>\n </url>\n`
// 2. 동/학년/과목 조합
grades.forEach(g => {
subjects.forEach(sub => {
const imgLoc = subjectImages[sub] || `${baseUrl}/img/math-tutoring.png`
xml += ` <url>\n <loc>${baseUrl}/${encodeURIComponent(dong)}/${encodeURIComponent(g)}/${encodeURIComponent(sub)}</loc>\n <lastmod>${today}</lastmod>\n <changefreq>weekly</changefreq>\n <priority>0.7</priority>\n <image:image><image:loc>${imgLoc}</image:loc></image:image>\n </url>\n`
})
})
})
xml += `</urlset>`
setHeader(event, 'content-type', 'application/xml; charset=utf-8')
return xml
})
+5 -4
View File
@@ -4,6 +4,7 @@ export default defineEventHandler((event) => {
const config = useRuntimeConfig()
const baseUrl = config.public.siteDomain || 'https://aeseo.store'
const list = regionsData.list as Array<{ sido: string, sigungu: string, dong: string }>
const uniqueDongs = Array.from(new Set(list.map(r => r.dong).filter(Boolean)))
const today = new Date().toISOString().split('T')[0]
const subjects = ['수학', '영어', '국어', '과학', '사회']
@@ -29,16 +30,16 @@ export default defineEventHandler((event) => {
xml += ` <image:image><image:loc>${baseUrl}/img/social-studies-tutoring.png</image:loc></image:image>\n`
xml += ` </url>\n`
// 동별 주요 과목 및 학년 URL 생성 (슬래시 라우터 구조 통일)
list.forEach(r => {
// 중복 제거된 동별 주요 과목 및 학년 URL 생성 (슬래시 라우터 구조 통일)
uniqueDongs.forEach(dong => {
// 1. 동 대표
xml += ` <url>\n <loc>${baseUrl}/${encodeURIComponent(r.dong)}</loc>\n <lastmod>${today}</lastmod>\n <changefreq>weekly</changefreq>\n <priority>0.8</priority>\n <image:image><image:loc>${baseUrl}/img/math-tutoring.png</image:loc></image:image>\n </url>\n`
xml += ` <url>\n <loc>${baseUrl}/${encodeURIComponent(dong)}</loc>\n <lastmod>${today}</lastmod>\n <changefreq>weekly</changefreq>\n <priority>0.8</priority>\n <image:image><image:loc>${baseUrl}/img/math-tutoring.png</image:loc></image:image>\n </url>\n`
// 2. 동/학년/과목 조합
grades.forEach(g => {
subjects.forEach(sub => {
const imgLoc = subjectImages[sub] || `${baseUrl}/img/math-tutoring.png`
xml += ` <url>\n <loc>${baseUrl}/${encodeURIComponent(r.dong)}/${encodeURIComponent(g)}/${encodeURIComponent(sub)}</loc>\n <lastmod>${today}</lastmod>\n <changefreq>weekly</changefreq>\n <priority>0.7</priority>\n <image:image><image:loc>${imgLoc}</image:loc></image:image>\n </url>\n`
xml += ` <url>\n <loc>${baseUrl}/${encodeURIComponent(dong)}/${encodeURIComponent(g)}/${encodeURIComponent(sub)}</loc>\n <lastmod>${today}</lastmod>\n <changefreq>weekly</changefreq>\n <priority>0.7</priority>\n <image:image><image:loc>${imgLoc}</image:loc></image:image>\n </url>\n`
})
})
})
+13 -7
View File
@@ -113,30 +113,35 @@ export function parseRouteSlug(slugInput: string | string[]): ParsedRouteParams
} else if (typeof slugInput === 'string' && slugInput.trim()) {
tokens = decodeURIComponent(slugInput).split(/[-_\s/]+/)
}
tokens = tokens.map(t => t.trim()).filter(Boolean)
tokens = tokens.map(t => t.trim()).filter(t => Boolean(t) && !/^index\.html?$/i.test(t))
let matchedRegion: RegionInfo | null = null
let matchedTokenIdx = -1
let detectedGrade = '중학생'
let detectedGradeShort = '중등'
let detectedSubjectKey = 'english'
let detectedSubjectName = '영어'
let detectedSubjectKey = 'math'
let detectedSubjectName = '수학'
let detectedTerm = '과외'
// 1. 토큰들 중 동 이름 매칭
for (const token of tokens) {
for (let i = 0; i < tokens.length; i++) {
const token = tokens[i]
const reg = getRegionByDong(token)
if (reg) {
matchedRegion = reg
matchedTokenIdx = i
break
}
}
// 2. 동 이름이 토큰에 없으면 전체 리스트에서 부분 일치 검색
if (!matchedRegion && tokens.length > 0) {
for (const token of tokens) {
for (let i = 0; i < tokens.length; i++) {
const token = tokens[i]
const found = (regionsData.list as RegionInfo[]).find(r => token.includes(r.dong) || (token.length >= 2 && r.dong.includes(token)))
if (found) {
matchedRegion = found
matchedTokenIdx = i
break
}
}
@@ -152,9 +157,10 @@ export function parseRouteSlug(slugInput: string | string[]): ParsedRouteParams
}
}
// 3. 학년 추출
// 3. 학년 추출 (동 이름 토큰을 제외한 나머지 토큰에서만 검색하여 '고등동', '문학동' 등 별칭 충돌 원천 차단)
let hasExplicitGrade = false
const fullText = tokens.join(' ')
const remainingTokens = tokens.filter((_, idx) => idx !== matchedTokenIdx)
const fullText = remainingTokens.join(' ')
for (const g of GRADES_LIST) {
if (g.aliases.some(a => fullText.includes(a))) {
detectedGrade = g.name
+10 -5
View File
@@ -1,5 +1,5 @@
import type { ParsedRouteParams } from './dataHelper'
import { getShortRegionName } from './dataHelper'
import { getShortRegionName, getShortSido } from './dataHelper'
const SUBJECT_IMAGE_MAP: Record<string, string> = {
math: '/img/math-tutoring.png',
@@ -22,20 +22,25 @@ const CORE_GRADES = ['초등학생', '중학생', '고등학생']
export function generateSeoMeta(parsed: ParsedRouteParams, siteName = '클래스픽', siteDomain = 'https://aeseo.store') {
const { sido, sigungu, dong, shortRegionName, grade, subjectKey, subjectName, isRegionOnly } = parsed
const shortSido = parsed.shortSido || sido.replace(/특별시|광역시|특별자치시|도/g, '').trim()
const shortSido = parsed.shortSido || getShortSido(sido)
const gradeShort = parsed.gradeShort || (grade === '초등학생' ? '초등' : grade === '고등학생' ? '고등' : '중등')
const regionTitle = shortRegionName || getShortRegionName(sido, dong)
const regionTitle = shortRegionName || getShortRegionName(sido, dong, sigungu)
const subjectImg = SUBJECT_IMAGE_MAP[subjectKey] || '/img/math-tutoring.png'
// 검색어 [지역] [초등/중등/고등] [과목] 과외 / [지역] [초등/중등/고등] 과외 완벽 매칭 타이틀
const dongHash = Array.from(dong || '').reduce((acc, ch) => acc + ch.charCodeAt(0), 0)
const baseSubjects = ['수학', '영어', '국어', '과학', '사회']
const rotatedSubjects = baseSubjects.map((_, i) => baseSubjects[(dongHash + i) % baseSubjects.length])
const rotatedSubText = rotatedSubjects.map(s => `${dong}${s}과외선생님`).join(', ')
const pageTitle = isRegionOnly
? `${shortSido} 중등 수학 과외 · ${shortSido} 중등 과외 | ${regionTitle} 초·중·고 1:1 맞춤 과외`
: `${shortSido} ${gradeShort} ${subjectName} 과외 · ${regionTitle} ${grade} ${subjectName}과외 | ${shortSido} ${gradeShort} 과외 1:1 매칭`
// 첫 문장이 정확한 타겟 키워드로 시작하는 고의도 메타 디스크립션 (더세이브 동기화)
const pageDescription = isRegionOnly
? `${shortSido} 중등 수학 과외, ${shortSido} 중등 과외, ${dong} 중등 수학 과외 전문 ${siteName}! ${regionTitle} 초등·중등·고등 국영수사과 1:1 맞춤 과외, 검증된 전문 선생님 무료 시범수업과 과외비 비교를 확인하세요.`
: `${shortSido} ${gradeShort} ${subjectName} 과외, ${shortSido} ${gradeShort} 과외, ${dong} ${gradeShort} ${subjectName} 과외 전문 ${siteName}! ${regionTitle} ${grade} ${subjectName} 1:1 방문·화상 맞춤 수업으로 내신·수능 성적 향상을 책임집니다. 과외비 투명 공개 및 무료 시범수업 신청하세요.`
? `${shortSido} 중등 수학 과외, ${shortSido} 중등 과외, ${dong} 중등 수학 과외 전문 ${siteName}! ${regionTitle} 초등·중등·고등 국영수사과 1:1 맞춤 과외, 검증된 전문 선생님 무료 시범수업과 과외비 비교(${rotatedSubText})를 확인하세요.`
: `${shortSido} ${gradeShort} ${subjectName} 과외, ${shortSido} ${gradeShort} 과외, ${dong} ${gradeShort} ${subjectName} 과외 전문 ${siteName}! ${regionTitle} ${grade} ${subjectName} 1:1 방문·화상 맞춤 수업으로 내신·수능 성적 향상을 책임집니다. 과외비 투명 공개 및 무료 시범수업(${rotatedSubText})을 신청하세요.`
const pageKeywords = `${shortSido} ${gradeShort} ${subjectName} 과외, ${shortSido} ${gradeShort} 과외, ${dong} ${gradeShort} ${subjectName} 과외, ${dong} ${gradeShort} 과외, ${shortSido}${gradeShort}${subjectName}과외, ${shortSido}${gradeShort}과외, ${shortSido} 중등 수학 과외, ${shortSido} 중등 과외, ${shortSido} 고등 수학 과외, ${shortSido} 초등 수학 과외, ${regionTitle} ${subjectName}과외, ${dong} ${subjectName}과외, ${dong} ${grade} ${subjectName}과외, ${dong}과외, ${sigungu}과외, ${shortSido}과외`