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

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 13:21:11 +08:00

423 行
10 KiB
Vue

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

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