52 lines
2.8 KiB
TypeScript
52 lines
2.8 KiB
TypeScript
import regionsData from '../../data/regions.json'
|
|
|
|
export default defineEventHandler((event) => {
|
|
const config = useRuntimeConfig()
|
|
const baseUrl = config.public.siteDomain || 'https://aeseo.shop'
|
|
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
|
|
})
|