feat: 官网代码全量更新

覆盖最新版本代码,包含:
- 新增品牌百科、公司百科页面及CMS管理
- 新增微信引导组件(WechatCTA)
- 新增品牌/公司图片资源
- 全站组件/页面/数据/样式更新

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
这个提交包含在:
wx 2026-04-16 13:21:11 +08:00
父节点 bd0518eda6
当前提交 ac90205395
共有 113 个文件被更改,包括 4463 次插入405 次删除

12
.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"
}
]
}

查看文件

@ -20,7 +20,7 @@
| 模块 | 当前文件 | 操作类型 | 更新频率 | 说明 |
|------|---------|---------|---------|------|
| **产品版本** | `products.json → versions` | 增、改、删 | 每季 | 产品迭代到V10、新增冬季版等 |
| **小蒙马夏令营** | `products.json → summerCamp` | 改 | 每年 | 年龄、活动、定位调整 |
| **小蒙马亲子游学营** | `products.json → summerCamp` | 改 | 每年 | 年龄、活动、定位调整 |
| **选择指南** | `products.json → selectionGuide` | 改 | 每季 | 新产品上线后需要更新推荐逻辑 |
| **定价说明** | `products.json → pricingPhilosophy` | 改 | 偶尔 | 价格策略调整时 |
| **产品叙事** | `products.json → narrative` | 改 | 偶尔 | 品牌定位调整时 |

查看文件

@ -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

查看文件

@ -6,7 +6,7 @@
<div class="story-photo">
<div class="story-photo-card">
<img
:src="images.brandStory.photo"
:src="images?.brandStory?.photo"
alt="呼籁旅行创始人在呼伦贝尔草原"
width="600"
height="800"
@ -32,8 +32,10 @@
</template>
<script setup>
import images from '~/data/images.json'
defineProps({ story: { type: Object, required: true } })
defineProps({
story: { type: Object, required: true },
images: { type: Object, default: () => ({}) },
})
</script>
<style lang="less" scoped>

查看文件

@ -6,7 +6,7 @@
<div class="mascot-hero">
<div class="mascot-image">
<img
:src="images.mascot.front"
:src="images?.mascot?.front"
alt="籁小咩 - 呼籁旅行品牌IP吉祥物,一只可爱的小羊形象"
width="280"
height="380"
@ -28,7 +28,7 @@
<!-- 草原场景 -->
<div class="mascot-banner">
<img
:src="images.mascot.banner"
:src="images?.mascot?.banner"
alt="籁小咩在呼伦贝尔草原上向你招手"
width="800"
height="300"
@ -40,7 +40,7 @@
<div class="mascot-sticker">
<div class="mascot-sticker-qr">
<img
:src="images.mascot.stickerQr"
:src="images?.mascot?.stickerQr"
alt="籁小咩微信表情包二维码"
width="160"
height="160"
@ -58,7 +58,9 @@
</template>
<script setup>
import images from '~/data/images.json'
defineProps({
images: { type: Object, default: () => ({}) },
})
</script>
<style lang="less" scoped>

查看文件

@ -11,7 +11,7 @@
<div class="team-photo-card">
<div class="team-photo-wrap team-photo-wrap--survey">
<img
:src="images.team.guideGroup"
:src="images?.team?.guideGroup"
alt="2024呼籁文旅车队踩线全体领队合影"
loading="lazy"
/>
@ -24,7 +24,7 @@
<div class="team-photo-card">
<div class="team-photo-wrap team-photo-wrap--survey">
<img
:src="images.team.routeSurvey"
:src="images?.team?.routeSurvey"
alt="2025秋呼籁文旅游牧的森林车队踩线全体领队合影"
loading="lazy"
/>
@ -41,7 +41,7 @@
<div class="team-photo-card">
<div class="team-photo-wrap team-photo-wrap--misc">
<img
:src="images.team.guideTraining"
:src="images?.team?.guideTraining"
alt="呼籁文旅2026年司导线下培训"
loading="lazy"
/>
@ -54,7 +54,7 @@
<div class="team-photo-card">
<div class="team-photo-wrap team-photo-wrap--misc">
<img
:src="images.team.ranchStore"
:src="images?.team?.ranchStore"
alt="呼籁牧场线下店开业团队合影"
loading="lazy"
/>
@ -71,8 +71,10 @@
</template>
<script setup>
import images from '~/data/images.json'
defineProps({ team: { type: Object, required: true } })
defineProps({
team: { type: Object, required: true },
images: { type: Object, default: () => ({}) },
})
</script>
<style lang="less" scoped>

查看文件

@ -7,7 +7,7 @@
<!-- 顶部品牌主页截图作为横幅 -->
<div class="xhs-banner">
<img
:src="images.xiaohongshu.storefront"
:src="images?.xiaohongshu?.storefront"
alt="呼籁旅行小红书品牌主页 - Mr.小雷-呼籁旅行 50万家庭青睐的草原旅行品牌"
width="800"
height="300"
@ -56,8 +56,10 @@
</template>
<script setup>
import images from '~/data/images.json'
defineProps({ xhs: { type: Object, required: true } })
defineProps({
xhs: { type: Object, required: true },
images: { type: Object, default: () => ({}) },
})
</script>
<style lang="less" scoped>

查看文件

@ -0,0 +1,138 @@
<template>
<section class="wechat-cta" :class="`wechat-cta--${bg}`">
<div class="container">
<div class="wechat-cta-inner">
<div class="wechat-cta-text">
<h2 class="wechat-cta-title">{{ title }}</h2>
<p class="wechat-cta-desc">{{ description }}</p>
<div v-if="links && links.length" class="wechat-cta-links">
<NuxtLink
v-for="link in links"
:key="link.to"
:to="link.to"
class="wechat-cta-link"
>
{{ link.text }}
</NuxtLink>
</div>
</div>
<div class="wechat-cta-qr">
<img src="/images/contact/qrcode-wechat.jpg" alt="定制师微信二维码" class="wechat-cta-qrimg" />
<span class="wechat-cta-qrlabel">扫码添加定制师微信</span>
</div>
</div>
</div>
</section>
</template>
<script setup>
defineProps({
title: { type: String, default: '想聊聊行程?扫码找定制师' },
description: { type: String, default: '添加微信,定制师根据你的家庭情况和假期安排,1对1推荐合适的行程方案。' },
links: { type: Array, default: () => [] },
bg: { type: String, default: 'light' },
})
</script>
<style lang="less" scoped>
.wechat-cta {
.section-padding();
}
.wechat-cta--light {
background: @color-bg-gray;
}
.wechat-cta--white {
background: #fff;
}
.wechat-cta--green {
background: linear-gradient(135deg, @color-primary-dark 0%, @color-primary 100%);
.wechat-cta-title {
color: #fff;
&::after { display: none; }
}
.wechat-cta-desc { color: rgba(255, 255, 255, 0.85); }
.wechat-cta-link { color: rgba(255, 255, 255, 0.9); &:hover { color: #fff; } }
.wechat-cta-qrlabel { color: rgba(255, 255, 255, 0.8); }
}
.wechat-cta-inner {
display: flex;
align-items: center;
justify-content: center;
gap: @space-2xl;
max-width: 720px;
margin: 0 auto;
@media (max-width: 640px) {
flex-direction: column;
text-align: center;
gap: @space-lg;
}
}
.wechat-cta-text {
flex: 1;
}
.wechat-cta-title {
font-size: @font-size-xl;
font-weight: @font-weight-bold;
color: @color-text-primary;
margin-bottom: @space-sm;
&::after { display: none; }
}
.wechat-cta-desc {
font-size: @font-size-base;
line-height: @line-height-relaxed;
color: @color-text-secondary;
}
.wechat-cta-links {
margin-top: @space-md;
display: flex;
gap: @space-md;
@media (max-width: 640px) {
justify-content: center;
}
}
.wechat-cta-link {
font-size: @font-size-sm;
color: @color-primary;
text-decoration: none;
font-weight: @font-weight-medium;
&:hover {
color: @color-primary-dark;
}
}
.wechat-cta-qr {
flex-shrink: 0;
display: flex;
flex-direction: column;
align-items: center;
gap: @space-xs;
}
.wechat-cta-qrimg {
width: 140px;
height: 140px;
border-radius: @border-radius-sm;
background: #fff;
object-fit: contain;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
}
.wechat-cta-qrlabel {
font-size: @font-size-xs;
color: @color-text-muted;
}
</style>

查看文件

@ -12,8 +12,8 @@
<div class="hero-overlay" />
</div>
<div class="container hero-inner">
<h1 class="hero-title">{{ seo.h1 }}</h1>
<p class="hero-emotional">{{ brand.slogan.emotional }}</p>
<p class="hero-label">{{ seo.h1 }}</p>
<h1 class="hero-emotional">{{ brand.slogan.emotional }}</h1>
<p class="hero-functional">{{ brand.slogan.functional }}</p>
<div class="hero-actions">
<NuxtLink to="/products" class="hero-btn hero-btn--primary">
@ -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;
});
}

查看文件

@ -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组家庭结伴同行,孩子有伙伴大人能放松',

查看文件

@ -32,6 +32,15 @@
{{ h }}
</li>
</ul>
<!-- 价格区间 -->
<div v-if="product.pricing" class="product-price" itemprop="offers" itemscope itemtype="https://schema.org/AggregateOffer">
<meta itemprop="priceCurrency" content="CNY" />
<meta itemprop="lowPrice" :content="String(product.pricing.startPrice)" />
<meta itemprop="highPrice" :content="String(product.pricing.highPeakPrice || product.pricing.peakPrice)" />
<span class="product-price__from">{{ product.pricing.startPrice }}元起</span>
<span class="product-price__note">/ · 价格因日期和住宿等级浮动</span>
</div>
</div>
<!-- 底部 CTA -->
@ -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;

查看文件

@ -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
}

查看文件

@ -8,7 +8,7 @@
<div class="camp-mascot">
<img
:src="images.mascot.xiaomengma"
alt="小蒙马 - 小蒙马夏令营团宠,一只可爱的蒙古小马形象"
alt="小蒙马 - 小蒙马亲子游学营团宠,一只可爱的蒙古小马形象"
width="200"
height="200"
loading="lazy"

查看文件

@ -37,7 +37,7 @@ export function useOrganizationSchema(brandData, contactData, aboutData) {
height: 200,
},
image: 'https://1814.love/images/logo.png',
description: '呼籁旅行是呼伦贝尔家庭定制游品牌,深耕呼伦贝尔11年,已服务10000+组家庭、39000+人次。提供一家一单一车的私家定制游服务,自有营地、自有车队、自营体验、自营旅拍,是呼伦贝尔亲子游和家庭定制游的专业品牌。',
description: '呼籁旅行是呼伦贝尔家庭定制游品牌,深耕呼伦贝尔11年,已服务近万组家庭、近4万人次。提供专车专属的私家定制游服务,自有营地、自有车队、自营体验、自营旅拍,是呼伦贝尔亲子游和家庭定制游的专业品牌。',
slogan: brandData.slogan.emotional,
foundingDate: '2015',
foundingLocation: {
@ -73,7 +73,7 @@ export function useOrganizationSchema(brandData, contactData, aboutData) {
'呼伦贝尔夏令营',
'呼伦贝尔旅行攻略',
'额吉的故乡',
'小蒙马夏令营',
'小蒙马亲子游学营',
],
// 获奖和认证
award: [
@ -88,12 +88,12 @@ export function useOrganizationSchema(brandData, contactData, aboutData) {
{
'@type': 'OfferCatalog',
name: '额吉的故乡V9系列',
description: '呼伦贝尔家庭定制游,一家一单一车,4-7天6个版本,覆盖草原、湿地、森林、边境等核心景观',
description: '呼伦贝尔家庭定制游,专车专属独立成团,4-7天6个版本,覆盖草原、湿地、森林、边境等核心景观',
},
{
'@type': 'OfferCatalog',
name: '小蒙马夏令营',
description: '呼伦贝尔亲子夏令营,6天5晚,每期8组家庭,融入草原写生、非遗研学、民俗体验',
name: '小蒙马亲子游学营',
description: '呼伦贝尔亲子游学营,6天5晚,每期7-9组家庭,融入草原音乐会、写生创作、非遗研学、亲子马术、做列巴等体验',
},
],
},
@ -101,8 +101,8 @@ export function useOrganizationSchema(brandData, contactData, aboutData) {
'@type': 'AggregateRating',
ratingValue: '4.9',
bestRating: '5',
ratingCount: '10000',
reviewCount: '10000',
ratingCount: '82',
reviewCount: '82',
},
numberOfEmployees: {
'@type': 'QuantitativeValue',
@ -149,7 +149,7 @@ export function useWebSiteSchema() {
name: '呼籁旅行',
alternateName: '呼籁旅行官网',
url: 'https://1814.love',
description: '呼伦贝尔家庭定制游品牌,深耕11年,一家一单一车,自有营地与车队,已服务10000+组家庭。提供4-7天额吉的故乡V9系列亲子行程及小蒙马夏令营。',
description: '呼伦贝尔家庭定制游品牌,深耕11年,专车专属独立成团,自有营地与车队,已服务近万组家庭。提供4-7天额吉的故乡V9系列亲子行程及小蒙马亲子游学营。',
inLanguage: 'zh-CN',
publisher: { '@id': 'https://1814.love/#organization' },
potentialAction: {
@ -218,7 +218,7 @@ export function useTouristTripSchema(products) {
priceCurrency: 'CNY',
description: '定制游费用包含:全程专属用车和司机、精选住宿、专属领队服务、所有体验活动、旅行保险、旅拍服务。无隐形消费,不中途加价。',
},
description: '一家一单一车定制游,费用含车辆、住宿、领队、活动、旅拍、保险',
description: '私家定制游,费用含专属用车、住宿、领队、活动、旅拍、保险',
seller: { '@id': 'https://1814.love/#organization' },
},
provider: { '@id': 'https://1814.love/#organization' },
@ -260,8 +260,8 @@ export function useAggregateRatingSchema(summary, reviews) {
ratingValue: '4.9',
bestRating: '5',
worstRating: '1',
ratingCount: String(summary.totalCount),
reviewCount: String(summary.totalCount),
ratingCount: String(reviews ? reviews.length : 0),
reviewCount: String(reviews ? reviews.length : 0),
},
}
@ -331,18 +331,18 @@ export function useSummerCampSchema(camp) {
itinerary: {
'@type': 'ItemList',
numberOfItems: camp.days,
description: `${camp.days}${camp.nights}晚亲子夏令营路线`,
description: `${camp.days}${camp.nights}晚亲子游学营路线`,
itemListElement: (camp.itinerary || []).map((day, i) => ({
'@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',

查看文件

@ -19,7 +19,7 @@ export default function useSEO(pageKey, overrides = {}) {
faq: '呼伦贝尔旅游攻略,呼伦贝尔亲子游攻略,呼伦贝尔多少钱,呼伦贝尔几月去好,呼伦贝尔穿什么',
reviews: '呼伦贝尔旅游评价,呼籁旅行怎么样,呼伦贝尔亲子游评价,呼伦贝尔定制游口碑',
guides: '呼伦贝尔穿搭指南,呼伦贝尔行李清单,呼伦贝尔几月份去最好,呼伦贝尔骑马安全,草原旅游注意事项',
'summer-camp': '呼伦贝尔夏令营,草原亲子夏令营,小蒙马夏令营,呼伦贝尔亲子营,研学旅行',
'summer-camp': '呼伦贝尔亲子游学营,草原亲子营,小蒙马亲子游学营,呼伦贝尔亲子营,研学旅行,呼伦贝尔夏令营',
qualifications: '呼籁旅行资质,旅行社经营许可证,旅游责任险,呼伦贝尔旅行社认证,呼籁荣誉',
news: '呼籁旅行动态,呼伦贝尔旅游资讯,呼籁旅行公告',
contact: '呼籁旅行联系方式,呼伦贝尔定制游咨询,呼籁旅行微信,呼伦贝尔旅游电话',

查看文件

@ -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"
},
{

文件差异因一行或多行过长而隐藏

164
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,呼伦贝尔旅行,呼伦贝尔亲子游,额吉的故乡,呼籁文旅"
}
}

查看文件

@ -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": "所有行程签订正规电子合同"

查看文件

@ -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": "旺季尾声,舒爽清凉"
},
{

157
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": "呼籁文旅集团,内蒙古呼籁文旅,呼伦贝尔旅游集团,呼籁旅行,呼伦贝尔文旅"
}
}

查看文件

@ -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": "孩子不会骑马,马术课能参加吗?",

查看文件

@ -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",

查看文件

@ -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"

查看文件

@ -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",

查看文件

@ -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"
},

查看文件

@ -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"
}
],

查看文件

@ -1,8 +1,9 @@
{
"summary": {
"totalCount": 10000,
"totalCount": 82,
"familyCount": "10000+",
"approvalRate": "98%",
"approvalRateNote": "基于历年客户行程结束后的满意度反馈统计",
"approvalRateNote": "基于历年客户行程结束后的满意度反馈统计覆盖10000+组家庭)",
"repeatRate": "很多家庭来了还想二刷",
"keywords": [
"孩子玩疯了",

查看文件

@ -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万责任险·行业认证 - 呼籁旅行",

查看文件

@ -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'],
}

查看文件

@ -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',

1839
package-lock.json 自动生成的

文件差异内容过多而无法显示 加载差异

查看文件

@ -17,7 +17,7 @@
</section>
<!-- 1. 品牌故事为什么只做呼伦贝尔 -->
<AboutBrandStory v-if="about" :story="about.story" class="reveal" />
<AboutBrandStory v-if="about" :story="about.story" :images="images" class="reveal" />
<!-- 2. 服务旅程跟呼籁出行是什么体验 -->
<section v-if="about" class="section section--gray reveal" aria-label="服务旅程">
@ -36,10 +36,10 @@
</section>
<!-- 3. 团队介绍谁在照顾你 -->
<AboutTeamIntro v-if="about" :team="about.team" class="reveal" />
<AboutTeamIntro v-if="about" :team="about.team" :images="images" class="reveal" />
<!-- 4. 小红书 -->
<AboutXiaohongshuShowcase v-if="about" :xhs="about.xiaohongshu" class="reveal" />
<AboutXiaohongshuShowcase v-if="about" :xhs="about.xiaohongshu" :images="images" class="reveal" />
<!-- 6. 品牌发展历程 -->
<section v-if="about" class="section reveal" aria-label="品牌发展历程">
@ -64,7 +64,7 @@
<!-- 8. 品牌资产知识产权 + 吉祥物 -->
<AboutCopyrightList v-if="about" :copyrights="about.copyrights" :trademark="about.trademark" class="reveal" />
<AboutMascotShowcase class="reveal" />
<AboutMascotShowcase :images="images" class="reveal" />
<!-- 9. 企业文化 -->
<section v-if="about" class="section reveal" aria-label="企业文化">
@ -103,7 +103,7 @@
<!-- CTA -->
<CommonSectionCTA
title="想了解我们的产品?"
description="查看额吉的故乡V9系列和小蒙马夏令营"
description="查看额吉的故乡V9系列和小蒙马亲子游学营"
:links="[
{ to: '/products', text: '查看旅行产品' },
{ to: '/contact', text: '联系定制师' },
@ -118,6 +118,7 @@ import { useOrganizationSchema, useBreadcrumbSchema, usePersonSchema } from '~/c
const { data: about } = await usePublicApi('about')
const { data: brand } = await usePublicApi('brand')
const { data: contact } = await usePublicApi('contact')
const { data: images } = await usePublicApi('images')
const seo = useSEO('about')
useScrollReveal()

查看文件

@ -0,0 +1,257 @@
<template>
<div style="max-width: 1100px">
<n-space justify="space-between" align="center" style="margin-bottom: 20px">
<div>
<h1 style="margin: 0 0 4px; font-size: 20px; font-weight: 600; color: #111827">呼籁旅行百科</h1>
<p style="margin: 0; font-size: 13px; color: #9ca3af">管理"呼籁旅行"品牌百科页面内容</p>
</div>
<n-space>
<n-button tag="a" href="/brand" target="_blank" secondary>查看前台 </n-button>
<n-button type="primary" :loading="saving" @click="save">保存</n-button>
</n-space>
</n-space>
<n-spin :show="!loaded">
<n-collapse :default-expanded-names="['basic']">
<!-- 基本信息 -->
<n-collapse-item title="基本信息" name="basic">
<n-card>
<n-form label-placement="top">
<n-grid :cols="2" :x-gap="12">
<n-gi><n-form-item label="标题"><n-input v-model:value="data.title" /></n-form-item></n-gi>
<n-gi><n-form-item label="Logo 路径"><n-input v-model:value="data.logo" /></n-form-item></n-gi>
</n-grid>
<n-form-item label="副标题">
<n-input v-model:value="data.subtitle" />
</n-form-item>
<n-form-item label="摘要">
<n-input v-model:value="data.summary" type="textarea" :autosize="{ minRows: 3, maxRows: 8 }" />
</n-form-item>
</n-form>
</n-card>
</n-collapse-item>
<!-- 信息框 -->
<n-collapse-item title="信息框" name="infoBox">
<n-card>
<div style="width: 100%">
<div v-for="(_, key) in data.infoBox" :key="key" style="display: flex; gap: 8px; align-items: center; margin-bottom: 8px">
<n-input :value="key" placeholder="字段名" style="width: 160px" @update:value="v => renameKey(data.infoBox, key, v)" />
<n-input v-model:value="data.infoBox[key]" placeholder="值" style="flex: 1" />
<n-button size="tiny" type="error" quaternary @click="delete data.infoBox[key]"></n-button>
</div>
<n-button size="small" type="primary" dashed @click="addInfoBoxItem">添加字段</n-button>
</div>
</n-card>
</n-collapse-item>
<!-- 内容章节 -->
<n-collapse-item title="内容章节" name="sections">
<n-card>
<div style="width: 100%">
<n-card v-for="(sec, i) in data.sections" :key="i" size="small" style="margin-bottom: 16px">
<template #header>
<n-space align="center">
<span style="font-size: 14px; font-weight: 500">{{ sec.title || '新章节' }}</span>
<n-tag :bordered="false" size="small" type="info">{{ getSectionType(sec) }}</n-tag>
<n-button size="tiny" type="error" quaternary @click="data.sections.splice(i, 1)">删除</n-button>
</n-space>
</template>
<n-form label-placement="top">
<n-form-item label="章节标题">
<n-input v-model:value="sec.title" />
</n-form-item>
<!-- 纯文本型 -->
<template v-if="getSectionType(sec) === '文本'">
<n-form-item label="内容">
<n-input v-model:value="sec.content" type="textarea" :autosize="{ minRows: 3, maxRows: 10 }" />
</n-form-item>
<n-form-item v-if="sec.image !== undefined" label="图片路径">
<n-input v-model:value="sec.image" />
</n-form-item>
</template>
<!-- 子章节型品牌历史 -->
<template v-if="getSectionType(sec) === '子章节'">
<n-form-item label="子章节">
<div style="width: 100%">
<n-card v-for="(sub, j) in sec.subsections" :key="j" size="small" style="margin-bottom: 8px">
<template #header>
<n-space align="center">
<span style="font-size: 13px; color: #6b7280">{{ j + 1 }}.</span>
<n-button size="tiny" type="error" quaternary @click="sec.subsections.splice(j, 1)"></n-button>
</n-space>
</template>
<n-form-item label="标题"><n-input v-model:value="sub.title" /></n-form-item>
<n-form-item label="内容"><n-input v-model:value="sub.content" type="textarea" :autosize="{ minRows: 2, maxRows: 6 }" /></n-form-item>
</n-card>
<n-button size="small" type="primary" dashed @click="sec.subsections.push({ title: '', content: '' })">添加子章节</n-button>
</div>
</n-form-item>
</template>
<!-- 产品型 -->
<template v-if="getSectionType(sec) === '产品'">
<n-form-item label="简介">
<n-input v-model:value="sec.intro" type="textarea" :autosize="{ minRows: 2, maxRows: 5 }" />
</n-form-item>
<n-form-item label="产品列表">
<div style="width: 100%">
<n-card v-for="(prod, j) in sec.products" :key="j" size="small" style="margin-bottom: 8px">
<template #header>
<n-space align="center">
<span style="font-size: 13px; color: #6b7280">{{ prod.name || '新产品' }}</span>
<n-button size="tiny" type="error" quaternary @click="sec.products.splice(j, 1)"></n-button>
</n-space>
</template>
<n-form-item label="名称"><n-input v-model:value="prod.name" /></n-form-item>
<n-form-item label="描述"><n-input v-model:value="prod.description" type="textarea" :autosize="{ minRows: 2, maxRows: 6 }" /></n-form-item>
</n-card>
<n-button size="small" type="primary" dashed @click="sec.products.push({ name: '', description: '' })">添加产品</n-button>
</div>
</n-form-item>
</template>
<!-- 步骤型服务流程 -->
<template v-if="getSectionType(sec) === '步骤'">
<n-form-item label="步骤">
<div style="width: 100%">
<div v-for="(step, j) in sec.steps" :key="j" style="display: flex; gap: 8px; align-items: flex-start; margin-bottom: 8px">
<n-input-number v-model:value="step.step" placeholder="序号" style="width: 80px" :min="1" />
<n-input v-model:value="step.name" placeholder="名称" style="width: 140px" />
<n-input v-model:value="step.detail" placeholder="详情" style="flex: 1" />
<n-button size="tiny" type="error" quaternary @click="sec.steps.splice(j, 1)"></n-button>
</div>
<n-button size="small" type="primary" dashed @click="sec.steps.push({ step: sec.steps.length + 1, name: '', detail: '' })">添加步骤</n-button>
</div>
</n-form-item>
</template>
<!-- 键值对型文化理念 -->
<template v-if="getSectionType(sec) === '键值对'">
<n-form-item label="条目">
<div style="width: 100%">
<div v-for="(item, j) in sec.items" :key="j" style="display: flex; gap: 8px; align-items: center; margin-bottom: 8px">
<n-input v-model:value="item.label" placeholder="标签" style="width: 160px" />
<n-input v-model:value="item.value" placeholder="内容" style="flex: 1" />
<n-button size="tiny" type="error" quaternary @click="sec.items.splice(j, 1)"></n-button>
</div>
<n-button size="small" type="primary" dashed @click="sec.items.push({ label: '', value: '' })">添加条目</n-button>
</div>
</n-form-item>
</template>
</n-form>
</n-card>
<n-space style="margin-top: 12px">
<n-button size="small" type="primary" dashed @click="addSection('text')">+ 文本章节</n-button>
<n-button size="small" type="primary" dashed @click="addSection('subsections')">+ 子章节</n-button>
<n-button size="small" type="primary" dashed @click="addSection('products')">+ 产品章节</n-button>
<n-button size="small" type="primary" dashed @click="addSection('steps')">+ 步骤章节</n-button>
<n-button size="small" type="primary" dashed @click="addSection('items')">+ 键值对章节</n-button>
</n-space>
</div>
</n-card>
</n-collapse-item>
<!-- 图库 -->
<n-collapse-item title="图库" name="gallery">
<n-card>
<n-dynamic-input v-model:value="data.gallery" :min="0" placeholder="图片路径,如 /images/brand/xxx.jpg" />
</n-card>
</n-collapse-item>
<!-- SEO -->
<n-collapse-item title="SEO" name="seo">
<n-card>
<n-form label-placement="top">
<n-form-item label="页面标题">
<n-input v-model:value="data.seo.title" />
</n-form-item>
<n-form-item label="描述">
<n-input v-model:value="data.seo.description" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" />
</n-form-item>
<n-form-item label="关键词">
<n-input v-model:value="data.seo.keywords" />
</n-form-item>
</n-form>
</n-card>
</n-collapse-item>
</n-collapse>
</n-spin>
</div>
</template>
<script setup>
import { NButton, NCard, NSpace, NInput, NForm, NFormItem, NSpin, NGrid, NGi, NCollapse, NCollapseItem, NDynamicInput, NInputNumber, NTag } from 'naive-ui'
import { useMessage } from 'naive-ui'
definePageMeta({ layout: 'admin', middleware: 'admin' })
const { adminFetch } = useAdmin()
const message = useMessage()
const data = ref({
title: '', subtitle: '', summary: '', logo: '',
infoBox: {},
sections: [],
gallery: [],
seo: { title: '', description: '', keywords: '' }
})
const loaded = ref(false)
const saving = ref(false)
function getSectionType(sec) {
if (sec.subsections) return '子章节'
if (sec.products) return '产品'
if (sec.steps) return '步骤'
if (sec.items) return '键值对'
return '文本'
}
function addSection(type) {
const templates = {
text: { title: '', content: '' },
subsections: { title: '', subsections: [{ title: '', content: '' }] },
products: { title: '', intro: '', products: [{ name: '', description: '' }] },
steps: { title: '', steps: [{ step: 1, name: '', detail: '' }] },
items: { title: '', items: [{ label: '', value: '' }] },
}
data.value.sections.push(templates[type])
}
function addInfoBoxItem() {
const key = `新字段${Object.keys(data.value.infoBox).length + 1}`
data.value.infoBox[key] = ''
}
function renameKey(obj, oldKey, newKey) {
if (newKey && newKey !== oldKey && !(newKey in obj)) {
const val = obj[oldKey]
delete obj[oldKey]
obj[newKey] = val
}
}
async function load() {
const res = await adminFetch('/api/admin/site-content?key=brand-wiki')
data.value = res.data
if (!data.value.seo) data.value.seo = { title: '', description: '', keywords: '' }
if (!data.value.gallery) data.value.gallery = []
loaded.value = true
}
async function save() {
saving.value = true
try {
await adminFetch('/api/admin/site-content', { method: 'PUT', body: { key: 'brand-wiki', data: data.value } })
message.success('已保存')
} catch (e) {
message.error('保存失败')
} finally {
saving.value = false
}
}
onMounted(load)
</script>

查看文件

@ -0,0 +1,261 @@
<template>
<div style="max-width: 1100px">
<n-space justify="space-between" align="center" style="margin-bottom: 20px">
<div>
<h1 style="margin: 0 0 4px; font-size: 20px; font-weight: 600; color: #111827">呼籁文旅集团百科</h1>
<p style="margin: 0; font-size: 13px; color: #9ca3af">管理"呼籁文旅集团"公司百科页面内容</p>
</div>
<n-space>
<n-button tag="a" href="/company" target="_blank" secondary>查看前台 </n-button>
<n-button type="primary" :loading="saving" @click="save">保存</n-button>
</n-space>
</n-space>
<n-spin :show="!loaded">
<n-collapse :default-expanded-names="['basic']">
<!-- 基本信息 -->
<n-collapse-item title="基本信息" name="basic">
<n-card>
<n-form label-placement="top">
<n-grid :cols="2" :x-gap="12">
<n-gi><n-form-item label="公司名称"><n-input v-model:value="data.title" /></n-form-item></n-gi>
<n-gi><n-form-item label="Logo 路径"><n-input v-model:value="data.logo" /></n-form-item></n-gi>
</n-grid>
<n-form-item label="副标题">
<n-input v-model:value="data.subtitle" />
</n-form-item>
<n-form-item label="摘要">
<n-input v-model:value="data.summary" type="textarea" :autosize="{ minRows: 3, maxRows: 8 }" />
</n-form-item>
</n-form>
</n-card>
</n-collapse-item>
<!-- 信息框 -->
<n-collapse-item title="信息框" name="infoBox">
<n-card>
<div style="width: 100%">
<div v-for="(_, key) in data.infoBox" :key="key" style="display: flex; gap: 8px; align-items: center; margin-bottom: 8px">
<n-input :value="key" placeholder="字段名" style="width: 160px" @update:value="v => renameKey(data.infoBox, key, v)" />
<n-input v-model:value="data.infoBox[key]" placeholder="值" style="flex: 1" />
<n-button size="tiny" type="error" quaternary @click="delete data.infoBox[key]"></n-button>
</div>
<n-button size="small" type="primary" dashed @click="addInfoBoxItem">添加字段</n-button>
</div>
</n-card>
</n-collapse-item>
<!-- 内容章节 -->
<n-collapse-item title="内容章节" name="sections">
<n-card>
<div style="width: 100%">
<n-card v-for="(sec, i) in data.sections" :key="i" size="small" style="margin-bottom: 16px">
<template #header>
<n-space align="center">
<span style="font-size: 14px; font-weight: 500">{{ sec.title || '新章节' }}</span>
<n-tag :bordered="false" size="small" type="info">{{ getSectionType(sec) }}</n-tag>
<n-button size="tiny" type="error" quaternary @click="data.sections.splice(i, 1)">删除</n-button>
</n-space>
</template>
<n-form label-placement="top">
<n-form-item label="章节标题">
<n-input v-model:value="sec.title" />
</n-form-item>
<!-- 纯文本型 -->
<template v-if="getSectionType(sec) === '文本'">
<n-form-item label="内容">
<n-input v-model:value="sec.content" type="textarea" :autosize="{ minRows: 3, maxRows: 10 }" />
</n-form-item>
</template>
<!-- 时间线型发展历程 -->
<template v-if="getSectionType(sec) === '时间线'">
<n-form-item label="时间线">
<div style="width: 100%">
<div v-for="(item, j) in sec.timeline" :key="j" style="display: flex; gap: 8px; align-items: flex-start; margin-bottom: 8px">
<n-input v-model:value="item.year" placeholder="年份" style="width: 120px" />
<n-input v-model:value="item.content" placeholder="事件" type="textarea" :autosize="{ minRows: 1, maxRows: 4 }" style="flex: 1" />
<n-button size="tiny" type="error" quaternary @click="sec.timeline.splice(j, 1)"></n-button>
</div>
<n-button size="small" type="primary" dashed @click="sec.timeline.push({ year: '', content: '' })">添加事件</n-button>
</div>
</n-form-item>
</template>
<!-- 子公司型 -->
<template v-if="getSectionType(sec) === '子公司'">
<n-form-item label="简介">
<n-input v-model:value="sec.intro" type="textarea" :autosize="{ minRows: 2, maxRows: 5 }" />
</n-form-item>
<n-form-item label="子公司列表">
<div style="width: 100%">
<div v-for="(sub, j) in sec.subsidiaries" :key="j" style="display: flex; gap: 8px; align-items: center; margin-bottom: 8px">
<n-input :value="sub" placeholder="子公司描述" style="flex: 1" @update:value="v => sec.subsidiaries[j] = v" />
<n-button size="tiny" type="error" quaternary @click="sec.subsidiaries.splice(j, 1)"></n-button>
</div>
<n-button size="small" type="primary" dashed @click="sec.subsidiaries.push('')">添加子公司</n-button>
</div>
</n-form-item>
</template>
<!-- 业务线型 -->
<template v-if="getSectionType(sec) === '业务线'">
<n-form-item label="业务板块">
<div style="width: 100%">
<n-card v-for="(biz, j) in sec.businesses" :key="j" size="small" style="margin-bottom: 8px">
<template #header>
<n-space align="center">
<span style="font-size: 13px; color: #6b7280">{{ biz.name || '新业务' }}</span>
<n-button size="tiny" type="error" quaternary @click="sec.businesses.splice(j, 1)"></n-button>
</n-space>
</template>
<n-form-item label="名称"><n-input v-model:value="biz.name" /></n-form-item>
<n-form-item label="描述"><n-input v-model:value="biz.description" type="textarea" :autosize="{ minRows: 1, maxRows: 4 }" /></n-form-item>
<n-form-item v-if="biz.extra !== undefined" label="备注"><n-input v-model:value="biz.extra" /></n-form-item>
</n-card>
<n-button size="small" type="primary" dashed @click="sec.businesses.push({ name: '', description: '' })">添加业务</n-button>
</div>
</n-form-item>
</template>
<!-- 键值对型文化理念 -->
<template v-if="getSectionType(sec) === '键值对'">
<n-form-item label="条目">
<div style="width: 100%">
<div v-for="(item, j) in sec.items" :key="j" style="display: flex; gap: 8px; align-items: center; margin-bottom: 8px">
<n-input v-model:value="item.label" placeholder="标签" style="width: 160px" />
<n-input v-model:value="item.value" placeholder="内容" style="flex: 1" />
<n-button size="tiny" type="error" quaternary @click="sec.items.splice(j, 1)"></n-button>
</div>
<n-button size="small" type="primary" dashed @click="sec.items.push({ label: '', value: '' })">添加条目</n-button>
</div>
</n-form-item>
</template>
<!-- 带图片的文本型团队 -->
<template v-if="getSectionType(sec) === '图文'">
<n-form-item label="内容">
<n-input v-model:value="sec.content" type="textarea" :autosize="{ minRows: 3, maxRows: 10 }" />
</n-form-item>
<n-form-item label="图片">
<n-dynamic-input v-model:value="sec.images" :min="0" placeholder="图片路径" />
</n-form-item>
</template>
</n-form>
</n-card>
<n-space style="margin-top: 12px">
<n-button size="small" type="primary" dashed @click="addSection('text')">+ 文本章节</n-button>
<n-button size="small" type="primary" dashed @click="addSection('timeline')">+ 时间线</n-button>
<n-button size="small" type="primary" dashed @click="addSection('subsidiaries')">+ 子公司</n-button>
<n-button size="small" type="primary" dashed @click="addSection('businesses')">+ 业务线</n-button>
<n-button size="small" type="primary" dashed @click="addSection('items')">+ 键值对</n-button>
<n-button size="small" type="primary" dashed @click="addSection('images')">+ 图文</n-button>
</n-space>
</div>
</n-card>
</n-collapse-item>
<!-- 图库 -->
<n-collapse-item title="图库" name="gallery">
<n-card>
<n-dynamic-input v-model:value="data.gallery" :min="0" placeholder="图片路径,如 /images/company/xxx.jpg" />
</n-card>
</n-collapse-item>
<!-- SEO -->
<n-collapse-item title="SEO" name="seo">
<n-card>
<n-form label-placement="top">
<n-form-item label="页面标题">
<n-input v-model:value="data.seo.title" />
</n-form-item>
<n-form-item label="描述">
<n-input v-model:value="data.seo.description" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" />
</n-form-item>
<n-form-item label="关键词">
<n-input v-model:value="data.seo.keywords" />
</n-form-item>
</n-form>
</n-card>
</n-collapse-item>
</n-collapse>
</n-spin>
</div>
</template>
<script setup>
import { NButton, NCard, NSpace, NInput, NForm, NFormItem, NSpin, NGrid, NGi, NCollapse, NCollapseItem, NDynamicInput, NTag } from 'naive-ui'
import { useMessage } from 'naive-ui'
definePageMeta({ layout: 'admin', middleware: 'admin' })
const { adminFetch } = useAdmin()
const message = useMessage()
const data = ref({
title: '', subtitle: '', summary: '', logo: '',
infoBox: {},
sections: [],
gallery: [],
seo: { title: '', description: '', keywords: '' }
})
const loaded = ref(false)
const saving = ref(false)
function getSectionType(sec) {
if (sec.timeline) return '时间线'
if (sec.subsidiaries) return '子公司'
if (sec.businesses) return '业务线'
if (sec.items) return '键值对'
if (sec.images) return '图文'
return '文本'
}
function addSection(type) {
const templates = {
text: { title: '', content: '' },
timeline: { title: '', timeline: [{ year: '', content: '' }] },
subsidiaries: { title: '', intro: '', subsidiaries: [''] },
businesses: { title: '', businesses: [{ name: '', description: '' }] },
items: { title: '', items: [{ label: '', value: '' }] },
images: { title: '', content: '', images: [] },
}
data.value.sections.push(templates[type])
}
function addInfoBoxItem() {
const key = `新字段${Object.keys(data.value.infoBox).length + 1}`
data.value.infoBox[key] = ''
}
function renameKey(obj, oldKey, newKey) {
if (newKey && newKey !== oldKey && !(newKey in obj)) {
const val = obj[oldKey]
delete obj[oldKey]
obj[newKey] = val
}
}
async function load() {
const res = await adminFetch('/api/admin/site-content?key=company-wiki')
data.value = res.data
if (!data.value.seo) data.value.seo = { title: '', description: '', keywords: '' }
if (!data.value.gallery) data.value.gallery = []
loaded.value = true
}
async function save() {
saving.value = true
try {
await adminFetch('/api/admin/site-content', { method: 'PUT', body: { key: 'company-wiki', data: data.value } })
message.success('已保存')
} catch (e) {
message.error('保存失败')
} finally {
saving.value = false
}
}
onMounted(load)
</script>

查看文件

@ -2,7 +2,7 @@
<div>
<n-space justify="space-between" align="center" style="margin-bottom: 20px;">
<div>
<h1 style="margin: 0 0 4px; font-size: 22px; color: #1a1a2e;">小蒙马夏令</h1>
<h1 style="margin: 0 0 4px; font-size: 22px; color: #1a1a2e;">小蒙马亲子游学</h1>
<p style="margin: 0; font-size: 13px; color: #888;">管理研学课程体系对应官网夏令营页面</p>
</div>
<n-space>

查看文件

@ -78,8 +78,10 @@
<!-- 联系咨询 -->
<div class="sidebar-card sidebar-card--cta">
<h3 class="sidebar-card__title">免费获取定制方案</h3>
<p class="sidebar-card__desc">看完攻略有疑问联系呼籁旅行定制师一对一解答</p>
<CommonInternalLink to="/contact" text="立即咨询" />
<p class="sidebar-card__desc">看完攻略有疑问扫码添加定制师微信一对一解答</p>
<img src="/images/contact/qrcode-wechat.jpg" alt="定制师微信二维码" class="sidebar-qrcode" />
<span class="sidebar-qrcode-label">扫码添加定制师微信</span>
<CommonInternalLink to="/contact" text="其他联系方式" />
</div>
<!-- 全部文章 -->
@ -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;

查看文件

@ -37,7 +37,7 @@
<article
v-for="article in filteredArticles"
:key="article.id"
class="blog-card reveal"
class="blog-card"
>
<NuxtLink :to="`/blog/${article.id}`" class="blog-card__link">
<div class="blog-card__cover">
@ -72,15 +72,11 @@
</div>
<!-- CTA -->
<div class="blog-cta">
<h2>看完攻略准备出发了吗</h2>
<p>呼籁旅行为每个家庭提供专属定制方案告诉我们你的需求我们帮你把行程安排得妥妥的</p>
<div class="blog-cta-links">
<CommonInternalLink to="/products" text="查看定制游产品" />
<CommonInternalLink to="/contact" text="咨询定制师" />
<CommonInternalLink to="/faq" text="常见问答" />
</div>
</div>
<CommonWechatCTA
title="看完攻略,准备出发了吗?"
description="扫码添加定制师微信,根据你的家庭情况和假期安排,推荐合适的行程方案。"
:links="[{ to: '/products', text: '查看定制游产品' }, { to: '/faq', text: '常见问答' }]"
/>
</div>
</section>
</div>

422
pages/brand.vue 普通文件
查看文件

@ -0,0 +1,422 @@
<template>
<div class="page-wiki">
<LayoutPageHero
:title="data?.title || '呼籁旅行'"
:subtitle="data?.subtitle"
:breadcrumbs="[{ text: '关于我们', to: '/about' }, { text: '呼籁旅行' }]"
background-image="/images/brand/photo-01.jpeg"
/>
<!-- 摘要 + 信息卡 -->
<section class="section" aria-label="品牌概述">
<div class="container">
<div class="wiki-header">
<div class="wiki-summary">
<div class="wiki-summary-inner">
<h2 class="wiki-summary-heading">品牌简介</h2>
<p class="wiki-summary-text">{{ data?.summary }}</p>
</div>
</div>
<div v-if="data?.infoBox" class="wiki-infobox">
<div class="wiki-infobox-logo">
<img :src="data.logo" :alt="data.title" />
</div>
<div class="wiki-infobox-body">
<div v-for="(value, key) in data.infoBox" :key="key" class="wiki-infobox-row">
<span class="wiki-infobox-label">{{ key }}</span>
<span class="wiki-infobox-value">{{ value }}</span>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 各段落 -->
<template v-for="(section, idx) in data?.sections" :key="idx">
<!-- 品牌历史子段落 -->
<section v-if="section.subsections" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<div v-for="(sub, si) in section.subsections" :key="si" class="wiki-subsection">
<h3 class="wiki-subsection-title">{{ sub.title }}</h3>
<p class="wiki-text">{{ sub.content }}</p>
</div>
</div>
</section>
<!-- 产品及服务 -->
<section v-if="section.products" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<p v-if="section.intro" class="wiki-text">{{ section.intro }}</p>
<div class="wiki-products">
<div v-for="(prod, pi) in section.products" :key="pi" class="wiki-product-card">
<h3 class="wiki-product-name">{{ prod.name }}</h3>
<p class="wiki-product-desc">{{ prod.description }}</p>
</div>
</div>
</div>
</section>
<!-- 服务流程 -->
<section v-if="section.steps" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<div class="wiki-steps">
<div v-for="(s, si) in section.steps" :key="si" class="wiki-step">
<div class="wiki-step-number">{{ s.step }}</div>
<div class="wiki-step-body">
<h4 class="wiki-step-name">{{ s.name }}</h4>
<p class="wiki-step-detail">{{ s.detail }}</p>
</div>
</div>
</div>
</div>
</section>
<!-- 品牌文化items列表 -->
<section v-if="section.items" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<div class="wiki-culture-list">
<div v-for="(item, ii) in section.items" :key="ii" class="wiki-culture-item">
<span class="wiki-culture-label">{{ item.label }}</span>
<p class="wiki-culture-value">{{ item.value }}</p>
</div>
</div>
</div>
</section>
<!-- 普通文本段落含可选图片 -->
<section v-if="section.content && !section.subsections && !section.products && !section.steps && !section.items" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<p class="wiki-text">{{ section.content }}</p>
<div v-if="section.image" class="wiki-logo-img">
<img :src="section.image" :alt="section.title" />
</div>
</div>
</section>
</template>
<!-- 图库 -->
<section v-if="data?.gallery?.length" class="section section--gray" aria-label="品牌图库">
<div class="container">
<h2 class="wiki-section-title">品牌图库</h2>
<div class="wiki-gallery">
<div v-for="(img, gi) in data.gallery" :key="gi" class="wiki-gallery-item">
<img :src="img" :alt="`${data.title} 图片 ${gi + 1}`" loading="lazy" />
</div>
</div>
</div>
</section>
<!-- CTA -->
<CommonSectionCTA
title="想了解更多?"
description="查看我们的旅行产品或直接联系定制师"
:links="[
{ to: '/products', text: '查看旅行产品' },
{ to: '/contact', text: '联系定制师' },
]"
/>
</div>
</template>
<script setup>
import { useBreadcrumbSchema } from '~/composables/useJsonLd'
const { data } = await usePublicApi('brand-wiki')
useSEO('brand-wiki', {
title: data.value?.seo?.title || '呼籁旅行 - 专注呼伦贝尔的家庭旅行品牌',
description: data.value?.seo?.description || '',
})
useBreadcrumbSchema([
{ text: '首页', to: '/' },
{ text: '关于我们', to: '/about' },
{ text: '呼籁旅行' },
])
useScrollReveal()
</script>
<style lang="less" scoped>
.wiki-header {
display: flex;
gap: @space-2xl;
align-items: flex-start;
@media (max-width: 768px) {
flex-direction: column;
gap: @space-xl;
}
}
.wiki-summary {
flex: 1;
min-width: 0;
}
.wiki-summary-inner {
padding: @space-xl @space-2xl;
background: @color-bg-warm;
border-radius: @border-radius-lg;
border-left: 4px solid @color-primary;
}
.wiki-summary-heading {
font-size: @font-size-xl;
font-weight: @font-weight-bold;
color: @color-primary;
margin-bottom: @space-md;
}
.wiki-summary-text {
font-size: @font-size-base;
line-height: 2;
color: @color-text-primary;
margin: 0;
}
.wiki-infobox {
flex-shrink: 0;
width: 360px;
background: @color-bg-white;
border-radius: @border-radius-lg;
overflow: hidden;
box-shadow: @shadow-card;
@media (max-width: 768px) {
width: 100%;
}
}
.wiki-infobox-logo {
display: flex;
justify-content: center;
align-items: center;
padding: @space-xl @space-lg;
background: @color-primary-bg;
border-bottom: 1px solid @color-divider;
img {
max-width: 160px;
height: auto;
}
}
.wiki-infobox-body {
padding: @space-sm 0;
}
.wiki-infobox-row {
display: flex;
padding: @space-sm @space-lg;
border-bottom: 1px solid @color-divider;
gap: @space-md;
&:last-child {
border-bottom: none;
}
}
.wiki-infobox-label {
flex-shrink: 0;
width: 80px;
font-size: @font-size-sm;
font-weight: @font-weight-medium;
color: @color-text-muted;
padding-top: 1px;
}
.wiki-infobox-value {
flex: 1;
font-size: @font-size-sm;
line-height: 1.6;
color: @color-text-primary;
}
.wiki-section-title {
font-size: @font-size-2xl;
font-weight: @font-weight-bold;
color: @color-text-primary;
margin-bottom: @space-lg;
padding-bottom: @space-sm;
border-bottom: 2px solid @color-primary;
display: inline-block;
}
.wiki-text {
font-size: @font-size-base;
line-height: 1.8;
color: @color-text-primary;
max-width: 800px;
}
.wiki-logo-img {
margin-top: @space-lg;
text-align: center;
img {
max-width: 160px;
height: auto;
}
}
.wiki-subsection {
margin-bottom: @space-lg;
&:last-child {
margin-bottom: 0;
}
}
.wiki-subsection-title {
font-size: @font-size-lg;
font-weight: @font-weight-bold;
color: @color-primary;
margin-bottom: @space-sm;
}
.wiki-products {
display: grid;
grid-template-columns: 1fr;
gap: @space-md;
margin-top: @space-lg;
.respond-md({
grid-template-columns: repeat(2, 1fr);
});
}
.wiki-product-card {
padding: @space-lg;
background: @color-bg-white;
border: 1px solid @color-border;
border-radius: @border-radius-lg;
}
.wiki-product-name {
font-size: @font-size-lg;
font-weight: @font-weight-bold;
color: @color-primary;
margin-bottom: @space-sm;
}
.wiki-product-desc {
font-size: @font-size-sm;
line-height: 1.7;
color: @color-text-secondary;
margin: 0;
}
.wiki-steps {
display: flex;
flex-direction: column;
gap: @space-md;
margin-top: @space-lg;
}
.wiki-step {
display: flex;
gap: @space-md;
align-items: flex-start;
}
.wiki-step-number {
flex-shrink: 0;
width: 36px;
height: 36px;
background: @color-primary;
color: #fff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: @font-weight-bold;
font-size: @font-size-sm;
}
.wiki-step-body {
flex: 1;
padding-top: 4px;
}
.wiki-step-name {
font-size: @font-size-base;
font-weight: @font-weight-bold;
color: @color-text-primary;
margin-bottom: @space-xs;
}
.wiki-step-detail {
font-size: @font-size-sm;
line-height: 1.7;
color: @color-text-secondary;
margin: 0;
}
.wiki-culture-list {
display: flex;
flex-direction: column;
gap: @space-lg;
}
.wiki-culture-item {
padding: @space-lg;
background: @color-bg-white;
border-left: 4px solid @color-primary;
border-radius: 0 @border-radius-lg @border-radius-lg 0;
box-shadow: @shadow-sm;
}
.wiki-culture-label {
display: block;
font-size: @font-size-sm;
font-weight: @font-weight-bold;
color: @color-primary;
margin-bottom: @space-xs;
}
.wiki-culture-value {
font-size: @font-size-base;
line-height: 1.8;
color: @color-text-primary;
margin: 0;
}
.wiki-gallery {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: @space-md;
margin-top: @space-lg;
.respond-md({
grid-template-columns: repeat(3, 1fr);
});
.respond-lg({
grid-template-columns: repeat(4, 1fr);
});
}
.wiki-gallery-item {
border-radius: @border-radius-lg;
overflow: hidden;
aspect-ratio: 16 / 10;
img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
&:hover img {
transform: scale(1.05);
}
}
</style>

查看文件

@ -131,6 +131,12 @@
</div>
</section>
<CommonWechatCTA
title="确定了出行时间?扫码找定制师"
description="告诉定制师你的出行日期和家庭情况,帮你匹配最合适的行程方案。"
:links="[{ to: '/products', text: '查看产品线' }]"
/>
</div>
</template>
@ -186,7 +192,7 @@ const seasonalEvents = [
{
key: 'event-summer',
name: '呼伦贝尔夏季旅游最佳期6-8月',
description: '呼伦贝尔草原夏季旅游高峰,绿草如茵,那达慕传统节庆,骑马、露营、亲子出行最佳时段。呼籁旅行提供额吉的故乡V9系列定制游及小蒙马亲子夏令营。',
description: '呼伦贝尔草原夏季旅游高峰,绿草如茵,那达慕传统节庆,骑马、露营、亲子出行最佳时段。呼籁旅行提供额吉的故乡V9系列定制游及小蒙马亲子游学营。',
startDate: '2026-06-01',
endDate: '2026-08-31',
},

484
pages/company.vue 普通文件
查看文件

@ -0,0 +1,484 @@
<template>
<div class="page-wiki">
<LayoutPageHero
:title="data?.title || '呼籁文旅集团'"
:subtitle="data?.subtitle"
:breadcrumbs="[{ text: '关于我们', to: '/about' }, { text: '呼籁文旅集团' }]"
background-image="/images/company/photo-03.jpeg"
/>
<!-- 摘要 + 信息卡 -->
<section class="section" aria-label="集团概述">
<div class="container">
<div class="wiki-header">
<div class="wiki-summary">
<div class="wiki-summary-inner">
<h2 class="wiki-summary-heading">集团简介</h2>
<p class="wiki-summary-text">{{ data?.summary }}</p>
</div>
</div>
<div v-if="data?.infoBox" class="wiki-infobox">
<div class="wiki-infobox-logo">
<img :src="data.logo" :alt="data.title" />
</div>
<div class="wiki-infobox-body">
<div v-for="(value, key) in data.infoBox" :key="key" class="wiki-infobox-row">
<span class="wiki-infobox-label">{{ key }}</span>
<span class="wiki-infobox-value">{{ value }}</span>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 各段落 -->
<template v-for="(section, idx) in data?.sections" :key="idx">
<!-- 发展历程时间线 -->
<section v-if="section.timeline" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<div class="wiki-timeline">
<div v-for="(item, ti) in section.timeline" :key="ti" class="wiki-timeline-item">
<div class="wiki-timeline-marker">
<div class="wiki-timeline-dot" />
</div>
<div class="wiki-timeline-card">
<h4 class="wiki-timeline-year">{{ item.year }}</h4>
<p class="wiki-timeline-text">{{ item.content }}</p>
</div>
</div>
</div>
</div>
</section>
<!-- 普通文本段落 -->
<section v-if="section.content && !section.timeline && !section.subsidiaries && !section.businesses && !section.items && !section.images" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<p class="wiki-text">{{ section.content }}</p>
<div v-if="section.image" class="wiki-logo-img">
<img :src="section.image" :alt="section.title" />
</div>
</div>
</section>
<!-- 组织架构子公司列表 -->
<section v-if="section.subsidiaries" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<p v-if="section.intro" class="wiki-text">{{ section.intro }}</p>
<ul class="wiki-subsidiary-list">
<li v-for="(sub, si) in section.subsidiaries" :key="si" class="wiki-subsidiary-item">
{{ sub }}
</li>
</ul>
</div>
</section>
<!-- 管理团队带图片 -->
<section v-if="section.content && section.images" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<p class="wiki-text">{{ section.content }}</p>
<div v-if="section.images?.length" class="wiki-team-images">
<img v-for="(img, ii) in section.images" :key="ii" :src="img" :alt="`${section.title} ${ii + 1}`" loading="lazy" />
</div>
</div>
</section>
<!-- 主要业务 -->
<section v-if="section.businesses" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<div class="wiki-businesses">
<div v-for="(biz, bi) in section.businesses" :key="bi" class="wiki-business-card">
<h3 class="wiki-business-name">{{ biz.name }}</h3>
<p class="wiki-business-desc">{{ biz.description }}</p>
<p v-if="biz.extra" class="wiki-business-extra">{{ biz.extra }}</p>
</div>
</div>
</div>
</section>
<!-- 企业文化items列表 -->
<section v-if="section.items" class="section" :class="{ 'section--gray': idx % 2 === 1 }">
<div class="container">
<h2 class="wiki-section-title">{{ section.title }}</h2>
<div class="wiki-culture-list">
<div v-for="(item, ii) in section.items" :key="ii" class="wiki-culture-item">
<span class="wiki-culture-label">{{ item.label }}</span>
<p class="wiki-culture-value">{{ item.value }}</p>
</div>
</div>
</div>
</section>
</template>
<!-- 图库 -->
<section v-if="data?.gallery?.length" class="section section--gray" aria-label="集团图库">
<div class="container">
<h2 class="wiki-section-title">集团图库</h2>
<div class="wiki-gallery">
<div v-for="(img, gi) in data.gallery" :key="gi" class="wiki-gallery-item">
<img :src="img" :alt="`${data.title} 图片 ${gi + 1}`" loading="lazy" />
</div>
</div>
</div>
</section>
<!-- CTA -->
<CommonSectionCTA
title="想了解更多?"
description="了解呼籁旅行品牌或直接联系我们"
:links="[
{ to: '/brand', text: '了解呼籁旅行' },
{ to: '/contact', text: '联系我们' },
]"
/>
</div>
</template>
<script setup>
import { useBreadcrumbSchema } from '~/composables/useJsonLd'
const { data } = await usePublicApi('company-wiki')
useSEO('company-wiki', {
title: data.value?.seo?.title || '内蒙古呼籁文旅投资开发集团有限公司',
description: data.value?.seo?.description || '',
})
useBreadcrumbSchema([
{ text: '首页', to: '/' },
{ text: '关于我们', to: '/about' },
{ text: '呼籁文旅集团' },
])
useScrollReveal()
</script>
<style lang="less" scoped>
.wiki-header {
display: flex;
gap: @space-2xl;
align-items: flex-start;
@media (max-width: 768px) {
flex-direction: column;
gap: @space-xl;
}
}
.wiki-summary {
flex: 1;
min-width: 0;
}
.wiki-summary-inner {
padding: @space-xl @space-2xl;
background: @color-bg-warm;
border-radius: @border-radius-lg;
border-left: 4px solid @color-primary;
}
.wiki-summary-heading {
font-size: @font-size-xl;
font-weight: @font-weight-bold;
color: @color-primary;
margin-bottom: @space-md;
}
.wiki-summary-text {
font-size: @font-size-base;
line-height: 2;
color: @color-text-primary;
margin: 0;
}
.wiki-infobox {
flex-shrink: 0;
width: 360px;
background: @color-bg-white;
border-radius: @border-radius-lg;
overflow: hidden;
box-shadow: @shadow-card;
@media (max-width: 768px) {
width: 100%;
}
}
.wiki-infobox-logo {
display: flex;
justify-content: center;
align-items: center;
padding: @space-xl @space-lg;
background: @color-primary-bg;
border-bottom: 1px solid @color-divider;
img {
max-width: 160px;
height: auto;
}
}
.wiki-infobox-body {
padding: @space-sm 0;
}
.wiki-infobox-row {
display: flex;
padding: @space-sm @space-lg;
border-bottom: 1px solid @color-divider;
gap: @space-md;
&:last-child {
border-bottom: none;
}
}
.wiki-infobox-label {
flex-shrink: 0;
width: 110px;
font-size: @font-size-xs;
font-weight: @font-weight-medium;
color: @color-text-muted;
padding-top: 2px;
white-space: nowrap;
}
.wiki-infobox-value {
flex: 1;
font-size: @font-size-sm;
line-height: 1.6;
color: @color-text-primary;
word-break: break-all;
}
.wiki-section-title {
font-size: @font-size-2xl;
font-weight: @font-weight-bold;
color: @color-text-primary;
margin-bottom: @space-lg;
padding-bottom: @space-sm;
border-bottom: 2px solid @color-primary;
display: inline-block;
}
.wiki-text {
font-size: @font-size-base;
line-height: 1.8;
color: @color-text-primary;
max-width: 800px;
}
.wiki-logo-img {
margin-top: @space-lg;
text-align: center;
img {
max-width: 160px;
height: auto;
}
}
.wiki-timeline {
position: relative;
max-width: 800px;
margin: @space-lg 0 0;
padding-left: @space-xl;
&::before {
content: '';
position: absolute;
left: 5px;
top: 8px;
bottom: 0;
width: 2px;
background: @color-primary-lighter;
}
}
.wiki-timeline-item {
position: relative;
padding-bottom: @space-lg;
&:last-child {
padding-bottom: 0;
}
}
.wiki-timeline-marker {
position: absolute;
left: ~"calc(-@{space-xl} + 1px)";
top: 6px;
}
.wiki-timeline-dot {
width: 10px;
height: 10px;
background: @color-primary;
border-radius: 50%;
}
.wiki-timeline-card {
background: @color-bg-white;
border: 1px solid @color-border;
border-radius: @border-radius-lg;
padding: @space-md @space-lg;
}
.wiki-timeline-year {
font-size: @font-size-base;
font-weight: @font-weight-bold;
color: @color-primary;
margin-bottom: @space-xs;
}
.wiki-timeline-text {
font-size: @font-size-sm;
line-height: 1.7;
color: @color-text-secondary;
margin: 0;
}
.wiki-subsidiary-list {
list-style: none;
padding: 0;
margin: @space-lg 0 0;
display: flex;
flex-direction: column;
gap: @space-sm;
}
.wiki-subsidiary-item {
padding: @space-md @space-lg;
background: @color-bg-white;
border: 1px solid @color-border;
border-left: 3px solid @color-primary;
border-radius: 0 @border-radius-md @border-radius-md 0;
font-size: @font-size-sm;
line-height: 1.6;
color: @color-text-primary;
}
.wiki-team-images {
display: grid;
grid-template-columns: 1fr;
gap: @space-md;
margin-top: @space-lg;
.respond-md({
grid-template-columns: repeat(2, 1fr);
});
img {
width: 100%;
border-radius: @border-radius-lg;
object-fit: cover;
}
}
.wiki-businesses {
display: grid;
grid-template-columns: 1fr;
gap: @space-md;
margin-top: @space-lg;
.respond-md({
grid-template-columns: repeat(2, 1fr);
});
.respond-lg({
grid-template-columns: repeat(3, 1fr);
});
}
.wiki-business-card {
padding: @space-lg;
background: @color-bg-white;
border: 1px solid @color-border;
border-radius: @border-radius-lg;
}
.wiki-business-name {
font-size: @font-size-lg;
font-weight: @font-weight-bold;
color: @color-primary;
margin-bottom: @space-sm;
}
.wiki-business-desc,
.wiki-business-extra {
font-size: @font-size-sm;
line-height: 1.7;
color: @color-text-secondary;
margin: 0;
}
.wiki-business-extra {
margin-top: @space-xs;
}
.wiki-culture-list {
display: flex;
flex-direction: column;
gap: @space-lg;
}
.wiki-culture-item {
padding: @space-lg;
background: @color-bg-white;
border-left: 4px solid @color-primary;
border-radius: 0 @border-radius-lg @border-radius-lg 0;
box-shadow: @shadow-sm;
}
.wiki-culture-label {
display: block;
font-size: @font-size-sm;
font-weight: @font-weight-bold;
color: @color-primary;
margin-bottom: @space-xs;
}
.wiki-culture-value {
font-size: @font-size-base;
line-height: 1.8;
color: @color-text-primary;
margin: 0;
}
.wiki-gallery {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: @space-md;
margin-top: @space-lg;
.respond-md({
grid-template-columns: repeat(3, 1fr);
});
.respond-lg({
grid-template-columns: repeat(4, 1fr);
});
}
.wiki-gallery-item {
border-radius: @border-radius-lg;
overflow: hidden;
aspect-ratio: 16 / 10;
img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
&:hover img {
transform: scale(1.05);
}
}
</style>

查看文件

@ -3,7 +3,7 @@
<LayoutPageHero
:title="seo.h1"
subtitle="小蒙马亲子研学·6大课程模块·3-12岁分龄设计"
:breadcrumbs="[{ text: '小蒙马夏令营', to: '/summer-camp' }, { text: '研学课程体系' }]"
:breadcrumbs="[{ text: '小蒙马亲子游学营', to: '/summer-camp' }, { text: '研学课程体系' }]"
background-image="/images/summer-camp/birch-group.jpg"
/>
@ -93,10 +93,10 @@
<!-- 中间 CTA -->
<CommonSectionCTA
title="想了解小蒙马夏令营详情?"
title="想了解小蒙马亲子游学营详情?"
description="7天6晚亲子研学,每期限8组家庭,现在咨询了解营期安排"
:links="[
{ to: '/summer-camp', text: '查看小蒙马夏令营' },
{ to: '/summer-camp', text: '查看小蒙马亲子游学营' },
{ to: '/contact', text: '咨询报名' },
]"
/>
@ -204,9 +204,9 @@
<!-- 底部 CTA -->
<CommonSectionCTA
title="准备好让孩子在草原上上课了吗?"
description="报名小蒙马夏令营,或联系我们了解定制研学方案"
description="报名小蒙马亲子游学营,或联系我们了解定制研学方案"
:links="[
{ to: '/summer-camp', text: '小蒙马夏令营详情' },
{ to: '/summer-camp', text: '小蒙马亲子游学营详情' },
{ to: '/customize', text: '定制研学方案' },
]"
/>
@ -223,7 +223,7 @@ useScrollReveal()
useBreadcrumbSchema([
{ text: '首页', to: '/' },
{ text: '小蒙马夏令营', to: '/summer-camp' },
{ text: '小蒙马亲子游学营', to: '/summer-camp' },
{ text: '研学课程体系' },
])

查看文件

@ -157,6 +157,12 @@
{ to: '/contact', text: '咨询旅拍详情' },
]"
/>
<CommonWechatCTA
title="想拥有同款旅拍?扫码聊聊"
description="告诉定制师你喜欢的风格,旅拍随行程一并安排,提前备好服饰和取景方案。"
bg="white"
/>
</div>
</template>

查看文件

@ -7,7 +7,7 @@
<section class="page-tldr" aria-label="品牌身份摘要">
<div class="container">
<div class="page-tldr-inner">
<p>呼籁旅行是深耕呼伦贝尔11年的专属旅行品牌创立于2015年已服务超10000个家庭不做拼团不走马观花提供额吉的故乡V9系列定制游4-7小蒙马亲子夏令6天5晚及秋冬季专属产品全程一单一车独立成团</p>
<p>呼籁旅行是深耕呼伦贝尔11年的专属旅行品牌创立于2015年已服务近万组家庭不做拼团不走马观花提供额吉的故乡V9系列定制游4-7小蒙马亲子游学6天5晚及秋冬季专属产品全程专车专属独立成团</p>
</div>
</div>
</section>

查看文件

@ -53,7 +53,7 @@
<p>草原的风已经在等您了</p>
<div class="news-cta-links">
<CommonInternalLink to="/products" text="查看2026旅行产品" />
<CommonInternalLink to="/summer-camp" text="小蒙马夏令营报名" />
<CommonInternalLink to="/summer-camp" text="小蒙马亲子游学营报名" />
<CommonInternalLink to="/contact" text="联系定制师" />
</div>
</div>
@ -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: '呼籁旅行,呼伦贝尔旅游,额吉的故乡,小蒙马亲子游学营',
}),
}],
})

查看文件

@ -36,7 +36,7 @@
<div class="container">
<CommonSectionTitle
title="产品线价格参考"
subtitle="6条定制游线路 + 1个亲子夏令营 + 秋季产品"
subtitle="6条定制游线路 + 1个亲子游学营 + 秋季产品"
/>
<div class="pricing-grid">
<div
@ -96,7 +96,7 @@
</section>
<!-- 价格透明原则 -->
<section v-if="pricing" class="section section-philosophy reveal">
<section v-if="pricing?.philosophy" class="section section-philosophy reveal">
<div class="container">
<div class="philosophy-box">
<h2 class="philosophy-title">{{ pricing.philosophy.title }}</h2>
@ -108,11 +108,16 @@
<!-- CTA -->
<CommonSectionCTA
v-if="pricing"
v-if="pricing?.cta"
:title="pricing.cta.title"
:description="pricing.cta.description"
:links="[{ to: pricing.cta.to, text: pricing.cta.button }]"
/>
<CommonWechatCTA
title="想了解具体报价?扫码问定制师"
description="每个家庭的行程不同,精确报价需要根据出行时间、人数和偏好来定。扫码添加定制师微信,2小时内给你方案和报价。"
/>
</div>
</template>

查看文件

@ -9,7 +9,7 @@
<span class="product-tag">{{ product.tag }}</span>
<h1>{{ seo.h1 || product.name }}</h1>
<p class="hero-audience">适合{{ product.audience }}</p>
<p class="hero-duration">{{ product.days }}{{ product.nights }} · 一家一单一车</p>
<p class="hero-duration">{{ product.days }}{{ product.nights }} · 专车专属·独立成团</p>
</div>
</div>
</section>

查看文件

@ -10,7 +10,7 @@
<section class="page-tldr" aria-label="产品页摘要">
<div class="container">
<div class="page-tldr-inner">
<p>游牧的森林V3系列提供4-7天6个版本的呼伦贝尔秋季定制游涵盖南线呼伦贝尔+阿尔山和北线呼伦贝尔+大兴安岭两条主线所有版本均为独立成团一家一单一车不与陌生人拼团不确定选哪条线<NuxtLink to="/contact">联系定制师</NuxtLink>获取推荐</p>
<p>游牧的森林V3系列提供4-7天6个版本的呼伦贝尔秋季定制游涵盖南线呼伦贝尔+阿尔山和北线呼伦贝尔+大兴安岭两条主线所有版本均为独立成团私家专车不与陌生人同行不确定选哪条线<NuxtLink to="/contact">联系定制师</NuxtLink>获取推荐</p>
</div>
</div>
</section>

查看文件

@ -10,7 +10,7 @@
<section class="page-tldr" aria-label="产品页摘要">
<div class="container">
<div class="page-tldr-inner">
<p>额吉的故乡V9系列提供5-7天6个版本的呼伦贝尔亲子游涵盖森林版草原版亲子版探索版旷野版等不同需求所有版本均为独立成团一家一单一车不与陌生人拼团不确定选哪个版本可使用<NuxtLink to="/selector">选版工具</NuxtLink>进行1分钟匹配或参考<NuxtLink to="/pricing">价格参考页</NuxtLink>了解费用区间</p>
<p>额吉的故乡V9系列提供5-7天6个版本的呼伦贝尔亲子游涵盖森林版草原版亲子版探索版旷野版等不同需求所有版本均为独立成团专车不拼不与陌生人同车不确定选哪个版本可使用<NuxtLink to="/selector">选版工具</NuxtLink>进行1分钟匹配或参考<NuxtLink to="/pricing">价格参考页</NuxtLink>了解费用区间</p>
</div>
</div>
</section>

查看文件

@ -95,7 +95,7 @@
<!-- CTA -->
<CommonSectionCTA
title="想了解我们的产品?"
description="查看额吉的故乡V9系列和小蒙马夏令营"
description="查看额吉的故乡V9系列和小蒙马亲子游学营"
:links="[
{ to: '/products', text: '查看旅行产品' },
{ to: '/contact', text: '联系定制师' },

查看文件

@ -11,7 +11,7 @@
<section class="page-tldr" aria-label="客户评价摘要">
<div class="container">
<div class="page-tldr-inner">
<p>呼籁旅行已服务超10000个家庭本页收录来自真实客户的旅行评价均为未经修改的原始反馈可按出行场景亲子摄影蜜月等和关注维度安全性性价比服务质量等筛选找到与自己情况最相似的参考评价</p>
<p>呼籁旅行已服务近万组家庭本页收录来自真实客户的旅行评价均为未经修改的原始反馈可按出行场景亲子摄影蜜月等和关注维度安全性性价比服务质量等筛选找到与自己情况最相似的参考评价</p>
</div>
</div>
</section>

查看文件

@ -70,7 +70,7 @@
<div class="story-nav">
<NuxtLink
v-if="prevStory"
:to="`/stories/${prevStory.id}`"
:to="`/stories/${prevStory.slug}`"
class="story-nav__item story-nav__item--prev"
>
<span class="story-nav__label">上一个故事</span>
@ -78,7 +78,7 @@
</NuxtLink>
<NuxtLink
v-if="nextStory"
:to="`/stories/${nextStory.id}`"
:to="`/stories/${nextStory.slug}`"
class="story-nav__item story-nav__item--next"
>
<span class="story-nav__label">下一个故事</span>
@ -106,7 +106,7 @@
class="sidebar-story"
:class="{ 'sidebar-story--active': s.id === story.id }"
>
<NuxtLink :to="`/stories/${s.id}`" class="sidebar-story__link">
<NuxtLink :to="`/stories/${s.slug}`" class="sidebar-story__link">
<span class="sidebar-story__family">{{ s.familyType }}</span>
<span class="sidebar-story__title">{{ s.title }}</span>
</NuxtLink>
@ -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}` },
],
})

查看文件

@ -125,7 +125,7 @@ function getCardProps(story) {
rel: 'noopener nofollow',
}
}
return { to: `/stories/${story.id}` }
return { to: `/stories/${story.slug}` }
}
</script>

查看文件

@ -2,8 +2,8 @@
<div class="page-summer-camp">
<LayoutPageHero
:title="seo.h1"
subtitle="呼伦贝尔草原亲子夏令营·6天5晚·每期8组家庭"
:breadcrumbs="[{ text: '小蒙马夏令营' }]"
subtitle="呼伦贝尔草原亲子游学营·6天5晚·每期7-9组家庭·5-12岁"
:breadcrumbs="[{ text: '小蒙马亲子游学营' }]"
background-image="/images/summer-camp/river-banner.jpg"
/>
@ -11,7 +11,7 @@
<section class="page-tldr" aria-label="夏令营摘要">
<div class="container">
<div class="page-tldr-inner">
<p>小蒙马夏令营呼伦贝尔草原亲子夏令营6天5晚每期限8组家庭6-12岁儿童适合亲子同行非托管模式草原骑马篝火晚会营地课程牧民拜访等体验7月旺季需提前2-3个月报名</p>
<p>小蒙马亲子游学营呼伦贝尔草原亲子游学营2.06天5晚每期7-9组家庭5-12岁亲子同行草原音乐会写生创作白桦林非遗研学亲子马术做列巴1200米滑草畅玩双领队+全程摄影师+餐食全含2025年11期期期满员2026年开设30期</p>
</div>
</div>
</section>
@ -23,7 +23,7 @@
<div class="camp-mascot">
<img
:src="images.mascot.xiaomengma"
alt="小蒙马 - 小蒙马夏令营吉祥物,一只可爱的蒙古小马形象"
alt="小蒙马 - 小蒙马亲子游学营吉祥物,一只可爱的蒙古小马形象"
width="200"
height="200"
loading="lazy"
@ -34,7 +34,7 @@
<p class="camp-positioning">{{ camp.positioning }}</p>
<div class="camp-meta">
<span class="camp-meta-item">{{ camp.days }}{{ camp.nights }}</span>
<span class="camp-meta-item">每期8组家庭</span>
<span class="camp-meta-item">每期7-9组家庭</span>
<span class="camp-meta-item">亲子同行</span>
</div>
</div>
@ -49,7 +49,7 @@
<div class="camp-photo">
<img
:src="images.summerCamp.river"
alt="小蒙马亲子夏令营在莫日格勒河旁举旗合影,背景是蜿蜒的草原河流"
alt="小蒙马亲子游学营在莫日格勒河旁举旗合影,背景是蜿蜒的草原河流"
width="1600"
height="1067"
loading="lazy"
@ -59,7 +59,7 @@
<div class="camp-photo">
<img
:src="images.summerCamp.grassland"
alt="小蒙马夏令营亲子家庭在呼伦贝尔草原上合影,手持小蒙马标志牌"
alt="小蒙马亲子游学营亲子家庭在呼伦贝尔草原上合影,手持小蒙马标志牌"
width="1600"
height="1067"
loading="lazy"
@ -69,7 +69,7 @@
<div class="camp-photo">
<img
:src="images.summerCamp.birch"
alt="小蒙马夏令营亲子家庭在白桦林合影,家长和孩子们一起开心比耶"
alt="小蒙马亲子游学营亲子家庭在白桦林合影,家长和孩子们一起开心比耶"
width="1600"
height="1067"
loading="lazy"
@ -79,7 +79,7 @@
<div class="camp-photo">
<img
:src="images.summerCamp.graduation"
alt="小蒙马夏令营结营仪式,家长和孩子们手持结营证书在营地合影"
alt="小蒙马亲子游学营结营仪式,家长和孩子们手持结营证书在营地合影"
width="1600"
height="1067"
loading="lazy"
@ -93,12 +93,12 @@
<span class="camp-stat-label">2025年成功举办期数</span>
</div>
<div class="camp-stat-item">
<span class="camp-stat-value">{{ camp.sessions['2026plan'] }}</span>
<span class="camp-stat-value">{{ camp.sessions['2026'] }}</span>
<span class="camp-stat-label">2026年计划开营期数</span>
</div>
<div class="camp-stat-item">
<span class="camp-stat-value">8</span>
<span class="camp-stat-label">每期限定家庭数</span>
<span class="camp-stat-value">7-9</span>
<span class="camp-stat-label">每期家庭数</span>
</div>
</div>
</div>
@ -108,7 +108,7 @@
<CommonSectionCTA
title="想了解营期安排和费用?"
description="添加微信客服,获取最新营期时间和报名方式"
:links="[{ to: '/contact', text: '咨询小蒙马夏令营' }]"
:links="[{ to: '/contact', text: '咨询小蒙马亲子游学营' }]"
/>
<!-- 四大原则 -->
@ -131,7 +131,11 @@
<div class="itinerary-list">
<div v-for="(day, i) in camp.itinerary" :key="i" class="itinerary-item">
<div class="itinerary-day">D{{ day.day || i + 1 }}</div>
<p class="itinerary-text">{{ day.title }}{{ day.summary ? ' ' + day.summary : '' }}</p>
<div class="itinerary-content">
<p class="itinerary-title">{{ day.title }}</p>
<p v-if="day.summary" class="itinerary-text">{{ day.summary }}</p>
<p v-if="day.distance" class="itinerary-distance">{{ day.distance }}</p>
</div>
</div>
</div>
</div>
@ -153,27 +157,27 @@
<!-- 与V9的区别 -->
<section v-if="camp" class="section reveal">
<div class="container">
<CommonSectionTitle title="小蒙马 vs 额吉的故乡" subtitle="两种产品,两种精彩" />
<CommonSectionTitle title="小蒙马亲子游学营 vs 额吉的故乡" subtitle="两种产品,两种精彩" />
<div class="compare-cards">
<div class="compare-card compare-card--camp">
<h3>小蒙马夏令</h3>
<h3>小蒙马亲子游学</h3>
<ul>
<li>亲子同行家长和孩子一起出发</li>
<li>每期8组家庭结伴同行孩子有玩伴</li>
<li>草原写生+非遗研学+民俗体验</li>
<li>设有爸妈托管时段家长也能放松</li>
<li>孩子有伙伴一起学一起玩</li>
<li>7-9组家庭拼团出发孩子有同龄玩伴</li>
<li>两位亲子领队全程带队家长可以当甩手掌柜</li>
<li>每天都有设计好的研学课程和亲子活动</li>
<li>全程跟拍摄影师每天精修照片发群</li>
<li>餐食全含不用操心吃什么</li>
<li>6天5晚节奏舒缓不赶路</li>
</ul>
</div>
<div class="compare-card compare-card--v9">
<h3>额吉的故乡V9</h3>
<h3>额吉的故乡·亲子版</h3>
<ul>
<li>全家一起出行行程灵活自由</li>
<li>一家一单一车专属私家定制</li>
<li>专属领队一对一服务</li>
<li>行程可根据需求随时调整</li>
<li>享受亲密家庭时光</li>
<li>一单一团你的家庭独享一辆车一位领队</li>
<li>路线更远含满洲里覆盖草原+森林+边境+城市</li>
<li>正餐不含可以自己探索当地美食</li>
<li>累计10000+家庭选择国家版权局版权认证产品</li>
<li>行程灵活自由按自己节奏走</li>
<li>4-7天多版本可选</li>
</ul>
<NuxtLink to="/products" class="compare-link">查看V9系列 </NuxtLink>
@ -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();

查看文件

@ -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

二进制
public/images/brand/logo-horse.png 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 16 KiB

二进制
public/images/brand/logo.png 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 14 KiB

二进制
public/images/brand/photo-01.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 287 KiB

二进制
public/images/brand/photo-02.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 547 KiB

二进制
public/images/brand/photo-03.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 270 KiB

二进制
public/images/brand/photo-04.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 159 KiB

二进制
public/images/brand/photo-05.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 190 KiB

二进制
public/images/brand/photo-06.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 205 KiB

二进制
public/images/brand/photo-07.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 196 KiB

二进制
public/images/brand/photo-08.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 240 KiB

二进制
public/images/brand/photo-09.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 214 KiB

二进制
public/images/brand/photo-10.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 441 KiB

二进制
public/images/brand/photo-11.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 274 KiB

二进制
public/images/brand/photo-12.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 455 KiB

二进制
public/images/brand/photo-13.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 419 KiB

二进制
public/images/brand/photo-14.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 292 KiB

二进制
public/images/brand/photo-15.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 227 KiB

二进制
public/images/brand/photo-16.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 596 KiB

二进制
public/images/brand/photo-17.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 452 KiB

二进制
public/images/brand/photo-18.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 134 KiB

二进制
public/images/brand/photo-19.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 506 KiB

二进制
public/images/brand/photo-20.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 352 KiB

二进制
public/images/brand/photo-21.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 390 KiB

二进制
public/images/brand/photo-22.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 473 KiB

二进制
public/images/brand/photo-23.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 184 KiB

二进制
public/images/company/logo-horse.png 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 16 KiB

二进制
public/images/company/logo.png 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 14 KiB

二进制
public/images/company/photo-01.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 473 KiB

二进制
public/images/company/photo-02.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 184 KiB

二进制
public/images/company/photo-03.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 287 KiB

二进制
public/images/company/photo-04.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 547 KiB

二进制
public/images/company/photo-05.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 270 KiB

二进制
public/images/company/photo-06.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 159 KiB

二进制
public/images/company/photo-07.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 190 KiB

二进制
public/images/company/photo-08.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 205 KiB

二进制
public/images/company/photo-09.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 196 KiB

二进制
public/images/company/photo-10.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 240 KiB

二进制
public/images/company/photo-11.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 214 KiB

二进制
public/images/company/photo-12.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 441 KiB

二进制
public/images/company/photo-13.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 274 KiB

二进制
public/images/company/photo-14.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 455 KiB

二进制
public/images/company/photo-15.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 419 KiB

二进制
public/images/company/photo-16.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 292 KiB

二进制
public/images/company/photo-17.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 227 KiB

二进制
public/images/company/photo-18.jpeg 普通文件

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 596 KiB

某些文件未显示,因为此 diff 中更改的文件太多 显示更多