방식 개편
This commit is contained in:
+32
-21
@@ -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,29 +36,33 @@ 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 === (clean + '동') ||
|
||||
r.dong === (clean + '읍') ||
|
||||
r.dong === (clean + '면') ||
|
||||
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,38 @@ 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
|
||||
}
|
||||
}
|
||||
if (!detectedGradeShort) {
|
||||
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 +197,12 @@ export function parseRouteSlug(slugInput: string | string[]): ParsedRouteParams
|
||||
dong: matchedRegion.dong,
|
||||
shortRegionName,
|
||||
grade: detectedGrade,
|
||||
gradeShort: detectedGradeShort,
|
||||
subjectKey: detectedSubjectKey,
|
||||
subjectName: detectedSubjectName,
|
||||
targetTerm: detectedTerm,
|
||||
fullKeyword
|
||||
fullKeyword,
|
||||
isRegionOnly: !hasExplicitGrade && !hasExplicitSubject
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user