|
|
|
|
@ -0,0 +1,99 @@
|
|
|
|
|
// 行程导出功能
|
|
|
|
|
export function exportToMarkdown(scheme, filename = null) {
|
|
|
|
|
if (!scheme) return
|
|
|
|
|
|
|
|
|
|
const md = generateMarkdown(scheme)
|
|
|
|
|
const blob = new Blob([md], { type: 'text/markdown;charset=utf-8' })
|
|
|
|
|
const url = URL.createObjectURL(blob)
|
|
|
|
|
const link = document.createElement('a')
|
|
|
|
|
link.href = url
|
|
|
|
|
link.download = filename || `${scheme.name || '行程规划'}.md`
|
|
|
|
|
document.body.appendChild(link)
|
|
|
|
|
link.click()
|
|
|
|
|
document.body.removeChild(link)
|
|
|
|
|
URL.revokeObjectURL(url)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function generateMarkdown(scheme) {
|
|
|
|
|
let md = `# ${scheme.name || '行程规划'}\n\n`
|
|
|
|
|
|
|
|
|
|
// 基本信息
|
|
|
|
|
md += `## 基本信息\n\n`
|
|
|
|
|
md += `- **路线**:${scheme.route || '—'}\n`
|
|
|
|
|
md += `- **天数**:${scheme.days || '—'}天\n`
|
|
|
|
|
md += `- **总里程**:~${scheme.totalKm || '—'}km\n`
|
|
|
|
|
md += `- **驾驶时间**:~${scheme.totalDriveTime || '—'}小时\n`
|
|
|
|
|
md += `- **预算**:${scheme.budget || '—'}\n\n`
|
|
|
|
|
|
|
|
|
|
// 亮点
|
|
|
|
|
if (scheme.highlights && scheme.highlights.length > 0) {
|
|
|
|
|
md += `## 行程亮点\n\n`
|
|
|
|
|
scheme.highlights.forEach(h => {
|
|
|
|
|
md += `- ${h}\n`
|
|
|
|
|
})
|
|
|
|
|
md += '\n'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 每日行程
|
|
|
|
|
if (scheme.daysDetail && scheme.daysDetail.length > 0) {
|
|
|
|
|
md += `## 每日行程\n\n`
|
|
|
|
|
scheme.daysDetail.forEach((day, idx) => {
|
|
|
|
|
md += `### Day ${idx + 1}:${day.location || '未知地点'}\n\n`
|
|
|
|
|
if (day.desc) md += `${day.desc}\n\n`
|
|
|
|
|
if (day.km) md += `- **里程**:${day.km}km\n`
|
|
|
|
|
if (day.driveTime) md += `- **驾驶时间**:${day.driveTime}h\n\n`
|
|
|
|
|
|
|
|
|
|
if (day.spots && day.spots.length > 0) {
|
|
|
|
|
md += `**途经景点**:${day.spots.join('、')}\n\n`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 详细日程
|
|
|
|
|
if (day.schedule && day.schedule.length > 0) {
|
|
|
|
|
md += `#### 日程安排\n\n`
|
|
|
|
|
md += `| 时间 | 行程 | 说明 |\n`
|
|
|
|
|
md += `|------|------|------|\n`
|
|
|
|
|
day.schedule.forEach(s => {
|
|
|
|
|
md += `| ${s.time || '—'} | ${s.title || s.content || '—'} | ${s.desc || '—'} |\n`
|
|
|
|
|
})
|
|
|
|
|
md += '\n'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 途径推荐
|
|
|
|
|
if (day.waypoints && day.waypoints.length > 0) {
|
|
|
|
|
md += `#### 途径推荐\n\n`
|
|
|
|
|
day.waypoints.forEach(wp => {
|
|
|
|
|
md += `- **${wp.icon || '📍'} ${wp.name}**:${wp.desc || '—'}\n`
|
|
|
|
|
})
|
|
|
|
|
md += '\n'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 美食推荐
|
|
|
|
|
if (day.foods && day.foods.length > 0) {
|
|
|
|
|
md += `#### 美食推荐\n\n`
|
|
|
|
|
day.foods.forEach(f => {
|
|
|
|
|
const name = typeof f === 'string' ? f : (f.name || f)
|
|
|
|
|
const icon = typeof f === 'object' ? (f.icon || '🍜') : '🍜'
|
|
|
|
|
const desc = typeof f === 'object' ? (f.desc || '') : ''
|
|
|
|
|
md += `- ${icon} **${name}**${desc ? `:${desc}` : ''}\n`
|
|
|
|
|
})
|
|
|
|
|
md += '\n'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 住宿
|
|
|
|
|
if (day.hotel) {
|
|
|
|
|
md += `**住宿推荐**:${day.hotel}\n\n`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
md += '---\n\n'
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 旅行贴士
|
|
|
|
|
if (scheme.tips) {
|
|
|
|
|
md += `## 旅行贴士\n\n${scheme.tips}\n\n`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
md += `> 由智能行程规划系统生成\n`
|
|
|
|
|
|
|
|
|
|
return md
|
|
|
|
|
}
|