|
@@ -98,60 +98,186 @@
|
|
|
</div>
|
|
</div>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
- <!-- 项目成果 -->
|
|
|
|
|
- <section class="project-achievements">
|
|
|
|
|
- <h2 class="section-title">项目成果</h2>
|
|
|
|
|
- <div class="news-cards-container">
|
|
|
|
|
|
|
+ <!-- 技术亮点 -->
|
|
|
|
|
+ <section class="technical-highlights">
|
|
|
|
|
+ <h2 class="section-title">技术亮点</h2>
|
|
|
|
|
+ <div class="highlights-list">
|
|
|
<div
|
|
<div
|
|
|
- v-for="(news, index) in currentProject.achievements"
|
|
|
|
|
|
|
+ v-for="(highlight, index) in currentProject.technicalHighlights"
|
|
|
:key="index"
|
|
:key="index"
|
|
|
- class="news-card"
|
|
|
|
|
- @click="openNewsDetail(news)"
|
|
|
|
|
|
|
+ class="highlight-item"
|
|
|
>
|
|
>
|
|
|
- <div class="news-card-image">
|
|
|
|
|
- <img :src="news.image" :alt="news.title" class="card-image">
|
|
|
|
|
- <span class="news-category">{{ news.category }}</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="news-card-content">
|
|
|
|
|
- <span class="news-date">{{ news.date }}</span>
|
|
|
|
|
- <h3 class="news-title">{{ news.title }}</h3>
|
|
|
|
|
- <p class="news-summary">{{ news.summary }}</p>
|
|
|
|
|
- <div class="news-footer">
|
|
|
|
|
- <span class="read-more">了解详情 <el-icon><ArrowRight /></el-icon></span>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <el-icon><Star /></el-icon>
|
|
|
|
|
+ <p>{{ highlight }}</p>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
- <!-- 项目资料 -->
|
|
|
|
|
- <section class="project-materials">
|
|
|
|
|
- <h2 class="section-title">项目资料</h2>
|
|
|
|
|
- <div class="materials-grid">
|
|
|
|
|
|
|
+ <!-- 应用成效 -->
|
|
|
|
|
+ <section class="application-effects">
|
|
|
|
|
+ <h2 class="section-title">应用成效</h2>
|
|
|
|
|
+ <div class="news-list-container">
|
|
|
<div
|
|
<div
|
|
|
- v-for="(material, index) in currentProject.features"
|
|
|
|
|
|
|
+ v-for="(news, index) in currentProject.applicationEffects"
|
|
|
:key="index"
|
|
:key="index"
|
|
|
- class="material-item"
|
|
|
|
|
|
|
+ class="news-list-item"
|
|
|
|
|
+ @click="openNewsDetail(news)"
|
|
|
>
|
|
>
|
|
|
- <div class="material-icon">{{ material.icon }}</div>
|
|
|
|
|
- <h3 class="material-title">{{ material.title }}</h3>
|
|
|
|
|
- <p class="material-description">{{ material.description }}</p>
|
|
|
|
|
|
|
+ <div class="news-list-content">
|
|
|
|
|
+ <div class="news-list-header">
|
|
|
|
|
+ <span class="news-list-category">{{ news.category }}</span>
|
|
|
|
|
+ <span class="news-list-date">{{ news.date }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <h3 class="news-list-title">{{ news.title }}</h3>
|
|
|
|
|
+ <p class="news-list-summary">{{ news.summary }}</p>
|
|
|
|
|
+ <div class="news-list-footer">
|
|
|
|
|
+ <span class="read-more">阅读全文 <el-icon><ArrowRight /></el-icon></span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="news-list-image">
|
|
|
|
|
+ <img :src="news.image" :alt="news.title" class="list-image">
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
- <!-- 技术亮点 -->
|
|
|
|
|
- <section class="technical-highlights">
|
|
|
|
|
- <h2 class="section-title">技术亮点</h2>
|
|
|
|
|
- <div class="highlights-list">
|
|
|
|
|
- <div
|
|
|
|
|
- v-for="(highlight, index) in currentProject.technicalHighlights"
|
|
|
|
|
- :key="index"
|
|
|
|
|
- class="highlight-item"
|
|
|
|
|
- >
|
|
|
|
|
- <el-icon><Star /></el-icon>
|
|
|
|
|
- <p>{{ highlight }}</p>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <!-- 项目资料 -->
|
|
|
|
|
+ <section class="project-materials">
|
|
|
|
|
+ <h2 class="section-title">项目资料</h2>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 分类导航 -->
|
|
|
|
|
+ <div class="materials-tabs">
|
|
|
|
|
+ <el-tabs v-model="activeMaterialTab" type="card" @tab-click="handleTabClick">
|
|
|
|
|
+ <el-tab-pane label="全部" name="all">
|
|
|
|
|
+ <template #label>
|
|
|
|
|
+ <el-icon><Collection /></el-icon>
|
|
|
|
|
+ 全部
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <!-- 文件列表 -->
|
|
|
|
|
+ <div class="materials-list">
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="(material, index) in currentProject.materials"
|
|
|
|
|
+ :key="material.id"
|
|
|
|
|
+ class="material-item"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="material-icon">
|
|
|
|
|
+ <el-icon v-if="material.type === 'pdf' || material.category === '文件'"><Document /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'word'"><EditPen /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'excel'"><DataAnalysis /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'csv'"><Reading /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'zip'"><FolderOpened /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'video' || material.category === '媒体'"><VideoPlay /></el-icon>
|
|
|
|
|
+ <el-icon v-else><Picture /></el-icon>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-info">
|
|
|
|
|
+ <div class="material-name">{{ material.name }}</div>
|
|
|
|
|
+ <div class="material-meta">
|
|
|
|
|
+ <span class="meta-item">
|
|
|
|
|
+ <el-icon><Calendar /></el-icon>
|
|
|
|
|
+ {{ material.uploadDate }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span class="meta-item">
|
|
|
|
|
+ <el-icon><Collection /></el-icon>
|
|
|
|
|
+ {{ material.size }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-description">{{ material.description }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-actions">
|
|
|
|
|
+ <el-button type="primary" size="small" @click="downloadMaterial(material)">
|
|
|
|
|
+ <el-icon><Download /></el-icon>
|
|
|
|
|
+ 下载
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-tab-pane>
|
|
|
|
|
+
|
|
|
|
|
+ <el-tab-pane label="文件" name="文件">
|
|
|
|
|
+ <template #label>
|
|
|
|
|
+ <el-icon><Document /></el-icon>
|
|
|
|
|
+ 文件
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <!-- 文件列表 -->
|
|
|
|
|
+ <div class="materials-list">
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="(material, index) in currentProject.materials.filter(m => m.category === '文件')"
|
|
|
|
|
+ :key="material.id"
|
|
|
|
|
+ class="material-item"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="material-icon">
|
|
|
|
|
+ <el-icon v-if="material.type === 'pdf'"><Document /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'word'"><EditPen /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'excel'"><DataAnalysis /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'csv'"><Reading /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'zip'"><FolderOpened /></el-icon>
|
|
|
|
|
+ <el-icon v-else><Document /></el-icon>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-info">
|
|
|
|
|
+ <div class="material-name">{{ material.name }}</div>
|
|
|
|
|
+ <div class="material-meta">
|
|
|
|
|
+ <span class="meta-item">
|
|
|
|
|
+ <el-icon><Calendar /></el-icon>
|
|
|
|
|
+ {{ material.uploadDate }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span class="meta-item">
|
|
|
|
|
+ <el-icon><Collection /></el-icon>
|
|
|
|
|
+ {{ material.size }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-description">{{ material.description }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-actions">
|
|
|
|
|
+ <el-button type="primary" size="small" @click="downloadMaterial(material)">
|
|
|
|
|
+ <el-icon><Download /></el-icon>
|
|
|
|
|
+ 下载
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-tab-pane>
|
|
|
|
|
+
|
|
|
|
|
+ <el-tab-pane label="媒体" name="媒体">
|
|
|
|
|
+ <template #label>
|
|
|
|
|
+ <el-icon><VideoPlay /></el-icon>
|
|
|
|
|
+ 媒体
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <!-- 文件列表 -->
|
|
|
|
|
+ <div class="materials-list">
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="(material, index) in currentProject.materials.filter(m => m.category === '媒体')"
|
|
|
|
|
+ :key="material.id"
|
|
|
|
|
+ class="material-item"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="material-icon">
|
|
|
|
|
+ <el-icon v-if="material.type === 'video'"><VideoPlay /></el-icon>
|
|
|
|
|
+ <el-icon v-else-if="material.type === 'zip'"><FolderOpened /></el-icon>
|
|
|
|
|
+ <el-icon v-else><Picture /></el-icon>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-info">
|
|
|
|
|
+ <div class="material-name">{{ material.name }}</div>
|
|
|
|
|
+ <div class="material-meta">
|
|
|
|
|
+ <span class="meta-item">
|
|
|
|
|
+ <el-icon><Calendar /></el-icon>
|
|
|
|
|
+ {{ material.uploadDate }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span class="meta-item">
|
|
|
|
|
+ <el-icon><Collection /></el-icon>
|
|
|
|
|
+ {{ material.size }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-description">{{ material.description }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="material-actions">
|
|
|
|
|
+ <el-button type="primary" size="small" @click="downloadMaterial(material)">
|
|
|
|
|
+ <el-icon><Download /></el-icon>
|
|
|
|
|
+ 下载
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-tab-pane>
|
|
|
|
|
+ </el-tabs>
|
|
|
</div>
|
|
</div>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
@@ -265,6 +391,27 @@
|
|
|
</div>
|
|
</div>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
+ <!-- 微信链接弹窗 -->
|
|
|
|
|
+ <el-dialog
|
|
|
|
|
+ v-model="weixinLinkVisible"
|
|
|
|
|
+ title="抗咸潮保供水专项行动"
|
|
|
|
|
+ width="90%"
|
|
|
|
|
+ :before-close="closeWeixinLink"
|
|
|
|
|
+ class="weixin-link-dialog"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="weixin-link-content">
|
|
|
|
|
+ <iframe
|
|
|
|
|
+ :src="currentWeixinLink"
|
|
|
|
|
+ frameborder="0"
|
|
|
|
|
+ style="width: 100%; height: 80vh;"
|
|
|
|
|
+ title="抗咸潮保供水专项行动"
|
|
|
|
|
+ ></iframe>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <template #footer>
|
|
|
|
|
+ <el-button type="primary" @click="closeWeixinLink">关闭</el-button>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-dialog>
|
|
|
|
|
+
|
|
|
<footer class="page-footer">
|
|
<footer class="page-footer">
|
|
|
<p>© 2025 东南大区成果展示平台 - 金水内部测试系统</p>
|
|
<p>© 2025 东南大区成果展示平台 - 金水内部测试系统</p>
|
|
|
</footer>
|
|
</footer>
|
|
@@ -273,8 +420,9 @@
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
import PageHeader from './PageHeader.vue'
|
|
import PageHeader from './PageHeader.vue'
|
|
|
-import { ArrowLeft, ArrowRight, Calendar, Location, User, Star, VideoPlay, Picture } from '@element-plus/icons-vue'
|
|
|
|
|
|
|
+import { ArrowLeft, ArrowRight, Calendar, Location, User, Star, VideoPlay, Picture, Document, EditPen, DataAnalysis, Reading, FolderOpened, Collection, Download } from '@element-plus/icons-vue'
|
|
|
import { ref, onMounted, computed } from 'vue'
|
|
import { ref, onMounted, computed } from 'vue'
|
|
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
import { projectData } from '@/data/projectCasesData'
|
|
import { projectData } from '@/data/projectCasesData'
|
|
|
|
|
|
|
@@ -375,11 +523,33 @@ const currentMediaIndex = ref(0)
|
|
|
// 新闻详情弹窗相关变量
|
|
// 新闻详情弹窗相关变量
|
|
|
const newsDetailVisible = ref(false)
|
|
const newsDetailVisible = ref(false)
|
|
|
const currentNews = ref({})
|
|
const currentNews = ref({})
|
|
|
|
|
+const weixinLinkVisible = ref(false)
|
|
|
|
|
+const currentWeixinLink = ref('')
|
|
|
|
|
|
|
|
// 打开新闻详情弹窗
|
|
// 打开新闻详情弹窗
|
|
|
const openNewsDetail = (news) => {
|
|
const openNewsDetail = (news) => {
|
|
|
- currentNews.value = news
|
|
|
|
|
- newsDetailVisible.value = true
|
|
|
|
|
|
|
+ // 判断是否是需要打开微信链接的新闻
|
|
|
|
|
+ if (news.title.includes('抗咸保供水专项行动')) {
|
|
|
|
|
+ // 微信公众号链接不允许嵌入iframe,直接在新窗口打开
|
|
|
|
|
+ window.open('https://mp.weixin.qq.com/s/VQnFDQXvzJPY-YPhimapGg', '_blank')
|
|
|
|
|
+ } else if (news.title.includes('水利部太湖流域管理局组织开展2024年太湖流域防洪调度演练')) {
|
|
|
|
|
+ // 打开2024年防汛演练的微信链接
|
|
|
|
|
+ window.open('https://mp.weixin.qq.com/s/cqVi5NhpI0UtamGdRWxysg', '_blank')
|
|
|
|
|
+ } else if (news.title.includes('李国英调研数字孪生太湖建设工作')) {
|
|
|
|
|
+ // 打开李国英调研数字孪生太湖建设工作的微信链接
|
|
|
|
|
+ window.open('https://mp.weixin.qq.com/s/DoYywW9hos4zd3ZipDzwPA', '_blank')
|
|
|
|
|
+ } else if (news.title.includes('水利部组织开展2023年太湖流域防洪调度演练')) {
|
|
|
|
|
+ // 打开2023年防汛演练的新闻详情
|
|
|
|
|
+ currentNews.value = news
|
|
|
|
|
+ newsDetailVisible.value = true
|
|
|
|
|
+ } else if (news.title.includes('水利部太湖流域管理局组织开展2025年太湖流域防洪调度演练')) {
|
|
|
|
|
+ // 打开2025年防汛演练的新闻详情
|
|
|
|
|
+ currentNews.value = news
|
|
|
|
|
+ newsDetailVisible.value = true
|
|
|
|
|
+ } else {
|
|
|
|
|
+ currentNews.value = news
|
|
|
|
|
+ newsDetailVisible.value = true
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 关闭新闻详情弹窗
|
|
// 关闭新闻详情弹窗
|
|
@@ -388,6 +558,12 @@ const closeNewsDetail = () => {
|
|
|
currentNews.value = {}
|
|
currentNews.value = {}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 关闭微信链接弹窗
|
|
|
|
|
+const closeWeixinLink = () => {
|
|
|
|
|
+ weixinLinkVisible.value = false
|
|
|
|
|
+ currentWeixinLink.value = ''
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 打开媒体查看器
|
|
// 打开媒体查看器
|
|
|
const openMediaViewer = (caseItem, index) => {
|
|
const openMediaViewer = (caseItem, index) => {
|
|
|
currentMediaItem.value = caseItem
|
|
currentMediaItem.value = caseItem
|
|
@@ -440,6 +616,37 @@ const getCaseIcon = (index) => {
|
|
|
return icons[index % icons.length]
|
|
return icons[index % icons.length]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 项目资料分类切换
|
|
|
|
|
+const activeMaterialTab = ref('all')
|
|
|
|
|
+
|
|
|
|
|
+// 过滤后的项目资料
|
|
|
|
|
+const filteredMaterials = computed(() => {
|
|
|
|
|
+ if (activeMaterialTab.value === 'all') {
|
|
|
|
|
+ return currentProject.value.materials
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return currentProject.value.materials.filter(m => m.category === activeMaterialTab.value)
|
|
|
|
|
+ }
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+// 标签页点击事件
|
|
|
|
|
+const handleTabClick = (tab) => {
|
|
|
|
|
+ activeMaterialTab.value = tab.props.name
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 下载项目资料
|
|
|
|
|
+const downloadMaterial = (material) => {
|
|
|
|
|
+ // 模拟下载功能
|
|
|
|
|
+ console.log('开始下载文件:', material.name)
|
|
|
|
|
+
|
|
|
|
|
+ // 这里可以添加实际的下载逻辑,例如:
|
|
|
|
|
+ // 1. 调用后端接口获取文件下载地址
|
|
|
|
|
+ // 2. 创建下载链接并触发点击
|
|
|
|
|
+ // 3. 显示下载进度和状态
|
|
|
|
|
+
|
|
|
|
|
+ // 模拟下载成功提示
|
|
|
|
|
+ ElMessage.success(`正在下载: ${material.name}`)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 返回首页
|
|
// 返回首页
|
|
|
const goToHome = () => {
|
|
const goToHome = () => {
|
|
|
router.push('/')
|
|
router.push('/')
|
|
@@ -592,45 +799,133 @@ const goToHome = () => {
|
|
|
margin-bottom: 2rem;
|
|
margin-bottom: 2rem;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.materials-grid {
|
|
|
|
|
- display: grid;
|
|
|
|
|
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
|
|
|
- gap: 1.5rem;
|
|
|
|
|
|
|
+.material-category {
|
|
|
|
|
+ margin-bottom: 2rem;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.material-item {
|
|
|
|
|
|
|
+.category-title {
|
|
|
|
|
+ font-size: 1.25rem;
|
|
|
|
|
+ color: #2c3e50;
|
|
|
|
|
+ margin-bottom: 1.5rem;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ line-height: 1.4;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 0.5rem;
|
|
|
|
|
+ padding: 0.5rem 1rem;
|
|
|
|
|
+ background: #f8f9fa;
|
|
|
|
|
+ border-left: 4px solid #326ee2;
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.materials-list {
|
|
|
background: white;
|
|
background: white;
|
|
|
- padding: 2rem;
|
|
|
|
|
border-radius: 16px;
|
|
border-radius: 16px;
|
|
|
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
|
|
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.material-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 1.5rem 2rem;
|
|
|
|
|
+ border-bottom: 1px solid #f0f0f0;
|
|
|
transition: all 0.3s ease;
|
|
transition: all 0.3s ease;
|
|
|
- text-align: center;
|
|
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.material-item:last-child {
|
|
|
|
|
+ border-bottom: none;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.material-item:hover {
|
|
.material-item:hover {
|
|
|
- transform: translateY(-10px);
|
|
|
|
|
- box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
|
|
|
|
|
|
|
+ background-color: #f8f9fa;
|
|
|
|
|
+ transform: translateX(5px);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.material-icon {
|
|
.material-icon {
|
|
|
- font-size: 3rem;
|
|
|
|
|
- margin-bottom: 1.5rem;
|
|
|
|
|
|
|
+ font-size: 2rem;
|
|
|
|
|
+ color: #326ee2;
|
|
|
|
|
+ min-width: 60px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ margin-right: 1.5rem;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.material-title {
|
|
|
|
|
- font-size: 1.25rem;
|
|
|
|
|
|
|
+.material-info {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.material-name {
|
|
|
|
|
+ font-size: 1.1rem;
|
|
|
color: #2c3e50;
|
|
color: #2c3e50;
|
|
|
- margin-bottom: 1rem;
|
|
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
|
|
+ margin-bottom: 0.5rem;
|
|
|
line-height: 1.4;
|
|
line-height: 1.4;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.material-meta {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ gap: 1.5rem;
|
|
|
|
|
+ margin-bottom: 0.5rem;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.material-meta .meta-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 0.3rem;
|
|
|
|
|
+ font-size: 0.8rem;
|
|
|
|
|
+ color: #7f8c8d;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.material-description {
|
|
.material-description {
|
|
|
font-size: 0.875rem;
|
|
font-size: 0.875rem;
|
|
|
color: #7f8c8d;
|
|
color: #7f8c8d;
|
|
|
line-height: 1.6;
|
|
line-height: 1.6;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.material-actions {
|
|
|
|
|
+ margin-left: 1.5rem;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 项目资料标签页样式 */
|
|
|
|
|
+.materials-tabs {
|
|
|
|
|
+ margin-bottom: 1.5rem;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.materials-tabs :deep(.el-tabs__header) {
|
|
|
|
|
+ margin-bottom: 1rem;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.materials-tabs :deep(.el-tabs__nav-wrap) {
|
|
|
|
|
+ margin-bottom: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.materials-tabs :deep(.el-tabs__nav) {
|
|
|
|
|
+ border-bottom: 1px solid #e4e7ed;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.materials-tabs :deep(.el-tabs__item) {
|
|
|
|
|
+ border-bottom: 2px solid transparent;
|
|
|
|
|
+ color: #606266;
|
|
|
|
|
+ font-size: 1rem;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ padding: 0.75rem 1.5rem;
|
|
|
|
|
+ margin-right: 1rem;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.materials-tabs :deep(.el-tabs__item:hover) {
|
|
|
|
|
+ color: #326ee2;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.materials-tabs :deep(.el-tabs__item.is-active) {
|
|
|
|
|
+ color: #326ee2;
|
|
|
|
|
+ border-bottom-color: #326ee2;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.materials-tabs :deep(.el-tabs__nav-wrap::after) {
|
|
|
|
|
+ display: none;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/* 技术亮点 */
|
|
/* 技术亮点 */
|
|
|
.technical-highlights {
|
|
.technical-highlights {
|
|
|
background: white;
|
|
background: white;
|
|
@@ -816,6 +1111,109 @@ const goToHome = () => {
|
|
|
transform: translateX(5px);
|
|
transform: translateX(5px);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* 应用成效 */
|
|
|
|
|
+.application-effects {
|
|
|
|
|
+ margin-bottom: 2rem;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-container {
|
|
|
|
|
+ background: white;
|
|
|
|
|
+ border-radius: 16px;
|
|
|
|
|
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ gap: 2rem;
|
|
|
|
|
+ padding: 1.5rem 2rem;
|
|
|
|
|
+ border-bottom: 1px solid #f0f0f0;
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-item:last-child {
|
|
|
|
|
+ border-bottom: none;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-item:hover {
|
|
|
|
|
+ background: #f8f9fa;
|
|
|
|
|
+ transform: translateX(5px);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-content {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ gap: 1rem;
|
|
|
|
|
+ margin-bottom: 0.75rem;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-category {
|
|
|
|
|
+ background: #e3f2fd;
|
|
|
|
|
+ color: #1565c0;
|
|
|
|
|
+ padding: 0.25rem 0.75rem;
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ font-size: 0.75rem;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ text-transform: uppercase;
|
|
|
|
|
+ letter-spacing: 0.5px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-date {
|
|
|
|
|
+ font-size: 0.875rem;
|
|
|
|
|
+ color: #7f8c8d;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-title {
|
|
|
|
|
+ font-size: 1.25rem;
|
|
|
|
|
+ color: #2c3e50;
|
|
|
|
|
+ margin-bottom: 0.75rem;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ line-height: 1.4;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-summary {
|
|
|
|
|
+ font-size: 0.875rem;
|
|
|
|
|
+ color: #7f8c8d;
|
|
|
|
|
+ line-height: 1.6;
|
|
|
|
|
+ margin-bottom: 1rem;
|
|
|
|
|
+ display: -webkit-box;
|
|
|
|
|
+ -webkit-line-clamp: 2;
|
|
|
|
|
+ -webkit-box-orient: vertical;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-footer {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 0.5rem;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-image {
|
|
|
|
|
+ width: 200px;
|
|
|
|
|
+ height: 120px;
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.list-image {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ object-fit: cover;
|
|
|
|
|
+ transition: transform 0.3s ease;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.news-list-item:hover .list-image {
|
|
|
|
|
+ transform: scale(1.05);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/* 新闻详情弹窗样式 */
|
|
/* 新闻详情弹窗样式 */
|
|
|
.news-detail-dialog :deep(.el-dialog__header) {
|
|
.news-detail-dialog :deep(.el-dialog__header) {
|
|
|
background: #326ee2;
|
|
background: #326ee2;
|