4.3 KiB
4.3 KiB
前端工程设计(Vue3)- ImageForge
目标:支撑“网站压缩 + 开发者 API 控制台 + 计费/发票 + 管理后台”的一个 Vue3 SPA(或同仓多入口)。
UI/UX 规格见 docs/ui.md。
1. 技术栈(确定)
- Vue 3 + TypeScript + Vite
- 路由:Vue Router
- 状态:Pinia
- 网络:Fetch 或 Axios(统一封装,支持幂等头、错误归一)
- 样式:Tailwind CSS(推荐)或 CSS Variables + 自研组件
- 工具:VueUse、Day.js(或 date-fns)、Zod(表单校验可选)
2. 路由与页面
2.1 公共
/ 首页压缩
/pricing 套餐与 FAQ
/docs 开发者文档(引导)
/login
/register
/terms
/privacy
2.2 用户控制台(登录)
/dashboard
/dashboard/history
/dashboard/api-keys
/dashboard/billing
/dashboard/settings
2.3 管理后台(管理员)
/admin
/admin/users
/admin/tasks
/admin/billing
/admin/config
3. 前端项目结构(建议)
src/
app/ # 路由、布局、鉴权守卫
pages/ # 页面(route components)
components/ # 通用组件(UI、上传、表格等)
features/
compress/ # 压缩:上传、任务、下载
billing/ # 套餐、订阅、发票、用量
apiKeys/ # API Key 管理
admin/ # 管理后台
services/ # API 封装(http client + endpoints)
stores/ # Pinia stores
styles/ # 主题变量、tailwind 入口
utils/ # 格式化、文件校验、错误处理
4. API 调用规范(前端约定)
4.1 Base URL
- 统一使用
/api/v1
4.2 幂等与重试
- 对
POST /compress/*、POST /billing/checkout等请求默认注入Idempotency-Key(UUID)。 - 网络重试仅限“明确幂等”的请求(否则会重复扣费/重复建任务)。
4.3 错误处理
将后端错误码映射为统一 UI 提示:
QUOTA_EXCEEDED:引导升级/查看账单页RATE_LIMITED:展示倒计时(读取Retry-After)FILE_TOO_LARGE/TOO_MANY_PIXELS:定位到具体文件并提示如何处理
5. 压缩流程(Web)
5.1 同步 vs 异步
- 小文件/少量:可直接调用
POST /compress,拿到download_url。 - 批量/大文件:调用
POST /compress/batch,拿到task_id后:- 优先 WebSocket/SSE 订阅进度;
- fallback:轮询
GET /compress/tasks/{task_id}。
5.2 上传前校验
前端必须做“用户体验级校验”(后端仍需二次校验):
- 格式白名单(png/jpg/jpeg/webp/avif/gif/bmp/tiff/ico,GIF 仅静态)
- 文件大小与数量(按匿名/登录/套餐提示不同上限)
- 匿名试用:每日 10 次限制提示(达到后引导登录/升级)
- 可选:读取图片宽高(避免明显超限)
6. 计费与用量(前端展示)
对接 docs/api.md 的 Billing 模块:
/pricing页面:读取GET /billing/plans- 控制台概览:读取
GET /billing/usage、GET /billing/subscription - 订阅升级:调用
POST /billing/checkout获取checkout_url并跳转 - 支付方式/取消订阅:调用
POST /billing/portal获取 portal 链接 - 发票列表:
GET /billing/invoices
UI 必须展示:
- 当期已用/剩余、重置时间
- 当前订阅状态(active/past_due/canceled)
7. API Key 控制台(开发者体验)
页面提供三类信息:
- Key 管理:创建/禁用/轮换(创建时只展示一次完整 Key)
- 用量:本周期已用/剩余(与 Billing 用量一致)
- 快速接入:curl 示例 + 常见错误码 + 幂等建议
8. 安全建议(前端侧)
- 若使用 Bearer Token:避免 localStorage(XSS 风险),优先 HttpOnly Cookie 会话(需要 CSRF 策略)。
- 上传与下载链接:明确到期时间与隐私说明(默认去 EXIF)。
- 管理后台路由加守卫:
role=admin才可进入。
9. 主题变量(CSS Variables)
首期可用 Tailwind 或自研组件,但建议保留一层 CSS 变量,方便后续主题化/暗色模式:
:root {
--bg: 248 250 252;
--card: 255 255 255;
--text: 15 23 42;
--muted: 71 85 105;
--border: 226 232 240;
--brand: 99 102 241;
--brand-strong: 79 70 229;
--success: 34 197 94;
--warning: 245 158 11;
--danger: 239 68 68;
}