Oroqen-Vue/src/views/Heritage.vue

763 lines
20 KiB
Vue
Raw Normal View History

2025-08-07 21:29:04 +08:00
<template>
<div class="heritage">
<!-- 页面头部 -->
<section class="page-header">
<div class="container">
<div class="header-content">
<h1 class="page-title">非物质文化遗产</h1>
<p class="page-subtitle">传承千年技艺保护民族瑰宝</p>
</div>
</div>
</section>
<!-- 非遗名录 -->
<section class="section">
<div class="container">
<h2 class="section-title">非遗名录</h2>
<div class="heritage-levels">
<div class="level-tabs">
<button
v-for="level in heritageLevels"
:key="level.id"
:class="['level-tab', { active: activeLevel === level.id }]"
@click="activeLevel = level.id"
>
{{ level.name }}
</button>
</div>
<div class="heritage-list">
<div v-for="item in currentHeritageList" :key="item.id" class="heritage-item card">
<div class="heritage-image">
<div class="image-placeholder">
<svg viewBox="0 0 200 150" width="100%" height="150">
<rect width="200" height="150" :fill="item.color" opacity="0.2"/>
<circle cx="100" cy="75" r="30" :fill="item.color" opacity="0.5"/>
<text x="100" y="85" text-anchor="middle" :fill="item.color"
font-size="12" font-weight="bold">{{ item.name.substring(0, 2) }}</text>
</svg>
</div>
</div>
<div class="heritage-info">
<h3 class="heritage-name">{{ item.name }}</h3>
<p class="heritage-category">{{ item.category }}</p>
<p class="heritage-description">{{ item.description }}</p>
<div class="heritage-meta">
<span class="heritage-year">{{ item.year }}年入选</span>
<el-button type="primary" size="small" @click="viewDetails(item)">
查看详情
</el-button>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 技艺展示 -->
<section class="section" style="background-color: var(--background-light);">
<div class="container">
<h2 class="section-title">技艺展示</h2>
<div class="crafts-showcase">
<div v-for="craft in crafts" :key="craft.id" class="craft-item">
<div class="craft-media">
<div class="media-placeholder">
<svg viewBox="0 0 400 250" width="100%" height="250">
<rect width="400" height="250" :fill="craft.color" opacity="0.1"/>
<rect x="50" y="50" width="300" height="150" :fill="craft.color" opacity="0.3" rx="10"/>
<circle cx="200" cy="125" r="40" fill="white" opacity="0.8"/>
<polygon points="180,115 180,135 220,125" fill="var(--primary-color)"/>
</svg>
</div>
<div class="media-controls">
<el-button type="primary" circle @click="playCraftVideo(craft)">
<el-icon><VideoPlay /></el-icon>
</el-button>
</div>
</div>
<div class="craft-content">
<h3 class="craft-title">{{ craft.name }}</h3>
<p class="craft-description">{{ craft.description }}</p>
<div class="craft-steps">
<h4>制作流程</h4>
<ol class="steps-list">
<li v-for="step in craft.steps" :key="step">{{ step }}</li>
</ol>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 传承人故事 -->
<section class="section">
<div class="container">
<h2 class="section-title">传承人故事</h2>
<div class="inheritors-stories">
<div v-for="story in inheritorStories" :key="story.id" class="story-card card">
<div class="story-header">
<div class="inheritor-avatar">
<div class="avatar-placeholder">
<svg viewBox="0 0 80 80" width="80" height="80">
<circle cx="40" cy="40" r="35" fill="var(--primary-color)" opacity="0.2"/>
<circle cx="40" cy="30" r="12" fill="var(--primary-color)" opacity="0.5"/>
<path d="M20 60 Q40 50 60 60 L60 70 L20 70 Z"
fill="var(--primary-color)" opacity="0.5"/>
</svg>
</div>
</div>
<div class="inheritor-basic">
<h3 class="inheritor-name">{{ story.name }}</h3>
<p class="inheritor-title">{{ story.title }}</p>
<p class="inheritor-age">{{ story.age }} · {{ story.experience }}年从艺经验</p>
</div>
</div>
<div class="story-content">
<h4>传承故事</h4>
<p>{{ story.story }}</p>
<h4>代表作品</h4>
<div class="works-grid">
<div v-for="work in story.works" :key="work" class="work-item">
<div class="work-image">
<svg viewBox="0 0 100 80" width="100" height="80">
<rect width="100" height="80" fill="var(--secondary-color)" opacity="0.2" rx="4"/>
<text x="50" y="45" text-anchor="middle" fill="var(--secondary-color)"
font-size="10">{{ work.substring(0, 2) }}</text>
</svg>
</div>
<p class="work-name">{{ work }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 保护现状 -->
<section class="section" style="background-color: var(--background-light);">
<div class="container">
<h2 class="section-title">保护现状与成果</h2>
<div class="protection-overview">
<div class="protection-stats">
<div class="stat-card">
<div class="stat-number">15</div>
<div class="stat-label">国家级非遗项目</div>
</div>
<div class="stat-card">
<div class="stat-number">28</div>
<div class="stat-label">省级非遗项目</div>
</div>
<div class="stat-card">
<div class="stat-number">45</div>
<div class="stat-label">代表性传承人</div>
</div>
<div class="stat-card">
<div class="stat-number">8</div>
<div class="stat-label">传承基地</div>
</div>
</div>
<div class="protection-measures">
<h3>保护措施</h3>
<div class="measures-grid">
<div class="measure-item">
<div class="measure-icon">
<el-icon size="32"><School /></el-icon>
</div>
<h4>教育传承</h4>
<p>在学校开设非遗课程培养年轻一代的文化认同感</p>
</div>
<div class="measure-item">
<div class="measure-icon">
<el-icon size="32"><Camera /></el-icon>
</div>
<h4>数字化保护</h4>
<p>建立数字档案记录技艺流程和文化内涵</p>
</div>
<div class="measure-item">
<div class="measure-icon">
<el-icon size="32"><Trophy /></el-icon>
</div>
<h4>展示推广</h4>
<p>举办展览活动提高社会关注度和影响力</p>
</div>
<div class="measure-item">
<div class="measure-icon">
<el-icon size="32"><Money /></el-icon>
</div>
<h4>资金支持</h4>
<p>设立专项资金支持传承人和保护项目</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 详情对话框 -->
<el-dialog v-model="detailDialogVisible" :title="selectedHeritage?.name" width="70%" top="5vh">
<div v-if="selectedHeritage" class="heritage-detail">
<div class="detail-image">
<div class="image-placeholder">
<svg viewBox="0 0 400 200" width="100%" height="200">
<rect width="400" height="200" :fill="selectedHeritage.color" opacity="0.2"/>
<circle cx="200" cy="100" r="50" :fill="selectedHeritage.color" opacity="0.5"/>
<text x="200" y="110" text-anchor="middle" :fill="selectedHeritage.color"
font-size="20" font-weight="bold">{{ selectedHeritage.name.substring(0, 2) }}</text>
</svg>
</div>
</div>
<div class="detail-content">
<h3>项目简介</h3>
<p>{{ selectedHeritage.fullDescription }}</p>
<h3>历史渊源</h3>
<p>{{ selectedHeritage.history }}</p>
<h3>技艺特点</h3>
<ul>
<li v-for="feature in selectedHeritage.features" :key="feature">{{ feature }}</li>
</ul>
<h3>传承价值</h3>
<p>{{ selectedHeritage.value }}</p>
</div>
</div>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
import { VideoPlay, School, Camera, Trophy, Money } from '@element-plus/icons-vue'
// 响应式数据
const activeLevel = ref('national')
const detailDialogVisible = ref(false)
const selectedHeritage = ref(null)
// 非遗级别
const heritageLevels = ref([
{ id: 'national', name: '国家级' },
{ id: 'provincial', name: '省级' },
{ id: 'municipal', name: '市级' }
])
// 非遗项目数据
const heritageItems = ref({
national: [
{
id: 1,
name: '鄂伦春族桦皮制作技艺',
category: '传统技艺',
description: '利用桦树皮制作各种生活用品的传统技艺',
year: 2008,
color: '#8b4513',
fullDescription: '鄂伦春族桦皮制作技艺是一项古老的传统手工艺,主要利用白桦树皮制作各种生活用品。',
history: '这项技艺有着数百年的历史,是鄂伦春族适应森林生活的智慧结晶。',
features: ['材料天然环保', '制作工艺精湛', '实用性强', '装饰美观'],
value: '体现了鄂伦春族与自然和谐共处的生活理念,具有重要的文化价值。'
},
{
id: 2,
name: '鄂伦春族民歌',
category: '传统音乐',
description: '反映鄂伦春族生活的传统民歌',
year: 2008,
color: '#2d5016',
fullDescription: '鄂伦春族民歌是反映鄂伦春族生产生活、思想感情的重要载体。',
history: '民歌世代口耳相传,内容丰富,形式多样。',
features: ['旋律优美', '内容丰富', '形式多样', '情感真挚'],
value: '是研究鄂伦春族历史文化的重要资料,具有很高的学术价值。'
}
],
provincial: [
{
id: 3,
name: '鄂伦春族传统刺绣',
category: '传统美术',
description: '具有民族特色的传统刺绣工艺',
year: 2010,
color: '#8b4513',
fullDescription: '鄂伦春族传统刺绣以其精美的图案和独特的技法而闻名。',
history: '刺绣技艺在鄂伦春族中有着悠久的历史传统。',
features: ['图案精美', '色彩丰富', '技法独特', '寓意深刻'],
value: '展现了鄂伦春族妇女的智慧和审美情趣。'
}
],
municipal: [
{
id: 4,
name: '鄂伦春族萨满舞',
category: '传统舞蹈',
description: '具有宗教色彩的传统舞蹈',
year: 2012,
color: '#2d5016',
fullDescription: '萨满舞是鄂伦春族重要的宗教仪式舞蹈。',
history: '萨满舞起源于古老的萨满教信仰。',
features: ['动作独特', '节奏鲜明', '寓意深刻', '仪式感强'],
value: '是研究鄂伦春族宗教信仰的重要资料。'
}
]
})
// 技艺展示数据
const crafts = ref([
{
id: 1,
name: '桦皮制作技艺',
description: '从采集桦皮到制作成品的完整工艺流程',
color: '#8b4513',
steps: [
'选择合适的白桦树',
'小心剥取桦皮',
'清理和处理桦皮',
'设计制作图案',
'缝制和装饰',
'最终成品整理'
]
},
{
id: 2,
name: '传统刺绣工艺',
description: '精美的手工刺绣制作过程',
color: '#2d5016',
steps: [
'设计刺绣图案',
'选择合适面料',
'准备彩色丝线',
'绷布固定',
'精细刺绣',
'后期整理装裱'
]
}
])
// 传承人故事数据
const inheritorStories = ref([
{
id: 1,
name: '关小云',
title: '国家级非遗传承人',
age: 68,
experience: 45,
story: '从小跟随祖母学习桦皮制作技艺,经过几十年的钻研和实践,不仅掌握了传统技法,还在保持传统的基础上进行了创新发展。她制作的桦皮工艺品不仅实用,更是艺术品,深受人们喜爱。',
works: ['桦皮首饰盒', '桦皮装饰画', '桦皮茶具', '桦皮摆件']
},
{
id: 2,
name: '孟淑珍',
title: '自治区级非遗传承人',
age: 72,
experience: 50,
story: '自幼学习刺绣技艺,对传统图案有着深入的研究和理解。她的刺绣作品图案精美,色彩和谐,充分体现了鄂伦春族的文化特色。多年来培养了众多学生,为技艺传承做出了重要贡献。',
works: ['传统服饰刺绣', '装饰挂画', '手工包袋', '民族头饰']
}
])
// 计算属性
const currentHeritageList = computed(() => {
return heritageItems.value[activeLevel.value] || []
})
// 方法
const viewDetails = (item: any) => {
selectedHeritage.value = item
detailDialogVisible.value = true
}
const playCraftVideo = (craft: any) => {
// 模拟播放视频
console.log('播放视频:', craft.name)
}
</script>
<style scoped>
/* 页面头部 */
.page-header {
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
color: white;
padding: 4rem 0 2rem;
text-align: center;
}
.page-title {
font-size: 3rem;
font-weight: bold;
margin-bottom: 1rem;
}
.page-subtitle {
font-size: 1.2rem;
opacity: 0.9;
}
/* 非遗级别标签 */
.level-tabs {
display: flex;
justify-content: center;
margin-bottom: 2rem;
gap: 1rem;
}
.level-tab {
padding: 0.8rem 2rem;
border: 2px solid var(--primary-color);
background: transparent;
color: var(--primary-color);
border-radius: 25px;
cursor: pointer;
transition: all 0.3s ease;
font-weight: 500;
}
.level-tab:hover,
.level-tab.active {
background: var(--primary-color);
color: white;
}
/* 非遗列表 */
.heritage-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 2rem;
}
.heritage-item {
overflow: hidden;
transition: all 0.3s ease;
}
.heritage-item:hover {
transform: translateY(-5px);
}
.heritage-image {
width: 100%;
height: 150px;
}
.image-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: var(--background-light);
}
.heritage-info {
padding: 1.5rem;
}
.heritage-name {
font-size: 1.3rem;
color: var(--primary-color);
margin-bottom: 0.5rem;
font-weight: bold;
}
.heritage-category {
color: var(--secondary-color);
font-weight: 500;
margin-bottom: 1rem;
}
.heritage-description {
color: var(--text-color);
line-height: 1.6;
margin-bottom: 1rem;
}
.heritage-meta {
display: flex;
justify-content: space-between;
align-items: center;
}
.heritage-year {
color: var(--text-light);
font-size: 0.9rem;
}
/* 技艺展示 */
.crafts-showcase {
display: grid;
gap: 3rem;
}
.craft-item {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
align-items: start;
}
.craft-item:nth-child(even) {
direction: rtl;
}
.craft-item:nth-child(even) > * {
direction: ltr;
}
.craft-media {
position: relative;
}
.media-placeholder {
width: 100%;
border-radius: 12px;
overflow: hidden;
}
.media-controls {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.craft-content {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: var(--shadow);
}
.craft-title {
font-size: 1.5rem;
color: var(--primary-color);
margin-bottom: 1rem;
}
.craft-description {
color: var(--text-color);
line-height: 1.6;
margin-bottom: 1.5rem;
}
.craft-steps h4 {
color: var(--primary-color);
margin-bottom: 1rem;
}
.steps-list {
color: var(--text-color);
padding-left: 1.5rem;
}
.steps-list li {
margin-bottom: 0.5rem;
line-height: 1.5;
}
/* 传承人故事 */
.inheritors-stories {
display: grid;
gap: 2rem;
}
.story-card {
padding: 2rem;
}
.story-header {
display: flex;
align-items: center;
gap: 1.5rem;
margin-bottom: 2rem;
}
.avatar-placeholder {
border-radius: 50%;
overflow: hidden;
}
.inheritor-name {
font-size: 1.3rem;
color: var(--primary-color);
margin-bottom: 0.5rem;
}
.inheritor-title {
color: var(--secondary-color);
font-weight: 500;
margin-bottom: 0.5rem;
}
.inheritor-age {
color: var(--text-light);
font-size: 0.9rem;
}
.story-content h4 {
color: var(--primary-color);
margin: 1.5rem 0 1rem;
}
.story-content p {
color: var(--text-color);
line-height: 1.8;
margin-bottom: 1rem;
}
.works-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 1rem;
}
.work-item {
text-align: center;
}
.work-image {
margin-bottom: 0.5rem;
border-radius: 4px;
overflow: hidden;
}
.work-name {
font-size: 0.9rem;
color: var(--text-color);
}
/* 保护现状 */
.protection-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 2rem;
margin-bottom: 3rem;
}
.stat-card {
background: white;
padding: 2rem;
border-radius: 12px;
text-align: center;
box-shadow: var(--shadow);
}
.stat-number {
font-size: 3rem;
font-weight: bold;
color: var(--primary-color);
margin-bottom: 0.5rem;
}
.stat-label {
color: var(--text-color);
font-weight: 500;
}
.protection-measures h3 {
font-size: 1.5rem;
color: var(--primary-color);
margin-bottom: 2rem;
text-align: center;
}
.measures-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
}
.measure-item {
background: white;
padding: 2rem;
border-radius: 12px;
text-align: center;
box-shadow: var(--shadow);
}
.measure-icon {
color: var(--primary-color);
margin-bottom: 1rem;
}
.measure-item h4 {
color: var(--primary-color);
margin-bottom: 1rem;
}
.measure-item p {
color: var(--text-color);
line-height: 1.6;
}
/* 详情对话框 */
.heritage-detail {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
}
.detail-content h3 {
color: var(--primary-color);
margin: 1.5rem 0 1rem;
}
.detail-content h3:first-child {
margin-top: 0;
}
.detail-content p {
color: var(--text-color);
line-height: 1.8;
margin-bottom: 1rem;
}
.detail-content ul {
color: var(--text-color);
padding-left: 1.5rem;
}
.detail-content li {
margin-bottom: 0.5rem;
line-height: 1.5;
}
/* 响应式设计 */
@media (max-width: 768px) {
.page-title {
font-size: 2rem;
}
.level-tabs {
flex-wrap: wrap;
}
.heritage-list {
grid-template-columns: 1fr;
}
.craft-item {
grid-template-columns: 1fr;
}
.craft-item:nth-child(even) {
direction: ltr;
}
.story-header {
flex-direction: column;
text-align: center;
}
.works-grid {
grid-template-columns: repeat(2, 1fr);
}
.protection-stats,
.measures-grid {
grid-template-columns: 1fr;
}
.heritage-detail {
grid-template-columns: 1fr;
}
}
</style>