방식 개편

This commit is contained in:
2026-11-05 14:07:55 +09:00
parent 6d78eccb65
commit 67a7fa0326
156 changed files with 107591 additions and 12747 deletions
+32 -22
View File
@@ -17,10 +17,12 @@ export interface ParsedRouteParams {
dong: string
shortRegionName: string
grade: string
gradeShort: string
subjectKey: string
subjectName: string
targetTerm: string
fullKeyword: string
isRegionOnly?: boolean
}
// 5대 핵심 과목 정의
@@ -34,30 +36,34 @@ export const SUBJECTS_MAP: Record<string, { key: string, name: string, badge: st
// 학년 정의
export const GRADES_LIST = [
{ key: 'middle', name: '중학생', aliases: ['중학생', '중1', '중2', '중3', '중등'] },
{ key: 'high', name: '고등학생', aliases: ['고등학생', '고1', '고2', '고3', '고등', '예비고1'] },
{ key: 'elem', name: '초등학생', aliases: ['초등학생', '초등', '초5', '초6'] }
{ key: 'middle', name: '중학생', shortName: '중등', aliases: ['중학생', '중1', '중2', '중3', '중등'] },
{ key: 'high', name: '고등학생', shortName: '고등', aliases: ['고등학생', '고1', '고2', '고3', '고등', '예비고1', 'N수', '재수'] },
{ key: 'elem', name: '초등학생', shortName: '초등', aliases: ['초등학생', '초등', '초1', '초2', '초3', '초4', '초5', '초6'] }
]
// 동 이름으로 지역 검색
export function getRegionByDong(dongQuery: string): RegionInfo | null {
if (!dongQuery) return null
const clean = dongQuery.trim().replace(/동$/, '') // '황금' 또는 '황금동' 모두 매칭
const clean = dongQuery.trim().replace(/[동읍면리가]$/, '')
const map = regionsData.dongMap as Record<string, RegionInfo[]>
// 1. 정확 매칭 (황금동)
// 1. 정확 매칭
if (map[dongQuery] && map[dongQuery].length > 0) {
return map[dongQuery][0]
}
// 2. '동' 붙여서 매칭
if (map[dongQuery + '동'] && map[dongQuery + '동'].length > 0) {
return map[dongQuery + '동'][0]
// 2. '동', '읍', '면' 붙여서 매칭
for (const suffix of ['동', '읍', '면']) {
if (map[clean + suffix] && map[clean + suffix].length > 0) {
return map[clean + suffix][0]
}
}
// 3. 리스트 전체 순회 매칭
const found = (regionsData.list as RegionInfo[]).find(r =>
r.dong === dongQuery ||
r.dong === (dongQuery + '동') ||
r.dong.startsWith(clean)
r.dong === (clean + '동') ||
r.dong === (clean + '읍') ||
r.dong === (clean + '면') ||
(clean.length >= 2 && r.dong.startsWith(clean))
)
return found || null
}
@@ -99,12 +105,6 @@ export function getShortRegionName(sido: string, dong: string, sigungu?: string)
}
// 지능형 URL 슬러그 파서
// 지원 예시:
// - ['대구광역시', '수성구', '황금동']
// - ['대구광역시', '황금동', '중학생', '영어']
// - ['황금동', '중학생', '영어']
// - ['황금동-중학생-영어']
// - '대구광역시-황금동-중학생-영어'
export function parseRouteSlug(slugInput: string | string[]): ParsedRouteParams {
let tokens: string[] = []
@@ -117,6 +117,7 @@ export function parseRouteSlug(slugInput: string | string[]): ParsedRouteParams
let matchedRegion: RegionInfo | null = null
let detectedGrade = '중학생'
let detectedGradeShort = '중등'
let detectedSubjectKey = 'english'
let detectedSubjectName = '영어'
let detectedTerm = '과외'
@@ -141,30 +142,37 @@ export function parseRouteSlug(slugInput: string | string[]): ParsedRouteParams
}
}
// 기본값 (568개 타겟 지역 중 첫 번째 기준)
// 기본값 (타겟 지역 중 첫 번째 기준)
if (!matchedRegion) {
matchedRegion = (regionsData.list as RegionInfo[])[0] || {
fullName: '경기도 고양시 덕양구 고양동',
sido: '경기도',
sigungu: '고양시 덕양구',
dong: '고양동'
fullName: '부산광역시 해운대구 우동',
sido: '부산광역시',
sigungu: '해운대구',
dong: '우동'
}
}
// 3. 학년 추출
let hasExplicitGrade = false
const fullText = tokens.join(' ')
for (const g of GRADES_LIST) {
if (g.aliases.some(a => fullText.includes(a))) {
detectedGrade = g.name
detectedGradeShort = g.shortName
hasExplicitGrade = true
break
}
}
const gradeShort = detectedGradeShort || (detectedGrade === '초등학생' ? '초등' : detectedGrade === '고등학생' ? '고등' : '중등')
// 4. 과목 추출
let hasExplicitSubject = false
for (const [key, sub] of Object.entries(SUBJECTS_MAP)) {
if (sub.aliases.some(a => fullText.includes(a))) {
detectedSubjectKey = key
detectedSubjectName = sub.name
hasExplicitSubject = true
break
}
}
@@ -188,10 +196,12 @@ export function parseRouteSlug(slugInput: string | string[]): ParsedRouteParams
dong: matchedRegion.dong,
shortRegionName,
grade: detectedGrade,
gradeShort,
subjectKey: detectedSubjectKey,
subjectName: detectedSubjectName,
targetTerm: detectedTerm,
fullKeyword
fullKeyword,
isRegionOnly: !hasExplicitGrade && !hasExplicitSubject
}
}