Oroqen-Vue/src/views/Heritage.vue
2025-08-07 21:29:04 +08:00

763 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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