Skip to content

🔧 前端构建修复与UI改进 - 2025年6月4日

📋 更新概述

本次更新专注于解决前端构建警告问题、修复关键的后端删除bug,以及改进用户界面体验。所有修复都经过充分测试,确保系统稳定可靠。


🐛 关键Bug修复

1. 修复番剧删除本地文件的严重bug ⭐

问题级别:🔴 严重(数据安全风险)

问题描述

  • 删除番剧源并选择"删除本地文件"时,系统会删除整个番剧基目录
  • 例如:删除《假面骑士时王》时,会删除整个 D:/Downloads/番剧/ 目录
  • 这会导致所有其他番剧文件被意外删除

根本原因

rust
// ❌ 危险的删除逻辑 - 删除整个基目录
let path = Path::new(&local_path);
if path.exists() {
    fs::remove_dir_all(path).await?;  // 危险!删除整个目录
}

修复方案

rust
// ✅ 安全的删除逻辑 - 只删除相关的季度文件夹
let mut deleted_paths = std::collections::HashSet::new();

for video in videos {
    if let Some(local_path) = &video.local_path {
        let path = Path::new(local_path);
        if path.exists() && path.is_dir() {
            let path_str = path.to_string_lossy().to_string();
            if !deleted_paths.contains(&path_str) {
                match fs::remove_dir_all(path).await {
                    Ok(_) => {
                        deleted_paths.insert(path_str.clone());
                        tracing::info!("成功删除本地目录: {}", path_str);
                    },
                    Err(e) => {
                        tracing::error!("删除本地目录失败 {}: {}", path_str, e);
                    }
                }
            } else {
                tracing::debug!("目录已删除,跳过: {}", path_str);
            }
        }
    }
}

安全改进

  • ✅ 只删除视频记录中实际关联的季度文件夹
  • ✅ 使用HashSet防止重复删除同一目录
  • ✅ 详细的删除日志记录
  • ✅ 完善的错误处理,单个目录删除失败不影响其他目录

🏗️ 前端构建警告修复

1. 解决未使用属性警告

问题

Warning: received an unexpected slot "default" in component DeleteVideoSourceDialog
Warning: unused export property in DeleteVideoSourceDialog.svelte: 'sourceId'

修复方案

svelte
<!-- 修复前:不必要的属性传递 -->
<DeleteVideoSourceDialog
    bind:open={deleteDialog.open}
    sourceId={deleteDialog.sourceId}  <!-- 未使用的属性 -->
    sourceName={deleteDialog.sourceName}
    sourceType={deleteDialog.sourceType}
    on:delete={handleDelete}
/>

<!-- 修复后:移除未使用的属性 -->
<DeleteVideoSourceDialog
    bind:open={deleteDialog.open}
    sourceName={deleteDialog.sourceName}
    sourceType={deleteDialog.sourceType}
    on:delete={handleDelete}
/>

2. 修复缺失依赖问题

解决的依赖缺失

  • ✅ 安装 @sveltejs/adapter-static
  • ✅ 安装 lucide-svelte 图标库

安装命令

bash
npm install @sveltejs/adapter-static lucide-svelte

3. 清理不必要的组件

删除的文件

  • web/src/lib/components/ui/checkbox/Checkbox.svelte
  • web/src/lib/components/ui/checkbox/index.ts

原因:这些组件未被使用且存在构建警告


🎨 UI体验改进

1. 删除确认对话框按钮样式重构

问题:按钮样式不一致,UI组件复杂且存在构建问题

解决方案:使用原生HTML按钮 + Tailwind CSS

svelte
<!-- 修复前:复杂的UI组件 -->
<AlertDialog.Footer class="pt-4">
    <AlertDialog.Cancel>取消</AlertDialog.Cancel>
    <AlertDialog.Action>删除</AlertDialog.Action>
</AlertDialog.Footer>

<!-- 修复后:简洁的原生按钮 -->
<div class="flex justify-end gap-3 pt-4">
    <button
        type="button"
        class="px-4 py-2 text-sm font-medium text-gray-900 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 transition-colors"
        on:click={() => open = false}
    >
        取消
    </button>
    
    <button
        type="button"
        class="inline-flex items-center px-4 py-2 text-sm font-medium text-white bg-red-600 border border-transparent rounded-md hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
        disabled={!canDelete || loading}
        on:click={handleDelete}
    >
        {#if loading}
            <div class="w-4 h-4 mr-2">
                <div class="w-full h-full border-2 border-white border-t-transparent rounded-full animate-spin"></div>
            </div>
        {/if}
        删除
    </button>
</div>

改进效果

  • 🎯 一致的视觉风格:取消按钮为灰色,删除按钮为红色
  • 🎯 清晰的交互状态:hover效果和focus环
  • 🎯 加载状态指示:删除时显示旋转图标
  • 🎯 禁用状态处理:条件不满足时按钮变灰
  • 🎯 平滑过渡动画:transition-colors效果

2. 布局和间距优化

改进内容

svelte
<!-- 优化的布局间距 -->
<div class="flex justify-end gap-3 pt-4">  <!-- gap-3 和 pt-4 改善间距 -->
    <!-- 按钮内容 -->
</div>

视觉效果

  • ✅ 按钮间距更合理(gap-3)
  • ✅ 顶部间距优化(pt-4)
  • ✅ 右对齐布局更符合操作习惯

🔧 技术改进

1. 组件属性清理

优化前

svelte
export let sourceId: number;  // 未使用的属性
export let sourceName: string;
export let sourceType: string;

优化后

svelte
export let sourceName: string;
export let sourceType: string;
// 移除未使用的 sourceId 属性

2. 事件处理优化

改进的删除事件处理

svelte
function handleDelete() {
    if (canDelete && !loading) {
        loading = true;
        dispatch('delete', {
            sourceName,
            sourceType,
            deleteLocalFiles
        });
    }
}

特点

  • ✅ 状态检查确保安全执行
  • ✅ 加载状态管理
  • ✅ 完整的事件数据传递

📊 构建结果

修复前的警告

Warning: received an unexpected slot "default" in component DeleteVideoSourceDialog
Warning: unused export property in DeleteVideoSourceDialog.svelte: 'sourceId'
Warning: Component imports/exports non-existent files

修复后的结果

✅ 构建成功,无警告信息
✅ 所有依赖正确安装
✅ 组件清理完成
✅ UI样式统一一致

🚀 升级建议

强烈建议所有用户更新,特别是:

  • 🔥 使用番剧删除功能的用户:避免意外删除其他番剧文件
  • 🔥 前端开发相关用户:享受更好的构建体验
  • 🔥 注重UI体验的用户:获得更一致的界面体验

📝 技术总结

本次更新通过以下方式显著改进了系统质量:

  1. 安全性提升:修复了潜在的数据丢失风险
  2. 构建优化:消除所有前端构建警告
  3. UI一致性:统一按钮样式和交互体验
  4. 代码质量:清理未使用代码,提高维护性

这些改进不仅解决了当前问题,还为后续开发奠定了更好的基础。


相关文件修改

  • crates/bili_sync/src/api/handler.rs - 修复删除逻辑bug
  • web/src/lib/components/delete-video-source-dialog.svelte - UI重构
  • web/src/lib/components/app-sidebar.svelte - 属性清理
  • web/package.json - 依赖更新