5.2 KiB
5.2 KiB
🔧 代码质量与安全优化 (13:30)
概述
本日进行项目全面代码审查与优化,共处理 27 项优化点,完成 18 项核心修复。
已完成优化
功能性修复
- P0-1: LatentSync 回退逻辑空实现 → 改为
raise RuntimeError - P1-1: 任务状态接口无用户归属校验 → 添加用户认证依赖
- P1-2: 前端 User 类型定义重复 → 统一到
shared/types/user.ts
性能优化
- P1-3: 参考音频列表 N+1 查询 → 使用
asyncio.gather并发 - P1-4: 视频上传整读内存 → 新增
upload_file_from_path流式处理 - P1-5: async 路由内同步阻塞 →
httpx.AsyncClient替换requests - P2-2: GLM 服务同步调用 →
asyncio.to_thread包装 - P2-3: Remotion 渲染启动慢 → 预编译 JS +
build:render脚本
安全修复
- P1-8: 硬编码 Cookie → 移至环境变量
DOUYIN_COOKIE - P1-9: 请求日志打印完整 headers → 敏感信息脱敏
- P2-10: ffprobe 使用
shell=True→ 改为参数列表 - P2-11: CORS 配置
*+ credentials → 从CORS_ORIGINS环境变量读取
配置优化
- P2-5: 存储服务硬编码路径 → 环境变量
SUPABASE_STORAGE_LOCAL_PATH - P3-3: Remotion
execSync同步调用 → promisifiedexec异步 - P3-5: LatentSync 相对路径 → 基于
__file__绝对路径
暂不处理(收益有限)
- [~] P1-6: useHomeController 超大文件 (884行)
- [~] P1-7: 抖音/微信上传器重复代码(流程差异大)
低优先级(后续处理)
- [
] **P2-6P2-9**: API 转发壳、前端 API 客户端混用、ESLint、重复逻辑 - [
] **P3-1P3-4**: 阻塞式交互、Modal 过大、样式兼容层
涉及文件
backend/app/services/latentsync_service.py- 回退逻辑backend/app/modules/videos/router.py- 任务状态认证backend/app/modules/tools/router.py- httpx 异步、Cookie 配置化backend/app/services/glm_service.py- 异步包装backend/app/services/storage.py- 流式上传、路径配置化backend/app/services/video_service.py- ffprobe 安全调用backend/app/main.py- CORS 配置、日志脱敏backend/app/core/config.py- 新增配置项remotion/render.ts- 异步 execremotion/package.json- build:render 脚本models/LatentSync/scripts/server.py- 绝对路径frontend/src/shared/types/user.ts- 统一类型定义
新增环境变量
# .env 新增配置(均有默认值,无需必填)
CORS_ORIGINS=* # CORS 白名单
SUPABASE_STORAGE_LOCAL_PATH=/path/to/... # 本地存储路径
DOUYIN_COOKIE=... # 抖音视频下载 Cookie
重启要求
pm2 restart vigent2-backend
pm2 restart vigent2-latentsync
# Remotion 已自动编译
🎨 交互与体验优化 (17:00)
- UX-1: PublishPage 图片加载优化 (
<img>→next/image) - UX-2: 按钮 Loading 状态统一 (提取脚本弹窗 + 发布页)
- UX-3: 骨架屏加载优化 (发布页加载中状态)
- UX-4: 全局快捷键支持 (ESC 关闭弹窗, Enter 确认)
- UX-5: 移除全局 GlobalTaskIndicator (视觉降噪)
- UX-6: 视频生成完成自动刷新列表并选中最新
🐛 缺陷修复与回归治理 (17:30)
严重缺陷修复
-
BUG-1: Remotion 渲染脚本路径解析错误 (导致标题字幕丢失)
- 原因:
render.js预编译后使用了__dirname,在dist目录下寻找源码失败。 - 修复: 修改
render.ts使用process.cwd()动态解析路径,并重新编译。
- 原因:
-
BUG-2: 发布页视频选择持久化失效 (Auth 异步竞态)
- 原因: 页面加载时
useAuth尚未返回用户 ID,导致使用guestKey 读取不到记录,随后被默认值覆盖。 - 修复: 引入
isVideoRestored状态机,强制等待 Auth 完成且 Video 列表加载完毕后,才执行恢复逻辑。
- 原因: 页面加载时
回归问题治理
-
REG-1: 首页历史作品 ID 恢复后内容不显示
- 原因: 持久化模块恢复了 ID,但
useGeneratedVideos未监听 ID 变化同步 URL。 - 修复: 新增
useEffect监听selectedVideoId变化并同步generatedVideoURL。
- 原因: 持久化模块恢复了 ID,但
-
REG-2: 首页/发布页“默认选中第一个”逻辑丢失
- 原因: 重构移除旧逻辑后,新用户或无缓存用户进入页面无默认选中。
- 修复: 在
isRestored且无选中时,增加兜底逻辑自动选中列表第一项。
-
REG-3: 素材选择持久化失效 (闭包陷阱)
- 原因:
useMaterials加载回调中捕获了旧的selectedMaterial状态,覆盖了已恢复的值。 - 修复: 改为函数式状态更新 (
setState(prev => ...)),确保基于最新状态判断。
- 原因:
-
REF-1: 持久化逻辑全站收敛与排查
- 优化: 清理
useBgm,useGeneratedVideos,useTitleSubtitleStyles中的冗余localStorage读取,统一由useHomePersistence管理。 - 排查: 深度排查
useRefAudios,useTitleSubtitleStyles等模块,确认逻辑健壮,无类似回归风险。
- 优化: 清理