163 lines
7.5 KiB
Markdown
163 lines
7.5 KiB
Markdown
# 产品需求文档(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(压缩后体积占原图比例,数值越小压缩越强,100 表示不压缩)。
|
||
- 输出格式:保持原格式。
|
||
- 可选:限制宽高(等比缩放)。
|
||
- 可选:是否保留元数据(默认不保留)。
|
||
- 结果展示:
|
||
- 逐文件:原始大小、压缩后大小、压缩率、状态、下载。
|
||
- 汇总:总节省、下载 ZIP、失败文件原因。
|
||
- 历史记录:
|
||
- 最近任务列表(可筛选:日期/格式/状态)。
|
||
- 可再次下载(未过期)、或重新发起压缩(使用相同参数)。
|
||
- 游客试用:
|
||
- 自动创建匿名会话(Cookie),只允许较小文件/较少数量。
|
||
- 到期自动清理,不提供“历史”永久保存。
|
||
|
||
### 3.2 对外 API(Developer 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 + SDK(TS/Python/Go)+ OpenAPI 自动生成。
|
||
- 团队/组织、多 Key 管理、细粒度权限、IP 白名单。
|
||
- 企业发票/税务字段、对公转账/线下支付流程。
|
||
- 风控升级:验证码、黑名单、设备指纹、异常画像。
|
||
|
||
---
|
||
|
||
## 7. 已确认口径(开工前)
|
||
- 支付渠道:Stripe
|
||
- 计费策略:硬配额(超额返回 `QUOTA_EXCEEDED` / HTTP 402)
|
||
- 配额周期:按订阅周期(非自然月)
|
||
- 匿名试用:支持(每日 10 次),不提供 API Key
|
||
- Free 套餐 API:不开放(仅 Pro/Business 可创建 API Key)
|
||
- 邮件服务:注册需邮箱验证 + 密码重置(SMTP,预置多服务商模板)
|
||
- 默认语言:中文
|
||
|
||
## 8. 待完成清单(上线前必须定稿)
|
||
- 法务页面:隐私政策、服务条款、数据保留与删除说明。(已提供模板,建议上线前法务审核)
|