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 `