diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 04147cd..5aeb62c 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -8,7 +8,8 @@ "WebFetch(domain:3d.hunyuan.tencent.com)", "WebSearch", "WebFetch(domain:cloud.tencent.com)", - "WebFetch(domain:cloud.tencent.com.cn)" + "WebFetch(domain:cloud.tencent.com.cn)", + "WebFetch(domain:ui-ux-pro-max-skill.nextlevelbuilder.io)" ] } } diff --git a/frontend/src/layouts/BasicLayout.vue b/frontend/src/layouts/BasicLayout.vue index eca06eb..3eed78d 100644 --- a/frontend/src/layouts/BasicLayout.vue +++ b/frontend/src/layouts/BasicLayout.vue @@ -323,11 +323,11 @@ const handleLogout = async () => { color: var(--sidebar-menu-text-selected, #01412b); // Logo 文字使用主题色 margin-bottom: 8px; border-radius: 0; // 保持直角,与图片一致 - padding: 12px; + padding: 20px 12px; img { max-width: 100%; - max-height: 40px; + max-height: 30px; object-fit: contain; } diff --git a/frontend/src/views/contests/Activities.vue b/frontend/src/views/contests/Activities.vue index 0c20238..80fca00 100644 --- a/frontend/src/views/contests/Activities.vue +++ b/frontend/src/views/contests/Activities.vue @@ -27,165 +27,95 @@ -
-
-
- -
-
- -
+
+ +
+ +
+ + +
{{ contest.contestName }}
+ + +
+ 赛事时间:{{ formatDate(contest.startTime) }} ~ {{ formatDate(contest.endTime) }} +
+ + +
+ + {{ contest.contestType === "individual" ? "个人赛" : "团队赛" }} + + + {{ getStatusText(contest) }} + + + {{ getStageText(contest) }} + +
+ + +
+ + - - - - - -
-
- - -
-
{{ contest.contestName }}
-
-
- - {{ getStatusText(contest) }} - - - {{ getStageText(contest) }} - -
-
-
- 赛事时间: - - {{ formatDate(contest.startTime) }} ~ - {{ formatDate(contest.endTime) }} - -
-
- 报名中 - 报名时间: - - {{ formatDate(contest.registerStartTime) }} ~ - {{ formatDate(contest.registerEndTime) }} - -
-
- 征稿中 - 提交作品: - - {{ formatDate(contest.submitStartTime) }} ~ - {{ formatDate(contest.submitEndTime) }} - -
-
- 评审中 - 评审作品: - - {{ formatDate(contest.reviewStartTime) }} ~ - {{ formatDate(contest.reviewEndTime) }} - -
-
- 结果公布: - - {{ formatDate(contest.resultPublishTime) }} - -
-
-
-
- - -
- - 查看活动 + + + + +
@@ -223,6 +153,7 @@ import { ref, reactive, computed, onMounted } from "vue" import { useRouter, useRoute } from "vue-router" import { message } from "ant-design-vue" +import { TrophyOutlined } from "@ant-design/icons-vue" import dayjs from "dayjs" import { contestsApi, @@ -487,6 +418,10 @@ onMounted(() => { diff --git a/frontend/src/views/workbench/ai-3d/History.vue b/frontend/src/views/workbench/ai-3d/History.vue index 514c8e7..4fcab47 100644 --- a/frontend/src/views/workbench/ai-3d/History.vue +++ b/frontend/src/views/workbench/ai-3d/History.vue @@ -67,7 +67,6 @@ class="history-card" @click="handleViewTask(task)" > -
{{ getStatusText(task.status) }}
+ + +
+ + + +
-
- - {{ task.inputType === 'text' ? '文生3D' : '图生3D' }} - -
{{ task.inputContent }}
@@ -118,30 +140,9 @@ {{ formatTime(task.createTime) }} -
- -
- -
-
- -
- -
-
- -
- -
-
-
+ + {{ task.inputType === 'text' ? '文生3D' : '图生3D' }} +
@@ -472,22 +473,37 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-light 100%); display: flex; align-items: center; justify-content: space-between; - background: rgba($surface, 0.7); - backdrop-filter: blur(20px); - border-bottom: 1px solid rgba($primary, 0.1); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); + flex-shrink: 0; position: relative; z-index: 10; - flex-shrink: 0; +} - .header-left { +.header-left { + display: flex; + align-items: center; + gap: 16px; + + .back-btn { + color: $text !important; + width: 40px; + height: 40px; + border-radius: 10px !important; + border: 1px solid rgba($primary, 0.3) !important; display: flex; align-items: center; - gap: 16px; + justify-content: center; + transition: all 0.3s !important; + flex-shrink: 0; + + &:hover { + background: rgba($primary, 0.2) !important; + border-color: $primary !important; + transform: translateY(-1px); + } } .title { - font-size: 18px; + font-size: 20px; font-weight: 600; background: $gradient-primary; -webkit-background-clip: text; @@ -496,33 +512,22 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-light 100%); } .count-badge { - padding: 4px 12px; + display: flex; + align-items: center; + gap: 6px; + padding: 4px 10px; background: rgba($primary, 0.1); border: 1px solid rgba($primary, 0.2); border-radius: 20px; - font-size: 12px; color: $primary; - font-weight: 500; + font-size: 11px; + font-weight: 600; } } -.back-btn { - color: $text !important; - width: 40px; - height: 40px; - border-radius: 10px !important; - border: 1px solid rgba($primary, 0.3) !important; +.header-right { display: flex; - align-items: center; - justify-content: center; - transition: all 0.3s ease !important; - flex-shrink: 0; - - &:hover { - background: rgba($primary, 0.1) !important; - border-color: $primary !important; - transform: translateY(-1px); - } + gap: 8px; } // ========================================== @@ -658,53 +663,47 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-light 100%); .history-card { background: $surface; - border-radius: 8px; + border-radius: 12px; overflow: hidden; cursor: pointer; - transition: all 0.3s ease; - border: 1px solid rgba(0, 0, 0, 0.06); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); position: relative; + // border: 1px solid rgba(0, 0, 0, 0.06); &:hover { - transform: translateY(-4px); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); - - .card-glow { - opacity: 0.3; + .card-preview { + transform: scale(1.03); } - .preview-image { - transform: scale(1.1); + .card-preview .preview-image { + transform: scale(1.05); + } + + .card-actions-overlay { + opacity: 1; } } } -.card-glow { - position: absolute; - inset: -2px; - background: $primary; - border-radius: 10px; - z-index: -1; - opacity: 0; - filter: blur(8px); - transition: opacity 0.3s; -} - .card-preview { height: 160px; - background: rgba($surface-light, 0.8); + // border-radius: 8px; + background: linear-gradient( + 135deg, + rgba($surface-light, 0.9) 0%, + rgba($primary, 0.05) 100% + ); display: flex; align-items: center; justify-content: center; position: relative; overflow: hidden; + transition: transform 0.3s ease; .preview-image { width: 100%; height: 100%; object-fit: cover; - transition: transform 0.5s ease; + transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); } .preview-loading, @@ -739,6 +738,62 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-light 100%); } } +// 悬停时显示的操作按钮遮罩层 +.card-actions-overlay { + position: absolute; + inset: 0; + background: linear-gradient( + to top, + rgba(0, 0, 0, 0.6) 0%, + rgba(0, 0, 0, 0.2) 50%, + transparent 100% + ); + display: flex; + align-items: flex-end; + justify-content: center; + padding-bottom: 16px; + gap: 10px; + opacity: 0; + transition: opacity 0.3s ease; + z-index: 10; + + .overlay-btn { + display: flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + border-radius: 6px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + border: none; + + &.btn-primary { + background: $primary; + color: white; + + &:hover { + background: $primary-light; + } + } + + &.btn-secondary { + background: rgba(255, 255, 255, 0.9); + color: $text; + + &:hover { + background: white; + } + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + } +} + @keyframes pulse-error { 0%, 100% { transform: scale(1); @@ -812,22 +867,19 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-light 100%); .card-info { padding: 16px; - background: rgba($primary, 0.15); -} - -.card-type { - margin-bottom: 8px; + background: $surface; + border-top: 1px solid rgba($primary, 0.06); } .card-desc { font-size: 14px; color: $text; - font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 12px; - line-height: 1.5; + font-weight: 500; + line-height: 1.4; } .card-meta { @@ -844,46 +896,20 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-light 100%); color: $text-muted; } -.card-actions { - display: flex; - gap: 8px; -} - -.action-btn { - width: 32px; - height: 32px; - background: rgba($primary, 0.1); - border: 1px solid rgba($primary, 0.2); - border-radius: 8px; - display: flex; +.card-type { + display: inline-flex; align-items: center; - justify-content: center; - color: $primary-light; - cursor: pointer; - transition: all 0.3s ease; - - &:hover { - background: rgba($primary-light, 0.2); - border-color: $primary-light; - color: $primary-light; - transform: scale(1.1); - } - - &.danger:hover { - background: rgba($error, 0.15); - border-color: $error; - color: $error; - } - - &.disabled { - opacity: 0.4; - cursor: not-allowed; - - &:hover { - transform: none; - background: rgba($primary, 0.08); - } - } + padding: 4px 10px; + background: linear-gradient( + 135deg, + rgba($primary, 0.1) 0%, + rgba($primary-light, 0.15) 100% + ); + border: 1px solid rgba($primary, 0.2); + border-radius: 12px; + font-size: 11px; + font-weight: 500; + color: $primary; } // ========================================== diff --git a/frontend/src/views/workbench/ai-3d/Index.vue b/frontend/src/views/workbench/ai-3d/Index.vue index f5c10a4..a2ad352 100644 --- a/frontend/src/views/workbench/ai-3d/Index.vue +++ b/frontend/src/views/workbench/ai-3d/Index.vue @@ -37,7 +37,7 @@
- + 创意描述
@@ -100,7 +100,7 @@
- 🖼️ + 参考图片
@@ -165,11 +165,7 @@
-
- - AI Powered -
-

用一句话、一张图
创造你的 3D 世界

+

用一句话、一张图,创造你的 3D 世界

借助先进的 AI 技术,将文字描述或图片瞬间转化为专业级 3D 模型

@@ -177,7 +173,7 @@
- +

AI 智能建模

@@ -187,7 +183,7 @@
- 👁 +

实时预览

@@ -197,7 +193,7 @@
- 📁 +

作品管理

@@ -207,7 +203,7 @@
- 🔄 +

迭代优化

@@ -256,7 +252,6 @@ class="history-card" @click="handleViewTask(task)" > -
{{ getStatusText(task.status) }}
+ + +
+ + + +
@@ -308,37 +331,15 @@ {{ formatTime(task.createTime) }} -
- -
- -
-
- -
- -
-
- -
- -
-
-
+ + {{ task.inputType === "text" ? "文生3D" : "图生3D" }} +
-
@@ -358,6 +359,10 @@ import { ArrowRightOutlined, ArrowLeftOutlined, ClockCircleOutlined, + BulbOutlined, + FolderOutlined, + SyncOutlined, + EditOutlined, } from "@ant-design/icons-vue" import { createAI3DTask, @@ -873,7 +878,6 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); display: flex; align-items: center; gap: 16px; - border-bottom: 1px solid rgba($primary, 0.1); flex-shrink: 0; .back-btn { @@ -946,7 +950,6 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); .panel-header { padding: 20px 24px; - border-bottom: 1px solid rgba($primary, 0.1); flex-shrink: 0; :deep(.ant-segmented) { @@ -999,6 +1002,7 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); .label-icon { font-size: 16px; + color: $primary; } } @@ -1211,7 +1215,6 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); .panel-footer { padding: 24px; - border-top: 1px solid rgba($primary, 0.1); flex-shrink: 0; } @@ -1302,66 +1305,46 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); height: 100vh; background: rgba($surface, 0.3); backdrop-filter: blur(20px); + padding-top: 30px; } .intro-section { padding: 48px; flex-shrink: 0; -} - -.intro-badge { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 6px 14px; - background: rgba($primary, 0.15); - border: 1px solid rgba($primary, 0.3); - border-radius: 20px; - font-size: 11px; - font-weight: 600; - color: $primary-light; - letter-spacing: 1px; - text-transform: uppercase; - margin-bottom: 20px; - - .badge-dot { - width: 6px; - height: 6px; - background: $accent; - border-radius: 50%; - animation: pulse 1.5s ease-in-out infinite; - } -} - -@keyframes pulse { - 0%, - 100% { - opacity: 1; - transform: scale(1); - } - 50% { - opacity: 0.5; - transform: scale(0.8); - } + text-align: center; } .intro-title { font-size: 36px; font-weight: 700; - color: $text; margin-bottom: 16px; line-height: 1.3; - background: $gradient-primary; + background: linear-gradient( + 135deg, + $primary 0%, + $primary-light 40%, + #8b5cf6 70%, + #a855f7 100% + ); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } +@media (max-width: 900px) { + .intro-title { + font-size: 28px; + } +} + .intro-desc { font-size: 16px; color: $text-muted; margin-bottom: 32px; line-height: 1.6; + max-width: 500px; + margin-left: auto; + margin-right: auto; } .intro-features { @@ -1389,7 +1372,8 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); display: flex; align-items: center; justify-content: center; - font-size: 20px; + font-size: 22px; + color: #fff; flex-shrink: 0; &.gradient-1 { @@ -1578,53 +1562,47 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); flex-shrink: 0; width: 240px; background: $surface; - border-radius: 8px; + border-radius: 12px; overflow: hidden; cursor: pointer; - transition: all 0.3s; - border: 1px solid rgba(0, 0, 0, 0.06); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); position: relative; + // border: 1px solid rgba(0, 0, 0, 0.06); &:hover { - transform: translateY(-4px); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + .card-preview { + transform: scale(1.03); + } - .card-glow { - opacity: 0.3; + .card-preview .preview-image { + transform: scale(1.05); + } + + .card-actions-overlay { + opacity: 1; } } } -.card-glow { - position: absolute; - inset: -2px; - background: $primary; - border-radius: 10px; - z-index: -1; - opacity: 0; - filter: blur(8px); - transition: opacity 0.3s; -} - .card-preview { height: 160px; - background: rgba($surface-light, 0.8); + // border-radius: 8px; + background: linear-gradient( + 135deg, + rgba($surface-light, 0.9) 0%, + rgba($primary, 0.05) 100% + ); display: flex; align-items: center; justify-content: center; position: relative; overflow: hidden; + transition: transform 0.3s ease; .preview-image { width: 100%; height: 100%; object-fit: cover; - transition: transform 0.5s; - } - - .history-card:hover & .preview-image { - transform: scale(1.1); + transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); } .preview-loading, @@ -1646,7 +1624,11 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); .failed-icon { width: 56px; height: 56px; - background: linear-gradient(135deg, rgba($error, 0.15) 0%, rgba($error, 0.25) 100%); + background: linear-gradient( + 135deg, + rgba($error, 0.15) 0%, + rgba($error, 0.25) 100% + ); border: 2px solid rgba($error, 0.3); border-radius: 50%; display: flex; @@ -1659,8 +1641,65 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); } } +// 悬停时显示的操作按钮遮罩层 +.card-actions-overlay { + position: absolute; + inset: 0; + background: linear-gradient( + to top, + rgba(0, 0, 0, 0.6) 0%, + rgba(0, 0, 0, 0.2) 50%, + transparent 100% + ); + display: flex; + align-items: flex-end; + justify-content: center; + padding-bottom: 16px; + gap: 10px; + opacity: 0; + transition: opacity 0.3s ease; + z-index: 10; + + .overlay-btn { + display: flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + border-radius: 6px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + border: none; + + &.btn-primary { + background: $primary; + color: white; + + &:hover { + background: $primary-light; + } + } + + &.btn-secondary { + background: rgba(255, 255, 255, 0.9); + color: $text; + + &:hover { + background: white; + } + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + } +} + @keyframes pulse-error { - 0%, 100% { + 0%, + 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba($error, 0.3); } @@ -1740,7 +1779,8 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); .card-info { padding: 16px; - background: rgba(9, 88, 217, 0.15); + background: $surface; + border-top: 1px solid rgba($primary, 0.06); } .card-desc { @@ -1751,6 +1791,7 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); text-overflow: ellipsis; margin-bottom: 12px; font-weight: 500; + line-height: 1.4; } .card-meta { @@ -1767,50 +1808,20 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); color: $text-muted; } -.card-actions { - display: flex; - gap: 8px; -} - -.action-btn { - width: 32px; - height: 32px; - background: rgba($primary, 0.1); - border: 1px solid rgba($primary, 0.2); - border-radius: 8px; - display: flex; +.card-type { + display: inline-flex; align-items: center; - justify-content: center; - color: $primary-light; - cursor: pointer; - transition: all 0.3s; - - &:hover { - background: rgba($primary-light, 0.2); - border-color: $primary-light; - color: $primary-light; - transform: scale(1.1); - } - - &.danger { - &:hover { - background: rgba($accent, 0.2); - border-color: $accent; - color: $accent; - } - } - - &.disabled { - opacity: 0.4; - cursor: not-allowed; - - &:hover { - background: rgba($primary, 0.1); - border-color: rgba($primary, 0.2); - color: $primary-light; - transform: none; - } - } + padding: 4px 10px; + background: linear-gradient( + 135deg, + rgba($primary, 0.1) 0%, + rgba($primary-light, 0.15) 100% + ); + border: 1px solid rgba($primary, 0.2); + border-radius: 12px; + font-size: 11px; + font-weight: 500; + color: $primary; } // ========================================== @@ -1849,6 +1860,13 @@ $gradient-secondary: linear-gradient(135deg, $accent 0%, $primary 100%); .history-card { width: 180px; + + .card-actions-overlay { + .overlay-btn { + padding: 6px 10px; + font-size: 12px; + } + } } }