- 后台全面引入 Naive UI 组件库,统一 UI 规范 - 前台 usePublicApi 切换到 API 调用(GET /api/content/[key]) - 前后台数据源统一(site_content 表) - 产品线统一管理(tour/camp/course 三套编辑器) - 产品数据归一化(itinerary/faq/pricing 格式统一) - 表单提交 API 改写入 submissions 表 - 新增 submissions 标记已读 API - site-content PUT 支持 upsert - 修复前台 bug(stories 路由冲突、占位符警告、selector breadcrumb) - 消除 PageHero 类型警告(useSEO reactive 修复) - 25 个前台页面全部 HTTP 200,展示效果不变 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
196 行
4.2 KiB
Vue
196 行
4.2 KiB
Vue
<template>
|
||
<section class="section section--warm">
|
||
<div class="container">
|
||
<CommonSectionTitle title="品牌IP · 籁小咩" subtitle="LAI XIAO MIE" />
|
||
|
||
<div class="mascot-hero">
|
||
<div class="mascot-image">
|
||
<img
|
||
:src="images.mascot.front"
|
||
alt="籁小咩 - 呼籁旅行品牌IP吉祥物,一只可爱的小羊形象"
|
||
width="280"
|
||
height="380"
|
||
loading="lazy"
|
||
/>
|
||
</div>
|
||
<div class="mascot-info">
|
||
<h3 class="mascot-name">籁小咩</h3>
|
||
<p class="mascot-intro">呼籁旅行的品牌IP吉祥物,灵感来自呼伦贝尔草原上自由奔跑的小羊。圆润的羊毛卷发、温暖的大眼睛、招手的小手势——籁小咩代表着呼籁对每一个家庭的热情欢迎。</p>
|
||
<div class="mascot-tags">
|
||
<span class="mascot-tag">原创IP形象</span>
|
||
<span class="mascot-tag">国家版权登记</span>
|
||
<span class="mascot-tag">表情包</span>
|
||
</div>
|
||
<p class="mascot-copyright">国家版权局作品登记:国作登字-2026-F-00020268</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 草原场景 -->
|
||
<div class="mascot-banner">
|
||
<img
|
||
:src="images.mascot.banner"
|
||
alt="籁小咩在呼伦贝尔草原上向你招手"
|
||
width="800"
|
||
height="300"
|
||
loading="lazy"
|
||
/>
|
||
</div>
|
||
|
||
<!-- 表情包二维码 -->
|
||
<div class="mascot-sticker">
|
||
<div class="mascot-sticker-qr">
|
||
<img
|
||
:src="images.mascot.stickerQr"
|
||
alt="籁小咩微信表情包二维码"
|
||
width="160"
|
||
height="160"
|
||
loading="lazy"
|
||
/>
|
||
</div>
|
||
<div class="mascot-sticker-text">
|
||
<p class="mascot-sticker-title">把籁小咩带进你的聊天</p>
|
||
<p class="mascot-sticker-desc">微信扫一扫,免费领取「籁小咩」表情包。旅行前发给家人朋友,快乐先行一步。</p>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</section>
|
||
</template>
|
||
|
||
<script setup>
|
||
import images from '~/data/images.json'
|
||
</script>
|
||
|
||
<style lang="less" scoped>
|
||
.mascot-hero {
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
text-align: center;
|
||
gap: @space-xl;
|
||
max-width: 800px;
|
||
margin: 0 auto @space-2xl;
|
||
|
||
.respond-md({
|
||
flex-direction: row;
|
||
text-align: left;
|
||
gap: @space-2xl;
|
||
});
|
||
}
|
||
|
||
.mascot-image {
|
||
flex-shrink: 0;
|
||
|
||
img {
|
||
width: 200px;
|
||
height: auto;
|
||
filter: drop-shadow(0 8px 24px rgba(0, 0, 0, 0.1));
|
||
}
|
||
}
|
||
|
||
.mascot-info {
|
||
flex: 1;
|
||
}
|
||
|
||
.mascot-name {
|
||
font-size: 28px;
|
||
font-weight: @font-weight-bold;
|
||
color: @color-text-primary;
|
||
margin: 0 0 @space-md;
|
||
}
|
||
|
||
.mascot-intro {
|
||
font-size: @font-size-base;
|
||
color: @color-text-secondary;
|
||
line-height: @line-height-loose;
|
||
margin-bottom: @space-lg;
|
||
}
|
||
|
||
.mascot-tags {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: @space-sm;
|
||
margin-bottom: @space-md;
|
||
justify-content: center;
|
||
|
||
.respond-md({
|
||
justify-content: flex-start;
|
||
});
|
||
}
|
||
|
||
.mascot-tag {
|
||
font-size: @font-size-xs;
|
||
color: @color-primary;
|
||
background: @color-primary-bg;
|
||
padding: 4px 12px;
|
||
border-radius: 20px;
|
||
}
|
||
|
||
.mascot-copyright {
|
||
font-size: @font-size-xs;
|
||
color: @color-text-muted;
|
||
margin: 0;
|
||
}
|
||
|
||
.mascot-banner {
|
||
max-width: 800px;
|
||
margin: 0 auto @space-2xl;
|
||
border-radius: @border-radius-lg;
|
||
overflow: hidden;
|
||
|
||
img {
|
||
width: 100%;
|
||
height: auto;
|
||
display: block;
|
||
}
|
||
}
|
||
|
||
.mascot-sticker {
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
text-align: center;
|
||
gap: @space-lg;
|
||
max-width: 500px;
|
||
margin: 0 auto;
|
||
padding: @space-xl;
|
||
background: @color-bg-white;
|
||
border-radius: @border-radius-lg;
|
||
border: 1px solid @color-border;
|
||
|
||
.respond-md({
|
||
flex-direction: row;
|
||
text-align: left;
|
||
});
|
||
}
|
||
|
||
.mascot-sticker-qr {
|
||
flex-shrink: 0;
|
||
|
||
img {
|
||
width: 120px;
|
||
height: 120px;
|
||
border-radius: @border-radius-md;
|
||
}
|
||
}
|
||
|
||
.mascot-sticker-text {
|
||
flex: 1;
|
||
}
|
||
|
||
.mascot-sticker-title {
|
||
font-size: @font-size-md;
|
||
font-weight: @font-weight-medium;
|
||
color: @color-text-primary;
|
||
margin-bottom: @space-sm;
|
||
}
|
||
|
||
.mascot-sticker-desc {
|
||
font-size: @font-size-sm;
|
||
color: @color-text-secondary;
|
||
line-height: 1.6;
|
||
margin: 0;
|
||
}
|
||
|
||
</style>
|