feat: 添加模型库页面和导航按钮

- 在页面配置中新增MODEL_GALLERY页面类型
- 创建ModelGalleryPage空白页面组件,使用标准结构和CSS变量系统
- 在头部导航栏"导出"按钮旁添加"模型库"按钮
- 在DashboardView中集成新页面
- 模型库页面不需要CAD连接即可访问

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
sladro 2025-10-10 16:20:51 +08:00
parent 2c2002d261
commit 6141986249
4 changed files with 214 additions and 0 deletions

View File

@ -42,6 +42,13 @@
>
<i class="fas fa-download"></i>导出
</button>
<button
class="nav-item"
:class="{ active: currentPage === PAGE_TYPES.MODEL_GALLERY }"
@click="handleNavClick(PAGE_TYPES.MODEL_GALLERY)"
>
<i class="fas fa-images"></i>模型库
</button>
<button
class="nav-item"
:class="{ active: currentPage === PAGE_TYPES.FORMAT_CONVERTER }"

View File

@ -0,0 +1,200 @@
<template>
<div class="gallery-container">
<!-- 页面头部 -->
<div class="gallery-header">
<div class="header-content">
<div class="header-icon">
<i class="fas fa-images"></i>
</div>
<div class="header-text">
<h2>模型库</h2>
<p>浏览和管理您的模型资源</p>
</div>
</div>
</div>
<!-- 页面内容 -->
<div class="gallery-content">
<div class="placeholder-section">
<div class="placeholder-icon">
<i class="fas fa-cube"></i>
</div>
<h3>模型库功能开发中</h3>
<p>这里将展示所有已保存的模型文件方便您快速查看和管理</p>
<div class="feature-preview">
<div class="preview-item">
<i class="fas fa-folder-open"></i>
<span>模型分类浏览</span>
</div>
<div class="preview-item">
<i class="fas fa-search"></i>
<span>快速搜索定位</span>
</div>
<div class="preview-item">
<i class="fas fa-download"></i>
<span>一键导入导出</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
// -
</script>
<style scoped>
.gallery-container {
padding: var(--spacing-2xl);
max-width: 900px;
margin: 0 auto;
}
.gallery-header {
margin-bottom: var(--spacing-3xl);
}
.header-content {
display: flex;
align-items: center;
gap: var(--spacing-xl);
}
.header-icon {
width: var(--size-64);
height: var(--size-64);
background: var(--color-primary-gradient);
border-radius: var(--size-border-radius-card);
display: flex;
align-items: center;
justify-content: center;
font-size: var(--font-size-4xl);
color: white;
box-shadow: 0 4px 16px var(--color-primary-rgb);
}
.header-text h2 {
color: var(--color-text-primary);
margin: 0 0 var(--spacing-sm) 0;
font-size: var(--font-size-5xl);
font-weight: var(--font-weight-semibold);
}
.header-text p {
color: var(--color-text-secondary);
margin: 0;
font-size: var(--font-size-lg);
}
.gallery-content {
background: var(--color-bg-secondary);
border: 1px solid var(--color-border-primary);
border-radius: var(--size-border-radius-card);
padding: var(--spacing-5xl);
}
.placeholder-section {
text-align: center;
padding: var(--spacing-4xl) var(--spacing-2xl);
}
.placeholder-icon {
width: var(--size-96);
height: var(--size-96);
background: var(--color-primary-gradient);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: var(--font-size-6xl);
color: white;
margin: 0 auto var(--spacing-2xl);
box-shadow: 0 8px 32px var(--color-primary-rgb-3);
}
.placeholder-section h3 {
color: var(--color-text-primary);
margin: 0 0 var(--spacing-md) 0;
font-size: var(--font-size-2xl);
font-weight: var(--font-weight-semibold);
}
.placeholder-section p {
color: var(--color-text-secondary);
margin: 0 0 var(--spacing-3xl) 0;
font-size: var(--font-size-lg);
line-height: 1.6;
}
.feature-preview {
display: flex;
gap: var(--spacing-2xl);
justify-content: center;
flex-wrap: wrap;
margin-top: var(--spacing-3xl);
}
.preview-item {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-md);
padding: var(--spacing-xl);
background: var(--color-bg-tertiary);
border: 1px solid var(--color-border-primary);
border-radius: var(--size-border-radius);
min-width: var(--size-150);
transition: var(--transition-all);
}
.preview-item:hover {
background: var(--color-bg-hover);
border-color: var(--color-primary);
transform: translateY(-2px);
}
.preview-item i {
font-size: var(--font-size-3xl);
color: var(--color-primary);
}
.preview-item span {
color: var(--color-text-primary);
font-size: var(--font-size-base);
font-weight: var(--font-weight-medium);
}
/* 响应式设计 */
@media (max-width: 768px) {
.gallery-container {
padding: var(--spacing-lg);
}
.header-content {
gap: var(--spacing-md);
}
.header-icon {
width: var(--size-48);
height: var(--size-48);
font-size: var(--font-size-2xl);
}
.header-text h2 {
font-size: var(--font-size-3xl);
}
.placeholder-icon {
width: var(--size-64);
height: var(--size-64);
font-size: var(--font-size-4xl);
}
.feature-preview {
flex-direction: column;
align-items: stretch;
}
}
</style>

View File

@ -2,6 +2,7 @@
export const PAGE_TYPES = {
HOME: 'home',
MODEL_VIEWER: 'model-viewer',
MODEL_GALLERY: 'model-gallery',
ANALYSIS_TOOLS: 'analysis-tools',
EXPORT_TOOLS: 'export-tools',
FORMAT_CONVERTER: 'format-converter',

View File

@ -134,6 +134,11 @@
<UniversalConverter />
</div>
<!-- 模型库页面 -->
<div v-else-if="currentPage === PAGE_TYPES.MODEL_GALLERY" class="page-content">
<ModelGalleryPage />
</div>
<!-- 智能薄壳化分析结果页面 -->
<div v-else-if="currentPage === PAGE_TYPES.SHELL_ANALYSIS_RESULT" class="page-content">
<ShellAnalysisResult :analysis-data="shellAnalysisData" />
@ -276,6 +281,7 @@ import CreoModelAnalysis from '@/components/pages/CreoModelAnalysis.vue'
import CreoExportTools from '@/components/pages/CreoExportTools.vue'
import RevitExportTools from '@/components/pages/RevitExportTools.vue'
import UniversalConverter from '@/components/pages/UniversalConverter.vue'
import ModelGalleryPage from '@/components/pages/ModelGalleryPage.vue'
import ShellAnalysisResult from '@/components/pages/ShellAnalysisResult.vue'
import HierarchyAnalysisResult from '@/components/pages/HierarchyAnalysisResult.vue'
import HierarchyDeletionParamsPage from '@/components/pages/HierarchyDeletionParamsPage.vue'