Implement compression quota refunds and admin manual subscription

This commit is contained in:
2025-12-19 23:28:32 +08:00
commit 11f48fd3dd
106 changed files with 27848 additions and 0 deletions

162
docs/prd.md Normal file
View File

@@ -0,0 +1,162 @@
# 产品需求文档PRD- ImageForge
目标:做一个接近商用的图片压缩网站 + 对外 API + 计费系统(可订阅/可计量)。
> 本文只描述“做什么/做到什么程度”。技术实现细节在 `docs/architecture.md`、`docs/api.md`、`docs/database.md`、`docs/deployment.md`、`docs/ui.md`。
---
## 1. 产品定位
### 1.1 一句话
提供高质量、稳定、可规模化的图片压缩服务:既能让普通用户在网页上批量压缩,也能让开发者通过 API Key 集成到 CI/CD 或业务系统,并按使用量/套餐计费。
### 1.2 核心价值
- **效果**:压缩比与画质控制可预期(可选有损/无损/近无损)。
- **体验**:网站拖拽即用、批量任务、可下载 ZIP、历史可追溯。
- **工程化**:对外 API 稳定、可观测、可限流、可计量、可计费。
- **安全合规**:默认去除隐私元数据、明确保留期限、支持删除。
### 1.3 非目标(明确不做/后做)
- 图像编辑(裁剪/滤镜/水印)不作为核心能力(后续可扩展)。
- CDN 图片处理(按 URL 在线压缩、自动适配)不作为首期必须。
- 视频/动图GIF/APNG暂不纳入首期除非强需求
---
## 2. 用户与角色
### 2.1 用户类型
- **游客Anonymous**:无需注册即可试用网站压缩(强限制、短保留)。
- **注册用户User**:使用网站 + 管理 API Key + 查看用量/发票。
- **企业/团队用户Team可选**:多人协作、共享额度、角色权限(可作为 V1+)。
- **管理员Admin**:风控、配置、用户/任务/账单审核、运营数据。
### 2.2 典型场景
- 设计师:批量压缩并打包下载,保留 7 天内历史。
- 开发者CI 里调用 API在发布前批量压缩静态资源。
- 运营:导出周期用量、查看节省带宽、按部门拆分账单(团队版)。
---
## 3. 功能范围(按模块)
### 3.1 网站压缩Web
- 拖拽/选择图片(单次多文件)。
- 压缩参数:
- 压缩率1-100数值越大压缩越强
- 输出格式:保持原格式。
- 可选:限制宽高(等比缩放)。
- 可选:是否保留元数据(默认不保留)。
- 结果展示:
- 逐文件:原始大小、压缩后大小、压缩率、状态、下载。
- 汇总:总节省、下载 ZIP、失败文件原因。
- 历史记录:
- 最近任务列表(可筛选:日期/格式/状态)。
- 可再次下载(未过期)、或重新发起压缩(使用相同参数)。
- 游客试用:
- 自动创建匿名会话Cookie只允许较小文件/较少数量。
- 到期自动清理,不提供“历史”永久保存。
### 3.2 对外 APIDeveloper API
- API Key创建/禁用/轮换/权限范围(最小权限)。
- 压缩接口:
- 同步单图(可返回二进制或下载链接)。
- 批量/大文件异步任务(任务状态、下载 ZIP
- 可选Webhook 回调(替代轮询/WS用于服务端集成
- 工程化能力:
- 幂等Idempotency-Key避免重复扣费/重复任务。
- 配额与用量头信息(本订阅周期已用/剩余/上限)。
- 速率限制(标准 `Retry-After` + 速率头)。
### 3.3 计费与用量Billing & Metering
详见 `docs/billing.md`PRD 层面要求:
- 具备 **套餐**Free/Pro/Business**配额**(每订阅周期压缩次数、文件大小/批量上限、保留期等)。
- 具备 **订阅** 生命周期:试用、激活、到期、欠费、取消、恢复。
- 具备 **发票**Invoice**支付记录**Payment可追溯。
- 具备 **用量计量**:以“成功压缩的文件数”为主计量单位(可扩展到字节、转换格式等)。
- 具备 **风控策略**:异常调用/盗刷/滥用限制与告警。
### 3.4 管理后台Admin
- 用户管理:冻结/解冻、限流覆盖、手动调整套餐/额度、查看登录/调用记录。
- 任务管理:查看任务队列/失败原因、取消任务、重试。
- 计费管理:查看订阅与发票、手动赠送额度、处理退款(首期可做“手动退款登记”)。
- 系统配置:全局限流、文件限制、保留期、功能开关(注册开关等)。
- 监控面板QPS、延迟、错误率、队列长度、CPU/内存、S3/DB/Redis 状态。
---
## 4. 套餐与配额(建议默认值,可调)
> 这些是“产品默认建议”,最终可在上线前确认并固化到配置/数据库。
| 项 | Free | Pro | Business |
|---|---:|---:|---:|
| 每周期压缩次数(成功文件数) | 500 | 10,000 | 100,000+ |
| 单文件大小上限 | 5 MB | 20 MB | 50 MB |
| 单次批量上限 | 10 | 50 | 200 |
| 并发(建议) | 2 | 8 | 32 |
| 结果保留期 | 24 小时 | 7 天 | 30 天 |
| API 访问 | ❌ | ✅ | ✅ |
| Webhook | ❌ | ✅ | ✅ |
| SSO/团队 | ❌ | ❌ | 可选 |
周期定义(用于“本周期已用/剩余/重置时间”的展示与扣减):
- **Pro/Business付费**:按 Stripe 订阅周期(`current_period_start` ~ `current_period_end`),不是自然月。
- **Free未订阅**按自然月重置UTC+8
匿名试用(无需登录):
- 每日 10 次(以成功压缩文件数计,失败不计)
- 日界自然日UTC+8次日 00:00 重置
- 不提供 API Key
- 结果保留 24 小时
计量单位:
- **compression_unit**:每成功压缩 1 个输出文件计 1。
- 对于批量任务:按文件粒度计量;失败文件不计量。
- 幂等:同一个 Idempotency-Key 重试不重复计量。
---
## 5. 关键体验与质量指标NFR
### 5.1 性能与稳定性(建议目标)
- 99% 的同步单图压缩在 3s 内完成(小图、常见格式)。
- 批量任务在可预期时间内完成(提供进度/预估)。
- 系统可水平扩展API 与 Worker 可独立扩容。
### 5.2 安全与合规(必须)
- 默认移除 EXIF 等隐私元数据(可配置允许保留,但需明确提示)。
- 上传内容按保留期自动删除,且支持用户主动删除。
- API Key 仅创建时显示一次;支持轮换与禁用。
- 具备基础风控IP/账号/API Key 限流、异常突增告警。
---
## 6. MVP / V1 里程碑建议
### MVP可上线收费的最小闭环
- 网站压缩(同步 + 批量异步)+ 下载/ZIP + 历史(登录用户)。
- API Key + 同步单图(直接返回二进制)+ 异步批量(任务/下载)。
- 用量计量 + 套餐配额Free/Pro+ 订阅(至少一种支付渠道)+ 发票列表。
- 管理后台:用户/任务/配置/用量查看 + 手动赠送额度。
### V1+(商用增强)
- Webhook + SDKTS/Python/Go+ OpenAPI 自动生成。
- 团队/组织、多 Key 管理、细粒度权限、IP 白名单。
- 企业发票/税务字段、对公转账/线下支付流程。
- 风控升级:验证码、黑名单、设备指纹、异常画像。
---
## 7. 已确认口径(开工前)
- 支付渠道Stripe
- 计费策略:硬配额(超额返回 `QUOTA_EXCEEDED` / HTTP 402
- 配额周期:按订阅周期(非自然月)
- 匿名试用:支持(每日 10 次),不提供 API Key
- Free 套餐 API不开放仅 Pro/Business 可创建 API Key
- 邮件服务:注册需邮箱验证 + 密码重置SMTP预置多服务商模板
- 默认语言:中文
## 8. 待完成清单(上线前必须定稿)
- 法务页面:隐私政策、服务条款、数据保留与删除说明。(已提供模板,建议上线前法务审核)