fix: 修复日期显示NaN年NaN月NaN日的问题
- formatDate兼容date和createdAt两种字段名 - 增加空值和无效日期防御 - 同步news.json分类数据(之前category全为null) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
这个提交包含在:
父节点
a25f3a77ce
当前提交
a38066d557
@ -1,44 +1,44 @@
|
||||
{
|
||||
"articles": [
|
||||
{
|
||||
"id": "news-3",
|
||||
"title": "额吉的故乡V9正式发布:三大升级,一家一车",
|
||||
"date": "2026-03-08",
|
||||
"category": null,
|
||||
"summary": "呼籁旅行2026夏季旗舰产品「额吉的故乡V9」正式发布。V9在V8基础上完成三大升级:营地迁入敖包召回景区、白桦林新增非遗传承人课程、深度合作云牧场。6天5晚,一家一车,5月开始接待。",
|
||||
"content": "2026年3月7-8日,呼籁旅行2026夏季旗舰产品「额吉的故乡V9」正式对外发布。V9是额吉的故乡系列的第9次迭代,从2023年V1上线至今,已服务超过10000组家庭、39000余人次。本次V9在V8基础上完成三大核心升级:一、营地升级——呼籁自营营地迁入敖包召回景区,在景区内拥有独立空间,上午安排营地烧烤和旅拍,避开下午客流高峰;二、非遗研学升级——白桦林增设非遗传承人专属课程,按年龄分层设计体验内容;三、牧场升级——与云牧场达成深度合作,体验近距离牧场互动,同时在附近自营空间安排蒙古包体验、捡牛粪、酥油茶、手工毡等活动。产品为6天5晚行程,分舒适套餐和尊享套餐两个版本,全程一家一单一车、独立成团。预售期间下单享早鸟优惠,5月正式开始接待。"
|
||||
},
|
||||
{
|
||||
"id": "news-4",
|
||||
"title": "2026小蒙马亲子夏令营开放报名",
|
||||
"date": "2026-02-20",
|
||||
"category": null,
|
||||
"summary": "2026年小蒙马亲子夏令营正式开放报名,7天6晚,每期最多8组家庭,涵盖草原、森林、湿地三大研学模块,全程路虎头等舱车队、专属摄影师跟拍。",
|
||||
"content": "2026年小蒙马亲子夏令营正式开放报名。小蒙马是呼籁旅行专为家庭设计的深度营地产品,行程7天6晚,每期最多8组家庭同行。课程围绕草原、森林、湿地三大研学模块设计,包含恩和骑马、乌兰山滑草、ATV越野、面包DIY、兰旗果舍等体验。全程配备路虎头等舱车队,每组家庭配专属摄影师全程跟拍。2026年夏季计划开设9期,名额有限,报名请联系定制师获取详细方案和排期。"
|
||||
},
|
||||
{
|
||||
"id": "news-5",
|
||||
"title": "呼籁营地迁入敖包召回景区,2026赛季全面升级",
|
||||
"date": "2026-02-10",
|
||||
"category": null,
|
||||
"summary": "呼籁自营营地正式迁入敖包召回景区,签约5年(2026-2030),在景区内拥有独立空间和品牌IP,2026年5月正式开营。",
|
||||
"content": "呼籁旅行自营营地已完成选址升级,正式迁入敖包召回景区。此次合作签约5年(2026-2030),呼籁在景区内拥有独立运营空间,品牌IP归呼籁所有。新营地的核心优势是行程节奏的优化:上午在营地完成旅拍和烧烤,下午再进入莫日格勒河景区,避开游客高峰时段。营地将于2026年5月正式开营,届时将配合额吉的故乡V9产品一同投入使用。"
|
||||
"id": "news-7",
|
||||
"title": "呼籁荣获小红书WILL商业大会「年度成长型品牌」",
|
||||
"date": "2026-01-05",
|
||||
"category": "活动",
|
||||
"summary": "呼籁旅行在2026小红书WILL商业大会上荣获「年度成长型品牌」,全国文旅行业仅6家品牌获此荣誉。6家品牌中,呼籁是深耕单一目的地的本地品牌代表。",
|
||||
"content": "在2026年小红书WILL商业大会上,呼籁旅行荣获「年度成长型品牌」称号。全国文旅行业仅6家品牌入选,6家品牌中,呼籁是深耕单一目的地的本地品牌代表。呼籁小红书账号「Mr.小雷-呼籁旅行」由联合创始人孙雷运营,目前拥有9.5万+粉丝。这份荣誉属于每一位愿意在小红书分享呼伦贝尔旅行故事的客户和伙伴。"
|
||||
},
|
||||
{
|
||||
"id": "news-6",
|
||||
"title": "呼籁2025年度回顾:累计服务家庭突破10000组",
|
||||
"date": "2026-01-15",
|
||||
"category": null,
|
||||
"category": "公告",
|
||||
"summary": "呼籁旅行2025年度接待约18000人次,自2015年创立以来,累计服务家庭突破10000组、39000余人次。感谢每一个信任呼籁的家庭。",
|
||||
"content": "回顾2025年,呼籁旅行全年接待约18000人次。自2015年创立以来,呼籁累计服务家庭已突破10000组,共计39000余人次踏上呼伦贝尔草原。这一年,额吉的故乡从V8迭代到V9,小蒙马亲子夏令营正式上线,自有车队和自营营地投入运营——这些变化的背后,是每一个选择信任呼籁的家庭给了我们持续投入的底气。2026年,我们会继续深耕呼伦贝尔家庭定制游,把更多精力放在服务本身。"
|
||||
},
|
||||
{
|
||||
"id": "news-7",
|
||||
"title": "呼籁荣获小红书WILL商业大会「年度成长型品牌」",
|
||||
"date": "2026-01-05",
|
||||
"category": null,
|
||||
"summary": "呼籁旅行在2026小红书WILL商业大会上荣获「年度成长型品牌」,全国文旅行业仅6家品牌获此荣誉。6家品牌中,呼籁是深耕单一目的地的本地品牌代表。",
|
||||
"content": "在2026年小红书WILL商业大会上,呼籁旅行荣获「年度成长型品牌」称号。全国文旅行业仅6家品牌入选,6家品牌中,呼籁是深耕单一目的地的本地品牌代表。呼籁小红书账号「Mr.小雷-呼籁旅行」由联合创始人孙雷运营,目前拥有9.5万+粉丝。这份荣誉属于每一位愿意在小红书分享呼伦贝尔旅行故事的客户和伙伴。"
|
||||
"id": "news-5",
|
||||
"title": "呼籁营地迁入敖包召回景区,2026赛季全面升级",
|
||||
"date": "2026-02-10",
|
||||
"category": "公告",
|
||||
"summary": "呼籁自营营地正式迁入敖包召回景区,签约5年(2026-2030),在景区内拥有独立空间和品牌IP,2026年5月正式开营。",
|
||||
"content": "呼籁旅行自营营地已完成选址升级,正式迁入敖包召回景区。此次合作签约5年(2026-2030),呼籁在景区内拥有独立运营空间,品牌IP归呼籁所有。新营地的核心优势是行程节奏的优化:上午在营地完成旅拍和烧烤,下午再进入莫日格勒河景区,避开游客高峰时段。营地将于2026年5月正式开营,届时将配合额吉的故乡V9产品一同投入使用。"
|
||||
},
|
||||
{
|
||||
"id": "news-4",
|
||||
"title": "2026小蒙马亲子夏令营开放报名",
|
||||
"date": "2026-02-20",
|
||||
"category": "产品",
|
||||
"summary": "2026年小蒙马亲子夏令营正式开放报名,7天6晚,每期最多8组家庭,涵盖草原、森林、湿地三大研学模块,全程路虎头等舱车队、专属摄影师跟拍。",
|
||||
"content": "2026年小蒙马亲子夏令营正式开放报名。小蒙马是呼籁旅行专为家庭设计的深度营地产品,行程7天6晚,每期最多8组家庭同行。课程围绕草原、森林、湿地三大研学模块设计,包含恩和骑马、乌兰山滑草、ATV越野、面包DIY、兰旗果舍等体验。全程配备路虎头等舱车队,每组家庭配专属摄影师全程跟拍。2026年夏季计划开设9期,名额有限,报名请联系定制师获取详细方案和排期。"
|
||||
},
|
||||
{
|
||||
"id": "news-3",
|
||||
"title": "额吉的故乡V9正式发布:三大升级,一家一车",
|
||||
"date": "2026-03-08",
|
||||
"category": "产品",
|
||||
"summary": "呼籁旅行2026夏季旗舰产品「额吉的故乡V9」正式发布。V9在V8基础上完成三大升级:营地迁入敖包召回景区、白桦林新增非遗传承人课程、深度合作云牧场。6天5晚,一家一车,5月开始接待。",
|
||||
"content": "2026年3月7-8日,呼籁旅行2026夏季旗舰产品「额吉的故乡V9」正式对外发布。V9是额吉的故乡系列的第9次迭代,从2023年V1上线至今,已服务超过10000组家庭、39000余人次。本次V9在V8基础上完成三大核心升级:一、营地升级——呼籁自营营地迁入敖包召回景区,在景区内拥有独立空间,上午安排营地烧烤和旅拍,避开下午客流高峰;二、非遗研学升级——白桦林增设非遗传承人专属课程,按年龄分层设计体验内容;三、牧场升级——与云牧场达成深度合作,体验近距离牧场互动,同时在附近自营空间安排蒙古包体验、捡牛粪、酥油茶、手工毡等活动。产品为6天5晚行程,分舒适套餐和尊享套餐两个版本,全程一家一单一车、独立成团。预售期间下单享早鸟优惠,5月正式开始接待。"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
<!-- 文章元信息 -->
|
||||
<div class="article-meta">
|
||||
<span class="article-category">{{ article.category }}</span>
|
||||
<span class="article-date">{{ formatDate(article.date) }}</span>
|
||||
<span class="article-date">{{ formatDate(article.date || article.createdAt) }}</span>
|
||||
<span class="article-author">作者:{{ article.author }}</span>
|
||||
</div>
|
||||
|
||||
@ -241,7 +241,9 @@ const nextArticle = currentIndex < allArticles.length - 1 ? allArticles[currentI
|
||||
const otherArticles = allArticles
|
||||
|
||||
function formatDate(dateStr) {
|
||||
const d = new Date(dateStr)
|
||||
if (!dateStr) return ''
|
||||
const d = new Date(dateStr.includes('T') ? dateStr : dateStr + 'T00:00:00')
|
||||
if (isNaN(d.getTime())) return ''
|
||||
return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日`
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -50,7 +50,7 @@
|
||||
</div>
|
||||
<div class="blog-card__body">
|
||||
<div class="blog-card__meta">
|
||||
<span class="blog-card__date">{{ formatDate(article.date) }}</span>
|
||||
<span class="blog-card__date">{{ formatDate(article.date || article.createdAt) }}</span>
|
||||
<span class="blog-card__author">{{ article.author }}</span>
|
||||
</div>
|
||||
<h2 class="blog-card__title">{{ article.title }}</h2>
|
||||
@ -134,7 +134,9 @@ function getCategoryCount(key) {
|
||||
}
|
||||
|
||||
function formatDate(dateStr) {
|
||||
const d = new Date(dateStr)
|
||||
if (!dateStr) return ''
|
||||
const d = new Date(dateStr.includes('T') ? dateStr : dateStr + 'T00:00:00')
|
||||
if (isNaN(d.getTime())) return ''
|
||||
return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日`
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
>
|
||||
<div class="news-meta">
|
||||
<span :class="['news-cat', `news-cat--${article.category}`]">{{ article.category }}</span>
|
||||
<time class="news-date" :datetime="article.date">{{ formatDate(article.date) }}</time>
|
||||
<time class="news-date" :datetime="article.date || article.createdAt">{{ formatDate(article.date || article.createdAt) }}</time>
|
||||
</div>
|
||||
<h2 class="news-title">{{ article.title }}</h2>
|
||||
<p class="news-summary">{{ article.summary }}</p>
|
||||
@ -85,8 +85,8 @@ newsData.articles.forEach((article) => {
|
||||
headline: article.title,
|
||||
description: article.summary,
|
||||
articleBody: article.content,
|
||||
datePublished: article.date + 'T00:00:00+08:00',
|
||||
dateModified: article.date + 'T00:00:00+08:00',
|
||||
datePublished: (article.date || article.createdAt) + 'T00:00:00+08:00',
|
||||
dateModified: (article.date || article.createdAt) + 'T00:00:00+08:00',
|
||||
articleSection: article.category,
|
||||
inLanguage: 'zh-CN',
|
||||
url: 'https://1814.love/news',
|
||||
@ -108,7 +108,9 @@ const filteredArticles = computed(() => {
|
||||
})
|
||||
|
||||
function formatDate(dateStr) {
|
||||
const d = new Date(dateStr)
|
||||
if (!dateStr) return ''
|
||||
const d = new Date(dateStr.includes('T') ? dateStr : dateStr + 'T00:00:00')
|
||||
if (isNaN(d.getTime())) return ''
|
||||
return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日`
|
||||
}
|
||||
</script>
|
||||
|
||||
正在加载...
x
在新工单中引用
屏蔽一个用户