diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..258ee65 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "hulai-dev", + "runtimeExecutable": "npx", + "runtimeArgs": ["nuxt", "dev", "--port", "3000"], + "port": 3000, + "cwd": "/Users/liutao/Desktop/呼籁智库/hulai-website" + } + ] +} diff --git a/CMS-INTEGRATION.md b/CMS-INTEGRATION.md index a6a5a11..45ef3df 100644 --- a/CMS-INTEGRATION.md +++ b/CMS-INTEGRATION.md @@ -20,7 +20,7 @@ | 模块 | 当前文件 | 操作类型 | 更新频率 | 说明 | |------|---------|---------|---------|------| | **产品版本** | `products.json → versions` | 增、改、删 | 每季 | 产品迭代到V10、新增冬季版等 | -| **小蒙马夏令营** | `products.json → summerCamp` | 改 | 每年 | 年龄、活动、定位调整 | +| **小蒙马亲子游学营** | `products.json → summerCamp` | 改 | 每年 | 年龄、活动、定位调整 | | **选择指南** | `products.json → selectionGuide` | 改 | 每季 | 新产品上线后需要更新推荐逻辑 | | **定价说明** | `products.json → pricingPhilosophy` | 改 | 偶尔 | 价格策略调整时 | | **产品叙事** | `products.json → narrative` | 改 | 偶尔 | 品牌定位调整时 | diff --git a/README-HANDOFF.md b/README-HANDOFF.md index 664cc24..04cf6d4 100644 --- a/README-HANDOFF.md +++ b/README-HANDOFF.md @@ -37,7 +37,7 @@ npx serve .output/public | `/` | 首页 | `pages/index.vue` | | `/about` | 关于我们 | `pages/about.vue` | | `/products` | 产品线(额吉的故乡V9) | `pages/products.vue` | -| `/summer-camp` | 小蒙马夏令营 | `pages/summer-camp.vue` | +| `/summer-camp` | 小蒙马亲子游学营 | `pages/summer-camp.vue` | | `/guides` | 出行指南 | `pages/guides.vue` | | `/faq` | 常见问答 | `pages/faq.vue` | | `/reviews` | 客户评价 | `pages/reviews.vue` | @@ -136,8 +136,8 @@ npx serve .output/public } ], - "summerCamp": { // 小蒙马夏令营 - "name": "小蒙马夏令营", + "summerCamp": { // 小蒙马亲子游学营 + "name": "小蒙马亲子游学营", "positioning": "产品定位描述...", "days": 6, "nights": 5, @@ -382,7 +382,7 @@ npx serve .output/public { "text": "首页", "to": "/" }, { "text": "关于我们", "to": "/about" }, { "text": "产品线", "to": "/products" }, - { "text": "小蒙马夏令营", "to": "/summer-camp" }, + { "text": "小蒙马亲子游学营", "to": "/summer-camp" }, { "text": "出行指南", "to": "/guides" }, { "text": "常见问答", "to": "/faq" }, { "text": "客户评价", "to": "/reviews" }, @@ -492,7 +492,7 @@ public/images/ │ ├── mascot-front.png # 正面 │ ├── mascot-banner.png # 横幅 │ └── xiaomengma.png # 小蒙马 -├── summer-camp/ # 小蒙马夏令营照片(4张) +├── summer-camp/ # 小蒙马亲子游学营照片(4张) │ ├── river-banner.jpg │ ├── grassland-group.jpg │ ├── birch-group.jpg @@ -555,7 +555,7 @@ public/images/ → 1. 截图放 `public/images/reviews/` → 2. 在 `data/reviews.json` 的 `items` 末尾加新对象 -### 更新小蒙马夏令营行程 +### 更新小蒙马亲子游学营行程 → 改 `data/products.json` 的 `summerCamp` 部分 ### 添加新FAQ diff --git a/components/about/BrandStory.vue b/components/about/BrandStory.vue index c76968d..b138a20 100644 --- a/components/about/BrandStory.vue +++ b/components/about/BrandStory.vue @@ -6,7 +6,7 @@
呼籁旅行创始人在呼伦贝尔草原 diff --git a/components/home/HeroBanner.vue b/components/home/HeroBanner.vue index 1c0f566..3d467b3 100644 --- a/components/home/HeroBanner.vue +++ b/components/home/HeroBanner.vue @@ -12,8 +12,8 @@
-

{{ seo.h1 }}

-

{{ brand.slogan.emotional }}

+

{{ seo.h1 }}

+

{{ brand.slogan.emotional }}

{{ brand.slogan.functional }}

@@ -106,22 +106,35 @@ useHead({ }); } -.hero-title { - color: #FFFFFF; - margin-bottom: @space-lg; - text-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); - letter-spacing: 1px; +.hero-label { + font-size: @font-size-sm; + color: rgba(255, 255, 255, 0.7); + letter-spacing: 3px; + text-transform: uppercase; + margin-bottom: @space-md; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + + .respond-md({ + font-size: @font-size-base; + letter-spacing: 4px; + }); } .hero-emotional { - font-size: @font-size-xl; - color: rgba(255, 255, 255, 0.95); - font-weight: @font-weight-medium; + font-size: @font-size-2xl; + color: #FFFFFF; + font-weight: @font-weight-bold; margin-bottom: @space-sm; - text-shadow: 0 1px 6px rgba(0, 0, 0, 0.2); + text-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); + letter-spacing: 2px; .respond-md({ - font-size: @font-size-2xl; + font-size: @font-size-3xl; + letter-spacing: 3px; + }); + + .respond-lg({ + font-size: @font-size-display; }); } diff --git a/components/home/ProductPreview.vue b/components/home/ProductPreview.vue index 2a1fc95..a4e3b30 100644 --- a/components/home/ProductPreview.vue +++ b/components/home/ProductPreview.vue @@ -45,7 +45,7 @@ const productLines = [ duration: '4-7天 · V9系列', to: '/products', image: '/images/seasons/summer-hero.jpg', - description: '呼伦贝尔草原家庭定制游,一家一单一车,6个版本适配不同假期', + description: '呼伦贝尔草原家庭定制游,专车专属独立成团,6个版本适配不同假期', highlights: ['莫日格勒河草原穿越', '专业骑马体验', '呼籁自有营地住宿'], }, { @@ -72,10 +72,10 @@ const productLines = [ }, { id: 'summer-camp', - name: '小蒙马夏令营', + name: '小蒙马亲子游学营', season: '夏季', theme: 'camp', - duration: '7天6晚', + duration: '6天5晚', to: '/summer-camp', image: '/images/seasons/summer-river.jpg', description: '亲子营模式,每期8组家庭结伴同行,孩子有伙伴大人能放松', diff --git a/components/products/ProductCard.vue b/components/products/ProductCard.vue index bfea6d5..f23e303 100644 --- a/components/products/ProductCard.vue +++ b/components/products/ProductCard.vue @@ -32,6 +32,15 @@ {{ h }} + + +
+ + + + {{ product.pricing.startPrice }}元起 + /人 · 价格因日期和住宿等级浮动 +
@@ -202,6 +211,25 @@ const shortName = computed(() => { margin-top: 2px; } +// 价格区间 +.product-price { + margin-top: @space-md; + padding-top: @space-md; + border-top: 1px dashed @color-border; + + &__from { + font-size: @font-size-lg; + font-weight: @font-weight-bold; + color: @color-accent; + } + + &__note { + font-size: @font-size-xs; + color: @color-text-muted; + margin-left: @space-xs; + } +} + // 底部 CTA .product-cta { display: block; diff --git a/components/products/SelectionGuide.vue b/components/products/SelectionGuide.vue index 3bad540..c7617d3 100644 --- a/components/products/SelectionGuide.vue +++ b/components/products/SelectionGuide.vue @@ -34,7 +34,7 @@ const guideGroups = computed(() => [ ]) function getProductName(id) { - if (id === 'summer-camp') return '小蒙马夏令营' + if (id === 'summer-camp') return '小蒙马亲子游学营' const v = props.versions.find(v => v.id === id) return v ? v.name : id } diff --git a/components/products/SummerCampCard.vue b/components/products/SummerCampCard.vue index 2509396..70ed17b 100644 --- a/components/products/SummerCampCard.vue +++ b/components/products/SummerCampCard.vue @@ -8,7 +8,7 @@
小蒙马 - 小蒙马夏令营团宠,一只可爱的蒙古小马形象 ({ '@type': 'ListItem', position: i + 1, - name: day, + name: typeof day === 'string' ? day : `Day${day.day || i + 1} ${day.title}`, })), }, offers: { '@type': 'Offer', priceCurrency: 'CNY', availability: 'https://schema.org/LimitedAvailability', - description: '每期仅限8组家庭,亲子夏令营路线,含全程住宿、用车、活动体验、领队服务', + description: '每期7-9组家庭,亲子游学营路线,含全程住宿、餐食、用车、活动体验、双领队+摄影师', seller: { '@id': 'https://1814.love/#organization' }, }, provider: { '@id': 'https://1814.love/#organization' }, @@ -352,8 +352,8 @@ export function useSummerCampSchema(camp) { injectJsonLd({ '@context': 'https://schema.org', '@type': 'Event', - name: '小蒙马夏令营 2026', - description: '呼伦贝尔草原亲子夏令营,6天5晚,每期8组家庭,爸爸妈妈带着孩子一起出发。融入草原写生、非遗研学、民俗体验三大主题。', + name: '小蒙马亲子游学营 2026', + description: '呼伦贝尔草原亲子游学营2.0,6天5晚,每期7-9组家庭,5-12岁亲子同行。草原音乐会、写生创作、白桦林非遗研学、亲子马术、做列巴、1200米滑草畅玩。双领队+全程摄影师+餐食全含。', url: 'https://1814.love/summer-camp', eventStatus: 'https://schema.org/EventScheduled', eventAttendanceMode: 'https://schema.org/OfflineEventAttendanceMode', @@ -365,8 +365,8 @@ export function useSummerCampSchema(camp) { address: { '@type': 'PostalAddress', addressLocality: '呼伦贝尔市', addressRegion: '内蒙古自治区' }, }, organizer: { '@id': 'https://1814.love/#organization' }, - maximumAttendeeCapacity: 8, - typicalAgeRange: '3-12', + maximumAttendeeCapacity: 9, + typicalAgeRange: '5-12', isAccessibleForFree: false, offers: { '@type': 'Offer', diff --git a/composables/useSEO.js b/composables/useSEO.js index 2df505f..28978e8 100644 --- a/composables/useSEO.js +++ b/composables/useSEO.js @@ -19,7 +19,7 @@ export default function useSEO(pageKey, overrides = {}) { faq: '呼伦贝尔旅游攻略,呼伦贝尔亲子游攻略,呼伦贝尔多少钱,呼伦贝尔几月去好,呼伦贝尔穿什么', reviews: '呼伦贝尔旅游评价,呼籁旅行怎么样,呼伦贝尔亲子游评价,呼伦贝尔定制游口碑', guides: '呼伦贝尔穿搭指南,呼伦贝尔行李清单,呼伦贝尔几月份去最好,呼伦贝尔骑马安全,草原旅游注意事项', - 'summer-camp': '呼伦贝尔夏令营,草原亲子夏令营,小蒙马夏令营,呼伦贝尔亲子营,研学旅行', + 'summer-camp': '呼伦贝尔亲子游学营,草原亲子营,小蒙马亲子游学营,呼伦贝尔亲子营,研学旅行,呼伦贝尔夏令营', qualifications: '呼籁旅行资质,旅行社经营许可证,旅游责任险,呼伦贝尔旅行社认证,呼籁荣誉', news: '呼籁旅行动态,呼伦贝尔旅游资讯,呼籁旅行公告', contact: '呼籁旅行联系方式,呼伦贝尔定制游咨询,呼籁旅行微信,呼伦贝尔旅游电话', diff --git a/data/about.json b/data/about.json index c3b6564..154b8ff 100644 --- a/data/about.json +++ b/data/about.json @@ -61,7 +61,7 @@ "guarantees": [ { "title": "三重旅行社许可证,出了事有人担责", - "detail": "旗下三家主体均持有旅游经营许可证:内蒙古呼籁国际旅行社、内蒙古呼籁山河国际旅行社(成立于2005年)、内蒙古呼籁文旅集团,证号全部公开可查" + "detail": "旗下三家主体均持有旅游经营许可证:内蒙古呼籁国际旅行社、内蒙古呼籁山河国际旅行社、内蒙古呼籁文旅集团,证号全部公开可查" }, { "title": "1000万旅游责任险,遭遇意外不是自己扛", @@ -186,7 +186,7 @@ "year": "2025", "paragraphs": [ "持续深化家庭研学产品,升级伴手礼体系,优化旅行中的文化体验模块。", - "推出《小蒙马亲子夏令营》,深化亲子陪伴式旅行方向。", + "推出《小蒙马亲子游学营》,深化亲子陪伴式旅行方向。", "我们始终相信:真正值得的旅行,从不只是一趟路,更是一段生命的温度。" ] } @@ -223,7 +223,7 @@ }, { "name": "内蒙古呼籁山河国际旅行社有限公司", - "role": "成立于2005年,持有旅游经营许可证,是集团最早的旅行社资质主体", + "role": "持有旅游经营许可证,工商注册于2005年,2015年由创始团队接手经营,是集团最早的旅行社资质主体", "established": "2005-04" }, { diff --git a/data/blog.json b/data/blog.json index c918121..ed79b5b 100644 --- a/data/blog.json +++ b/data/blog.json @@ -1,5 +1,114 @@ { "articles": [ + { + "id": "hulunbuir-quality-travel-guide", + "title": "呼伦贝尔亲子游品质出行指南:一个本地从业者的11年实战经验", + "subtitle": "从选时间到出发准备,11年接待经验一次讲清楚", + "author": "呼籁旅行", + "date": "2026-04-13", + "category": "攻略", + "summary": "深耕呼伦贝尔11年、累计服务10000+家庭的本地从业者,把最常见的坑和品质判断标准一次性讲清楚:选时间、买机票、看配置、比价格、选住宿、判断行程、选服务商、分龄玩法、出发准备清单。", + "coverImage": "/images/seasons/summer-hero.jpg", + "tags": [ + "品质出行", + "亲子攻略", + "避坑指南", + "出行准备", + "呼伦贝尔攻略" + ], + "seo": { + "title": "呼伦贝尔亲子游品质出行指南:本地从业者11年经验 - 呼籁旅行", + "description": "呼伦贝尔亲子游品质出行指南:选时间、买机票、看配置、比价格、选住宿、判断行程设计、选服务商、分龄玩法、出发准备清单,本地从业者11年经验一次讲清楚。", + "keywords": "呼伦贝尔品质出行,呼伦贝尔亲子游攻略,呼伦贝尔选旅行社,呼伦贝尔住宿推荐,呼伦贝尔出行准备" + }, + "relatedProducts": [ + "v9-5d4n", + "v9-6d5n-family", + "v9-7d6n-family" + ], + "content": "

一、选时间:不同月份怎么选

\n

呼伦贝尔的旅游季从6月一直延续到9月,每个阶段的草原状态、游客密度和价格都不一样。选时间的核心不是\"哪个月最好\",而是根据你家的假期安排,找到体验和性价比的最优解。

\n

7月-8月上旬是经典旺季——草原最绿、天气最稳定、所有体验项目全部开放。但旺季也意味着游客多、住宿紧张、价格最高,热门蒙古包营地要提前两个月抢。

\n

6月中下旬性价比很高——草已经绿了,野花刚开,游客只有旺季的三分之一。人少、景美、服务资源充裕。

\n

8月中下旬也不错——草原从纯绿开始带一点金色,白桦林有了初秋的颜色,人流量明显回落。

\n

呼伦贝尔夏季日温差可达10-15度,草原上体感很舒服但紫外线强,穿衣和防晒两件事都别大意。

\n\n

二、机票怎么买:很多人第一步就走了弯路

\n

先确定进出城市。呼伦贝尔有两个机场:海拉尔东山机场和满洲里西郊机场。大部分行程是海拉尔往返,但如果走环线,\"海拉尔进/满洲里出\"可以减少回头路。

\n

直飞还是经停?能直飞当然最好。呼伦贝尔直飞航线有限,优先选经停航班——中途停一下但不换飞机,行李直达,带孩子不用中间折腾。

\n

什么时候买?建议提前1-1.5个月预订,价格相对稳定、选择也多。

\n

跨城市比价:不要只看你所在城市出发的航班。江浙沪地区可以对比上海、杭州、南通、南京几个机场;哈尔滨、沈阳中转也是常见选择。

\n

中转注意事项:

\n
    \n
  • 确认是同一个机场中转(北京首都/大兴、上海虹桥/浦东)
  • \n
  • 两段航班之间至少留2小时以上
  • \n
  • 确认两段航班是否都有免费行李额
  • \n
  • 优选联程票或中转联程服务,行李可以直挂
  • \n
\n\n

三、\"纯玩团\"三个字,真的不够用

\n

\"纯玩\"在2026年已经变成了最低门槛,不是品质指标。真正决定你这趟旅行体验的,是以下几个细节:

\n

车况。呼伦贝尔日均行驶150-200公里,一趟行程车上时间很长。问清楚车型、车龄、有没有独立空调。

\n

住宿配置。同样叫\"蒙古包住宿\",差别天差地远。带孩子的话,热水和独立卫生间是底线,不是加分项。

\n

领队素质。一个好的领队不只是带路,他要能讲清楚草原的故事、每个景点的门道,还要能根据天气和人流灵活调整行程。

\n

餐标。\"含餐\"和\"含什么餐\"是两回事。问清楚每餐吃什么、在哪吃。

\n

对照方法:找两个价位不同的产品,把每天的酒店名称、车型、餐厅名称列出来对比——配置差异一目了然。

\n\n

四、价格:便宜的真便宜,贵的也不一定好

\n

呼伦贝尔亲子游同样5天4晚的行程,从两三千到七八千都有。差在哪?就差在车、住宿、餐、领队、体验项目的配置。

\n

判断方法:当你看到两个产品价格差异超过三成,把每天的住宿名称、车型、含不含特色体验列出来逐项对比——差价基本都能找到出处。

\n

底线原则:价格明显低于市场均价的产品,大概率是在某些环节做了缩减。没有哪个服务商会做亏本生意。

\n\n

五、住宿:蒙古包和星空房没你想的那么简单

\n

选蒙古包的时候重点看三项:

\n
    \n
  1. 有没有独立卫生间(带孩子必须有)
  2. \n
  3. 有没有空调或取暖设备(呼伦贝尔夜间温差大)
  4. \n
  5. 周边环境——是在景区里面还是在公路边上
  6. \n
\n

各区域住宿特点:海拉尔城市酒店选择多;额尔古纳住宿品质最好,有全景落地窗对着湿地的独栋小别墅;恩和特色是木刻楞俄式木屋;黑山头是体验蒙古包的核心区域,但品质参差不齐。

\n

带0-3岁宝宝特别注意:提前确认能不能加婴儿床、有没有电热水壶,蒙古包环节选有硬件保障的营地。

\n\n

六、行程设计:别被\"景点数量\"忽悠了

\n

很多产品把本来一个景区里的小活动拆开来写,凑出十几项。看行程不要数\"体验项目有几项\",要看\"去了几个真正不同的地方\"。

\n

带孩子的行程设计有一个铁律:留白。孩子需要在草地上跑、在河边发呆、和牧场里的小羊待半个小时。这些\"无意义\"的时间,其实是孩子最快乐的部分。

\n

判断行程好不好,看三样:

\n
    \n
  • 日均车程:合理的亲子行程日均控制在150-200公里以内
  • \n
  • 有没有\"深度体验\"环节:同样的项目名称背后的体验含量可能天差地别
  • \n
  • 行程的灵活度:遇到天气变化,领队能不能临时调整
  • \n
\n\n

七、选服务商:本地和外地,差在哪

\n

呼伦贝尔旅游市场上有三类服务商:

\n

外地组团社:客源地收客,再转包给本地地接社执行,售前承诺和售后体验中间隔了一层。

\n

本地旅行社:本地注册、本地运营,执行力强,出了问题能快速响应。但水平也参差不齐。

\n

个人包车师傅:灵活便宜但没有正规资质和保险保障,带孩子建议慎重。

\n

判断服务商靠不靠谱的四个维度:

\n
    \n
  1. 资质和保障是否实打实(旅行社许可证、旅游意外险保单)
  2. \n
  3. 出发前的服务透明度(每天住哪、什么车、谁带队是否全部确认)
  4. \n
  5. 有没有建专属服务群(领队、司机、客服都在群里)
  6. \n
  7. 售后机制(退改政策、应急预案是否提前沟通)
  8. \n
\n\n

八、带娃特别篇:不同年龄段怎么玩

\n

0-3岁:能去,但需要特殊准备——行程不能太赶,每天活动时间控制在4-5小时,住宿优先选城市酒店,自带推车/腰凳、防晒帽。

\n

4-7岁:黄金年龄段——牧场体验、非遗手工、轻度骑马、滑草,参与度最高。多安排\"做\"的项目,少安排\"看\"的项目。

\n

8-12岁:可以解锁进阶体验——独立骑马、皮划艇漂流、草原徒步、观星课程、湿地鸟类观察。

\n\n

九、出发准备清单

\n

证件:身份证(成人)、户口本(16周岁以下)、学生证(如有)、医保卡。

\n

穿搭原则——洋葱式穿搭:层层叠加,随时增减。7月短袖短裤+防晒装备+早晚薄外套;6月/8月加长袖外套。鞋子以运动鞋为主。

\n

防晒:SPF50+防晒霜每2小时补涂、宽檐帽、UV400墨镜、冰袖+防晒衣、保湿面霜+润唇膏。

\n

健康:防蚊液、肠胃药+益生菌、晕车药、保温杯、过敏药。

\n\n

十、活动安全提醒

\n

骑马:不要站到马的正后方,穿长裤和运动鞋,听从马师指引。

\n

滑草:不要戴没有系绳的帽子,穿运动鞋和长裤。

\n

蜱虫:穿长袖长裤、扎紧裤脚袖口,每天活动结束后仔细检查皮肤。万一发现蜱虫叮咬,用尖头镊子贴近皮肤夹住蜱虫头部稳定拔出,不要用手硬拽。

\n\n

总结:品质出行的标准画像

\n
    \n
  • 时间选对了(选适合自己家情况的时段)
  • \n
  • 机票买明白了(不被高价坑,也不因贪便宜折腾孩子)
  • \n
  • 配置透明了(出发前就知道住哪、坐什么车、谁带队)
  • \n
  • 行程有深度(有参与、有体验,不是拍照打卡走马观花)
  • \n
  • 节奏适合孩子(有留白、有弹性、不赶路)
  • \n
  • 服务商靠谱(正规资质、真实口碑、售后有保障)
  • \n
  • 东西带齐了(证件、防晒、防蚊、保暖、肠胃药一个不落)
  • \n
" + }, + { + "id": "hulunbuir-family-age-guide", + "title": "呼伦贝尔亲子游年龄分层指南:2-4岁、5-7岁、8-12岁怎么玩", + "subtitle": "不同年龄段玩法完全不同,选错行程花了钱但体验打折", + "author": "呼籁旅行", + "date": "2026-04-15", + "category": "亲子", + "summary": "2-4岁重感官体验、5-7岁重互动参与、8-12岁重深度探索。呼伦贝尔亲子游从业11年,按年龄段拆解最适合的活动、行程天数、住宿选择和注意事项。", + "coverImage": "/images/summer-camp/grassland-group.jpg", + "tags": [ + "亲子游", + "年龄分层", + "分龄玩法", + "带娃攻略", + "呼伦贝尔亲子" + ], + "seo": { + "title": "呼伦贝尔亲子游年龄分层指南:2-12岁分龄玩法 - 呼籁旅行", + "description": "呼伦贝尔亲子游年龄分层指南:2-4岁感官体验、5-7岁互动参与、8-12岁深度探索,从业11年经验总结各年龄段最适合的活动、天数和注意事项。", + "keywords": "呼伦贝尔亲子游年龄,几岁孩子去草原,呼伦贝尔带娃年龄,呼伦贝尔分龄玩法,草原亲子活动推荐" + }, + "relatedProducts": [ + "v9-6d5n-family", + "v9-7d6n-family" + ], + "content": "

3岁以上就适合去呼伦贝尔。但不同年龄段玩法完全不同——2-4岁重感官体验、5-7岁重互动参与、8-12岁重深度探索。

\n

在呼伦贝尔做旅游11年,\"孩子多大能去呼伦贝尔\"这个问题被问过的次数可能比\"多少钱\"还多。答案很简单:能去。但怎么去、怎么玩,差别非常大。

\n\n

2-4岁:感官打开就够了

\n

这个年龄段的孩子,别指望他记住什么景点名字。他能记住的,是草地的触感、羊羔的叫声、夜里抬头看到满天星星时的那个表情。

\n\n\n\n\n\n\n\n\n
活动为什么适合注意事项
在草地上自由跑、打滚城市孩子太缺这种\"无目的\"的释放提前备好防蚊喷雾
近距离看牛羊、喂小羊羔触摸真实动物比看绘本震撼一百倍2-3岁孩子看羊就好,别硬靠近牛群
看星空、看日落草原的天是真的大,光污染几乎为零晚上温差大,外套必带
坐车看风景(短途)车窗外就是连续几百公里的草原每天车程控制在2小时以内
\n

行程建议:不超过4天。2-4岁的孩子生物钟很固定,午睡不能省,长时间坐车受不了。4天够了:海拉尔进出,走个东线小环线,节奏放慢,不赶路。

\n

骑马建议:2岁不建议独立骑。可以让大人抱着坐一下马背拍个照。3-4岁可以由马倌牵着走一小段,全程大人在旁边扶着。

\n\n

5-7岁:互动参与的黄金期

\n

5岁以上的孩子有了基本的理解力和动手能力。他不只是\"看\"了,他会\"做\"——做奶制品、喂牛犊、学几句蒙古语、画一幅草原写生。

\n\n\n\n\n\n\n\n\n
活动为什么适合注意事项
牧场互动(喂牛羊、挤牛奶、做奶制品)完整的\"从牛到奶到食物\"链条确认牧场有洗手设施
骑马体验(牵引)5岁以上体重够了,马倌牵着走必须戴头盔,穿长裤
草原徒步(1-2小时短途)草甸、湿地、小河,边走边观察动植物带够水,穿防滑鞋
蒙古包体验住一晚蒙古包,吃手把肉,看篝火带孩子建议选有独立卫浴的改良蒙古包
\n

行程建议:5-6天比较合适。可以走经典东线环线:海拉尔→额尔古纳→恩和→室韦→黑山头→满洲里→海拉尔。每天车程3小时以内。

\n

这个年龄段有一个特点——他会不停问问题。所以如果领队能回答\"这个草叫什么\"\"那个鸟为什么飞那么低\"这些问题,孩子的体验会完全不一样。

\n\n

8-12岁:深度探索,这趟能当\"课外课\"

\n

8岁以上的孩子已经有了相当的理解力和体力,可以玩得很深入——观察、记录、思考。

\n\n\n\n\n\n\n\n\n\n
活动为什么适合注意事项
半天草原徒步+自然观察笔记认识草原生态,边走边画有专业自然导师带最好
独立骑马(有马倌随行)8岁以上可以自己坐稳穿长裤+硬底鞋+头盔,首次不要跑
蒙古文化深度体验学射箭、搭蒙古包、了解游牧迁徙逻辑找真正懂蒙古文化的讲解
边境口岸参观满洲里国门,了解中俄边境历史地理国门景区需要身份证
湿地/森林徒步额尔古纳湿地、莫尔道嘎国家森林公园森林蚊虫比草原更多,长袖长裤必须
\n

行程建议:6-7天。可以走完整的大环线,甚至加上阿尔山方向。特别适合\"任务制\"玩法:给孩子一个自然观察任务,或者让他当一天的\"摄影师\"。

\n\n

三个年龄段的选择对照表

\n\n\n\n\n\n\n\n\n\n\n
维度2-4岁5-7岁8-12岁
核心体验感官启蒙互动参与深度探索
建议天数3-4天5-6天6-7天
每天最大车程2小时3小时4小时
骑马抱着坐一下马倌牵引慢走可独立骑行
住宿建议酒店为主酒店+1晚改良蒙古包酒店+蒙古包+可尝试营地
家长精力高(全程看护)中(适当放手)低(基本独立)
\n\n

家里两个孩子、年龄差大怎么办?

\n

按小的来定节奏,按大的来加内容。总天数和每天车程按小孩子的承受力定,但在每个停留点给大孩子安排额外的活动。

\n

核心原则是\"分开玩一部分,一起玩一部分\"。所有年龄段都能一起参与的活动:看星空、篝火、草地野餐、喂小羊羔。需要分开的活动:骑马(大的骑、小的看)、徒步(大的走远、小的原地玩)。

\n\n

通用提醒

\n
    \n
  • 关于吃:饮食以牛羊肉为主,孩子挑食的话带些习惯的零食和益生菌
  • \n
  • 关于穿:草原温差大,7月白天可能30度、晚上降到12-15度,带一件薄羽绒或冲锋衣
  • \n
  • 关于防晒:草原纬度高紫外线非常强,大人小孩都要涂防晒霜,帽子墨镜必备
  • \n
  • 关于安全:草原有旱獭洞、铁丝围栏等隐藏风险,让孩子跑的时候家长视线别离开;旱獭可能携带病菌,不要靠近、不要投喂
  • \n
" + }, + { + "id": "hulunbuir-horse-riding-guide", + "title": "呼伦贝尔亲子骑马攻略:安全吗?几岁能骑?景区马场和草原穿越差在哪", + "subtitle": "骑马是体验感最强的项目,也是安全门槛最高的", + "author": "呼籁旅行", + "date": "2026-04-15", + "category": "攻略", + "summary": "呼伦贝尔的骑马体验安全不安全,取决于你选的类型和安全保障程度。本文详解景区马场与草原穿越的区别、五项安全核心指标、年龄适配参考和预订前必问清单。", + "coverImage": "/images/seasons/summer-river.jpg", + "tags": [ + "骑马攻略", + "亲子安全", + "草原体验", + "骑马安全", + "呼伦贝尔骑马" + ], + "seo": { + "title": "呼伦贝尔亲子骑马攻略:安全指南+年龄参考+预订清单 - 呼籁旅行", + "description": "呼伦贝尔亲子骑马安全吗?几岁能骑?景区马场和草原穿越差在哪?本文详解五项安全核心指标、年龄适配参考、预订前必问清单,从业11年经验总结。", + "keywords": "呼伦贝尔骑马,呼伦贝尔骑马安全,亲子骑马,草原穿越骑马,呼伦贝尔骑马攻略,几岁能骑马" + }, + "relatedProducts": [ + "v9-6d5n-family", + "v9-7d6n-family" + ], + "content": "

呼伦贝尔的骑马体验安全不安全,取决于你选的类型和安全保障程度。这不是一个\"安全\"或\"不安全\"的二选一题目,而是你需要知道该看哪些指标。

\n\n

一、两种骑马体验的本质区别

\n

呼伦贝尔的亲子骑马分两种,差别之大,说它们是\"两个不同的产品\"不夸张。

\n

景区马场骑乘:在围栏内或固定路线上骑行,时长15-30分钟。有工作人员牵马,马走惯了那条路,不需要骑手做任何操作。价格50-150元一次。核心价值是拍照和\"体验了一下\"。

\n

草原穿越式骑行:在真实草原上骑,路线经过草甸、湿地、白桦林、小河甚至坡地,单次约1小时。马会跑起来,骑手需要做基本控制。需要经过训练的马匹和专业马师全程陪同。核心价值是真实的骑马体验——孩子下马以后会说\"好厉害我居然骑了一匹马走了那么远\"。

\n\n

二、安全保障怎么判断:五项核心指标

\n

如果选择草原穿越式骑行,以下五项指标决定了安全性:

\n\n

1. 马匹是否经过脱敏训练

\n

这是底线中的底线。用于亲子骑行的马必须经过专门训练——对突然的尖叫声、挥手、掉东西等刺激不产生应激反应。判断方法:预订时直接问\"用于亲子骑行的马是经过训练的吗\"。含糊其辞说\"马都很温顺的\"——这不够,温顺不等于训练过。

\n\n

2. 是否有专业马师全程跟骑

\n

重点是\"全程跟骑\"。有些地方在出发点送你上马,在终点等你——这不叫安全保障。真正的安全保障是马师骑着另一匹马全程在你旁边,能在马匹状态变化时第一时间干预。

\n\n

3. 儿童应急方案

\n

害怕或哭闹的孩子不建议上马。马对声音非常敏感,孩子哭闹可能导致马受惊。好的骑马服务,出发前马师会观察孩子的情绪状态:

\n
    \n
  • 害怕、哭闹的孩子:不建议上马
  • \n
  • 3-4岁幼儿(情绪稳定):可由马师抱在马背上骑行
  • \n
  • 5岁以上(情绪稳定):可由马师牵马,孩子坐稳骑行
  • \n
\n

草原穿越骑行走出去以后可能已经深入草原很远,中途想下马并不现实。安全判断必须在出发前完成。

\n\n

4. 保险覆盖范围

\n

很多旅游意外险把骑马归为\"高风险运动\"——免赔。预订时要让旅行社出示保单,看保单原文中是否明确包含\"骑马\"或\"马术体验\"。口头承诺不算数。

\n\n

5. 骑行路线是否经过安全评估

\n

草原穿越的路线不是随便找一片草地就能骑的。哪段有鼠洞、哪段地面松软、哪个坡度适合儿童、过河的水有多深——这些都需要事先踩线评估。成熟的骑马基地有固定安全路线,每年根据草场和地形变化调整。

\n\n

三、年龄适配参考

\n\n\n\n\n\n\n\n\n\n
年龄段建议
0-2岁不建议参加,无法配合基本指令
3-4岁可由马师抱着骑,感受马背节奏
5-6岁大部分可自己坐稳,马师在旁牵行
7岁以上可尝试在马师跟骑保护下独立骑行
身高1.4米以上基本可独立骑行,由马师现场评估
\n

年龄只是一个维度,最终判断应由马师根据孩子的身高、胆量和身体协调能力现场决定。

\n\n

四、预订前必问清单

\n
    \n
  • 骑行时长和路线类型(15分钟马场还是1小时穿越)
  • \n
  • 马匹是否经过专业训练
  • \n
  • 出发前如何评估孩子能不能骑?害怕的孩子怎么安排?
  • \n
  • 马师牵马或抱骑是否额外收费
  • \n
  • 旅游意外险是否覆盖骑马项目(要看保单原文)
  • \n
  • 骑马装备(手套、头盔)谁提供
  • \n
  • 骑行路线是固定评估过的还是临时安排的
  • \n
  • 费用是否一口价(有些商家先低价骑几分钟\"体验\",再现场推穿越加钱)
  • \n
\n\n

五、推荐区域

\n

呼伦贝尔做草原穿越骑行比较成熟的区域:恩和、黑山头、额尔古纳。这些地方地势相对平缓、草场开阔,有运营多年的骑马基地。

\n

具体选哪家不是关键——关键是上面那张清单逐项确认。

\n\n

骑马是呼伦贝尔亲子游里体验感最强的项目,也是安全门槛最高的。做好功课不是为了不骑,是为了骑得安心。

" + }, + { + "id": "hulunbuir-local-vs-national-travel", + "title": "呼伦贝尔旅游的两条路:在地深耕和全国跑场", + "subtitle": "两种经营模式各自的逻辑是什么?对消费者意味着什么?", + "author": "呼籁旅行", + "date": "2026-04-14", + "category": "行业", + "summary": "呼伦贝尔旅游市场正在分化成两种模式:本地团队深耕单一目的地,与全国布局旺季跑场。本文分析两种模式的核心差异,以及消费者该怎么选。", + "coverImage": "/images/seasons/summer-car.jpg", + "tags": [ + "行业分析", + "选旅行社", + "本地旅行社", + "定制游", + "呼伦贝尔旅游" + ], + "seo": { + "title": "呼伦贝尔旅游怎么选:本地深耕vs全国跑场模式分析 - 呼籁旅行", + "description": "呼伦贝尔旅游市场两种经营模式分析:本地团队在地深耕vs全国品牌旺季跑场,核心差异在哪?家庭亲子游该怎么选?5个判断指标帮你做决定。", + "keywords": "呼伦贝尔旅行社怎么选,呼伦贝尔本地旅行社,呼伦贝尔定制游,呼伦贝尔旅游市场,选旅行社攻略" + }, + "relatedProducts": [ + "v9-5d4n", + "v9-6d5n-family" + ], + "content": "

呼伦贝尔旅游市场上有两种旅行社:一种是扎根本地的,另一种是全国各地都做、旺季来呼伦贝尔接单的。这两种模式差在哪里?对你的出行体验有什么影响?

\n\n

一、团队是常年在这儿,还是旺季才来?

\n

呼伦贝尔旅游旺季就三个月——6月到8月。很多外地旅行社旺季来开分站,招一批临时领队、临时司机,培训一两周就上岗;旺季一过团队就散了。

\n

本地旅行社不一样。团队全年在呼伦贝尔,定制师、客服、房务管家、车务管家十二个月都有人。领队和司机很多合作了好几年。

\n

这意味着什么?领队认识路上每一段哪里容易堵、哪个时间段人最少。司机知道哪段路雨天容易打滑。客服能准确回答\"7月中旬恩和的天气大概是什么样\"——因为她经历过好几个7月。

\n\n

二、资源是提前锁定的,还是旺季现抢的?

\n

呼伦贝尔旺季的酒店、车辆、营地资源紧张程度超出很多人想象。好酒店的房间每年三四月份就开始被锁了。本地旅行社因为全年经营,和酒店、牧场、景区是长期合作关系,旺季到来之前资源已经到位。你出发前就知道住哪个酒店、什么房型,不会被临时调换。

\n

全国旅行社旺季进来,酒店靠临时谈、车辆靠临时租、供应商靠临时凑。你能住到什么酒店,很大程度上取决于那一周还剩什么。

\n\n

三、路线是一趟趟走出来的,还是攻略上抄来的?

\n

呼伦贝尔有一个经典案例:莫日格勒河。大部分旅行团上午去,结果那条路车排长龙、景区人挤人。本地做了多年的旅行社怎么处理?上午安排客人在其他地方做体验,下午错峰去。时间差两三个小时,景还是那个景,人少了一大半。

\n

类似的经验还有很多:哪个骑马场景观丰富、马温顺、适合孩子;哪段路旺季容易堵换哪条备选路线;哪个酒店隔音差不适合带娃家庭。这些不是看攻略能想到的,是在路上一个旺季一个旺季走出来的。

\n\n

四、\"规模大\"和\"在这个地方做得好\"是两回事

\n

有人觉得本地旅行社规模小、不靠谱。全国品牌确实有标准化和品牌信任度的优势,这没什么好回避的。

\n

但一个同时做五六个目的地的旅行社,分给呼伦贝尔的精力就那么多。一个只做呼伦贝尔的旅行社,全年的时间和资源都扎在这一个地方。对于大部分家庭来说,你不是在选一家全国最大的旅行社,你是在选\"谁在呼伦贝尔做得最扎实\"。

\n\n

五、怎么判断一家旅行社是不是真的本地?

\n
    \n
  1. 查旅行社许可证:在全国旅游监管服务平台查注册地,外地注册呼伦贝尔接单的本质是跨区域操作
  2. \n
  3. 问淡季在干嘛:真正的本地旅行社冬天也在。如果冬天联系不上人,大概率是旺季才来的
  4. \n
  5. 看产品迭代:线路跑了好几年、改了好几版,说明有真实客户反馈在推动改进
  6. \n
  7. 看团队稳定性:领队是固定合作还是临时招的?客服能回答当地天气路况的具体问题吗?
  8. \n
\n

选哪家不重要,重要的是选\"真的在这里\"的。

" + }, { "id": "hulunbuir-travel-guide-2026", "title": "2026年呼伦贝尔旅游攻略:第一次去必看", @@ -9,13 +118,21 @@ "category": "攻略", "summary": "第一次去呼伦贝尔?本文涵盖最佳季节、核心景点、行程天数、交通方式、预算参考,帮你少走弯路,把每一天都过得值。", "coverImage": "/images/seasons/summer-river.jpg", - "tags": ["呼伦贝尔攻略", "首次出行", "行程规划", "呼伦贝尔旅游"], + "tags": [ + "呼伦贝尔攻略", + "首次出行", + "行程规划", + "呼伦贝尔旅游" + ], "seo": { "title": "2026年呼伦贝尔旅游攻略:第一次去必看 - 呼籁旅行", "description": "第一次去呼伦贝尔必看攻略:最佳出行季节、核心景点推荐、行程天数建议、交通方式对比、预算参考,呼籁旅行深耕11年总结的实用干货。", "keywords": "呼伦贝尔旅游攻略,呼伦贝尔第一次去,呼伦贝尔怎么玩,呼伦贝尔旅游必看,2026呼伦贝尔" }, - "relatedProducts": ["v9-5d4n", "v9-6d5n-family"], + "relatedProducts": [ + "v9-5d4n", + "v9-6d5n-family" + ], "content": "

为什么要去呼伦贝尔?

呼伦贝尔是中国最大的地级市,草原面积达148万平方公里,占全国草原总面积的近三分之一。这里有莫日格勒河的九曲弯,有额尔古纳湿地的晨雾,有边境公路的无尽延伸,有根河的驯鹿文化。每年6月至8月,这里是真正意义上的「绿色乌托邦」。

最佳出行时间

呼伦贝尔一年四季各有特色,但对于第一次来的游客,6月下旬至8月下旬是最推荐的时间窗口。这个阶段草原最绿、天气最稳定、活动最丰富。

  • 6月下旬:草原刚进入旺季,游客相对少,价格较优惠,野花盛开
  • 7月全月:高峰期,景色最美,那达慕民俗活动丰富,但需提前预订
  • 8月:草场依然翠绿,进入收尾期,性价比高

如果你喜欢秋色,9月的白桦林和湿地同样值得一来;冬季则适合雪原探险和冰雪那达慕。

核心景点不能错过

呼伦贝尔幅员辽阔,景点分布分散。以下是第一次来必须打卡的核心区域:

  • 莫日格勒河:被誉为「天下第一曲水」,九曲十八弯,日出时拍照是摄影人的圣地
  • 额尔古纳湿地:国家级自然保护区,晨雾中的湿地有梦幻感
  • 中俄边境公路:沿黑山头到室韦的边境线驾车,一侧是额尔古纳河,对岸是俄罗斯
  • 呼伦湖:中国北方第一大淡水湖,落日景色壮美
  • 根河敖鲁古雅:驯鹿文化保护区,感受鄂温克族最原始的游牧生活

行程天数怎么定

呼伦贝尔不是一个「走马观花」的目的地,建议最少安排5天4晚。如果带孩子或希望深度体验,6-7天更从容。时间紧张的朋友可以选5天4晚精华线路。

交通方式

从北京/上海/成都等主要城市均有直飞海拉尔(呼伦贝尔市区机场)的航班。到达后,建议选择专业包车+本地领队的方式,原因是:

  • 景点间距离动辄100-200公里,自驾路况复杂
  • 本地领队熟悉隐藏景点和最佳拍摄时机
  • 草原上部分区域手机信号差,导航不可靠

第一次去的注意事项

草原的紫外线强度是城市的2-3倍,防晒是第一要务。早晚温差可达15-20℃,即使夏天也要带一件厚外套。草原上蚊虫活跃,防虫喷雾不可少。如果带孩子,骑马等活动要确认安全规范后再参与。

预订建议

7月旺季的行程和住宿至少提前2-3个月预订,热门日期可能更早售罄。选择有资质的本地旅行社,签订正规电子合同,避免行程缩水或临时换车换导游。呼籁旅行深耕呼伦贝尔11年,一家一单一车,是家庭出行的可靠选择。

" }, { @@ -27,13 +144,21 @@ "category": "亲子", "summary": "带孩子去呼伦贝尔草原,什么年龄合适?哪些活动安全?怎么选行程?呼籁旅行10年亲子游经验,帮你把每一个细节都想清楚。", "coverImage": "/images/summer-camp/grassland-group.jpg", - "tags": ["亲子游", "带娃旅行", "草原亲子", "家庭出游"], + "tags": [ + "亲子游", + "带娃旅行", + "草原亲子", + "家庭出游" + ], "seo": { "title": "呼伦贝尔亲子游完全指南:带娃怎么玩 - 呼籁旅行", "description": "呼伦贝尔亲子游完全指南:各年龄段活动推荐、亲子行程天数、安全注意事项、儿童餐饮住宿,呼籁旅行10年亲子游经验整理。", "keywords": "呼伦贝尔亲子游,带娃去草原,呼伦贝尔儿童旅游,草原亲子活动,呼伦贝尔家庭游" }, - "relatedProducts": ["v9-6d5n-family", "v9-7d6n-family"], + "relatedProducts": [ + "v9-6d5n-family", + "v9-7d6n-family" + ], "content": "

呼伦贝尔适合多大孩子?

这是父母们最常问的问题。答案是:基本上没有年龄下限,但不同年龄段的体验侧重点不同。我们服务过最小3个月的宝宝,也服务过带14岁少年来「二刷」的家庭。

  • 0-2岁:以草原感受为主,大自然的声音、空气和视野对宝宝的感官发育有积极意义。骑马等活动不参与,以看为主。
  • 3-5岁:可以体验套马杆、接触马匹、参与奶制品制作,是最容易被草原「征服」的年龄段。
  • 6-10岁:黄金亲子年龄,骑马、越野车、篝火晚会、学蒙古语,每个环节都充满好奇心和参与热情。
  • 11岁以上:体力充沛,可以挑战ATV、越野徒步,独立拍照,开始建立属于自己的旅行记忆。

亲子游必体验活动TOP 5

1. 草原骑马
这是孩子们最期待的活动。建议选择有专业牵马师陪同的体验,而非放任独骑。正规的亲子骑马会为孩子配备头盔和安全背心,牵马师全程陪伴。

2. 挤牛奶·做奶制品
去牧民家体验传统奶制品制作:手工奶酪、酸奶、黄油。孩子通过亲手操作,理解食物从哪里来,是自然教育的绝佳场景。

3. 篝火晚会
夏夜草原的篝火晚会是行程高潮。蒙古族歌手现场演唱,孩子们学跳安代舞,手持火把绕圈,在黑色天幕和满天星辰下留下一生难忘的记忆。

4. 捡牛粪·认植物
这是我们专为亲子家庭设计的自然教育环节。草原上有200余种野花,牧民带孩子认识常见草本植物,讲解草原生态。

5. 边境公路探秘
从室韦到黑山头的边境公路全程约200公里,孩子趴在车窗上看对岸的俄罗斯小屋,听领队讲两岸的历史故事,地理课在真实场景中发生。

亲子行程怎么选

建议带孩子至少安排6天5晚,这样行程节奏从容,孩子不会因赶路而疲惫。7天6晚亲子版则可以增加深度体验环节,例如驯鹿基地参观和湿地探秘。

避免选择强调「效率」的快行程,草原旅行的意义在于让孩子有足够时间在一片草地上发呆、跑动、和牧民家的狗玩耍——这些「无意义」的时间,往往是他们记忆最深的片段。

住宿与饮食

呼籁旅行的自有营地提供亲子友好的蒙古包住宿,内置独立卫浴,不必担心如厕问题。营地备有儿童餐,对食材过敏的家庭请提前告知定制师。草原的饮食以牛羊肉为主,挑食的孩子可以准备一些备用零食。

安全保障

选择有资质的旅行社是保障安全的第一步。呼籁旅行为每位游客购买旅行意外险,专业领队均接受过急救培训,骑马等高风险活动全程配备专业人员。草原紫外线强,儿童防晒霜建议每2小时补涂一次。

" }, { @@ -45,13 +170,22 @@ "category": "攻略", "summary": "春夏秋冬各有千秋,但不同月份的差异远比你想象得大。本文用数据说话,帮你选出最适合自己的出行时间。", "coverImage": "/images/seasons/autumn-lake.jpg", - "tags": ["出行时间", "季节推荐", "气候攻略", "呼伦贝尔旅游"], + "tags": [ + "出行时间", + "季节推荐", + "气候攻略", + "呼伦贝尔旅游" + ], "seo": { "title": "呼伦贝尔几月份去最好?四季月份对比全解析 - 呼籁旅行", "description": "呼伦贝尔几月份去最好?本文详细对比1-12月气候、草原状态、景色特点和适合人群,帮你找到最适合自己的出行时间窗口。", "keywords": "呼伦贝尔几月份去最好,呼伦贝尔最佳旅游季节,呼伦贝尔几月去,呼伦贝尔旅游旺季,呼伦贝尔气候" }, - "relatedProducts": ["v9-5d4n", "v9-6d5n-family", "v9-6d5n-comfort"], + "relatedProducts": [ + "v9-5d4n", + "v9-6d5n-family", + "v9-6d5n-comfort" + ], "content": "

一句话结论

如果只能给一个答案:7月中旬至8月上旬是综合体验最好的时间段——草最绿、天最蓝、活动最丰富。但这也是最贵、最挤的时候。根据你的出行目的、预算和喜好,不同月份各有优势。

各月份详细解析

5月:草原刚苏醒,人少价低

5月气温回升,草原开始泛绿,但草色尚浅,偶尔还有寒潮。适合摄影爱好者追逐「初绿」感,以及预算有限的旅行者。日均气温10-18℃,晚上仍需厚外套。

6月:野花最盛,性价比之王

6月草原进入盛放期,各色野花铺满大地,是全年最适合摄影的月份之一。游客量约为7月的60%,价格相对低15-20%。日均气温18-24℃,天气舒适。强烈推荐不赶热闹、喜欢自然的旅行者。

7月:旺季高峰,景色最美

7月草原达到一年中最高颜值。7月中下旬那达慕期间民俗活动丰富,是体验蒙古族文化的最佳时机。日均气温22-28℃。缺点:预订需提前2-3个月,价格为全年最高。

8月:旺季收尾,从容出行

8月上旬草色仍旺,中旬开始草色转黄。游客量逐渐减少,各类资源预订难度下降。日均气温18-25℃。适合不想在旺季挤着玩又想看到绿草的家庭。

9月:秋叶金黄,大兴安岭最美

9月呼伦贝尔的重心从草原转向森林。大兴安岭白桦林金黄,额尔古纳湿地芦苇变金,莫尔道嘎国家森林公园层林尽染。是秋色爱好者和摄影人的首选月份。气温10-18℃,早晚凉,穿着要比夏季厚一层。

10月:初雪来临,草原转入休眠

10月中下旬开始降雪,草原景观结束,进入「雪原模式」。适合喜欢人迹罕至、想看初雪草原的探险旅行者。非常规旅游旺季,部分营地已关闭。

11月至次年2月:冰雪季,独特体验

呼伦贝尔冬季最低气温可达-40℃,是中国最冷地区之一。但这里也是国内冰雪体验最丰富的目的地:冰雪那达慕、驯鹿文化、雾凇奇景、冰上车队。适合追求极致体验、耐寒能力强的旅行者。

3-4月:不推荐

春季融雪期,道路泥泞,草原泥泞,景色荒芜,是一年中最不适合旅游的时段。

按人群推荐

  • 亲子家庭(6-12岁孩子):7月旺季,活动最丰富
  • 亲子家庭(3-5岁孩子):6月末或8月,天气舒适节奏慢
  • 摄影爱好者:6月野花期或9月秋色期
  • 预算有限:6月上旬或8月下旬
  • 冰雪体验:1月,冰雪活动最丰富
  • 避开人群:6月上旬,景美人少

总结

没有「最好」的月份,只有「最适合你」的月份。建议结合自己的行程安排、孩子年龄和旅行目的综合判断。如果拿不定主意,欢迎联系呼籁旅行的定制师,我们会根据你的具体情况给出最适合的建议。

" }, { @@ -63,13 +197,22 @@ "category": "攻略", "summary": "呼伦贝尔自驾还是包车,这个问题困扰着大多数第一次去的旅行者。本文从路况、费用、自由度、安全性四个维度全面对比。", "coverImage": "/images/seasons/summer-car.jpg", - "tags": ["自驾攻略", "包车攻略", "交通方式", "呼伦贝尔旅游"], + "tags": [ + "自驾攻略", + "包车攻略", + "交通方式", + "呼伦贝尔旅游" + ], "seo": { "title": "呼伦贝尔自驾vs包车哪个好?深度对比分析 - 呼籁旅行", "description": "呼伦贝尔自驾还是包车?本文从路况复杂度、费用对比、安全性、自由度、适合人群五个维度深度对比,帮你做出最适合的选择。", "keywords": "呼伦贝尔自驾,呼伦贝尔包车,呼伦贝尔自驾攻略,呼伦贝尔包车价格,呼伦贝尔怎么去" }, - "relatedProducts": ["v9-5d4n", "v9-6d5n-comfort", "v9-7d6n-wild"], + "relatedProducts": [ + "v9-5d4n", + "v9-6d5n-comfort", + "v9-7d6n-wild" + ], "content": "

先说结论

对于第一次去呼伦贝尔、带有孩子或老人的家庭旅行者,包车+本地领队是更优解。有越野经验、团队人数较多(6人以上)、追求极致自由的旅行者可以考虑自驾。

路况:草原路不是你想象的样子

很多人以为呼伦贝尔只是开车在草原上走走,实际上情况复杂得多:

  • 海拉尔到草原核心区的距离超过150公里,全程以国省道为主,部分路段没有护栏
  • 莫日格勒河观景台需要走无导航的草地便道,雨后极易陷车
  • 从室韦到黑山头的边境公路全长约200公里,途中加油站极少
  • 9月以后部分路段开始结冰,对驾驶技术要求高
  • 草原无信号区域手机导航失效,需要提前下载离线地图

这些问题对有经验的自驾游客不构成障碍,但对普通家庭旅行者而言风险较高。

费用对比

自驾费用(以5天为例,2大2小):

  • 租车费:约600-900元/天,5天约3000-4500元
  • 油费:约800-1200元
  • 停车+景区内摆渡车:约500元
  • 合计约4300-6200元(不含住宿餐饮)

包车费用(同等行程):

  • 含专业领队+7座商务车:约800-1200元/天,5天约4000-6000元
  • 包含:全程接送、景区讲解、行程规划、应急协调

费用相差不大,但包车额外包含了专业服务价值。

自由度

自驾最大的优势是时间完全自由——想在哪个路边停就停,想在哪个景点多待就多待,不必配合其他人的节奏。这对摄影发烧友尤其重要,追光追云需要极大的时间弹性。

但包车并非完全不自由。选择优质旅行社的私家包车(一家一单),你同样可以提出自己的节奏要求,领队会配合调整。

安全性

草原上的安全隐患不止于交通。本地领队了解哪片草场近期有狼群活动,知道哪个景点的悬崖边栏杆不稳,在应急情况下(陷车、孩子受伤、天气突变)能快速调动本地资源。这是任何导航软件都无法替代的本地经验。

适合自驾的情况

  • 旅行团有越野车经验丰富的驾驶员
  • 人数6人以上,摊薄成本
  • 行程以摄影为主,需要极大的时间弹性
  • 有呼伦贝尔旅行经验(二刷以上)

适合包车的情况

  • 第一次去,不熟悉路线
  • 带孩子或老人,安全优先
  • 行程天数有限,希望效率最高
  • 想深度了解本地文化,需要领队讲解
  • 4人以下家庭,自驾反而更贵

选包车的关键:怎么选靠谱的

包车最大的坑在于「人头团」——名义上包车,实际上拼车,或者中途换车换领队。选择包车要注意:签订正规合同、确认是否一家一单、确认车辆型号和领队信息。呼籁旅行提供「一家一单一车」的私家定制,从签约到结束同一个领队全程陪同,这是我们的核心承诺。

" }, { @@ -81,13 +224,22 @@ "category": "攻略", "summary": "呼伦贝尔一趟到底花多少钱?本文拆解机票、住宿、交通、餐饮、活动、购物各项费用,给出高中低三档真实预算参考。", "coverImage": "/images/seasons/summer-hero.jpg", - "tags": ["旅游花费", "预算攻略", "性价比", "呼伦贝尔费用"], + "tags": [ + "旅游花费", + "预算攻略", + "性价比", + "呼伦贝尔费用" + ], "seo": { "title": "呼伦贝尔旅行花费多少钱?2026年真实预算明细 - 呼籁旅行", "description": "2026年呼伦贝尔旅行花费明细:机票、住宿、定制游套餐、餐饮、景点费用逐项拆解,高中低三档预算参考,4人家庭出行真实花费。", "keywords": "呼伦贝尔旅游费用,呼伦贝尔旅游多少钱,呼伦贝尔花费,呼伦贝尔旅游预算,呼伦贝尔定制游价格" }, - "relatedProducts": ["v9-5d4n-forest", "v9-5d4n-prairie", "v9-6d5n-family"], + "relatedProducts": [ + "v9-5d4n-forest", + "v9-5d4n-prairie", + "v9-6d5n-family" + ], "content": "

先说总数

以2大2小(4-10岁孩子)5天4晚为例,中档出行总预算约15000-22000元,人均约3750-5500元。预算差异主要来自机票舱位、住宿档次和是否选择旺季出行。

机票费用

北京/上海至海拉尔(HLD)直飞约2.5小时,无直飞城市需转机。

  • 经济舱:北京出发来回约800-1500元/人,视旺淡季波动较大
  • 商务舱:约3000-5000元/人
  • 提前预订建议:7月旺季至少提前2个月订票,可省20-30%
  • 4人家庭机票合计约3200-6000元(经济舱)

定制游套餐费用

选择呼籁旅行的定制游套餐,包含车辆、领队、大部分景区门票和营地住宿:

  • 5天4晚:约7000-8500元/人(视版本和人数)
  • 6天5晚亲子版:约8500-10000元/人

套餐包含:专属领队、7座商务车、自有营地住宿(含早餐)、主要景区门票、部分活动费用。

额外活动费用

套餐外的自费活动参考价(旺季):

  • 骑马体验(30分钟):80-150元/人
  • ATV/越野摩托:200-400元/组
  • 热气球(部分区域):400-600元/人
  • 驯鹿基地参观:80元/人

建议提前了解套餐包含哪些活动,避免到现场发现核心项目都要单独付费。

餐饮费用

草原上的饮食选择相对有限。住宿套餐一般含早餐,午晚餐需自理或选择套餐附带版本。

  • 牧民家就餐(手把肉+奶茶+各类奶制品):约100-150元/人
  • 海拉尔市区餐厅:约60-100元/人
  • 景区附近餐厅:质量参差,约80-120元/人
  • 5天餐饮合计(午晚餐):约1500-2500元(4人家庭)

购物费用

呼伦贝尔特产推荐:风干牛肉、马奶酒、风干羊腿、各类奶制品、蒙古族手工艺品。预算控制在500-1500元较为合理,注意辨别正规商家,避免购买过度加工的旅游纪念品。

三档预算汇总(4人家庭,5天4晚)

  • 经济档(淡季6月,拼房/民宿):约12000-16000元
  • 舒适档(旺季7月,包车定制游):约18000-25000元
  • 品质档(旺季7月,商务舱+高端住宿):约30000-40000元

省钱小技巧

  • 淡旺季差价约20-30%,6月或8月出行可节省不少
  • 提前3个月预订机票,通常比临时订便宜30%以上
  • 儿童优惠:大部分景区12岁以下半价或免票,提前了解政策
  • 选择套餐含活动的版本,比散拼更划算
" }, { @@ -99,13 +251,21 @@ "category": "亲子", "summary": "4-6岁是孩子最适合初次体验草原的年龄段,好奇心旺盛但自我保护能力弱。这篇文章总结了10年来服务这个年龄段孩子的所有注意事项。", "coverImage": "/images/summer-camp/birch-group.jpg", - "tags": ["4-6岁", "幼童旅行", "亲子注意事项", "安全出行"], + "tags": [ + "4-6岁", + "幼童旅行", + "亲子注意事项", + "安全出行" + ], "seo": { "title": "带4-6岁孩子去呼伦贝尔草原注意事项 - 呼籁旅行", "description": "带4-6岁孩子去呼伦贝尔草原需要注意什么?安全活动选择、饮食注意、晒伤防护、行程节奏,呼籁旅行10年亲子服务经验总结。", "keywords": "带小孩去草原注意事项,4岁孩子草原旅游,6岁草原旅行,幼童呼伦贝尔,亲子草原安全" }, - "relatedProducts": ["v9-6d5n-family", "v9-7d6n-family"], + "relatedProducts": [ + "v9-6d5n-family", + "v9-7d6n-family" + ], "content": "

为什么4-6岁特别适合草原初体验

心理学研究表明,3-6岁是儿童自然依恋期的关键窗口。在这个阶段接触大自然,对孩子的感知发育、情绪调节和环境认知有深远影响。草原的开阔空间、野生动植物、以及与城市截然不同的生活方式,对这个年龄段的孩子有天然的吸引力。但同时,4-6岁孩子的自我保护意识尚未成熟,需要大人更细心的陪伴和防护。

安全第一:哪些活动可以参与

推荐参与:

  • 骑马体验(由专业牵马师全程陪同,配备儿童头盔和安全背心)
  • 接触牧民家的温顺马匹和羊群
  • 奶制品制作体验
  • 草地自由玩耍、捉昆虫、认植物
  • 篝火晚会观看(距火堆保持2米以上)
  • 湿地木栈道参观

不推荐参与:

  • ATV全地形越野车(最低年龄要求通常为12岁)
  • 快速骑马(无牵马师陪同的自由骑乘)
  • 深水区游泳
  • 夜间单独户外活动

防晒是头等大事

草原海拔约600-800米,加上没有城市遮蔽物,紫外线强度是城市的2-3倍。4-6岁孩子皮肤薄、防晒能力弱,晒伤在草原上非常常见。

  • 选择SPF50+、PA+++的儿童专用防晒霜
  • 每隔2小时补涂一次,游泳或出汗后立即补涂
  • 上午10点至下午3点是UV最强时段,尽量避免长时间在无遮蔽处活动
  • 备好遮阳帽(大帽沿款)、防晒衣、太阳镜(儿童专用UV防护款)

饮食注意事项

草原的饮食以牛羊肉为主,酸奶、奶茶、奶豆腐等奶制品是当地特色。几点注意:

  • 如果孩子对牛奶蛋白过敏,务必提前告知领队
  • 蒙古奶茶含有奶和砖茶,首次尝试给孩子少量品尝
  • 草原上的生水不可饮用,全程饮用瓶装水或自带滤水
  • 备好孩子平时爱吃的零食,避免因不适应当地食物而挨饿
  • 手把肉(煮羊腿)是当地特色,可以让孩子尝试,但注意骨头

行程节奏的把握

4-6岁孩子每天有效活动时间约4-6小时,之后需要午休。建议行程安排:

  • 上午安排主要景点或活动(精力最旺盛)
  • 下午安排轻松项目或营地自由活动
  • 避免连续多天长途驾车(每天车程控制在3小时以内)
  • 每天保证10小时左右睡眠(草原空气好,孩子睡得深)

常见突发状况处理

蚊虫叮咬:草原蚊虫活跃,出发前涂抹含DEET或派卡瑞丁的儿童驱蚊产品。被叮咬后用冰块冷敷,切勿让孩子抓挠。

感冒发烧:早晚温差大,备好儿童退烧药和感冒药。若发烧超过38.5℃,需及时就医(海拉尔有三甲医院)。

晕车:草原路颠簸,晕车的孩子出发前1小时服用晕车药,行程中准备好塑料袋。

皮肤过敏:草原花粉较多,有过敏体质的孩子备好抗组胺药物,出门戴口罩。

一句话总结

带4-6岁孩子去草原,做好防晒、管好饮食、控制节奏,其余的交给草原——孩子对自然的好奇心会帮你完成剩下的事情。

" }, { @@ -117,13 +277,21 @@ "category": "避坑", "summary": "呼伦贝尔旅游的坑不少:强制购物、人头拼团、低价陷阱、景区宰客……这篇避坑指南帮你把雷都踩在出发之前。", "coverImage": "/images/team/campsite-team.jpg", - "tags": ["避坑指南", "旅游陷阱", "消费提醒", "呼伦贝尔旅游"], + "tags": [ + "避坑指南", + "旅游陷阱", + "消费提醒", + "呼伦贝尔旅游" + ], "seo": { "title": "呼伦贝尔旅游避坑指南:10大常见陷阱完整解析 - 呼籁旅行", "description": "呼伦贝尔旅游避坑必看:低价团陷阱、人头团、强制购物、景区宰客、住宿虚假宣传……10大高频坑位逐一解析,附辨别方法。", "keywords": "呼伦贝尔旅游避坑,呼伦贝尔旅游陷阱,呼伦贝尔旅游注意事项,呼伦贝尔旅游黑心导游,呼伦贝尔避雷" }, - "relatedProducts": ["v9-5d4n", "v9-6d5n-family"], + "relatedProducts": [ + "v9-5d4n", + "v9-6d5n-family" + ], "content": "

坑一:低价团,行程缩水

在各大平台搜索「呼伦贝尔旅游」,会出现标价极低的产品,比市场均价低30-50%。这类产品的常见套路:

  • 核心景点(如边境公路、室韦)被删减
  • 住宿缩水,从营地换成郊区普通宾馆
  • 强制购物停留时间长、自费活动多
  • 领队专业度差,纯跑路

辨别方法:对比行程中是否包含室韦/黑山头边境公路、自有营地住宿、额尔古纳湿地等核心节点。正规套餐不会比市场均价低超过15%。

坑二:人头拼团,冒充私家团

很多旅行社打着「私家包车」的旗号,实际是把多组家庭拼在同一辆车上,变成了效率低、节奏不一的大团。辨别方式:在合同中明确写入「一家一单,不拼团,同一辆车只接待本组家庭」,并注明车辆型号和领队姓名。

坑三:景区内宰客

草原上部分非正规马场、摄影点、手工艺品摊位存在漫天要价的情况。常见场景:骑马前未谈好价格,骑完被要天价;照相「免费」,洗出来才知道每张100元以上。

应对方法:任何消费前先确认价格并口头确认,有争议项目拍视频留证据。选择有本地领队陪同的出行方式,领队通常会提前提醒这类情况。

坑四:住宿虚假宣传

部分民宿或营地在网上发布的照片与实际差距悬殊:图片是高级帐篷,实际是没有卫浴的简易蒙古包;宣传「草原深处」,实际在城郊农家乐。

辨别方法:要求提供真实照片(不修图)、卫浴配置、与草原核心区的距离。呼籁旅行的自有营地提供真实照片和视频参考,可在预订前查看。

坑五:旺季一房难求

7月草原旺季,优质营地和酒店经常提前2个月以上售罄。若临时决定出行,只能选择剩余的低品质住宿,严重影响体验。教训:确定要去就立刻预订,尤其是7月15日至8月5日的黄金期。

坑六:不签合同,口头承诺

小作坊式的旅行社常见问题:仅口头承诺行程,不提供书面合同;出现问题无凭据。正规旅行社必须签订包含行程细节、退改条款、投诉渠道的正式旅游合同(电子版也算)。无合同,不出发。

坑七:天气原因无法赔偿

草原天气变化快,有时会遭遇大雨导致部分景点无法前往。部分旅行社在合同中以「不可抗力」条款免除一切责任。查看合同时重点关注:因天气原因导致行程调整,旅行社如何补偿或安排替代方案。

坑八:购物停留时间过长

部分旅行社与当地购物点有合作,在行程中安排1-2小时甚至更长的购物时间,以「体验当地文化」为名实为强制购物。选择旅行社时直接问:行程中是否有购物环节?是否有强制购物?获得明确承诺后写入合同。

坑九:活动安全保障不足

草原上的骑马、ATV等活动存在一定风险。不规范的活动场地:无头盔提供、马匹未经专业训练、无安全员陪同。参与任何体力活动前确认安全装备是否齐全,拒绝没有安全保障的项目。

坑十:以为草原哪里都一样

这不是「坑」,但是认知偏差。呼伦贝尔最精华的景点高度分散,如果只在海拉尔周边转,会错过所有核心风景。行程规划时确认包含:莫日格勒河、额尔古纳湿地、边境公路(室韦-黑山头段)这三个核心节点,否则相当于白跑一趟。

" }, { @@ -135,14 +303,23 @@ "category": "穿搭", "summary": "去草原不知道穿什么?本文从色系选择、服装款式、配件搭配到拍摄时机,手把手教你在呼伦贝尔草原拍出大片感。", "coverImage": "/images/seasons/autumn-forest.jpg", - "tags": ["草原穿搭", "旅拍穿搭", "拍照技巧", "呼伦贝尔摄影"], + "tags": [ + "草原穿搭", + "旅拍穿搭", + "拍照技巧", + "呼伦贝尔摄影" + ], "seo": { "title": "草原旅拍穿搭指南:呼伦贝尔怎么穿才好看 - 呼籁旅行", "description": "呼伦贝尔草原旅拍穿搭指南:适合草原的色系推荐、蒙古风服装选择、亲子穿搭配色、最佳拍照时机,帮你在草原拍出大片感。", "keywords": "草原穿搭,呼伦贝尔穿搭,草原旅拍,呼伦贝尔旅拍穿搭,草原拍照穿什么" }, - "relatedProducts": ["v9-6d5n-family", "v9-6d5n-comfort", "v9-7d6n-wild"], + "relatedProducts": [ + "v9-6d5n-family", + "v9-6d5n-comfort", + "v9-7d6n-wild" + ], "content": "

草原拍照的核心逻辑

草原摄影不同于城市街拍,背景是无边绿色+蓝天白云的极简组合,这意味着服装颜色是决定出片质量的第一要素。颜色选对了,随手一拍都是大片;颜色选错了,专业摄影师也救不回来。

色系选择:哪些颜色最出片

最推荐:

  • 白色:与绿草蓝天形成最强反差,任何角度都好看,是草原拍照的王者色
  • 米黄/驼色:低饱和度的暖色调与草原泥土色系天然融合,高级感十足
  • 天蓝/浅蓝:呼应天空色,融入感强,有「天人合一」的意境
  • 民族风红色:蒙古族传统服装色,与草原文化契合,但面积不宜过大

慎用:

  • 深绿色:与背景融合,人会「消失」在草原中
  • 印花/格纹:在草原简洁背景下显得杂乱
  • 荧光色:显眼但不好看,适合纪念照不适合大片

推荐款式

女生首选:

  • 飘逸长裙(纯色或简约印花):风吹裙摆是草原专属画面,必备
  • 蒙古族传统袍子(可在当地租借):文化感拉满,适合正式纪念照
  • 衬衫+高腰阔腿裤:干净清爽,适合日常旅行拍摄

男生推荐:

  • 白色或浅色衬衫:简单好配,不会抢镜
  • 户外风系列(防晒衣+功能裤):既实用又有探险感
  • 蒙古族传统服装:非常出片,可在当地租用

亲子家庭:

  • 建议全家选择同一色系,而非相同颜色
  • 经典组合:爸爸白衬衫+妈妈白裙+孩子蓝色或黄色(补色点亮画面)
  • 孩子适合亮色系,活泼的黄色、红色最出片

配件不可少

  • 帽子:草原必备,功能性(防晒)和美观性兼顾。草帽、白色棒球帽、蒙古风毡帽都很适合
  • 马术靴:穿上骑马靴整个人气质立刻不同,也很安全
  • 腰带/腰封:长裙加一条民族风腰带,层次感立刻出来

最佳拍摄时机

草原光线变化极大,拍摄时机比服装更重要:

  • 黄金时刻(Golden Hour):日出后1小时(约6:00-7:30)和日落前1小时(约20:00-21:30)。此时光线暖黄,阴影柔和,任何构图都好看
  • 蓝调时刻:日出前和日落后15分钟,天空呈深蓝色,适合营地或蒙古包的夜景拍摄
  • 正午慎拍:10:00-16:00阳光直射,阴影浓重,容易曝光过度,此时建议在阴影处或营地内拍摄

拍摄构图小技巧

  • 低角度仰拍:把相机/手机放到腰部高度向上拍,以草地为前景,人物和天空占画面的上2/3,草原感最强
  • 留白天空:草原的天空是最好的背景,让人物处于画面下1/3,上方大面积留白
  • 奔跑/回眸:让被拍摄者做动态动作,避免生硬站立
  • 利用道路:边境公路的笔直道路是天然的透视线,站在道路中央拍摄有延伸感

实用建议

带至少2套不同颜色的外出服装,根据当天景点背景灵活切换。在营地可以借穿当地蒙古族传统服装,通常收费50-100元/套,非常值得体验。草原风大,长裙拍摄时顺风站立,裙摆自然飘起效果最好。最后,记得在出发前充满手机电量,草原上充电不方便,备一个移动电源是必要的。

" } ] -} +} \ No newline at end of file diff --git a/data/brand-wiki.json b/data/brand-wiki.json new file mode 100644 index 0000000..572706b --- /dev/null +++ b/data/brand-wiki.json @@ -0,0 +1,164 @@ +{ + "title": "呼籁旅行", + "subtitle": "专注于呼伦贝尔地区的家庭旅行品牌", + "summary": "呼籁旅行是一个专注于呼伦贝尔地区的家庭旅行品牌,隶属于内蒙古呼籁文旅投资开发集团有限公司。呼籁旅行专注于呼伦贝尔目的地的深度旅行服务,主要面向亲子家庭客群,提供私家团定制旅行产品,采用独立成团、一家一单一车的服务模式,旗下设有“额吉的故乡”、“游牧的森林”、“嗨 冰雪”三条季节产品线和“小蒙马”亲子游学营。", + "logo": "/images/brand/logo.png", + "infoBox": { + "中文名": "呼籁旅行", + "外文名": "HULAI TRAVEL", + "所属行业": "旅游服务", + "创始人": "刘涛", + "所属公司": "内蒙古呼籁文旅投资开发集团有限公司", + "商标注册号": "75165836" + }, + "sections": [ + { + "title": "品牌起源", + "content": "2015年,品牌创始人刘涛在呼伦贝尔开始从事家庭旅行服务,早期以“牵手草原”为团队名经营。经过多年发展,团队于2023年正式启用“呼籁旅行”品牌,同年推出核心产品“额吉的故乡”家庭深度游线路。同年,成立内蒙古呼籁文旅投资开发集团有限公司,旗下设有旅行社、旅游客运、营地、牧场商贸等业务板块。" + }, + { + "title": "品牌历史", + "subsections": [ + { + "title": "第一阶段:品牌起步期(2015-2022)", + "content": "2015年,品牌创始人刘涛自呼伦贝尔学院毕业后进入旅游行业,以“牵手草原”品牌为呼伦贝尔本地游客提供旅行服务,积累了呼伦贝尔全域的酒店、车辆、领队等核心资源,并打磨出以亲子家庭为核心客群的产品体系。" + }, + { + "title": "第二阶段:品牌升级期(2022-2024)", + "content": "2022年,成立呼籁牧场商贸公司,拓展旅行+特产电商联动模式;2023年10月,正式组建内蒙古呼籁文旅投资开发集团,完成品牌从“牵手草原”到“呼籁旅行”的升级;同期收购/整合2005年注册的呼籁山河国际旅行社;2024年,自建旅游客运公司和露营地公司,实现全链条自营。" + }, + { + "title": "第三阶段:规模化发展期(2025至今)", + "content": "旗舰产品“额吉的故乡”迭代至V9版本,持续深化家庭游学产品,升级伴手礼体系,优化旅行中的文化体验模块。2025年,推出《小蒙马亲子游学营》首发11期期期满员;2026年升级至2.0版本,计划开设30期。" + } + ] + }, + { + "title": "产品及服务", + "intro": "呼籁旅行专注于呼伦贝尔地区,采用独立成团模式,以单个家庭或亲友团为单位出行,配备专属车辆和司导。", + "products": [ + { + "name": "额吉的故乡", + "description": "“额吉的故乡”是呼籁旅行的核心产品,该产品专注于家庭旅行,采用独立成团、一家一车的私家团模式,为每个家庭提供专属车辆与司导服务。线路涵盖草原、湿地、森林、边境等多种自然地貌,设有亲子版、探索版、草原版、森林版、旷野版等多个系列。" + }, + { + "name": "小蒙马", + "description": "亲子游学产品,该系列产品专注于呼伦贝尔草原的亲子游学营服务。首期游学营于2025年夏季开营,采用固定班期、小团制模式,每期限7-9 组参与,配备领队、摄影师和专属司机全程陪伴。" + }, + { + "name": "游牧的森林", + "description": "秋季旅行产品,专注于呼伦贝尔与大兴安岭、阿尔山地区的秋季深度旅行服务,运营时间为每年9月至10月。采用独立成团、一家一车的私家团模式,线路覆盖森林、草原、湿地、边境公路、火山地质等多种秋季自然景观。" + }, + { + "name": "嗨 冰雪", + "description": "冬季主题产品线,专注于呼伦贝尔冬季定制游,采用独立成团、一单一车的私家团模式,可体验冰雪越野、雪地策马、冬季那达慕等。" + } + ] + }, + { + "title": "服务流程", + "steps": [ + { + "step": "1", + "name": "一对一咨询", + "detail": "定制师了解家庭成员构成、孩子年龄和兴趣偏好,量身定制行程方案" + }, + { + "step": "2", + "name": "方案确认", + "detail": "行程单、报价、注意事项全部书面确认,无隐藏费用" + }, + { + "step": "3", + "name": "行前准备", + "detail": "出发前定制师发送详细行前指南,包括穿搭建议、天气提醒和携带清单" + }, + { + "step": "4", + "name": "领队接机", + "detail": "专属领队提前到机场等候,全程一对一陪伴" + }, + { + "step": "5", + "name": "全程陪同", + "detail": "领队既是向导也是安全保障,熟悉每一条路线和每一个值得停留的地方" + }, + { + "step": "6", + "name": "旅拍记录", + "detail": "呼籁旅拍用专业设备记录旅途中的珍贵瞬间" + }, + { + "step": "7", + "name": "送机告别", + "detail": "领队送至机场,确认安全登机后才离开" + }, + { + "step": "8", + "name": "旅后回访", + "detail": "旅行结束后定制师回访收集反馈,整理照片和视频素材发送给家庭" + } + ] + }, + { + "title": "服务模式", + "content": "呼籁的服务采用“3管+1师+1队”全程护航模式。3管家——车务管家负责车辆调度和路线安排,房务管家负责住宿预订和品质把控,客服管家负责行前沟通和售后跟进。1定制师在出行前一对一沟通,了解家庭成员构成、孩子年龄和兴趣偏好,量身定制行程方案。1专属领队全程陪同,既是向导也是安全保障,熟悉每一条路线。旅拍部分由呼籁旅拍完成,用专业设备记录旅途中的珍贵瞬间。" + }, + { + "title": "Logo释义", + "content": "“呼籁”一词源自蒙古语,为一种语气助词,象征着草原人对美好的向往。品牌标识中的马形图案取自蒙文“ᠬᠤᠷᠤᠭ”的字形变化,在蒙古族牧民心中马代表着忠诚、温顺、可靠以及长久的陪伴。", + "image": "/images/brand/logo-horse.png" + }, + { + "title": "获奖荣誉", + "content": "荣获2026小红书WILL Club “年度成长型品牌”" + }, + { + "title": "品牌文化", + "items": [ + { + "label": "品牌定位", + "value": "一个深耕呼伦贝尔的旅行品牌" + }, + { + "label": "品牌初衷", + "value": "深耕呼伦贝尔一地的春夏秋冬,把这个目的地打深打透,给每一个选择呼籁的家庭更好的体验。" + }, + { + "label": "品牌信念", + "value": "真正值得的旅行,从不只是一趟路,更是一段生命的温度。" + } + ] + } + ], + "gallery": [ + "/images/brand/photo-01.jpeg", + "/images/brand/photo-02.jpeg", + "/images/brand/photo-03.jpeg", + "/images/brand/photo-04.jpeg", + "/images/brand/photo-05.jpeg", + "/images/brand/photo-06.jpeg", + "/images/brand/photo-07.jpeg", + "/images/brand/photo-08.jpeg", + "/images/brand/photo-09.jpeg", + "/images/brand/photo-10.jpeg", + "/images/brand/photo-11.jpeg", + "/images/brand/photo-12.jpeg", + "/images/brand/photo-13.jpeg", + "/images/brand/photo-14.jpeg", + "/images/brand/photo-15.jpeg", + "/images/brand/photo-16.jpeg", + "/images/brand/photo-17.jpeg", + "/images/brand/photo-18.jpeg", + "/images/brand/photo-19.jpeg", + "/images/brand/photo-20.jpeg", + "/images/brand/photo-21.jpeg", + "/images/brand/photo-22.jpeg", + "/images/brand/photo-23.jpeg" + ], + "seo": { + "title": "呼籁旅行 - 专注呼伦贝尔的家庭旅行品牌", + "description": "呼籁旅行是专注于呼伦贝尔地区的家庭旅行品牌,隶属于内蒙古呼籁文旅投资开发集团有限公司,提供私家团定制旅行产品,旗下设有额吉的故乡、游牧的森林、嗨冰雪三条季节产品线和小蒙马亲子游学营。", + "keywords": "呼籁旅行,HULAI TRAVEL,呼伦贝尔旅行,呼伦贝尔亲子游,额吉的故乡,呼籁文旅" + } +} \ No newline at end of file diff --git a/data/brand.json b/data/brand.json index d24d766..ea84626 100644 --- a/data/brand.json +++ b/data/brand.json @@ -21,7 +21,8 @@ { "value": "98%", "unit": "", - "label": "客户好评率" + "label": "客户好评率", + "attribution": "基于历年行程结束后满意度回访统计" }, { "value": "9", @@ -68,7 +69,7 @@ {"step": 3, "label": "看价格", "to": "/pricing"}, {"step": 4, "label": "在线定制", "to": "/customize"} ], - "icpEntity": "内蒙古呼籁文化科技有限公司", + "icpEntity": "内蒙古呼籁文化科技有限公司(提供技术支持)", "icp": "蒙ICP备2025033324号-2", "icpUrl": "https://beian.miit.gov.cn", "eContract": "所有行程签订正规电子合同" diff --git a/data/calendar.json b/data/calendar.json index f64fcdf..5b695ef 100644 --- a/data/calendar.json +++ b/data/calendar.json @@ -152,7 +152,7 @@ "highlights": ["6月中下旬性价比最高", "草原已非常美", "各项活动全面开展", "骑马体验最舒适"], "clothingTips": "薄外套 + 防晒衣 + 长裤,早晚加薄羽绒,备雨衣", "isPeakSeason": true, - "recommendedProducts": ["额吉的故乡V9", "小蒙马夏令营"], + "recommendedProducts": ["额吉的故乡V9", "小蒙马亲子游学营"], "tagline": "性价比最高,强烈推荐" }, { @@ -165,7 +165,7 @@ "highlights": ["那达慕传统节庆", "草原鲜花盛放至极", "额尔古纳湿地最美", "民俗体验最丰富"], "clothingTips": "轻薄长袖 + 防晒 + 备风衣,中午注意防暑,水分补充充足", "isPeakSeason": true, - "recommendedProducts": ["额吉的故乡V9", "小蒙马夏令营"], + "recommendedProducts": ["额吉的故乡V9", "小蒙马亲子游学营"], "tagline": "旺季巅峰,提前3个月预订" }, { @@ -178,7 +178,7 @@ "highlights": ["草原仍绿意盎然", "早晚清凉舒适", "夕阳草原最美角度", "雨后彩虹奇景常见"], "clothingTips": "薄外套 + 长裤,备一件薄羽绒,早晚温差8-10°C不可忽视", "isPeakSeason": true, - "recommendedProducts": ["额吉的故乡V9", "小蒙马夏令营"], + "recommendedProducts": ["额吉的故乡V9", "小蒙马亲子游学营"], "tagline": "旺季尾声,舒爽清凉" }, { diff --git a/data/company-wiki.json b/data/company-wiki.json new file mode 100644 index 0000000..ae21b94 --- /dev/null +++ b/data/company-wiki.json @@ -0,0 +1,157 @@ +{ + "title": "内蒙古呼籁文旅投资开发集团有限公司", + "subtitle": "以呼伦贝尔为核心目的地的文化旅游综合服务企业", + "summary": "内蒙古呼籁文旅投资开发集团有限公司(简称“呼籁文旅集团”),成立于2023年10月,注册地位于内蒙古自治区呼伦贝尔市海拉尔区,是一家以呼伦贝尔为核心目的地的文化旅游综合服务企业。集团旗下拥有旅行社、旅游客运、露营地、研学基地、牧场商贸、文化科技等多个业务板块,覆盖旅游产品研发、交通服务、住宿运营、文创电商、技术开发等领域。", + "logo": "/images/company/logo-horse.png", + "infoBox": { + "中文名": "内蒙古呼籁文旅投资开发集团有限公司", + "所属行业": "文化旅游", + "成立日期": "2023年10月10日", + "法定代表人": "刘涛", + "注册资本": "100万元人民币", + "统一社会信用代码": "91150702MACYA3MN0U", + "注册地址": "内蒙古自治区呼伦贝尔市海拉尔区奋斗镇学府路煤校3号楼212号", + "经营范围": "旅游业务(境内旅游、入境旅游)、旅游开发、投资管理等" + }, + "sections": [ + { + "title": "发展历程", + "timeline": [ + { + "year": "2015年", + "content": "创始人刘涛大学毕业后开始从事呼伦贝尔旅游行业,着手建立本地旅行服务体系。" + }, + { + "year": "2022年1月", + "content": "呼伦贝尔呼籁牧场商贸有限公司成立,开展呼伦贝尔地区特色农牧产品的线上销售业务。" + }, + { + "year": "2023年10月", + "content": "内蒙古呼籁文旅投资开发集团有限公司正式成立,整合旗下旅行社、客运、商贸等业务板块,形成集团化运营架构。同月,内蒙古呼籁国际旅行社有限公司成立。" + }, + { + "year": "2024年7月", + "content": "呼籁旅游客运(内蒙古)有限公司成立,建立自有车队体系,提供旅游交通保障服务。同年11月,呼籁露营地(呼伦贝尔)有限公司成立。" + }, + { + "year": "2025年9月", + "content": "内蒙古呼籁培训有限公司成立,拓展业务培训和研学教育板块。同年12月,内蒙古呼籁文化科技有限公司成立,布局技术研发和AI业务领域。" + }, + { + "year": "2026年1月", + "content": "呼伦贝尔呼籁研学文化旅游有限责任公司成立,进一步拓展研学旅游业务。" + } + ] + }, + { + "title": "核心品牌", + "content": "呼籁文旅集团的核心品牌“呼籁旅行”专注于呼伦贝尔目的地的深度旅行服务,主要面向亲子家庭客群,提供私家团定制旅行产品,采用独立成团、一家一单一车的服务模式,旗下设有“额吉的故乡”、“游牧的森林”、“嗨 冰雪”三条季节产品线和“小蒙马”亲子游学营。" + }, + { + "title": "组织架构", + "intro": "呼籁文旅集团作为母公司,持有旗下多家企业股权,形成以集团公司为核心的企业群。旗下主要企业包括:", + "subsidiaries": [ + "内蒙古呼籁山河国际旅行社有限公司,经营境内旅游和入境旅游业务", + "内蒙古呼籁国际旅行社有限公司,经营境内旅游和入境旅游业务", + "呼籁旅游客运(内蒙古)有限公司,提供旅游客运交通服务", + "呼伦贝尔呼籁牧场商贸有限公司,经营呼伦贝尔特色农牧产品电商业务", + "呼籁露营地(呼伦贝尔)有限公司,运营露营地及营地活动", + "呼伦贝尔呼籁研学文化旅游有限责任公司,开展研学旅行和自然教育", + "内蒙古呼籁培训有限公司,负责业务培训及研学教育", + "内蒙古呼籁文化科技有限公司,从事技术研发与AI应用" + ] + }, + { + "title": "管理团队", + "content": "集团管理层由三位联合创始人组成:刘涛负责集团整体运营管理,孙雷负责内容品牌与产品研发,杨春生负责客户服务与牧场供应链运营。集团下设财务与人力资源部、车队、房务部、技术部、售后服务部、运营服务部、营地、客服部、牧场等部门。", + "images": [ + "/images/company/team-01.jpeg", + "/images/company/team-02.jpeg" + ] + }, + { + "title": "主要业务", + "businesses": [ + { + "name": "旅行产品", + "description": "呼籁旅行的核心产品为“额吉的故乡”系列,为6天5晚呼伦贝尔亲子私家团产品,以独立成团模式运营,主要服务暑期(5-8月)亲子家庭客群。", + "extra": "此外,集团还运营秋季赏秋产品“游牧的森林”和冬季冰雪产品“嗨 冰雪”,以及面向亲子家庭的“小蒙马”亲子游学营。" + }, + { + "name": "旅游客运", + "description": "集团旗下呼籁旅游客运公司拥有自有车队,为游客提供旅游交通保障服务。" + }, + { + "name": "牧场商贸", + "description": "集团旗下呼伦贝尔呼籁牧场商贸有限公司经营呼伦贝尔地区牛羊肉、奶制品等特色农牧产品,通过微信小程序“呼籁牧场旗舰店”进行线上销售,采用顺丰冷链运输。" + }, + { + "name": "研学教育", + "description": "集团通过呼籁研学文化旅游公司和呼籁培训公司,开展以草原生态、蒙古族文化为主题的研学旅行和自然教育课程。" + }, + { + "name": "营地运营", + "description": "呼籁露营地公司运营自有营地,提供蒙古族文化体验、户外活动等营地服务。" + } + ] + }, + { + "title": "Logo释义", + "content": "“呼籁”一词源自蒙古语,为一种语气助词,象征着草原人对美好的向往。品牌标识中的马形图案取自蒙文“ᠬᠤᠷᠤᠭ”的字形变化,在蒙古族牧民心中马代表着忠诚、温顺、可靠以及长久的陪伴。", + "image": "/images/company/logo-horse.png" + }, + { + "title": "知识产权", + "content": "呼籁文旅集团持有多项注册商标,包括“呼籁”“呼籁旅行”“额吉的故乡”“小蒙马”“呼籁山河”“游牧的森林”“嗨 冰雪”等,覆盖旅游服务、广告、教育等多个商标分类。" + }, + { + "title": "行业资质", + "content": "全资子公司内蒙古呼籁国际旅行有限公司“入选内蒙古自治区旅游协会研学旅游服务商名单”" + }, + { + "title": "企业文化", + "items": [ + { + "label": "企业定位", + "value": "一家以呼伦贝尔为核心目的地的文化旅游综合服务企业。" + }, + { + "label": "企业初衷", + "value": "深耕呼伦贝尔一地的春夏秋冬,把这个目的地打深打透,给每一个选择呼籁的家庭更好的体验。" + }, + { + "label": "企业信念", + "value": "真正值得的旅行,从不只是一趟路,更是一段生命的温度。" + } + ] + } + ], + "gallery": [ + "/images/company/photo-01.jpeg", + "/images/company/photo-02.jpeg", + "/images/company/photo-03.jpeg", + "/images/company/photo-04.jpeg", + "/images/company/photo-05.jpeg", + "/images/company/photo-06.jpeg", + "/images/company/photo-07.jpeg", + "/images/company/photo-08.jpeg", + "/images/company/photo-09.jpeg", + "/images/company/photo-10.jpeg", + "/images/company/photo-11.jpeg", + "/images/company/photo-12.jpeg", + "/images/company/photo-13.jpeg", + "/images/company/photo-14.jpeg", + "/images/company/photo-15.jpeg", + "/images/company/photo-16.jpeg", + "/images/company/photo-17.jpeg", + "/images/company/photo-18.jpeg", + "/images/company/photo-19.jpeg", + "/images/company/photo-20.jpeg", + "/images/company/photo-21.jpeg" + ], + "seo": { + "title": "内蒙古呼籁文旅投资开发集团有限公司 - 呼伦贝尔文化旅游综合服务企业", + "description": "内蒙古呼籁文旅投资开发集团有限公司,成立于2023年10月,是一家以呼伦贝尔为核心目的地的文化旅游综合服务企业,旗下拥有旅行社、旅游客运、露营地、研学基地、牧场商贸、文化科技等多个业务板块。", + "keywords": "呼籁文旅集团,内蒙古呼籁文旅,呼伦贝尔旅游集团,呼籁旅行,呼伦贝尔文旅" + } +} \ No newline at end of file diff --git a/data/courses.json b/data/courses.json index da5372d..02306d1 100644 --- a/data/courses.json +++ b/data/courses.json @@ -216,7 +216,7 @@ "faq": [ { "q": "几岁的孩子适合参加小蒙马研学?", - "a": "3-12岁均可参加。我们按3-6岁(探索组)、7-9岁(探险组)、10-12岁(领袖组)三个年龄段分组设计课程,学习目标和活动难度不同。3岁以下的幼儿建议参加小蒙马夏令营亲子营,全程有家长陪同。" + "a": "3-12岁均可参加。我们按3-6岁(探索组)、7-9岁(探险组)、10-12岁(领袖组)三个年龄段分组设计课程,学习目标和活动难度不同。3岁以下的幼儿建议参加小蒙马亲子游学营,全程有家长陪同。" }, { "q": "孩子不会骑马,马术课能参加吗?", diff --git a/data/faq.json b/data/faq.json index 3373b89..db38b6e 100644 --- a/data/faq.json +++ b/data/faq.json @@ -18,7 +18,7 @@ { "id": "what-products", "question": "呼籁有哪些产品?", - "answer": "呼籁旅行目前有两大产品线:额吉的故乡V9系列和小蒙马夏令营。额吉的故乡V9系列是家庭亲子游产品,一家一单一车,提供5天4晚至7天6晚共6个版本,适合不同假期和偏好的家庭。小蒙马夏令营是亲子夏令营路线,6天5晚,每期8组家庭同行,爸爸妈妈带着孩子一起出发,融入草原写生、非遗研学、民俗体验三大主题。两大产品线都走呼伦贝尔核心线路,区别在于形式:额吉的故乡是私家定制,小蒙马是亲子夏令营。", + "answer": "呼籁旅行目前有两大产品线:额吉的故乡V9系列和小蒙马亲子游学营。额吉的故乡V9系列是家庭亲子游产品,一家一单一车,提供5天4晚至7天6晚共6个版本,适合不同假期和偏好的家庭。小蒙马亲子游学营是亲子游学营路线,6天5晚,每期7-9组家庭同行,5-12岁亲子同行,融入草原写生、非遗研学、民俗体验三大主题,配备双领队和全程摄影师,餐食全含。两大产品线都走呼伦贝尔核心线路,区别在于形式:额吉的故乡是私家定制,小蒙马是亲子游学营。", "relatedLinks": [ { "url": "/products", @@ -61,12 +61,12 @@ }, { "id": "summer-camp-age", - "question": "小蒙马夏令营适合几岁?", - "answer": "小蒙马夏令营是亲子夏令营,爸爸妈妈带着孩子一起参加,适合有学龄儿童的家庭。行程中的活动会根据孩子年龄适配难度,比如骑马教练会匹配合适的马匹,绘画老师会按基础指导,非遗手工也简单易操作。小蒙马和额吉的故乡的区别在于:额吉的故乡是一家一单一车的私家亲子游,小蒙马是每期8组家庭一起出发的亲子夏令营,孩子有伙伴一起玩,大人也能在团队氛围里放松。小蒙马还贴心设计了「爸妈托管」时段,专业工作人员带孩子做游戏,家长可以短暂休息。", + "question": "小蒙马亲子游学营适合几岁?", + "answer": "小蒙马亲子游学营适合5-12岁孩子的家庭,爸爸妈妈带着孩子一起参加。活动设计上不按年龄分组,但每个环节都有弹性——写生、喂驯鹿、捡牛粪不分年龄都能玩;骑马有马匹匹配,小一点的孩子由教练抱着骑。小蒙马和额吉的故乡的区别在于:额吉的故乡是一家一单一车的私家亲子游,小蒙马是每期7-9组家庭一起出发的亲子游学营,孩子有伙伴一起玩,大人也能在团队氛围里放松。小蒙马还配备双领队和全程摄影师,贴心设计了「爸妈托管」时段。", "relatedLinks": [ { "url": "/summer-camp", - "text": "了解小蒙马夏令营" + "text": "了解小蒙马亲子游学营" } ] }, @@ -299,7 +299,7 @@ { "id": "driver-guide-quality", "question": "司机和领队怎么样?", - "answer": "呼籁的司机都经过严格筛选、培训和考核,熟悉呼伦贝尔的每条路线。领队都是经过呼籁体系化培训和严格考核的,统一服务标准。额吉的故乡等一单一团产品配备3管家(车务管家+房务管家+客服管家)+ 1定制师 + 1专属领队,全程只服务您一个家庭,旅拍部分含呼籁自营旅拍服务。小蒙马夏令营配备全程2位亲子领队 + 1位跟拍摄影师 + 专属司机。很多回头客会指定同一位领队,就是因为服务到位、值得信赖。在客户评价中,司机和领队是被提及频率很高的好评项。", + "answer": "呼籁的司机都经过严格筛选、培训和考核,熟悉呼伦贝尔的每条路线。领队都是经过呼籁体系化培训和严格考核的,统一服务标准。额吉的故乡等一单一团产品配备3管家(车务管家+房务管家+客服管家)+ 1定制师 + 1专属领队,全程只服务您一个家庭,旅拍部分含呼籁自营旅拍服务。小蒙马亲子游学营配备全程2位亲子领队 + 1位跟拍摄影师 + 专属司机。很多回头客会指定同一位领队,就是因为服务到位、值得信赖。在客户评价中,司机和领队是被提及频率很高的好评项。", "relatedLinks": [ { "url": "/reviews", diff --git a/data/navigation.json b/data/navigation.json index 7622388..4c54bbe 100644 --- a/data/navigation.json +++ b/data/navigation.json @@ -24,7 +24,7 @@ "season": "冬" }, { - "text": "小蒙马夏令营", + "text": "小蒙马亲子游学营", "to": "/summer-camp", "season": "夏" }, @@ -32,6 +32,11 @@ "text": "小蒙马冬令营", "to": "/winter-camp", "season": "冬" + }, + { + "text": "选版工具", + "to": "/selector", + "highlight": true } ] }, @@ -53,6 +58,10 @@ } ] }, + { + "text": "旅行攻略", + "to": "/blog" + }, { "text": "客户评价", "to": "/reviews", @@ -87,6 +96,14 @@ "text": "关于呼籁", "to": "/about" }, + { + "text": "呼籁旅行", + "to": "/brand" + }, + { + "text": "呼籁文旅集团", + "to": "/company" + }, { "text": "最新动态", "to": "/news" @@ -110,6 +127,14 @@ "text": "关于我们", "to": "/about" }, + { + "text": "呼籁旅行", + "to": "/brand" + }, + { + "text": "呼籁文旅集团", + "to": "/company" + }, { "text": "最新动态", "to": "/news" @@ -136,7 +161,7 @@ "to": "/products/winter" }, { - "text": "小蒙马夏令营", + "text": "小蒙马亲子游学营", "to": "/summer-camp" }, { @@ -156,6 +181,10 @@ "text": "常见问答", "to": "/faq" }, + { + "text": "旅行攻略", + "to": "/blog" + }, { "text": "客户评价", "to": "/reviews" diff --git a/data/news.json b/data/news.json index 4e17997..47cc32f 100644 --- a/data/news.json +++ b/data/news.json @@ -10,11 +10,11 @@ }, { "id": "news-4", - "title": "2026小蒙马亲子夏令营开放报名", + "title": "2026小蒙马亲子游学营开放报名·全面升级2.0版", "date": "2026-02-20", "category": "产品", - "summary": "2026年小蒙马亲子夏令营正式开放报名,6天5晚,每期最多8组家庭,涵盖草原、森林、湿地三大研学模块,全程路虎头等舱车队、专属摄影师跟拍。", - "content": "2026年小蒙马亲子夏令营正式开放报名。小蒙马是呼籁旅行专为家庭设计的深度营地产品,行程6天5晚,每期最多8组家庭同行。课程围绕草原、森林、湿地三大研学模块设计,包含恩和骑马、乌兰山滑草、ATV越野、面包DIY、兰旗果舍等体验。全程配备路虎头等舱车队,每组家庭配专属摄影师全程跟拍。2026年夏季计划开设9期,名额有限,报名请联系定制师获取详细方案和排期。" + "summary": "2026年小蒙马亲子游学营2.0正式开放报名,6天5晚,每期7-9组家庭,5-12岁亲子同行。住宿全面升级、餐食全含、双领队+全程摄影师,2026年计划开设30期。", + "content": "2026年小蒙马亲子游学营2.0正式开放报名。小蒙马是呼籁旅行专为家庭设计的深度亲子游学营产品,行程6天5晚,每期7-9组家庭同行。2025年首发11期期期满员,2026年全面升级至2.0版本。行程融入草原音乐会、写生创作、白桦林非遗研学、亲子马术、做列巴、1200米滑草畅玩、勇士越野车穿越等体验。住宿全面升级(蒙古包+独栋木屋别墅连住2晚+边境景观木屋),餐食全含(5早5中4晚),配备双领队和全程专属摄影师。2026年计划开设30期(早鸟2期+小高峰4期+暑假黄金24期),名额有限,报名请联系定制师。" }, { "id": "news-5", @@ -30,7 +30,7 @@ "date": "2026-01-15", "category": "公告", "summary": "呼籁旅行2025年度接待约18000人次,自2015年创立以来,累计服务家庭突破10000组、39000余人次。感谢每一个信任呼籁的家庭。", - "content": "回顾2025年,呼籁旅行全年接待约18000人次。自2015年创立以来,呼籁累计服务家庭已突破10000组,共计39000余人次踏上呼伦贝尔草原。这一年,额吉的故乡从V8迭代到V9,小蒙马亲子夏令营正式上线,自有车队和自营营地投入运营——这些变化的背后,是每一个选择信任呼籁的家庭给了我们持续投入的底气。2026年,我们会继续深耕呼伦贝尔家庭定制游,把更多精力放在服务本身。" + "content": "回顾2025年,呼籁旅行全年接待约18000人次。自2015年创立以来,呼籁累计服务家庭已突破10000组,共计39000余人次踏上呼伦贝尔草原。这一年,额吉的故乡从V8迭代到V9,小蒙马亲子游学营正式上线,自有车队和自营营地投入运营——这些变化的背后,是每一个选择信任呼籁的家庭给了我们持续投入的底气。2026年,我们会继续深耕呼伦贝尔家庭定制游,把更多精力放在服务本身。" }, { "id": "news-7", diff --git a/data/pricing.json b/data/pricing.json index 6d1004c..30c0498 100644 --- a/data/pricing.json +++ b/data/pricing.json @@ -74,13 +74,13 @@ }, { "id": "summer-camp", - "name": "小蒙马夏令营", - "priceLabel": "详询定制师", - "priceNote": "每期仅限8组家庭,名额有限,请提前联系定制师了解营期和报名方式", + "name": "小蒙马亲子游学营", + "priceLabel": "13960元起", + "priceNote": "早鸟13960元起/1大1小,暑假黄金17960元起/1大1小,含住宿+餐食+门票+活动+双领队+摄影师+研学物料", "highlights": [ "草原写生·非遗研学·民俗体验", - "每期仅限8组家庭", - "含爸妈托管时段" + "每期7-9组家庭,双领队+全程摄影师", + "餐食全含·住宿全程升级" ], "url": "/summer-camp" }, diff --git a/data/products.json b/data/products.json index 469cbf5..b660958 100644 --- a/data/products.json +++ b/data/products.json @@ -1,5 +1,5 @@ { - "narrative": "「额吉的故乡」是蒙古语中对母亲故土的深情称呼。这条定制游产品线从2023年诞生至今,已经迭代到了第9个版本,连续三年累计服务超过10000组家庭。我们根据不同家庭的假期长度、出行偏好和体验诉求,打磨出5个版本——不是简单地增减天数,而是针对每一类家庭的需求重新设计节奏、线路和体验内容。每一个版本都遵循同一个承诺:不拼团,不赶路,不将就。一家一单一车,全程私家定制游,您的假期只属于您的家庭。", + "narrative": "「额吉的故乡」是蒙古语中对母亲故土的深情称呼。这条定制游产品线从2023年诞生至今,已经迭代到了第9个版本,连续三年累计服务近万组家庭。我们根据不同家庭的假期长度、出行偏好和体验诉求,打磨出6个版本——不是简单地增减天数,而是针对每一类家庭的需求重新设计节奏、线路和体验内容。每一个版本都遵循同一个承诺:不拼团,不赶路,不将就。专车专属、独立成团,您的假期只属于您的家庭。", "versions": [ { "id": "v9-5d4n-forest", @@ -380,13 +380,114 @@ } ], "summerCamp": { - "name": "小蒙马夏令营", - "positioning": "孩子在探索世界,你也在找回自己。小蒙马是呼籁旅行打造的呼伦贝尔草原亲子夏令营路线,6天5晚,每期仅限8组家庭同行,爸爸妈妈带着孩子一起出发,行程融入草原写生、非遗研学、民俗体验三大主题,孩子沉浸式学习成长,大人也能真正被照顾、被理解,找回属于自己的节奏。", + "name": "小蒙马亲子游学营", + "version": "2.0", + "slogan": "更懂妈妈的呼伦贝尔亲子游学营", + "positioning": "孩子在探索世界,你也在找回自己。小蒙马是呼籁旅行打造的呼伦贝尔草原亲子游学营路线,6天5晚,每期7-9组家庭同行,爸爸妈妈带着孩子一起出发,行程融入草原写生、非遗研学、民俗体验三大主题,孩子沉浸式学习成长,大人也能真正被照顾、被理解,找回属于自己的节奏。", + "ageRange": "5-12岁", "days": 6, "nights": 5, + "familiesPerSession": "7-9组", "sessions": { "2025": 11, - "2026plan": 30 + "2026": 30, + "2026detail": { + "earlyBird": { + "label": "早鸟优惠", + "count": 2, + "sessions": [ + { "id": 1, "dates": "6.25—6.30" }, + { "id": 2, "dates": "6.30—7.05" } + ] + }, + "shoulder": { + "label": "小高峰", + "count": 4, + "sessions": [ + { "id": 3, "dates": "7.02—7.07" }, + { "id": 4, "dates": "7.04—7.09" }, + { "id": 5, "dates": "7.05—7.10" }, + { "id": 6, "dates": "7.06—7.11" } + ] + }, + "peak": { + "label": "暑假黄金", + "count": 24, + "sessions": [ + { "id": 7, "dates": "7.09—7.14" }, + { "id": 8, "dates": "7.10—7.15" }, + { "id": 9, "dates": "7.11—7.16" }, + { "id": 10, "dates": "7.12—7.17" }, + { "id": 11, "dates": "7.13—7.18" }, + { "id": 12, "dates": "7.14—7.19" }, + { "id": 13, "dates": "7.18—7.23" }, + { "id": 14, "dates": "7.19—7.24" }, + { "id": 15, "dates": "7.20—7.25" }, + { "id": 16, "dates": "7.25—7.30" }, + { "id": 17, "dates": "7.25—7.30" }, + { "id": 18, "dates": "7.26—7.31" }, + { "id": 19, "dates": "7.27—8.01" }, + { "id": 20, "dates": "7.28—8.02" }, + { "id": 21, "dates": "8.01—8.06" }, + { "id": 22, "dates": "8.02—8.07" }, + { "id": 23, "dates": "8.03—8.08" }, + { "id": 24, "dates": "8.04—8.09" }, + { "id": 25, "dates": "8.06—8.11" }, + { "id": 26, "dates": "8.08—8.13" }, + { "id": 27, "dates": "8.09—8.14" }, + { "id": 28, "dates": "8.10—8.15" }, + { "id": 29, "dates": "8.13—8.18" }, + { "id": 30, "dates": "8.15—8.20" } + ] + } + } + }, + "pricing": { + "deposit": 2000, + "depositUnit": "元/人", + "tiers": [ + { + "label": "早鸟优惠", + "sessionRange": "第1-2期", + "adultPrice": 6980, + "childPrice": 5980, + "childNote": "儿童价格为不占床位,仅适用于儿童与两位成人同住同行", + "packages": [ + { "type": "1大1小", "price": 13960 }, + { "type": "2大1小 / 1大2小", "price": 19940 }, + { "type": "2大2小", "price": 25920 } + ] + }, + { + "label": "小高峰", + "sessionRange": "第3-6期", + "adultPrice": 7980, + "childPrice": 6580, + "childNote": "儿童价格为不占床位,仅适用于儿童与两位成人同住同行", + "packages": [ + { "type": "1大1小", "price": 15960 }, + { "type": "2大1小 / 1大2小", "price": 22540 }, + { "type": "2大2小", "price": 29120 } + ] + }, + { + "label": "暑假黄金", + "sessionRange": "第7-30期", + "adultPrice": 8960, + "childPrice": 7980, + "childNote": "儿童价格为不占床位,仅适用于儿童与两位成人同住同行", + "packages": [ + { "type": "1大1小", "price": 17960 }, + { "type": "2大1小 / 1大2小", "price": 24940 }, + { "type": "2大2小", "price": 31920 } + ] + } + ], + "notes": [ + "三档价格差异是因为呼伦贝尔夏季酒店资源、景区运力有淡旺季浮动", + "出发前的价格以实际咨询时为准", + "定金2,000元/人,锁定名额" + ] }, "principles": [ "住得好、不赶路", @@ -394,34 +495,133 @@ "大人孩子都照顾", "走心不走马观花" ], - "coreActivities": [], + "coreActivities": [ + "牧云山顶不插电草原音乐会——蒙古族艺人现场演奏马头琴,没有音响没有舞台", + "呼伦贝尔大草原写生创作——苏苏老师(美术教育11年)现场带课", + "白桦林非遗传承人刘叔现场授课——桦树皮画制作+鄂温克文化", + "恩和亲子马术——先认识马再上马,穿越草原、白桦林、湿地、河流", + "华俄后裔玛妮娅奶奶家——做列巴、参观家庭博物馆、了解四代传承", + "全地形越野车草原穿越——亲子同乘,草原、湿地、河流一路变换", + "乌兰山1200米滑草畅玩不限次——山顶俯瞰额尔古纳河太极图", + "呼籁牧场蒙古族文化研学——搭蒙古包、捡牛粪、熬奶茶、做非遗羊毛毡" + ], "itinerary": [ - "Day1 全国→海拉尔|接机入住,调整状态", - "Day2 海拉尔→牧云山顶音乐会→图嘎营地亲子破冰+游戏互动|爸妈托管时间", - "Day3 图嘎→莫尔格勒河写生→白桦林非遗研学+喂驯鹿→望见林悦|连住两晚不搬家", - "Day4 望见林悦→恩和骑马→华俄后裔家做列巴→UTV→河边烧烤", - "Day5 望见林悦→乌兰山滑草→越野车穿越→民族服饰拍照→烤全羊+篝火晚会", - "Day6 呼籁牧场非遗羊毛毡+蒙古族民俗体验+云朵牧场→午餐后返程" + { + "day": 1, + "title": "小蒙马集合啦!", + "summary": "全国各地→海拉尔|接机入住,签到领研学手册和物料包,自由活动", + "distance": "机场到酒店12公里" + }, + { + "day": 2, + "title": "牧云山顶音乐会·图嘎营地", + "summary": "开营仪式→牧云山顶草原音乐会+旅拍→图嘎营地→午休→孩子托管破冰+爸妈自由时光→篝火+星空", + "distance": "全天车程100公里,分段走,约2小时" + }, + { + "day": 3, + "title": "草原写生·白桦林研学·入住望见林悦", + "summary": "苏苏老师草原写生→白桦林非遗桦树皮画+DIY文创→专属驯鹿+驯鹿园→入住恩和望见林悦(连住2晚)", + "distance": "全天车程210公里,分段走,约2.5小时" + }, + { + "day": 4, + "title": "亲子马术·做列巴·河边烧烤", + "summary": "亲子马术课堂(恩和周边)→玛妮娅奶奶家做列巴+家庭博物馆→全地形越野车→河边烧烤", + "distance": "都在恩和周边,车程很短" + }, + { + "day": 5, + "title": "千米滑草·勇士车穿越·烤全羊", + "summary": "沿中俄边防卡线→乌兰山1200米滑草畅玩→190天边草原→勇士越野车18公里穿越→下午茶→民族服饰拍照→跨国日落→烤全羊+篝火", + "distance": "全天车程210公里,分段走,约3.5小时" + }, + { + "day": 6, + "title": "牧场最后一课·回程", + "summary": "呼籁牧场(捡牛粪+熬奶茶+搭蒙古包+非遗羊毛毡)→颁发草原研学证书→云朵牧场(羊驼+小羊+土拨鼠)→闭营仪式→额尔古纳午餐→海拉尔送机", + "distance": "全天车程190公里,分段走,约3小时" + } + ], + "accommodation": [ + { + "day": "Day 1", + "name": "海堂酒店", + "rating": "携程4.9分", + "description": "房间够大、设施够新、早餐丰富" + }, + { + "day": "Day 2", + "name": "图嘎营地度假酒店·河畔牧居蒙古包", + "rating": "携程4.6分", + "description": "草原深处蒙古包,独立卫浴、24小时热水、空调制暖,推开门就是草原" + }, + { + "day": "Day 3-4", + "name": "望见·林悦·独栋木屋别墅", + "rating": "携程4.8分", + "description": "恩和俄罗斯民族乡,北欧风独栋木屋,连住2晚不搬家,院子大适合孩子跑" + }, + { + "day": "Day 5", + "name": "190天边草原游牧部落·景观木屋", + "rating": "携程4.8分", + "description": "中俄边境制高点,推开门对面就是界河,窗外九曲十八弯彩带河,跨国日落" + } + ], + "included": { + "accommodation": "全程住宿(指定行程内酒店,房源已提前锁定)", + "tickets": "行程内所有门票及活动费", + "meals": "餐食(5早5中4晚,含烤全羊、铁锹烤肉、河边烧烤、中俄家常菜、羊肉火锅;第一天集合日和第六天晚餐不含,其余全含;儿童也已包含早餐)", + "transport": "空调旅游巴士(陆地头等舱车型)", + "transfer": "24小时接机接站", + "leaders": "两位亲子领队(持国家导游证+亲子研学导师证,带亲子团至少三年)", + "photographer": "全程专属摄影师(每日精修照片发群)", + "materials": "研学物料包(含为孩子定制的民族服饰,客服提前确认身高体重)", + "insurance": "旅行社综合险" + }, + "notIncluded": "往返大交通(机票/火车票)、个人消费、旅游意外险(建议自行购买)", + "refundPolicy": [ + { "period": "出发前15天以上取消", "refund": "定金全退" }, + { "period": "出发前8—14天取消", "refund": "定金退还70%" }, + { "period": "出发前4—7天取消", "refund": "定金退还50%" }, + { "period": "出发前3天内取消", "refund": "定金退还20%" } + ], + "groupGuarantee": "每期限6组家庭以上成团。如果某一期没有凑够,出发前15天通知,帮你调到临近的其他期,或者定金全退。", + "travelNotes": [ + "机场选择海拉尔机场,行程为海拉尔起始", + "行程不含满洲里,如想顺便去可集合前先玩1-2天或行程结束后前往", + "第1天为集合日,几点抵达都可以,24小时接机接站", + "返程航班建议17:00以后,最后一天返回海拉尔预计下午14:00左右", + "临近出发统一发送详细《行前攻略》" ], "faq": [ { - "question": "小蒙马夏令营需要家长陪同吗?", - "answer": "是的,小蒙马是亲子夏令营,爸爸妈妈带着孩子一起出发。行程中既有全家共同参与的活动(骑马、写生、做列巴),也贴心设计了「爸妈托管」时段——专业工作人员陪同孩子做游戏,家长可以短暂放松休息。特别适合一个人带孩子出行的妈妈,行程有人安排,孩子有人带着玩,你也能真正歇一歇。" + "question": "孩子5岁和12岁差很多,活动能一起参与吗?", + "answer": "可以。活动设计上不按年龄分组,但每个环节都有弹性——写生、喂驯鹿、捡牛粪这些不分年龄都能玩;骑马有马匹匹配,小一点的孩子由教练抱着骑。教练会根据现场情况照顾节奏。" }, { - "question": "小蒙马和额吉的故乡有什么区别?", - "answer": "两者都是呼籁出品,都走呼伦贝尔核心线路。核心区别在于形式:额吉的故乡是一家一单一车的私家定制游,您的家庭独享车和领队,行程灵活自由。小蒙马是亲子夏令营,每期8组家庭一起出发,融入草原写生、非遗研学、民俗体验三大主题,孩子有伙伴一起学一起玩,大人也能在团队氛围里放松社交。" + "question": "每天在车上要坐多久?", + "answer": "整个行程不走回头路,每天根据活动和住宿分段安排,最长的一段车程约1.5小时。不是一直赶路,基本不用坐车。Day 4在恩和和周边活动,基本不用坐车。车上有零食和水,晕车的孩子提前备好晕车药就行(我们也会准备晕车贴)。" }, { - "question": "行程会不会太赶?孩子体力跟得上吗?", - "answer": "不会。小蒙马的行程设计遵循「舒适适配」原则,充分考虑孩子的体能和注意力。比如牧云山顶音乐会安排在上午精力充沛时段,住宿安排连住两晚减少搬家奔波,每天的活动节奏都留有休息缓冲时间。所有户外活动也会根据孩子年龄适配难度,确保参与感和安全性。" + "question": "下雨了行程怎么办?", + "answer": "草原天气变化快,偶尔下雨很正常。导游会根据天气灵活调整顺序,户外活动和室内体验穿插安排。骑马和滑草在小雨情况下正常进行,暴雨会改为备选方案。雨衣我们会提前准备。" }, { - "question": "夏令营一般什么时候开营?怎么报名?", - "answer": "小蒙马夏令营在每年暑假期间开营,具体开营时间和营期安排会在每年春季公布。2025年成功举办11期,2026年计划开设30期。建议关注呼籁旅行小红书账号或添加微信客服获取最新营期信息和报名方式。" + "question": "草原蚊虫多吗?孩子怎么防?", + "answer": "7-8月草原确实有蚊虫,尤其傍晚。车上常备驱蚊液,营地、酒店也会提前做防蚊处理。建议给孩子带长袖薄外套,傍晚活动时穿上就好。" + }, + { + "question": "一个妈妈带两个孩子,住宿怎么安排?", + "answer": "每组含1间独立双床房,一大两小住一间完全够。价格按「1大2小」组合计算。导游会多照顾一拖二的家庭,这种情况每期都有,不用担心。" + }, + { + "question": "草原上如果孩子生病或受伤怎么办?", + "answer": "导游全部持有急救资质,随队配备急救包。特殊药品建议自己提前买好,当地药店品种有限。恩和、黑山头等乡镇设有卫生院,额尔古纳市有二甲医院,海拉尔有三甲医院(呼伦贝尔市人民医院)。如遇紧急情况,导游会第一时间处理并协调就近就医。" } ], - "differenceFromV9": "小蒙马和额吉的故乡都是呼籁出品,都走呼伦贝尔核心线路,很多体验项目也是同一套标准。核心区别在于形式和节奏:额吉的故乡是一家一单一车的私家定制游,您的家庭独享一辆车和一位领队,行程灵活自由。小蒙马是亲子夏令营形式,每期8组家庭一起出发,融入草原写生、非遗研学、民俗体验三大主题,孩子有伙伴一起学一起玩,大人也能在团队氛围里放松社交。小蒙马还贴心设计了「爸妈托管」时段——专业工作人员陪同孩子做游戏,家长可以短暂放松休息。特别适合一个人带孩子出行的妈妈。" + "differenceFromV9": "小蒙马和额吉的故乡都是呼籁出品,同样6天5晚,同样用心,但设计思路不一样。小蒙马亲子游学营:7-9组家庭拼团出发,孩子有同龄玩伴;两位亲子领队全程带队,家长可以当甩手掌柜;每天都有设计好的研学课程和亲子活动;全程跟拍摄影师,每天精修照片发群;餐食全含,不用操心吃什么。适合想让孩子交朋友、有收获,自己也能放松的家庭。额吉的故乡亲子版:一单一团,你的家庭独享一辆车、一位领队;路线更远,含满洲里,覆盖草原+森林+边境+城市;正餐不含,可以自己探索当地美食;累计10000+家庭选择,国家版权局版权认证产品。适合喜欢自由、一家人按自己节奏走的家庭。" }, "selectionGuide": { "byVacationLength": [ @@ -463,8 +663,8 @@ "recommendation": "v9-6d5n-explore" }, { - "reason": "小蒙马夏令营,8组家庭同行", - "condition": "亲子夏令营", + "reason": "小蒙马亲子游学营,7-9组家庭同行", + "condition": "亲子游学营", "recommendation": "summer-camp" } ], diff --git a/data/reviews.json b/data/reviews.json index b4bb366..e76495c 100644 --- a/data/reviews.json +++ b/data/reviews.json @@ -1,8 +1,9 @@ { "summary": { - "totalCount": 10000, + "totalCount": 82, + "familyCount": "10000+", "approvalRate": "98%", - "approvalRateNote": "基于历年客户行程结束后的满意度反馈统计", + "approvalRateNote": "基于历年客户行程结束后的满意度反馈统计(覆盖10000+组家庭)", "repeatRate": "很多家庭来了还想二刷", "keywords": [ "孩子玩疯了", diff --git a/data/seo.json b/data/seo.json index 511d69e..4a22171 100644 --- a/data/seo.json +++ b/data/seo.json @@ -2,14 +2,14 @@ "pages": { "home": { "title": "呼籁旅行 - 呼伦贝尔亲子游·家庭定制游·一家一单一车", - "description": "呼籁旅行是呼伦贝尔亲子游品牌,深耕呼伦贝尔11年,已服务10000+组家庭。提供5-7天额吉的故乡V9系列亲子定制行程及小蒙马夏令营,一家一单一车,不拼团不赶路。", + "description": "呼籁旅行是呼伦贝尔亲子游品牌,深耕呼伦贝尔11年,已服务近万组家庭。提供5-7天额吉的故乡V9系列亲子定制行程及小蒙马亲子游学营,专车专属独立成团,不拼团不赶路。", "h1": "呼籁旅行 — 呼伦贝尔亲子游", "ogImage": "/images/og-home.jpg", "keywords": "呼伦贝尔亲子游,呼伦贝尔家庭定制游,呼籁旅行,一家一单一车,呼伦贝尔旅游,草原亲子游,额吉的故乡,呼伦贝尔定制游" }, "about": { "title": "关于呼籁旅行 - 品牌故事·旗下9家企业·深耕呼伦贝尔11年", - "description": "呼籁旅行集团旗下9家企业,深耕呼伦贝尔11年,已服务10000+组家庭。了解呼籁的品牌故事、资质认证、服务保障和企业文化。", + "description": "呼籁旅行集团旗下9家企业,深耕呼伦贝尔11年,已服务近万组家庭。了解呼籁的品牌故事、资质认证、服务保障和企业文化。", "h1": "关于呼籁旅行", "ogImage": "/images/og-about.jpg", "keywords": "呼籁旅行,呼伦贝尔旅行社,自有营地,自有车队,呼籁文旅集团,深耕呼伦贝尔11年" @@ -36,7 +36,7 @@ }, "reviews": { "title": "呼伦贝尔亲子游客户评价 - 真实口碑·10000+家庭的选择 - 呼籁旅行", - "description": "查看呼籁旅行呼伦贝尔亲子游客户真实评价,涵盖亲子游、家庭定制游等场景。好评率98%,听听10000+家庭的呼伦贝尔旅行体验。", + "description": "查看呼籁旅行呼伦贝尔亲子游客户真实评价,涵盖亲子游、家庭定制游等场景。基于行程结束后满意度回访统计好评率超98%,听听10000+组家庭的呼伦贝尔旅行体验。", "h1": "客户评价", "ogImage": "/images/og-reviews.jpg", "keywords": "呼伦贝尔旅游评价,呼籁旅行怎么样,呼伦贝尔亲子游评价,呼伦贝尔定制游口碑" @@ -49,11 +49,11 @@ "keywords": "呼伦贝尔穿搭指南,呼伦贝尔行李清单,呼伦贝尔几月份去最好,呼伦贝尔骑马安全,草原旅游注意事项" }, "summer-camp": { - "title": "小蒙马夏令营 - 呼伦贝尔草原亲子夏令营·6天5晚 - 呼籁旅行", - "description": "小蒙马夏令营是呼籁旅行打造的呼伦贝尔草原亲子夏令营路线,6天5晚,每期仅限8组家庭,爸爸妈妈带着孩子一起出发。融入草原写生、非遗研学、民俗体验三大主题,骑马、做列巴、越野穿越、篝火晚会,孩子沉浸式成长,大人也能真正放松。", - "h1": "小蒙马夏令营", + "title": "小蒙马亲子游学营 - 呼伦贝尔草原亲子游学营·6天5晚 - 呼籁旅行", + "description": "小蒙马亲子游学营是呼籁旅行打造的呼伦贝尔草原亲子游学营路线,6天5晚,每期7-9组家庭,5-12岁亲子同行。草原音乐会、写生创作、白桦林非遗研学、亲子马术、做列巴、1200米滑草畅玩,双领队+全程摄影师+餐食全含。2025年11期期期满员,2026年开设30期。", + "h1": "小蒙马亲子游学营", "ogImage": "/images/og-summer-camp.jpg", - "keywords": "呼伦贝尔夏令营,草原亲子夏令营,小蒙马夏令营,呼伦贝尔亲子营,研学旅行" + "keywords": "呼伦贝尔亲子游学营,草原亲子营,小蒙马亲子游学营,呼伦贝尔亲子营,研学旅行,呼伦贝尔夏令营" }, "qualifications": { "title": "资质荣誉 - 三重旅行社资质·1000万责任险·行业认证 - 呼籁旅行", diff --git a/layouts/admin.vue b/layouts/admin.vue index 58e822e..c3ad394 100644 --- a/layouts/admin.vue +++ b/layouts/admin.vue @@ -118,6 +118,8 @@ const menuOptions = computed(() => { label: menuLabel('关于我们'), key: 'g-about', children: [ { label: menuLabel('关于呼籁'), key: '/admin/content/about' }, + { label: menuLabel('呼籁旅行百科'), key: '/admin/content/brand-wiki' }, + { label: menuLabel('呼籁文旅集团'), key: '/admin/content/company-wiki' }, { label: menuLabel('最新动态'), key: '/admin/articles' }, { label: menuLabel('资质荣誉'), key: '/admin/content/qualifications' }, { label: menuLabel('合作伙伴'), key: '/admin/content/partners' }, @@ -169,7 +171,7 @@ const groupMappings = { 'g-products': [], 'g-destinations': ['destinations', 'calendar', 'guides'], 'g-reviews': ['reviews', 'xiaohongshu', 'youji', 'gallery', 'stories'], - 'g-about': ['about', 'articles', 'qualifications', 'partners'], + 'g-about': ['about', 'articles', 'qualifications', 'partners', 'brand-wiki', 'company-wiki'], 'g-settings': ['navigation', 'seo', 'brand', 'images', 'versions', 'customize'], } diff --git a/nuxt.config.js b/nuxt.config.js index 88e9550..f59c7ff 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -15,6 +15,7 @@ export default defineNuxtConfig({ '/products/v9-6d5n-family', '/products/v9-6d5n-explore', '/products/v9-7d6n-family', '/products/v9-7d6n-wild', '/products/autumn', '/products/winter', + '/brand', '/company', '/gallery', '/news', '/calendar', '/stories', '/xiaohongshu', '/youji', '/blog', '/blog/hulunbuir-travel-guide-2026', @@ -25,6 +26,7 @@ export default defineNuxtConfig({ '/blog/hulunbuir-travel-with-toddlers-4-6', '/blog/hulunbuir-travel-tips-avoid-pitfalls', '/blog/grassland-photography-outfit-guide', + '/blog/hulai-red-cross-first-aid-training-2026', '/destinations', '/destinations/moriguole', '/destinations/eergunashire', '/destinations/baihualin', '/destinations/enhe-shiwei', '/destinations/heishantou', '/destinations/manzhouli', diff --git a/package-lock.json b/package-lock.json index bc9e97e..6a63911 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,17 @@ "name": "hulai-website", "version": "1.0.0", "dependencies": { + "@css-render/vue3-ssr": "^0.15.14", + "better-sqlite3": "^12.8.0", + "drizzle-orm": "^0.45.1", "less": "^4.6.4", + "naive-ui": "^2.44.1", + "nodemailer": "^8.0.3", "nuxt": "^3.17.5" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.13", + "drizzle-kit": "^0.31.10" } }, "node_modules/@babel/code-frame": { @@ -462,6 +471,31 @@ "node": ">=18.0.0" } }, + "node_modules/@css-render/plugin-bem": { + "version": "0.15.14", + "resolved": "https://registry.npmjs.org/@css-render/plugin-bem/-/plugin-bem-0.15.14.tgz", + "integrity": "sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==", + "license": "MIT", + "peerDependencies": { + "css-render": "~0.15.14" + } + }, + "node_modules/@css-render/vue3-ssr": { + "version": "0.15.14", + "resolved": "https://registry.npmjs.org/@css-render/vue3-ssr/-/vue3-ssr-0.15.14.tgz", + "integrity": "sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.11" + } + }, + "node_modules/@drizzle-team/brocli": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", + "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/@dxup/nuxt": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@dxup/nuxt/-/nuxt-0.4.0.tgz", @@ -515,6 +549,448 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.4", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", @@ -1100,6 +1576,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" + }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -1765,9 +2247,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1784,9 +2263,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1803,9 +2279,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1822,9 +2295,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1841,9 +2311,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1860,9 +2327,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1879,9 +2343,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1898,9 +2359,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2109,9 +2567,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2128,9 +2583,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2147,9 +2599,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2166,9 +2615,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2185,9 +2631,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2204,9 +2647,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2223,9 +2663,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2242,9 +2679,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2462,9 +2896,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2481,9 +2912,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2500,9 +2928,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2519,9 +2944,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2538,9 +2960,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2557,9 +2976,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2576,9 +2992,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2595,9 +3008,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2809,9 +3219,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2832,9 +3239,6 @@ "cpu": [ "arm" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2855,9 +3259,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2878,9 +3279,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2901,9 +3299,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2924,9 +3319,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3333,9 +3725,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3349,9 +3738,6 @@ "cpu": [ "arm" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3365,9 +3751,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3381,9 +3764,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3397,9 +3777,6 @@ "cpu": [ "loong64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3413,9 +3790,6 @@ "cpu": [ "loong64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3429,9 +3803,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3445,9 +3816,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3461,9 +3829,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3477,9 +3842,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3493,9 +3855,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3509,9 +3868,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3525,9 +3881,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3652,12 +4005,47 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -4281,6 +4669,12 @@ "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", "license": "MIT" }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, "node_modules/autoprefixer": { "version": "10.4.27", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", @@ -4459,6 +4853,20 @@ "node": ">=6.0.0" } }, + "node_modules/better-sqlite3": { + "version": "12.9.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.9.0.tgz", + "integrity": "sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x" + } + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -4477,6 +4885,55 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -4971,6 +5428,22 @@ "postcss": "^8.0.9" } }, + "node_modules/css-render": { + "version": "0.15.14", + "resolved": "https://registry.npmjs.org/css-render/-/css-render-0.15.14.tgz", + "integrity": "sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "~0.8.0", + "csstype": "~3.0.5" + } + }, + "node_modules/css-render/node_modules/csstype": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", + "license": "MIT" + }, "node_modules/css-select": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", @@ -5139,6 +5612,25 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-tz": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz", + "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", + "license": "MIT", + "peerDependencies": { + "date-fns": "^3.0.0 || ^4.0.0" + } + }, "node_modules/db0": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.4.tgz", @@ -5190,6 +5682,30 @@ } } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -5384,6 +5900,631 @@ "url": "https://dotenvx.com" } }, + "node_modules/drizzle-kit": { + "version": "0.31.10", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", + "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "tsx": "^4.21.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/drizzle-orm": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz", + "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -5423,6 +6564,15 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", @@ -5592,6 +6742,12 @@ "bare-events": "^2.7.0" } }, + "node_modules/evtd": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/evtd/-/evtd-0.2.4.tgz", + "integrity": "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==", + "license": "MIT" + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -5615,6 +6771,15 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, "node_modules/exsolve": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", @@ -5755,6 +6920,12 @@ "node": ">= 0.8" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -5829,6 +7000,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/giget": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/giget/-/giget-3.1.2.tgz", @@ -5838,6 +7022,12 @@ "giget": "dist/cli.mjs" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, "node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -5958,6 +7148,15 @@ "node": ">= 0.4" } }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/hookable": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.0.tgz", @@ -6584,6 +7783,12 @@ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -6801,6 +8006,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", @@ -6816,6 +8033,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", @@ -6837,6 +8063,12 @@ "node": ">= 18" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/mlly": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", @@ -6893,6 +8125,38 @@ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "license": "MIT" }, + "node_modules/naive-ui": { + "version": "2.44.1", + "resolved": "https://registry.npmjs.org/naive-ui/-/naive-ui-2.44.1.tgz", + "integrity": "sha512-reo8Esw0p58liZwbUutC7meW24Xbn3EwNv91zReWKm2W4JPu+zfgJRn/F7aO0BFmvN+h2brA2M5lRvYqLq4kuA==", + "license": "MIT", + "dependencies": { + "@css-render/plugin-bem": "^0.15.14", + "@css-render/vue3-ssr": "^0.15.14", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "async-validator": "^4.2.5", + "css-render": "^0.15.14", + "csstype": "^3.1.3", + "date-fns": "^4.1.0", + "date-fns-tz": "^3.2.0", + "evtd": "^0.2.4", + "highlight.js": "^11.8.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "seemly": "^0.3.10", + "treemate": "^0.3.11", + "vdirs": "^0.1.8", + "vooks": "^0.2.12", + "vueuc": "^0.4.65" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -6917,6 +8181,12 @@ "integrity": "sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==", "license": "MIT" }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, "node_modules/needle": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.5.0.tgz", @@ -7133,6 +8403,30 @@ "node": ">=18.12.0" } }, + "node_modules/node-abi": { + "version": "3.89.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -7197,6 +8491,15 @@ "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "license": "MIT" }, + "node_modules/nodemailer": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.5.tgz", + "integrity": "sha512-0PF8Yb1yZuQfQbq+5/pZJrtF6WQcjTd5/S4JOHs9PGFxuTqoB/icwuB44pOdURHJbRKX1PPoJZtY7R4VUoCC8w==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/nopt": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", @@ -7478,6 +8781,15 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -8233,6 +9545,33 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pretty-bytes": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-7.1.0.tgz", @@ -8267,6 +9606,16 @@ "license": "MIT", "optional": true }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/quansync": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", @@ -8327,6 +9676,27 @@ "node": ">= 0.6" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/rc9": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.0.0.tgz", @@ -8470,6 +9840,16 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "devOptional": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -8646,6 +10026,12 @@ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", "license": "MIT" }, + "node_modules/seemly": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.10.tgz", + "integrity": "sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==", + "license": "MIT" + }, "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -8779,6 +10165,51 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-git": { "version": "3.33.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.33.0.tgz", @@ -8982,6 +10413,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-literal": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", @@ -9133,6 +10573,54 @@ "node": ">=18" } }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-fs/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar-stream": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", @@ -9272,6 +10760,12 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/treemate": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/treemate/-/treemate-0.3.11.tgz", + "integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -9279,6 +10773,38 @@ "license": "0BSD", "optional": true }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-fest": { "version": "5.4.4", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", @@ -9368,6 +10894,13 @@ "node": ">=18.12.0" } }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/unenv": { "version": "2.0.0-rc.24", "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", @@ -9730,6 +11263,18 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/vdirs": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/vdirs/-/vdirs-0.1.8.tgz", + "integrity": "sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==", + "license": "MIT", + "dependencies": { + "evtd": "^0.2.2" + }, + "peerDependencies": { + "vue": "^3.0.11" + } + }, "node_modules/vite": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", @@ -10085,6 +11630,18 @@ "@types/estree": "^1.0.0" } }, + "node_modules/vooks": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/vooks/-/vooks-0.2.12.tgz", + "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==", + "license": "MIT", + "dependencies": { + "evtd": "^0.2.2" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", @@ -10142,6 +11699,24 @@ "vue": "^3.5.0" } }, + "node_modules/vueuc": { + "version": "0.4.65", + "resolved": "https://registry.npmjs.org/vueuc/-/vueuc-0.4.65.tgz", + "integrity": "sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==", + "license": "MIT", + "dependencies": { + "@css-render/vue3-ssr": "^0.15.10", + "@juggle/resize-observer": "^3.3.1", + "css-render": "^0.15.10", + "evtd": "^0.2.4", + "seemly": "^0.3.6", + "vdirs": "^0.1.4", + "vooks": "^0.2.4" + }, + "peerDependencies": { + "vue": "^3.0.11" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -10214,6 +11789,12 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, "node_modules/ws": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", diff --git a/pages/about.vue b/pages/about.vue index a975d15..081f8c9 100644 --- a/pages/about.vue +++ b/pages/about.vue @@ -17,7 +17,7 @@ - +
@@ -36,10 +36,10 @@
- + - +
@@ -64,7 +64,7 @@ - +
@@ -103,7 +103,7 @@ + +
+

呼籁旅行百科

+

管理"呼籁旅行"品牌百科页面内容

+
+ + 查看前台 ↗ + 保存 + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ 添加字段 +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + 文本章节 + + 子章节 + + 产品章节 + + 步骤章节 + + 键值对章节 + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/pages/admin/content/company-wiki.vue b/pages/admin/content/company-wiki.vue new file mode 100644 index 0000000..96992ae --- /dev/null +++ b/pages/admin/content/company-wiki.vue @@ -0,0 +1,261 @@ + + + diff --git a/pages/admin/content/courses.vue b/pages/admin/content/courses.vue index 3b29bdf..f054e39 100644 --- a/pages/admin/content/courses.vue +++ b/pages/admin/content/courses.vue @@ -2,7 +2,7 @@
-

小蒙马夏令营

+

小蒙马亲子游学营

管理研学课程体系,对应官网「夏令营」页面

diff --git a/pages/blog/[id].vue b/pages/blog/[id].vue index 9d4312a..2f63482 100644 --- a/pages/blog/[id].vue +++ b/pages/blog/[id].vue @@ -78,8 +78,10 @@ @@ -142,17 +144,17 @@ if (!article.value) { // SEO useHead({ - title: article.value?.seo?.title || article.value?.title, + title: article.value?.seoTitle || article.value?.title, meta: [ - { name: 'description', content: article.value?.seo?.description || article.value?.summary }, - { name: 'keywords', content: article.value?.seo?.keywords || (article.value?.tags || []).join(',') }, + { name: 'description', content: article.value?.seoDescription || article.value?.summary }, + { name: 'keywords', content: article.value?.seoKeywords || (article.value?.tags || []).join(',') }, { name: 'author', content: article.value?.author }, { name: 'article:published_time', content: (article.value?.date || '') + 'T00:00:00+08:00' }, { name: 'article:modified_time', content: (article.value?.date || '') + 'T00:00:00+08:00' }, { name: 'geo.region', content: 'CN-NM' }, { name: 'geo.placename', content: '呼伦贝尔' }, - { property: 'og:title', content: article.value?.seo?.title || article.value?.title }, - { property: 'og:description', content: article.value?.seo?.description || article.value?.summary }, + { property: 'og:title', content: article.value?.seoTitle || article.value?.title }, + { property: 'og:description', content: article.value?.seoDescription || article.value?.summary }, { property: 'og:type', content: 'article' }, { property: 'og:url', content: `https://1814.love/blog/${article.value?.id}` }, { property: 'og:site_name', content: '呼籁旅行' }, @@ -277,13 +279,12 @@ function formatDate(dateStr) { margin-bottom: @space-xl; border-radius: @border-radius-lg; overflow: hidden; - aspect-ratio: 16 / 7; background: @color-primary-bg; &__img { width: 100%; - height: 100%; - object-fit: cover; + height: auto; + display: block; } } @@ -347,6 +348,14 @@ function formatDate(dateStr) { font-weight: @font-weight-bold; } + :deep(img) { + max-width: 100%; + height: auto; + border-radius: @border-radius-lg; + display: block; + margin: 0 auto; + } + :deep(br) { display: block; content: ''; @@ -518,6 +527,22 @@ function formatDate(dateStr) { } } +.sidebar-qrcode { + display: block; + width: 120px; + height: 120px; + border-radius: @border-radius-sm; + object-fit: contain; + margin-bottom: @space-xs; +} + +.sidebar-qrcode-label { + display: block; + font-size: @font-size-xs; + color: @color-text-muted; + margin-bottom: @space-md; +} + .sidebar-articles { list-style: none; margin: 0; diff --git a/pages/blog/index.vue b/pages/blog/index.vue index a3d79af..3ef9c30 100644 --- a/pages/blog/index.vue +++ b/pages/blog/index.vue @@ -37,7 +37,7 @@
@@ -72,15 +72,11 @@
-
-

看完攻略,准备出发了吗?

-

呼籁旅行为每个家庭提供专属定制方案,告诉我们你的需求,我们帮你把行程安排得妥妥的。

- -
+
diff --git a/pages/brand.vue b/pages/brand.vue new file mode 100644 index 0000000..fb68acb --- /dev/null +++ b/pages/brand.vue @@ -0,0 +1,422 @@ + + + + + diff --git a/pages/calendar.vue b/pages/calendar.vue index 163730c..13d4a24 100644 --- a/pages/calendar.vue +++ b/pages/calendar.vue @@ -131,6 +131,12 @@
+ +
@@ -186,7 +192,7 @@ const seasonalEvents = [ { key: 'event-summer', name: '呼伦贝尔夏季旅游最佳期(6-8月)', - description: '呼伦贝尔草原夏季旅游高峰,绿草如茵,那达慕传统节庆,骑马、露营、亲子出行最佳时段。呼籁旅行提供额吉的故乡V9系列定制游及小蒙马亲子夏令营。', + description: '呼伦贝尔草原夏季旅游高峰,绿草如茵,那达慕传统节庆,骑马、露营、亲子出行最佳时段。呼籁旅行提供额吉的故乡V9系列定制游及小蒙马亲子游学营。', startDate: '2026-06-01', endDate: '2026-08-31', }, diff --git a/pages/company.vue b/pages/company.vue new file mode 100644 index 0000000..16b3848 --- /dev/null +++ b/pages/company.vue @@ -0,0 +1,484 @@ + + + + + diff --git a/pages/courses.vue b/pages/courses.vue index 019dfb6..5951a8b 100644 --- a/pages/courses.vue +++ b/pages/courses.vue @@ -3,7 +3,7 @@ @@ -93,10 +93,10 @@ @@ -204,9 +204,9 @@ @@ -223,7 +223,7 @@ useScrollReveal() useBreadcrumbSchema([ { text: '首页', to: '/' }, - { text: '小蒙马夏令营', to: '/summer-camp' }, + { text: '小蒙马亲子游学营', to: '/summer-camp' }, { text: '研学课程体系' }, ]) diff --git a/pages/gallery.vue b/pages/gallery.vue index 7b970fe..49f6c87 100644 --- a/pages/gallery.vue +++ b/pages/gallery.vue @@ -157,6 +157,12 @@ { to: '/contact', text: '咨询旅拍详情' }, ]" /> + + diff --git a/pages/index.vue b/pages/index.vue index cc43c5c..3fba30e 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -7,7 +7,7 @@
-

呼籁旅行是深耕呼伦贝尔11年的专属旅行品牌,创立于2015年,已服务超10000个家庭。不做拼团、不走马观花;提供额吉的故乡V9系列定制游(4-7天)、小蒙马亲子夏令营(6天5晚)及秋冬季专属产品,全程一单一车、独立成团。

+

呼籁旅行是深耕呼伦贝尔11年的专属旅行品牌,创立于2015年,已服务近万组家庭。不做拼团、不走马观花;提供额吉的故乡V9系列定制游(4-7天)、小蒙马亲子游学营(6天5晚)及秋冬季专属产品,全程专车专属、独立成团。

diff --git a/pages/news.vue b/pages/news.vue index d3a89af..45f1a28 100644 --- a/pages/news.vue +++ b/pages/news.vue @@ -53,7 +53,7 @@

草原的风,已经在等您了。

@@ -95,7 +95,7 @@ useBreadcrumbSchema([ author: { '@type': 'Organization', name: '呼籁旅行', url: 'https://1814.love' }, publisher: { '@id': 'https://1814.love/#organization' }, about: { '@type': 'TravelAgency', name: '呼籁旅行', url: 'https://1814.love' }, - keywords: '呼籁旅行,呼伦贝尔旅游,额吉的故乡,小蒙马夏令营', + keywords: '呼籁旅行,呼伦贝尔旅游,额吉的故乡,小蒙马亲子游学营', }), }], }) diff --git a/pages/pricing.vue b/pages/pricing.vue index b520306..0add05a 100644 --- a/pages/pricing.vue +++ b/pages/pricing.vue @@ -36,7 +36,7 @@
-
+

{{ pricing.philosophy.title }}

@@ -108,11 +108,16 @@ + +
diff --git a/pages/products/[id].vue b/pages/products/[id].vue index fd86081..5ac4dca 100644 --- a/pages/products/[id].vue +++ b/pages/products/[id].vue @@ -9,7 +9,7 @@ {{ product.tag }}

{{ seo.h1 || product.name }}

适合:{{ product.audience }}

-

{{ product.days }}天{{ product.nights }}晚 · 一家一单一车

+

{{ product.days }}天{{ product.nights }}晚 · 专车专属·独立成团

diff --git a/pages/products/autumn.vue b/pages/products/autumn.vue index 3c814c0..f98e7d9 100644 --- a/pages/products/autumn.vue +++ b/pages/products/autumn.vue @@ -10,7 +10,7 @@
-

游牧的森林V3系列提供4-7天6个版本的呼伦贝尔秋季定制游,涵盖南线(呼伦贝尔+阿尔山)和北线(呼伦贝尔+大兴安岭)两条主线。所有版本均为独立成团、一家一单一车,不与陌生人拼团。不确定选哪条线,可联系定制师获取推荐。

+

游牧的森林V3系列提供4-7天6个版本的呼伦贝尔秋季定制游,涵盖南线(呼伦贝尔+阿尔山)和北线(呼伦贝尔+大兴安岭)两条主线。所有版本均为独立成团、私家专车,不与陌生人同行。不确定选哪条线,可联系定制师获取推荐。

diff --git a/pages/products/index.vue b/pages/products/index.vue index a5aa020..8f5a10d 100644 --- a/pages/products/index.vue +++ b/pages/products/index.vue @@ -10,7 +10,7 @@
-

额吉的故乡V9系列提供5-7天6个版本的呼伦贝尔亲子游,涵盖森林版、草原版、亲子版、探索版、旷野版等不同需求。所有版本均为独立成团、一家一单一车,不与陌生人拼团。不确定选哪个版本,可使用选版工具进行1分钟匹配,或参考价格参考页了解费用区间。

+

额吉的故乡V9系列提供5-7天6个版本的呼伦贝尔亲子游,涵盖森林版、草原版、亲子版、探索版、旷野版等不同需求。所有版本均为独立成团、专车不拼,不与陌生人同车。不确定选哪个版本,可使用选版工具进行1分钟匹配,或参考价格参考页了解费用区间。

diff --git a/pages/qualifications.vue b/pages/qualifications.vue index 5072b55..8005dd9 100644 --- a/pages/qualifications.vue +++ b/pages/qualifications.vue @@ -95,7 +95,7 @@
-

呼籁旅行已服务超10000个家庭,本页收录来自真实客户的旅行评价,均为未经修改的原始反馈。可按出行场景(亲子、摄影、蜜月等)和关注维度(安全性、性价比、服务质量等)筛选,找到与自己情况最相似的参考评价。

+

呼籁旅行已服务近万组家庭,本页收录来自真实客户的旅行评价,均为未经修改的原始反馈。可按出行场景(亲子、摄影、蜜月等)和关注维度(安全性、性价比、服务质量等)筛选,找到与自己情况最相似的参考评价。

diff --git a/pages/stories/[id].vue b/pages/stories/[id].vue index ccc4335..a0a231f 100644 --- a/pages/stories/[id].vue +++ b/pages/stories/[id].vue @@ -70,7 +70,7 @@
上一个故事 @@ -78,7 +78,7 @@ 下一个故事 @@ -106,7 +106,7 @@ class="sidebar-story" :class="{ 'sidebar-story--active': s.id === story.id }" > - + {{ s.familyType }} {{ s.title }} @@ -146,7 +146,7 @@ const { data: storiesData } = await usePublicApi('stories') const route = useRoute() const allStories = computed(() => storiesData.value?.stories || []) -const story = computed(() => allStories.value.find(s => s.id === route.params.id)) +const story = computed(() => allStories.value.find(s => s.slug === route.params.id)) if (!story.value) { throw createError({ statusCode: 404, statusMessage: '故事不存在' }) @@ -154,23 +154,22 @@ if (!story.value) { // SEO useHead({ - title: story.value.seo.title, + title: story.value.seoTitle || story.value.title, meta: [ - { name: 'description', content: story.value.seo.description }, - { name: 'keywords', content: story.value.seo.keywords }, - { name: 'author', content: story.value.authorName }, + { name: 'description', content: story.value.seoDesc || story.value.subtitle }, + { name: 'keywords', content: `${story.value.familyType},呼伦贝尔亲子游,呼籁旅行,客户故事` }, { name: 'article:published_time', content: story.value.travelDate + '-01T00:00:00+08:00' }, { name: 'geo.region', content: 'CN-NM' }, { name: 'geo.placename', content: '呼伦贝尔' }, - { property: 'og:title', content: story.value.seo.title }, - { property: 'og:description', content: story.value.seo.description }, + { property: 'og:title', content: story.value.seoTitle || story.value.title }, + { property: 'og:description', content: story.value.seoDesc || story.value.subtitle }, { property: 'og:type', content: 'article' }, - { property: 'og:url', content: `https://1814.love/stories/${story.value.id}` }, + { property: 'og:url', content: `https://1814.love/stories/${story.value.slug}` }, { property: 'og:site_name', content: '呼籁旅行' }, { property: 'og:locale', content: 'zh_CN' }, ], link: [ - { rel: 'canonical', href: `https://1814.love/stories/${story.value.id}` }, + { rel: 'canonical', href: `https://1814.love/stories/${story.value.slug}` }, ], }) diff --git a/pages/stories/index.vue b/pages/stories/index.vue index 294abd1..d9a45d5 100644 --- a/pages/stories/index.vue +++ b/pages/stories/index.vue @@ -125,7 +125,7 @@ function getCardProps(story) { rel: 'noopener nofollow', } } - return { to: `/stories/${story.id}` } + return { to: `/stories/${story.slug}` } } diff --git a/pages/summer-camp.vue b/pages/summer-camp.vue index 3636e99..6991b5e 100644 --- a/pages/summer-camp.vue +++ b/pages/summer-camp.vue @@ -2,8 +2,8 @@
@@ -11,7 +11,7 @@
-

小蒙马夏令营:呼伦贝尔草原亲子夏令营,6天5晚,每期限8组家庭,6-12岁儿童适合。亲子同行,非托管模式,草原骑马、篝火晚会、营地课程、牧民拜访等体验。7月旺季需提前2-3个月报名。

+

小蒙马亲子游学营:呼伦贝尔草原亲子游学营2.0,6天5晚,每期7-9组家庭,5-12岁亲子同行。草原音乐会、写生创作、白桦林非遗研学、亲子马术、做列巴、1200米滑草畅玩,双领队+全程摄影师+餐食全含。2025年11期期期满员,2026年开设30期。

@@ -23,7 +23,7 @@
小蒙马 - 小蒙马夏令营吉祥物,一只可爱的蒙古小马形象{{ camp.positioning }}

{{ camp.days }}天{{ camp.nights }}晚 - 每期8组家庭 + 每期7-9组家庭 亲子同行
@@ -49,7 +49,7 @@
小蒙马亲子夏令营在莫日格勒河旁举旗合影,背景是蜿蜒的草原河流 小蒙马夏令营亲子家庭在呼伦贝尔草原上合影,手持小蒙马标志牌 小蒙马夏令营亲子家庭在白桦林合影,家长和孩子们一起开心比耶 小蒙马夏令营结营仪式,家长和孩子们手持结营证书在营地合影2025年成功举办期数
- {{ camp.sessions['2026plan'] }} + {{ camp.sessions['2026'] }} 2026年计划开营期数
- 8 - 每期限定家庭数 + 7-9 + 每期家庭数
@@ -108,7 +108,7 @@ @@ -131,7 +131,11 @@
D{{ day.day || i + 1 }}
-

{{ day.title }}{{ day.summary ? ' ' + day.summary : '' }}

+
+

{{ day.title }}

+

{{ day.summary }}

+

{{ day.distance }}

+
@@ -153,27 +157,27 @@
- +
-

小蒙马夏令营

+

小蒙马亲子游学营

    -
  • 亲子同行,家长和孩子一起出发
  • -
  • 每期8组家庭结伴同行,孩子有玩伴
  • -
  • 草原写生+非遗研学+民俗体验
  • -
  • 设有「爸妈托管」时段,家长也能放松
  • -
  • 孩子有伙伴一起学、一起玩
  • +
  • 7-9组家庭拼团出发,孩子有同龄玩伴
  • +
  • 两位亲子领队全程带队,家长可以当甩手掌柜
  • +
  • 每天都有设计好的研学课程和亲子活动
  • +
  • 全程跟拍摄影师,每天精修照片发群
  • +
  • 餐食全含,不用操心吃什么
  • 6天5晚,节奏舒缓不赶路
-

额吉的故乡V9

+

额吉的故乡·亲子版

    -
  • 全家一起出行,行程灵活自由
  • -
  • 一家一单一车,专属私家定制
  • -
  • 专属领队一对一服务
  • -
  • 行程可根据需求随时调整
  • -
  • 享受亲密家庭时光
  • +
  • 一单一团,你的家庭独享一辆车、一位领队
  • +
  • 路线更远,含满洲里,覆盖草原+森林+边境+城市
  • +
  • 正餐不含,可以自己探索当地美食
  • +
  • 累计10000+家庭选择,国家版权局版权认证产品
  • +
  • 行程灵活自由,按自己节奏走
  • 4-7天多版本可选
查看V9系列 → @@ -204,7 +208,7 @@ title="想了解家庭一起出行的产品?" description="额吉的故乡V9系列,一家一单一车,全家共享草原时光" :links="[ - { to: '/contact', text: '咨询小蒙马夏令营' }, + { to: '/contact', text: '咨询小蒙马亲子游学营' }, { to: '/products', text: '查看额吉的故乡V9系列' }, ]" /> @@ -222,7 +226,7 @@ useScrollReveal() useBreadcrumbSchema([ { text: '首页', to: '/' }, - { text: '小蒙马夏令营' }, + { text: '小蒙马亲子游学营' }, ]) useSummerCampSchema(camp.value) @@ -427,13 +431,30 @@ const campFAQ = computed(() => camp.value?.faq || []) min-width: 32px; } -.itinerary-text { +.itinerary-content { + flex: 1; +} + +.itinerary-title { font-size: @font-size-base; + font-weight: @font-weight-medium; + color: @color-text-primary; + margin: 0 0 @space-xs; +} + +.itinerary-text { + font-size: @font-size-sm; color: @color-text-secondary; line-height: @line-height-base; margin: 0; } +.itinerary-distance { + font-size: @font-size-xs; + color: @color-text-muted; + margin: @space-xs 0 0; +} + // 核心活动 .activities-grid { .grid-responsive(); diff --git a/public/.well-known/llms.txt b/public/.well-known/llms.txt index 89d72d6..0ec3323 100644 --- a/public/.well-known/llms.txt +++ b/public/.well-known/llms.txt @@ -1,6 +1,6 @@ # 呼籁旅行(HULAI TRAVEL) > 呼伦贝尔家庭定制游品牌,一家一单一车,深耕11年,已服务10000+组家庭。 官网:https://1814.love -产品:额吉的故乡V9系列(4-7天定制游)、小蒙马夏令营(6天5晚亲子营) +产品:额吉的故乡V9系列(4-7天定制游)、小蒙马亲子游学营(6天5晚·每期7-9组家庭·5-12岁) 联系:微信 hulai1814 / 电话 4000881814 详细信息:https://1814.love/llms.txt diff --git a/public/images/brand/logo-horse.png b/public/images/brand/logo-horse.png new file mode 100644 index 0000000..cde9921 Binary files /dev/null and b/public/images/brand/logo-horse.png differ diff --git a/public/images/brand/logo.png b/public/images/brand/logo.png new file mode 100644 index 0000000..07f4969 Binary files /dev/null and b/public/images/brand/logo.png differ diff --git a/public/images/brand/photo-01.jpeg b/public/images/brand/photo-01.jpeg new file mode 100644 index 0000000..dcf0aa9 Binary files /dev/null and b/public/images/brand/photo-01.jpeg differ diff --git a/public/images/brand/photo-02.jpeg b/public/images/brand/photo-02.jpeg new file mode 100644 index 0000000..19dedcc Binary files /dev/null and b/public/images/brand/photo-02.jpeg differ diff --git a/public/images/brand/photo-03.jpeg b/public/images/brand/photo-03.jpeg new file mode 100644 index 0000000..2c42cf9 Binary files /dev/null and b/public/images/brand/photo-03.jpeg differ diff --git a/public/images/brand/photo-04.jpeg b/public/images/brand/photo-04.jpeg new file mode 100644 index 0000000..626da9c Binary files /dev/null and b/public/images/brand/photo-04.jpeg differ diff --git a/public/images/brand/photo-05.jpeg b/public/images/brand/photo-05.jpeg new file mode 100644 index 0000000..8fb6f80 Binary files /dev/null and b/public/images/brand/photo-05.jpeg differ diff --git a/public/images/brand/photo-06.jpeg b/public/images/brand/photo-06.jpeg new file mode 100644 index 0000000..03dcfff Binary files /dev/null and b/public/images/brand/photo-06.jpeg differ diff --git a/public/images/brand/photo-07.jpeg b/public/images/brand/photo-07.jpeg new file mode 100644 index 0000000..974b117 Binary files /dev/null and b/public/images/brand/photo-07.jpeg differ diff --git a/public/images/brand/photo-08.jpeg b/public/images/brand/photo-08.jpeg new file mode 100644 index 0000000..4a346cd Binary files /dev/null and b/public/images/brand/photo-08.jpeg differ diff --git a/public/images/brand/photo-09.jpeg b/public/images/brand/photo-09.jpeg new file mode 100644 index 0000000..8bf36e4 Binary files /dev/null and b/public/images/brand/photo-09.jpeg differ diff --git a/public/images/brand/photo-10.jpeg b/public/images/brand/photo-10.jpeg new file mode 100644 index 0000000..89054e8 Binary files /dev/null and b/public/images/brand/photo-10.jpeg differ diff --git a/public/images/brand/photo-11.jpeg b/public/images/brand/photo-11.jpeg new file mode 100644 index 0000000..7b3b715 Binary files /dev/null and b/public/images/brand/photo-11.jpeg differ diff --git a/public/images/brand/photo-12.jpeg b/public/images/brand/photo-12.jpeg new file mode 100644 index 0000000..d60890d Binary files /dev/null and b/public/images/brand/photo-12.jpeg differ diff --git a/public/images/brand/photo-13.jpeg b/public/images/brand/photo-13.jpeg new file mode 100644 index 0000000..8d30182 Binary files /dev/null and b/public/images/brand/photo-13.jpeg differ diff --git a/public/images/brand/photo-14.jpeg b/public/images/brand/photo-14.jpeg new file mode 100644 index 0000000..9752a64 Binary files /dev/null and b/public/images/brand/photo-14.jpeg differ diff --git a/public/images/brand/photo-15.jpeg b/public/images/brand/photo-15.jpeg new file mode 100644 index 0000000..23e8f10 Binary files /dev/null and b/public/images/brand/photo-15.jpeg differ diff --git a/public/images/brand/photo-16.jpeg b/public/images/brand/photo-16.jpeg new file mode 100644 index 0000000..aa62265 Binary files /dev/null and b/public/images/brand/photo-16.jpeg differ diff --git a/public/images/brand/photo-17.jpeg b/public/images/brand/photo-17.jpeg new file mode 100644 index 0000000..d3f559d Binary files /dev/null and b/public/images/brand/photo-17.jpeg differ diff --git a/public/images/brand/photo-18.jpeg b/public/images/brand/photo-18.jpeg new file mode 100644 index 0000000..64cced9 Binary files /dev/null and b/public/images/brand/photo-18.jpeg differ diff --git a/public/images/brand/photo-19.jpeg b/public/images/brand/photo-19.jpeg new file mode 100644 index 0000000..98afe60 Binary files /dev/null and b/public/images/brand/photo-19.jpeg differ diff --git a/public/images/brand/photo-20.jpeg b/public/images/brand/photo-20.jpeg new file mode 100644 index 0000000..b7dfa62 Binary files /dev/null and b/public/images/brand/photo-20.jpeg differ diff --git a/public/images/brand/photo-21.jpeg b/public/images/brand/photo-21.jpeg new file mode 100644 index 0000000..11ae6dd Binary files /dev/null and b/public/images/brand/photo-21.jpeg differ diff --git a/public/images/brand/photo-22.jpeg b/public/images/brand/photo-22.jpeg new file mode 100644 index 0000000..f2a4f12 Binary files /dev/null and b/public/images/brand/photo-22.jpeg differ diff --git a/public/images/brand/photo-23.jpeg b/public/images/brand/photo-23.jpeg new file mode 100644 index 0000000..6aed4a7 Binary files /dev/null and b/public/images/brand/photo-23.jpeg differ diff --git a/public/images/company/logo-horse.png b/public/images/company/logo-horse.png new file mode 100644 index 0000000..cde9921 Binary files /dev/null and b/public/images/company/logo-horse.png differ diff --git a/public/images/company/logo.png b/public/images/company/logo.png new file mode 100644 index 0000000..07f4969 Binary files /dev/null and b/public/images/company/logo.png differ diff --git a/public/images/company/photo-01.jpeg b/public/images/company/photo-01.jpeg new file mode 100644 index 0000000..f2a4f12 Binary files /dev/null and b/public/images/company/photo-01.jpeg differ diff --git a/public/images/company/photo-02.jpeg b/public/images/company/photo-02.jpeg new file mode 100644 index 0000000..6aed4a7 Binary files /dev/null and b/public/images/company/photo-02.jpeg differ diff --git a/public/images/company/photo-03.jpeg b/public/images/company/photo-03.jpeg new file mode 100644 index 0000000..dcf0aa9 Binary files /dev/null and b/public/images/company/photo-03.jpeg differ diff --git a/public/images/company/photo-04.jpeg b/public/images/company/photo-04.jpeg new file mode 100644 index 0000000..19dedcc Binary files /dev/null and b/public/images/company/photo-04.jpeg differ diff --git a/public/images/company/photo-05.jpeg b/public/images/company/photo-05.jpeg new file mode 100644 index 0000000..2c42cf9 Binary files /dev/null and b/public/images/company/photo-05.jpeg differ diff --git a/public/images/company/photo-06.jpeg b/public/images/company/photo-06.jpeg new file mode 100644 index 0000000..626da9c Binary files /dev/null and b/public/images/company/photo-06.jpeg differ diff --git a/public/images/company/photo-07.jpeg b/public/images/company/photo-07.jpeg new file mode 100644 index 0000000..8fb6f80 Binary files /dev/null and b/public/images/company/photo-07.jpeg differ diff --git a/public/images/company/photo-08.jpeg b/public/images/company/photo-08.jpeg new file mode 100644 index 0000000..03dcfff Binary files /dev/null and b/public/images/company/photo-08.jpeg differ diff --git a/public/images/company/photo-09.jpeg b/public/images/company/photo-09.jpeg new file mode 100644 index 0000000..974b117 Binary files /dev/null and b/public/images/company/photo-09.jpeg differ diff --git a/public/images/company/photo-10.jpeg b/public/images/company/photo-10.jpeg new file mode 100644 index 0000000..4a346cd Binary files /dev/null and b/public/images/company/photo-10.jpeg differ diff --git a/public/images/company/photo-11.jpeg b/public/images/company/photo-11.jpeg new file mode 100644 index 0000000..8bf36e4 Binary files /dev/null and b/public/images/company/photo-11.jpeg differ diff --git a/public/images/company/photo-12.jpeg b/public/images/company/photo-12.jpeg new file mode 100644 index 0000000..89054e8 Binary files /dev/null and b/public/images/company/photo-12.jpeg differ diff --git a/public/images/company/photo-13.jpeg b/public/images/company/photo-13.jpeg new file mode 100644 index 0000000..7b3b715 Binary files /dev/null and b/public/images/company/photo-13.jpeg differ diff --git a/public/images/company/photo-14.jpeg b/public/images/company/photo-14.jpeg new file mode 100644 index 0000000..d60890d Binary files /dev/null and b/public/images/company/photo-14.jpeg differ diff --git a/public/images/company/photo-15.jpeg b/public/images/company/photo-15.jpeg new file mode 100644 index 0000000..8d30182 Binary files /dev/null and b/public/images/company/photo-15.jpeg differ diff --git a/public/images/company/photo-16.jpeg b/public/images/company/photo-16.jpeg new file mode 100644 index 0000000..9752a64 Binary files /dev/null and b/public/images/company/photo-16.jpeg differ diff --git a/public/images/company/photo-17.jpeg b/public/images/company/photo-17.jpeg new file mode 100644 index 0000000..23e8f10 Binary files /dev/null and b/public/images/company/photo-17.jpeg differ diff --git a/public/images/company/photo-18.jpeg b/public/images/company/photo-18.jpeg new file mode 100644 index 0000000..aa62265 Binary files /dev/null and b/public/images/company/photo-18.jpeg differ diff --git a/public/images/company/photo-19.jpeg b/public/images/company/photo-19.jpeg new file mode 100644 index 0000000..98afe60 Binary files /dev/null and b/public/images/company/photo-19.jpeg differ diff --git a/public/images/company/photo-20.jpeg b/public/images/company/photo-20.jpeg new file mode 100644 index 0000000..b7dfa62 Binary files /dev/null and b/public/images/company/photo-20.jpeg differ diff --git a/public/images/company/photo-21.jpeg b/public/images/company/photo-21.jpeg new file mode 100644 index 0000000..11ae6dd Binary files /dev/null and b/public/images/company/photo-21.jpeg differ diff --git a/public/images/company/team-01.jpeg b/public/images/company/team-01.jpeg new file mode 100644 index 0000000..d3f559d Binary files /dev/null and b/public/images/company/team-01.jpeg differ diff --git a/public/images/company/team-02.jpeg b/public/images/company/team-02.jpeg new file mode 100644 index 0000000..64cced9 Binary files /dev/null and b/public/images/company/team-02.jpeg differ diff --git a/public/images/training/red-cross-bandage-practice-2026.jpg b/public/images/training/red-cross-bandage-practice-2026.jpg new file mode 100644 index 0000000..8d8bc55 Binary files /dev/null and b/public/images/training/red-cross-bandage-practice-2026.jpg differ diff --git a/public/images/training/red-cross-cpr-lecture-2026.jpg b/public/images/training/red-cross-cpr-lecture-2026.jpg new file mode 100644 index 0000000..09450e7 Binary files /dev/null and b/public/images/training/red-cross-cpr-lecture-2026.jpg differ diff --git a/public/images/training/red-cross-first-aid-2026.jpg b/public/images/training/red-cross-first-aid-2026.jpg new file mode 100644 index 0000000..4492f41 Binary files /dev/null and b/public/images/training/red-cross-first-aid-2026.jpg differ diff --git a/public/images/training/red-cross-training-scene-2026.jpg b/public/images/training/red-cross-training-scene-2026.jpg new file mode 100644 index 0000000..9952362 Binary files /dev/null and b/public/images/training/red-cross-training-scene-2026.jpg differ diff --git a/public/llms.txt b/public/llms.txt index df78ef7..dc5af2a 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -25,9 +25,10 @@ 费用包含:全程专属用车和司机、精选住宿、专属领队服务、所有体验活动、旅行保险、旅拍服务。无隐形消费,不中途加价。 -### 小蒙马夏令营(亲子夏令营) -呼伦贝尔草原亲子夏令营路线,6天5晚,每期仅限8组家庭。 -爸爸妈妈带着孩子一起出发,融入草原写生、非遗研学、民俗体验三大主题。 +### 小蒙马亲子游学营 +呼伦贝尔草原亲子游学营路线,6天5晚,每期7-9组家庭,5-12岁亲子同行。 +融入草原音乐会、写生创作、白桦林非遗研学、亲子马术、做列巴、1200米滑草等体验。 +配备双领队+全程摄影师,餐食全含(5早5中4晚)。2025年首发11期期期满员,2026年开设30期。 ## 核心优势(为什么选呼籁) 1. 自有营地:呼籁自有草原活动基地,不是拼团景点 @@ -60,8 +61,8 @@ ### 呼伦贝尔几月份去最好? 7月是草原最美的季节(旺季),6月下旬-8月上旬都适合。5月和9月游客少适合错峰。各月温差大,需要按月准备穿搭。 -### 小蒙马夏令营适合几岁? -小蒙马是亲子夏令营,爸爸妈妈带着孩子一起参加,适合有学龄儿童的家庭。活动按孩子年龄适配难度。 +### 小蒙马亲子游学营适合几岁? +小蒙马亲子游学营适合5-12岁孩子的家庭,爸爸妈妈带着孩子一起参加。活动设计每个环节都有弹性,不按年龄分组,教练会根据现场情况照顾节奏。 ## 联系方式 - 微信客服:hulai1814(一对一沟通行程需求) diff --git a/server/api/content/[key].get.js b/server/api/content/[key].get.js index 857864d..42da25b 100644 --- a/server/api/content/[key].get.js +++ b/server/api/content/[key].get.js @@ -24,7 +24,7 @@ function buildFromEntityTable(db, key, siteData) { scenes: [], concerns: [], })) - // 合并 site_content 的 summary(如果有/ + // 合并 site_content 的 summary(如果有/�� const summary = siteData?.summary || { totalCount: items.length, approvalRate: '98%', @@ -158,6 +158,18 @@ export default defineEventHandler(async (event) => { } } + // 虚拟 key:summer-camp 从 products.summerCamp 提取 + if (key === 'summer-camp' && !siteData) { + const productsItem = db.select().from(schema.siteContent) + .where(eq(schema.siteContent.key, 'products')) + .get() + const productsData = productsItem ? JSON.parse(productsItem.data) : null + if (productsData?.summerCamp) { + setHeader(event, 'Cache-Control', 'public, max-age=60') + return productsData.summerCamp + } + } + // 普通 site_content key if (!siteData) { throw createError({ statusCode: 404, message: `未找到配置项: ${key}` }) diff --git a/server/database/seed.js b/server/database/seed.js index c74aa8f..3996cbe 100644 --- a/server/database/seed.js +++ b/server/database/seed.js @@ -163,6 +163,8 @@ const siteConfigs = [ { key: 'youji', label: '游记', file: 'youji.json' }, { key: 'images', label: '图片配置', file: 'images.json' }, { key: 'versions', label: '版本历史', file: 'versions.json' }, + { key: 'brand-wiki', label: '呼籁旅行百科', file: 'brand-wiki.json' }, + { key: 'company-wiki', label: '呼籁文旅集团百科', file: 'company-wiki.json' }, ] const insertSiteContent = db.prepare(` diff --git a/server/routes/sitemap.xml.js b/server/routes/sitemap.xml.js index 0208b7d..6ba063d 100644 --- a/server/routes/sitemap.xml.js +++ b/server/routes/sitemap.xml.js @@ -1,64 +1,105 @@ -export default defineEventHandler((event) => { - const pages = [ - { - url: '/', priority: '1.0', changefreq: 'weekly', - images: [{ loc: '/images/team/hero-grassland.jpg', title: '呼伦贝尔草原风光 - 呼籁旅行' }], - }, - { - url: '/faq', priority: '0.95', changefreq: 'weekly', - images: [], - }, - { - url: '/products', priority: '0.9', changefreq: 'weekly', - images: [{ loc: '/images/mascot/xiaomengma.png', title: '小蒙马夏令营IP形象' }], - }, - { - url: '/about', priority: '0.85', changefreq: 'monthly', - images: [ - { loc: '/images/team/hero-family.jpg', title: '呼伦贝尔家庭游合影' }, - { loc: '/images/team/guide-group.jpg', title: '呼籁旅行领队团队合影' }, - { loc: '/images/mascot/mascot-front.png', title: '呼籁旅行吉祥物' }, - ], - }, - { - url: '/reviews', priority: '0.8', changefreq: 'weekly', - images: [], - }, - { - url: '/contact', priority: '0.8', changefreq: 'monthly', - images: [{ loc: '/images/contact/qrcode-wechat.jpg', title: '呼籁旅行微信客服二维码' }], - }, - { - url: '/guides', priority: '0.8', changefreq: 'monthly', - images: [], - }, - { - url: '/summer-camp', priority: '0.85', changefreq: 'monthly', - images: [ - { loc: '/images/summer-camp/river-banner.jpg', title: '小蒙马夏令营河畔活动' }, - { loc: '/images/summer-camp/grassland-group.jpg', title: '草原亲子夏令营合影' }, - { loc: '/images/summer-camp/birch-group.jpg', title: '白桦林研学活动' }, - { loc: '/images/summer-camp/camp-graduation.jpg', title: '夏令营结营仪式' }, - ], - }, - ] +import { eq, desc } from 'drizzle-orm' +import { useDB, schema } from '../utils/db.js' +export default defineEventHandler((event) => { + const db = useDB() const today = new Date().toISOString().split('T')[0] const base = 'https://1814.love' + // ── 静态页面 ── + const staticPages = [ + { url: '/', priority: '1.0', changefreq: 'weekly', images: [{ loc: '/images/team/hero-grassland.jpg', title: '呼伦贝尔草原风光 - 呼籁旅行' }] }, + { url: '/products', priority: '0.9', changefreq: 'weekly', images: [{ loc: '/images/mascot/xiaomengma.png', title: '小蒙马亲子游学营IP形象' }] }, + { url: '/faq', priority: '0.95', changefreq: 'weekly', images: [] }, + { url: '/reviews', priority: '0.8', changefreq: 'weekly', images: [] }, + { url: '/about', priority: '0.85', changefreq: 'monthly', images: [{ loc: '/images/team/hero-family.jpg', title: '呼伦贝尔家庭游合影' }, { loc: '/images/team/guide-group.jpg', title: '呼籁旅行领队团队合影' }] }, + { url: '/contact', priority: '0.8', changefreq: 'monthly', images: [{ loc: '/images/contact/qrcode-wechat.jpg', title: '呼籁旅行微信客服二维码' }] }, + { url: '/guides', priority: '0.8', changefreq: 'monthly', images: [] }, + { url: '/guide-custom', priority: '0.7', changefreq: 'monthly', images: [] }, + { url: '/summer-camp', priority: '0.85', changefreq: 'monthly', images: [{ loc: '/images/summer-camp/river-banner.jpg', title: '小蒙马亲子游学营河畔活动' }] }, + { url: '/winter-camp', priority: '0.8', changefreq: 'monthly', images: [] }, + { url: '/courses', priority: '0.7', changefreq: 'monthly', images: [] }, + { url: '/blog', priority: '0.9', changefreq: 'weekly', images: [] }, + { url: '/news', priority: '0.7', changefreq: 'weekly', images: [] }, + { url: '/gallery', priority: '0.7', changefreq: 'monthly', images: [] }, + { url: '/stories', priority: '0.7', changefreq: 'monthly', images: [] }, + { url: '/destinations', priority: '0.85', changefreq: 'monthly', images: [] }, + { url: '/calendar', priority: '0.7', changefreq: 'monthly', images: [] }, + { url: '/pricing', priority: '0.8', changefreq: 'monthly', images: [] }, + { url: '/selector', priority: '0.7', changefreq: 'monthly', images: [] }, + { url: '/customize', priority: '0.8', changefreq: 'monthly', images: [] }, + { url: '/brand', priority: '0.7', changefreq: 'monthly', images: [] }, + { url: '/company', priority: '0.6', changefreq: 'monthly', images: [] }, + { url: '/qualifications', priority: '0.6', changefreq: 'monthly', images: [] }, + { url: '/partners', priority: '0.5', changefreq: 'monthly', images: [] }, + { url: '/xiaohongshu', priority: '0.7', changefreq: 'weekly', images: [] }, + { url: '/youji', priority: '0.7', changefreq: 'weekly', images: [] }, + // 产品详情页 + { url: '/products/v9-5d4n-forest', priority: '0.85', changefreq: 'monthly', images: [] }, + { url: '/products/v9-5d4n-prairie', priority: '0.85', changefreq: 'monthly', images: [] }, + { url: '/products/v9-6d5n-family', priority: '0.85', changefreq: 'monthly', images: [] }, + { url: '/products/v9-6d5n-explore', priority: '0.85', changefreq: 'monthly', images: [] }, + { url: '/products/v9-7d6n-family', priority: '0.85', changefreq: 'monthly', images: [] }, + { url: '/products/v9-7d6n-wild', priority: '0.85', changefreq: 'monthly', images: [] }, + { url: '/products/autumn', priority: '0.8', changefreq: 'monthly', images: [] }, + { url: '/products/winter', priority: '0.8', changefreq: 'monthly', images: [] }, + // 目的地详情页 + { url: '/destinations/moriguole', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/eergunashire', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/baihualin', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/enhe-shiwei', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/heishantou', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/manzhouli', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/hulunhu', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/aershan', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/daxinganling', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/aoluguya', priority: '0.75', changefreq: 'monthly', images: [] }, + { url: '/destinations/genhe', priority: '0.75', changefreq: 'monthly', images: [] }, + ] + + // ── 动态页面:从数据库读取已发布的博客文章 ── + const blogArticles = db.select().from(schema.articles) + .where(eq(schema.articles.published, true)) + .orderBy(desc(schema.articles.id)) + .all() + .filter(a => a.type === 'blog') + + const blogPages = blogArticles.map(a => ({ + url: `/blog/${a.slug}`, + priority: '0.8', + changefreq: 'monthly', + lastmod: a.updatedAt ? a.updatedAt.split('T')[0] : (a.createdAt ? a.createdAt.split('T')[0] : today), + images: a.coverImage ? [{ loc: a.coverImage, title: a.title }] : [], + })) + + // ── 动态页面:从数据库读取已发布的客户故事 ── + const stories = db.select().from(schema.stories) + .where(eq(schema.stories.published, true)) + .all() + + const storyPages = stories.map(s => ({ + url: `/stories/${s.slug}`, + priority: '0.7', + changefreq: 'monthly', + lastmod: s.createdAt ? s.createdAt.split('T')[0] : today, + images: s.coverImage ? [{ loc: s.coverImage, title: s.title }] : [], + })) + + const allPages = [...staticPages, ...blogPages, ...storyPages] + const xml = ` -${pages +${allPages .map( (p) => ` ${base}${p.url} - ${today} + ${p.lastmod || today} ${p.changefreq} - ${p.priority}${p.images.map(img => ` + ${p.priority}${(p.images || []).map(img => ` - ${base}${img.loc} - ${img.title} + ${img.loc.startsWith('http') ? img.loc : base + img.loc} + ${escapeXml(img.title)} `).join('')} ` ) @@ -66,5 +107,11 @@ ${pages ` setResponseHeader(event, 'content-type', 'application/xml') + setHeader(event, 'Cache-Control', 'public, max-age=3600') return xml }) + +function escapeXml(str) { + if (!str) return '' + return str.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''') +}