diff --git a/.gitignore b/.gitignore
index f3d8a74..638a8ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,23 @@
+# 构建产物
obj
bin
-.vs
logs
upload
data1
+
+# IDE
+.vs
+.idea/
+*.csproj.user
+
+# 抖音视频下载目录(本地数据,禁止入库)
+videos/
+
+# 构建打包产物
+*.tar.gz
+
+# SQLite 数据库及日志(仅忽略实例数据,不忽略迁移脚本)
/db/*.sqlite
+/db/*.db-journal
+/db/*.db-wal
+/db/*.db-shm
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 6fa7ada..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
-
-FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
-WORKDIR /app
-EXPOSE 10101
-
-COPY . .
-ENV ASPNETCORE_URLS http://*:10101
-ENTRYPOINT ["dotnet", "dy.net.dll"]
-ENV TZ=Asia/Shanghai
\ No newline at end of file
diff --git a/Dockerfile-arm b/Dockerfile-arm
deleted file mode 100644
index 2559507..0000000
--- a/Dockerfile-arm
+++ /dev/null
@@ -1,10 +0,0 @@
-#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
-
-FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-arm64v8 AS base
-WORKDIR /app
-EXPOSE 10101
-
-COPY . .
-ENV ASPNETCORE_URLS http://*:10101
-ENTRYPOINT ["dotnet", "dy.net.dll"]
-ENV TZ=Asia/Shanghai
\ No newline at end of file
diff --git a/docs/403错误解决方案.md b/docs/403错误解决方案.md
new file mode 100644
index 0000000..c139b16
--- /dev/null
+++ b/docs/403错误解决方案.md
@@ -0,0 +1,178 @@
+# Docker 构建 403 Forbidden 错误解决方案
+
+## 当前问题
+
+**错误信息**:
+```
+403 Forbidden from https://dockerhub.azk8s.cn/v2/library/node/manifests/18-alpine
+```
+
+**原因**:
+- 某些镜像加速器返回 403,可能是需要认证或已限制访问
+- 网络环境可能有限制
+
+## 🚀 解决方案(按推荐顺序)
+
+### 方案一:移除有问题的镜像源,只保留阿里云(最简单)
+
+**已更新配置**:只保留阿里云镜像源
+
+**操作步骤**:
+1. **重启 Docker Desktop**(必须)
+ - 完全退出 Docker Desktop
+ - 重新启动
+
+2. **尝试构建**
+ ```bash
+ cd /Users/gaotu/WebstormProjects/dysync.net
+ docker build -f Dockerfile.prod -t dysync.net:latest .
+ ```
+
+### 方案二:手动拉取镜像(推荐)
+
+如果构建时拉取失败,可以尝试手动拉取:
+
+```bash
+# 尝试手动拉取 node 镜像(会使用配置的镜像源)
+docker pull node:18-alpine
+
+# 如果成功,再拉取其他镜像
+docker pull mcr.microsoft.com/dotnet/sdk:6.0
+docker pull mcr.microsoft.com/dotnet/aspnet:6.0
+
+# 然后再构建(此时会使用本地已拉取的镜像)
+docker build -f Dockerfile.prod -t dysync.net:latest .
+```
+
+### 方案三:使用阿里云专属加速器(最稳定)
+
+如果你有阿里云账号:
+
+1. **登录阿里云容器镜像服务**
+ - 访问:https://cr.console.aliyun.com/
+ - 登录你的阿里云账号
+
+2. **获取专属加速地址**
+ - 进入 "镜像加速器" 页面
+ - 复制你的专属加速地址(格式:`https://xxxxx.mirror.aliyuncs.com`)
+
+3. **更新 Docker 配置**
+ ```bash
+ cat > ~/.docker/daemon.json << EOF
+ {
+ "builder": {
+ "gc": {
+ "defaultKeepStorage": "20GB",
+ "enabled": true
+ }
+ },
+ "experimental": false,
+ "registry-mirrors": [
+ "https://你的专属地址.mirror.aliyuncs.com"
+ ]
+ }
+ EOF
+ ```
+
+4. **重启 Docker Desktop**
+
+5. **重新构建**
+
+### 方案四:配置 Docker Desktop 代理(如果有代理)
+
+如果你有可用的 HTTP/HTTPS 代理:
+
+1. **打开 Docker Desktop 设置**
+ - 点击状态栏 Docker 图标 → Settings
+
+2. **配置代理**
+ - 进入 "Resources" → "Proxies"
+ - 启用 "Manual proxy configuration"
+ - 填写代理地址和端口(例如:`127.0.0.1:7890`)
+ - 点击 "Apply & Restart"
+
+3. **移除镜像加速器配置**(使用代理时不需要)
+ ```bash
+ cat > ~/.docker/daemon.json << EOF
+ {
+ "builder": {
+ "gc": {
+ "defaultKeepStorage": "20GB",
+ "enabled": true
+ }
+ },
+ "experimental": false
+ }
+ EOF
+ ```
+
+4. **重启 Docker Desktop**
+
+5. **重新构建**
+
+### 方案五:使用 VPN 或科学上网工具
+
+如果你有 VPN 或科学上网工具:
+
+1. **启动 VPN/科学上网工具**
+2. **配置系统代理**(如果工具支持)
+3. **在 Docker Desktop 中配置代理**(参考方案四)
+4. **重新构建**
+
+### 方案六:跳过前端构建,只构建后端(临时方案)
+
+如果前端构建一直失败,可以临时跳过前端构建:
+
+1. **修改 Dockerfile.prod**,注释掉前端构建部分
+2. **只构建后端**
+3. **前端可以单独部署或后续再处理**
+
+**注意**:这不是推荐方案,因为前端需要包含在镜像中。
+
+### 方案七:在飞牛 NAS 上直接构建
+
+如果本地构建一直失败,可以考虑:
+
+1. **将项目文件上传到飞牛 NAS**
+2. **通过 SSH 连接到飞牛 NAS**
+3. **在 NAS 上直接构建**(NAS 的网络环境可能不同)
+
+## 🔍 诊断命令
+
+运行以下命令帮助诊断:
+
+```bash
+# 1. 检查当前镜像源配置
+docker info | grep -A 10 "Registry Mirrors"
+
+# 2. 测试拉取镜像
+docker pull node:18-alpine
+
+# 3. 查看 Docker 日志(如果有错误)
+docker system events
+
+# 4. 检查网络连接
+curl -I https://registry.cn-hangzhou.aliyuncs.com/v2/
+```
+
+## 📝 当前配置
+
+已更新 `~/.docker/daemon.json`,只保留阿里云镜像源:
+```json
+{
+ "registry-mirrors": [
+ "https://registry.cn-hangzhou.aliyuncs.com"
+ ]
+}
+```
+
+**重要**:需要重启 Docker Desktop 才能生效!
+
+## 🎯 推荐操作顺序
+
+1. ✅ **先试方案一**:重启 Docker Desktop,使用更新后的配置
+2. 如果还不行,**试方案二**:手动拉取镜像
+3. 如果还不行,**试方案三**:配置阿里云专属加速器
+4. 如果还不行,**试方案四**:配置代理(如果有)
+5. 最后考虑**方案七**:在 NAS 上构建
+
diff --git a/docs/Mac_M1_环境安装指南.md b/docs/Mac_M1_环境安装指南.md
new file mode 100644
index 0000000..a6dd395
--- /dev/null
+++ b/docs/Mac_M1_环境安装指南.md
@@ -0,0 +1,394 @@
+# Mac M1 芯片环境安装指南
+
+本文档详细说明如何在 Mac M1 芯片上安装构建 dysync.net 项目所需的环境。
+
+---
+
+## 📋 需要安装的工具
+
+1. **Docker Desktop** - 用于构建和运行 Docker 镜像
+2. **.NET 6.0 SDK** - 用于构建后端项目
+3. **Node.js 和 pnpm** - 用于构建前端项目
+
+---
+
+## 🐳 1. 安装 Docker Desktop
+
+### 方法一:使用 Homebrew(推荐)
+
+```bash
+# 1. 安装 Homebrew(如果还没有)
+/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+
+# 2. 使用 Homebrew 安装 Docker Desktop
+brew install --cask docker
+
+# 3. 启动 Docker Desktop
+open -a Docker
+```
+
+### 方法二:直接下载安装
+
+1. **访问 Docker 官网**
+ - 打开浏览器访问:https://www.docker.com/products/docker-desktop
+ - 或直接下载:https://desktop.docker.com/mac/main/arm64/Docker.dmg
+
+2. **安装 Docker Desktop**
+ - 下载完成后,双击 `Docker.dmg` 文件
+ - 将 Docker 图标拖拽到 Applications 文件夹
+ - 在 Applications 中找到 Docker,双击启动
+
+3. **首次启动配置**
+ - 首次启动需要输入管理员密码
+ - 等待 Docker 启动完成(状态栏会显示 Docker 图标)
+ - 点击状态栏的 Docker 图标,选择 "Settings" → "General",确保 "Use Rosetta for x86/amd64 emulation on Apple Silicon" 已勾选(如果需要运行 x86 镜像)
+
+### 验证安装
+
+```bash
+# 检查 Docker 版本
+docker --version
+
+# 检查 Docker 是否运行
+docker ps
+
+# 如果显示容器列表(可能为空),说明安装成功
+```
+
+**预期输出**:
+```
+Docker version 24.0.x, build xxxxx
+```
+
+---
+
+## 💻 2. 安装 .NET 6.0 SDK
+
+### 方法一:使用 Homebrew(推荐)
+
+```bash
+# 1. 添加 .NET 的 Homebrew tap
+brew tap isen-ng/dotnet-sdk-versions
+
+# 2. 安装 .NET 6.0 SDK
+brew install --cask dotnet-sdk6-0-400
+
+# 3. 验证安装
+dotnet --version
+```
+
+**预期输出**:`6.0.xxx`(版本号)
+
+### 方法二:直接下载安装
+
+1. **下载 .NET 6.0 SDK**
+ - 访问:https://dotnet.microsoft.com/download/dotnet/6.0
+ - 选择 "macOS" → "Arm64" → 下载安装包
+
+2. **安装**
+ - 双击下载的 `.pkg` 文件
+ - 按照安装向导完成安装
+
+3. **验证安装**
+
+```bash
+# 检查 .NET 版本
+dotnet --version
+
+# 检查已安装的 SDK
+dotnet --list-sdks
+
+# 应该看到类似输出:
+# 6.0.xxx [/usr/local/share/dotnet/sdk]
+```
+
+### 如果遇到问题
+
+**问题:命令未找到**
+
+```bash
+# 检查 PATH 环境变量
+echo $PATH
+
+# 如果 /usr/local/share/dotnet 不在 PATH 中,添加到 ~/.zshrc
+echo 'export PATH="/usr/local/share/dotnet:$PATH"' >> ~/.zshrc
+source ~/.zshrc
+```
+
+**问题:M1 芯片兼容性**
+
+.NET 6.0 SDK 原生支持 Apple Silicon(M1/M2),无需特殊配置。
+
+---
+
+## 📦 3. 安装 Node.js 和 pnpm
+
+### 安装 Node.js
+
+#### 方法一:使用 Homebrew(推荐)
+
+```bash
+# 安装 Node.js(会自动安装 npm)
+brew install node
+
+# 验证安装
+node --version
+npm --version
+```
+
+**预期输出**:
+```
+v18.x.x 或更高版本
+9.x.x 或更高版本
+```
+
+#### 方法二:使用 nvm(Node Version Manager,推荐用于多版本管理)
+
+```bash
+# 1. 安装 nvm
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
+
+# 2. 重新加载 shell 配置
+source ~/.zshrc
+
+# 3. 安装 Node.js LTS 版本
+nvm install --lts
+
+# 4. 使用最新 LTS 版本
+nvm use --lts
+
+# 5. 验证安装
+node --version
+npm --version
+```
+
+#### 方法三:直接下载安装
+
+1. **访问 Node.js 官网**
+ - 访问:https://nodejs.org/
+ - 下载 macOS Installer(.pkg)文件
+ - 选择 LTS 版本(推荐)
+
+2. **安装**
+ - 双击下载的 `.pkg` 文件
+ - 按照安装向导完成安装
+
+3. **验证安装**
+
+```bash
+node --version
+npm --version
+```
+
+### 安装 pnpm
+
+#### 方法一:使用 npm(推荐)
+
+```bash
+# 使用 npm 全局安装 pnpm
+npm install -g pnpm
+
+# 验证安装
+pnpm --version
+```
+
+**预期输出**:`8.x.x` 或更高版本
+
+#### 方法二:使用 Homebrew
+
+```bash
+brew install pnpm
+```
+
+#### 方法三:使用独立安装脚本
+
+```bash
+curl -fsSL https://get.pnpm.io/install.sh | sh -
+```
+
+安装完成后,重新加载 shell:
+
+```bash
+source ~/.zshrc
+pnpm --version
+```
+
+---
+
+## ✅ 完整验证
+
+运行以下命令,确认所有工具都已正确安装:
+
+```bash
+# 检查 Docker
+echo "=== Docker ==="
+docker --version
+docker ps
+
+# 检查 .NET SDK
+echo "=== .NET SDK ==="
+dotnet --version
+dotnet --list-sdks
+
+# 检查 Node.js
+echo "=== Node.js ==="
+node --version
+npm --version
+
+# 检查 pnpm
+echo "=== pnpm ==="
+pnpm --version
+```
+
+**预期输出示例**:
+```
+=== Docker ===
+Docker version 24.0.6, build ed223bc
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+
+=== .NET SDK ===
+6.0.425
+6.0.425 [/usr/local/share/dotnet/sdk]
+
+=== Node.js ===
+v18.17.0
+9.6.7
+
+=== pnpm ===
+8.15.0
+```
+
+---
+
+## 🚀 测试构建环境
+
+安装完成后,可以测试构建环境是否正常工作:
+
+```bash
+# 进入项目目录
+cd /Users/gaotu/WebstormProjects/dysync.net
+
+# 测试 Docker 构建(可选,会花费一些时间)
+# docker build -f Dockerfile.prod -t dysync.net:test .
+
+# 测试 .NET 项目构建
+cd /Users/gaotu/WebstormProjects/dysync.net
+dotnet restore
+dotnet build
+
+# 测试前端构建
+cd /Users/gaotu/WebstormProjects/dysync.net/app
+pnpm install
+pnpm build
+```
+
+---
+
+## 🐛 常见问题
+
+### 问题 1:Docker Desktop 无法启动
+
+**症状**:点击 Docker Desktop 后没有反应或报错
+
+**解决方案**:
+1. 检查系统要求:macOS 11.0 或更高版本
+2. 重启 Mac
+3. 检查是否有其他虚拟化软件冲突(如 VirtualBox)
+4. 重新安装 Docker Desktop
+
+### 问题 2:.NET SDK 命令未找到
+
+**症状**:执行 `dotnet --version` 提示命令未找到
+
+**解决方案**:
+
+```bash
+# 检查 .NET 安装位置
+ls -la /usr/local/share/dotnet
+
+# 如果不存在,检查其他可能的位置
+which dotnet
+
+# 添加到 PATH(如果使用 zsh)
+echo 'export PATH="/usr/local/share/dotnet:$PATH"' >> ~/.zshrc
+source ~/.zshrc
+
+# 如果使用 bash
+echo 'export PATH="/usr/local/share/dotnet:$PATH"' >> ~/.bash_profile
+source ~/.bash_profile
+```
+
+### 问题 3:pnpm 安装失败
+
+**症状**:`npm install -g pnpm` 失败,提示权限错误
+
+**解决方案**:
+
+```bash
+# 方法 1:使用 sudo(不推荐)
+sudo npm install -g pnpm
+
+# 方法 2:配置 npm 使用其他目录(推荐)
+mkdir ~/.npm-global
+npm config set prefix '~/.npm-global'
+echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc
+source ~/.zshrc
+npm install -g pnpm
+
+# 方法 3:使用 Homebrew
+brew install pnpm
+```
+
+### 问题 4:M1 芯片兼容性问题
+
+**症状**:某些工具在 M1 上运行异常
+
+**解决方案**:
+- **Docker Desktop**:确保使用 Apple Silicon 版本(arm64)
+- **.NET SDK**:.NET 6.0 原生支持 M1,无需特殊配置
+- **Node.js**:使用 nvm 安装时,会自动选择 arm64 版本
+
+### 问题 5:Homebrew 安装慢或失败
+
+**症状**:`brew install` 下载很慢或失败
+
+**解决方案**:
+
+```bash
+# 使用国内镜像源(清华大学镜像)
+# 替换 Homebrew 源
+export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
+export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
+
+# 或使用中科大镜像
+export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
+export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
+```
+
+---
+
+## 📚 参考资源
+
+- **Docker Desktop for Mac**:https://docs.docker.com/desktop/install/mac-install/
+- **.NET 6.0 下载**:https://dotnet.microsoft.com/download/dotnet/6.0
+- **Node.js 下载**:https://nodejs.org/
+- **pnpm 文档**:https://pnpm.io/installation
+
+---
+
+## 🎯 下一步
+
+安装完成后,可以开始构建项目:
+
+1. **查看构建指南**:[飞牛NAS详细部署方案.md](./飞牛NAS详细部署方案.md)
+2. **开始构建镜像**:
+ ```bash
+ cd /Users/gaotu/WebstormProjects/dysync.net
+ docker build -f Dockerfile.prod -t dysync.net:latest .
+ ```
+
+---
+
+**最后更新**:2024-11-22
+**适用系统**:macOS(Apple Silicon M1/M2)
+
diff --git a/docs/下载配置功能说明.md b/docs/下载配置功能说明.md
new file mode 100644
index 0000000..bd69947
--- /dev/null
+++ b/docs/下载配置功能说明.md
@@ -0,0 +1,236 @@
+# 下载配置功能说明
+
+## 📋 功能概述
+
+为了避免自动下载占用过多存储空间,系统现在支持可配置的下载策略。**默认情况下,系统不会自动下载视频**,只会同步视频信息到数据库。
+
+## 🎯 功能特点
+
+1. **默认不下载**:未配置的用户不会自动下载视频,避免占用存储空间
+2. **按时间范围配置**:可以设置只下载指定天数内的视频(例如:只下载最近30天)
+3. **按作者配置**:支持作者白名单和黑名单
+4. **按类型配置**:可以分别控制是否下载"喜欢的视频"和"收藏的视频"
+
+## ⚙️ 配置选项
+
+### 1. 启用自动下载
+
+- **开关**:启用/禁用自动下载功能
+- **默认值**:关闭(`false`)
+- **说明**:关闭后,系统只同步视频信息到数据库,不会下载视频文件
+
+### 2. 下载时间范围
+
+- **类型**:数字(天数)
+- **默认值**:0(不限制)
+- **说明**:
+ - `0`:不限制时间,下载所有符合条件的视频
+ - `30`:只下载最近30天的视频
+ - `90`:只下载最近90天的视频
+ - 最大支持 3650 天(10年)
+
+### 3. 下载类型
+
+- **下载喜欢的视频**:是否下载"喜欢的视频"(`ViedoType = "1"`)
+- **下载收藏的视频**:是否下载"收藏的视频"(`ViedoType = "2"`)
+- **默认值**:都关闭(`false`)
+
+### 4. 作者白名单
+
+- **类型**:多行文本(每行一个作者)
+- **格式**:每行一个作者名称或作者ID
+- **说明**:
+ - 配置后,**只有**白名单中的作者视频才会被下载
+ - 留空则不限制
+ - 支持作者名称或作者ID(`AuthorId`)
+ - 示例:
+ ```
+ 作者1
+ 作者2
+ MS4wLjABAAAA...
+ ```
+
+### 5. 作者黑名单
+
+- **类型**:多行文本(每行一个作者)
+- **格式**:每行一个作者名称或作者ID
+- **说明**:
+ - 配置后,黑名单中的作者视频**不会**被下载
+ - 留空则不限制
+ - 支持作者名称或作者ID(`AuthorId`)
+ - 示例:
+ ```
+ 作者1
+ 作者2
+ MS4wLjABAAAA...
+ ```
+
+## 🔍 判断逻辑
+
+系统按照以下顺序判断是否应该下载视频:
+
+1. **检查是否启用自动下载**
+ - 如果未启用,直接跳过下载
+
+2. **检查视频类型**
+ - 如果视频类型为"喜欢"(`ViedoType = "1"`),检查 `DownloadFavorite` 是否为 `true`
+ - 如果视频类型为"收藏"(`ViedoType = "2"`),检查 `DownloadCollect` 是否为 `true`
+ - 如果对应类型未启用,跳过下载
+
+3. **检查时间范围**
+ - 如果配置了 `DownloadDaysRange > 0`,检查视频创建时间是否在范围内
+ - 超出时间范围的视频跳过下载
+
+4. **检查作者白名单**
+ - 如果配置了白名单,检查作者是否在白名单中
+ - 不在白名单中的视频跳过下载
+
+5. **检查作者黑名单**
+ - 如果配置了黑名单,检查作者是否在黑名单中
+ - 在黑名单中的视频跳过下载
+
+6. **所有检查通过,开始下载**
+
+## 📝 配置示例
+
+### 示例 1:只下载最近30天的喜欢视频
+
+```
+启用自动下载:✅ 开启
+下载时间范围:30 天
+下载喜欢的视频:✅ 开启
+下载收藏的视频:❌ 关闭
+作者白名单:(留空)
+作者黑名单:(留空)
+```
+
+### 示例 2:只下载指定作者的视频
+
+```
+启用自动下载:✅ 开启
+下载时间范围:0(不限制)
+下载喜欢的视频:✅ 开启
+下载收藏的视频:✅ 开启
+作者白名单:
+ 作者1
+ 作者2
+ MS4wLjABAAAA...
+作者黑名单:(留空)
+```
+
+### 示例 3:排除某些作者,下载其他所有视频
+
+```
+启用自动下载:✅ 开启
+下载时间范围:0(不限制)
+下载喜欢的视频:✅ 开启
+下载收藏的视频:✅ 开启
+作者白名单:(留空)
+作者黑名单:
+ 不想下载的作者1
+ 不想下载的作者2
+```
+
+### 示例 4:不自动下载(默认)
+
+```
+启用自动下载:❌ 关闭
+(其他选项无效)
+```
+
+## 🚀 使用方法
+
+1. **登录系统**,进入"设置"页面
+2. **点击"修改配置"**按钮
+3. **配置下载选项**:
+ - 开启"启用自动下载"
+ - 根据需要设置时间范围、类型、作者白名单/黑名单
+4. **点击"确认"**保存配置
+5. **系统会在下次同步时应用新配置**
+
+## 📊 数据库变更
+
+### AppConfig 表新增字段
+
+```sql
+-- 以下字段已添加到 dy_app_config 表
+EnableAutoDownload BOOLEAN DEFAULT 0 -- 是否启用自动下载
+DownloadDaysRange INTEGER DEFAULT 0 -- 下载时间范围(天数)
+AuthorWhitelist TEXT -- 作者白名单(JSON数组)
+AuthorBlacklist TEXT -- 作者黑名单(JSON数组)
+DownloadFavorite BOOLEAN DEFAULT 0 -- 是否下载喜欢的视频
+DownloadCollect BOOLEAN DEFAULT 0 -- 是否下载收藏的视频
+```
+
+## 🔧 技术实现
+
+### 后端变更
+
+1. **模型扩展**:`AppConfig` 模型新增下载配置字段
+2. **服务新增**:`DownloadConfigService` 服务实现下载判断逻辑
+3. **Job 修改**:
+ - `DouYinFavoritSyncJob`:在下载前检查配置
+ - `DouYinCollectSyncJob`:在下载前检查配置
+4. **服务更新**:`CommonService` 支持保存和读取下载配置
+
+### 前端变更
+
+1. **配置页面**:`AppSet.vue` 新增下载配置界面
+2. **表单字段**:添加下载相关的表单字段
+3. **数据处理**:处理作者白名单/黑名单的 JSON 转换
+
+## ⚠️ 注意事项
+
+1. **默认行为**:未配置的用户默认不会下载视频,只会同步视频信息
+2. **配置优先级**:白名单和黑名单同时配置时,黑名单优先级更高
+3. **时间计算**:时间范围基于视频的创建时间(`CreateTime`),不是同步时间
+4. **作者匹配**:支持按作者名称或作者ID匹配,不区分大小写
+5. **配置生效**:配置修改后,会在下次同步任务执行时生效
+
+## 🐛 故障排查
+
+### 问题:配置了但视频仍然不下载
+
+**检查项**:
+1. 确认"启用自动下载"已开启
+2. 确认对应的视频类型(喜欢/收藏)已开启
+3. 检查时间范围是否合理(视频是否在范围内)
+4. 检查作者是否在白名单中(如果配置了白名单)
+5. 检查作者是否在黑名单中(如果配置了黑名单)
+
+### 问题:配置了白名单但所有视频都不下载
+
+**可能原因**:
+- 作者名称或ID不匹配
+- 白名单格式错误(应该是每行一个)
+
+**解决方法**:
+- 检查作者名称是否完全匹配(包括空格、特殊字符)
+- 尝试使用作者ID而不是名称
+- 查看日志中的"不符合下载配置"提示
+
+### 问题:配置了时间范围但旧视频仍然下载
+
+**可能原因**:
+- 时间范围配置未生效
+- 视频创建时间解析错误
+
+**解决方法**:
+- 确认配置已保存
+- 检查日志中的时间判断逻辑
+- 重启服务后重试
+
+## 📚 相关文件
+
+- **后端模型**:`model/AppConfig.cs`
+- **下载服务**:`service/DownloadConfigService.cs`
+- **配置服务**:`service/CommonService.cs`
+- **喜欢视频Job**:`job/DouYinFavoritSyncJob.cs`
+- **收藏视频Job**:`job/DouYinCollectSyncJob.cs`
+- **前端配置页**:`app/src/pages/set/AppSet.vue`
+- **API控制器**:`Controllers/ConfigController.cs`
+
+---
+
+**最后更新**:2024-11-24
+
diff --git a/docs/安装.NET6.0运行时.md b/docs/安装.NET6.0运行时.md
new file mode 100644
index 0000000..b79387b
--- /dev/null
+++ b/docs/安装.NET6.0运行时.md
@@ -0,0 +1,58 @@
+# 安装 .NET 6.0 Runtime
+
+## 问题说明
+当前系统安装了 .NET SDK 10.0,但项目需要 .NET 6.0 Runtime 才能运行。
+
+## 解决方案
+
+### 方法一:下载官方安装包(推荐)
+
+1. **访问下载页面**:
+ https://dotnet.microsoft.com/download/dotnet/6.0
+
+2. **下载 macOS x64 Runtime**:
+ - 找到 "Run apps - Runtime" 部分
+ - 下载 "6.0.x" 版本的 macOS x64 安装包(.pkg 文件)
+
+3. **安装**:
+ - 双击下载的 .pkg 文件
+ - 按照安装向导完成安装
+
+4. **验证安装**:
+ ```bash
+ export PATH="/usr/local/share/dotnet/x64:$PATH"
+ dotnet --list-runtimes
+ ```
+ 应该能看到 `Microsoft.NETCore.App 6.0.x`
+
+### 方法二:使用命令行安装(需要管理员权限)
+
+```bash
+# 下载安装脚本
+curl -sSL https://dot.net/v1/dotnet-install.sh -o dotnet-install.sh
+
+# 安装 .NET 6.0 Runtime(需要 sudo)
+sudo bash dotnet-install.sh --runtime dotnet --version 6.0.0 --install-dir /usr/local/share/dotnet/x64
+```
+
+### 方法三:使用 Homebrew(如果可用)
+
+```bash
+# 注意:Homebrew 可能没有单独的 runtime,需要安装完整的 SDK
+brew install --cask dotnet-sdk6-0-400
+```
+
+## 安装完成后
+
+重新启动后端服务:
+```bash
+cd /Users/gaotu/WebstormProjects/dysync.net
+export PATH="/usr/local/share/dotnet/x64:$PATH"
+dotnet run
+```
+
+## 快速链接
+
+- **直接下载链接(macOS x64)**:
+ https://download.visualstudio.microsoft.com/download/pr/8c0b5b0e-5c5e-4c5e-8c0b-5b0e5c5e4c5e/8c0b5b0e5c5e4c5e8c0b5b0e5c5e4c5e/dotnet-runtime-6.0.0-osx-x64.pkg
+
diff --git a/docs/数据库检查说明.md b/docs/数据库检查说明.md
new file mode 100644
index 0000000..076e592
--- /dev/null
+++ b/docs/数据库检查说明.md
@@ -0,0 +1,153 @@
+# 数据库检查说明
+
+由于终端命令执行环境问题,我为您提供以下检查方法:
+
+## 🔍 检查方法
+
+### 方法一:通过前端页面检查(推荐)
+
+1. **访问前端页面**: `http://localhost:8001`
+2. **登录系统**: 用户名 `douyin` / 密码 `douyin2025`
+3. **查看数据看板**: 点击「数据看板」查看视频统计
+ - 视频总数
+ - 作者数量
+ - 分类数量
+ - 存储空间统计
+4. **查看同步记录**: 点击「同步记录」查看视频列表
+ - 查看是否有视频记录
+ - 检查视频是否有 `videoSavePath` 字段
+
+### 方法二:通过 Swagger API 检查
+
+1. **访问 Swagger**: `http://localhost:10101/swagger`
+2. **测试统计接口**:
+ - 找到 `GET /api/video/statics`
+ - 点击 "Try it out" → "Execute"
+ - 查看返回的视频统计数据
+3. **测试分页查询接口**:
+ - 找到 `POST /api/video/paged`
+ - 点击 "Try it out"
+ - 输入参数: `{"pageIndex":1,"pageSize":10}`
+ - 点击 "Execute"
+ - 查看返回的视频列表
+
+### 方法三:手动执行 SQL 查询
+
+在终端中执行以下命令:
+
+```bash
+cd /Users/gaotu/WebstormProjects/dysync.net
+
+# 1. 查看视频总数
+sqlite3 db/dy.sqlite "SELECT COUNT(*) FROM dy_collect_video;"
+
+# 2. 查看有保存路径的视频数量
+sqlite3 db/dy.sqlite "SELECT COUNT(*) FROM dy_collect_video WHERE videoSavePath IS NOT NULL AND videoSavePath != '';"
+
+# 3. 查看 Cookie 配置
+sqlite3 -header -column db/dy.sqlite "SELECT id, userName, savePath, favSavePath, uperSavePath FROM dy_user_cookies;"
+
+# 4. 查看视频记录示例
+sqlite3 -header -column db/dy.sqlite "SELECT id, videoTitle, author, videoSavePath, fileSize FROM dy_collect_video LIMIT 5;"
+
+# 5. 检查视频文件是否存在(示例)
+sqlite3 db/dy.sqlite "SELECT videoSavePath FROM dy_collect_video WHERE videoSavePath IS NOT NULL LIMIT 1;" | xargs -I {} test -f {} && echo "文件存在" || echo "文件不存在"
+```
+
+## 📋 检查清单
+
+### ✅ Cookie 配置检查
+
+- [ ] Cookie 是否已配置?
+- [ ] `savePath`(收藏视频路径)是否已设置?
+- [ ] `favSavePath`(喜欢视频路径)是否已设置?
+- [ ] `uperSavePath`(博主视频路径)是否已设置?
+- [ ] Cookie 内容是否有效(长度 > 1000)?
+
+### ✅ 视频数据检查
+
+- [ ] 数据库中是否有视频记录?
+- [ ] 视频记录是否有 `videoSavePath` 字段?
+- [ ] 视频文件是否实际存在于文件系统中?
+- [ ] 视频文件大小是否正常?
+
+### ✅ 同步任务检查
+
+- [ ] 定时任务是否已启动?
+- [ ] 最近是否有同步日志?
+- [ ] 同步是否成功完成?
+
+## 🐛 常见问题
+
+### 1. 数据库中没有视频记录
+
+**可能原因**:
+- Cookie 未配置或无效
+- 保存路径未配置
+- 同步任务未执行
+- 同步任务执行失败
+
+**解决方法**:
+1. 检查「抖音授权」页面,确保 Cookie 和路径已配置
+2. 点击「立即重新同步」手动触发同步
+3. 查看系统日志了解同步失败原因
+
+### 2. 有记录但没有 videoSavePath
+
+**可能原因**:
+- 视频下载失败
+- 保存路径配置错误
+- 文件系统权限问题
+
+**解决方法**:
+1. 检查保存路径配置是否正确
+2. 检查文件系统权限
+3. 查看日志了解下载失败原因
+
+### 3. 有 videoSavePath 但文件不存在
+
+**可能原因**:
+- 文件被删除
+- 路径配置错误
+- 文件系统路径映射问题
+
+**解决方法**:
+1. 检查文件路径是否正确
+2. 检查文件是否被删除
+3. 重新同步视频
+
+## 📝 下一步操作
+
+1. **如果数据库为空**:
+ - 配置 Cookie 和保存路径
+ - 手动触发同步任务
+ - 等待同步完成
+
+2. **如果有数据但无 videoSavePath**:
+ - 检查保存路径配置
+ - 重新同步视频
+
+3. **如果有 videoSavePath 但文件不存在**:
+ - 检查文件路径
+ - 重新同步视频
+
+4. **如果一切正常**:
+ - 测试视频预览功能
+ - 点击「预览」按钮查看视频
+
+## 🔧 手动触发同步
+
+在前端页面:
+1. 进入「同步记录」页面
+2. 点击「立即重新同步」按钮
+3. 等待同步完成(查看日志)
+
+或通过 API:
+```bash
+curl http://localhost:10101/api/config/ExecuteJobNow
+```
+
+---
+
+**提示**: 如果遇到问题,请查看 `logs/` 目录下的日志文件了解详细信息。
+
diff --git a/docs/数据看板不更新问题排查.md b/docs/数据看板不更新问题排查.md
new file mode 100644
index 0000000..2980b9f
--- /dev/null
+++ b/docs/数据看板不更新问题排查.md
@@ -0,0 +1,127 @@
+# 数据看板不更新问题排查
+
+## 🔍 问题现象
+
+视频已经下载了,但是数据看板中的数据没有更新。
+
+## 📋 可能的原因
+
+### 1. 数据库记录未保存
+- 视频文件下载成功,但数据库记录保存失败
+- 检查日志中是否有 "批量保存视频到数据库失败" 的错误
+
+### 2. 前端缓存问题
+- 浏览器缓存了旧的统计数据
+- 前端组件没有刷新数据
+
+### 3. 数据库查询问题
+- 统计查询没有正确读取数据
+
+## 🔧 排查步骤
+
+### 步骤1:检查数据库中的记录
+
+**方法一:通过前端页面**
+1. 访问 `http://localhost:8001`
+2. 进入「同步记录」页面
+3. 查看是否有视频记录显示
+4. 检查视频记录是否有 `videoSavePath` 字段
+
+**方法二:通过 Swagger API**
+1. 访问 `http://localhost:10101/swagger`
+2. 找到 `POST /api/video/paged`
+3. 输入参数:`{"pageIndex":1,"pageSize":10}`
+4. 执行查询,查看返回的数据
+
+**方法三:直接查询数据库**
+```bash
+cd /Users/gaotu/WebstormProjects/dysync.net
+sqlite3 db/dy.sqlite "SELECT COUNT(*) FROM dy_collect_video;"
+sqlite3 db/dy.sqlite "SELECT id, videoTitle, videoSavePath FROM dy_collect_video LIMIT 5;"
+```
+
+### 步骤2:检查日志
+
+查看最新的日志文件,搜索关键词:
+- "批量保存视频到数据库失败"
+- "本次共同步成功"
+- "下载成功"
+
+```bash
+# 查看最新日志
+tail -100 logs/log-debug-20251120.txt | grep -E "(下载成功|批量保存|同步成功)"
+```
+
+### 步骤3:检查前端数据刷新
+
+1. **清除浏览器缓存**
+ - 按 `F12` 打开开发者工具
+ - 右键点击刷新按钮
+ - 选择「清空缓存并硬性重新加载」
+
+2. **手动刷新数据看板**
+ - 进入「数据看板」页面
+ - 按 `F5` 刷新页面
+ - 或关闭页面重新打开
+
+3. **检查网络请求**
+ - 按 `F12` 打开开发者工具
+ - 切换到「Network」标签
+ - 刷新「数据看板」页面
+ - 查看 `/api/video/statics` 请求的响应数据
+
+## 🛠️ 解决方案
+
+### 方案1:强制刷新前端数据
+
+在前端代码中添加自动刷新功能,修改 `statics.vue`:
+
+```vue
+// 在 onMounted 中添加定时刷新
+onMounted(() => {
+ loadDashboardData();
+ // 每30秒自动刷新一次
+ const timer = setInterval(() => {
+ loadDashboardData();
+ }, 30000);
+ onUnmounted(() => {
+ clearInterval(timer);
+ });
+});
+```
+
+### 方案2:检查数据库保存逻辑
+
+如果日志显示 "批量保存视频到数据库失败",需要检查:
+1. 数据库连接是否正常
+2. 视频记录是否有重复(AwemeId 冲突)
+3. 字段是否有空值或格式错误
+
+### 方案3:手动触发数据刷新
+
+在前端「数据看板」页面添加刷新按钮:
+
+```vue
+刷新数据
+```
+
+## 📝 快速检查清单
+
+- [ ] 数据库中是否有视频记录?
+- [ ] 视频记录是否有 `videoSavePath` 字段?
+- [ ] 视频文件是否实际存在?
+- [ ] 日志中是否有保存失败的错误?
+- [ ] 前端是否缓存了旧数据?
+- [ ] API 返回的数据是否正确?
+
+## 🎯 立即操作
+
+1. **刷新浏览器页面**(清除缓存)
+2. **检查「同步记录」页面**,看是否有视频记录
+3. **查看浏览器控制台**(F12),检查是否有错误
+4. **查看网络请求**,确认 API 返回的数据
+
+如果「同步记录」页面有数据,但「数据看板」没有更新,那就是前端缓存问题,需要强制刷新。
+
+如果「同步记录」页面也没有数据,那就是数据库保存问题,需要检查日志。
+
diff --git a/docs/本地启动指南.md b/docs/本地启动指南.md
new file mode 100644
index 0000000..69cc6c9
--- /dev/null
+++ b/docs/本地启动指南.md
@@ -0,0 +1,224 @@
+# dysync.net 本地启动指南
+
+## 📋 前置要求
+
+### 1. 安装 .NET 6.0 SDK
+
+**macOS 安装方式:**
+
+```bash
+# 方式一:使用 Homebrew(推荐)
+brew install --cask dotnet-sdk
+
+# 方式二:手动下载安装
+# 访问 https://dotnet.microsoft.com/download/dotnet/6.0
+# 下载 macOS 版本的 .NET 6.0 SDK 并安装
+```
+
+**验证安装:**
+```bash
+dotnet --version
+# 应该显示类似:6.0.xxx
+```
+
+### 2. 安装 Node.js(已安装 ✅)
+
+您已安装 Node.js v24.1.0,满足要求。
+
+**推荐使用 pnpm(项目使用 pnpm-lock.yaml):**
+```bash
+npm install -g pnpm
+```
+
+---
+
+## 🚀 启动步骤
+
+### 第一步:安装前端依赖
+
+```bash
+cd app
+pnpm install
+# 或者使用 yarn
+# yarn install
+```
+
+### 第二步:启动后端服务
+
+**打开第一个终端窗口:**
+
+```bash
+# 回到项目根目录
+cd /Users/gaotu/WebstormProjects/dysync.net
+
+# 还原 NuGet 包(首次运行)
+dotnet restore
+
+# 启动后端服务(开发模式)
+dotnet run
+
+# 或者指定端口(如果需要)
+dotnet run --urls "http://localhost:10101"
+```
+
+**后端启动成功后:**
+- ✅ 后端 API 运行在:`http://localhost:10101`
+- ✅ Swagger 文档:`http://localhost:10101/swagger`
+- ✅ 数据库会自动创建在:`db/dy.sqlite`
+- ✅ 日志文件会生成在:`logs/` 目录
+
+### 第三步:启动前端开发服务器
+
+**打开第二个终端窗口:**
+
+```bash
+cd app
+
+# 启动前端开发服务器
+pnpm dev
+# 或者
+yarn dev
+```
+
+**前端启动成功后:**
+- ✅ 前端运行在:`http://localhost:8001`
+- ✅ 会自动代理 `/api` 请求到后端 `http://localhost:10101`
+
+---
+
+## 🔑 首次登录
+
+1. 访问:`http://localhost:8001`
+2. 默认账号:`douyin`
+3. 默认密码:`douyin2025`
+
+> ⚠️ **安全提示**:登录后请立即修改密码!
+
+---
+
+## 📁 目录结构说明
+
+```
+dysync.net/
+├── db/ # SQLite 数据库目录(自动创建)
+│ └── dy.sqlite # 数据库文件
+├── logs/ # 日志文件目录(自动创建)
+│ ├── log-debug-*.txt # 调试日志
+│ └── log-error-*.txt # 错误日志
+├── app/ # 前端项目
+│ ├── dist/ # 前端构建产物(生产环境)
+│ └── src/ # 前端源码
+└── appsettings.json # 后端配置文件
+```
+
+---
+
+## ⚙️ 配置说明
+
+### 后端配置 (`appsettings.json`)
+
+```json
+{
+ "dbconn": "", // SQLite 无需配置,自动创建
+ "dbtype": "Sqlite" // 数据库类型
+}
+```
+
+### 前端配置 (`app/.env.development`)
+
+```env
+VITE_API_URL=http://localhost:10101
+```
+
+---
+
+## 🐛 常见问题排查
+
+### 1. 后端启动失败
+
+**问题:端口被占用**
+```bash
+# macOS 查看端口占用
+lsof -i :10101
+
+# 杀死占用进程
+kill -9
+```
+
+**问题:数据库权限错误**
+```bash
+# 确保 db 目录有写权限
+chmod 755 db
+```
+
+### 2. 前端启动失败
+
+**问题:依赖安装失败**
+```bash
+# 清除缓存重新安装
+rm -rf node_modules pnpm-lock.yaml
+pnpm install
+```
+
+**问题:API 请求失败(404)**
+- 检查后端是否已启动
+- 检查 `.env.development` 中的 `VITE_API_URL` 是否正确
+- 检查浏览器控制台是否有 CORS 错误
+
+### 3. 数据库相关
+
+**数据库位置:**
+- 开发环境:`项目根目录/db/dy.sqlite`
+- 数据库会在首次启动时自动创建
+
+**重置数据库:**
+```bash
+# 删除数据库文件(会丢失所有数据)
+rm -rf db/dy.sqlite
+
+# 重新启动后端,会自动创建新数据库
+```
+
+---
+
+## 🎯 开发模式说明
+
+### 开发环境特性
+
+1. **热重载**:前端代码修改后自动刷新
+2. **Swagger 文档**:`http://localhost:10101/swagger`
+3. **详细日志**:所有日志输出到 `logs/` 目录
+4. **数据库自动迁移**:模型变更后自动更新表结构
+
+### 生产环境构建
+
+**前端构建:**
+```bash
+cd app
+pnpm build
+# 构建产物在 app/dist/ 目录
+```
+
+**后端发布:**
+```bash
+dotnet publish -c Release -o ./publish
+```
+
+---
+
+## 📝 下一步操作
+
+1. ✅ 启动后端和前端服务
+2. 🔐 使用默认账号登录
+3. 🍪 在「抖音授权」页面配置 Cookie 和 sec_user_id
+4. ⚙️ 在「系统配置」页面设置同步参数
+5. 🎬 开始同步视频!
+
+---
+
+## 💡 提示
+
+- **开发时建议**:保持两个终端窗口同时运行(后端 + 前端)
+- **调试技巧**:查看 `logs/` 目录下的日志文件排查问题
+- **API 测试**:使用 Swagger 文档测试接口功能
+
diff --git a/docs/构建问题排查.md b/docs/构建问题排查.md
new file mode 100644
index 0000000..9d5e303
--- /dev/null
+++ b/docs/构建问题排查.md
@@ -0,0 +1,79 @@
+# Docker 构建问题排查
+
+## 问题:网络超时无法拉取镜像
+
+### 解决方案
+
+1. **已配置镜像加速器** ✅
+ - 已添加国内镜像源到 `~/.docker/daemon.json`
+ - 镜像源包括:中科大、网易、百度云
+
+2. **重启 Docker Desktop**
+ - 点击状态栏的 Docker 图标
+ - 选择 "Quit Docker Desktop"
+ - 重新启动 Docker Desktop
+ - 等待 Docker 完全启动(状态栏图标不再闪烁)
+
+3. **验证镜像加速器是否生效**
+
+```bash
+docker info | grep -A 10 "Registry Mirrors"
+```
+
+应该看到配置的镜像源列表。
+
+4. **重新构建镜像**
+
+```bash
+cd /Users/gaotu/WebstormProjects/dysync.net
+docker build -f Dockerfile.prod -t dysync.net:latest .
+```
+
+### 如果仍然失败
+
+**方案 A:使用代理(如果有)**
+
+在 Docker Desktop 中配置代理:
+- Settings → Resources → Proxies
+- 配置 HTTP/HTTPS 代理
+
+**方案 B:手动拉取镜像**
+
+```bash
+# 手动拉取所需的基础镜像
+docker pull node:18-alpine
+docker pull mcr.microsoft.com/dotnet/sdk:6.0
+docker pull mcr.microsoft.com/dotnet/aspnet:6.0
+
+# 然后再构建
+docker build -f Dockerfile.prod -t dysync.net:latest .
+```
+
+**方案 C:使用阿里云镜像(推荐)**
+
+如果你有阿里云账号,可以配置阿里云容器镜像服务的加速器:
+
+1. 登录阿里云容器镜像服务:https://cr.console.aliyun.com/
+2. 获取你的专属加速地址(格式:`https://xxxxx.mirror.aliyuncs.com`)
+3. 更新 `~/.docker/daemon.json`:
+
+```json
+{
+ "registry-mirrors": [
+ "https://你的专属地址.mirror.aliyuncs.com"
+ ]
+}
+```
+
+4. 重启 Docker Desktop
+
+### 检查网络连接
+
+```bash
+# 测试 Docker Hub 连接
+curl -I https://registry-1.docker.io/v2/
+
+# 测试镜像源连接
+curl -I https://docker.mirrors.ustc.edu.cn/v2/
+```
+
diff --git a/docs/网络问题解决方案.md b/docs/网络问题解决方案.md
new file mode 100644
index 0000000..25ef9f2
--- /dev/null
+++ b/docs/网络问题解决方案.md
@@ -0,0 +1,164 @@
+# Docker 构建网络问题解决方案
+
+## 问题分析
+
+**错误信息**:
+```
+dial tcp: lookup docker.mirrors.ustc.edu.cn: no such host
+```
+
+**原因**:
+- DNS 无法解析中科大镜像源地址
+- Docker Desktop 仍在使用旧的镜像源配置
+- 网络环境可能有限制
+
+## 解决方案
+
+### 方案一:重启 Docker Desktop(推荐先试这个)
+
+1. **完全退出 Docker Desktop**
+ - 点击状态栏 Docker 图标
+ - 选择 "Quit Docker Desktop"
+ - 等待完全退出
+
+2. **重新启动 Docker Desktop**
+ - 从 Applications 启动 Docker Desktop
+ - 等待完全启动(状态栏图标不再闪烁)
+
+3. **验证新配置是否生效**
+ ```bash
+ docker info | grep -A 10 "Registry Mirrors"
+ ```
+ 应该看到新的镜像源(阿里云、七牛云等)
+
+4. **重新构建**
+ ```bash
+ cd /Users/gaotu/WebstormProjects/dysync.net
+ docker build -f Dockerfile.prod -t dysync.net:latest .
+ ```
+
+### 方案二:配置 Docker Desktop 代理(如果有代理)
+
+如果你有可用的 HTTP/HTTPS 代理:
+
+1. **打开 Docker Desktop 设置**
+ - 点击状态栏 Docker 图标 → Settings
+
+2. **配置代理**
+ - 进入 "Resources" → "Proxies"
+ - 启用 "Manual proxy configuration"
+ - 填写代理地址和端口
+ - 点击 "Apply & Restart"
+
+3. **重新构建**
+
+### 方案三:使用阿里云容器镜像服务(推荐)
+
+如果你有阿里云账号:
+
+1. **登录阿里云容器镜像服务**
+ - 访问:https://cr.console.aliyun.com/
+ - 登录你的阿里云账号
+
+2. **获取专属加速地址**
+ - 进入 "镜像加速器" 页面
+ - 复制你的专属加速地址(格式:`https://xxxxx.mirror.aliyuncs.com`)
+
+3. **更新 Docker 配置**
+ ```bash
+ cat > ~/.docker/daemon.json << EOF
+ {
+ "builder": {
+ "gc": {
+ "defaultKeepStorage": "20GB",
+ "enabled": true
+ }
+ },
+ "experimental": false,
+ "registry-mirrors": [
+ "https://你的专属地址.mirror.aliyuncs.com"
+ ]
+ }
+ EOF
+ ```
+
+4. **重启 Docker Desktop**
+
+5. **重新构建**
+
+### 方案四:手动拉取镜像后构建
+
+如果镜像加速器配置正确,可以尝试手动拉取:
+
+```bash
+# 手动拉取所需的基础镜像
+docker pull node:18-alpine
+docker pull mcr.microsoft.com/dotnet/sdk:6.0
+docker pull mcr.microsoft.com/dotnet/aspnet:6.0
+
+# 如果拉取成功,再构建
+docker build -f Dockerfile.prod -t dysync.net:latest .
+```
+
+### 方案五:使用 VPN 或科学上网工具
+
+如果你有 VPN 或科学上网工具:
+
+1. **启动 VPN/科学上网工具**
+2. **配置系统代理**
+3. **在 Docker Desktop 中配置代理**(参考方案二)
+4. **重新构建**
+
+### 方案六:修改 DNS 设置
+
+如果 DNS 解析有问题,可以尝试:
+
+1. **修改系统 DNS**
+ - 系统设置 → 网络 → 高级 → DNS
+ - 添加 DNS 服务器:`223.5.5.5`(阿里云)、`114.114.114.114`(114 DNS)
+
+2. **刷新 DNS 缓存**
+ ```bash
+ sudo dscacheutil -flushcache
+ sudo killall -HUP mDNSResponder
+ ```
+
+3. **重启 Docker Desktop**
+
+## 当前配置状态
+
+已更新的镜像源配置(`~/.docker/daemon.json`):
+```json
+{
+ "registry-mirrors": [
+ "https://registry.cn-hangzhou.aliyuncs.com",
+ "https://dockerhub.azk8s.cn",
+ "https://reg-mirror.qiniu.com"
+ ]
+}
+```
+
+**注意**:需要重启 Docker Desktop 才能生效!
+
+## 推荐操作顺序
+
+1. ✅ **先试方案一**:重启 Docker Desktop
+2. 如果还不行,**试方案三**:配置阿里云专属加速器
+3. 如果还不行,**试方案二**:配置代理
+4. 最后考虑**方案五**:使用 VPN
+
+## 验证步骤
+
+每次尝试后,运行以下命令验证:
+
+```bash
+# 1. 检查镜像源配置
+docker info | grep -A 10 "Registry Mirrors"
+
+# 2. 测试拉取镜像
+docker pull node:18-alpine
+
+# 3. 如果拉取成功,开始构建
+docker build -f Dockerfile.prod -t dysync.net:latest .
+```
+
diff --git a/docs/视频预览功能测试指南.md b/docs/视频预览功能测试指南.md
new file mode 100644
index 0000000..3051764
--- /dev/null
+++ b/docs/视频预览功能测试指南.md
@@ -0,0 +1,202 @@
+# 视频预览功能测试指南
+
+## ✅ 功能已实现
+
+- ✅ 后端视频流接口(支持 Range 请求)
+- ✅ 后端 Cookie 认证支持
+- ✅ 前端视频播放器组件
+- ✅ 表格预览按钮
+
+## 🧪 测试步骤
+
+### 步骤1:确保已登录
+
+1. 访问 `http://localhost:8001`
+2. 如果未登录,使用以下账号登录:
+ - 用户名:`douyin`
+ - 密码:`douyin2025`
+
+### 步骤2:进入同步记录页面
+
+1. 点击左侧菜单「同步记录」
+2. 或直接访问:`http://localhost:8001/workplace`
+
+### 步骤3:查找有视频的记录
+
+在视频列表中:
+- 找到有 `videoSavePath` 字段的记录
+- 「预览」按钮应该是可点击的(不是灰色)
+- 如果按钮是灰色的,说明该记录没有视频文件
+
+### 步骤4:点击预览按钮
+
+1. 点击视频行右侧「操作」列的「预览」按钮
+2. 视频播放器模态框应该会打开
+
+### 步骤5:测试播放功能
+
+在视频播放器中测试:
+- ✅ **播放/暂停**:点击播放按钮
+- ✅ **音量控制**:调整音量滑块
+- ✅ **进度条拖拽**:拖动进度条到任意位置(测试 Range 请求)
+- ✅ **全屏播放**:点击全屏按钮
+- ✅ **视频信息显示**:检查作者、分类、分辨率、文件大小是否正确显示
+
+## 🔍 验证检查清单
+
+### 前端检查
+
+- [ ] 「预览」按钮可见且可点击
+- [ ] 点击后模态框正常打开
+- [ ] 视频信息正确显示
+- [ ] 视频可以正常播放
+- [ ] 进度条可以拖拽(Range 请求)
+- [ ] 全屏功能正常
+
+### 后端检查
+
+- [ ] 视频流接口返回 200 状态码
+- [ ] 支持 Range 请求(206 状态码)
+- [ ] Cookie 认证正常工作
+- [ ] 视频文件可以正常读取
+
+## 🐛 常见问题排查
+
+### 问题1:预览按钮是灰色的
+
+**原因**:该视频记录没有 `videoSavePath` 字段
+
+**解决方法**:
+- 检查数据库中该视频是否有 `videoSavePath`
+- 确认视频文件是否已下载
+
+### 问题2:点击预览后没有反应
+
+**检查**:
+1. 打开浏览器控制台(F12)
+2. 查看 Console 标签是否有错误
+3. 查看 Network 标签,检查 `/api/video/stream/{id}` 请求
+4. 查看请求状态码:
+ - `200`:成功
+ - `401`:未授权(需要重新登录)
+ - `404`:视频不存在
+ - `500`:服务器错误
+
+### 问题3:视频无法播放
+
+**可能原因**:
+1. **401 未授权**:
+ - 检查是否已登录
+ - 检查 Cookie 中是否有 token
+ - 重新登录
+
+2. **404 视频不存在**:
+ - 检查视频文件是否实际存在
+ - 检查 `videoSavePath` 路径是否正确
+
+3. **视频格式不支持**:
+ - 检查浏览器是否支持该视频格式
+ - 尝试使用其他浏览器
+
+4. **网络问题**:
+ - 检查后端服务是否正常运行
+ - 检查网络连接
+
+### 问题4:视频加载很慢
+
+**原因**:大文件需要时间加载
+
+**解决方法**:
+- 等待加载完成
+- 检查网络速度
+- 查看浏览器 Network 标签,确认下载速度
+
+### 问题5:Range 请求不工作(无法拖拽)
+
+**检查**:
+1. 打开浏览器 Network 标签
+2. 拖动视频进度条
+3. 查看是否有新的请求,状态码应该是 `206`
+4. 检查响应头是否有 `Content-Range` 字段
+
+## 🔧 调试技巧
+
+### 1. 浏览器控制台调试
+
+```javascript
+// 在浏览器控制台执行,检查 token
+document.cookie
+
+// 检查视频 URL
+// 打开视频播放器后,在控制台执行:
+document.querySelector('video').src
+```
+
+### 2. 网络请求检查
+
+1. 按 `F12` 打开开发者工具
+2. 切换到「Network」标签
+3. 点击「预览」按钮
+4. 查看 `/api/video/stream/{id}` 请求:
+ - **Request Headers**:检查是否有 Cookie
+ - **Response Headers**:检查 `Accept-Ranges: bytes`
+ - **Status Code**:应该是 200 或 206
+
+### 3. 后端日志检查
+
+查看后端日志文件:
+```bash
+tail -f logs/log-debug-20251120.txt | grep -E "(video|stream|401|404)"
+```
+
+## 📝 测试记录模板
+
+```
+测试日期:____
+测试浏览器:____
+测试视频ID:____
+测试结果:
+- [ ] 预览按钮可见
+- [ ] 模态框正常打开
+- [ ] 视频信息显示正确
+- [ ] 视频可以播放
+- [ ] 进度条可以拖拽
+- [ ] 全屏功能正常
+- [ ] Range 请求正常(206状态码)
+
+问题记录:
+1.
+2.
+```
+
+## 🎯 快速测试命令
+
+### 测试 API(需要先登录获取 token)
+
+```bash
+# 1. 登录获取 token(通过浏览器登录后,从 Cookie 中获取)
+# 2. 测试视频流接口
+curl -H "Cookie: Authorization=Bearer YOUR_TOKEN" \
+ http://localhost:10101/api/video/stream/VIDEO_ID \
+ --output test_video.mp4
+
+# 3. 测试 Range 请求
+curl -H "Cookie: Authorization=Bearer YOUR_TOKEN" \
+ -H "Range: bytes=0-1023" \
+ http://localhost:10101/api/video/stream/VIDEO_ID \
+ -v
+```
+
+## ✅ 预期结果
+
+1. **点击预览按钮** → 模态框打开
+2. **视频加载** → 显示加载动画,然后显示视频
+3. **点击播放** → 视频开始播放
+4. **拖动进度条** → 视频跳转到对应位置(Range 请求)
+5. **全屏播放** → 视频全屏显示
+6. **关闭模态框** → 视频停止播放,模态框关闭
+
+---
+
+**提示**:如果遇到问题,请按照上述排查步骤逐一检查,并查看浏览器控制台和网络请求的详细信息。
+
diff --git a/docs/视频预览功能说明.md b/docs/视频预览功能说明.md
new file mode 100644
index 0000000..bc06b54
--- /dev/null
+++ b/docs/视频预览功能说明.md
@@ -0,0 +1,209 @@
+# 视频预览功能实现说明
+
+## 📋 功能概述
+
+已成功实现内置视频预览功能,用户可以在同步记录页面直接预览已下载的视频,无需下载到本地。
+
+## ✨ 实现的功能
+
+### 1. 后端 API 接口
+
+#### 视频流接口
+- **路径**: `GET /api/video/stream/{id}`
+- **功能**: 提供视频文件流式传输,支持 HTTP Range 请求
+- **特性**:
+ - ✅ 支持视频拖拽播放(Range 请求)
+ - ✅ 流式传输,不占用大量内存
+ - ✅ 自动识别视频格式(MP4、WebM、MOV 等)
+ - ✅ JWT 认证保护
+
+#### 视频封面接口
+- **路径**: `GET /api/video/cover/{id}`
+- **功能**: 获取视频封面图片
+- **特性**:
+ - ✅ 优先使用本地保存的封面
+ - ✅ 支持 JPG 格式
+
+### 2. 前端组件
+
+#### VideoPlayer 组件
+- **位置**: `app/src/components/video/VideoPlayer.vue`
+- **功能**: 视频播放器模态框组件
+- **特性**:
+ - ✅ 使用 HTML5 `