已完成:
@@ -435,41 +435,114 @@ const cancelTask = async () => {
/* 批量下载进度样式 */
.batch-progress {
margin: 1rem 0;
- padding: 1rem;
- background: #f8fafc;
- border-radius: 0.5rem;
- border: 1px solid #e2e8f0;
+ padding: 0;
+ background: transparent;
+ border: none;
+ border-radius: 0;
}
.batch-stats {
- display: flex;
- gap: 2rem;
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
+ gap: 0.75rem;
margin-bottom: 1rem;
}
.stat-item {
display: flex;
+ flex-direction: column;
align-items: center;
- gap: 0.5rem;
+ padding: 1rem 0.75rem;
+ background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
+ border-radius: 0.75rem;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+ border: 1px solid rgba(226, 232, 240, 0.8);
+ transition: all 0.2s ease;
+ position: relative;
+ overflow: hidden;
}
-.stat-label {
- font-size: 0.875rem;
- color: #6b7280;
- font-weight: 500;
+.stat-item::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: linear-gradient(90deg, #e2e8f0, #cbd5e1);
+ transition: all 0.2s ease;
+}
+
+.stat-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
+}
+
+.stat-item:hover::before {
+ background: linear-gradient(90deg, #3b82f6, #1d4ed8);
}
.stat-value {
- font-size: 0.875rem;
- font-weight: 600;
+ font-size: 1.5rem;
+ font-weight: 700;
+ margin-bottom: 0.25rem;
+ line-height: 1;
+}
+
+.stat-label {
+ font-size: 0.75rem;
+ color: #64748b;
+ font-weight: 500;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
}
.stat-value.success {
color: #059669;
+ background: linear-gradient(135deg, #059669, #047857);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.stat-value.success + .stat-label {
+ color: #047857;
+}
+
+.stat-item:has(.stat-value.success)::before {
+ background: linear-gradient(90deg, #10b981, #059669);
}
.stat-value.error {
color: #dc2626;
+ background: linear-gradient(135deg, #dc2626, #b91c1c);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.stat-value.error + .stat-label {
+ color: #b91c1c;
+}
+
+.stat-item:has(.stat-value.error)::before {
+ background: linear-gradient(90deg, #ef4444, #dc2626);
+}
+
+.stat-item:has(.stat-value:not(.success):not(.error))::before {
+ background: linear-gradient(90deg, #6366f1, #4f46e5);
+}
+
+.stat-item:has(.stat-value:not(.success):not(.error)) .stat-value {
+ color: #4f46e5;
+ background: linear-gradient(135deg, #6366f1, #4f46e5);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.stat-item:has(.stat-value:not(.success):not(.error)) .stat-label {
+ color: #4f46e5;
}
.recent-completed h4 {
diff --git a/ui/src/types/index.ts b/ui/src/types/index.ts
index e80f0b4..64138a2 100644
--- a/ui/src/types/index.ts
+++ b/ui/src/types/index.ts
@@ -98,7 +98,7 @@ export interface LoginStatus {
// 下载任务
export interface DownloadTask {
id: string;
- type: 'artwork' | 'batch' | 'artist';
+ type: 'artwork' | 'batch' | 'artist' | 'art';
status: 'downloading' | 'completed' | 'failed' | 'partial' | 'cancelled' | 'paused';
progress: number;
total_files: number;
diff --git a/ui/src/views/DownloadsView.vue b/ui/src/views/DownloadsView.vue
index ad3d614..85fe4db 100644
--- a/ui/src/views/DownloadsView.vue
+++ b/ui/src/views/DownloadsView.vue
@@ -84,7 +84,7 @@
-
+
已完成:
@@ -713,41 +713,114 @@ onUnmounted(() => {
/* 批量下载进度样式 */
.batch-progress {
margin-bottom: 1rem;
- padding: 1rem;
- background: #f8fafc;
- border-radius: 0.5rem;
- border: 1px solid #e2e8f0;
+ padding: 0;
+ background: transparent;
+ border: none;
+ border-radius: 0;
}
.batch-stats {
- display: flex;
- gap: 2rem;
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
+ gap: 0.75rem;
margin-bottom: 1rem;
}
.stat-item {
display: flex;
+ flex-direction: column;
align-items: center;
- gap: 0.5rem;
+ padding: 1rem 0.75rem;
+ background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
+ border-radius: 0.75rem;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+ border: 1px solid rgba(226, 232, 240, 0.8);
+ transition: all 0.2s ease;
+ position: relative;
+ overflow: hidden;
}
-.stat-label {
- font-size: 0.875rem;
- color: #6b7280;
- font-weight: 500;
+.stat-item::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: linear-gradient(90deg, #e2e8f0, #cbd5e1);
+ transition: all 0.2s ease;
+}
+
+.stat-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
+}
+
+.stat-item:hover::before {
+ background: linear-gradient(90deg, #3b82f6, #1d4ed8);
}
.stat-value {
- font-size: 0.875rem;
- font-weight: 600;
+ font-size: 1.5rem;
+ font-weight: 700;
+ margin-bottom: 0.25rem;
+ line-height: 1;
+}
+
+.stat-label {
+ font-size: 0.75rem;
+ color: #64748b;
+ font-weight: 500;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
}
.stat-value.success {
color: #059669;
+ background: linear-gradient(135deg, #059669, #047857);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.stat-value.success + .stat-label {
+ color: #047857;
+}
+
+.stat-item:has(.stat-value.success)::before {
+ background: linear-gradient(90deg, #10b981, #059669);
}
.stat-value.error {
color: #dc2626;
+ background: linear-gradient(135deg, #dc2626, #b91c1c);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.stat-value.error + .stat-label {
+ color: #b91c1c;
+}
+
+.stat-item:has(.stat-value.error)::before {
+ background: linear-gradient(90deg, #ef4444, #dc2626);
+}
+
+.stat-item:has(.stat-value:not(.success):not(.error))::before {
+ background: linear-gradient(90deg, #6366f1, #4f46e5);
+}
+
+.stat-item:has(.stat-value:not(.success):not(.error)) .stat-value {
+ color: #4f46e5;
+ background: linear-gradient(135deg, #6366f1, #4f46e5);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.stat-item:has(.stat-value:not(.success):not(.error)) .stat-label {
+ color: #4f46e5;
}
.recent-completed h4 {