Spaces:
Paused
Paused
| title: GPT Team 车位管理与兑换系统 | |
| sdk: docker | |
| app_port: 7860 | |
| # GPT Team 车位管理与兑换系统 | |
| 一个基于 FastAPI 的 ChatGPT Team 管理系统,围绕「账号导入 → 兑换分配 → 质保售后 → 库存预警」完整流程设计,适合需要稳定管理 Team 车位与兑换业务的场景。 | |
| ## 🚀 Docker 一键部署 & 更新 | |
| ### 一键部署 | |
| ```bash | |
| git clone https://github.com/tibbar213/team-manage.git | |
| cd team-manage | |
| cp .env.example .env | |
| docker compose up -d | |
| ``` | |
| ### 一键更新 | |
| ```bash | |
| git pull && docker compose down && docker compose up -d --build | |
| ``` | |
| ## ✨ 功能特性 | |
| ### 管理员功能 | |
| - **Team 账号管理** | |
| - 单个/批量导入 Team 账号(支持 Access Token / Refresh Token / Session Token / Client ID) | |
| - 智能识别和提取 AT Token、邮箱、Account ID(支持从混合文本中提取) | |
| - 自动同步 Team 信息(名称、订阅计划、到期时间、成员数) | |
| - Team 成员管理(查看、添加、删除成员) | |
| - Team 状态监控(可用/已满/已过期/错误) | |
| - 支持 OAuth 授权链接生成与回调解析,便于获取和整理导入凭据 | |
| - **兑换码管理** | |
| - 单个/批量生成兑换码 | |
| - 自定义兑换码和有效期 | |
| - 支持质保兑换码(可配置质保天数) | |
| - 兑换码状态筛选(未使用/已使用/已过期) | |
| - 导出兑换码为文本文件 | |
| - 删除未使用的兑换码 | |
| - **使用记录查询** | |
| - 多维度筛选(邮箱、兑换码、Team ID、日期范围) | |
| - 分页展示(每页20条记录) | |
| - 统计数据(总数、今日、本周、本月) | |
| - **系统设置** | |
| - 代理配置(HTTP/SOCKS5) | |
| - 管理员密码修改 | |
| - 日志级别动态调整 | |
| - Token 预刷新频率与刷新窗口配置(降低过期导致的可用性问题) | |
| - **库存预警 Webhook**(基于剩余可用车位自动通知补货系统) | |
| - 顶部导航分区切换(点击标签仅显示当前设置板块,无需长页面滚动) | |
| - **公告通知管理**(支持 Markdown 公告,用户访问兑换页时弹窗展示) | |
| - **福利车位(独立池)** | |
| - 福利 Team 与常规 Team 完全分池管理(导入、列表、兑换逻辑独立) | |
| - 福利通用兑换码为 settings 管理的虚拟码(新码生成会立即使旧码失效) | |
| - 福利通用码卡片支持单行紧凑展示、悬停查看完整码,并可一键复制 | |
| - 福利通用码剩余次数按“可邀请席位”统计(`max_members - 1`),更贴合实际可拉人数量 | |
| - 控制台保留原始 Team ID 展示,福利页使用独立“编号”便于单独核对 | |
| - **售后与风控能力** | |
| - 质保查询:支持按邮箱或兑换码追溯历史记录 | |
| - 设备身份验证:支持用户一键开启 Device Code Auth | |
| - Team 封禁关联追踪:辅助判断是否可复用或重新分配 | |
| ### 自动化与集成 | |
| - **库存预警与自动导入** | |
| - 当可用兑换码低于设置阈值时,自动触发 Webhook 通知 | |
| - 支持第三方程序通过 API 自动导入新 Team 账号 | |
| - 内置定时任务:Token 预刷新 + Team 周期状态同步(默认 7 天维度) | |
| - 详细对接说明见 [integration_docs.md](integration_docs.md) | |
| ### 用户功能 | |
| - **兑换流程** | |
| - 输入邮箱和兑换码 | |
| - 自动验证兑换码有效性 | |
| - 展示可用 Team 列表 | |
| - 手动选择或自动分配 Team | |
| - 自动发送 Team 邀请到用户邮箱 | |
| - 兑换首页显示常规车位与福利车位剩余数量 | |
| - **公告弹窗** | |
| - 管理员启用公告后,用户打开兑换页会自动弹出公告 | |
| - 公告内容支持 Markdown(标题、列表、加粗、链接) | |
| ## 🛠️ 技术栈 | |
| - **后端框架**: FastAPI 0.109+ | |
| - **Web 服务器**: Uvicorn | |
| - **数据库**: SQLite + SQLAlchemy 2.0 + aiosqlite | |
| - **模板引擎**: Jinja2 | |
| - **HTTP 客户端**: curl-cffi(模拟浏览器指纹,绕过 Cloudflare 防护) | |
| - **调度任务**: APScheduler(Token 预刷新、Team 周期同步) | |
| - **认证**: Session-based(bcrypt 密码哈希) | |
| - **加密**: cryptography(AES-256-GCM) | |
| - **JWT 解析**: PyJWT | |
| - **前端**: HTML + CSS + 原生 JavaScript | |
| ## 🤗 Hugging Face Spaces 部署 | |
| 本项目已适配 Hugging Face 的 Docker Spaces,部署要点如下: | |
| 1. 在 Hugging Face 创建 Space,SDK 选择 `Docker`。 | |
| 2. Space 会注入环境变量 `PORT`,应用会自动监听该端口。 | |
| 3. 在 Space 的 Variables/Secrets 中设置 `DATABASE_URL=sqlite+aiosqlite:////data/team_manage.db`(启用持久化存储时)。 | |
| 4. 在 Space 的 Variables/Secrets 中设置 `SECRET_KEY` 与 `ADMIN_PASSWORD`(生产环境必须修改)。 | |
| ## 📋 系统要求 | |
| - Python 3.10+ | |
| - pip(Python 包管理器) | |
| - 操作系统:Windows / Linux / macOS | |
| ## 🚀 快速开始 | |
| ### 1. 克隆项目 | |
| ```bash | |
| git clone https://github.com/tibbar213/team-manage.git | |
| cd team-manage | |
| ``` | |
| ### 2. 创建虚拟环境 | |
| ```bash | |
| # Windows | |
| python -m venv venv | |
| venv\Scripts\activate | |
| # Linux/macOS | |
| python3 -m venv venv | |
| source venv/bin/activate | |
| ``` | |
| ### 3. 安装依赖 | |
| ```bash | |
| pip install -r requirements.txt | |
| ``` | |
| ### 4. 配置环境变量 | |
| 复制 `.env.example` 为 `.env` 并修改配置: | |
| ```bash | |
| cp .env.example .env | |
| ``` | |
| 编辑 `.env` 文件: | |
| ```env | |
| # 应用配置 | |
| APP_NAME=GPT Team 管理系统 | |
| APP_VERSION=0.1.0 | |
| APP_HOST=0.0.0.0 | |
| APP_PORT=8008 | |
| DEBUG=True | |
| # 数据库配置(默认使用 SQLite) | |
| DATABASE_URL=sqlite+aiosqlite:///team_manage.db | |
| # 安全配置(生产环境请修改) | |
| SECRET_KEY=your-secret-key-here-change-in-production | |
| ADMIN_PASSWORD=admin123 | |
| # 日志配置 | |
| LOG_LEVEL=INFO | |
| # 代理配置(可选) | |
| PROXY_ENABLED=False | |
| PROXY= | |
| # JWT 配置 | |
| JWT_VERIFY_SIGNATURE=False | |
| ``` | |
| ### 5. 初始化数据库 | |
| ```bash | |
| python init_db.py | |
| ``` | |
| ### 6. 启动应用 | |
| ```bash | |
| # 开发模式(自动重载) | |
| python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8008 | |
| # 或者直接运行 | |
| python app/main.py | |
| ``` | |
| ### 7. 访问应用 | |
| - **用户兑换页面**: http://localhost:8008/ | |
| - **管理员登录页面**: http://localhost:8008/login | |
| - **管理员控制台**: http://localhost:8008/admin | |
| - **福利车位管理页面**: http://localhost:8008/admin/welfare | |
| **默认管理员账号**: | |
| - 用户名: `admin` | |
| - 密码: `admin123`(请在首次登录后修改) | |
| --- | |
| ## 🐳 Docker 部署 (推荐) | |
| 项目支持使用 Docker 快速部署,确保环境一致性并简化配置。 | |
| ### 1. 准备工作 | |
| 确保你的系统已安装: | |
| - Docker | |
| - Docker Compose | |
| ### 2. 快速启动 | |
| 1. 克隆项目并进入目录。 | |
| 2. 配置 `.env` 文件(参考上述"配置环境变量"章节)。 | |
| 3. 运行 Docker Compose 命令: | |
| ```bash | |
| # 构建并启动容器 | |
| docker compose up -d | |
| ``` | |
| ### 3. 数据持久化 | |
| Docker 配置中已自动将宿主机的 `team_manage.db` 文件映射到容器内部,因此你的数据会自动保存在项目根目录下,容器删除后数据依然存在。 | |
| ### 4. 常用命令 | |
| ```bash | |
| # 查看日志 | |
| docker compose logs -f | |
| # 停止并移除容器 | |
| docker compose down | |
| # 重新构建镜像 | |
| docker compose build --no-cache | |
| ``` | |
| ## 📁 项目结构 | |
| ``` | |
| team-manage/ | |
| ├── app/ # 应用主目录 | |
| │ ├── main.py # FastAPI 入口文件 | |
| │ ├── config.py # 配置管理 | |
| │ ├── database.py # 数据库连接 | |
| │ ├── models.py # SQLAlchemy 模型 | |
| │ ├── routes/ # 路由模块 | |
| │ │ ├── admin.py # 管理员路由 | |
| │ │ ├── user.py # 用户路由 | |
| │ │ ├── api.py # API 端点 | |
| │ │ ├── auth.py # 认证路由 | |
| │ │ └── redeem.py # 兑换路由 | |
| │ ├── services/ # 业务逻辑服务 | |
| │ │ ├── auth.py # 认证服务 | |
| │ │ ├── chatgpt.py # ChatGPT API 集成 | |
| │ │ ├── encryption.py # 加密服务 | |
| │ │ ├── redeem_flow.py # 兑换流程服务 | |
| │ │ ├── redemption.py # 兑换码管理服务 | |
| │ │ ├── settings.py # 系统设置服务 | |
| │ │ └── team.py # Team 管理服务 | |
| │ ├── utils/ # 工具模块 | |
| │ │ ├── jwt_parser.py # JWT Token 解析 | |
| │ │ └── token_parser.py # Token 正则匹配 | |
| │ ├── dependencies/ # FastAPI 依赖 | |
| │ │ └── auth.py # 认证依赖 | |
| │ ├── templates/ # Jinja2 模板 | |
| │ │ ├── base.html # 基础布局 | |
| │ │ ├── auth/ # 认证页面 | |
| │ │ ├── admin/ # 管理员页面 | |
| │ │ └── user/ # 用户页面 | |
| │ └── static/ # 静态文件 | |
| │ ├── css/ # 样式文件 | |
| │ └── js/ # JavaScript 文件 | |
| ├── init_db.py # 数据库初始化脚本 | |
| ├── requirements.txt # Python 依赖 | |
| ├── Dockerfile # Docker 镜像构建文件 | |
| ├── docker-compose.yml # Docker 服务编排文件 | |
| ├── .dockerignore # Docker 忽略文件 | |
| ├── .env.example # 环境变量示例 | |
| ├── CLAUDE.md # Claude Code 指南 | |
| ├── 需求.md # 项目需求文档 | |
| ├── 任务.md # 任务跟踪文档 | |
| ├── 接口.md # API 接口文档 | |
| └── README.md # 项目说明文档 | |
| ``` | |
| ## 🔧 配置说明 | |
| ### 数据库配置 | |
| 默认使用 SQLite 数据库,数据库文件为 `team_manage.db`。如需使用其他数据库,请修改 `DATABASE_URL`。 | |
| ### 代理配置 | |
| 如果需要通过代理访问 ChatGPT API,可以在管理员面板的"系统设置"中配置代理: | |
| - 支持 HTTP 代理:`http://proxy.example.com:8080` | |
| - 支持 SOCKS5 代理:`socks5://proxy.example.com:1080` | |
| ### 安全配置 | |
| **生产环境部署前,请务必修改以下配置**: | |
| 1. `SECRET_KEY`: 用于 Session 签名,请使用随机字符串 | |
| 2. `ADMIN_PASSWORD`: 管理员初始密码,首次登录后请立即修改 | |
| 3. `DEBUG`: 生产环境请设置为 `False` | |
| ## 📖 使用指南 | |
| ### 管理员操作流程 | |
| 1. **登录管理员面板** | |
| - 访问 http://localhost:8008/login | |
| - 使用默认账号登录(admin/admin123) | |
| - 首次登录后建议修改密码 | |
| 2. **导入 Team 账号** | |
| - 进入"Team 管理" → "导入 Team" | |
| - 单个导入支持两种模式: | |
| - 一键获取 Token(授权链接 → 粘贴回调 → 解析自动填充 → 导入) | |
| - 已有 Token 直接填写(手动模式) | |
| - 批量导入支持 JSON 文件一键选择导入 | |
| - 系统会自动识别并尽量补全邮箱、Account ID 等信息 | |
| 3. **生成兑换码** | |
| - 进入"兑换码管理" → "生成兑换码" | |
| - 单个生成:可自定义兑换码和有效期 | |
| - 批量生成:设置数量和有效期 | |
| - 生成后可复制或下载 | |
| 4. **查看使用记录与售后状态** | |
| - 进入"使用记录" | |
| - 可按邮箱、兑换码、Team ID、日期范围筛选 | |
| - 查看统计数据(总数、今日、本周、本月) | |
| - 需要售后时,可通过质保查询快速定位原始兑换记录 | |
| 5. **系统设置与公告** | |
| - 进入"系统设置"可配置代理、修改密码、调整日志级别、Token 刷新与库存预警 | |
| - 设置页支持顶部导航标签切换,仅显示当前板块,便于快速操作 | |
| - 进入"公告通知"可编辑 Markdown 公告并控制是否启用弹窗 | |
| ### 用户兑换流程 | |
| 1. **访问兑换页面** | |
| - 访问 http://localhost:8008/ | |
| 2. **输入信息** | |
| - 填写邮箱地址 | |
| - 输入兑换码 | |
| 3. **选择 Team** | |
| - 系统展示可用 Team 列表 | |
| - 手动选择 Team 或点击"自动选择" | |
| 4. **完成兑换** | |
| - 系统自动发送邀请到邮箱 | |
| - 查看兑换结果(Team 名称、到期时间) | |
| 5. **接受邀请** | |
| - 检查邮箱收到的 ChatGPT Team 邀请邮件 | |
| - 点击邮件中的链接接受邀请 | |
| ## 🔌 API 接口 | |
| 详细的 API 接口文档请参考 [接口.md](接口.md)。 | |
| 主要接口: | |
| - `POST /auth/login` - 管理员登录 | |
| - `POST /auth/logout` - 管理员登出 | |
| - `POST /redeem/verify` - 验证兑换码 | |
| - `POST /redeem/confirm` - 确认兑换 | |
| - `GET /admin` - 管理员控制台 | |
| - `GET /admin/teams/import` - Team 导入页面 | |
| - `GET /admin/codes` - 兑换码列表 | |
| - `GET /admin/records` - 使用记录 | |
| - `POST /warranty/check` - 查询兑换码/邮箱质保状态 | |
| - `POST /warranty/enable-device-auth` - 开启设备身份验证 | |
| ## 🐛 故障排除 | |
| ### 数据库初始化失败 | |
| ```bash | |
| # 删除旧数据库文件 | |
| rm team_manage.db | |
| # 重新初始化 | |
| python init_db.py | |
| ``` | |
| ### 无法访问 ChatGPT API | |
| 1. 检查网络连接 | |
| 2. 配置代理(如需) | |
| 3. 检查 AT Token 是否有效 | |
| 4. 查看日志文件排查错误 | |
| ### 导入 Team 失败 | |
| 1. 确保 AT Token 格式正确 | |
| 2. 检查 Token 是否过期 | |
| 3. 验证 Token 是否有 Team 管理权限 | |
| ## 📄 许可证 | |
| 本仓库当前采用 [MIT License](./LICENSE)。 | |
| ## 🤝 贡献 | |
| 欢迎提交 Issue 和 Pull Request! | |
| --- | |
| **注意**: 本系统仅用于合法的 ChatGPT Team 账号管理,请遵守 OpenAI 的服务条款。 | |