# PullAll **Repository Path**: chenkewen/pull-all ## Basic Information - **Project Name**: PullAll - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-20 - **Last Updated**: 2025-12-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PullAll - 全网视频拉取 Web 后台系统 > 支持抖音、小红书等多平台视频解析下载,自动去水印,内置实时聊天室与 AI 智能助手       --- ## 📸 项目截图 --- ## ✨ 功能特性 ### 🎬 视频解析下载 - ✅ **多平台支持**:抖音、小红书等热门平台 - ✅ **自动去水印**:智能解析无水印视频链接 - ✅ **实时进度显示**:WebSocket 实时推送下载进度 - ✅ **在线播放**:弹窗播放视频,无需下载 - ✅ **下载历史管理**:分页查看、删除、重新下载 ### 💬 实时聊天室 - ✅ **群聊 & 私聊**:支持公共聊天室和一对一私聊 - ✅ **在线用户列表**:实时显示在线用户,Redis 分布式存储 - ✅ **消息撤回**:支持撤回已发送的消息(实时同步) - ✅ **表情发送**:丰富的 Emoji 表情选择 - ✅ **图片消息**:支持发送图片(Base64 编码) - ✅ **未读提醒**:私聊未读消息气泡提示 - ✅ **可拖拽窗口**:聊天窗口支持拖拽、缩放 ### 🎬 同步看 (Watch Together) - ✅ **视频共享**:在群聊中发起视频共享邀请 - ✅ **多人同步**:观众自动同步房主的播放进度 - ✅ **实时弹幕**:WebSocket 实时弹幕互动 - ✅ **播控同步**:房主控制播放/暂停/跳转,观众自动同步 - ✅ **观看人数**:实时显示当前观看人数 - ✅ **邀请卡片**:群聊消息中显示可点击的邀请卡片 ### 🤖 AI 智能助手 - ✅ **双模型支持**:同时集成 Gemini AI 和 千问 AI - ✅ **多会话管理**:独立会话列表,随时切换上下文 - ✅ **OCR 图片识别**:千问 VL-OCR 模型支持图片文字识别 - ✅ **流式响应**:SSE 实时流式输出,体验流畅 - ✅ **Markdown 渲染**:支持代码高亮、表格等富文本显示 - ✅ **历史记录**:对话历史持久化存储 ### 🔐 系统特性 - ✅ **JWT 认证**:Sa-Token + JWT 无状态认证 - ✅ **分布式锁**:Redisson 分布式锁支持 - ✅ **Redis 缓存**:在线用户、会话信息 Redis 存储 - ✅ **Redis Pub/Sub**:跨实例消息同步 - ✅ **API 文档**:Knife4j 在线 API 文档 - ✅ **现代 UI**:暗色主题 + 毛玻璃效果 ## 📦 技术栈 | 层级 | 技术 | 版本 | |------|------|------| | **后端框架** | Spring Boot | 2.7.18 | | **ORM** | MyBatis-Plus | 3.5.2 | | **认证** | Sa-Token + JWT | 1.44.0 | | **分布式锁** | Redisson | 4.0.0 | | **缓存** | Redis + Lettuce | - | | **WebSocket** | STOMP + SockJS | - | | **API 文档** | Knife4j | 4.1.0 | | **前端框架** | Vue 3 + TypeScript | 3.x | | **构建工具** | Vite | 5.x | | **UI 组件** | Element Plus | - | | **状态管理** | Pinia | - | ## 🛠️ 快速开始 ### 环境要求 - JDK 1.8+ - Maven 3.6+ - Node.js 16+ - MySQL 8.0+ - Redis 6.0+ ### 1. 克隆项目 ```bash git clone https://github.com/your-username/pull-all.git cd pull-all ``` ### 2. 初始化数据库 ```bash mysql -u root -p < sql/init.sql ``` ### 3. 修改配置 编辑 `pull-all-app/src/main/resources/application.yml`: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/pull_all username: root password: your_password redis: host: localhost port: 6379 password: your_redis_password # 如果有 ``` ### 4. 启动后端 ```bash mvn clean install cd pull-all-app mvn spring-boot:run ``` 后端 API 文档:http://localhost:8080/doc.html ### 5. 启动前端 ```bash cd pull-all-web npm install npm run dev ``` 前端访问地址:http://localhost:3000 ## 📁 项目结构 ``` pull-all/ ├── pom.xml # 父 POM ├── pull-all-common/ # 公共模块 │ └── src/main/java/ │ ├── config/ # 全局配置 │ ├── exception/ # 异常处理 │ └── response/ # 统一响应 ├── pull-all-system/ # 业务模块 │ └── src/main/java/ │ ├── config/ # Redisson/WebSocket 配置 │ ├── controller/ # REST 控制器 │ ├── dto/ # 数据传输对象 │ ├── entity/ # 实体类 │ ├── mapper/ # MyBatis Mapper │ ├── service/ # 业务服务 │ └── util/ # 工具类 (RedisUtil, RedissonUtil) ├── pull-all-app/ # 启动模块 │ └── src/main/resources/ │ └── application.yml # 应用配置 ├── pull-all-web/ # 前端项目 (Vue 3) │ └── src/ │ ├── api/ # API 封装 │ ├── components/ # 组件 │ │ ├── ChatDrawer.vue # 聊天窗口 (群聊/私聊/AI) │ │ ├── WatchTogetherPlayer.vue # 同步看播放器 │ │ ├── WatchInviteDialog.vue # 同步看邀请弹窗 │ │ └── DanmakuLayer.vue # 弹幕层组件 │ ├── stores/ # Pinia 状态管理 │ ├── utils/ # 工具类 (websocket.ts) │ └── views/ # 页面 └── sql/ # 数据库脚本 ``` ## 🔗 API 接口 ### 视频相关 | 接口 | 方法 | 说明 | |------|------|------| | `/api/video/parse` | POST | 解析视频链接 | | `/api/video/download/{taskId}` | POST | 下载视频 | | `/api/video/progress/{taskId}` | GET | 获取下载进度 | | `/api/video/list` | GET | 获取任务列表 | | `/api/video/proxy/{taskId}` | GET | 代理播放/下载视频 | ### 认证相关 | 接口 | 方法 | 说明 | |------|------|------| | `/api/auth/login` | POST | 用户登录 | | `/api/auth/register` | POST | 用户注册 | | `/api/auth/logout` | POST | 退出登录 | | `/api/auth/info` | GET | 获取用户信息 | ### 聊天相关 | 接口 | 方法 | 说明 | |------|------|------| | `/api/chat/room/list` | GET | 获取聊天室列表 | | `/api/chat/messages` | GET | 获取聊天记录 | | `/api/chat/private/messages` | GET | 获取私聊消息 | | `/api/chat/withdraw/{messageId}` | POST | 撤回消息 | | `/ws/chat` | WebSocket | 聊天 WebSocket 端点 | ### 同步看 (Watch Together) | 接口 | 方法 | 说明 | |------|------|------| | `/api/watch/{roomId}/session` | GET | 获取当前房间观影会话 | | `/app/watch.start` | WebSocket | 发起视频共享邀请 | | `/app/watch.join` | WebSocket | 加入观影 | | `/app/watch.leave` | WebSocket | 离开观影 | | `/app/watch.control` | WebSocket | 播放控制(播放/暂停/跳转) | | `/app/watch.sync` | WebSocket | 请求同步进度 | | `/app/watch.danmaku` | WebSocket | 发送弹幕 | | `/app/watch.end` | WebSocket | 结束共享 | ### AI 智能助手 | 接口 | 方法 | 说明 | |------|------|------| | `/api/gemini/chat` | POST | Gemini AI 对话 (SSE 流式) | | `/api/gemini/sessions` | GET | 获取 Gemini 会话列表 | | `/api/gemini/sessions` | POST | 创建 Gemini 新会话 | | `/api/gemini/history/{sessionId}` | GET | 获取 Gemini 对话历史 | | `/api/qwen/chat` | POST | 千问 AI 对话 (SSE 流式) | | `/api/qwen/ocr` | POST | 千问 OCR 图片识别 | | `/api/qwen/sessions` | GET | 获取千问会话列表 | | `/api/qwen/history/{sessionId}` | GET | 获取千问对话历史 | --- ## 🗄️ 数据库表结构 | 表名 | 说明 | |------|------| | `sys_user` | 用户表 | | `video_task` | 视频下载任务表 | | `chat_room` | 聊天室/会话表 | | `chat_message` | 聊天消息表 | | `gemini_chat_session` | Gemini AI 会话表 | | `gemini_chat_history` | Gemini AI 对话历史表 | | `qwen_chat_session` | 千问 AI 会话表 | | `qwen_chat_history` | 千问 AI 对话历史表 | --- ## 🔧 配置说明 ### AI 配置 ```yaml # Gemini AI 配置 gemini: api-key: your-gemini-api-key model: gemini-2.5-flash proxy: enabled: false # 国内需要开启代理 host: 127.0.0.1 port: 7897 timeout: 60000 # 千问 AI 配置 qwen: api-key: your-qwen-api-key chat-model: qwen-plus # 普通聊天用 ocr-model: qwen-vl-ocr # OCR识别用 timeout: 120000 ``` --- ## 🤝 贡献指南 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 发起 Pull Request --- ## ⚠️ 免责声明 本项目仅供个人学习研究使用,请勿用于商业用途。下载他人视频时请尊重原创作者的版权,在法律允许的范围内使用。 ## 📄 License [MIT License](LICENSE) ---
Made with ❤️ by PullAll Team