# mp_video **Repository Path**: yong-top/mp_video ## Basic Information - **Project Name**: mp_video - **Description**: 一个基于微信原生小程序、Node/Express 代理服务、MySQL 后台管理的 AI 视频创作系统。 小程序负责创作、历史、发布、积分和卡密兑换;后端负责隐藏第三方密钥、调用 AIVideoMaker、保存任务与积分数据、代理媒体文件、处理社媒发布;后台管理系统用于运营用户、任务、积分、卡密、媒体和发布记录。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-15 - **Last Updated**: 2026-06-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AIVideoMaker 微信小程序 一个基于微信原生小程序、Node/Express 代理服务、MySQL 后台管理的 AI 视频创作系统。 小程序负责创作、历史、发布、积分和卡密兑换;后端负责隐藏第三方密钥、调用 AIVideoMaker、保存任务与积分数据、代理媒体文件、处理社媒发布;后台管理系统用于运营用户、任务、积分、卡密、媒体和发布记录。 ## 功能概览 - AI 视频创作:文生视频、图生视频、长视频、进阶模型动态表单。 - 任务闭环:创建任务、状态轮询、任务详情、取消任务、播放结果、历史记录。 - 账号体系:微信登录、手机号登录入口预留、开发模式登录、登录态过期自动处理。 - 用户隔离:任务、积分、发布记录、卡密兑换均按登录用户隔离。 - 积分系统:新账号初始积分、每日签到、生成扣减、失败/取消退款、后台人工调整。 - 卡密兑换:后台批量生成积分卡密,小程序输入卡密兑换积分,支持导出和禁用。 - 媒体代理:输入图片保存代理副本,视频完成后下载到本地代理地址。 - 社媒发布:保存视频到相册、复制平台文案、展示手动发布指引,并支持本地生成发布海报。 - 后台管理:工作台、用户、任务、媒体、积分、卡密、发布、抖音账号、日志、系统状态。 ## 技术栈 - 小程序:微信原生小程序。 - 后端:Node.js、Express。 - 数据库:MySQL,服务启动时自动建库建表。 - 后台:原生 HTML/CSS/JavaScript,静态文件位于 `admin/`。 - 第三方服务:AIVideoMaker、DeepSeek、微信小程序 API、抖音开放平台。 ## 目录结构 ```text mp_video/ admin/ 后台管理系统静态文件 data/ media/ 本地媒体代理文件,开发环境使用 miniprogram/ 微信小程序源码 server/ index.js Express 后端入口 schema.mysql.sql MySQL 建表脚本,含中文字段说明 .example.env 环境变量模板 .env 本地配置,禁止提交真实密钥 package.json 后端依赖和脚本 project.config.json 微信开发者工具项目配置 ``` ## 环境要求 - Node.js 18 或更高版本。 - MySQL 5.7+ 或 MySQL 8.x。 - 微信开发者工具。 - 可选:已申请 AIVideoMaker API Key、DeepSeek API Key、抖音开放平台应用。 ## 配置说明 复制 `.example.env` 为 `.env`,并按需填写: ```env [ADMIN] USERNAME=admin PASSWORD=请改成强密码 SESSION_TTL_SECONDS=28800 SESSION_SECRET=请填写随机长字符串 WECHAT_APPID=你的小程序 AppID WECHAT_SECRET=你的小程序 AppSecret [MYSQL] HOST=127.0.0.1 PORT=3306 USER=root PASSWORD=你的 MySQL 密码 DATABASE=mp_video CONNECTION_LIMIT=10 [AI_VIDEO_MAKER] API_URL=https://aivideomaker.ai API_KEY=你的 AIVideoMaker API Key [DEEPSEEK] API_URL=https://api.deepseek.com API_KEY=你的 DeepSeek API Key [DOUYIN] CLIENT_KEY=你的抖音开放平台 Client Key CLIENT_SECRET=你的抖音开放平台 Client Secret REDIRECT_URI=https://你的后端域名/api/social/douyin/callback SCOPES=video.create.bind,user_info OPEN_API_BASE=https://open.douyin.com ``` 说明: - `SESSION_SECRET` 用于登录态签名和敏感数据加密,上线后不要更换,否则已加密 token、卡密等可能无法解密。 - `WECHAT_APPID` 和 `WECHAT_SECRET` 配置后,登录会调用微信 `code2session`。 - 未配置微信参数且非生产环境时,后端允许开发模式登录。 - 生产环境建议设置 `NODE_ENV=production`,并关闭开发模式登录。 - 抖音自动发布要求后端回调域名为 HTTPS,并在抖音开放平台配置同一个 `REDIRECT_URI`。 ## 安装与启动 安装依赖: ```bash npm install ``` 启动后端: ```bash npm run server ``` 或: ```bash npm start ``` 语法检查: ```bash npm run check ``` 默认监听: ```text http://127.0.0.1:3000 http://局域网IP:3000 ``` 健康检查: ```text GET /api/health ``` 后台管理: ```text http://127.0.0.1:3000/admin ``` 首次启动时如果没有 `data/install.lock`,后端会进入安装模式。此时访问后台管理地址会显示安装向导,用于配置 MySQL、管理员账号、AIVideoMaker API Key,以及可选的微信、DeepSeek、抖音参数。 安装向导完成后会: - 写入 `.env`,并自动备份旧 `.env`。 - 创建数据库和所需表。 - 创建后台管理员账号。 - 写入 `data/install.lock` 锁定安装状态。 如果部署环境设置了 `INSTALL_TOKEN`,安装接口要求请求头 `X-Install-Token`,后台安装页会显示安装令牌输入框。需要重新安装时,先备份数据,再删除 `data/install.lock`。 ## MySQL 数据表 完整 SQL 位于: ```text server/schema.mysql.sql ``` 核心表: - `users`:小程序用户登录信息。 - `user_tasks`:视频生成任务。 - `media_records`:本地媒体代理索引。 - `publish_records`:社媒发布记录。 - `social_accounts`:抖音等社媒授权账号。 - `social_oauth_states`:OAuth 临时 state。 - `publish_attempts`:自动发布调用日志。 - `credit_accounts`:积分账户。 - `credit_ledger`:积分流水。 - `credit_redeem_batches`:卡密批次。 - `credit_redeem_cards`:卡密记录。 - `admin_users`:后台管理员。 - `admin_audit_logs`:后台操作审计。 - `system_settings`:系统设置。 安装完成后的服务启动会自动执行建表和补字段逻辑;也可以手动执行 `server/schema.mysql.sql` 初始化。 ## 小程序使用 1. 使用微信开发者工具导入项目根目录。 2. `project.config.json` 已设置 `miniprogramRoot` 为 `miniprogram/`。 3. 开发环境可关闭 URL 校验;真机预览或上线前需要把后端域名加入微信小程序 request 合法域名。 4. 手机扫码预览时,手机和电脑需要在同一局域网,并允许防火墙放行 3000 端口。 5. 如果电脑局域网 IP 变化,可在小程序“设置”页修改代理地址。 小程序页面: - `创作`:选择模型、填写提示词、上传参考图、提交生成。 - `历史`:查看当前账号的视频生成任务。 - `发布`:查看发布记录,进入发布编辑。 - `设置`:账号、积分、签到、代理状态、社媒入口、系统信息。 - `登录`:微信登录、开发模式登录。 - `任务详情`:查看输入图、任务状态、结果视频、发布入口。 - `积分明细`:查看积分流水,进入卡密兑换。 - `卡密兑换`:输入卡密兑换积分。 ## 后台管理 后台访问: ```text http://127.0.0.1:3000/admin ``` 菜单说明: - 工作台:用户、任务、发布、媒体、积分、卡密和抖音绑定概览。 - 用户管理:查看用户、登录方式、IP、手机号、注册登录时间,支持禁用。 - 视频任务:查看任务状态、提示词、积分扣减、视频预览和详情。 - 媒体文件:查看输入图、输出视频、本地代理地址和文件大小。 - 积分账户:查看余额、已使用、签到日期,支持后台调整积分。 - 积分流水:查看签到、生成扣减、退款、后台调整、卡密兑换。 - 卡密管理:批量生成卡密、导出 CSV、复制完整卡密、禁用/启用未兑换卡密。 - 发布管理:查看发布文案、平台、状态、视频预览,支持标记已发布;后台保留抖音重试能力。 - 抖音账号:查看用户抖音授权账号,支持后台解绑。 - 发布日志:查看抖音上传和创建视频的调用结果。 - 系统状态:查看数据库、配置项、媒体目录、服务运行信息。 - 操作日志:查看管理员登录、调整、解绑、复制卡密等审计记录。 ## 积分规则 新账号首次初始化: - 当前余额:100。 - 已使用:0。 每日签到: - 每天一次。 - 奖励 10 积分。 - 日期以 Asia/Shanghai 为准。 生成扣减规则以后端为准: - `t2v/i2v`:`duration`。 - `t2v_v3/i2v_v3`:`duration * 10`。 - `lv`:有效分段数 `* 5 * 15`。 - `seedance20`:有 `video` 时 `duration * 50`,否则 `duration * 25`。 - `wan27`:1080P 为 `duration * 15`,其他为 `duration * 10`。 - `happyhorse`:1080P 为 `duration * 50`,其他为 `duration * 25`。 任务失败或取消会退还本次生成扣减,重复轮询不会重复退款。 ## 卡密兑换 后台生成: - 卡密格式:`CK-XXXX-XXXX-XXXX-XXXX`。 - 单批生成数量:1-1000。 - 每张积分:100-10000。 - 有效期可选,不填为长期有效。 - 生成时不绑定用户,兑换成功后记录兑换用户。 - 完整卡密加密保存,列表默认只显示脱敏卡密。 状态: - `UNUSED`:未兑换。 - `REDEEMED`:已兑换。 - `DISABLED`:已禁用。 - `EXPIRED`:逻辑过期状态,由有效期动态判断。 小程序兑换: - 用户必须登录。 - 输入卡密后提交兑换。 - 兑换成功增加余额,不增加已使用积分。 - 同一张卡密只能兑换一次。 ## 视频生成与媒体代理 创建任务时: - 小程序请求后端代理。 - 后端校验登录、积分和参数。 - 真实 `API_KEY` 只保存在后端。 - 发送给 AIVideoMaker 的 `image/prompt/model` 参数保持原值。 - 后端额外保存输入图片副本到 `data/media/`。 视频完成后: - 后端下载第三方视频到本地媒体目录。 - 历史和详情优先使用代理视频地址。 - 第三方临时 URL 过期后,代理视频仍可播放。 开发环境媒体文件默认保存在: ```text data/media/ ``` 上线建议迁移到 COS/OSS/S3,并将 `media_records` 作为媒体索引。 ## 社媒发布 用户侧主流程: - 所有平台统一采用低风险辅助发布模式。 - 后端生成平台文案和话题,小程序可继续手动编辑。 - 小程序下载并保存生成视频到系统相册。 - 小程序复制标题、正文和话题到剪贴板。 - 发布页展示平台 logo、保存状态、复制状态和手动发布步骤。 - 发布页可用 Canvas 生成本地海报并保存到相册。 抖音自动发布: - 后端和后台仍保留 OAuth 绑定、上传视频和创建视频接口,用于历史兼容和后续高级能力。 - 小程序用户侧默认不展示抖音绑定入口,不主动跳转平台小程序,也不把自动发布作为主流程。 - 如需重新启用抖音自动提交,需要确认开放平台权限、HTTPS 回调地址和小程序审核策略。 抖音开放平台需要申请: ```text video.create.bind user_info ``` ## 常用后端接口 安装: - `GET /api/install/status` - `POST /api/install/test-mysql` - `POST /api/install/complete` 认证: - `POST /api/auth/wechat-login` - `POST /api/auth/phone-login` - `POST /api/auth/dev-login` - `GET /api/auth/me` - `POST /api/auth/logout` 视频任务: - `POST /api/generate/:model` - `GET /api/tasks` - `GET /api/tasks/:taskId` - `GET /api/tasks/:taskId/status` - `PUT /api/tasks/:taskId/cancel` 积分: - `GET /api/credits` - `POST /api/credits/check-in` - `POST /api/credits/redeem` 发布: - `GET /api/publish-records` - `POST /api/publish-records` - `PUT /api/publish-records/:recordId` - `POST /api/social-copy` - `GET /api/social/douyin/status` - `GET /api/social/douyin/auth-url` - `GET /api/social/douyin/callback` - `DELETE /api/social/douyin/account` - `POST /api/publish-records/:recordId/douyin/submit` 媒体: - `GET /api/media/:mediaId` 后台: - `POST /api/admin/auth/login` - `GET /api/admin/auth/me` - `POST /api/admin/auth/logout` - `GET /api/admin/dashboard` - `GET /api/admin/users` - `GET /api/admin/tasks` - `GET /api/admin/media` - `GET /api/admin/credits/accounts` - `GET /api/admin/credits/ledger` - `POST /api/admin/credits/adjust` - `POST /api/admin/redeem-card-batches` - `GET /api/admin/redeem-card-batches` - `GET /api/admin/redeem-cards` - `GET /api/admin/redeem-cards/:cardId/code` - `GET /api/admin/redeem-card-batches/:batchId/export` - `PUT /api/admin/redeem-cards/:cardId/status` - `GET /api/admin/publish-records` - `PUT /api/admin/publish-records/:recordId/status` - `POST /api/admin/publish-records/:recordId/retry-douyin` - `GET /api/admin/social/douyin/accounts` - `DELETE /api/admin/social/douyin/accounts/:accountId` - `GET /api/admin/publish-attempts` - `GET /api/admin/system/health` - `GET /api/admin/system/config-status` - `GET /api/admin/audit-logs` ## 上线检查 - 修改 `[ADMIN] PASSWORD`,不要使用默认密码。 - 设置强随机 `SESSION_SECRET`,上线后不要随意变更。 - 设置 `NODE_ENV=production`,关闭开发登录。 - 配置微信小程序合法域名,后端必须使用 HTTPS。 - 配置 MySQL 账号权限,避免使用 root 账号直连生产库。 - 配置数据库定时备份。 - 将 `data/media/` 迁移到 COS/OSS/S3 或挂载可靠对象存储。 - 配置防火墙和反向代理,仅开放必要端口。 - 确认 `.env`、`data/`、日志文件不会提交到代码仓库。 - 如启用抖音自动发布能力,需先确认开放平台权限、回调地址、审核状态。 ## 常见问题 ### 小程序请求超时 图生视频使用 base64 图片时请求体较大,后端生成请求超时时间已加长。真机仍超时时,建议压缩图片,或后续改为先上传图片到对象存储再提交 URL。 ### 真机无法连接代理 检查手机和电脑是否在同一局域网,代理地址是否使用电脑局域网 IP,Windows 防火墙是否放行 3000 端口。上线环境必须配置 HTTPS 合法域名。 ### 微信登录拿不到真实头像昵称 微信新版隐私策略下,`wx.login` 只能换取 openid/session_key,头像昵称需要用户主动授权填写或使用头像昵称能力。当前项目会尽量保存用户提供的资料。 ### 小程序 Storage 超限 不要把大 base64 图片、视频内容或完整历史大对象长期写入本地 Storage。项目已将任务、积分、发布记录、媒体索引放入 MySQL,视频和图片通过后端媒体代理访问。 ### 卡密无法兑换 可能原因包括:格式错误、卡密不存在、已兑换、已禁用、已过期、批次已停用。后台“卡密管理”和“积分流水”可排查。 ## 开发约定 - 不要把 `API_KEY`、`CLIENT_SECRET`、`SESSION_SECRET` 写入小程序代码。 - 小程序请求第三方服务必须经过后端代理。 - 数据以 MySQL 为准,本地 JSON 仅作为旧数据迁移来源。 - 后台复制完整卡密、导出卡密属于敏感操作,都会写入操作日志。 - 新增数据库字段时同步更新 `server/schema.mysql.sql`。