# Phase 6: 前端完善 - 详细设计文档 > 版本:v1.0 > 创建时间:2026-06-17 > 负责人:小虾 🦐 > 预计时间:4-6 周 --- ## 📋 目标 在 Phase 4 完成的后端 API 基础上,构建完整的前端用户界面,让用户可以通过图形化界面使用所有 SaaS 功能。 --- ## 🎯 核心目标 1. **用户认证界面** - 注册/登录/密码管理 2. **工作空间管理** - 创建/管理工作空间和成员 3. **订阅管理界面** - 查看/升级/管理订阅 4. **Admin 后台** - 系统管理和数据监控 5. **响应式设计** - 支持桌面/平板/移动端 --- ## 🛠️ 技术栈选型 ### 前端框架 **选择:React 18 + TypeScript** **理由:** - 生态成熟,组件丰富 - TypeScript 提供类型安全 - 与后端 API 配合良好 - 社区活跃,文档完善 **替代方案:** - Vue 3 + TypeScript(更简单,但生态相对小) - Next.js 14(支持 SSR,适合 SEO) ### UI 组件库 **选择:Ant Design 5.x** **理由:** - 企业级 UI 组件 - 中文文档完善 - 开箱即用的表单/表格/布局 - 符合国内用户习惯 **替代方案:** - Material-UI(更现代,但学习曲线陡) - Chakra UI(轻量,但组件不够丰富) - shadcn/ui(新兴,基于 Tailwind) ### 状态管理 **选择:Zustand** **理由:** - 轻量简单 - TypeScript 友好 - 无需 Provider 包裹 - 学习成本低 **替代方案:** - Redux Toolkit(功能强大,但复杂) - Jotai/Recoil(原子化状态,适合大型应用) ### 路由 **选择:React Router v6** ### HTTP 客户端 **选择:Axios + React Query** **理由:** - Axios:成熟稳定,拦截器方便 - React Query:自动缓存、重试、分页支持 ### 表单管理 **选择:React Hook Form + Zod** **理由:** - React Hook Form:性能优秀,API 简洁 - Zod:TypeScript 友好的 schema 验证 ### 样式方案 **选择:CSS Modules + Tailwind CSS** ### 构建工具 **选择:Vite** **理由:** - 开发服务器极快 - 原生 ES 模块支持 - 完美支持 React + TypeScript --- ## 📐 项目结构 ``` apps/web/ ├── src/ │ ├── api/ # API 调用封装 │ │ ├── auth.ts # 认证相关 API │ │ ├── workspace.ts # 工作空间 API │ │ ├── subscription.ts │ │ └── client.ts # Axios 实例配置 │ ├── components/ # 可复用组件 │ │ ├── common/ # 通用组件 │ │ │ ├── Button/ │ │ │ ├── Modal/ │ │ │ └── Table/ │ │ ├── layout/ # 布局组件 │ │ │ ├── Header/ │ │ │ ├── Sidebar/ │ │ │ └── Footer/ │ │ └── business/ # 业务组件 │ │ ├── WorkspaceCard/ │ │ ├── MemberList/ │ │ └── SubscriptionPlan/ │ ├── pages/ # 页面组件 │ │ ├── auth/ # 认证页面 │ │ │ ├── Login.tsx │ │ │ ├── Register.tsx │ │ │ ├── ForgotPassword.tsx │ │ │ └── ResetPassword.tsx │ │ ├── workspace/ # 工作空间页面 │ │ │ ├── List.tsx │ │ │ ├── Detail.tsx │ │ │ └── Members.tsx │ │ ├── subscription/ # 订阅页面 │ │ │ ├── Plans.tsx │ │ │ ├── Upgrade.tsx │ │ │ └── Billing.tsx │ │ ├── admin/ # 管理后台 │ │ │ ├── Dashboard.tsx │ │ │ ├── Users.tsx │ │ │ └── Analytics.tsx │ │ └── profile/ # 个人中心 │ │ ├── Settings.tsx │ │ └── Account.tsx │ ├── hooks/ # 自定义 Hooks │ │ ├── useAuth.ts │ │ ├── useWorkspace.ts │ │ └── useSubscription.ts │ ├── store/ # 状态管理 │ │ ├── authStore.ts │ │ ├── workspaceStore.ts │ │ └── uiStore.ts │ ├── types/ # TypeScript 类型定义 │ │ ├── auth.ts │ │ ├── workspace.ts │ │ └── api.ts │ ├── utils/ # 工具函数 │ │ ├── request.ts # HTTP 请求封装 │ │ ├── storage.ts # LocalStorage 封装 │ │ ├── validator.ts # 表单验证 │ │ └── format.ts # 格式化函数 │ ├── router/ # 路由配置 │ │ └── index.tsx │ ├── styles/ # 全局样式 │ │ ├── global.css │ │ └── variables.css │ ├── App.tsx │ ├── main.tsx │ └── vite-env.d.ts ├── public/ │ └── assets/ ├── index.html ├── vite.config.ts ├── tsconfig.json ├── tailwind.config.js └── package.json ``` --- ## 🎨 设计规范 ### 1. 色彩系统 **主色调:** ```css --primary: #1890ff; /* 品牌蓝 */ --primary-hover: #40a9ff; --primary-active: #096dd9; --success: #52c41a; /* 成功绿 */ --warning: #faad14; /* 警告黄 */ --error: #ff4d4f; /* 错误红 */ --info: #1890ff; /* 信息蓝 */ ``` **中性色:** ```css --text-primary: #262626; --text-secondary: #595959; --text-disabled: #bfbfbf; --bg-primary: #ffffff; --bg-secondary: #fafafa; --bg-tertiary: #f5f5f5; --border: #d9d9d9; --divider: #f0f0f0; ``` ### 2. 字体规范 **字体家族:** ```css font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; ``` **字号:** ```css --text-xs: 12px; /* 辅助文字 */ --text-sm: 14px; /* 正文 */ --text-base: 16px; /* 正文加重 */ --text-lg: 18px; /* 小标题 */ --text-xl: 20px; /* 标题 */ --text-2xl: 24px; /* 大标题 */ ``` ### 3. 间距系统 ```css --space-xs: 4px; --space-sm: 8px; --space-md: 16px; --space-lg: 24px; --space-xl: 32px; --space-2xl: 48px; ``` ### 4. 圆角 ```css --radius-sm: 2px; --radius-md: 4px; --radius-lg: 8px; --radius-xl: 12px; --radius-full: 9999px; ``` ### 5. 阴影 ```css --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.08); --shadow-md: 0 4px 8px rgba(0, 0, 0, 0.12); --shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.16); ``` --- ## 🔐 认证流程设计 ### 1. 注册流程 **页面:** `/register` **步骤:** 1. 用户填写邮箱、用户名、密码 2. 前端验证(密码强度、邮箱格式) 3. 调用 `POST /api/v1/auth/register` 4. 显示"验证邮件已发送"提示 5. 用户点击邮件链接 → 跳转到验证页面 6. 自动登录 → 跳转到工作空间列表 **表单验证:** ```typescript const registerSchema = z.object({ email: z.string().email('请输入有效的邮箱地址'), username: z.string() .min(3, '用户名至少 3 个字符') .max(20, '用户名最多 20 个字符') .regex(/^[a-zA-Z0-9_]+$/, '用户名只能包含字母、数字和下划线'), password: z.string() .min(8, '密码至少 8 个字符') .regex(/[A-Z]/, '密码必须包含大写字母') .regex(/[a-z]/, '密码必须包含小写字母') .regex(/[0-9]/, '密码必须包含数字'), confirmPassword: z.string() }).refine(data => data.password === data.confirmPassword, { message: '两次密码输入不一致', path: ['confirmPassword'], }); ``` ### 2. 登录流程 **页面:** `/login` **步骤:** 1. 用户输入邮箱和密码 2. 调用 `POST /api/v1/auth/login` 3. 保存 token 到 localStorage 4. 设置 Axios 默认 Authorization header 5. 跳转到工作空间列表或上次访问页面 **Remember Me 功能:** - 勾选时:token 保存 30 天 - 不勾选:token 保存到 sessionStorage ### 3. Token 管理 **自动刷新:** ```typescript // axios 拦截器 axios.interceptors.response.use( response => response, async error => { if (error.response?.status === 401) { // Token 过期,尝试刷新 const refreshToken = storage.get('refresh_token'); if (refreshToken) { try { const { access_token } = await refreshAccessToken(refreshToken); storage.set('access_token', access_token); // 重试原请求 return axios(error.config); } catch { // 刷新失败,跳转登录 router.push('/login'); } } } return Promise.reject(error); } ); ``` --- ## 🏢 工作空间管理设计 ### 1. 工作空间列表 **页面:** `/workspaces` **布局:** ``` ┌─────────────────────────────────────────┐ │ Header (用户头像、通知、设置) │ ├─────────────────────────────────────────┤ │ ┌─────────────────────────────────┐ │ │ │ 我的工作空间 [+ 创建] │ │ │ ├─────────────────────────────────┤ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ │ WS 1 │ │ WS 2 │ │ WS 3 │ │ │ │ │ │ Free │ │ Pro │ │ Free │ │ │ │ │ │ 3人 │ │ 12人 │ │ 1人 │ │ │ │ │ └──────┘ └──────┘ └──────┘ │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘ ``` **功能:** - 显示所有工作空间 - 显示订阅计划(Free/Pro/Enterprise) - 显示成员数量 - 快速切换工作空间 - 创建新工作空间 ### 2. 工作空间详情 **页面:** `/workspaces/:id` **标签页:** - **概览** - 基本信息、配额使用情况 - **成员** - 成员列表、邀请、权限管理 - **订阅** - 当前计划、升级选项 - **设置** - 工作空间名称、删除 **概览页示例:** ```typescript interface WorkspaceOverview { name: string; plan: 'free' | 'pro' | 'enterprise'; memberCount: number; projectCount: number; storageUsed: number; storageLimit: number; quotaStatus: 'normal' | 'warning' | 'critical' | 'exceeded'; } ``` ### 3. 成员管理 **功能:** - 邀请成员(输入邮箱 + 选择角色) - 成员列表(头像、姓名、邮箱、角色、加入时间) - 修改角色(Owner/Admin/Member/Viewer) - 移除成员 - 待处理邀请列表 **权限矩阵显示:** ``` ┌────────────┬──────┬───────┬────────┬────────┐ │ 操作 │ Owner│ Admin │ Member │ Viewer │ ├────────────┼──────┼───────┼────────┼────────┤ │ 邀请成员 │ ✓ │ ✓ │ ✗ │ ✗ │ │ 移除成员 │ ✓ │ ✓ │ ✗ │ ✗ │ │ 创建项目 │ ✓ │ ✓ │ ✓ │ ✗ │ │ 删除项目 │ ✓ │ ✓ │ 自己 │ ✗ │ └────────────┴──────┴───────┴────────┴────────┘ ``` --- ## 💳 订阅管理设计 ### 1. 套餐选择页面 **页面:** `/subscription/plans` **布局:** ``` ┌───────────┬───────────┬───────────┐ │ Free │ Pro │ Enterprise│ ├───────────┼───────────┼───────────┤ │ ¥0/月 │ ¥99/月 │ ¥999/月 │ │ 3 项目 │ 无限项目 │ 无限项目 │ │ 10GB │ 100GB │ 1TB │ │ 邮件支持 │ 优先支持 │ 专属支持 │ │ │ │ 定制开发 │ │ [当前] │ [升级] │ [联系] │ └───────────┴───────────┴───────────┘ ``` **对比表格:** ```typescript interface PlanFeature { name: string; free: boolean | string; pro: boolean | string; enterprise: boolean | string; } const features: PlanFeature[] = [ { name: '项目数量', free: '3', pro: '无限', enterprise: '无限' }, { name: '存储空间', free: '10GB', pro: '100GB', enterprise: '1TB' }, { name: '成员数量', free: '3', pro: '20', enterprise: '无限' }, { name: 'API 调用', free: '1000/天', pro: '10000/天', enterprise: '无限' }, { name: '技术支持', free: '邮件', pro: '邮件+工单', enterprise: '专属客服' }, ]; ``` ### 2. 升级流程 **步骤:** 1. 选择套餐 → 确认升级 2. 显示订单信息(价格、有效期) 3. 选择支付方式(支付宝/微信/信用卡) 4. 跳转支付页面 5. 支付成功 → 自动升级 → 显示成功页面 ### 3. 账单页面 **页面:** `/subscription/billing` **内容:** - 当前订阅信息 - 下次续费日期和金额 - 历史账单列表 - 发票申请入口 --- ## 🎛️ Admin 后台设计 ### 1. Dashboard **页面:** `/admin/dashboard` **仪表盘指标:** ``` ┌──────────┬──────────┬──────────┬──────────┐ │ 总用户数 │ 付费用户 │ 月收入 │ 活跃用户 │ │ 1,234 │ 156 │ ¥15,444 │ 892 │ └──────────┴──────────┴──────────┴──────────┘ ┌─────────────────────────────────────────┐ │ 用户增长趋势图 │ │ ┌────────────────────────────────────┐ │ │ │ ╱╲ │ │ │ │ ╱ ╲ ╱╲ │ │ │ │ ╱╲ ╱ ╲ ╱ ╲ ╱╲ │ │ │ │ ╱ ╲╱ ╲ ╱ ╲ ╱ ╲ │ │ │ │ ╱ ╲╱ ╲╱ ╲ │ │ │ └────────────────────────────────────┘ │ └─────────────────────────────────────────┘ ``` ### 2. 用户管理 **页面:** `/admin/users` **功能:** - 用户列表(搜索、筛选、分页) - 用户详情(基本信息、工作空间、订阅状态) - 封禁/解封用户 - 手动验证邮箱 - 重置密码 ### 3. 系统监控 **页面:** `/admin/monitoring` **监控指标:** - API 响应时间 - 数据库连接池状态 - Redis 连接状态 - 错误日志 - 慢查询日志 --- ## 📱 响应式设计 ### 断点定义 ```css /* Mobile */ @media (max-width: 640px) { } /* Tablet */ @media (min-width: 641px) and (max-width: 1024px) { } /* Desktop */ @media (min-width: 1025px) { } ``` ### 移动端适配 **导航:** - 桌面端:侧边栏 + 顶部栏 - 移动端:底部导航栏 + 汉堡菜单 **表格:** - 桌面端:完整表格 - 移动端:卡片列表 **表单:** - 全宽输入框 - 大号按钮(易于点击) --- ## 🧪 测试策略 ### 1. 单元测试 **工具:** Vitest + Testing Library **覆盖范围:** - 工具函数(100%) - Hooks(80%+) - 组件(核心组件 80%+) ### 2. E2E 测试 **工具:** Playwright **关键流程:** - 用户注册 → 邮箱验证 → 登录 - 创建工作空间 → 邀请成员 - 升级订阅 ### 3. 可访问性测试 - 键盘导航支持 - ARIA 标签 - 颜色对比度(WCAG AA) --- ## 🚀 性能优化 ### 1. 代码分割 ```typescript // 路由懒加载 const Login = lazy(() => import('./pages/auth/Login')); const Dashboard = lazy(() => import('./pages/admin/Dashboard')); ``` ### 2. 图片优化 - 使用 WebP 格式 - 懒加载图片 - 响应式图片 ### 3. 缓存策略 **React Query 配置:** ```typescript const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, // 5 分钟 cacheTime: 10 * 60 * 1000, // 10 分钟 refetchOnWindowFocus: false, }, }, }); ``` --- ## 📅 开发排期 ### Week 1-2: 基础搭建 - [ ] 项目初始化(Vite + React + TypeScript) - [ ] 安装配置依赖(Ant Design, React Router, etc.) - [ ] 搭建基础布局(Header, Sidebar, Footer) - [ ] API 客户端封装 - [ ] 路由配置 ### Week 3: 认证页面 - [ ] 登录页面 - [ ] 注册页面 - [ ] 忘记密码页面 - [ ] 邮箱验证页面 - [ ] Token 管理 ### Week 4: 工作空间管理 - [ ] 工作空间列表页面 - [ ] 工作空间详情页面 - [ ] 成员管理页面 - [ ] 邀请成员功能 ### Week 5: 订阅管理 - [ ] 套餐选择页面 - [ ] 升级流程 - [ ] 账单页面 - [ ] 配额展示 ### Week 6: Admin 后台 - [ ] Dashboard 仪表盘 - [ ] 用户管理 - [ ] 系统监控 ### Week 7: 个人中心 - [ ] 个人设置页面 - [ ] 账号安全 - [ ] 通知设置 ### Week 8: 测试和优化 - [ ] E2E 测试 - [ ] 性能优化 - [ ] 可访问性优化 - [ ] Bug 修复 --- ## 🎯 成功指标 - [ ] 所有页面加载时间 < 2s - [ ] Lighthouse 性能分数 > 90 - [ ] 核心流程 E2E 测试覆盖率 100% - [ ] 移动端体验良好(无横向滚动) - [ ] 无 Console 错误和警告 --- ## 📝 备注 - 优先保证桌面端体验,移动端作为补充 - UI 设计遵循 Ant Design 规范,保持一致性 - 所有文字支持国际化(i18n)准备 - 表单验证使用 Zod,前后端类型一致 --- **老大确认后,我就开始 Phase 6 的开发工作!** 🦐💪