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 @@
{{ log.showDetail ? '▾' : '▸' }} - {{ log.scanTime || log.createTime || '-' }} - {{ log.description || '刮削任务执行记录' }} + {{ log.scanTime || '-' }} + {{ getStatusText(log.status) || '刮削任务执行记录' }}
- 总共: {{ log.totalMovies || log.total || 0 }} - 成功: {{ log.successCount || log.success || 0 }} - 失败: {{ log.failCount || log.failed || 0 }} + 总共: {{ log.totalMovies || 0 }} + 成功: {{ log.successCount || 0 }} + 失败: {{ log.failCount || 0 }}
@@ -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); +}