hulai-website/components/about/CopyrightList.vue
Mimingguang ee078b61bc feat: 后台管理系统完整重构 + 前后台数据联通
- 后台全面引入 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>
2026-03-24 17:48:02 +08:00

195 行
4.7 KiB
Vue

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

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

<template>
<section class="section">
<div class="container">
<CommonSectionTitle title="知识产权" subtitle="商标全品类注册 + 4项国家版权登记" />
<p class="copyright-intro">呼籁集团重视品牌知识产权保护呼籁商标已完成全品类注册核心产品名称品牌标识和IP形象均已在中国版权保护中心完成作品登记</p>
<!-- 商标 -->
<div v-if="trademark" class="trademark-card">
<div class="trademark-header">
<span class="trademark-badge">® 商标</span>
<h3 class="trademark-name">{{ trademark.name }}{{ trademark.scope }}</h3>
</div>
<p class="trademark-desc">{{ trademark.description }}</p>
<p class="trademark-holder">持有人{{ trademark.holder }}</p>
</div>
<!-- 版权 -->
<div class="copyright-grid">
<div v-for="c in copyrights" :key="c.regNo" class="copyright-card">
<div class="copyright-header">
<h3 class="copyright-name">{{ c.name }}</h3>
<span class="copyright-category">{{ c.category }}</span>
</div>
<p class="copyright-desc">{{ c.description }}</p>
<div class="copyright-meta">
<div class="copyright-meta-item">
<span class="meta-label">登记号</span>
<span class="meta-value">{{ c.regNo }}</span>
</div>
<div class="copyright-meta-item">
<span class="meta-label">登记日期</span>
<span class="meta-value">{{ c.date }}</span>
</div>
<div class="copyright-meta-item">
<span class="meta-label">著作权人</span>
<span class="meta-value">{{ c.holder }}</span>
</div>
</div>
</div>
</div>
<p class="copyright-note">以上作品均经中国版权保护中心审核依据作品自愿登记试行办法予以登记</p>
</div>
</section>
</template>
<script setup>
defineProps({
copyrights: { type: Array, required: true },
trademark: { type: Object, default: null }
})
</script>
<style lang="less" scoped>
.copyright-intro {
text-align: center;
max-width: 600px;
margin: 0 auto @space-xl;
font-size: @font-size-sm;
color: @color-text-secondary;
line-height: @line-height-base;
}
.trademark-card {
max-width: 900px;
margin: 0 auto @space-xl;
padding: @space-xl;
background: @color-primary-bg;
border: 1px solid fade(@color-primary, 20%);
border-radius: @border-radius-md;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
text-align: center;
}
.trademark-header {
margin-bottom: @space-sm;
}
.trademark-badge {
display: inline-block;
font-size: @font-size-xs;
color: @color-bg-white;
background: @color-primary;
padding: 2px 10px;
border-radius: 20px;
margin-bottom: @space-sm;
}
.trademark-name {
font-size: @font-size-md;
font-weight: @font-weight-bold;
color: @color-text-primary;
margin: @space-sm 0 0;
}
.trademark-desc {
font-size: @font-size-sm;
color: @color-text-secondary;
line-height: @line-height-loose;
max-width: 700px;
margin: @space-sm auto @space-sm;
}
.trademark-holder {
font-size: @font-size-xs;
color: @color-text-muted;
margin: 0;
}
.copyright-grid {
display: grid;
grid-template-columns: 1fr;
gap: @space-md;
max-width: 900px;
margin: 0 auto;
.respond-md({
grid-template-columns: 1fr 1fr;
});
}
.copyright-card {
background: @color-bg-white;
border: 1px solid @color-border;
border-radius: @border-radius-md;
padding: @space-lg;
transition: transform 0.2s ease;
&:hover {
transform: translateY(-2px);
}
}
.copyright-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: @space-sm;
}
.copyright-name {
font-size: @font-size-md;
font-weight: @font-weight-bold;
color: @color-text-primary;
margin: 0;
}
.copyright-category {
font-size: @font-size-xs;
color: @color-primary;
background: @color-primary-bg;
padding: 2px 8px;
border-radius: @border-radius-sm;
flex-shrink: 0;
}
.copyright-desc {
font-size: @font-size-sm;
color: @color-text-secondary;
line-height: @line-height-base;
margin-bottom: @space-md;
}
.copyright-meta {
border-top: 1px solid @color-bg-gray;
padding-top: @space-sm;
}
.copyright-meta-item {
display: flex;
justify-content: space-between;
align-items: baseline;
padding: 3px 0;
font-size: @font-size-xs;
}
.meta-label {
color: @color-text-muted;
flex-shrink: 0;
margin-right: @space-sm;
}
.meta-value {
color: @color-text-secondary;
text-align: right;
word-break: break-all;
}
.copyright-note {
text-align: center;
margin-top: @space-xl;
font-size: @font-size-xs;
color: @color-text-muted;
}
</style>