diff --git a/vue/src/App.vue b/vue/src/App.vue
index ee912d1..5414b1a 100644
--- a/vue/src/App.vue
+++ b/vue/src/App.vue
@@ -44,14 +44,39 @@
-
+
+
+
+
{{ scrapeStatusData.message }}
+
+
+ 失败原因:{{ scrapeStatusData.error }}
+
@@ -564,13 +601,13 @@
@@ -578,11 +615,10 @@
- {{ item.movieName || item.title || '未知电影' }}
-
- {{ item.status === 'success' ? '✓ 成功' : item.status === 'failed' ? '✗ 失败' : '⋯ 处理中' }}
+ 👤 {{ item.username || '用户 ' + (item.userId || idx) }}
+
+ 处理: {{ item.processed || 0 }} | 成功: {{ item.success || 0 }} | 失败: {{ item.failed || 0 }} | 跳过: {{ item.skipped || 0 }}
- {{ item.message }}
@@ -845,6 +881,7 @@ const searchKeyword = ref('')
const isSearchFocused = ref(false)
const hasSearched = ref(false)
const currentView = ref('poster')
+const isDarkMode = ref(false) // 黑夜模式开关
const activeSheetId = ref('')
const showRecordDialog = ref(false)
const showFolderDialog = ref(false)
@@ -1678,11 +1715,52 @@ async function loadMoreScraperLogs() {
const logsRes = await fetchScraperLogs(params)
+ console.log('[刮削日志] 后端返回原始数据:', logsRes)
+
if (logsRes?.code === 200 && Array.isArray(logsRes?.data?.list)) {
const newLogs = logsRes.data.list
+ console.log('[刮削日志] 日志列表数据:', newLogs)
+ console.log('[刮削日志] 第一条日志的字段:', Object.keys(newLogs[0] || {}))
+ if (newLogs[0]) {
+ console.log('[刮削日志] 第一条日志完整数据:', JSON.stringify(newLogs[0], null, 2))
+ }
+
+ // 标准化日志数据字段(兼容不同的字段名)
+ const normalizedLogs = newLogs.map(log => {
+ // 解析 detail_json 字符串为数组
+ let detailList = []
+ if (log.detail_json) {
+ try {
+ detailList = typeof log.detail_json === 'string'
+ ? JSON.parse(log.detail_json)
+ : log.detail_json
+ } catch (e) {
+ console.warn('解析 detail_json 失败:', e)
+ }
+ }
+
+ return {
+ ...log,
+ // 确保 showDetail 属性可设置
+ showDetail: false,
+ // 后端字段映射(使用实际的后端字段名)
+ totalMovies: log.total_processed ?? log.totalMovies ?? log.total ?? 0,
+ successCount: log.total_success ?? log.successCount ?? log.success ?? 0,
+ failCount: log.total_failed ?? log.failCount ?? log.failed ?? 0,
+ totalSkipped: log.total_skipped ?? 0,
+ scanTime: log.start_time ?? log.create_time ?? log.createTime ?? '-',
+ endTime: log.end_time ?? '',
+ durationMs: log.duration_ms ?? 0,
+ status: log.status ?? 'unknown',
+ triggerType: log.trigger_type ?? 'manual',
+ // 解析后的详细信息列表
+ detailList: detailList,
+ }
+ })
+
// 追加到现有日志列表
- scraperLogs.value.push(...newLogs)
+ scraperLogs.value.push(...normalizedLogs)
// 更新分页信息
scraperLogPagination.total = logsRes.data.total || 0
@@ -2491,6 +2569,28 @@ function preloadImage(url) {
img.src = url
}
+/**
+ * 刷新当前网盘文件夹列表
+ */
+async function handleRefreshFolders() {
+ const driveId = activeSheetId.value
+ if (!driveId) {
+ setErrorMessage('请先选择一个网盘')
+ return
+ }
+
+ driveLoading.value = true
+ try {
+ await loadDriveFolders(driveId)
+ setSuccessMessage('文件夹列表已刷新')
+ } catch (err) {
+ console.error('刷新文件夹列表失败', err)
+ setErrorMessage(err?.message || '刷新文件夹列表失败')
+ } finally {
+ driveLoading.value = false
+ }
+}
+
// 刮削状态查询
function handleScrapeStatus(node) {
// 只有文件类型才显示刮削状态
@@ -2521,7 +2621,7 @@ function handleScrapeStatus(node) {
rating: data.rating,
category: data.category,
tags: data.tags,
- error: data.error,
+ error: data.error || data.message,
}
} else {
setErrorMessage(result?.message || '查询刮削状态失败')
@@ -2805,6 +2905,27 @@ onMounted(() => {
resumeFeaturedAutoplay()
})
+// 黑夜/白天模式切换函数
+function toggleDarkMode() {
+ isDarkMode.value = !isDarkMode.value
+ // 更新 body 的 class
+ document.body.classList.toggle('dark-mode', isDarkMode.value)
+ // 保存到 localStorage
+ localStorage.setItem('darkMode', isDarkMode.value ? '1' : '0')
+}
+
+// 从 localStorage 读取黑夜模式偏好
+function initDarkMode() {
+ const savedMode = localStorage.getItem('darkMode')
+ if (savedMode === '1') {
+ isDarkMode.value = true
+ document.body.classList.add('dark-mode')
+ }
+}
+
+// 在 onMounted 之前调用初始化
+initDarkMode()
+
onBeforeUnmount(() => {
window.removeEventListener('wangpan:unauthorized', handleUnauthorized)
window.removeEventListener('wangpan:forbidden', handleForbidden)
diff --git a/vue/src/style.css b/vue/src/style.css
index 5e62101..dbf0681 100644
--- a/vue/src/style.css
+++ b/vue/src/style.css
@@ -1620,6 +1620,11 @@ canvas {
align-items: center;
}
+/* 刷新按钮靠右显示 */
+.folder-tree-actions__btn--refresh {
+ margin-left: auto;
+}
+
.folder-tree-actions__btn {
padding: 10px 20px;
border: 2px dashed var(--line);
@@ -3473,11 +3478,28 @@ canvas {
.scrape-status-message {
padding: 12px;
- background: #f9fafb;
- border-radius: 8px;
+ background: #f0f4ff;
+ border-radius: 12px;
font-size: 14px;
- color: #4b5563;
- margin-bottom: 16px;
+ color: var(--text);
+ line-height: 1.6;
+}
+
+/* 刮削失败原因样式 */
+.scrape-status-error {
+ padding: 12px;
+ background: #fef2f2;
+ border: 1px solid #fecaca;
+ border-radius: 12px;
+ font-size: 14px;
+ color: #991b1b;
+ line-height: 1.6;
+ margin-top: 8px;
+}
+
+.scrape-status-error strong {
+ color: #dc2626;
+ margin-right: 8px;
}
.scrape-status-poster,
@@ -3529,3 +3551,1219 @@ canvas {
color: #6b7280;
font-size: 14px;
}
+
+/* ===== 黑夜/白天模式切换按钮 ===== */
+.theme-toggle-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ border: none;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ flex-shrink: 0;
+}
+
+.theme-toggle-btn:hover {
+ transform: scale(1.1) rotate(15deg);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+
+.theme-toggle-btn:active {
+ transform: scale(0.95);
+}
+
+.theme-toggle-btn--dark {
+ background: linear-gradient(135deg, #2c3e50 0%, #4ca1af 100%);
+}
+
+.theme-toggle-btn--dark:hover {
+ background: linear-gradient(135deg, #34495e 0%, #5cb8c9 100%);
+}
+
+.theme-toggle-btn__icon {
+ width: 22px;
+ height: 22px;
+ color: #555;
+ transition: color 0.3s ease;
+}
+
+.theme-toggle-btn--dark .theme-toggle-btn__icon {
+ color: #f0f0f0;
+}
+
+/* 太阳和月亮图标的动画 */
+.theme-icon--sun {
+ animation: sun-rotate 20s linear infinite;
+}
+
+@keyframes sun-rotate {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+.theme-icon--moon {
+ animation: moon-glow 2s ease-in-out infinite;
+}
+
+@keyframes moon-glow {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.7; }
+}
+
+/* ===== 黑夜模式样式 ===== */
+body.dark-mode {
+ --bg: #0f172a;
+ --panel: #1e293b;
+ --ink: #e2e8f0;
+ --muted: #94a3b8;
+ --line: #334155;
+ --brand: #38bdf8;
+ --brand-dark: #0ea5e9;
+ --accent: #fbbf24;
+ --danger: #f87171;
+}
+
+body.dark-mode {
+ background: #0f172a;
+ color: #e2e8f0;
+}
+
+body.dark-mode .app-wrapper {
+ background: #0f172a;
+}
+
+body.dark-mode .search-topbar,
+body.dark-mode .dashboard-topbar {
+ background: #1e293b;
+ border-bottom: 1px solid #334155;
+}
+
+body.dark-mode .search-topbar__input input {
+ background: #0f172a;
+ color: #e2e8f0;
+ border-color: #334155;
+}
+
+body.dark-mode .search-topbar__input input:focus {
+ border-color: #38bdf8;
+ box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.2);
+}
+
+body.dark-mode .folder-tree-container {
+ background: rgba(30, 41, 59, 0.7);
+ border: 1px solid rgba(51, 65, 85, 0.5);
+ backdrop-filter: blur(10px);
+}
+
+body.dark-mode .drive-tab {
+ background: #0f172a;
+ color: #94a3b8;
+ border-color: #334155;
+}
+
+body.dark-mode .drive-tab:hover {
+ background: #1e293b;
+ border-color: #38bdf8;
+}
+
+body.dark-mode .drive-tab.active {
+ background: rgba(56, 189, 248, 0.15);
+ border-color: #38bdf8;
+ color: #38bdf8;
+}
+
+body.dark-mode .drive-tabs {
+ background: rgba(56, 189, 248, 0.05);
+ border-color: #334155;
+}
+
+body.dark-mode .tree-item__header {
+ background: rgba(15, 23, 42, 0.5);
+ border-color: #334155;
+ color: #cbd5e1;
+}
+
+body.dark-mode .tree-item__header:hover {
+ background: rgba(30, 41, 59, 0.8);
+}
+
+body.dark-mode .tree-item--selected > .tree-item__header {
+ background: rgba(56, 189, 248, 0.15);
+ border-color: #38bdf8;
+}
+
+body.dark-mode .tree-item__title {
+ color: #e2e8f0;
+}
+
+body.dark-mode .tree-item__subtitle {
+ color: #94a3b8;
+}
+
+body.dark-mode .content-toolbar {
+ background: transparent;
+}
+
+body.dark-mode .content-toolbar h2 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .content-toolbar p {
+ color: #94a3b8;
+}
+
+body.dark-mode .folder-tree-actions__btn {
+ background: rgba(56, 189, 248, 0.08);
+ border-color: #334155;
+ color: #38bdf8;
+}
+
+body.dark-mode .folder-tree-actions__btn:hover {
+ background: rgba(56, 189, 248, 0.15);
+ border-color: #38bdf8;
+}
+
+body.dark-mode .folder-tree-actions {
+ border-bottom-color: #334155;
+}
+
+body.dark-mode .quick-icons {
+ background: linear-gradient(135deg, rgba(30, 41, 59, 0.85) 0%, rgba(15, 23, 42, 0.9) 100%);
+ border: 1px solid #334155;
+}
+
+body.dark-mode .quick-icons__header h3 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .quick-icons__item {
+ color: #cbd5e1;
+}
+
+body.dark-mode .quick-icons__label {
+ color: #cbd5e1;
+}
+
+body.dark-mode .quick-icons__thumb {
+ background: linear-gradient(135deg, #1e293b 0%, #334155 100%);
+}
+
+body.dark-mode .quick-icons__manage {
+ background: linear-gradient(135deg, #38bdf8 0%, #818cf8 100%);
+}
+
+body.dark-mode .quick-icons__manage:hover {
+ background: linear-gradient(135deg, #0ea5e9 0%, #6366f1 100%);
+}
+
+body.dark-mode .user-menu__trigger {
+ background: #1e293b;
+ border-color: #334155;
+ color: #e2e8f0;
+}
+
+body.dark-mode .user-menu__name {
+ color: #e2e8f0;
+}
+
+body.dark-mode .user-menu__dropdown {
+ background: #1e293b;
+ border-color: #334155;
+}
+
+body.dark-mode .user-menu__item {
+ color: #cbd5e1;
+}
+
+body.dark-mode .user-menu__item:hover {
+ background: rgba(56, 189, 248, 0.1);
+}
+
+body.dark-mode .user-menu__divider {
+ background: #334155;
+}
+
+body.dark-mode .dashboard-brand strong {
+ color: #e2e8f0;
+}
+
+body.dark-mode .dashboard-brand span {
+ color: #94a3b8;
+}
+
+body.dark-mode .duplicate-panel {
+ background: #1e293b;
+ border-color: #334155;
+}
+
+body.dark-mode .duplicate-panel header h2 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .duplicate-panel header span {
+ background: #0f172a;
+ color: #38bdf8;
+}
+
+body.dark-mode .duplicate-item {
+ background: #0f172a;
+ border-color: #334155;
+}
+
+body.dark-mode .duplicate-item strong {
+ color: #e2e8f0;
+}
+
+body.dark-mode .duplicate-item li {
+ color: #94a3b8;
+}
+
+body.dark-mode .empty-note {
+ background: #0f172a;
+ border-color: #334155;
+ color: #94a3b8;
+}
+
+body.dark-mode .log-entry {
+ background: #0f172a;
+ border-color: #334155;
+}
+
+body.dark-mode .log-time {
+ color: #e2e8f0;
+}
+
+body.dark-mode .log-account {
+ color: #94a3b8;
+}
+
+body.dark-mode .log-detail {
+ color: #94a3b8;
+}
+
+body.dark-mode .folder-tree-actions__btn--multi {
+ background: rgba(251, 191, 36, 0.1);
+ border-color: #fbbf24;
+ color: #fbbf24;
+}
+
+body.dark-mode .folder-tree-actions__btn--multi:hover {
+ background: rgba(251, 191, 36, 0.2);
+}
+
+body.dark-mode .folder-tree-actions__btn--multi.active {
+ background: rgba(251, 191, 36, 0.25);
+ box-shadow: 0 0 12px rgba(251, 191, 36, 0.3);
+}
+
+/* 深色模式下的搜索框样式优化 */
+body.dark-mode .search-topbar__input input::placeholder {
+ color: #64748b;
+}
+
+/* 深色模式下的滚动条 */
+body.dark-mode ::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+body.dark-mode ::-webkit-scrollbar-track {
+ background: #0f172a;
+}
+
+body.dark-mode ::-webkit-scrollbar-thumb {
+ background: #334155;
+ border-radius: 4px;
+}
+
+body.dark-mode ::-webkit-scrollbar-thumb:hover {
+ background: #475569;
+}
+
+/* ===== 黑夜模式:海报卡片优化(电影院氛围) ===== */
+body.dark-mode .poster-card {
+ background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
+ border: 1px solid rgba(51, 65, 85, 0.5);
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
+}
+
+body.dark-mode .poster-card:hover {
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
+}
+
+body.dark-mode .poster-thumb {
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
+}
+
+body.dark-mode .score-badge {
+ background: rgba(15, 23, 42, 0.95);
+ color: #7ee8bc;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
+}
+
+body.dark-mode .poster-body {
+ background: transparent;
+}
+
+body.dark-mode .poster-body h3 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .poster-body p {
+ color: #94a3b8;
+}
+
+body.dark-mode .status-pill {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
+}
+
+body.dark-mode .status-pill.is-normal {
+ background: rgba(34, 197, 94, 0.15);
+ color: #4ade80;
+ border: 1px solid rgba(34, 197, 94, 0.3);
+}
+
+body.dark-mode .status-pill.is-warning {
+ background: rgba(251, 191, 36, 0.15);
+ color: #fbbf24;
+ border: 1px solid rgba(251, 191, 36, 0.3);
+}
+
+body.dark-mode .status-pill.is-danger {
+ background: rgba(239, 68, 68, 0.15);
+ color: #f87171;
+ border: 1px solid rgba(239, 68, 68, 0.3);
+}
+
+body.dark-mode .poster-time {
+ color: #64748b;
+}
+
+body.dark-mode .poster-sheet {
+ background: rgba(99, 102, 241, 0.15);
+ color: #a5b4fc;
+ border: 1px solid rgba(99, 102, 241, 0.3);
+}
+
+body.dark-mode .poster-owner small {
+ color: #64748b;
+}
+
+body.dark-mode .tag-list span {
+ background: rgba(99, 102, 241, 0.1);
+ color: #a5b4fc;
+ border: 1px solid rgba(99, 102, 241, 0.2);
+}
+
+/* ===== 黑夜模式:海报展示页面优化 ===== */
+body.dark-mode .poster-showcase {
+ background: transparent;
+}
+
+body.dark-mode .poster-showcase .content-toolbar h2 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .poster-showcase .content-toolbar p {
+ color: #94a3b8;
+}
+
+body.dark-mode .poster-showcase .content-actions button {
+ background: rgba(99, 102, 241, 0.15);
+ color: #a5b4fc;
+ border: 1px solid rgba(99, 102, 241, 0.3);
+}
+
+body.dark-mode .poster-showcase .content-actions button:hover {
+ background: rgba(99, 102, 241, 0.25);
+}
+
+/* ===== 黑夜模式:海报列表网格优化 ===== */
+body.dark-mode .poster-list--showcase {
+ background: transparent;
+}
+
+body.dark-mode .poster-card-wrap {
+ background: transparent;
+}
+
+/* ===== 黑夜模式:每日推荐海报区域优化 ===== */
+body.dark-mode .hero-carousel {
+ background: transparent;
+}
+
+body.dark-mode .hero-main {
+ /* 与白天模式保持一致的背景图片处理 */
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
+ border: 1px solid rgba(51, 65, 85, 0.3);
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
+ /* 确保背景图片正确显示 */
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+body.dark-mode .hero-main.hero-loading {
+ background: linear-gradient(110deg, #0f172a 30%, #1e293b 50%, #0f172a 70%);
+ background-size: 200% 100%;
+ animation: hero-shimmer 1.5s ease-in-out infinite;
+}
+
+body.dark-mode .hero-main.hero-loaded {
+ /* 加载完成后保持背景图片显示 */
+ opacity: 1;
+}
+
+body.dark-mode .hero-main__overlay {
+ /* 增强对比度,确保文字清晰可读 - 使用更深的渐变 */
+ background: linear-gradient(180deg, rgba(15, 23, 42, 0.05) 0%, rgba(15, 23, 42, 0.95) 100%);
+ /* 确保文字可读性 */
+ isolation: isolate;
+}
+
+/* 黑夜模式下,当没有有效海报时,使用默认背景 */
+body.dark-mode .hero-main:not([style*="background-image"]) {
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 50%, #0c1525 100%);
+}
+
+/* 黑夜模式大海报背景图片适配 */
+body.dark-mode .hero-main .hero-bg-image {
+ filter: brightness(0.7) saturate(0.9);
+}
+
+/* 黑夜模式下无海报时的默认背景图处理 */
+body.dark-mode .hero-main[data-poster=""] {
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 50%, #0c1525 100%) !important;
+}
+
+body.dark-mode .hero-main__badge {
+ background: rgba(30, 41, 59, 0.8);
+ color: #a5b4fc;
+ border: 1px solid rgba(99, 102, 241, 0.3);
+}
+
+body.dark-mode .hero-main__title {
+ color: #f1f5f9;
+}
+
+body.dark-mode .hero-main__desc {
+ color: #94a3b8;
+}
+
+body.dark-mode .hero-main__meta-item {
+ background: rgba(30, 41, 59, 0.7);
+ color: #cbd5e1;
+ border: 1px solid rgba(51, 65, 85, 0.3);
+}
+
+/* 小海报卡片 */
+body.dark-mode .hero-sub {
+ background: transparent;
+}
+
+body.dark-mode .hero-sub__card {
+ background: transparent;
+}
+
+body.dark-mode .hero-sub__thumb {
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
+ border: 1px solid rgba(51, 65, 85, 0.3);
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
+}
+
+body.dark-mode .hero-sub__card.active .hero-sub__thumb {
+ border-color: #6366f1;
+ box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.4), 0 4px 16px rgba(0, 0, 0, 0.4);
+}
+
+body.dark-mode .hero-sub__title {
+ background: linear-gradient(0deg, rgba(15, 23, 42, 0.9) 0%, transparent 100%);
+}
+
+/* ===== 黑夜模式:搜索框优化 ===== */
+body.dark-mode .search-topbar__input input {
+ background: rgba(15, 23, 42, 0.8);
+ color: #e2e8f0;
+ border: 1px solid rgba(51, 65, 85, 0.5);
+ backdrop-filter: blur(10px);
+}
+
+body.dark-mode .search-topbar__input input::placeholder {
+ color: #64748b;
+}
+
+body.dark-mode .search-topbar__input input:focus {
+ background: rgba(15, 23, 42, 0.95);
+ border-color: #38bdf8;
+ box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.2);
+}
+
+/* ===== 黑夜模式:搜索聚焦虚化效果 ===== */
+body.dark-mode .content-blur {
+ filter: blur(8px);
+ opacity: 0.3;
+}
+
+/* ===== 黑夜模式:搜索焦点提示优化 ===== */
+body.dark-mode .search-focus-hint {
+ background: transparent;
+}
+
+body.dark-mode .search-focus-content h3 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .search-focus-content p {
+ color: #94a3b8;
+}
+
+/* ===== 黑夜模式:空搜索结果优化 ===== */
+body.dark-mode .empty-search-result {
+ background: transparent;
+}
+
+body.dark-mode .empty-search-content h3 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .empty-search-content p {
+ color: #94a3b8;
+}
+
+body.dark-mode .empty-search-content button {
+ background: rgba(99, 102, 241, 0.15);
+ color: #a5b4fc;
+ border: 1px solid rgba(99, 102, 241, 0.3);
+}
+
+body.dark-mode .empty-search-content button:hover {
+ background: rgba(99, 102, 241, 0.25);
+}
+
+/* ===== 黑夜模式:统计卡片优化 ===== */
+body.dark-mode .stats-row > div {
+ background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
+ border: 1px solid rgba(51, 65, 85, 0.3);
+}
+
+body.dark-mode .stats-row span {
+ color: #38bdf8;
+}
+
+body.dark-mode .stats-row small {
+ color: #64748b;
+}
+
+/* ===== 黑夜模式:洞察卡片优化 ===== */
+body.dark-mode .insight-card {
+ background: linear-gradient(135deg, rgba(30, 41, 59, 0.85) 0%, rgba(15, 23, 42, 0.9) 100%);
+ border: 1px solid rgba(51, 65, 85, 0.3);
+ backdrop-filter: blur(10px);
+}
+
+body.dark-mode .insight-card strong {
+ color: #38bdf8;
+}
+
+body.dark-mode .insight-card span {
+ color: #94a3b8;
+}
+
+/* ===== 黑夜模式:全局通知优化 ===== */
+body.dark-mode .global-notice {
+ background: rgba(30, 41, 59, 0.95);
+ border: 1px solid rgba(51, 65, 85, 0.5);
+ backdrop-filter: blur(10px);
+ color: #e2e8f0;
+}
+
+body.dark-mode .global-notice--warning {
+ background: rgba(120, 80, 0, 0.9);
+ border-color: #f59e0b;
+ color: #fde68a;
+}
+
+body.dark-mode .global-notice--danger {
+ background: rgba(127, 29, 29, 0.9);
+ border-color: #dc2626;
+ color: #fecaca;
+}
+
+body.dark-mode .global-notice--error {
+ background: rgba(127, 29, 29, 0.9);
+ border-color: #ef4444;
+ color: #fecaca;
+}
+
+body.dark-mode .global-notice--success {
+ background: rgba(20, 83, 45, 0.9);
+ border-color: #22c55e;
+ color: #bbf7d0;
+}
+
+/* ===== 黑夜模式:加载面板优化 ===== */
+body.dark-mode .loading-panel {
+ background: transparent;
+}
+
+body.dark-mode .loading-card {
+ background: rgba(30, 41, 59, 0.85);
+ border: 1px solid rgba(51, 65, 85, 0.3);
+ backdrop-filter: blur(10px);
+ color: #94a3b8;
+}
+
+body.dark-mode .loading-card .loading-spinner {
+ border-color: rgba(56, 189, 248, 0.2);
+ border-top-color: #38bdf8;
+}
+
+/* ===== 黑夜模式:视图切换按钮优化 ===== */
+body.dark-mode .view-switch {
+ background: linear-gradient(180deg, rgba(30, 41, 59, 0.8) 0%, rgba(15, 23, 42, 0.9) 100%);
+ border-color: rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode .view-switch__btn {
+ color: #94a3b8;
+}
+
+body.dark-mode .view-switch__btn:hover {
+ background: rgba(56, 189, 248, 0.1);
+}
+
+body.dark-mode .view-switch__btn.active {
+ background: linear-gradient(90deg, #38bdf8, #0ea5e9);
+ color: #0f172a;
+}
+
+/* ===== 黑夜模式:图标动作按钮优化 ===== */
+body.dark-mode .icon-action {
+ color: #94a3b8;
+ background: transparent;
+}
+
+body.dark-mode .icon-action:hover {
+ background: rgba(56, 189, 248, 0.1);
+}
+
+body.dark-mode .btn-export {
+ background: #0ea5e9;
+ color: #0f172a;
+}
+
+/* ===== 黑夜模式:导出按钮优化 ===== */
+body.dark-mode .content-actions button {
+ background: rgba(99, 102, 241, 0.15);
+ color: #a5b4fc;
+ border: 1px solid rgba(99, 102, 241, 0.3);
+}
+
+body.dark-mode .content-actions button:hover {
+ background: rgba(99, 102, 241, 0.25);
+ border-color: #6366f1;
+}
+
+/* ===== 黑夜模式:仪表盘顶部栏优化 ===== */
+body.dark-mode .dashboard-topbar {
+ background: rgba(30, 41, 59, 0.6);
+ border-bottom: 1px solid rgba(51, 65, 85, 0.3);
+ backdrop-filter: blur(10px);
+}
+
+/* ===== 黑夜模式:刮削状态面板优化 ===== */
+body.dark-mode .scrape-status-panel {
+ background: transparent;
+}
+
+body.dark-mode .scrape-status-header h3 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .scrape-status-badge--scraping {
+ background: rgba(59, 130, 246, 0.15);
+ color: #60a5fa;
+ border: 1px solid rgba(59, 130, 246, 0.3);
+}
+
+body.dark-mode .scrape-status-badge--success {
+ background: rgba(34, 197, 94, 0.15);
+ color: #4ade80;
+ border: 1px solid rgba(34, 197, 94, 0.3);
+}
+
+body.dark-mode .scrape-status-badge--failed {
+ background: rgba(239, 68, 68, 0.15);
+ color: #f87171;
+ border: 1px solid rgba(239, 68, 68, 0.3);
+}
+
+body.dark-mode .scrape-status-message {
+ background: rgba(15, 23, 42, 0.6);
+ color: #94a3b8;
+ border: 1px solid rgba(51, 65, 85, 0.3);
+}
+
+body.dark-mode .scrape-status-error {
+ background: rgba(127, 29, 29, 0.2);
+ border-color: rgba(239, 68, 68, 0.4);
+ color: #fca5a5;
+}
+
+/* ===== 黑夜模式:登录日志优化 ===== */
+body.dark-mode .log-panel {
+ background: transparent;
+}
+
+body.dark-mode .log-filter {
+ background: rgba(15, 23, 42, 0.5);
+ border-color: rgba(51, 65, 85, 0.3);
+}
+
+body.dark-mode .filter-input,
+body.dark-mode .filter-select {
+ background: rgba(15, 23, 42, 0.6);
+ color: #e2e8f0;
+ border-color: rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode .filter-input:focus,
+body.dark-mode .filter-select:focus {
+ border-color: #38bdf8;
+ box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.15);
+}
+
+body.dark-mode .filter-input::placeholder {
+ color: #64748b;
+}
+
+body.dark-mode .filter-search-btn {
+ background: linear-gradient(135deg, #6366f1, #8b5cf6);
+}
+
+body.dark-mode .filter-reset-btn {
+ background: linear-gradient(135deg, #dc2626, #b91c1c);
+}
+
+body.dark-mode .log-integrity {
+ background: rgba(245, 158, 11, 0.1);
+ color: #fbbf24;
+ border: 1px solid rgba(245, 158, 11, 0.3);
+}
+
+body.dark-mode .log-integrity.ok {
+ background: rgba(34, 197, 94, 0.1);
+ color: #4ade80;
+ border: 1px solid rgba(34, 197, 94, 0.3);
+}
+
+body.dark-mode .log-loading,
+body.dark-mode .log-empty {
+ color: #64748b;
+}
+
+body.dark-mode .login-log-list {
+ background: transparent;
+}
+
+body.dark-mode .log-pagination {
+ background: rgba(15, 23, 42, 0.4);
+ border-color: rgba(51, 65, 85, 0.3);
+}
+
+body.dark-mode .pagination-info {
+ color: #94a3b8;
+}
+
+body.dark-mode .load-more-btn {
+ background: linear-gradient(135deg, #6366f1, #8b5cf6);
+}
+
+body.dark-mode .no-more {
+ color: #64748b;
+}
+
+/* ===== 黑夜模式:刮削日志优化 ===== */
+body.dark-mode .scraper-log-list .log-entry {
+ background: rgba(15, 23, 42, 0.5);
+ border-color: rgba(51, 65, 85, 0.3);
+}
+
+body.dark-mode .scraper-log-list .log-entry:hover {
+ background: rgba(30, 41, 59, 0.6);
+}
+
+body.dark-mode .log-entry__toggle {
+ color: #38bdf8;
+}
+
+body.dark-mode .log-entry__time {
+ color: #64748b;
+}
+
+body.dark-mode .log-entry__desc {
+ color: #cbd5e1;
+}
+
+body.dark-mode .stat-total,
+body.dark-mode .stat-success,
+body.dark-mode .stat-fail {
+ border-radius: 999px;
+ padding: 2px 8px;
+ font-size: 12px;
+ font-weight: 600;
+}
+
+body.dark-mode .stat-total {
+ background: rgba(100, 116, 139, 0.15);
+ color: #94a3b8;
+}
+
+body.dark-mode .stat-success {
+ background: rgba(34, 197, 94, 0.15);
+ color: #4ade80;
+}
+
+body.dark-mode .stat-fail {
+ background: rgba(239, 68, 68, 0.15);
+ color: #f87171;
+}
+
+body.dark-mode .log-entry__detail {
+ background: rgba(15, 23, 42, 0.6);
+ border-color: rgba(51, 65, 85, 0.4);
+}
+
+body.dark-mode .detail-item {
+ background: rgba(30, 41, 59, 0.5);
+}
+
+body.dark-mode .detail-item:hover {
+ background: rgba(30, 41, 59, 0.7);
+}
+
+body.dark-mode .detail-item__name {
+ color: #e2e8f0;
+}
+
+body.dark-mode .detail-item__status--info {
+ background: rgba(56, 189, 248, 0.15);
+ color: #38bdf8;
+}
+
+body.dark-mode .detail-item__message {
+ color: #64748b;
+}
+
+/* ===== 黑夜模式:TMDB配置优化 ===== */
+body.dark-mode .tmdb-config label span {
+ color: #94a3b8;
+}
+
+body.dark-mode .tmdb-config input {
+ background: rgba(15, 23, 42, 0.6);
+ color: #e2e8f0;
+ border-color: rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode .tmdb-config__status {
+ background: rgba(245, 158, 11, 0.1);
+ color: #fbbf24;
+ border: 1px solid rgba(245, 158, 11, 0.3);
+}
+
+body.dark-mode .tmdb-config__status.ready {
+ background: rgba(34, 197, 94, 0.1);
+ color: #4ade80;
+ border: 1px solid rgba(34, 197, 94, 0.3);
+}
+
+/* ===== 黑夜模式:通用对话框优化 ===== */
+body.dark-mode .simple-dialog,
+body.dark-mode .app-dialog {
+ background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
+ border: 1px solid rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode .simple-dialog__header,
+body.dark-mode .dialog-form header {
+ border-bottom-color: rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode .simple-dialog__header h2 {
+ color: #e2e8f0;
+}
+
+body.dark-mode .simple-dialog__body {
+ background: transparent;
+}
+
+body.dark-mode .simple-dialog__footer {
+ border-top-color: rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode .simple-dialog__footer button,
+body.dark-mode .dialog-form footer button {
+ background: rgba(99, 102, 241, 0.15);
+ color: #a5b4fc;
+ border: 1px solid rgba(99, 102, 241, 0.3);
+}
+
+body.dark-mode .simple-dialog__footer button:hover,
+body.dark-mode .dialog-form footer button:hover {
+ background: rgba(99, 102, 241, 0.25);
+}
+
+body.dark-mode .dialog-form footer button[type='submit'] {
+ background: linear-gradient(135deg, #6366f1, #8b5cf6);
+ color: #fff;
+ border: none;
+}
+
+/* ===== 黑夜模式:字段网格优化 ===== */
+body.dark-mode .field-grid label span {
+ color: #94a3b8;
+}
+
+body.dark-mode .field-grid input,
+body.dark-mode .field-grid select,
+body.dark-mode .field-grid textarea {
+ background: rgba(15, 23, 42, 0.6);
+ color: #e2e8f0;
+ border-color: rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode .field-grid input:focus,
+body.dark-mode .field-grid select:focus,
+body.dark-mode .field-grid textarea:focus {
+ border-color: #38bdf8;
+ box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.15);
+}
+
+body.dark-mode .field-grid input::placeholder {
+ color: #64748b;
+}
+
+/* ===== 黑夜模式:通用输入框优化 ===== */
+body.dark-mode input,
+body.dark-mode textarea,
+body.dark-mode select {
+ background: rgba(15, 23, 42, 0.6);
+ color: #e2e8f0;
+ border-color: rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode input::placeholder,
+body.dark-mode textarea::placeholder {
+ color: #64748b;
+}
+
+body.dark-mode input:focus,
+body.dark-mode textarea:focus,
+body.dark-mode select:focus {
+ border-color: #38bdf8;
+ box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.15);
+ background: rgba(15, 23, 42, 0.8);
+}
+
+/* ===== 黑夜模式:通用选择框优化 ===== */
+body.dark-mode select {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2394a3b8' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
+}
+
+body.dark-mode select option {
+ background: #1e293b;
+ color: #e2e8f0;
+}
+
+/* ===== 黑夜模式:通用按钮优化 ===== */
+body.dark-mode button.secondary {
+ background: rgba(99, 102, 241, 0.1);
+ color: #a5b4fc;
+ border: 1px solid rgba(99, 102, 241, 0.3);
+}
+
+body.dark-mode button.secondary:hover {
+ background: rgba(99, 102, 241, 0.2);
+ border-color: rgba(99, 102, 241, 0.4);
+}
+
+body.dark-mode button.danger {
+ background: rgba(239, 68, 68, 0.15);
+ color: #f87171;
+ border: 1px solid rgba(239, 68, 68, 0.3);
+}
+
+body.dark-mode button.danger:hover {
+ background: rgba(239, 68, 68, 0.25);
+}
+
+/* ===== 黑夜模式:通用文本链接优化 ===== */
+body.dark-mode a {
+ color: #38bdf8;
+}
+
+body.dark-mode a:hover {
+ color: #7dd3fc;
+}
+
+/* ===== 黑夜模式:分隔线和边框优化 ===== */
+body.dark-mode .user-menu__divider,
+body.dark-mode .quick-access-panel__header {
+ background: rgba(51, 65, 85, 0.5);
+}
+
+/* ===== 黑夜模式:滚动条全局优化 ===== */
+body.dark-mode ::-webkit-scrollbar {
+ width: 10px;
+ height: 10px;
+}
+
+body.dark-mode ::-webkit-scrollbar-track {
+ background: rgba(15, 23, 42, 0.5);
+}
+
+body.dark-mode ::-webkit-scrollbar-thumb {
+ background: rgba(51, 65, 85, 0.6);
+ border-radius: 5px;
+ border: 2px solid rgba(15, 23, 42, 0.5);
+}
+
+body.dark-mode ::-webkit-scrollbar-thumb:hover {
+ background: rgba(71, 85, 105, 0.8);
+}
+
+/* ===== 黑夜模式:全局加载条优化 ===== */
+body.dark-mode .global-loading-bar {
+ background: rgba(15, 23, 42, 0.5);
+}
+
+body.dark-mode .global-loading-bar__progress {
+ background: linear-gradient(90deg, #6366f1 0%, #a78bfa 50%, #6366f1 100%);
+ box-shadow: 0 0 10px rgba(99, 102, 241, 0.5);
+}
+
+/* ===== 黑夜模式:全局加载遮罩优化 ===== */
+body.dark-mode .global-loading-overlay {
+ background: rgba(2, 6, 23, 0.9);
+}
+
+body.dark-mode .global-loading-overlay__text {
+ color: #94a3b8;
+ text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
+}
+
+/* ===== 黑夜模式:网盘加载遮罩优化 ===== */
+body.dark-mode .drive-loading-overlay {
+ background: rgba(15, 23, 42, 0.85);
+}
+
+body.dark-mode .drive-loading-text {
+ color: #94a3b8;
+}
+
+/* ===== 黑夜模式:通用浮动提示框优化 ===== */
+body.dark-mode .app-tooltip {
+ background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
+ border: 1px solid rgba(51, 65, 85, 0.5);
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
+}
+
+body.dark-mode .app-tooltip__header {
+ background: rgba(99, 102, 241, 0.1);
+ border-bottom-color: rgba(51, 65, 85, 0.5);
+}
+
+body.dark-mode .app-tooltip__title {
+ color: #e2e8f0;
+}
+
+body.dark-mode .app-tooltip__desc {
+ color: #94a3b8;
+}
+
+body.dark-mode .app-tooltip__empty {
+ color: #64748b;
+}
+
+body.dark-mode .app-tooltip__meta {
+ border-top-color: rgba(51, 65, 85, 0.5);
+ color: #64748b;
+}
+
+body.dark-mode .app-tooltip__arrow {
+ background: #1e293b;
+ border-color: rgba(51, 65, 85, 0.5);
+}
+
+/* ===== 黑夜模式:登录页优化 ===== */
+body.dark-mode .login-shell {
+ background:
+ radial-gradient(ellipse at 50% 80%, rgba(99, 31, 191, 0.6) 0%, rgba(2, 6, 23, 0.95) 60%),
+ linear-gradient(135deg, #020617, #0f172a);
+}
+
+/* ===== 黑夜模式:通用卡片阴影优化 ===== */
+body.dark-mode .poster-card,
+body.dark-mode .insight-card,
+body.dark-mode .stats-row > div,
+body.dark-mode .duplicate-panel,
+body.dark-mode .simple-dialog,
+body.dark-mode .app-dialog {
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
+}
+
+/* ===== 黑夜模式:表格/列表样式优化 ===== */
+body.dark-mode .duplicate-list,
+body.dark-mode .login-log-list,
+body.dark-mode .column-list,
+body.dark-mode .scraper-log-list {
+ background: transparent;
+}
+
+body.dark-mode .duplicate-item {
+ background: rgba(15, 23, 42, 0.5);
+ border-color: rgba(51, 65, 85, 0.4);
+}
+
+body.dark-mode .duplicate-item strong {
+ color: #e2e8f0;
+}
+
+body.dark-mode .duplicate-item li {
+ color: #94a3b8;
+}
+
+body.dark-mode .empty-note {
+ background: rgba(15, 23, 42, 0.4);
+ border-color: rgba(51, 65, 85, 0.4);
+ color: #64748b;
+}
+
+/* ===== 黑夜模式:列管理器优化 ===== */
+body.dark-mode .column-item {
+ background: rgba(15, 23, 42, 0.5);
+ border-color: rgba(51, 65, 85, 0.4);
+ color: #cbd5e1;
+}
+
+body.dark-mode .add-column-row input {
+ background: rgba(15, 23, 42, 0.6);
+ color: #e2e8f0;
+ border-color: rgba(51, 65, 85, 0.5);
+}
+
+/* ===== 黑夜模式:导出按钮优化 ===== */
+body.dark-mode .btn-export {
+ background: linear-gradient(135deg, #0ea5e9, #0284c7);
+ color: #fff;
+}
+
+body.dark-mode .btn-export:hover {
+ background: linear-gradient(135deg, #38bdf8, #0ea5e9);
+}