diff --git a/frontend/src/views/workbench/ai-3d/History.vue b/frontend/src/views/workbench/ai-3d/History.vue index 3b5820f..d10c30a 100644 --- a/frontend/src/views/workbench/ai-3d/History.vue +++ b/frontend/src/views/workbench/ai-3d/History.vue @@ -103,48 +103,38 @@
{{ getStatusText(task.status) }}
- - -
- - - -
-
-
- {{ task.inputContent }} + +
+
+ + {{ task.inputContent }}
-
- - - {{ formatTime(task.createTime) }} - - - {{ task.inputType === "text" ? "文生3D" : "图生3D" }} - + {{ formatDate(task.createTime) }} +
+ + + + + +
@@ -173,8 +163,6 @@ import { ArrowLeftOutlined, FileImageOutlined, CloseOutlined, - ClockCircleOutlined, - EyeOutlined, ReloadOutlined, DeleteOutlined, ThunderboltOutlined, @@ -284,6 +272,11 @@ const formatTime = (time: string) => { return dayjs(time).format("YYYY-MM-DD HH:mm") } +// 格式化日期(年月日) +const formatDate = (time: string) => { + return dayjs(time).format("YYYY.MM.DD") +} + // 查看任务详情 const handleViewTask = (task: AI3DTask) => { router.push({ @@ -679,36 +672,36 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-dark 100%); // ========================================== .history-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); - gap: 20px; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 24px; } .history-card { background: $surface; - border-radius: 12px; + border-radius: 16px; overflow: hidden; cursor: pointer; position: relative; - // border: 1px solid rgba(0, 0, 0, 0.06); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06), 0 1px 4px rgba(0, 0, 0, 0.04); + transition: box-shadow 0.3s ease, transform 0.3s ease; &:hover { - .card-preview { - transform: scale(1.03); - } + box-shadow: 0 12px 32px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.06); + transform: translateY(-4px); .card-preview .preview-image { transform: scale(1.05); } - .card-actions-overlay { + .card-hover-info { opacity: 1; + transform: translateY(0); } } } .card-preview { - height: 160px; - // border-radius: 8px; + height: 240px; background: linear-gradient( 135deg, rgba($surface-light, 0.9) 0%, @@ -719,7 +712,6 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-dark 100%); justify-content: center; position: relative; overflow: hidden; - transition: transform 0.3s ease; .preview-image { width: 100%; @@ -764,62 +756,6 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-dark 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% { @@ -900,51 +836,87 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-dark 100%); } } -.card-info { - padding: 16px; - background: $surface; - border-top: 1px solid rgba($primary, 0.06); -} - -.card-desc { - font-size: 14px; - color: $text; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - margin-bottom: 12px; - font-weight: 500; - line-height: 1.4; -} - -.card-meta { +// 悬停显示的底部信息 +.card-hover-info { + position: absolute; + bottom: 8px; + left: 8px; + right: 8px; display: flex; + align-items: center; justify-content: space-between; - align-items: center; -} - -.card-time { - display: flex; - align-items: center; - gap: 6px; - font-size: 12px; - color: $text-muted; -} - -.card-type { - display: inline-flex; - align-items: center; - 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); + gap: 12px; + padding: 10px 14px; + background: rgba(0, 0, 0, 0.55); + backdrop-filter: blur(12px); border-radius: 12px; - font-size: 11px; - font-weight: 500; - color: $primary; + opacity: 0; + transform: translateY(10px); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + + .hover-left { + flex: 1; + min-width: 0; + display: flex; + align-items: center; + gap: 10px; + + .input-thumb { + width: 36px; + height: 36px; + object-fit: cover; + border-radius: 8px; + border: 1px solid rgba(255, 255, 255, 0.15); + flex-shrink: 0; + } + + .input-desc { + font-size: 13px; + color: rgba(255, 255, 255, 0.95); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + + .hover-date { + font-size: 12px; + color: rgba(255, 255, 255, 0.6); + white-space: nowrap; + flex-shrink: 0; + } + + .hover-actions { + display: flex; + align-items: center; + gap: 6px; + flex-shrink: 0; + + .action-btn { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border: none; + border-radius: 8px; + background: rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.9); + cursor: pointer; + transition: all 0.2s; + font-size: 14px; + + &:hover { + background: rgba(255, 255, 255, 0.3); + color: #fff; + } + + &:disabled { + opacity: 0.4; + cursor: not-allowed; + } + } + } } // ========================================== diff --git a/frontend/src/views/workbench/ai-3d/Index.vue b/frontend/src/views/workbench/ai-3d/Index.vue index e75efe3..bdf2aa2 100644 --- a/frontend/src/views/workbench/ai-3d/Index.vue +++ b/frontend/src/views/workbench/ai-3d/Index.vue @@ -585,48 +585,38 @@
{{ getStatusText(task.status) }}
- - -
- - - -
-
-
- {{ task.inputContent }} + +
+
+ + {{ task.inputContent }}
-
- - - {{ formatTime(task.createTime) }} - - - {{ task.inputType === "text" ? "文生3D" : "图生3D" }} - + {{ formatDate(task.createTime) }} +
+ + + + + +
@@ -651,7 +641,6 @@ import { DeleteOutlined, ArrowRightOutlined, ArrowLeftOutlined, - ClockCircleOutlined, BulbOutlined, FolderOutlined, SyncOutlined, @@ -1148,6 +1137,11 @@ const formatTime = (time: string) => { return dayjs(time).format("MM-DD HH:mm") } +// 格式化日期(年月日) +const formatDate = (time: string) => { + return dayjs(time).format("YYYY.MM.DD") +} + // 更新容器宽度 const updateGridWidth = () => { if (historyGridRef.value) { @@ -2437,39 +2431,40 @@ $gradient-secondary: linear-gradient(135deg, $primary-light 0%, $primary 100%); .history-grid { display: flex; flex-direction: row; - gap: 20px; - overflow: hidden; // 移除滚动,只展示一行 - flex-wrap: nowrap; // 不换行 + gap: 24px; + flex-wrap: nowrap; + padding: 8px; // 为阴影留出空间 + margin: -8px; // 抵消padding对布局的影响 } .history-card { flex-shrink: 0; - width: 240px; + width: 280px; background: $surface; - border-radius: 12px; + border-radius: 16px; overflow: hidden; cursor: pointer; position: relative; - // border: 1px solid rgba(0, 0, 0, 0.06); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06), 0 1px 4px rgba(0, 0, 0, 0.04); + transition: box-shadow 0.3s ease, transform 0.3s ease; &:hover { - .card-preview { - transform: scale(1.03); - } + box-shadow: 0 12px 32px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.06); + transform: translateY(-4px); .card-preview .preview-image { transform: scale(1.05); } - .card-actions-overlay { + .card-hover-info { opacity: 1; + transform: translateY(0); } } } .card-preview { - height: 160px; - // border-radius: 8px; + height: 220px; background: linear-gradient( 135deg, rgba($surface-light, 0.9) 0%, @@ -2480,7 +2475,7 @@ $gradient-secondary: linear-gradient(135deg, $primary-light 0%, $primary 100%); justify-content: center; position: relative; overflow: hidden; - transition: transform 0.3s ease; + border-radius: 16px; .preview-image { width: 100%; @@ -2525,62 +2520,6 @@ $gradient-secondary: linear-gradient(135deg, $primary-light 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% { @@ -2661,51 +2600,84 @@ $gradient-secondary: linear-gradient(135deg, $primary-light 0%, $primary 100%); } } -.card-info { - padding: 16px; - background: $surface; - border-top: 1px solid rgba($primary, 0.06); -} - -.card-desc { - font-size: 14px; - color: $text; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - margin-bottom: 12px; - font-weight: 500; - line-height: 1.4; -} - -.card-meta { +// 悬停显示的底部信息 +.card-hover-info { + position: absolute; + bottom: 8px; + left: 8px; + right: 8px; display: flex; + align-items: center; justify-content: space-between; - align-items: center; -} - -.card-time { - display: flex; - align-items: center; - gap: 6px; - font-size: 12px; - color: $text-muted; -} - -.card-type { - display: inline-flex; - align-items: center; - 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); + gap: 12px; + padding: 12px 14px; + background: rgba(0, 0, 0, 0.55); + backdrop-filter: blur(12px); border-radius: 12px; - font-size: 11px; - font-weight: 500; - color: $primary; + opacity: 0; + transform: translateY(10px); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + + .hover-left { + flex: 1; + min-width: 0; + display: flex; + align-items: center; + + .input-thumb { + width: 36px; + height: 36px; + object-fit: cover; + border-radius: 6px; + border: 1px solid rgba(255, 255, 255, 0.2); + } + + .input-desc { + font-size: 13px; + color: rgba(255, 255, 255, 0.95); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100px; + } + } + + .hover-date { + font-size: 12px; + color: rgba(255, 255, 255, 0.6); + white-space: nowrap; + } + + .hover-actions { + display: flex; + align-items: center; + gap: 6px; + + .action-btn { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border: none; + border-radius: 8px; + background: rgba(255, 255, 255, 0.12); + color: rgba(255, 255, 255, 0.85); + cursor: pointer; + transition: all 0.2s; + font-size: 14px; + + &:hover { + background: rgba(255, 255, 255, 0.25); + color: #fff; + } + + &:disabled { + opacity: 0.4; + cursor: not-allowed; + } + } + } } // ========================================== @@ -2721,7 +2693,11 @@ $gradient-secondary: linear-gradient(135deg, $primary-light 0%, $primary 100%); } .history-card { - width: 200px; + width: 240px; + + .card-preview { + height: 200px; + } } } @@ -2743,12 +2719,38 @@ $gradient-secondary: linear-gradient(135deg, $primary-light 0%, $primary 100%); } .history-card { - width: 180px; + width: 220px; - .card-actions-overlay { - .overlay-btn { - padding: 6px 10px; - font-size: 12px; + .card-preview { + height: 180px; + } + + .card-hover-info { + bottom: 6px; + left: 6px; + right: 6px; + padding: 10px 12px; + border-radius: 10px; + + .hover-left { + .input-thumb { + width: 30px; + height: 30px; + } + + .input-desc { + font-size: 12px; + max-width: 80px; + } + } + + .hover-date { + font-size: 11px; + } + + .hover-actions .action-btn { + width: 28px; + height: 28px; } } }