test-team-manager / README.md
Kyou0203's picture
Deploy updated app
4e5a541 verified
---
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 的服务条款。