diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index e3e0eb2..5540f3b 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -1528,35 +1528,35 @@ Sitemap: ${siteUrl}/sitemap.xml link: '/zh-cn/stage-2/frontend/2.5-hogwarts-portraits/' }, { - text: '大作业 1:第一个 SaaS 全栈应用——文案生成网站', + text: '大作业 1:AI 营销文案 SaaS 开发实战', link: '/zh-cn/stage-2/assignments/copywriting-platform-supabase/' }, { - text: '大作业 2:在线考试与管理系统', + text: '大作业 2:在线考试与管理系统开发实战', link: '/zh-cn/stage-2/assignments/exam-management-express/' }, { - text: '扩展作业:现代网页落地页', + text: '扩展作业:现代 AI 生图 SaaS 开发实战', link: '/zh-cn/stage-2/assignments/modern-landing-page/' }, { - text: '扩展作业:自制 Dify 智能体平台', + text: '扩展作业:类 Dify 智能体平台开发实战', link: '/zh-cn/stage-2/assignments/custom-dify-agent-platform/' }, { - text: '扩展作业:智能旅游规划 Agent 平台', + text: '扩展作业:智能旅游规划 Agent 平台开发实战', link: '/zh-cn/stage-2/assignments/travel-planning-agent-platform/' }, { - text: '扩展作业:电影推荐网(Spring Boot)', + text: '扩展作业:Spring Boot 电影推荐系统开发实战', link: '/zh-cn/stage-2/assignments/movie-recommendation-springboot/' }, { - text: '扩展作业:简单买菜微服务网站', + text: '扩展作业:生鲜电商微服务系统开发实战', link: '/zh-cn/stage-2/assignments/simple-grocery-microservices/' }, { - text: '扩展作业:交通大数据可视化分析(Go)', + text: '扩展作业:Go 交通数据分析平台开发实战', link: '/zh-cn/stage-2/assignments/traffic-data-visualization-go/' } ] diff --git a/docs/public/sitemap.xml b/docs/public/sitemap.xml index b2ba6f2..ed1f46a 100644 --- a/docs/public/sitemap.xml +++ b/docs/public/sitemap.xml @@ -938,58 +938,114 @@ + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/copywriting-platform-supabase/PRD/ + 2026-03-31T04:14:27.746Z + weekly + 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/copywriting-platform-supabase/ - 2026-03-26T11:20:31+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/custom-dify-agent-platform/PRD/ + 2026-03-31T04:14:27.747Z + weekly + 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/custom-dify-agent-platform/ - 2026-03-26T11:20:31+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/exam-management-express/PRD/ + 2026-03-31T04:14:27.748Z + weekly + 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/exam-management-express/ - 2026-03-26T11:20:31+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/modern-landing-page/PRD/ + 2026-03-30T09:59:56.848Z + weekly + 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/modern-landing-page/ - 2026-03-26T11:20:31+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/movie-recommendation-springboot/PRD/ + 2026-03-31T04:15:20.951Z + weekly + 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/movie-recommendation-springboot/ - 2026-03-26T11:20:31+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/simple-grocery-microservices/PRD/ + 2026-03-31T04:15:20.951Z + weekly + 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/simple-grocery-microservices/ - 2026-03-26T11:20:31+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/traffic-data-visualization-go/PRD/ + 2026-03-31T04:15:20.951Z + weekly + 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/traffic-data-visualization-go/ - 2026-03-26T11:20:31+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/travel-planning-agent-platform/PRD/ + 2026-03-31T04:15:20.950Z + weekly + 0.8 + + https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/assignments/travel-planning-agent-platform/ - 2026-03-26T11:20:31+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 @@ -1108,7 +1164,7 @@ https://datawhalechina.github.io/easy-vibe/zh-cn/stage-2/ - 2026-03-29T15:16:07+08:00 + 2026-03-29T19:37:03+08:00 weekly 0.8 diff --git a/docs/zh-cn/stage-2/assignments/copywriting-platform-supabase/PRD.md b/docs/zh-cn/stage-2/assignments/copywriting-platform-supabase/PRD.md new file mode 100644 index 0000000..246e23a --- /dev/null +++ b/docs/zh-cn/stage-2/assignments/copywriting-platform-supabase/PRD.md @@ -0,0 +1,361 @@ +# PRD:AI 营销文案 SaaS 平台 + +状态:Draft v0.1 +目标:先明确产品边界、页面结构、数据模型与支付闭环,再进入开发。 + +## 1. 项目定位 + +这是一个面向独立开发者、小团队和内容运营者的 AI 营销文案 SaaS。它不是单次调用模型的 Demo,而是一套带登录、生成、历史、套餐、后台管理的完整产品。 + +一句话定义: +做一个支持注册登录、文案生成、历史管理、套餐付费和后台运营的 AI 营销文案工作台。 + +系统总览: + +```mermaid +flowchart LR + WWW["www.xxx.com
官网前台"] --> API["应用 API / 管理 API"] + APP["app.xxx.com
用户工作台"] --> API + ADMIN["admin.xxx.com
后台管理台"] --> API + API --> AUTH["Supabase Auth"] + API --> DB["Supabase Postgres"] + API --> PAY["Stripe"] + API --> LLM["第三方大模型 API"] +``` + +## 1.1 技术选型建议 + +- 前端框架:`Next.js App Router` +- 用户鉴权:`Supabase Auth` +- 数据库:`Supabase Postgres` +- 支付:`Stripe` +- AI 能力:统一后端适配层对接第三方大模型 API + +站点入口约定: + +- 官网前台:`www.xxx.com` +- 用户工作台:`app.xxx.com` +- 后台管理台:`admin.xxx.com` + +## 1.2 竞品参考(官方) + +- [Jasper](https://www.jasper.ai/) +- [Copy.ai](https://www.copy.ai/) + +## 1.3 产品借鉴点 + +本项目的产品设计建议参考这些真实产品的做法: + +- 借鉴 `Jasper` 的官网表达方式:强调营销团队场景、价值主张、平台能力和 CTA 转化 +- 借鉴 `Jasper` 的工作台思路:让“生成”不是一个孤立按钮,而是一个带上下文和多种产出类型的工作空间 +- 借鉴 `Copy.ai` 的产品形态:把不同输出场景拆成清晰工作流,而不是把所有功能堆在一个输入框里 +- 因此本项目的首页、工作台、套餐页和后台运营页,都应该更像一个真实营销 SaaS,而不是单页工具 + +## 1.4 竞品页面拆解 + +建议重点参考的竞品页面结构: + +- `Jasper` 官网首页 + - 重点看:Hero、品牌价值表达、工作流/Agent 介绍、演示 CTA、企业化信任背书 +- `Jasper` 的 Agent / Workflow 类页面 + - 重点看:不是单纯展示一个文本框,而是强调“场景 -> 输入上下文 -> 输出结果”的完整工作流 +- `Copy.ai` 的 Workflow / GTM 类页面 + - 重点看:不同营销任务如何拆成不同工作区和模板入口 + +因此本项目建议页面设计不是“一个输入框 + 一个结果框”,而是: + +- 首页负责转化 +- 工作台负责结构化输入与输出管理 +- 历史页负责内容复用 +- 套餐页负责商业化 +- 后台负责运营视角 + +## 2. 目标用户与核心目标 + +目标用户: + +- 想快速生成营销文案的独立开发者 +- 需要批量产出广告、落地页、社媒文案的小团队 +- 管理套餐、用户和生成记录的管理员 + +核心目标: + +- 用户能在 5 分钟内注册并完成第一次文案生成 +- 用户能查看历史生成结果并二次编辑 +- 产品能完成从生成到支付升级的基本闭环 + +## 3. MVP 范围 + +第一版必须包含: + +- 官网首页 +- 注册/登录 +- 文案生成工作台 +- 历史记录页 +- 套餐页 +- 支付/订阅能力 +- 后台查看用户、生成记录和支付数据 + +第一版不做: + +- 团队协作 +- 多语言翻译链路 +- 复杂工作流编排 +- 模板市场 + +## 4. 角色与权限 + +| 角色 | 权限 | +|------|------| +| 游客 | 浏览官网、注册登录 | +| 注册用户 | 生成文案、查看历史、管理套餐 | +| 管理员 | 查看用户、生成数据、支付和运营数据 | + +## 5. 页面架构 + +当前 PRD 定义为 `3 套入口,10 个大页面`: + +- 官网前台 `1` 个大页面 +- 用户工作台 `5` 个大页面 +- 后台管理台 `4` 个大页面 + +### 官网前台 + +#### 1. 官网首页 `www:/` + +核心功能: + +- Hero 与 CTA +- 场景介绍 +- 输出示例 +- 套餐预览 +- FAQ + +### 用户工作台 + +#### 2. 登录页 `app:/login` + +核心功能: + +- 邮箱密码登录 +- 第三方登录 +- 跳转注册 + +#### 3. 注册页 `app:/register` + +核心功能: + +- 新用户注册 +- 同意条款 +- 注册完成跳转工作台 + +#### 4. 生成工作台 `app:/generate` + +核心功能: + +- 输入产品信息、受众、渠道、卖点 +- 选择输出类型和语气 +- 发起生成 +- 查看生成结果 +- 保存和再次编辑 + +#### 5. 历史记录页 `app:/history` + +核心功能: + +- 查看历史文案 +- 按时间/类型筛选 +- 再次打开、复制、删除 + +#### 6. 套餐页 `app:/billing` + +核心功能: + +- 查看 Free / Pro / Team 套餐 +- 月付/年付切换 +- 发起支付 +- 查看当前套餐权益 + +### 后台管理台 + +#### 7. 后台首页 `admin:/` + +核心功能: + +- 用户总数 +- 生成次数 +- 付费收入 +- 转化概览 + +#### 8. 用户管理 `admin:/users` + +核心功能: + +- 查看用户列表 +- 查看套餐状态 +- 查看最近活跃 +- 封禁/恢复 + +#### 9. 生成记录 `admin:/generations` + +核心功能: + +- 查看生成内容与次数 +- 查看失败记录 +- 查看高频模板和渠道分布 + +#### 10. 支付与订阅 `admin:/billing` + +核心功能: + +- 查看支付订单 +- 查看订阅状态 +- 查看退款与失败订单 + +## 5.1 关键用户链路 + +```mermaid +flowchart TD + visitor["访客"] --> home["官网首页"] + home --> register["注册 / 登录"] + register --> workspace["文案工作台"] + workspace --> generate["提交生成任务"] + generate --> result["查看生成结果"] + result --> history["保存到历史记录"] + workspace --> billing["升级套餐"] + billing --> pay["Stripe 支付"] + pay --> plan["套餐状态更新"] + plan --> workspace + plan --> admin["后台查看用户/生成/支付数据"] +``` + +关键状态流: + +- 游客 -> 注册用户 +- 免费用户 -> 付费用户 +- 生成中 -> 生成成功 / 生成失败 +- 订单处理中 -> 支付成功 / 支付失败 + +## 6. 后端实现 + +后端模块: + +- `auth` +- `generation` +- `history` +- `billing` +- `analytics` +- `admin` + +建议数据表: + +```sql +profiles ( + id uuid primary key, + email text, + role text, + plan text, + created_at timestamptz +) + +generation_records ( + id uuid primary key, + user_id uuid, + input_payload jsonb, + output_payload jsonb, + channel text, + tone text, + status text, + created_at timestamptz +) + +billing_records ( + id uuid primary key, + user_id uuid, + plan_code text, + billing_cycle text, + amount_cents int, + status text, + created_at timestamptz +) +``` + +## 6.1 后台指标与监控 + +后台建议至少查看这些指标: + +- 新增注册用户数 +- 日活跃生成用户数 +- 文案生成总次数 +- 生成成功率 / 失败率 +- 套餐转化率 +- 付费收入与退款率 +- 高峰时段生成请求量 + +基础监控建议: + +- 模型调用成功率 +- 接口平均耗时 +- 支付回调成功率 +- 数据库连接与慢查询 +- 关键任务错误日志 + +## 7. 功能清单 + +必须完成: + +- 官网价值展示 +- 注册/登录 +- 结构化文案输入 +- 文案生成结果展示 +- 历史记录管理 +- 套餐与支付 +- 后台用户与生成数据查看 + +可选增强: + +- 文案模板库 +- 不同语气/渠道预设 +- 结果二次编辑 +- 复制和导出 +- 团队共享工作区 + +## 8. 接口草案 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/auth/register` | 注册 | +| `POST` | `/api/auth/login` | 登录 | +| `POST` | `/api/generations` | 创建文案生成任务 | +| `GET` | `/api/generations/:id` | 获取生成结果 | +| `GET` | `/api/history` | 获取历史记录 | +| `DELETE` | `/api/history/:id` | 删除历史记录 | +| `GET` | `/api/billing/plans` | 获取套餐 | +| `POST` | `/api/billing/checkout` | 创建支付会话 | +| `GET` | `/api/admin/overview` | 获取后台总览 | +| `GET` | `/api/admin/users` | 获取用户列表 | +| `GET` | `/api/admin/generations` | 获取生成记录列表 | + +## 9. 非功能要求 + +- 生成过程要有清晰加载和失败反馈 +- 用户历史记录只能自己可见 +- 支付状态和套餐状态要一致 +- 后台能按日查看生成量和付费数据 +- 首页和工作台都需要移动端可用 + +## 10. 开发顺序建议 + +1. 搭官网和登录注册页 +2. 实现生成工作台 +3. 接入鉴权和数据库 +4. 接入模型生成接口 +5. 实现历史记录 +6. 接入支付与套餐 +7. 实现后台运营页 + +## 11. 待确认项 + +- 是否默认只做单次生成,不做批量生成 +- 支付是先做月付,还是月付和年付都做 +- 是否需要在第一版加入模板库 diff --git a/docs/zh-cn/stage-2/assignments/copywriting-platform-supabase/index.md b/docs/zh-cn/stage-2/assignments/copywriting-platform-supabase/index.md index e56d0e9..e277426 100644 --- a/docs/zh-cn/stage-2/assignments/copywriting-platform-supabase/index.md +++ b/docs/zh-cn/stage-2/assignments/copywriting-platform-supabase/index.md @@ -1,222 +1,158 @@ -# 大作业 1:第一个 SaaS 全栈应用——文案生成网站 +# AI 营销文案 SaaS 开发实战 -第一次做全栈网站,最容易卡住的地方往往不是代码,而是**不知道该做什么**。 +这个项目不再只是“写一个生成按钮”,而是围绕一份真实 PRD,把一个 AI 营销文案 SaaS 从想法推进到可上线产品。 -题目太大,功能太散,做到一半发现根本收不住。 +你会同时看到三件事: -所以这次换个思路:不给开放题,直接给你一个明确的方向——做一件完整但不复杂的事。 +- 项目要做成什么 +- 如何基于 PRD 拆解并推进开发 +- 最后应该交付出什么样的效果 -::: tip 🎯 这次做什么? -打造一个 **AI 营销文案工作台**。用户登录后填写产品信息,一键生成营销文案,自动保存历史记录。需要更多生成次数?升级套餐即可。管理员可在后台查看所有用户、生成记录和支付情况。 +::: tip PRD 入口 +本项目的需求文档在同级页面: [查看 PRD](./PRD.md) :::
-## 先看全景:你最终要做出来的不是“一个页面”,而是一条完整业务链路 +## 这个项目到底在做什么? -很多人第一次做全栈项目,最容易犯的错不是不会写代码,而是只盯着某一个页面,结果首页挺好看,后端没接上;生成按钮能点,历史记录没保存;支付能跳转,但数据库根本没更新。 +这是一个面向独立开发者和内容团队的 AI 营销文案 SaaS: -这个项目真正要交付的,是下面这条完整链路: +- 官网前台:负责产品介绍、定价、FAQ、注册转化 +- 用户工作台:负责输入产品信息、生成文案、查看历史、升级套餐 +- 后台管理台:负责用户、生成记录、支付数据和运营概览 + +后端需要接住这些关键能力: + +- 用户鉴权 +- 文案生成任务 +- 历史记录持久化 +- Stripe 支付 +- 后台用户和生成数据管理 + +## 开发过程怎么走? + +### 1. 先看 PRD,不要上来就写代码 + +先确认: + +- 有几个入口:`www / app / admin` +- 页面清单是否完整 +- 后端模块和数据表是否合理 +- 套餐、支付和后台范围是否收住 + +如果 PRD 没拍板,就先不要写代码。 + +### 2. 先让 AI 生成“骨架版” + +第一轮目标不是做完整闭环,而是先生成: + +- 官网首页 +- 登录注册 +- 文案生成工作台 +- 历史记录页 +- 套餐页 +- 后台首页与管理页骨架 + +这一步要先把页面结构、路由和信息架构搭出来。 + +### 3. 再进入“监工模式” + +你需要重点盯这几件事: + +- 页面结构是不是和 PRD 一致 +- 登录态和匿名态有没有分清 +- 生成结果有没有稳定落库 +- 支付之后套餐状态有没有更新 +- 后台是不是能看到真实用户、生成和支付数据 + +可以把 AI 当执行者,但你自己要做项目经理和验收人。 + +### 4. 最后做联调和上线 ```mermaid flowchart TD - visitor["访客"] --> home["首页 / 落地页"] - home --> auth["注册 / 登录"] - auth --> dashboard["用户工作台"] - dashboard --> generate["生成接口 /api/generate"] - generate --> llm["LLM 文案生成"] - generate --> generations["generations 表"] - dashboard --> history["历史记录读取"] - dashboard --> billing["套餐页 /billing"] - billing --> stripe["Stripe Checkout"] - stripe --> webhook["支付回调 Webhook"] - webhook --> subscriptions["subscriptions 表"] - subscriptions --> profile["profiles.plan 更新"] - profile --> admin["管理后台 /admin"] - admin --> report["查看用户 / 生成记录 / 支付状态"] + prd["PRD"] --> web["官网前台"] + prd --> app["用户工作台"] + prd --> admin["后台管理台"] + app --> auth["鉴权"] + app --> gen["文案生成任务"] + gen --> db["数据库"] + billing["支付与套餐"] --> db + admin --> analytics["用户 / 生成 / 支付看板"] ``` -只要上面这张图能跑通,你做的就不是课堂 Demo,而是一个真正像产品的最小 SaaS。 +只要这条链路能跑通,这个项目就不是单点 Demo,而是一个完整 SaaS 原型。 -## 为什么选这个题目? +## 怎么让 AI 帮你生成? -因为它恰到好处——**涵盖了现代网站该有的所有要素,又不会复杂到失控**。 - -- **前台有实际用途**:不是摆设,用户真的来解决问题 -- **用户系统有登录权限**:区分访客与注册用户 -- **核心功能是"生成"**:调用 AI 动态产出内容,而非展示静态页面 -- **数据持久化**:生成结果存入数据库,随时可查 -- **付费机制**:看起来像正经 SaaS,而非玩具项目 -- **管理后台**:体验管理员视角,掌控全局 - -难度适中:不会简单到只有一个表单,也不会复杂到做一周还找不着北。 - -### 先锁定项目边界,别一上来就做“大而全” - -为了让你真的能按时做完,这个项目建议你先只做 **最小可用版本**: - -- 只做 **邮箱注册 / 登录**,先不要接第三方 OAuth -- 支付只做 **免费版 + Pro 版** 两档,先不要做优惠券、年付月付切换 -- AI 生成功能只做 **单次文案生成**,先不要做批量任务队列 -- 管理后台先做 **查看**,暂时不要求复杂运营操作 -- 权限只区分 **user / admin** 两种角色 - -你会发现,真正难的不是“还能不能继续加功能”,而是“能不能先把主流程稳定交付”。 - -## 1. 定主题:先搞清楚要做什么 - -网站名称:**LaunchKit** - -定位:AI 营销文案工作台 - -目标用户:独立开发者、小商家、内容运营者,以及想快速搞定 Landing Page 的人。 - -他们来这里不是为了闲聊——就是想**快速拿到能用的营销文案**。 - -### 核心功能 - -别想太复杂,核心就一件事: - -**用户输入**:产品名、一句话介绍、目标用户、3 个卖点、投放渠道 - -**系统输出**:主标题、副标题、CTA 按钮文案、3 版短文案、1 版长文案 - -生成结果自动存入账户,下次登录随时查看。 - -### 页面规划 - -按这 6 个页面来做: - -| 页面 | 路径 | 说明 | -|------|------|------| -| 首页 | `/` | 清晰传达产品价值,放置注册/登录入口 | -| 登录页 | `/login` | 简洁的登录表单 | -| 注册页 | `/register` | 简洁的注册表单 | -| 工作台 | `/dashboard` | 填写信息、生成文案、查看结果 | -| 套餐页 | `/billing` | 展示免费版与 Pro 版,跳转 Stripe 付款 | -| 管理后台 | `/admin` | 管理员查看用户、生成记录、支付状态 | - -### 数据模型 - -三张核心表足够: - -```sql -profiles ( - id uuid primary key, - email text, - role text, -- user / admin - plan text, -- free / pro - created_at timestamptz -) - -generations ( - id uuid primary key, - user_id uuid, - product_name text, - target_channel text, - input_payload jsonb, - result_payload jsonb, - created_at timestamptz -) - -subscriptions ( - id uuid primary key, - user_id uuid, - stripe_customer_id text, - stripe_subscription_id text, - plan text, - status text, - created_at timestamptz -) -``` - -到这一步,整个网站的骨架已经清晰。 - -### 推荐开发顺序 - -不要按“想到什么做什么”,而要按依赖关系推进: - -```mermaid -flowchart LR - A["首页 / 登录 / Dashboard 骨架"] --> B["Supabase Auth"] - B --> C["profiles / generations / subscriptions"] - C --> D["生成接口 + 历史记录"] - D --> E["Stripe 支付 + 套餐限制"] - E --> F["Admin 后台"] - F --> G["部署 / README / 演示视频"] -``` - -这个顺序的好处是:每一步都能看到阶段性成果,也更容易排查问题。 - -
- - - -
- -## 2. 搭前台:先把页面做出来 - -这一步先别碰数据库,也别急着接支付——**先把前台骨架搭起来**。 - -### 技术栈 - -- **Next.js App Router** —— 现代 React 框架 -- **TypeScript** —— 类型安全 -- **Tailwind CSS** —— 原子化样式 -- **shadcn/ui** —— 精致组件库 -- **Supabase** —— 后端服务 -- **Stripe** —— 支付处理 - -这套组合是目前 AI IDE 最擅长的技术栈,也最符合现代 SaaS 的审美。 - -### 第一步:搭建项目骨架 - -把下面这段提示词丢给 Trae / Cursor / Claude Code: +推荐按模块逐步下指令,而不是一句“帮我做完”。 ```text -请帮我创建一个现代 SaaS 网站,名字叫 LaunchKit。 - -技术栈要求: -- Next.js App Router -- TypeScript -- Tailwind CSS -- shadcn/ui - -页面清单: -1. 首页 / -2. 登录页 /login -3. 注册页 /register -4. 用户工作台 /dashboard -5. 套餐页 /billing -6. 管理后台 /admin - -请先只做前端结构,不接数据库。 +请基于当前 PRD,帮我生成一个 AI 营销文案 SaaS 的前端骨架。 要求: -- 首页要有现代 AI SaaS 落地页的气质 -- 登录和注册页保持简洁 -- Dashboard 左侧表单,右侧结果展示 -- Billing 页面展示 free 和 pro 两个套餐 -- Admin 页面先做后台框架:侧边栏、顶部栏、表格区域 -- 使用 shadcn/ui 组件 -- 页面风格要像真实产品,不要像课堂 demo +1. 分成三个入口:www、app、admin +2. 官网包括:首页、定价、FAQ +3. app 包括:登录、注册、生成工作台、历史记录、套餐页 +4. admin 包括:后台首页、用户管理、生成记录、支付订单 +5. 先只生成页面结构和假数据,不接真实接口 +6. 风格要像现代 SaaS,不像课堂 demo ``` -### 第二步:完善工作台细节 +然后再一块一块补: + +- 鉴权 +- 生成接口 +- 数据库 +- 支付 +- 后台管理 + +## 怎么“监工”才有效? + +每做完一个模块,至少检查这 5 件事: + +| 检查项 | 要看什么 | +|------|------| +| 页面是否对 | 页面数量、入口、功能是否符合 PRD | +| 接口是否对 | 输入参数、返回结构、状态处理是否合理 | +| 权限是否对 | 游客、用户、管理员是否隔离 | +| 数据是否对 | 生成、历史、支付和套餐状态是否一致 | +| 演示是否对 | 是否真的能完整跑通注册、生成、升级这条链路 | + +## 最后的预期效果 + +做完后,你应该拿到这些交付物: + +- 一套可运行的 AI 文案 SaaS 项目 +- 一份同级 PRD 文档 +- 三套入口:`www / app / admin` +- 基础鉴权、生成、历史、支付、后台管理 +- 一份 README +- 一个可以演示的线上版本或本地完整运行方案 + +## 验收标准 + +| 维度 | 最低达标 | +|------|------| +| PRD 对齐 | 页面、功能、数据结构基本符合 PRD | +| 产品闭环 | 注册、生成、历史、支付升级可以跑通 | +| 后台能力 | 用户、生成、支付数据可以查看 | +| 工程完整度 | 前端、后端、数据库、支付链路已接通 | +| 展示能力 | 可以清楚演示“从 PRD 到成品”的过程 | + +::: tip 🚀 完成后你会得到什么? +你得到的不只是一个生成页面,而是一套完整的 AI SaaS 开发过程样例。后面再做别的产品型项目,也可以继续沿用这套“先 PRD、再生成、再监工、再联调上线”的方法。 +::: 第一版页面完成后,继续补充: diff --git a/docs/zh-cn/stage-2/assignments/custom-dify-agent-platform/PRD.md b/docs/zh-cn/stage-2/assignments/custom-dify-agent-platform/PRD.md new file mode 100644 index 0000000..6073d47 --- /dev/null +++ b/docs/zh-cn/stage-2/assignments/custom-dify-agent-platform/PRD.md @@ -0,0 +1,442 @@ +# PRD:类 Dify 智能体编排平台 + +状态:Draft v0.1 +目标:先把平台的 MVP 产品定义和实现边界写清楚,待 review 后再开发。 + +## 1. 项目定位 + +这是一个模仿 Dify 核心体验的精简版智能体平台,重点不是复刻全部能力,而是跑通下面这条主链路: + +- 创建智能体 +- 配置 Prompt 与模型参数 +- 发起对话 +- 查看调用日志 +- 可选接入知识库 + +一句话定义: +做一个类 Dify 的最小可用智能体编排平台。 + +系统总览: + +```mermaid +flowchart LR + WWW["www.xxx.com
官网前台"] --> API["应用 API / 管理 API"] + APP["app.xxx.com
用户控制台"] --> API + ADMIN["admin.xxx.com
后台管理台"] --> API + API --> AUTH["Supabase Auth"] + API --> DB["Supabase Postgres"] + API --> LLM["LLM Provider"] + API --> KB["知识库 / 文档处理"] +``` + +## 1.0 技术选型建议 + +- 前端框架:`Next.js App Router` +- 用户鉴权:`Supabase Auth` +- 数据库:`Supabase Postgres` +- 文件存储:`Supabase Storage` +- 模型层:统一后端适配层对接第三方 LLM + +站点入口约定: + +- 官网前台:`www.xxx.com` +- 用户控制台:`app.xxx.com` +- 后台管理台:`admin.xxx.com` + +## 1.1 竞品参考(官方) + +- [Dify](https://dify.ai/) +- [Dify Docs](https://docs.dify.ai/) + +## 1.2 产品借鉴点 + +本项目的产品设计建议参考 Dify 的真实产品形态: + +- 智能体管理、知识库、对话、日志应该是清晰分区,而不是混在一个页面里 +- 配置页应该突出 Prompt、模型、参数和发布状态,而不是只给一个表单 +- 对话页应该强调“当前正在使用哪个 agent”和“当前会话属于哪个 agent” +- 日志页应该能快速定位失败调用、耗时、token 消耗和错误原因 +- 整体设计应更像 AI 平台控制台,而不是普通聊天网站 + +## 1.3 竞品页面拆解 + +建议重点参考的竞品页面结构: + +- `Dify` 控制台首页 + - 重点看:应用列表、创建入口、最近活动、平台感导航 +- `Dify` 应用配置页 + - 重点看:Prompt、模型、参数、发布状态的组织方式 +- `Dify` 知识库页 + - 重点看:文档上传、状态、处理结果的管理方式 +- `Dify` 调试 / 预览页 + - 重点看:左侧配置、右侧运行结果的双栏思路 + +因此本项目的页面建议应更像平台控制台: + +- 智能体列表页像应用市场/应用管理 +- 配置页像控制台配置中心 +- 对话页像调试与预览台 +- 日志页像开发者运维页 + +## 2. 目标用户与核心目标 + +目标用户: + +- 想快速配置并测试多个智能体的开发者 +- 想搭建内部知识助手的学生或独立开发者 +- 需要查看模型调用记录的管理员 + +核心目标: + +- 用户 5 分钟内创建第一个智能体 +- 用户能在同一个平台里完成配置与对话 +- 平台可以追踪每次调用的输入、输出、耗时与状态 + +## 3. MVP 范围 + +第一版必须包含: + +- 注册/登录 +- 智能体 CRUD +- 对话页 +- 会话历史 +- 调用日志页 +- 可选知识库:仅支持文本文件上传与基础检索 + +第一版不做: + +- 复杂工作流节点编排 UI +- 多租户企业权限体系 +- 工具调用沙箱 +- 支付与计费 +- 多模型路由策略 + +## 4. 角色与权限 + +| 角色 | 权限 | +|------|------| +| 普通用户 | 管理自己的智能体、发起对话、看自己的日志 | +| 管理员 | 查看全平台用户和调用概览 | + +## 5. 前端实现 + +## 5.1 页面架构总览 + +当前 PRD 定义为 `3 套入口,10 个大页面`: + +- 官网前台 `1` 个大页面 +- 用户控制台 `7` 个大页面 +- 后台管理台 `2` 个大页面 + +### A. 官网前台 `www.xxx.com` + +#### 1. 官网首页 `www:/` + +核心功能: + +- 产品介绍 +- 能力说明 +- 使用场景 +- 注册/登录 CTA + +### B. 用户控制台 `app.xxx.com` + +#### 2. 登录页 `app:/login` + +核心功能: + +- 登录 +- 注册入口 +- 第三方登录 + +#### 3. 智能体列表页 `app:/agents` + +核心功能: + +- 查看所有智能体 +- 新建智能体 +- 编辑入口 +- 状态筛选 + +#### 4. 智能体配置页 `app:/agents/:id` + +核心功能: + +- 配置名称和描述 +- 配置 Prompt、模型、参数 +- 启停和发布状态 + +#### 5. 对话页 `app:/chat` + +核心功能: + +- 选择智能体 +- 新建会话 +- 聊天消息展示 +- 问答发送与结果展示 + +#### 6. 会话详情页 `app:/chat/:id` + +核心功能: + +- 查看完整消息历史 +- 重命名会话 +- 继续提问 + +#### 7. 知识库页 `app:/knowledge` + +核心功能: + +- 上传文档 +- 查看处理状态 +- 关联到智能体 + +#### 8. 日志页 `app:/logs` + +核心功能: + +- 查看调用日志 +- 按状态/模型筛选 +- 查看错误详情 + +### C. 后台管理台 `admin.xxx.com` + +#### 9. 后台首页 `admin:/` + +核心功能: + +- 用户数 +- 调用次数 +- 失败率 +- 平台资源概览 + +#### 10. 用户与调用概览页 `admin:/usage` + +核心功能: + +- 查看用户使用情况 +- 查看模型调用消耗 +- 查看异常用户和高成本调用 + +## 5.2 关键用户链路 + +```mermaid +flowchart TD + user["用户"] --> login["登录"] + login --> agents["智能体列表页"] + agents --> config["配置智能体"] + config --> publish["保存配置"] + publish --> chat["对话页"] + chat --> logs["调用日志页"] + config --> kb["知识库页"] + kb --> chat + logs --> admin["后台调用概览"] +``` + +关键状态流: + +- 智能体:草稿 -> 已配置 -> 可用 / 停用 +- 会话:新建 -> 进行中 -> 归档 +- 文档:上传中 -> 处理中 -> 可检索 / 失败 +- 调用:成功 / 错误 / 超时 + +推荐技术栈: + +- Next.js App Router +- TypeScript +- Tailwind CSS +- shadcn/ui + +建议页面: + +| 页面 | 路径 | 说明 | +|------|------|------| +| 登录页 | `/login` | 登录与注册 | +| 智能体列表 | `/agents` | 查看和管理智能体 | +| 智能体配置页 | `/agents/:id` | 编辑名称、Prompt、模型、温度等 | +| 对话页 | `/chat` | 左侧会话列表,右侧消息区 | +| 知识库页 | `/knowledge` | 上传资料、查看文档状态 | +| 日志页 | `/logs` | 查看模型调用日志 | +| 管理后台 | `/admin` | 用户数、调用数、失败数概览 | + +前端核心组件: + +- 智能体卡片列表 +- Agent 配置表单 +- 对话消息列表 +- Prompt 调试面板 +- 日志筛选表格 +- 文件上传组件 + +## 6. 后端实现 + +推荐技术栈: + +- Node.js + NestJS 或 Express +- PostgreSQL / Supabase +- OpenAI 兼容接口 + +后端模块: + +- `auth` +- `agents` +- `chat` +- `knowledge` +- `logs` +- `admin` + +建议数据表: + +```sql +profiles ( + id uuid primary key, + email text, + role text, + created_at timestamptz +) + +agents ( + id uuid primary key, + user_id uuid, + name text, + description text, + system_prompt text, + model text, + temperature numeric, + status text, + created_at timestamptz +) + +chat_sessions ( + id uuid primary key, + user_id uuid, + agent_id uuid, + title text, + created_at timestamptz +) + +chat_messages ( + id uuid primary key, + session_id uuid, + role text, + content text, + token_usage int, + created_at timestamptz +) + +knowledge_documents ( + id uuid primary key, + user_id uuid, + agent_id uuid, + filename text, + status text, + chunk_count int, + created_at timestamptz +) + +run_logs ( + id uuid primary key, + user_id uuid, + agent_id uuid, + session_id uuid, + model text, + latency_ms int, + prompt_tokens int, + completion_tokens int, + status text, + error_message text, + created_at timestamptz +) +``` + +## 6.1 后台指标与监控 + +后台建议至少查看这些指标: + +- 智能体总数 +- 活跃用户数 +- 日调用次数 +- 平均响应耗时 +- 模型调用失败率 +- 知识库文档处理成功率 +- 高消耗用户与高成本智能体 + +基础监控建议: + +- `/api/chat` 平均耗时与错误率 +- 模型供应商调用成功率 +- 知识库文档处理队列状态 +- 数据库连接和日志写入健康状态 + +## 7. 功能清单 + +必须完成: + +- 用户鉴权 +- 创建/编辑/删除智能体 +- 选择智能体发起会话 +- 会话消息持久化 +- 调用日志记录 + +第二优先级: + +- 文档上传 +- 基础检索增强 +- 平台概览统计 + +## 8. 接口草案 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/auth/register` | 注册 | +| `POST` | `/api/auth/login` | 登录 | +| `GET` | `/api/agents` | 获取当前用户的智能体列表 | +| `POST` | `/api/agents` | 创建智能体 | +| `PATCH` | `/api/agents/:id` | 更新智能体配置 | +| `DELETE` | `/api/agents/:id` | 删除智能体 | +| `POST` | `/api/chat/sessions` | 创建新会话 | +| `POST` | `/api/chat/sessions/:id/messages` | 向某个会话发送消息 | +| `GET` | `/api/chat/sessions/:id/messages` | 获取会话消息 | +| `POST` | `/api/knowledge/documents` | 上传知识库文档 | +| `GET` | `/api/logs` | 获取调用日志 | +| `GET` | `/api/admin/overview` | 平台总览 | + +`POST /api/chat/sessions/:id/messages` 请求示例: + +```json +{ + "agentId": "agent_123", + "message": "帮我总结一下这个功能的定位" +} +``` + +## 9. 关键业务规则 + +- 用户只能访问自己的智能体和会话 +- 删除智能体前需要检查是否有活跃会话 +- 日志中必须记录失败原因 +- 知识库文档处理失败要可见 + +## 10. 非功能要求 + +- 用户只能访问自己的智能体、文档和会话 +- 调用日志需要可追踪、可筛选 +- 文档处理状态要有明确反馈 +- 对话页在移动端至少可查看 +- 智能体配置修改后要有变更提示 + +## 11. 开发顺序建议 + +1. 登录与基础鉴权 +2. 智能体 CRUD +3. 对话页和会话存储 +4. 日志记录 +5. 文档上传与基础检索 +6. 管理后台概览 + +## 12. 待确认项 + +- 第一版是否必须带知识库 +- 模型供应商先只接 1 家还是预留多家 +- 平台是否需要 Workspace 概念 +- 日志是否保留完整 prompt 快照 diff --git a/docs/zh-cn/stage-2/assignments/custom-dify-agent-platform/index.md b/docs/zh-cn/stage-2/assignments/custom-dify-agent-platform/index.md index 751b10e..90c57b7 100644 --- a/docs/zh-cn/stage-2/assignments/custom-dify-agent-platform/index.md +++ b/docs/zh-cn/stage-2/assignments/custom-dify-agent-platform/index.md @@ -1,223 +1,128 @@ -# 自制 Dify 智能体平台 +# 类 Dify 智能体平台开发实战 -如果你已经会用 Dify,下一步最值得挑战的不是“再配一个工作流”,而是自己做一个“类 Dify 平台”。 +这个项目不是“再配一个聊天页”,而是围绕一份真实 PRD,把一个类 Dify 智能体平台从想法推进到可上线产品。 -这个大作业会带你完成一个简化但完整的智能体平台:支持创建智能体、配置 Prompt、接知识库、发起对话、查看日志和调用统计。 +你会同时看到三件事: -::: tip 🎯 这次做什么? -打造一个 **最小可用的智能体平台(Mini Dify)**。平台至少包含:智能体管理、会话问答、知识库接入(可选第一版简化)、调用记录与基础权限控制。目标是让用户能“创建一个智能体并真实对话”。 +- 项目要做成什么 +- 如何基于 PRD 拆解并推进开发 +- 最后应该交付出什么样的效果 + +::: tip PRD 入口 +本项目的需求文档在同级页面: [查看 PRD](./PRD.md) :::
-## 为什么这个题目值得做? +## 这个项目到底在做什么? -因为它几乎覆盖了 AI 应用工程化的核心能力: +这是一个模仿 Dify 核心体验的智能体平台: -- 从“调用一个模型”升级到“管理多个智能体” -- 从“单页 Demo”升级到“有后台、有数据、有权限的平台” -- 从“能回答”升级到“可配置、可追踪、可维护” +- 用户控制台:创建智能体、配置 Prompt、发起对话、查看日志 +- 平台后端:管理智能体、会话、消息、知识库和模型调用 +- 管理后台:查看用户和平台资源使用情况 -如果你未来想做 Agent 产品、企业知识助手或 AI SaaS,这个项目会是非常有含金量的一次训练。 +## 开发过程怎么走? -## 先看全景:平台核心模块 +### 1. 先看 PRD,不要上来就写代码 + +先确认: + +- 智能体、会话、日志、知识库哪些要进 MVP +- 页面和路由清单是否拍板 +- 模型调用和日志记录边界是否清楚 +- 多租户和复杂工作流是不是先不做 + +### 2. 先让 AI 生成“骨架版” + +第一轮先生成: + +- 登录页 +- 智能体列表页 +- 智能体配置页 +- 对话页 +- 日志页 +- 知识库页 +- 管理后台首页 + +### 3. 再进入“监工模式” + +你要重点盯这几件事: + +- 智能体是不是能被正确创建和编辑 +- 对话是不是使用了正确的 agent 配置 +- 会话和消息有没有稳定落库 +- 日志是不是记录了耗时、token、错误 +- 知识库和模型调用有没有串权限 + +### 4. 最后做联调和上线 ```mermaid -flowchart LR - user["平台用户"] --> web["Web 控制台"] - web --> auth["登录与鉴权"] - web --> agent["智能体管理"] - web --> chat["会话对话页"] - web --> logs["调用日志页"] - agent --> api["后端 API"] - chat --> api - logs --> api - api --> db["PostgreSQL"] - api --> llm["LLM Provider"] - api --> kb["知识库检索(可选第一版)"] - api --> trace["日志/成本统计"] +flowchart TD + prd["PRD"] --> app["用户控制台"] + prd --> admin["管理后台"] + app --> auth["鉴权"] + app --> agent["智能体配置"] + app --> chat["会话对话"] + chat --> llm["模型调用"] + chat --> db["数据库"] + app --> kb["知识库接入"] + admin --> logs["调用日志与平台概览"] + logs --> db ``` -核心目标只有一个:用户能在后台创建智能体,然后在对话页选择该智能体并得到可追踪的回答。 - -## 1. 定能力边界:第一版先收住 - -### MVP 范围(建议) - -- 用户注册/登录 -- 智能体 CRUD(创建、编辑、启停、删除) -- 每个智能体可配置:名称、系统提示词、模型、温度 -- 对话页可选择智能体进行聊天 -- 记录每轮会话和调用日志 - -### 第一版暂不做 - -- 多租户复杂权限 -- 复杂工作流编排器 -- 工具调用沙箱 -- 向量数据库高级检索策略 -- 计费系统与支付闭环 - -### 角色与页面规划 - -| 角色 | 页面 | 核心动作 | -|------|------|------| -| 普通用户 | `/agents` | 创建/编辑自己的智能体 | -| 普通用户 | `/chat` | 选择智能体并发起对话 | -| 普通用户 | `/logs` | 查看调用记录和错误信息 | -| 管理员(可选) | `/admin/users` | 查看用户与资源使用情况 | - -### 数据模型建议 - -```sql -profiles ( - id uuid primary key, - email text, - role text, -- user / admin - created_at timestamptz -) - -agents ( - id uuid primary key, - user_id uuid, - name text, - system_prompt text, - model text, - temperature numeric, - status text, -- active / inactive - created_at timestamptz -) - -conversations ( - id uuid primary key, - user_id uuid, - agent_id uuid, - title text, - created_at timestamptz -) - -messages ( - id uuid primary key, - conversation_id uuid, - role text, -- user / assistant - content text, - token_usage int, - created_at timestamptz -) - -llm_logs ( - id uuid primary key, - user_id uuid, - agent_id uuid, - model text, - latency_ms int, - prompt_tokens int, - completion_tokens int, - status text, -- success / error - error_message text, - created_at timestamptz -) -``` - -## 2. 搭平台骨架:前后端先跑起来 - -### 推荐技术栈 - -- **Next.js App Router**(前端 + 部分 BFF) -- **TypeScript** -- **Tailwind CSS + shadcn/ui** -- **Node.js + Express/NestJS**(如你想分离后端) -- **PostgreSQL / Supabase** -- **OpenAI / 兼容 OpenAI 协议模型接口** - -### 第一步:让 AI IDE 先搭骨架 +## 怎么让 AI 帮你生成? ```text -请帮我创建一个 Mini Dify 平台骨架(Next.js + TypeScript + Tailwind)。 - -页面要求: -1. /login 登录页 -2. /agents 智能体管理页(列表 + 新建弹窗) -3. /chat 对话页(左侧会话列表 + 右侧聊天区) -4. /logs 调用日志页(表格 + 状态筛选) - -后端要求: -- 提供 /api/agents、/api/chat、/api/logs 的基础接口 -- 所有接口只允许登录用户访问 - -先用 mock 数据跑通页面交互,再补真实数据库。 -``` - -### 第二步:补鉴权与数据库 - -你可以继续让 AI IDE 分步骤落地: - -```text -请把我当成 0 基础,带我完成 Mini Dify 的鉴权和数据库接入。 - -目标: -1. 用户可以注册、登录、退出 -2. 登录后才能访问 /agents、/chat、/logs -3. 创建 agents 表并实现新增/查询 -4. 只有 agent 所有者可编辑自己的 agent +请基于当前 PRD,帮我生成一个类 Dify 智能体平台的前端骨架。 要求: -- 说明每步修改了哪些文件 -- 明确需要在数据库后台操作的 SQL -- 完成后给我一份验证清单 +1. 用户侧包括:登录、智能体列表、智能体配置、对话页、日志页、知识库页 +2. 后台侧包括:后台首页、用户概览、资源使用概览 +3. 先只生成页面结构和假数据,不接真实接口 +4. 风格要像现代 AI 平台 ``` -## 3. 接智能体主链路:从“创建”到“回答” +## 怎么“监工”才有效? -### 智能体调用时序图 +| 检查项 | 要看什么 | +|------|------| +| 页面是否对 | 页面数量、功能是否符合 PRD | +| 接口是否对 | agents、chat、logs、knowledge 是否闭环 | +| 权限是否对 | 用户是否只能管理自己的 agent 和会话 | +| 数据是否对 | messages、logs、documents 是否一致 | +| 演示是否对 | 是否能演示“创建 agent -> 对话 -> 查看日志”完整链路 | -```mermaid -sequenceDiagram - autonumber - actor U as 用户 - participant FE as 前端对话页 - participant API as 后端 /api/chat - participant DB as 数据库 - participant LLM as 模型服务 +## 最后的预期效果 - U->>FE: 选择智能体并发送问题 - FE->>API: POST /api/chat {agentId, message} - API->>DB: 读取 agent 配置与历史消息 - API->>LLM: 组装 system prompt + 历史上下文 - LLM-->>API: 返回回答 - API->>DB: 保存 user/assistant 消息 + 日志 - API-->>FE: 返回回答内容 - FE-->>U: 渲染回复 -``` +- 一套可运行的类 Dify 平台 +- 一份同级 PRD 文档 +- 用户侧控制台 + 管理后台 +- 智能体、对话、日志、知识库基础能力 +- README 和演示方案 -### 第三步:实现聊天接口(最小版本) +## 验收标准 -第一版聊天接口建议做到: +| 维度 | 最低达标 | +|------|------| +| PRD 对齐 | 页面、功能、数据结构基本符合 PRD | +| 产品闭环 | 创建 agent、发起对话、查看日志可以跑通 | +| 后台能力 | 用户与平台使用概览可查看 | +| 工程完整度 | 前端、后端、数据库、模型调用链路已接通 | +| 展示能力 | 可以清楚演示“从 PRD 到成品”的过程 | -- 接收 `agentId` 和用户输入 -- 根据 `agentId` 加载对应系统提示词 -- 调用模型并返回结果 -- 将问答落库到 `messages` -- 将耗时/状态写入 `llm_logs` - -提示词示例: - -```text -请帮我实现 /api/chat 接口。 - -业务规则: -1. 必须校验用户是否已登录 -2. 必须校验 agent 属于当前用户 -3. 请求体包含 agentId 和 message +::: tip 🚀 完成后你会得到什么? +你得到的不只是一个聊天页,而是一套 AI 平台型产品的开发样例。后面做知识助手、企业 Agent、AI 控制台时,都可以继续复用这套方法。 +::: 4. 调用 LLM 前拼接系统提示词和最近 10 条上下文 5. 返回 assistant 内容并写入消息表 6. 无论成功失败都写一条 llm_logs diff --git a/docs/zh-cn/stage-2/assignments/exam-management-express/PRD.md b/docs/zh-cn/stage-2/assignments/exam-management-express/PRD.md new file mode 100644 index 0000000..41a987d --- /dev/null +++ b/docs/zh-cn/stage-2/assignments/exam-management-express/PRD.md @@ -0,0 +1,356 @@ +# PRD:在线考试与管理系统 + +状态:Draft v0.1 +目标:先明确角色、考试链路、后台管理和核心数据模型,再进入开发。 + +## 1. 项目定位 + +这是一个典型的多角色业务系统。它不只是答题页面,而是一整套包含学生端、管理端、题库、考试、提交记录和成绩处理的产品。 + +一句话定义: +做一个支持学生答题、管理员出卷、题库维护、成绩统计和后台管理的在线考试系统。 + +系统总览: + +```mermaid +flowchart LR + HOME["www.xxx.com
官网前台"] --> API["应用 API / 管理 API"] + STUDENT["app.xxx.com
学生端"] --> API + ADMIN["admin.xxx.com
管理后台"] --> API + API --> AUTH["JWT / Session Auth"] + API --> DB["PostgreSQL"] +``` + +## 1.1 技术选型建议 + +- 前端框架:`Next.js` 或 `React + Vite` +- 后端框架:`Node.js + Express` +- 数据库:`PostgreSQL` +- 鉴权:`JWT + Role-based Access Control` + +站点入口约定: + +- 官网前台:`www.xxx.com` +- 学生端:`app.xxx.com` +- 管理后台:`admin.xxx.com` + +## 1.2 竞品参考(官方) + +- [Canvas by Instructure](https://www.instructure.com/canvas) +- [Moodle LMS](https://moodle.com/products/lms/) + +## 1.3 产品借鉴点 + +本项目的产品设计建议参考这些真实教学产品: + +- 借鉴 `Canvas` 的信息分层:学生端和管理端职责清晰,不把所有功能放在同一个视图 +- 借鉴 `Moodle` 的题库与考试管理思路:题目、考试、提交、成绩应是独立模块 +- 学生侧页面应强调“考试状态、剩余时间、提交反馈” +- 管理端页面应强调“题库维护、考试发布、提交记录、统计面板” +- 设计上应更像真实 LMS/考试平台,而不是单一答题表单 + +## 1.4 竞品页面拆解 + +建议重点参考的竞品页面结构: + +- `Canvas` 的课程/作业/测验组织方式 + - 重点看:学生如何看到待完成事项、任务状态和结果反馈 +- `Moodle` 的题库与测验页 + - 重点看:题目、测验、提交记录这些模块如何拆开 +- `Moodle` 的后台管理体验 + - 重点看:题库管理、测验配置、成绩查看如何层次化呈现 + +因此本项目建议页面遵循: + +- 学生端强调“流程感” +- 管理端强调“配置感” +- 成绩页强调“结果感” +- 后台首页强调“概览感” + +## 2. 目标用户与核心目标 + +目标用户: + +- 参加考试和查看成绩的学生 +- 维护考试、题目、成绩和统计的管理员 + +核心目标: + +- 学生能顺利完成考试流程 +- 管理员能完成题库、考试和提交记录管理 +- 系统能稳定保存提交结果和成绩统计 + +## 3. MVP 范围 + +第一版必须包含: + +- 登录 +- 学生考试列表 +- 学生答题页 +- 提交结果与历史成绩 +- 管理后台 +- 题库管理 +- 考试管理 +- 提交记录与成绩查看 + +第一版不做: + +- 随机组卷 +- 复杂防作弊 +- 多校区多租户 +- 监考视频 + +## 4. 角色与权限 + +| 角色 | 权限 | +|------|------| +| 学生 | 查看考试、开始答题、提交试卷、查看成绩 | +| 管理员 | 管理题库、考试、提交记录和成绩统计 | + +## 5. 页面架构 + +当前 PRD 定义为 `3 套入口,10 个大页面`: + +- 官网前台 `1` 个大页面 +- 学生端 `4` 个大页面 +- 管理后台 `5` 个大页面 + +### 官网前台 + +#### 1. 官网首页 `www:/` + +核心功能: + +- 平台介绍 +- 登录入口 +- 考试说明 + +### 学生端 + +#### 2. 登录页 `app:/login` + +核心功能: + +- 账号密码登录 +- 找回密码入口 + +#### 3. 考试列表页 `app:/student/exams` + +核心功能: + +- 查看可参加考试 +- 查看考试状态与时间 +- 进入考试 + +#### 4. 答题页 `app:/student/exams/:id` + +核心功能: + +- 展示题目 +- 作答 +- 倒计时 +- 提交试卷 + +#### 5. 历史成绩页 `app:/student/history` + +核心功能: + +- 查看历史考试 +- 查看成绩与状态 +- 查看待复核情况 + +### 管理后台 + +#### 6. 后台首页 `admin:/` + +核心功能: + +- 考试总数 +- 学生提交数 +- 待批改数 +- 成绩概览 + +#### 7. 题库管理 `admin:/questions` + +核心功能: + +- 新增题目 +- 编辑题目 +- 分类筛选 +- 批量导入 + +#### 8. 考试管理 `admin:/exams` + +核心功能: + +- 创建考试 +- 绑定题目 +- 设置开始时间和时长 +- 发布/关闭考试 + +#### 9. 提交记录 `admin:/submissions` + +核心功能: + +- 查看学生提交 +- 查看答案详情 +- 人工复核 + +#### 10. 成绩统计 `admin:/scores` + +核心功能: + +- 查看考试平均分 +- 查看通过率 +- 查看题目错误率 + +## 5.1 关键用户链路 + +```mermaid +flowchart TD + student["学生"] --> login["登录"] + login --> list["考试列表"] + list --> start["开始考试"] + start --> answer["答题页"] + answer --> submit["提交试卷"] + submit --> score["成绩结果 / 待复核"] + admin["管理员"] --> bank["题库管理"] + bank --> exam["考试管理"] + exam --> publish["发布考试"] + publish --> list + submit --> review["提交记录"] + review --> scoreAdmin["成绩统计"] +``` + +关键状态流: + +- 考试:草稿 -> 已发布 -> 已关闭 +- 提交:进行中 -> 已提交 -> 已评阅 / 待复核 +- 学生成绩:未出分 -> 已出分 + +## 6. 后端实现 + +后端模块: + +- `auth` +- `exams` +- `questions` +- `submissions` +- `scores` +- `admin` + +建议数据表: + +```sql +profiles ( + id uuid primary key, + email text, + role text, + created_at timestamptz +) + +exams ( + id uuid primary key, + title text, + description text, + duration_minutes int, + status text, + created_at timestamptz +) + +questions ( + id uuid primary key, + type text, + stem text, + options jsonb, + correct_answer text, + score int, + created_at timestamptz +) + +submissions ( + id uuid primary key, + exam_id uuid, + student_id uuid, + status text, + total_score numeric, + submitted_at timestamptz +) +``` + +## 6.1 后台指标与监控 + +后台建议至少查看这些指标: + +- 已发布考试数 +- 已参加人数 +- 提交率 +- 平均分 / 通过率 +- 待复核题目数 +- 题目错误率 Top10 + +基础监控建议: + +- 登录成功率 +- 提交流程错误率 +- 自动判分耗时 +- 数据库写入失败率 + +## 7. 功能清单 + +必须完成: + +- 登录与角色鉴权 +- 学生考试列表 +- 学生答题与提交 +- 历史成绩查看 +- 题库管理 +- 考试管理 +- 提交记录查看 +- 成绩统计查看 + +可选增强: + +- 随机组卷 +- 批量导题 +- 班级维度统计 +- 成绩导出 + +## 8. 接口草案 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/auth/login` | 登录 | +| `GET` | `/api/exams` | 获取学生可见考试列表 | +| `GET` | `/api/exams/:id` | 获取考试详情 | +| `POST` | `/api/submissions/start` | 开始考试 | +| `POST` | `/api/submissions/:id/submit` | 提交试卷 | +| `GET` | `/api/student/history` | 获取历史成绩 | +| `GET` | `/api/admin/questions` | 获取题库 | +| `POST` | `/api/admin/questions` | 新增题目 | +| `GET` | `/api/admin/exams` | 获取考试列表 | +| `POST` | `/api/admin/exams` | 创建考试 | +| `GET` | `/api/admin/submissions` | 获取提交记录 | +| `GET` | `/api/admin/scores` | 获取成绩统计 | + +## 9. 非功能要求 + +- 学生端和管理员端权限必须严格隔离 +- 交卷后成绩和答题记录需稳定落库 +- 自动判分与人工复核状态要清晰 +- 后台统计口径要保持一致 +- 答题页在倒计时和断网提示上要有明确反馈 + +## 10. 开发顺序建议 + +1. 登录与角色鉴权 +2. 学生端考试列表和答题页 +3. 提交与成绩链路 +4. 管理后台题库和考试管理 +5. 提交记录和统计页 + +## 11. 待确认项 + +- 第一版是否只支持单选/判断/简答 +- 简答题是否只做人工复核 +- 是否要限制考试只能提交一次 diff --git a/docs/zh-cn/stage-2/assignments/exam-management-express/index.md b/docs/zh-cn/stage-2/assignments/exam-management-express/index.md index f83cf1f..ebcb297 100644 --- a/docs/zh-cn/stage-2/assignments/exam-management-express/index.md +++ b/docs/zh-cn/stage-2/assignments/exam-management-express/index.md @@ -1,222 +1,161 @@ -# 大作业 2:在线考试与管理系统 +# 在线考试与管理系统开发实战 -做完第一个 SaaS 项目后,下一步不只是“再做一个网站”,而是要进入更接近真实业务系统的场景。 +这个项目不是单纯的答题页面,而是围绕一份真实 PRD,把一个多角色业务系统从想法推进到可上线产品。 -在线考试系统就是一个很典型的练手题: +你会同时看到三件事: -- 前台不再只有一个工作台,而是有 **学生端完整考试流程** -- 后台不再只是看数据,而是要有 **题库管理、考试管理、成绩管理** -- 权限不再只是“登录/未登录”,而是要处理 **学生 / 管理员** 两种角色 -- 数据也不再是一张结果表,而是会涉及 **考试、题目、答卷、成绩、用户** 多种实体 +- 项目要做成什么 +- 如何基于 PRD 拆解并推进开发 +- 最后应该交付出什么样的效果 -::: tip 🎯 这次做什么? -打造一个 **在线考试与管理系统**。学生登录后可查看考试列表、开始答题、提交试卷、查看历史成绩;管理员可以创建考试、维护题库、查看提交记录,并根据题目规则完成自动判分或人工复核。 +::: tip PRD 入口 +本项目的需求文档在同级页面: [查看 PRD](./PRD.md) :::
-## 为什么这个题目值得做? +## 这个项目到底在做什么? -因为它特别适合练“业务系统思维”。 +这是一个典型的在线考试与管理系统: -你会发现,考试系统不是把几个页面摆在一起就结束了,它必须处理很多真实约束: +- 官网前台:负责平台介绍和登录入口 +- 学生端:负责考试列表、答题、提交和成绩查看 +- 管理后台:负责题库、考试、提交记录和成绩统计 -- 学生只能看到自己该看的考试和成绩 -- 管理员要能发布考试、维护题目、查看提交情况 -- 一场考试通常会有开始时间、结束时间、作答时长、是否允许重复提交等规则 -- 题目可能有单选、多选、判断、简答,不同题型的判分方式也不一样 +后端需要接住这些关键能力: -这些问题会逼着你第一次认真面对: +- 登录鉴权 +- 角色权限 +- 考试和题库管理 +- 提交流程与自动判分 +- 成绩和统计管理 -- **角色权限** -- **数据建模** -- **接口设计** -- **提交流程与状态流转** +## 开发过程怎么走? -这正是从“会写页面”到“会做系统”的关键一步。 +### 1. 先看 PRD,不要上来就写代码 -## 先看全景:这个系统到底由哪些部分组成? +先确认: + +- 角色是不是只收敛到 `student / admin` +- 页面清单是否完整 +- 题型、提交流程和批改范围是否拍板 +- 接口与数据表是否合理 + +如果 PRD 没拍板,就先不要写代码。 + +### 2. 先让 AI 生成“骨架版” + +第一轮先生成: + +- 登录页 +- 学生考试列表 +- 学生答题页 +- 学生成绩页 +- 后台首页 +- 题库管理页 +- 考试管理页 +- 提交记录页 +- 成绩统计页 + +先把页面结构、导航和信息架构搭出来。 + +### 3. 再进入“监工模式” + +你要重点盯这几件事: + +- 学生和管理员入口有没有分清 +- 登录后权限是不是隔离 +- 开始考试、作答、提交链路是不是闭环 +- 自动判分和人工复核边界是不是清楚 +- 管理端能不能看到真实提交记录和成绩统计 + +### 4. 最后做联调和上线 ```mermaid flowchart TD - student["学生"] --> studentPages["学生端页面"] - admin["管理员"] --> adminPages["管理端页面"] - studentPages --> auth["登录鉴权"] - adminPages --> auth - studentPages --> api["Express API"] - adminPages --> api - api --> exam["exams / questions"] - api --> submission["submissions / answers"] - api --> profile["users / profiles"] - api --> grading["自动判分 / 结果计算"] - grading --> score["scores / 统计"] - score --> studentPages - score --> adminPages + prd["PRD"] --> web["官网前台"] + prd --> student["学生端"] + prd --> admin["管理后台"] + student --> auth["鉴权"] + student --> exam["考试与作答"] + exam --> db["数据库"] + admin --> question["题库管理"] + admin --> submission["提交记录与成绩统计"] + question --> db + submission --> db ``` -你最终要交付的,不是一套静态页面,而是一套能让两类角色都跑通核心业务的系统。 +只要这条链路能跑通,这个项目就不是课堂作业,而是一套完整的业务系统原型。 -## 1. 定角色与范围:先把“做什么”说清楚 +## 怎么让 AI 帮你生成? -### 角色设计 - -这次只保留两种角色,先把范围收住: - -| 角色 | 核心动作 | -|------|------| -| 学生 | 登录、查看考试列表、开始答题、提交试卷、查看历史成绩 | -| 管理员 | 登录、创建考试、维护题库、查看提交记录、查看成绩统计 | - -### 核心页面规划 - -按下面这些页面来做,已经足够覆盖主要能力: - -| 页面 | 路径 | 说明 | -|------|------|------| -| 首页 | `/` | 说明平台用途,提供登录入口 | -| 登录页 | `/login` | 学生和管理员共用登录入口 | -| 学生考试列表 | `/student/exams` | 展示可参加的考试和状态 | -| 学生答题页 | `/student/exams/:id` | 显示题目、倒计时、提交按钮 | -| 学生成绩页 | `/student/history` | 查看历史考试记录和分数 | -| 管理后台首页 | `/admin` | 后台概览与导航 | -| 考试管理 | `/admin/exams` | 创建、发布、下线考试 | -| 题库管理 | `/admin/questions` | 新增和编辑题目 | -| 提交记录 | `/admin/submissions` | 查看学生提交和判分结果 | - -### 建议先做的业务边界 - -为了确保你能完成,第一版建议只做这些: - -- 题型先支持 **单选、判断、简答** 三种 -- 自动判分先覆盖 **单选、判断** -- 简答题先做 **人工复核**,或者展示“待批改” -- 每场考试先只允许 **提交一次** -- 不做复杂防作弊,不做随机组卷,不做监考录像 - -### 数据模型 - -推荐至少有下面这几张表: - -```sql -profiles ( - id uuid primary key, - email text, - role text, -- student / admin - created_at timestamptz -) - -exams ( - id uuid primary key, - title text, - description text, - duration_minutes int, - status text, -- draft / published / closed - created_by uuid, - created_at timestamptz -) - -questions ( - id uuid primary key, - type text, -- single / judge / short - stem text, - options jsonb, - correct_answer text, - score int, - created_at timestamptz -) - -exam_questions ( - id uuid primary key, - exam_id uuid, - question_id uuid, - sort_order int -) - -submissions ( - id uuid primary key, - exam_id uuid, - student_id uuid, - status text, -- in_progress / submitted / reviewed - total_score numeric, - submitted_at timestamptz -) - -submission_answers ( - id uuid primary key, - submission_id uuid, - question_id uuid, - answer_text text, - is_correct boolean, - score numeric -) -``` - -### 关键时序图 - -学生参加考试时,系统的主链路大致长这样: - -```mermaid -sequenceDiagram - autonumber - actor Student as 学生 - participant Frontend as 学生端页面 - participant API as Express API - participant DB as 数据库 - - Student->>Frontend: 进入考试列表页 - Frontend->>API: GET /api/exams - API->>DB: 查询已发布考试 - DB-->>API: 返回考试列表 - API-->>Frontend: 返回可参加考试 - Student->>Frontend: 点击开始考试 - Frontend->>API: POST /api/submissions/start - API->>DB: 创建 submission - API-->>Frontend: 返回试卷与 submissionId - Student->>Frontend: 作答并提交 - Frontend->>API: POST /api/submissions/:id/submit - API->>API: 自动判分客观题 - API->>DB: 保存答案与总分 - API-->>Frontend: 返回提交结果 -``` - -到这一步,你应该已经能看清这个作业的真正重点了:不是“页面多”,而是“状态和数据流更多”。 - -
- - - -
- -## 2. 搭前台:先让学生端和管理端“看得见、点得动” - -这一步先不要急着把所有后端写完,先把页面骨架搭出来。 - -### 推荐技术栈 - -- **Next.js / React**:负责前端页面 -- **TypeScript**:保证类型清晰 -- **Tailwind CSS + shadcn/ui**:快速搭建专业界面 -- **Express**:编写 REST API -- **PostgreSQL / Supabase Postgres**:存业务数据 - -### 第一步:让 AI IDE 先帮你起出页面骨架 +推荐按模块逐步下指令,而不是一句“帮我做完”。 ```text -请帮我创建一个在线考试与管理系统的前端页面骨架。 +请基于当前 PRD,帮我生成一个在线考试与管理系统的前端骨架。 + +要求: +1. 分成三个入口:www、app、admin +2. 官网包括:首页、登录入口 +3. 学生端包括:登录、考试列表、答题页、历史成绩 +4. 后台包括:后台首页、题库管理、考试管理、提交记录、成绩统计 +5. 先只生成页面结构和假数据,不接真实接口 +6. 风格要像真实业务系统,不像课堂 demo +``` + +然后再一块一块补: + +- 登录鉴权 +- 考试接口 +- 提交与判分 +- 题库管理 +- 成绩统计 + +## 怎么“监工”才有效? + +每做完一个模块,至少检查这 5 件事: + +| 检查项 | 要看什么 | +|------|------| +| 页面是否对 | 页面数量、入口、功能是否符合 PRD | +| 接口是否对 | 请求参数、返回结构、状态处理是否合理 | +| 权限是否对 | 学生和管理员权限是否隔离 | +| 数据是否对 | 题目、提交、成绩、统计是否一致 | +| 演示是否对 | 是否真的能演示完整考试闭环 | + +## 最后的预期效果 + +做完后,你应该拿到这些交付物: + +- 一套可运行的在线考试系统项目 +- 一份同级 PRD 文档 +- 三套入口:`www / app / admin` +- 登录、题库、考试、提交、成绩、后台管理 +- 一份 README +- 一个可以演示的线上版本或本地完整运行方案 + +## 验收标准 + +| 维度 | 最低达标 | +|------|------| +| PRD 对齐 | 页面、功能、数据结构基本符合 PRD | +| 产品闭环 | 登录、考试、提交、成绩查看可以跑通 | +| 后台能力 | 题库、考试、提交、成绩统计可以查看 | +| 工程完整度 | 前端、后端、数据库、判分链路已接通 | +| 展示能力 | 可以清楚演示“从 PRD 到成品”的过程 | + +::: tip 🚀 完成后你会得到什么? +你得到的不只是几个业务页面,而是一套完整的多角色系统开发样例。后面做教培、后台管理、内容平台项目时,都可以继续复用这套方法。 +::: 技术栈要求: - Next.js App Router diff --git a/docs/zh-cn/stage-2/assignments/modern-landing-page/PRD.md b/docs/zh-cn/stage-2/assignments/modern-landing-page/PRD.md new file mode 100644 index 0000000..2485268 --- /dev/null +++ b/docs/zh-cn/stage-2/assignments/modern-landing-page/PRD.md @@ -0,0 +1,758 @@ +# PRD:现代 AI 生图 SaaS 平台 + +状态:Draft v0.2 +目标:先完成可 review 的产品与实现方案,不进入开发。 + +## 1. 项目定位 + +这是一个现代化 AI 生图 SaaS 网站,产品体验参考 Midjourney、Leonardo、Playground 这类平台,但后端不训练自己的模型,而是对接第三方图像生成模型服务。 + +第一版要做的不是“一个展示页”,而是一套最小可用的产品闭环: + +- 官网落地页 +- 用户注册登录 +- Prompt 输入与图片生成 +- 图片历史记录与结果管理 +- 套餐/额度体系 +- 积分体系 +- 图片分享与公开展示 +- 点赞、评论、转发等互动能力 +- 管理后台 + +一句话定义: +做一个面向普通创作者和独立开发者的现代 AI 生图 SaaS 平台,前端提供官网、生成工作台和分享社区,后端对接第三方生图模型,支持注册登录、按套餐购买积分、图片分享与互动。 + +站点入口约定: + +- 官网前台:`www.xxx.com` +- 用户工作台:`app.xxx.com` +- 后台管理台:`admin.xxx.com` + +## 1.1 技术选型建议 + +当前默认技术方案: + +- 前端框架:`Next.js App Router` +- 用户鉴权:`Supabase Auth` +- 数据库:`Supabase Postgres` +- 文件存储:`Supabase Storage` +- 支付:`Stripe` +- 图像生成模型:通过统一后端适配层对接第三方模型 API + +默认原因: + +- `Supabase Auth + Supabase Postgres` 适合第一版 SaaS 快速落地 +- 用户系统、数据库、对象存储可以一起解决 +- 对 `app.xxx.com` 和 `admin.xxx.com` 两套前端都友好 +- 后续如果要拆独立服务,也保留扩展空间 + +默认鉴权设计: + +- 普通用户支持邮箱密码登录和第三方登录 +- 管理员使用同一套登录系统,但在用户表中标记 `role=admin` +- 后台管理台必须校验管理员权限 +- 用户前台与后台管理台接口分开鉴权 + +默认数据库设计: + +- 主业务库使用 `PostgreSQL` +- 用户、任务、支付、积分、社区内容、监控日志先放一套主库 +- 分析型查询先基于主库聚合,后续如数据量变大再拆分析库 + +系统总览: + +```mermaid +flowchart LR + WWW["www.xxx.com
官网前台"] --> API["应用 API / 管理 API"] + APP["app.xxx.com
用户工作台"] --> API + ADMIN["admin.xxx.com
后台管理台"] --> API + API --> AUTH["Supabase Auth"] + API --> DB["Supabase Postgres"] + API --> OSS["OSS 对象存储"] + API --> PAY["Stripe"] + API --> MODEL["第三方生图模型"] +``` + +## 2. 目标用户与核心目标 + +目标用户: + +- 想快速生成营销图、封面图、海报图的普通用户 +- 需要批量试 Prompt 的设计师或内容创作者 +- 喜欢浏览他人作品并进行互动的社区用户 +- 管理用户、任务和额度消耗的管理员 + +核心目标: + +- 用户可以在 3 分钟内完成注册并生成第一张图 +- 用户能清晰看到每次生成结果、积分消耗和历史记录 +- 用户可以把满意作品分享出来并获得互动反馈 +- 平台能支持积分购买、积分消耗、失败重试、内容互动和后台管理 + +建议北极星指标: + +- 新用户首图生成成功率 +- 日活跃生成用户数 +- 人均生成次数 +- 生成任务成功率 +- 付费转化率 +- 分享图片数 +- 点赞/评论互动率 +- 日活跃积分用户数 + +## 3. MVP 范围 + +第一版必须包含: + +- 官网首页 +- 注册/登录 +- 生图工作台 +- 图片历史页 +- 套餐/积分页 +- 积分页 +- 支付/订阅能力 +- 图片公开分享页 +- 点赞、评论、转发 +- 图片生成接口 +- 生成任务状态查询 +- 后台查看用户、生成任务、积分使用和内容互动情况 + +第一版不做: + +- 自训练模型 +- 多模型工作流编排 +- 图片编辑器 +- 团队协作 +- 多语言 + +## 4. 角色与权限 + +| 角色 | 权限 | +|------|------| +| 游客 | 浏览官网、查看产品介绍、注册登录 | +| 注册用户 | 创建生成任务、查看历史图片、管理自己的积分和结果、查看积分明细、分享作品、点赞评论转发 | +| 管理员 | 查看用户、任务状态、失败日志、套餐与积分消耗情况,管理积分规则、公开内容与互动数据 | + +## 5. 前端实现 + +推荐技术栈: + +- Next.js App Router +- TypeScript +- Tailwind CSS +- shadcn/ui + +前端形态说明: + +- 官网前台和用户工作台都属于“前端产品” +- 后台管理系统本质上也是前端页面,只是面向内部运营和管理员使用 +- 因此本项目会有两套前端界面: + - 面向用户的产品前台 + - 面向运营/管理员的后台管理台 +- 同时后台管理台需要配套独立的管理员接口与权限校验 + +入口建议: + +| 站点类型 | 建议入口 | 说明 | +|------|------|------| +| 官网前台 | `www.xxx.com` | 产品介绍、定价、FAQ、注册入口 | +| 用户工作台 | `app.xxx.com` | 登录后生成图片、看图库、看积分、发动态 | +| 后台管理台 | `admin.xxx.com` | 管理用户、套餐、任务、内容、风控 | + +## 5.1 页面架构总览 + +当前 PRD 定义为 `3 套入口,19 个大页面`: + +- 官网前台 `1` 个大页面 +- 用户工作台 `9` 个大页面 +- 后台管理台 `9` 个大页面 + +### A. 官网前台 `www.xxx.com` + +#### 1. 官网首页 `www:/` + +核心功能: + +- Hero 区与主 CTA +- 产品能力介绍 +- 作品展示 +- 套餐预览 +- FAQ +- 注册/登录/进入工作台入口 + +### B. 用户工作台 `app.xxx.com` + +#### 2. 登录页 `app:/login` + +核心功能: + +- 邮箱/密码登录 +- 第三方登录入口 +- 找回密码入口 +- 跳转注册页 + +#### 3. 注册页 `app:/register` + +核心功能: + +- 新用户注册 +- 同意协议与隐私政策 +- 第三方登录注册 +- 注册成功后进入工作台 + +#### 4. 生成工作台 `app:/generate` + +核心功能: + +- 输入 Prompt 与 Negative Prompt +- 选择模型、比例、数量、质量参数 +- 提交生图任务 +- 查看生成中/成功/失败状态 +- 对结果进行再次生成、收藏、发布 + +#### 5. 历史图库 `app:/gallery` + +核心功能: + +- 查看个人历史生成记录 +- 按时间/模型/状态筛选 +- 删除图片 +- 收藏图片 +- 从历史记录再次进入详情或复用 Prompt + +#### 6. 套餐页 `app:/billing` + +核心功能: + +- 查看 Basic / Standard / Pro / Mega 套餐 +- 月付/年付切换 +- 查看每档套餐包含的积分和权益 +- 发起购买套餐 +- 购买额外积分包 +- FAQ 与账号关联说明 + +#### 7. 积分页 `app:/points` + +核心功能: + +- 查看当前积分余额 +- 查看积分获取记录 +- 查看积分消耗记录 +- 每日签到 +- 积分兑换权益或生成次数 + +#### 8. 社区广场 `app:/explore` + +核心功能: + +- 浏览公开作品流 +- 按热门/最新排序 +- 点赞作品 +- 评论作品 +- 转发作品 +- 进入作品详情页 + +#### 9. 作品详情页 `app:/posts/:id` + +核心功能: + +- 查看单个作品大图 +- 查看作者信息与发布时间 +- 查看完整 Prompt 与参数 +- 查看点赞、评论、转发数据 +- 复制 Prompt / 再次生成 / 点赞 / 评论 / 转发 + +#### 10. 个人中心 `app:/settings` + +核心功能: + +- 查看个人资料 +- 绑定/关联账号 +- 查看当前套餐 +- 查看登录方式与安全设置 +- 管理公开分享偏好 + +### C. 后台管理台 `admin.xxx.com` + +#### 11. 后台首页 `admin:/` + +核心功能: + +- 用户总数 +- 生成任务总量 +- 支付收入概览 +- 内容分享与互动概览 +- 异常任务提醒 + +#### 12. 用户管理 `admin:/users` + +核心功能: + +- 查看用户列表 +- 搜索和筛选用户 +- 查看用户套餐、积分、活跃情况 +- 封禁/解封账号 +- 手动调整积分 + +#### 13. 任务管理 `admin:/tasks` + +核心功能: + +- 查看全部生成任务 +- 按状态筛选成功/失败/处理中任务 +- 查看失败原因 +- 手动重试或标记异常任务 + +#### 14. 内容管理 `admin:/posts` + +核心功能: + +- 查看公开作品列表 +- 审核作品是否可展示 +- 下架违规内容 +- 查看评论与互动记录 +- 审核或删除评论 + +#### 15. 套餐管理 `admin:/plans` + +核心功能: + +- 配置套餐价格 +- 配置月付/年付优惠 +- 配置套餐积分数 +- 配置积分包 top-up +- 配置并发和高级权益 + +#### 16. 支付订单 `admin:/billing` + +核心功能: + +- 查看支付订单列表 +- 查看订阅状态 +- 查看退款/失败订单 +- 搜索异常支付记录 + +#### 17. 运营配置 `admin:/operations` + +核心功能: + +- 配置签到积分规则 +- 配置分享/互动奖励规则 +- 配置活动公告 +- 配置风控和审核开关 + +#### 18. SaaS 指标看板 `admin:/analytics` + +核心功能: + +- 查看新增用户、DAU、WAU、MAU +- 查看注册转化率、付费转化率 +- 查看次日/7日/30日留存 +- 查看套餐分布和订阅续费情况 +- 查看积分发放、积分消耗、积分结余情况 +- 查看社区分享数、点赞率、评论率、转发率 + +#### 19. 系统监控页 `admin:/observability` + +核心功能: + +- 查看 API 调用量、成功率、错误率、平均耗时 +- 查看第三方生图模型调用情况 +- 查看数据库连接状态、慢查询和失败率 +- 查看支付接口回调状态 +- 查看任务队列积压和重试情况 +- 查看系统告警与异常日志 + +建议页面明细: + +| 页面 | 路径 | 说明 | +|------|------|------| +| 官网首页 | `www:/` | Hero、作品展示、功能介绍、价格方案、FAQ、CTA | +| 登录页 | `app:/login` | 登录表单 | +| 注册页 | `app:/register` | 注册表单 | +| 生成工作台 | `app:/generate` | Prompt、参数设置、任务提交、结果查看 | +| 历史图库 | `app:/gallery` | 查看历史图片、筛选、删除、收藏 | +| 套餐页 | `app:/billing` | 展示套餐档位、月付/年付、积分权益 | +| 积分页 | `app:/points` | 查看积分余额、获取记录、兑换规则 | +| 社区广场 | `app:/explore` | 浏览公开作品、点赞、评论、转发 | +| 作品详情页 | `app:/posts/:id` | 查看单张公开作品的详情与互动信息 | +| 个人中心 | `app:/settings` | 用户资料、积分、绑定信息 | +| 后台首页 | `admin:/` | 后台概览看板 | +| 用户管理 | `admin:/users` | 查看用户、封禁、积分与套餐状态 | +| 任务管理 | `admin:/tasks` | 查看生图任务、失败任务、重试情况 | +| 内容管理 | `admin:/posts` | 审核公开作品、评论、转发数据 | +| 套餐管理 | `admin:/plans` | 配置套餐、积分包、价格与权益 | +| 支付订单 | `admin:/billing` | 查看支付记录、退款状态、异常订单 | +| 运营配置 | `admin:/operations` | 配置签到规则、积分规则、公告与活动 | +| SaaS 指标看板 | `admin:/analytics` | 查看留存、转化、积分、订阅与社区活跃指标 | +| 系统监控页 | `admin:/observability` | 查看 API、模型调用、数据库、支付、队列状态 | + +前端核心组件: + +- Hero 区与 CTA +- Prompt 输入面板 +- 模型参数配置区 +- 图片结果卡片 +- 任务状态轮询组件 +- 图库列表/瀑布流 +- 套餐卡片组件 +- 月付/年付切换组件 +- 积分概览卡片 +- 积分明细列表 +- FAQ 折叠区 +- 公开作品卡片 +- 评论列表与评论输入框 +- 点赞/转发操作栏 +- 套餐价格卡片 +- 空态、加载、失败重试组件 +- 管理后台表格、筛选器、统计卡片、审核面板 +- 监控图表、趋势图、健康状态卡片、告警列表 + +前端状态与数据流: + +- 游客从首页进入注册或登录 +- 登录后进入 `/generate` +- 用户输入 Prompt 和参数后提交生成任务 +- 前端轮询或订阅任务状态 +- 成功后展示图片并写入历史记录 +- 用户完成签到、生成、分享、互动后可获得积分 +- 用户可将图片发布到公开广场 +- 其他用户可点赞、评论、转发该作品 +- 套餐页展示剩余积分、套餐差异与升级入口 +- 积分页展示积分来源、消费记录和兑换入口 +- 管理员从独立后台入口进入运营看板和管理模块 +- 管理员可在后台查看业务指标和系统健康状态 + +## 6. 后端实现 + +推荐技术栈: + +- Next.js Route Handlers 或 Node.js/Express +- PostgreSQL / Supabase +- 对接第三方图像生成模型 API + +后端模块: + +- `auth`:注册、登录、鉴权 +- `generation`:创建生图任务、查询任务状态、失败重试 +- `images`:图片历史、删除、收藏、详情 +- `points`:积分购买、累计、扣减、任务奖励、兑换记录 +- `billing`:套餐、支付记录、升级状态 +- `social`:公开发布、点赞、评论、转发 +- `analytics`:留存、转化、订阅、积分、社区活跃统计 +- `observability`:API 调用、模型调用、数据库状态、告警日志 +- `admin`:后台查看用户、任务、错误日志、审核内容、运营配置 + +核心数据流: + +```mermaid +flowchart TD + user["用户"] --> gen["提交生成任务"] + gen --> payCheck["检查套餐/积分"] + payCheck --> model["调用第三方生图模型"] + model --> oss["上传结果到 OSS"] + oss --> db["写入 Postgres: tasks / images / points"] + db --> gallery["历史图库 / 社区发布"] + gallery --> social["点赞 / 评论 / 转发"] + social --> db + db --> analytics["SaaS 指标看板"] + db --> observability["API / DB / Provider 监控"] +``` + +建议数据表: + +```sql +profiles ( + id uuid primary key, + email text, + role text, + plan text, + points int, + created_at timestamptz +) + +generation_tasks ( + id uuid primary key, + user_id uuid, + prompt text, + negative_prompt text, + model text, + aspect_ratio text, + image_count int, + status text, + error_message text, + provider_task_id text, + points_cost int, + created_at timestamptz +) + +generated_images ( + id uuid primary key, + task_id uuid, + user_id uuid, + image_url text, + width int, + height int, + is_favorite boolean, + created_at timestamptz +) + +billing_records ( + id uuid primary key, + user_id uuid, + plan_code text, + billing_cycle text, + type text, + amount_cents int, + points_delta int, + status text, + created_at timestamptz +) + +point_records ( + id uuid primary key, + user_id uuid, + type text, + points_delta int, + source text, + created_at timestamptz +) + +api_call_logs ( + id uuid primary key, + route text, + method text, + user_id uuid, + status_code int, + duration_ms int, + request_id text, + created_at timestamptz +) + +provider_call_logs ( + id uuid primary key, + provider_name text, + task_id uuid, + status text, + duration_ms int, + error_message text, + created_at timestamptz +) + +system_health_checks ( + id uuid primary key, + service_name text, + check_type text, + status text, + detail jsonb, + created_at timestamptz +) + +subscription_plans ( + id uuid primary key, + code text, + name text, + monthly_price_cents int, + yearly_price_cents int, + monthly_points int, + concurrent_image_jobs int, + concurrent_video_jobs int, + supports_hd_video boolean, + supports_stealth boolean, + created_at timestamptz +) + +shared_posts ( + id uuid primary key, + image_id uuid, + user_id uuid, + caption text, + visibility text, + repost_from_post_id uuid, + created_at timestamptz +) + +post_likes ( + id uuid primary key, + post_id uuid, + user_id uuid, + created_at timestamptz +) + +post_comments ( + id uuid primary key, + post_id uuid, + user_id uuid, + content text, + created_at timestamptz +) +``` + +## 7. 功能清单 + +必须完成: + +- 官网价值展示 +- 注册/登录 +- Prompt 输入与参数选择 +- 图片生成任务提交 +- 图片结果展示 +- 历史记录查看 +- 套餐/积分展示 +- 积分展示与明细 +- 支付/订阅 +- 图片公开分享 +- 点赞、评论、转发 +- 后台独立入口 +- 管理员查看任务、用户、支付和社区内容 +- 管理员审核公开内容与评论 +- 管理员配置积分规则与套餐规则 +- 后台查看 SaaS 留存、转化、积分与订阅指标 +- 后台查看 API 调用、模型调用和数据库健康状态 + +可选增强: + +- 图片收藏 +- 再次生成同款 +- Prompt 模板 +- 水印与下载规格选择 +- 任务失败自动重试 +- 评论通知 +- 个人主页与作品墙 +- 积分兑换生成次数或高级功能 + +## 8.1 套餐设计草案 + +套餐逻辑: + +- 用户购买的是 `积分型订阅套餐` +- 月付和年付两种计费方式 +- 年付默认比月付优惠 `20%` +- 套餐按月发放积分 +- 生成图片、生成视频、高清能力、并发能力由套餐共同决定 + +建议档位: + +| 套餐 | 月付 | 年付折后 | 每月积分 | 图片并发 | 视频并发 | 其他权益 | +|------|------|------|------|------|------|------| +| Basic | `$10` | `$8` | 2000 | 3 | 1 | 基础生图、可补充购买积分 | +| Standard | `$30` | `$24` | 8000 | 3 | 3 | 支持高清视频、无限慢速图像生成 | +| Pro | `$60` | `$48` | 18000 | 12 | 6 | 隐身生成、更多并发 | +| Mega | `$120` | `$96` | 40000 | 12 | 12 | 更高上限、适合高频创作用户 | + +补充说明: + +- 套餐价格和积分数值是第一版草案,后续可调整 +- 不同模型与分辨率对应不同积分消耗 +- 视频生成会比图片生成消耗更多积分 +- 支持额外购买积分包作为 top-up + +建议 FAQ 内容: + +- 我买了套餐但没生效怎么办? +- 月付和年付有什么差别? +- 积分用完了怎么办? +- 积分会不会过期? +- 账号能不能绑定多个登录方式? +- 哪些内容支持公开分享? + +## 9. 接口草案 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/auth/register` | 用户注册 | +| `POST` | `/api/auth/login` | 用户登录 | +| `POST` | `/api/auth/link-account` | 关联不同登录账号 | +| `GET` | `/api/me` | 获取当前用户资料与积分 | +| `GET` | `/api/points` | 获取积分余额和明细 | +| `POST` | `/api/points/check-in` | 每日签到获取积分 | +| `POST` | `/api/points/redeem` | 积分兑换权益或生成次数 | +| `POST` | `/api/generations` | 创建生图任务 | +| `GET` | `/api/generations/:id` | 获取任务状态和结果 | +| `GET` | `/api/gallery` | 获取当前用户历史图片 | +| `DELETE` | `/api/gallery/:id` | 删除某张图片 | +| `PATCH` | `/api/gallery/:id/favorite` | 收藏/取消收藏图片 | +| `GET` | `/api/billing/plans` | 获取套餐列表 | +| `POST` | `/api/billing/checkout` | 创建支付订单或订阅会话 | +| `POST` | `/api/billing/top-up` | 购买额外积分包 | +| `GET` | `/api/billing/records` | 获取消费与充值记录 | +| `POST` | `/api/posts` | 将一张图片发布为公开作品 | +| `GET` | `/api/posts` | 获取公开作品流 | +| `GET` | `/api/posts/:id` | 获取作品详情 | +| `POST` | `/api/posts/:id/likes` | 点赞作品 | +| `DELETE` | `/api/posts/:id/likes` | 取消点赞 | +| `POST` | `/api/posts/:id/comments` | 评论作品 | +| `POST` | `/api/posts/:id/repost` | 转发作品 | +| `GET` | `/api/admin/overview` | 获取后台总览 | +| `GET` | `/api/admin/users` | 获取用户列表与账户状态 | +| `GET` | `/api/admin/tasks` | 获取生成任务列表 | +| `GET` | `/api/admin/posts` | 获取公开作品与互动列表 | +| `GET` | `/api/admin/analytics/overview` | 获取新增、活跃、付费转化等核心 SaaS 指标 | +| `GET` | `/api/admin/analytics/retention` | 获取次日/7日/30日留存数据 | +| `GET` | `/api/admin/analytics/points` | 获取积分发放、消耗、结余数据 | +| `GET` | `/api/admin/analytics/subscriptions` | 获取订阅与套餐分布数据 | +| `PATCH` | `/api/admin/posts/:id/moderate` | 审核或下架公开作品 | +| `PATCH` | `/api/admin/comments/:id/moderate` | 审核或删除评论 | +| `GET` | `/api/admin/billing` | 获取支付订单与订阅记录 | +| `GET` | `/api/admin/plans` | 获取套餐与积分包配置 | +| `PATCH` | `/api/admin/plans/:id` | 更新套餐配置 | +| `GET` | `/api/admin/point-rules` | 获取积分规则 | +| `PATCH` | `/api/admin/point-rules` | 更新积分规则 | +| `GET` | `/api/admin/observability/apis` | 获取 API 调用量、错误率、耗时等监控数据 | +| `GET` | `/api/admin/observability/providers` | 获取第三方模型调用情况 | +| `GET` | `/api/admin/observability/database` | 获取数据库连接、慢查询、失败率 | +| `GET` | `/api/admin/observability/health` | 获取系统健康检查结果 | + +`POST /api/generations` 请求示例: + +```json +{ + "prompt": "a cinematic futuristic city at sunset, ultra detailed", + "negativePrompt": "blurry, low quality", + "model": "flux-dev", + "aspectRatio": "1:1", + "imageCount": 4 +} +``` + +## 10. 非功能要求 + +- 生成过程有明确状态反馈 +- 失败任务能提示原因 +- 移动端至少可查看和浏览历史结果 +- 首页具备现代 SaaS 视觉质量 +- 用户只能访问自己的图片和任务 +- 积分扣减逻辑要稳定可追踪 +- 积分发放与扣减逻辑要可审计 +- 公开内容需要有最小审核或风控预留能力 +- 互动接口需要防刷和限流预留 +- 管理后台关键指标需支持日/周/月维度查看 +- API 日志、数据库状态、第三方模型调用结果需可追踪 + +## 11. 开发顺序建议 + +1. 搭官网首页与登录注册页 +2. 实现用户鉴权 +3. 实现生成工作台 UI +4. 接入生图任务接口 +5. 实现历史图库 +6. 实现支付、套餐、积分与 FAQ 页 +7. 实现分享、点赞、评论、转发 +8. 实现独立后台入口与后台任务、用户、积分、支付、内容管理页 +9. 实现 SaaS 指标看板与系统监控页 + +## 12. 待确认项 + +- 第三方模型服务优先接哪一家 +- 图片是否允许公开分享 +- 后台是否必须使用独立二级域名,还是允许先用独立路由入口 +- 积分获取规则是签到 + 分享 + 互动,还是还要包含邀请奖励 +- 积分是否只用于生成消耗,还是还要兑换会员权益 +- 年付优惠是否固定为 `20%` +- 是否需要单独的积分包 top-up +- 鉴权是否接受默认方案:`Supabase Auth` +- 数据库是否接受默认方案:`Supabase Postgres` +- 留存与系统监控是否先做基础后台报表,后续再接专业监控平台 +- 评论是否允许二级回复 +- 转发是站内转发,还是还要带外链分享 +- 第一版是否需要人工审核公开作品 diff --git a/docs/zh-cn/stage-2/assignments/modern-landing-page/index.md b/docs/zh-cn/stage-2/assignments/modern-landing-page/index.md index ad7d0ed..013cfdb 100644 --- a/docs/zh-cn/stage-2/assignments/modern-landing-page/index.md +++ b/docs/zh-cn/stage-2/assignments/modern-landing-page/index.md @@ -1,228 +1,174 @@ -# 现代网页落地页 +# 现代 AI 生图 SaaS 开发实战 -很多同学会写功能页,但一到“让用户第一次看到就愿意注册”的落地页就卡住了。 +这个项目不再只是“做一个页面”,而是围绕一份真实 PRD,把一个 AI 生图 SaaS 从想法推进到可上线产品。 -这份大作业就是专门练这件事:你要做一个真正能承接流量、讲清价值、引导转化的现代落地页,而不是“看起来像作业”的静态展示页。 +你会同时看到三件事: -::: tip 🎯 这次做什么? -打造一个 **可上线的现代产品落地页**。页面需要包含价值主张、核心功能展示、用户证言、价格方案、FAQ、明确 CTA(注册/预约演示)以及基础数据埋点,最终可以用于真实投放或作品集展示。 +- 项目要做成什么 +- 如何基于 PRD 拆解并推进开发 +- 最后应该交付出什么样的效果 + +::: tip PRD 入口 +本项目的需求文档在同级页面: [查看 PRD](./PRD.md) :::
-## 为什么这个题目值得做? +## 这个项目到底在做什么? -因为落地页不是“前端练习题”,而是产品和增长的交叉点。 +这是一个参考 Midjourney 产品体验的现代 AI 生图 SaaS: -- 你会练到结构化表达:30 秒内让用户知道你是谁、你解决什么问题 -- 你会练到工程能力:组件化、响应式、性能优化、SEO 基础 -- 你会练到转化意识:CTA 设计、表单路径、埋点事件、A/B 迭代 +- 官网前台:负责产品介绍、定价、FAQ、注册转化 +- 用户工作台:负责 Prompt 输入、图片生成、图库、积分、套餐、社区互动 +- 后台管理台:负责用户、任务、支付、积分、内容审核、SaaS 指标和系统监控 -做完这个项目,你不仅能做“页面”,还能做“会转化的页面”。 +同时,后端需要接住这些关键能力: -## 先看全景:一张图看懂这个作业 +- 用户鉴权 +- 图片生成任务 +- OSS 对象存储 +- 积分与套餐支付 +- 图片分享、点赞、评论、转发 +- 留存、转化、API 调用、数据库状态监控 + +## 开发过程怎么走? + +### 1. 先看 PRD,不要上来就写代码 + +先把这几个问题看清楚: + +- 有几个入口:`www / app / admin` +- 有几个大页面 +- 每个页面的核心功能是什么 +- 后端模块和数据库表有哪些 +- 第一版哪些做,哪些不做 + +如果 PRD 没拍板,就不要开始开发。 + +### 2. 先让 AI 生成“骨架版” + +第一轮不是要它一次性写完,而是先生成: + +- 官网首页 +- 登录注册 +- 生图工作台 +- 历史图库 +- 套餐/积分页 +- 社区广场 +- 后台首页与管理页骨架 + +这一步的目标是:把信息架构、路由、页面分工先搭出来。 + +### 3. 再进入“监工模式” + +真正难的不是生成第一版,而是持续监工。 + +你要盯的重点包括: + +- 页面结构是不是和 PRD 一致 +- 前台、工作台、后台入口有没有分清 +- 鉴权是不是做对了 +- 普通用户和管理员权限有没有串 +- 积分、支付、生成任务的状态流是不是闭环 +- OSS 上传、数据库写入、任务状态更新是不是一致 +- 后台有没有 SaaS 指标和系统监控 + +可以把 AI 当成执行者,但你自己要做“产品经理 + 技术负责人 + QA”。 + +### 4. 最后做联调和上线 + +最后一轮不是补页面,而是把完整链路跑通: ```mermaid flowchart TD - ad["流量来源: 社媒 / 搜索 / 社群"] --> landing["落地页首页"] - landing --> value["价值主张区"] - landing --> features["功能展示区"] - landing --> social["用户证言 / 案例"] - landing --> pricing["价格与方案"] - landing --> faq["常见问题"] - value --> cta["主 CTA: 立即注册 / 预约演示"] - pricing --> cta - faq --> cta - cta --> form["注册/预约表单"] - form --> success["成功页 / 感谢页"] - form --> event["埋点事件上报"] + prd["PRD"] --> web["官网前台"] + prd --> app["用户工作台"] + prd --> admin["后台管理台"] + app --> auth["鉴权"] + app --> gen["图片生成任务"] + gen --> oss["OSS 对象存储"] + gen --> db["数据库"] + billing["支付与套餐"] --> db + social["分享 / 点赞 / 评论 / 转发"] --> db + admin --> analytics["SaaS 指标看板"] + admin --> observability["API / DB / Provider 监控"] ``` -这张图表达的核心是:你的目标不是把每个模块都写出来,而是让用户自然走到 CTA 并完成动作。 +只要这条链路能跑通,这个项目就不是“Demo 页面”,而是一个完整产品原型。 -## 1. 定定位:先把“做给谁看”讲清楚 +## 怎么让 AI 帮你生成? -### 建议你先写出这 4 句话 +推荐按模块逐步下指令,而不是一句“帮我做完”。 -1. 我们的产品是什么? -2. 目标用户是谁? -3. 用户最痛的一个问题是什么? -4. 用户看完页面后希望他做什么动作? - -### 项目边界(MVP) - -第一版请严格控制范围: - -- 只做 **单页落地页**,不要先做完整后台 -- CTA 先聚焦 **一个主动作**(注册或预约演示二选一) -- 只做 **一个核心受众**,不要同时覆盖所有人群 -- 先做静态内容 + 基础交互,不做复杂动画大片 -- 埋点只做关键 3~5 个事件,不做全链路数据平台 - -### 页面模块规划 - -| 模块 | 目标 | 最低要求 | -|------|------|------| -| Hero 区 | 5 秒内传达价值 | 标题、副标题、主 CTA、视觉主图 | -| 功能区 | 解释“怎么解决” | 3~6 个核心能力卡片 | -| 信任区 | 提升可信度 | 用户证言、Logo、案例之一 | -| 价格区 | 降低决策成本 | 至少两档方案,强调推荐方案 | -| FAQ | 处理犹豫 | 4~8 个高频问题 | -| Footer | 完整闭环 | 联系方式、隐私/条款入口 | - -## 2. 搭结构:先做骨架,再做精修 - -### 推荐技术栈 - -- **Next.js App Router** 或 **Vite + React** -- **TypeScript** -- **Tailwind CSS** -- **shadcn/ui**(可选) -- **Vercel Analytics / 自定义埋点** - -### 第一步:生成可运行的页面骨架 - -你可以先让 AI IDE 生成第一版结构: +例如先让它生成三套前端骨架: ```text -请帮我创建一个现代 SaaS 落地页(Next.js + TypeScript + Tailwind)。 - -页面区块: -1. 顶部导航(logo、锚点、登录、注册) -2. Hero 区(主标题、副标题、CTA) -3. 功能介绍区(6 张卡片) -4. 用户证言区 -5. 价格区(Free/Pro/Team) -6. FAQ 区(手风琴) -7. 页脚 +请基于当前 PRD,帮我生成一个现代 AI 生图 SaaS 的前端骨架。 要求: -- 风格现代、简洁,不要像课堂作业 -- 先实现响应式布局 -- 所有 CTA 有 hover/active 状态 -- 预留事件埋点函数 +1. 分成三个入口:www、app、admin +2. 官网包括:首页、定价、FAQ +3. app 包括:登录、注册、生成工作台、图库、套餐、积分、社区、作品详情、个人中心 +4. admin 包括:后台首页、用户管理、任务管理、内容管理、套餐管理、支付订单、运营配置、SaaS 指标、系统监控 +5. 先只生成页面结构和假数据,不接真实接口 +6. 风格参考 Midjourney,简洁、现代、带产品感 ``` -### 第二步:补齐文案与信息层级 +然后再一块一块补: -很多页面做不出转化,根因是信息顺序错了。你可以继续给 AI IDE: +- 鉴权 +- 数据库 +- OSS 上传 +- 支付 +- 积分系统 +- 社区互动 +- 后台统计和监控 -```text -请优化我的落地页文案结构,目标是提高注册转化率。 +## 怎么“监工”才有效? -背景: -- 目标用户:独立开发者和小团队 -- 核心价值:用 AI 自动生成营销内容 -- 主转化动作:点击“免费开始” +每做完一个模块,至少检查这 5 件事: -请输出: -1. Hero 标题 5 个备选 -2. 副标题 5 个备选 -3. CTA 按钮文案 5 个备选 -4. 每个功能卡片的一句话价值描述 -5. FAQ 建议问题列表 -``` +| 检查项 | 要看什么 | +|------|------| +| 页面是否对 | 页面数量、入口、功能是否符合 PRD | +| 接口是否对 | 请求参数、返回结构、状态处理是否合理 | +| 权限是否对 | 普通用户和管理员是否隔离 | +| 数据是否对 | 数据库、OSS、支付、积分是否一致 | +| 演示是否对 | 是否真的能给别人完整演示一条链路 | -### 第三步:加关键交互与状态 +如果发现 AI 写偏了,不要整页推翻,直接让它改具体模块。 -至少补齐这几项: +## 最后的预期效果 -- CTA 点击 loading 状态 -- 表单提交成功/失败反馈 -- 页面锚点平滑滚动 -- 移动端菜单展开/收起 -- 表单字段基础校验 +做完后,你应该拿到这些交付物: -## 3. 做转化:从“好看”走向“有效” - -### 最小埋点方案 - -建议先只做以下事件: - -| 事件名 | 触发时机 | 目的 | -|------|------|------| -| `view_hero` | 首屏展示 | 统计曝光 | -| `click_primary_cta` | 点击主 CTA | 统计主转化意图 | -| `view_pricing` | 价格区进入视口 | 评估价格区关注度 | -| `submit_lead_form` | 提交表单 | 统计核心转化 | -| `submit_lead_form_error` | 提交失败 | 发现转化阻塞点 | - -### 转化路径时序图 - -```mermaid -sequenceDiagram - autonumber - actor User as 访客 - participant Page as 落地页 - participant Form as 注册表单 - participant API as 提交接口 - participant Analytics as 埋点系统 - - User->>Page: 打开页面 - Page->>Analytics: view_hero - User->>Page: 点击主 CTA - Page->>Analytics: click_primary_cta - Page->>Form: 打开表单 - User->>Form: 填写并提交 - Form->>API: POST /api/leads - API-->>Form: success / error - Form->>Analytics: submit_lead_form 或 submit_lead_form_error - Form-->>User: 显示成功或失败反馈 -``` - -## 4. 上线交付:从“能跑”到“能展示” - -### 部署前检查 - -- Lighthouse 移动端性能建议 75+(第一版即可) -- 图片已压缩并使用现代格式 -- 标题、描述、OG 基础信息已配置 -- 所有 CTA 都有真实目标行为 -- 关键事件埋点可在控制台看到 - -### 交付物 - -- 线上链接(Vercel/Netlify 等) -- 项目仓库地址 -- 主要页面截图(桌面端 + 移动端) -- 60 秒演示视频(讲清目标用户与转化路径) -- README(启动方式、技术栈、埋点说明) +- 一套可运行的 AI 生图 SaaS 项目 +- 一份同级 PRD 文档 +- 三套入口:`www / app / admin` +- 基础鉴权、支付、积分、OSS、社区互动、后台管理 +- SaaS 指标看板和系统监控页 +- 一份 README +- 一个可以演示的线上版本或本地完整运行方案 ## 验收标准 -| 维度 | 最低达标 | 加分项 | -|------|------|------| -| 页面完整度 | Hero/功能/价格/FAQ/页脚完整 | 信息密度与视觉层级优秀 | -| 转化设计 | 有明确主 CTA 和提交流程 | CTA 文案与位置经过对比优化 | -| 工程质量 | 响应式正常、交互状态完整 | 组件拆分清晰、复用性高 | -| 数据意识 | 关键事件埋点可用 | 有初步转化漏斗分析 | -| 交付能力 | 可访问链接 + README + 演示视频 | Lighthouse、SEO、无障碍基础优化 | +| 维度 | 最低达标 | +|------|------| +| PRD 对齐 | 页面、功能、数据结构基本符合 PRD | +| 产品闭环 | 注册、购买积分、生成图片、查看历史、分享互动可以跑通 | +| 后台能力 | 用户、任务、支付、内容、积分、监控可以查看 | +| 工程完整度 | 前端、后端、数据库、OSS、支付链路都已接通 | +| 展示能力 | 可以清楚演示“从 PRD 到成品”的完整过程 | -## 提交前最后检查 - - - - -
    -
  • -
  • -
  • -
  • -
  • -
-
- -::: tip 🚀 完成后你会得到什么? -这会是你作品集中最“有商业味道”的页面之一。它证明你不只会做界面,还能围绕目标用户和转化结果来做产品页面。 +::: tip 🚀 做完这个项目,你会得到什么? +你得到的不只是一个页面,也不只是一个小功能,而是一套完整的 AI SaaS 产品开发过程样例。后面再做别的项目,你可以继续沿用这套“先 PRD、再生成、再监工、再联调上线”的方法。 ::: diff --git a/docs/zh-cn/stage-2/assignments/movie-recommendation-springboot/PRD.md b/docs/zh-cn/stage-2/assignments/movie-recommendation-springboot/PRD.md new file mode 100644 index 0000000..cbfee32 --- /dev/null +++ b/docs/zh-cn/stage-2/assignments/movie-recommendation-springboot/PRD.md @@ -0,0 +1,408 @@ +# PRD:Spring Boot 电影推荐系统 + +状态:Draft v0.1 +目标:明确推荐系统项目的最小可用边界和前后端分工。 + +## 1. 项目定位 + +这是一个“带推荐能力的电影站点”,不是纯展示页面。它需要把用户行为沉淀下来,并给出可解释推荐。 + +一句话定义: +做一个包含电影浏览、评分收藏、推荐结果与后台管理的电影推荐系统。 + +系统总览: + +```mermaid +flowchart LR + WWW["www.xxx.com
官网前台"] --> API["应用 API / 管理 API"] + APP["app.xxx.com
用户前台"] --> API + ADMIN["admin.xxx.com
后台管理台"] --> API + API --> AUTH["JWT Auth"] + API --> DB["MySQL"] + API --> REC["Recommendation Service"] +``` + +## 1.0 技术选型建议 + +- 前端框架:`React` 或 `Vue` +- 后端框架:`Spring Boot 3` +- 数据库:`MySQL` +- 鉴权:`JWT` +- 缓存:`Redis`(可选) + +站点入口约定: + +- 官网前台:`www.xxx.com` +- 用户前台:`app.xxx.com` +- 后台管理台:`admin.xxx.com` + +## 1.1 竞品参考(官方) + +- [Letterboxd](https://letterboxd.com/) +- [IMDb](https://www.imdb.com/) + +## 1.2 产品借鉴点 + +本项目的产品设计建议参考真实电影产品的做法: + +- 借鉴 `Letterboxd` 的社区化电影浏览体验:电影卡片、评分、收藏、个人记录要自然串起来 +- 借鉴 `IMDb` 的详情页信息组织:海报、简介、标签、评分、演员和关联内容分层展示 +- 推荐页不能只是一个列表,应当同时展示推荐理由 +- 个人中心要强调“我的评分 / 我的收藏 / 我的推荐偏好” +- 后台管理应像内容后台,而不是简单 CRUD 页面 + +## 1.3 竞品页面拆解 + +建议重点参考的竞品页面结构: + +- `Letterboxd` 首页与个人页 + - 重点看:电影浏览、评分记录、收藏和个人偏好的组织方式 +- `IMDb` 电影详情页 + - 重点看:海报、简介、标签、评分、演员与相关内容的层次 +- `IMDb` 排行榜和推荐内容区域 + - 重点看:卡片式展示和浏览路径设计 + +因此本项目建议: + +- 列表页更像内容浏览页 +- 详情页更像内容详情页 +- 推荐页更像“为你推荐” +- 后台页更像内容运营后台 + +## 2. 目标用户与核心目标 + +目标用户: + +- 浏览和筛选电影的普通用户 +- 愿意通过评分与收藏改善推荐结果的注册用户 +- 维护影片信息和推荐质量的管理员 + +核心目标: + +- 用户可以完成浏览、评分、收藏闭环 +- 系统可给出 TopN 推荐结果 +- 推荐结果要有基础可解释性 + +## 3. MVP 范围 + +第一版必须包含: + +- 注册/登录 +- 电影列表和详情 +- 搜索、分类、分页 +- 用户评分 +- 收藏电影 +- 推荐页 +- 管理后台维护电影数据 + +第一版不做: + +- 复杂协同过滤算法 +- 视频播放 +- 评论社区 +- 多维画像系统 +- 实时推荐流计算 + +## 4. 角色与权限 + +| 角色 | 权限 | +|------|------| +| 游客 | 浏览电影列表与详情 | +| 注册用户 | 评分、收藏、查看推荐 | +| 管理员 | 管理电影数据、查看推荐概览 | + +## 5. 前端实现 + +## 5.1 页面架构总览 + +当前 PRD 定义为 `3 套入口,9 个大页面`: + +- 官网前台 `1` 个大页面 +- 用户前台 `5` 个大页面 +- 后台管理台 `3` 个大页面 + +### A. 官网前台 `www.xxx.com` + +#### 1. 官网首页 `www:/` + +核心功能: + +- 产品介绍 +- 热门电影 +- 注册入口 + +### B. 用户前台 `app.xxx.com` + +#### 2. 登录页 `app:/login` + +核心功能: + +- 登录 +- 注册入口 + +#### 3. 电影列表页 `app:/movies` + +核心功能: + +- 浏览电影 +- 搜索和筛选 +- 分页 + +#### 4. 电影详情页 `app:/movies/:id` + +核心功能: + +- 查看海报和简介 +- 评分 +- 收藏 +- 查看标签和推荐理由 + +#### 5. 推荐页 `app:/recommendations` + +核心功能: + +- 查看个性化推荐 +- 查看推荐理由 + +#### 6. 个人中心 `app:/me` + +核心功能: + +- 查看评分历史 +- 查看收藏 +- 查看个人偏好 + +### C. 后台管理台 `admin.xxx.com` + +#### 7. 后台首页 `admin:/` + +核心功能: + +- 电影总数 +- 用户行为概览 +- 推荐效果概览 + +#### 8. 电影管理页 `admin:/movies` + +核心功能: + +- 新增电影 +- 编辑电影 +- 管理标签 + +#### 9. 推荐概览页 `admin:/recommendations` + +核心功能: + +- 查看推荐结果 +- 查看热门标签 +- 查看用户行为统计 + +## 5.2 关键用户链路 + +```mermaid +flowchart TD + visitor["访客"] --> list["电影列表页"] + list --> detail["电影详情页"] + visitor --> login["登录 / 注册"] + login --> rate["评分 / 收藏"] + rate --> reco["推荐页"] + reco --> me["个人中心"] + admin["管理员"] --> movies["电影管理页"] + movies --> recoAdmin["推荐概览页"] +``` + +关键状态流: + +- 用户:游客 -> 注册用户 +- 电影交互:未评分 -> 已评分 +- 推荐:冷启动 -> 有偏好推荐 + +推荐技术栈: + +- React 或 Vue +- TypeScript +- Ant Design / shadcn/ui + +建议页面: + +| 页面 | 路径 | 说明 | +|------|------|------| +| 首页 | `/` | 热门电影、推荐入口 | +| 电影列表页 | `/movies` | 搜索、筛选、分页 | +| 电影详情页 | `/movies/:id` | 简介、标签、评分、收藏 | +| 推荐页 | `/recommendations` | 个性化推荐列表 | +| 个人中心 | `/me` | 评分与收藏记录 | +| 管理后台 | `/admin/movies` | 电影维护 | + +前端关键组件: + +- 电影卡片 +- 搜索筛选栏 +- 评分组件 +- 收藏按钮 +- 推荐理由展示卡片 +- 后台表格和编辑弹窗 + +## 6. 后端实现 + +推荐技术栈: + +- Java 17 +- Spring Boot 3 +- Spring Web +- Spring Data JPA +- MySQL 8 +- JWT 鉴权 + +后端模块: + +- `auth` +- `movies` +- `ratings` +- `favorites` +- `recommendations` +- `admin` + +建议数据表: + +```sql +users ( + id bigint primary key auto_increment, + email varchar(120), + password_hash varchar(255), + role varchar(20), + created_at datetime +) + +movies ( + id bigint primary key auto_increment, + title varchar(200), + summary text, + release_year int, + poster_url varchar(500), + created_at datetime +) + +movie_tags ( + id bigint primary key auto_increment, + movie_id bigint, + tag varchar(50) +) + +ratings ( + id bigint primary key auto_increment, + user_id bigint, + movie_id bigint, + score int, + created_at datetime +) + +favorites ( + id bigint primary key auto_increment, + user_id bigint, + movie_id bigint, + created_at datetime +) + +recommendation_logs ( + id bigint primary key auto_increment, + user_id bigint, + strategy varchar(50), + result_count int, + created_at datetime +) +``` + +## 6.1 后台指标与监控 + +后台建议至少查看这些指标: + +- 电影总数 +- 日评分数 +- 收藏率 +- 推荐点击率 +- 热门标签分布 +- 冷启动用户占比 + +基础监控建议: + +- 推荐接口响应耗时 +- 评分写入成功率 +- 数据库慢查询 +- 缓存命中率(如果用了 Redis) + +## 7. 推荐策略 + +第一版推荐策略建议: + +- 基于标签偏好 +- 结合用户评分权重 +- 冷启动时叠加热门电影 +- 过滤已评分/已收藏电影 + +推荐结果应展示: + +- 推荐分值 +- 推荐理由 +- 对应标签 + +## 8. 接口草案 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/auth/register` | 注册 | +| `POST` | `/api/auth/login` | 登录 | +| `GET` | `/api/movies` | 电影列表,支持搜索与分页 | +| `GET` | `/api/movies/:id` | 电影详情 | +| `POST` | `/api/movies/:id/ratings` | 提交评分 | +| `POST` | `/api/movies/:id/favorite` | 收藏电影 | +| `DELETE` | `/api/movies/:id/favorite` | 取消收藏 | +| `GET` | `/api/recommendations` | 获取推荐结果 | +| `GET` | `/api/me/profile` | 获取用户资料和行为摘要 | +| `POST` | `/api/admin/movies` | 新增电影 | +| `PATCH` | `/api/admin/movies/:id` | 编辑电影 | + +`GET /api/recommendations` 返回示例: + +```json +{ + "items": [ + { + "movieId": 12, + "title": "Interstellar", + "score": 0.91, + "reason": "你近期给高分的科幻与冒险标签影片较多" + } + ] +} +``` + +## 9. 关键业务规则 + +- 每个用户对同一电影只保留一条评分 +- 收藏与评分都能影响推荐 +- 管理员接口必须单独鉴权 +- 推荐结果至少返回 10 条或当前可用最大值 + +## 10. 非功能要求 + +- 推荐结果应可解释 +- 列表与详情页加载要可接受 +- 管理员接口与普通用户接口权限严格分离 +- 推荐缓存和行为数据允许后续扩展 + +## 11. 开发顺序建议 + +1. 登录与用户体系 +2. 电影列表与详情 +3. 评分与收藏 +4. 推荐接口 +5. 后台管理页 + +## 12. 待确认项 + +- 前端选 React 还是 Vue +- 推荐解释文案是后端拼接还是前端渲染 +- 是否需要影片导入脚本 +- 后台是否要包含标签管理 diff --git a/docs/zh-cn/stage-2/assignments/movie-recommendation-springboot/index.md b/docs/zh-cn/stage-2/assignments/movie-recommendation-springboot/index.md index 1769a1f..87b3f95 100644 --- a/docs/zh-cn/stage-2/assignments/movie-recommendation-springboot/index.md +++ b/docs/zh-cn/stage-2/assignments/movie-recommendation-springboot/index.md @@ -1,294 +1,119 @@ -# 电影推荐网 (Spring Boot) +# Spring Boot 电影推荐系统开发实战 -推荐系统是最典型的“看起来简单,做起来很像真实业务系统”的题目。 +这个项目不是“做一个电影列表页”,而是围绕一份真实 PRD,把一个带推荐能力的内容产品从想法推进到可上线原型。 -这次大作业你会从“电影列表网站”升级到“可登录、可评分、可推荐、可管理”的完整产品原型。 +你会同时看到三件事: -::: tip 🎯 这次做什么? -打造一个 **电影推荐网站(Spring Boot)**。用户登录后可浏览电影、搜索筛选、评分收藏,并获得个性化推荐;管理员可维护电影数据、查看用户行为统计与推荐效果。 +- 项目要做成什么 +- 如何基于 PRD 拆解并推进开发 +- 最后应该交付出什么样的效果 + +::: tip PRD 入口 +本项目的需求文档在同级页面: [查看 PRD](./PRD.md) :::
-## 为什么这个题目适合 Stage 2? +## 这个项目到底在做什么? -因为它能一次性把你带过 5 个关键能力: +这是一个带推荐能力的电影网站: -- **后端工程化**:Controller / Service / Repository 分层 -- **数据建模**:用户、电影、标签、评分、推荐结果 -- **业务逻辑**:搜索筛选、评分行为、收藏与历史 -- **推荐算法入门**:规则推荐或协同过滤 -- **管理能力**:后台维护数据与查看指标 +- 用户可以浏览、搜索、评分、收藏电影 +- 系统根据用户行为给出推荐结果 +- 管理员可以维护电影数据和查看推荐效果 -做完后你不仅能讲“我写了个网站”,还能讲清楚“推荐是怎么跑起来的”。 +## 开发过程怎么走? -## 先看系统全景 +### 1. 先看 PRD,不要上来就写代码 -```mermaid -flowchart LR - user["用户端"] --> fe["Web 前端"] - admin["管理员"] --> adminfe["后台页面"] - fe --> api["Spring Boot API"] - adminfe --> api - api --> mysql["MySQL"] - api --> redis["Redis (可选缓存)"] - api --> rec["推荐服务层"] - rec --> feature["用户偏好特征"] - rec --> movieFeature["电影标签特征"] - rec --> result["推荐结果"] - result --> fe -``` +先确认: -```mermaid -sequenceDiagram - autonumber - actor U as 用户 - participant FE as 前端 - participant API as Spring Boot - participant REC as 推荐模块 - participant DB as MySQL +- 推荐策略是不是先用可解释版本 +- 页面和后台范围是否拍板 +- 用户行为数据要存哪些 +- 管理员要看哪些推荐效果指标 - U->>FE: 浏览电影并评分 - FE->>API: POST /api/ratings - API->>DB: 写入评分记录 - U->>FE: 打开“为你推荐” - FE->>API: GET /api/recommendations - API->>REC: 计算推荐候选 - REC->>DB: 读取用户偏好与电影标签 - DB-->>REC: 返回特征数据 - REC-->>API: 返回推荐列表 - API-->>FE: 返回电影卡片数据 -``` +### 2. 先让 AI 生成“骨架版” -## 1. 定边界:别一上来就做“工业级推荐系统” +第一轮先生成: -### 角色设计 - -| 角色 | 核心动作 | -|------|------| -| 普通用户 | 注册登录、浏览电影、搜索筛选、评分收藏、查看推荐 | -| 管理员 | 电影信息管理、标签管理、用户行为统计、推荐结果抽查 | - -### 核心页面规划 - -| 页面 | 路径 | 说明 | -|------|------|------| -| 首页 | `/` | 热门电影与推荐入口 | -| 登录/注册 | `/login` `/register` | 用户认证 | -| 电影列表 | `/movies` | 搜索、筛选、分页 | -| 电影详情 | `/movies/:id` | 简介、标签、评分、评论 | -| 推荐页 | `/recommendations` | 个性化推荐结果 | -| 收藏页 | `/favorites` | 收藏电影管理 | -| 管理后台 | `/admin` | 电影与标签维护、统计看板 | - -### 第一版推荐策略(建议) - -第一版只做一套简单但稳定的推荐规则: - -- 基于用户历史评分的 **标签偏好加权** -- 再叠加热门度分数(避免冷启动全空) -- 去掉用户已看/已评分电影 - -先把可解释、可跑通的推荐做出来,比复杂算法更重要。 - -## 2. 搭基础:先完成“非推荐功能闭环” - -### 推荐技术栈 - -- 后端:Spring Boot 3 + Spring Web + Spring Data JPA -- 数据库:MySQL 8 -- 缓存:Redis(可选) -- 前端:Vue/React 任一(可由 AI IDE 生成) -- 鉴权:JWT - -### 数据模型建议 - -```sql -users ( - id bigint primary key auto_increment, - email varchar(120), - password_hash varchar(255), - role varchar(20), -- user / admin - created_at datetime -) - -movies ( - id bigint primary key auto_increment, - title varchar(200), - summary text, - release_year int, - poster_url varchar(500), - created_at datetime -) - -movie_tags ( - id bigint primary key auto_increment, - movie_id bigint, - tag varchar(50) -) - -ratings ( - id bigint primary key auto_increment, - user_id bigint, - movie_id bigint, - score int, -- 1~5 - created_at datetime -) - -favorites ( - id bigint primary key auto_increment, - user_id bigint, - movie_id bigint, - created_at datetime -) -``` - -### 第一步:用 AI IDE 生成 Spring Boot 骨架 - -```text -请帮我搭建一个 Spring Boot 电影推荐网站后端骨架。 - -要求: -- Java 17 + Spring Boot 3 -- 分层结构:controller / service / repository / model / dto -- MySQL + JPA -- JWT 登录鉴权 - -接口优先实现: -1. 用户注册登录 -2. 电影列表查询(分页+关键词) -3. 电影详情 -4. 用户评分 -5. 收藏与取消收藏 - -请先给出目录结构和关键类清单,再逐步生成代码。 -``` - -### 第二步:补齐前端基础页面 - -```text -请帮我生成一个电影推荐网站前端页面骨架。 - -页面包括: - 首页 -- 电影列表页(筛选+分页) -- 电影详情页(评分+收藏) +- 电影列表页 +- 电影详情页 - 推荐页 - 个人中心 - 管理后台 -要求: -- 组件化开发 -- 有 loading、空态、错误提示 -- 先接 mock 接口,再切换真实 API -``` +### 3. 再进入“监工模式” -
- - - -
+你要重点盯这几件事: -## 3. 做推荐:先做“可解释推荐”,再做“更聪明推荐” +- 列表、详情、评分、收藏是不是闭环 +- 推荐结果是不是和行为数据联动 +- 推荐理由是不是可解释 +- 后台电影数据和用户行为是不是能查看 -### 推荐模块拆分建议 - -| 模块 | 职责 | -|------|------| -| CandidateService | 召回候选电影(未看、同标签、热门) | -| RankingService | 按偏好分数排序并截断 TopN | -| ExplainService | 生成“为什么推荐这部电影”文案 | -| RecommendationController | 对外提供推荐接口 | - -### 推荐流程图 +### 4. 最后做联调和上线 ```mermaid flowchart TD - A["读取用户评分历史"] --> B["统计用户标签偏好"] - B --> C["召回候选电影"] - C --> D["计算综合分数"] - D --> E["过滤已看电影"] - E --> F["生成 Top N 推荐"] - F --> G["返回推荐原因与标签命中"] + prd["PRD"] --> web["前端页面"] + web --> auth["用户鉴权"] + web --> movie["电影列表 / 详情"] + web --> behavior["评分 / 收藏"] + behavior --> reco["推荐逻辑"] + reco --> db["数据库"] + admin["后台管理"] --> db ``` -### 第三步:让 AI IDE 帮你实现推荐接口 +## 怎么让 AI 帮你生成? ```text -请帮我实现 Spring Boot 推荐接口 GET /api/recommendations。 - -业务规则: -1. 根据用户最近评分记录统计偏好标签权重 -2. 从同标签电影中召回候选 -3. 结合全站热门度做加权 -4. 去掉用户已经评分过的电影 -5. 返回前 12 条推荐,并附带推荐理由 +请基于当前 PRD,帮我生成一个 Spring Boot 电影推荐系统的前端骨架。 要求: -- Service 层拆分清晰 -- SQL 或 JPA 查询可读 -- 返回结构包含 movieId、title、score、reason -- 给出最小可跑通的单元测试示例 +1. 页面包括:首页、电影列表、电影详情、推荐页、个人中心、后台管理 +2. 先只生成页面结构和假数据,不接真实接口 +3. 风格要像真实内容产品,而不是课堂 demo ``` -### 第四步:补管理员统计页 +## 怎么“监工”才有效? -第一版至少展示这些指标: +| 检查项 | 要看什么 | +|------|------| +| 页面是否对 | 页面数量、功能是否符合 PRD | +| 接口是否对 | movies、ratings、favorites、recommendations 是否闭环 | +| 数据是否对 | 用户行为是否影响推荐结果 | +| 推荐是否对 | 推荐理由是否清晰、结果是否可解释 | +| 演示是否对 | 是否能演示“浏览 -> 评分 -> 推荐变化” | -- 总用户数 -- 总电影数 -- 最近 7 天评分次数 -- 推荐接口成功率与平均耗时 +## 最后的预期效果 -这样你可以快速发现系统是否健康,而不是“看起来能用但实际经常失败”。 +- 一套可运行的电影推荐系统 +- 一份同级 PRD 文档 +- 浏览、评分、收藏、推荐、后台管理 +- Spring Boot 后端与推荐逻辑 +- README 和演示方案 -## 4. 上线与交付 +## 验收标准 -### 交付物 +| 维度 | 最低达标 | +|------|------| +| PRD 对齐 | 页面、功能、数据结构基本符合 PRD | +| 产品闭环 | 浏览、评分、收藏、推荐可以跑通 | +| 后台能力 | 电影数据和推荐效果可查看 | +| 工程完整度 | 前端、后端、数据库、推荐接口已接通 | +| 展示能力 | 可以清楚演示“从 PRD 到成品”的过程 | -- Spring Boot 后端仓库(含数据库初始化脚本) -- 前端项目仓库(或单仓 monorepo) -- 可访问演示地址 -- README(本地启动、环境变量、部署方式) -- 60 秒演示视频 - -### 验收标准 - -| 维度 | 最低达标 | 加分项 | -|------|------|------| -| 基础功能 | 注册登录、电影浏览、评分收藏都可用 | 评论、观看历史等拓展功能 | -| 推荐质量 | 推荐列表可生成且有理由 | 支持冷启动策略与个性化解释 | -| 工程质量 | 接口分层清晰,错误可追踪 | 有单测与缓存优化 | -| 管理能力 | 管理员可维护电影和标签 | 有统计看板和告警阈值 | -| 交付能力 | 可部署、文档完整、可复现 | CI/CD 或自动化脚本 | - -## 提交前最后检查 - - - - -
    -
  • -
  • -
  • -
  • -
  • -
  • -
-
+::: tip 🚀 完成后你会得到什么? +你得到的不只是一个电影站,而是一套“内容 + 行为 + 推荐”型产品的开发样例。 +::: diff --git a/docs/zh-cn/stage-2/assignments/simple-grocery-microservices/PRD.md b/docs/zh-cn/stage-2/assignments/simple-grocery-microservices/PRD.md new file mode 100644 index 0000000..e8a1523 --- /dev/null +++ b/docs/zh-cn/stage-2/assignments/simple-grocery-microservices/PRD.md @@ -0,0 +1,393 @@ +# PRD:生鲜电商微服务系统 + +状态:Draft v0.1 +目标:先明确服务拆分、数据边界和交易主链路,再进入开发。 + +## 1. 项目定位 + +这是一个用来练微服务拆分和服务协作的电商系统。重点不是做复杂运营功能,而是跑通: + +- 商品浏览 +- 下单 +- 扣库存 +- 查订单 +- 管理端调库存 + +一句话定义: +做一个由网关、鉴权、商品、库存、订单协作完成交易闭环的生鲜电商微服务系统。 + +系统总览: + +```mermaid +flowchart LR + WWW["www.xxx.com
官网前台"] --> GW["API Gateway"] + APP["app.xxx.com
用户前台"] --> GW + ADMIN["admin.xxx.com
后台管理台"] --> GW + GW --> AUTH["Auth Service"] + GW --> CATALOG["Catalog Service"] + GW --> INVENTORY["Inventory Service"] + GW --> ORDER["Order Service"] +``` + +## 1.0 技术选型建议 + +- 前端框架:`Next.js` +- 网关:`Node.js + Express/Fastify` +- 服务层:`Node.js + Express/Fastify` +- 数据库:`PostgreSQL` +- 鉴权:`JWT` +- 编排:`Docker Compose` + +站点入口约定: + +- 官网前台:`www.xxx.com` +- 用户前台:`app.xxx.com` +- 后台管理台:`admin.xxx.com` + +## 1.1 竞品参考(官方) + +- [Instacart](https://www.instacart.com/) + +## 1.2 产品借鉴点 + +本项目的产品设计建议参考真实生鲜电商产品: + +- 借鉴 `Instacart` 的用户购物路径:从商品浏览到购物车、订单查看都应足够直接 +- 商品页和购物车页应强调价格、库存状态和操作反馈 +- 管理端页面应更像运营后台,突出商品、库存、订单状态管理 +- 前台页面不需要做得很复杂,但一定要把“下单链路”做顺 +- 微服务拆分服务于业务边界,前端体验要尽量像统一产品,而不是几个接口拼起来 + +## 1.3 竞品页面拆解 + +建议重点参考的竞品页面结构: + +- `Instacart` 首页与商品分类页 + - 重点看:分类、商品卡片、购物入口的清晰程度 +- `Instacart` 购物车与结算体验 + - 重点看:从商品到下单的路径是否顺畅 +- 电商后台常见商品/订单管理思路 + - 重点看:列表、状态筛选、库存调整这些基础运营动作 + +因此本项目建议: + +- 用户端更强调“快速下单” +- 管理端更强调“状态管理” +- 微服务架构隐藏在后台,前台体验仍应统一 + +## 2. 目标用户与核心目标 + +目标用户: + +- 浏览商品并下单的普通用户 +- 调整商品与库存的管理员 + +核心目标: + +- 用户下单链路完整可追踪 +- 库存与订单状态一致 +- 每个服务边界清晰,可独立维护 + +## 3. MVP 范围 + +第一版必须包含: + +- API Gateway +- Auth 服务 +- Catalog 服务 +- Inventory 服务 +- Order 服务 +- 用户端商品列表/详情/下单 +- 管理端商品与库存管理 + +第一版不做: + +- 真实支付 +- 优惠券和促销 +- 秒杀 +- 消息队列集群 +- 分布式事务框架 + +## 4. 角色与权限 + +| 角色 | 权限 | +|------|------| +| 普通用户 | 浏览商品、下单、查看自己的订单 | +| 管理员 | 商品上下架、库存调整、查看订单 | + +## 5. 前端实现 + +## 5.1 页面架构总览 + +当前 PRD 定义为 `3 套入口,9 个大页面`: + +- 官网前台 `1` 个大页面 +- 用户前台 `4` 个大页面 +- 后台管理台 `4` 个大页面 + +### A. 官网前台 `www.xxx.com` + +#### 1. 官网首页 `www:/` + +核心功能: + +- 品类入口 +- 活动区 +- 登录入口 + +### B. 用户前台 `app.xxx.com` + +#### 2. 商品列表页 `app:/products` + +核心功能: + +- 浏览分类 +- 查看商品卡片 +- 加入购物车 + +#### 3. 商品详情页 `app:/products/:id` + +核心功能: + +- 查看商品详情 +- 查看库存状态 +- 加入购物车 + +#### 4. 购物车页 `app:/cart` + +核心功能: + +- 查看购物车 +- 修改数量 +- 提交订单 + +#### 5. 订单页 `app:/orders` + +核心功能: + +- 查看我的订单 +- 查看订单状态 + +### C. 后台管理台 `admin.xxx.com` + +#### 6. 后台首页 `admin:/` + +核心功能: + +- 商品数 +- 库存预警 +- 订单概览 + +#### 7. 商品管理页 `admin:/products` + +核心功能: + +- 上下架商品 +- 编辑价格与分类 + +#### 8. 库存管理页 `admin:/inventory` + +核心功能: + +- 查看库存 +- 调整库存 + +#### 9. 订单管理页 `admin:/orders` + +核心功能: + +- 查看订单 +- 筛选状态 + +## 5.2 关键用户链路 + +```mermaid +flowchart TD + user["用户"] --> products["商品列表"] + products --> detail["商品详情"] + detail --> cart["购物车"] + cart --> order["提交订单"] + order --> inventory["库存扣减"] + inventory --> orders["我的订单"] + admin["管理员"] --> inventoryAdmin["库存管理"] + admin --> orderAdmin["订单管理"] +``` + +关键状态流: + +- 订单:待创建 -> 已创建 -> 已完成 / 已取消 +- 库存:可用 -> 预扣 -> 确认扣减 / 回滚 + +推荐技术栈: + +- Next.js +- TypeScript +- Tailwind CSS + +建议页面: + +| 页面 | 路径 | 说明 | +|------|------|------| +| 首页 | `/` | 商品列表与分类 | +| 商品详情 | `/products/:id` | 商品信息与加入购物车 | +| 购物车 | `/cart` | 确认下单 | +| 我的订单 | `/orders` | 查看订单历史 | +| 管理后台商品页 | `/admin/products` | 商品维护 | +| 管理后台库存页 | `/admin/inventory` | 库存调整 | +| 管理后台订单页 | `/admin/orders` | 订单列表与状态 | + +前端关键组件: + +- 商品卡片 +- 购物车抽屉/页面 +- 订单状态标签 +- 管理后台表格 +- 库存调整弹窗 + +## 6. 后端实现 + +推荐技术栈: + +- Node.js + Express/Fastify +- PostgreSQL +- Docker Compose + +服务拆分: + +| 服务 | 职责 | +|------|------| +| `api-gateway` | 统一路由、鉴权、聚合返回 | +| `auth-service` | 注册、登录、JWT 校验 | +| `catalog-service` | 商品信息、分类、上下架 | +| `inventory-service` | 库存查询、预扣、回滚 | +| `order-service` | 订单创建、状态流转、查询 | + +建议数据模型: + +```sql +users ( + id uuid primary key, + email text, + password_hash text, + role text, + created_at timestamptz +) + +products ( + id uuid primary key, + name text, + category text, + price_cents int, + status text, + created_at timestamptz +) + +inventory_items ( + id uuid primary key, + product_id uuid, + available_quantity int, + reserved_quantity int, + updated_at timestamptz +) + +orders ( + id uuid primary key, + user_id uuid, + total_amount_cents int, + status text, + created_at timestamptz +) + +order_items ( + id uuid primary key, + order_id uuid, + product_id uuid, + quantity int, + price_cents int +) +``` + +## 6.1 后台指标与监控 + +后台建议至少查看这些指标: + +- 下单成功率 +- 库存回滚次数 +- 热销商品排行 +- 订单状态分布 +- 库存预警数 + +基础监控建议: + +- 网关错误率 +- 鉴权服务成功率 +- 库存服务超时率 +- 订单创建失败率 + +## 7. 下单主链路 + +主流程: + +1. 用户提交订单 +2. Gateway 完成鉴权 +3. Order 服务校验商品 +4. Inventory 服务预扣库存 +5. Order 服务创建订单 +6. 成功则确认库存,失败则补偿回滚 + +关键规则: + +- 库存不足直接失败 +- 同一个订单只允许一次成功创建 +- 所有状态变化要可追踪 + +## 8. 接口草案 + +外部接口统一走 Gateway: + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/auth/register` | 注册 | +| `POST` | `/api/auth/login` | 登录 | +| `GET` | `/api/catalog/products` | 商品列表 | +| `GET` | `/api/catalog/products/:id` | 商品详情 | +| `POST` | `/api/orders` | 创建订单 | +| `GET` | `/api/orders/my` | 当前用户订单列表 | +| `GET` | `/api/orders/:id` | 订单详情 | +| `PATCH` | `/api/inventory/:productId` | 管理员调整库存 | +| `POST` | `/api/admin/products` | 管理员新增商品 | +| `PATCH` | `/api/admin/products/:id` | 管理员编辑商品 | + +`POST /api/orders` 请求示例: + +```json +{ + "items": [ + { "productId": "p1", "quantity": 2 }, + { "productId": "p2", "quantity": 1 } + ] +} +``` + +## 9. 非功能要求 + +- 本地一键启动 +- 服务之间日志可追踪 +- 接口返回结构统一 +- 关键链路有错误处理和补偿逻辑 + +## 10. 开发顺序建议 + +1. Monorepo/Workspaces 与 Gateway +2. Auth 服务 +3. Catalog 与 Inventory +4. Order 下单闭环 +5. 前端用户端与管理端 +6. Docker Compose 与文档 + +## 11. 待确认项 + +- 前端是否做购物车持久化 +- 服务间通信先用 HTTP 还是预留消息机制 +- 商品与库存是否拆独立数据库 +- 管理端是否允许直接修改订单状态 diff --git a/docs/zh-cn/stage-2/assignments/simple-grocery-microservices/index.md b/docs/zh-cn/stage-2/assignments/simple-grocery-microservices/index.md index 656020c..ba5f256 100644 --- a/docs/zh-cn/stage-2/assignments/simple-grocery-microservices/index.md +++ b/docs/zh-cn/stage-2/assignments/simple-grocery-microservices/index.md @@ -1,253 +1,119 @@ -# 简单买菜微服务网站 +# 生鲜电商微服务系统开发实战 -做完单体应用后,很多同学会进入一个新困惑:功能越来越多,代码还能写,但项目越来越难维护。 +这个项目不是“做一个买菜网站”,而是围绕一份真实 PRD,把一个微服务电商系统从想法推进到可运行原型。 -这个大作业的目标,就是让你在一个可控规模里,体验一次“从单体到微服务”的完整过程。 +你会同时看到三件事: -::: tip 🎯 这次做什么? -打造一个 **简单买菜微服务网站**。用户可以浏览商品、下单、查看订单;管理员可以管理商品与库存。后端拆成多个服务,通过 API 网关统一对外提供接口。 +- 项目要做成什么 +- 如何基于 PRD 拆解并推进开发 +- 最后应该交付出什么样的效果 + +::: tip PRD 入口 +本项目的需求文档在同级页面: [查看 PRD](./PRD.md) :::
-## 为什么这个项目值得做? +## 这个项目到底在做什么? -这个题目看起来是“买菜网站”,本质上练的是三个能力: +这是一个生鲜电商微服务系统: -- **拆服务**:学会按业务边界拆分,而不是按技术层硬拆 -- **控复杂度**:在多服务协作下保持清晰的接口和数据流 -- **做稳定链路**:让“下单 -> 扣库存 -> 查订单”能够稳定可追踪 +- 用户端负责浏览商品、下单、查看订单 +- 管理端负责商品、库存和订单管理 +- 后端按业务拆成网关、鉴权、商品、库存、订单服务 -这会直接影响你后续做电商、SaaS 后台、内容平台等多模块项目的上限。 +## 开发过程怎么走? -## 先看全景:系统由哪些模块组成? +### 1. 先看 PRD,不要上来就写代码 -```mermaid -flowchart LR - user["用户端 Web"] --> gateway["API Gateway"] - admin["管理端 Web"] --> gateway - gateway --> auth["Auth 服务"] - gateway --> catalog["商品服务"] - gateway --> order["订单服务"] - gateway --> inventory["库存服务"] - order --> inventory - catalog --> db1["Catalog DB"] - order --> db2["Order DB"] - inventory --> db3["Inventory DB"] - auth --> db4["User DB"] -``` +先确认: -这张图的核心意思是:前端不用直接找多个服务,只和网关交互。复杂性由网关和服务间协作承担。 +- 服务拆分是否拍板 +- 前台和管理端页面是否清楚 +- 下单、库存扣减和补偿策略是否明确 +- 第一版哪些复杂能力先不做 -## 1. 定边界:先把范围控制住 +### 2. 先让 AI 生成“骨架版” -### 建议服务拆分 +第一轮先生成: -第一版只保留 4 个核心服务: +- 用户端首页、商品页、购物车、订单页 +- 管理端商品、库存、订单管理页 +- API Gateway +- auth、catalog、inventory、order 四个服务骨架 -| 服务 | 职责 | -|------|------| -| `auth-service` | 登录、注册、令牌校验、角色识别 | -| `catalog-service` | 商品列表、商品详情、分类查询 | -| `inventory-service` | 库存查询、库存扣减、库存回滚 | -| `order-service` | 创建订单、查询订单、订单状态管理 | +### 3. 再进入“监工模式” -### 建议角色与页面 +你要重点盯这几件事: -| 角色 | 页面 | 关键动作 | -|------|------|------| -| 用户 | 首页、商品页、购物车、订单页 | 浏览商品、下单、看订单 | -| 管理员 | 商品管理、库存管理、订单管理 | 上下架商品、调库存、查看异常订单 | +- 网关路由是否正确 +- JWT 和角色权限是否正确 +- 商品和库存数据是否一致 +- 下单后库存和订单状态是否闭环 +- 失败补偿是否真的能回滚 -### 范围控制(一定要先做“能交付”的版本) - -- 只做最小支付模拟,不接真实支付网关 -- 不做复杂促销(满减、优惠券、拼团) -- 不做推荐算法,商品排序先按上架时间或销量 -- 不做分布式事务框架,先用“本地事务 + 失败补偿”思路 -- 不做消息中间件集群,第一版可同步调用 - -## 2. 架构与时序 - -### 请求路由链路 - -```mermaid -sequenceDiagram - autonumber - actor U as 用户 - participant FE as 前端 - participant GW as API Gateway - participant AUTH as Auth - participant CATALOG as Catalog - participant ORDER as Order - participant INV as Inventory - - U->>FE: 打开商品页并下单 - FE->>GW: POST /api/orders - GW->>AUTH: 校验 JWT - AUTH-->>GW: 用户身份合法 - GW->>ORDER: 创建订单请求 - ORDER->>INV: 扣减库存 - INV-->>ORDER: 扣减结果 - ORDER-->>GW: 订单创建成功 - GW-->>FE: 返回订单号和状态 -``` - -### 失败补偿思路(避免“扣了库存却没订单”) +### 4. 最后做联调和上线 ```mermaid flowchart TD - A["创建订单请求"] --> B["校验库存是否足够"] - B -->|不足| C["返回失败"] - B -->|充足| D["预扣库存"] - D --> E["写入订单记录"] - E -->|成功| F["确认扣减完成"] - E -->|失败| G["回滚库存"] - G --> H["记录补偿日志"] - F --> I["返回下单成功"] + prd["PRD"] --> fe["前端页面"] + fe --> gw["API Gateway"] + gw --> auth["Auth Service"] + gw --> catalog["Catalog Service"] + gw --> inventory["Inventory Service"] + gw --> order["Order Service"] + order --> inventory ``` -## 3. 推荐技术栈 - -- **前端**:Next.js + TypeScript + Tailwind CSS + shadcn/ui -- **服务端**:Node.js + Express / Fastify -- **网关**:Express Gateway 或自建 BFF 网关 -- **数据库**:PostgreSQL(每个服务独立库或独立 schema) -- **缓存(可选)**:Redis(热商品列表、会话短缓存) -- **部署**:Docker Compose(本地)+ Zeabur / Railway(云端) - -## 4. 分步实现路径(可直接照做) - -
- - - -
- -### 第一步:起项目骨架与网关 +## 怎么让 AI 帮你生成? ```text -请帮我搭建一个买菜微服务项目骨架。 +请基于当前 PRD,帮我生成一个生鲜电商微服务系统的项目骨架。 要求: -1. 创建 api-gateway、auth-service、catalog-service、inventory-service、order-service 五个服务目录 -2. 每个服务都包含最小可运行的 Express 入口 -3. gateway 支持把 /api/catalog/* 转发到 catalog-service,把 /api/orders/* 转发到 order-service -4. 使用 TypeScript -5. 给出本地启动脚本(可用 pnpm workspace 或 npm workspaces) +1. 生成前端用户端和管理端骨架 +2. 生成 api-gateway、auth-service、catalog-service、inventory-service、order-service 五个目录 +3. 每个服务先只做最小可运行入口 +4. 先不接真实数据库和支付 ``` -### 第二步:先做鉴权,再做业务接口 +## 怎么“监工”才有效? -先完成: +| 检查项 | 要看什么 | +|------|------| +| 页面是否对 | 页面数量、入口、功能是否符合 PRD | +| 接口是否对 | catalog、inventory、orders 是否闭环 | +| 权限是否对 | 用户与管理员权限是否隔离 | +| 数据是否对 | 商品、库存、订单状态是否一致 | +| 演示是否对 | 是否能演示“浏览 -> 下单 -> 查单 -> 管理库存” | -- 用户注册 / 登录 -- JWT 发放和校验中间件 -- 网关统一鉴权(白名单接口可放行) +## 最后的预期效果 -```text -请帮我实现 auth-service 的最小鉴权链路。 +- 一套可运行的生鲜电商微服务系统 +- 一份同级 PRD 文档 +- 用户端、管理端、网关和 4 个核心服务 +- JWT 鉴权、库存扣减、订单管理 +- README 和演示方案 -目标: -1. POST /register -2. POST /login -3. 输出 access token -4. gateway 中间件可以验证 token 并把 userId、role 注入请求上下文 -5. 提供一个受保护示例接口用于测试 -``` +## 验收标准 -### 第三步:商品与库存服务 +| 维度 | 最低达标 | +|------|------| +| PRD 对齐 | 页面、功能、数据结构基本符合 PRD | +| 产品闭环 | 浏览、下单、库存、查单可以跑通 | +| 后台能力 | 商品、库存、订单管理可以查看 | +| 工程完整度 | 前端、网关、服务、数据库链路已接通 | +| 展示能力 | 可以清楚演示“从 PRD 到成品”的过程 | -优先做这几个接口: - -- `GET /api/catalog/products` -- `GET /api/catalog/products/:id` -- `PATCH /api/inventory/:productId`(管理员) - -### 第四步:订单服务打通主链路 - -优先做下单和查单: - -- `POST /api/orders` -- `GET /api/orders/:id` -- `GET /api/orders/my` - -下单流程必须至少包含: - -1. 鉴权通过 -2. 校验商品和库存 -3. 创建订单 -4. 扣减库存 -5. 失败时回滚或补偿 - -### 第五步:管理端最小闭环 - -管理员界面先做三块就够: - -- 商品列表 + 上下架按钮 -- 库存调整表单 -- 订单列表(含状态筛选) - -### 第六步:部署与文档 - -至少完成: - -- 一份项目结构图 -- 一份服务启动说明 -- 一份关键接口说明 -- 一份本地联调步骤 - -## 5. 交付物要求 - -你至少要提交这些内容: - -- 可运行项目代码(网关 + 4 个服务 + 前端) -- 演示地址或本地可复现说明 -- README(含架构图、启动方式、接口概览) -- 60 秒到 120 秒演示视频 -- 关键页面截图(用户下单、管理员改库存、订单详情) - -## 6. 验收标准 - -| 维度 | 最低达标 | 加分项 | -|------|------|------| -| 架构清晰度 | 服务边界明确,网关可用 | 有统一错误码和服务间追踪日志 | -| 业务闭环 | 浏览商品 -> 下单 -> 查单跑通 | 有库存不足、下单失败等异常处理 | -| 权限控制 | 用户与管理员权限隔离 | 服务端接口也有角色校验,不只前端隐藏 | -| 工程质量 | 项目可启动、接口可调试 | 有 Docker Compose、一键启动脚本 | -| 交付完整度 | README、截图、演示视频齐全 | 有性能优化或缓存策略说明 | - -## 7. 提交前最后检查 - - - - -
    -
  • -
  • -
  • -
  • -
  • -
  • -
-
- -::: tip -这个作业最重要的不是“服务越多越好”,而是你能不能把边界、协作和失败处理讲清楚并做扎实。 +::: tip 🚀 完成后你会得到什么? +你得到的不只是一个电商练习题,而是一套微服务项目的开发样例。后面再做复杂后端系统时,这会非常有用。 ::: diff --git a/docs/zh-cn/stage-2/assignments/traffic-data-visualization-go/PRD.md b/docs/zh-cn/stage-2/assignments/traffic-data-visualization-go/PRD.md new file mode 100644 index 0000000..6e533b7 --- /dev/null +++ b/docs/zh-cn/stage-2/assignments/traffic-data-visualization-go/PRD.md @@ -0,0 +1,361 @@ +# PRD:Go 交通数据分析与可视化平台 + +状态:Draft v0.1 +目标:先明确数据产品的口径、模块和接口,再进入实现。 + +## 1. 项目定位 + +这是一个“数据接入 + 聚合分析 + 看板展示”的完整型项目。重点是把原始交通数据转换成可读的分析结果和告警。 + +一句话定义: +做一个支持事件接入、窗口聚合、异常检测和大屏展示的 Go 数据分析平台。 + +系统总览: + +```mermaid +flowchart LR + SOURCE["数据源 / 模拟器"] --> API["Go API"] + API --> RAW["原始数据表"] + RAW --> AGG["聚合任务"] + AGG --> ALERT["告警规则"] + AGG --> DASH["Dashboard API"] + ALERT --> DASH + ADMIN["admin.xxx.com
管理后台"] --> DASH +``` + +## 1.0 技术选型建议 + +- 后端框架:`Go + Gin/Fiber` +- 数据库:`PostgreSQL` +- 聚合任务:`robfig/cron` +- 前端:`React / Next.js` +- 图表:`ECharts` 或 `AntV` + +站点入口约定: + +- 分析看板:`app.xxx.com` +- 后台管理台:`admin.xxx.com` + +## 1.1 竞品参考(官方) + +- [TomTom Traffic Index](https://www.tomtom.com/traffic-index/) + +## 1.2 产品借鉴点 + +本项目的产品设计建议参考真实交通分析产品: + +- 借鉴 `TomTom Traffic Index` 的指标表达方式:趋势、拥堵程度、城市/路口排行应直观可读 +- 看板首页应优先展示关键指标和异常信息,而不是堆很多图 +- 趋势页、排行页、告警页要有清晰的分工 +- 管理端应强调数据导入、任务状态和告警处理,而不是只看静态图表 +- 整体设计要更像数据产品和运营看板,而不是普通后台列表 + +## 1.3 竞品页面拆解 + +建议重点参考的竞品页面结构: + +- `TomTom Traffic Index` 的总览页 + - 重点看:如何用少量关键指标快速建立全局认知 +- `TomTom Traffic Index` 的趋势和排名表达 + - 重点看:图表和排行如何帮助用户快速理解问题 +- 数据产品常见监控页 + - 重点看:告警、数据状态和任务状态如何分区展示 + +因此本项目建议: + +- 总览页强调关键指标 +- 趋势页强调时间变化 +- 告警页强调异常定位 +- 管理端强调数据导入和任务健康状态 + +## 2. 目标用户与核心目标 + +目标用户: + +- 关注交通趋势和拥堵状态的分析人员 +- 查看异常告警与处理结果的管理员 + +核心目标: + +- 原始数据可稳定接入 +- 聚合指标可查询 +- 告警可见、可处理 +- 可视化页面可支撑汇报和演示 + +## 3. MVP 范围 + +第一版必须包含: + +- 数据接入接口 +- 原始数据落库 +- 定时聚合任务 +- 异常检测规则 +- 趋势图、Top 路口、告警面板 +- 管理端数据导入或模拟数据入口 + +第一版不做: + +- Kafka/Flink 级流处理 +- 复杂 GIS 地图引擎 +- 机器学习预测模型 +- 多租户平台权限 + +## 4. 角色与权限 + +| 角色 | 权限 | +|------|------| +| 分析用户 | 查看看板、趋势、排行榜 | +| 管理员 | 导入数据、处理告警、查看任务状态 | + +## 5. 前端实现 + +## 5.1 页面架构总览 + +当前 PRD 定义为 `2 套入口,6 个大页面`: + +- 用户看板 `4` 个大页面 +- 后台管理台 `2` 个大页面 + +### A. 分析看板 `app.xxx.com` + +#### 1. 总览页 `app:/dashboard` + +核心功能: + +- 总车流 +- 当前告警数 +- 最拥堵路口 + +#### 2. 趋势页 `app:/dashboard/trend` + +核心功能: + +- 车流趋势图 +- 时间范围切换 + +#### 3. 路口排行页 `app:/dashboard/intersections` + +核心功能: + +- 拥堵排行 +- 关键路口指标 + +#### 4. 告警页 `app:/alerts` + +核心功能: + +- 查看告警 +- 筛选级别 +- 标记处理状态 + +### B. 后台管理台 `admin.xxx.com` + +#### 5. 数据导入页 `admin:/imports` + +核心功能: + +- 导入 CSV +- 查看导入任务状态 + +#### 6. 任务与告警管理页 `admin:/operations` + +核心功能: + +- 查看聚合任务状态 +- 查看告警处理记录 + +## 5.2 关键用户链路 + +```mermaid +flowchart TD + source["数据源"] --> ingest["接入接口"] + ingest --> raw["原始数据表"] + raw --> agg["聚合任务"] + agg --> trend["趋势页"] + agg --> rank["排行页"] + agg --> alerts["告警页"] + admin["管理员"] --> imports["数据导入页"] + imports --> ingest + admin --> ops["任务与告警管理页"] +``` + +关键状态流: + +- 数据事件:接收成功 / 校验失败 +- 聚合任务:待执行 -> 执行中 -> 成功 / 失败 +- 告警:新建 -> 已确认 -> 已处理 + +推荐技术栈: + +- React / Next.js +- ECharts / AntV +- TypeScript + +建议页面: + +| 页面 | 路径 | 说明 | +|------|------|------| +| 总览看板 | `/dashboard` | 今日流量、拥堵指数、告警数 | +| 趋势页 | `/dashboard/trend` | 分时趋势图 | +| 路口分析页 | `/dashboard/intersections` | Top 路口排行 | +| 告警页 | `/alerts` | 告警列表与处理状态 | +| 数据管理页 | `/admin/imports` | 导入数据、查看任务日志 | + +前端关键组件: + +- 指标卡片 +- 折线图/柱状图 +- 排行榜表格 +- 告警列表 +- 时间范围筛选器 + +## 6. 后端实现 + +推荐技术栈: + +- Go +- Gin 或 Fiber +- PostgreSQL +- robfig/cron + +后端模块: + +- `ingest` +- `aggregation` +- `alerts` +- `dashboard` +- `imports` +- `admin` + +建议数据表: + +```sql +raw_traffic_events ( + id bigserial primary key, + intersection_id text, + event_time timestamptz, + vehicle_count int, + avg_speed numeric, + source text, + created_at timestamptz +) + +traffic_agg_1m ( + id bigserial primary key, + intersection_id text, + window_start timestamptz, + total_vehicles int, + avg_speed numeric, + congestion_index numeric +) + +traffic_agg_5m ( + id bigserial primary key, + intersection_id text, + window_start timestamptz, + total_vehicles int, + avg_speed numeric, + congestion_index numeric +) + +alerts ( + id bigserial primary key, + intersection_id text, + level text, + rule_code text, + status text, + message text, + created_at timestamptz, + resolved_at timestamptz +) + +import_jobs ( + id bigserial primary key, + filename text, + status text, + total_rows int, + success_rows int, + failed_rows int, + created_at timestamptz +) +``` + +## 6.1 后台指标与监控 + +后台建议至少查看这些指标: + +- 接入事件总数 +- 聚合任务成功率 +- 告警总数与处理率 +- 热点路口排行 +- 导入任务成功率 + +基础监控建议: + +- 接入接口错误率 +- 聚合任务耗时 +- 数据库写入失败率 +- 看板查询接口耗时 + +## 7. 指标与规则 + +第一版指标: + +- 每分钟车流量 +- 每 5 分钟聚合车流量 +- 平均车速 +- 拥堵指数 +- Top10 拥堵路口 + +第一版告警规则: + +- 当前流量高于近 5 分钟均值阈值 +- 当前速度连续低于阈值 + +## 8. 接口草案 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/traffic/events` | 写入单条交通事件 | +| `POST` | `/api/traffic/import` | 上传 CSV 或批量导入 | +| `GET` | `/api/dashboard/overview` | 获取概览卡片数据 | +| `GET` | `/api/dashboard/trend` | 获取趋势图数据 | +| `GET` | `/api/dashboard/intersections/top` | 获取拥堵路口排行 | +| `GET` | `/api/alerts` | 获取告警列表 | +| `PATCH` | `/api/alerts/:id/resolve` | 处理告警 | +| `GET` | `/api/admin/import-jobs` | 获取导入任务状态 | + +`POST /api/traffic/events` 请求示例: + +```json +{ + "intersectionId": "A-101", + "timestamp": "2026-04-01T08:30:00+08:00", + "vehicleCount": 42, + "avgSpeed": 18.6, + "source": "simulator" +} +``` + +## 9. 非功能要求 + +- 聚合任务可重复执行且结果稳定 +- API 返回结构统一 +- 导入失败要能定位原因 +- 看板查询响应时间可接受 + +## 10. 开发顺序建议 + +1. Go API 骨架与数据表 +2. 事件接入接口 +3. 聚合任务 +4. 告警规则 +5. Dashboard 查询接口 +6. 前端图表页 + +## 11. 待确认项 + +- 是否提供 CSV 导入作为主要演示入口 +- 是否需要地图视图 +- 告警阈值是否写死还是后台可配 +- 前端图表库选 ECharts 还是 AntV diff --git a/docs/zh-cn/stage-2/assignments/traffic-data-visualization-go/index.md b/docs/zh-cn/stage-2/assignments/traffic-data-visualization-go/index.md index 5b14dc2..2d51f34 100644 --- a/docs/zh-cn/stage-2/assignments/traffic-data-visualization-go/index.md +++ b/docs/zh-cn/stage-2/assignments/traffic-data-visualization-go/index.md @@ -1,239 +1,120 @@ -# 交通大数据可视化分析 (Go项目) +# Go 交通数据分析平台开发实战 -很多同学学 Go 时会卡在一个问题:会写接口,但不知道怎么把“数据处理能力”和“业务展示能力”组合成一个完整项目。 +这个项目不是“写几个 Go 接口”,而是围绕一份真实 PRD,把一个数据接入、聚合、告警、可视化的产品原型推进出来。 -这个大作业就是为了解这个问题。你会做一个可运行的交通数据平台,从数据接入、清洗、聚合,到可视化展示和告警,一条链路走完。 +你会同时看到三件事: -::: tip 🎯 这次做什么? -打造一个 **交通大数据可视化分析平台(Go 后端)**。系统可以接收交通流量数据,完成时间窗口聚合与异常检测,并在可视化页面展示趋势、拥堵热力、路口排名和告警记录。 +- 项目要做成什么 +- 如何基于 PRD 拆解并推进开发 +- 最后应该交付出什么样的效果 + +::: tip PRD 入口 +本项目的需求文档在同级页面: [查看 PRD](./PRD.md) :::
-## 为什么这个项目值得做? +## 这个项目到底在做什么? -这个题目同时练了三种在真实项目里非常关键的能力: +这是一个 Go 交通数据分析平台: -- **工程能力**:Go 接口设计、并发处理、任务调度 -- **数据能力**:时间序列聚合、指标建模、异常检测 -- **产品能力**:把分析结果变成可读、可操作的可视化页面 +- 接收原始交通事件 +- 做窗口聚合 +- 计算趋势和拥堵指标 +- 生成告警 +- 在前端看板中展示结果 -做完后,你不只是“写了个后端”,而是能说清一个数据产品如何从输入走到决策。 +## 开发过程怎么走? -## 1. 项目全景与范围控制 +### 1. 先看 PRD,不要上来就写代码 -### 系统模块图 +先确认: -```mermaid -flowchart LR - source["数据源
路口设备 / CSV / 模拟器"] --> ingest["Go Ingest API"] - ingest --> clean["数据清洗与标准化"] - clean --> rawdb["原始数据表"] - clean --> agg["聚合任务(1m/5m/1h)"] - agg --> aggdb["聚合结果表"] - agg --> detect["异常检测任务"] - detect --> alertdb["告警表"] - aggdb --> dashboard["可视化看板"] - alertdb --> dashboard -``` +- 数据来源和字段是否拍板 +- 指标口径是否清楚 +- 告警规则是否先收敛到简单版本 +- 看板页面范围是否合理 -### 建议分析维度 +### 2. 先让 AI 生成“骨架版” -第一版只聚焦这些核心指标: +第一轮先生成: -- 时间窗口车流量(每分钟 / 每 5 分钟 / 每小时) -- 路口拥堵指数(可用速度反比或排队长度估算) -- TOP 拥堵路口排名 -- 异常突增告警(同比前 5 分钟或滑动均值) +- Go API 服务骨架 +- 数据接入接口 +- 聚合任务骨架 +- 总览看板、趋势页、告警页 -### 范围控制(防止项目失控) +### 3. 再进入“监工模式” -- 第一版不做实时流处理平台(如 Kafka/Flink 集群) -- 第一版不做复杂地图引擎,热力可先用网格或散点替代 -- 第一版不做机器学习预测,先用规则阈值异常检测 -- 第一版不做多租户权限系统,只保留普通用户 + 管理员 +你要重点盯这几件事: -## 2. 数据链路与时序 +- 原始数据是否正确入库 +- 聚合口径是否一致 +- 告警规则是否符合预期 +- 看板展示和后端数据是否一致 +- API 是否有统一返回结构和错误处理 -### 数据从接入到看板的主流程 - -```mermaid -sequenceDiagram - autonumber - participant Device as 数据源 - participant API as Go API - participant DB as PostgreSQL - participant Job as 聚合任务 - participant FE as Dashboard - - Device->>API: POST /api/traffic/events - API->>API: 参数校验与标准化 - API->>DB: 写入 raw_traffic_events - Job->>DB: 定时读取原始数据 - Job->>DB: 写入 traffic_agg_1m / traffic_agg_5m - Job->>DB: 写入 alerts - FE->>API: GET /api/dashboard/overview - API->>DB: 查询聚合结果与告警 - API-->>FE: 返回图表数据 -``` - -### 异常检测逻辑(简版) +### 4. 最后做联调和上线 ```mermaid flowchart TD - A["读取最近 10 分钟聚合值"] --> B["计算近 5 分钟均值"] - B --> C["当前值 > 均值 * 阈值?"] - C -->|否| D["正常,无告警"] - C -->|是| E["生成告警记录"] - E --> F["标记级别(低/中/高)"] - F --> G["写入 alerts 表"] + prd["PRD"] --> ingest["数据接入 API"] + ingest --> raw["原始数据表"] + raw --> agg["聚合任务"] + agg --> alert["告警规则"] + agg --> dashboard["看板接口"] + alert --> dashboard ``` -## 3. 推荐技术栈 - -- **后端**:Go + Gin / Fiber -- **数据处理**:Go `cron` / `robfig/cron`(定时聚合) -- **数据库**:PostgreSQL(可选 TimescaleDB) -- **缓存(可选)**:Redis(热点看板数据) -- **前端**:React / Next.js + ECharts / AntV -- **部署**:Docker Compose + Zeabur / Railway / 自托管 - -## 4. 分步实现路径 - -
- - - -
- -### 第一步:搭 Go 项目骨架和数据模型 +## 怎么让 AI 帮你生成? ```text -请帮我创建一个 Go 交通数据分析项目骨架。 +请基于当前 PRD,帮我生成一个 Go 交通数据分析平台骨架。 要求: -1. 使用 Gin(或 Fiber)创建 API 服务 -2. 按 handler / service / repository / model 分层 -3. 设计并创建数据表: - - raw_traffic_events - - traffic_agg_1m - - traffic_agg_5m - - alerts -4. 提供一个健康检查接口 /health -5. 给出本地启动步骤(含数据库连接配置) +1. 使用 Gin 或 Fiber +2. 提供数据接入接口 +3. 提供聚合任务骨架 +4. 提供 dashboard 和 alerts 接口骨架 +5. 先不做真实复杂分析,只做可运行结构 ``` -### 第二步:完成数据接入接口 +## 怎么“监工”才有效? -先做事件写入: - -- `POST /api/traffic/events` -- 字段至少包含:`intersection_id`、`timestamp`、`vehicle_count`、`avg_speed` - -```text -请帮我实现 POST /api/traffic/events。 - -要求: -1. 做参数校验(空值、类型、时间格式) -2. 标准化 timestamp 到统一时区 -3. 写入 raw_traffic_events -4. 返回统一 JSON 结构(code、message、data) -5. 提供一组可直接用于调试的 curl 示例 -``` - -### 第三步:实现聚合任务 - -至少完成: - -- 1 分钟窗口聚合 -- 5 分钟窗口聚合 -- 聚合结果接口 `GET /api/dashboard/trend` - -### 第四步:实现告警规则 - -建议第一版规则: - -- 当前流量 `> 近 5 分钟均值 * 1.8` 触发中级告警 -- 当前平均速度 `< 阈值` 且持续 3 个窗口,触发高级拥堵告警 - -### 第五步:完成可视化页面 - -建议页面模块: - -- 总览卡片:今日总车流、当前告警数、最拥堵路口 -- 趋势图:近 24 小时车流曲线 -- 路口排行:拥堵指数 TOP10 -- 告警面板:实时/历史告警列表 - -### 第六步:补齐部署与文档 - -至少包含: - -- 数据口径说明(每个指标如何计算) -- 接口文档(输入/输出示例) -- 本地与线上部署步骤 -- 示例数据导入方法 - -## 5. 可直接使用的接口清单(最小可用) - -| 模块 | 接口 | +| 检查项 | 要看什么 | |------|------| -| 数据接入 | `POST /api/traffic/events` | -| 总览数据 | `GET /api/dashboard/overview` | -| 趋势数据 | `GET /api/dashboard/trend?range=24h` | -| 热点路口 | `GET /api/dashboard/intersections/top` | -| 告警列表 | `GET /api/alerts?level=high&status=open` | -| 告警处理 | `PATCH /api/alerts/:id/resolve` | +| 接口是否对 | ingest、dashboard、alerts 是否闭环 | +| 数据是否对 | 原始表、聚合表、告警表是否一致 | +| 指标是否对 | 趋势、排名、告警口径是否合理 | +| 页面是否对 | 看板展示和后端结果是否对齐 | +| 演示是否对 | 是否能演示“接入 -> 聚合 -> 告警 -> 展示” | -## 6. 交付物要求 +## 最后的预期效果 -- 可运行项目代码(Go API + 可视化前端) -- 数据库表结构与初始化脚本 -- README(架构图、运行说明、指标解释) -- 关键页面截图(趋势图、排名、告警) -- 60 秒到 120 秒演示视频 +- 一套可运行的 Go 数据分析平台 +- 一份同级 PRD 文档 +- 数据接入、聚合、告警、看板展示 +- README 和演示方案 -## 7. 验收标准 +## 验收标准 -| 维度 | 最低达标 | 加分项 | -|------|------|------| -| 数据链路 | 接入、存储、聚合、展示完整跑通 | 支持重放历史数据和批量导入 | -| 分析能力 | 有趋势、排名、告警三个核心模块 | 告警支持分级与处理状态流转 | -| Go 工程质量 | 代码分层清晰,错误处理明确 | 有结构化日志与基础性能优化 | -| 可视化质量 | 关键图表可读,指标口径一致 | 增加地图层或交互筛选能力 | -| 交付完整度 | README、截图、演示视频齐全 | 有线上演示地址和压测说明 | +| 维度 | 最低达标 | +|------|------| +| PRD 对齐 | 页面、功能、数据结构基本符合 PRD | +| 产品闭环 | 接入、聚合、告警、看板可以跑通 | +| 分析能力 | 趋势、排行、告警三个核心模块可用 | +| 工程完整度 | Go API、数据库、前端看板链路已接通 | +| 展示能力 | 可以清楚演示“从 PRD 到成品”的过程 | -## 8. 提交前最后检查 - - - - -
    -
  • -
  • -
  • -
  • -
  • -
  • -
-
- -::: tip -这个作业的关键,不是图表多炫,而是你能不能保证“口径一致、链路闭环、告警可信”。 +::: tip 🚀 完成后你会得到什么? +你得到的不只是一个接口项目,而是一套“数据接入 + 数据产品”型项目的开发样例。 ::: diff --git a/docs/zh-cn/stage-2/assignments/travel-planning-agent-platform/PRD.md b/docs/zh-cn/stage-2/assignments/travel-planning-agent-platform/PRD.md new file mode 100644 index 0000000..6434d27 --- /dev/null +++ b/docs/zh-cn/stage-2/assignments/travel-planning-agent-platform/PRD.md @@ -0,0 +1,405 @@ +# PRD:智能旅游规划 Agent 编排平台 + +状态:Draft v0.1 +目标:先确认这个 Agent 产品的最小可用范围,再进入开发。 + +## 1. 项目定位 + +这是一个面向真实旅行规划场景的 AI 产品,不只是聊天,而是把结构化输入转成可执行行程。 + +一句话定义: +做一个可以生成、保存、调整与导出旅行计划的 Agent 编排平台。 + +系统总览: + +```mermaid +flowchart LR + WWW["www.xxx.com
官网前台"] --> API["应用 API / 管理 API"] + APP["app.xxx.com
用户工作台"] --> API + ADMIN["admin.xxx.com
后台管理台"] --> API + API --> AUTH["Supabase Auth"] + API --> DB["Supabase Postgres"] + API --> MODEL["LLM / Agent 编排层"] + API --> EXT["天气 / 地图 / POI 外部信息源"] +``` + +## 1.0 技术选型建议 + +- 前端框架:`Next.js App Router` +- 用户鉴权:`Supabase Auth` +- 数据库:`Supabase Postgres` +- 模型层:统一后端服务调用大模型 +- 可选缓存:`Redis` + +站点入口约定: + +- 官网前台:`www.xxx.com` +- 用户工作台:`app.xxx.com` +- 后台管理台:`admin.xxx.com` + +## 1.1 竞品参考(官方) + +- [Wanderlog](https://wanderlog.com/) + +## 1.2 产品借鉴点 + +本项目的产品设计建议参考真实旅行规划产品的做法: + +- 借鉴 `Wanderlog` 的路线规划表达方式:输入后直接看到可编辑的每日行程,而不是只返回一大段文本 +- 行程详情应突出日期、地点、预算、移动顺序和注意事项 +- 历史记录页应像“我的行程库”,支持再次打开和二次生成 +- 后台页应强调热门目的地、失败任务和用户反馈,而不是只看系统日志 +- 整体设计要体现“行程产品”感,而不是“聊天回答”感 + +## 1.3 竞品页面拆解 + +建议重点参考的竞品页面结构: + +- `Wanderlog` 首页 + - 重点看:如何同时讲清楚 itinerary、map、budget、collaboration 这些核心价值 +- `Wanderlog` 行程页 + - 重点看:一天一天的安排、地图与列表并存、预算与预订信息并列 +- `Wanderlog` Pro 页面 + - 重点看:如何把高级功能做成清晰权益,而不是一长串技术描述 + +因此本项目建议: + +- 规划页更像“行程编辑台” +- 详情页更像“可执行 itinerary” +- 历史页更像“我的旅行库” +- 后台页更像“运营与任务中心” + +## 2. 目标用户与核心目标 + +目标用户: + +- 想快速获得 3 到 7 天行程安排的普通用户 +- 需要预算与节奏建议的自由行用户 +- 维护平台质量和任务健康状态的管理员 + +核心目标: + +- 用户能在一次表单提交后得到结构化行程 +- 用户能保存历史计划并再次编辑/重生成 +- 平台能记录失败任务和生成质量反馈 + +## 3. MVP 范围 + +第一版必须包含: + +- 规划表单页 +- 行程详情页 +- 历史计划页 +- 计划保存与重生成 +- 预算拆分 +- 导出文本/PDF 占位能力 +- 后台查看任务与失败日志 + +第一版不做: + +- 真正的机票/酒店预订 +- 多城市复杂路线联排 +- 实时票价与库存同步 +- 多人协同编辑 +- 多语言输出 + +## 4. 角色与权限 + +| 角色 | 权限 | +|------|------| +| 普通用户 | 创建计划、查看历史、导出、反馈 | +| 管理员 | 查看热门目的地、失败任务、用户反馈 | + +## 5. 前端实现 + +## 5.1 页面架构总览 + +当前 PRD 定义为 `3 套入口,8 个大页面`: + +- 官网前台 `1` 个大页面 +- 用户工作台 `5` 个大页面 +- 后台管理台 `2` 个大页面 + +### A. 官网前台 `www.xxx.com` + +#### 1. 官网首页 `www:/` + +核心功能: + +- 产品介绍 +- 典型使用场景 +- Demo 行程展示 +- CTA + +### B. 用户工作台 `app.xxx.com` + +#### 2. 登录页 `app:/login` + +核心功能: + +- 登录 +- 注册入口 + +#### 3. 规划页 `app:/planner` + +核心功能: + +- 输入旅行需求 +- 选择偏好与预算 +- 发起规划任务 + +#### 4. 行程详情页 `app:/trips/:id` + +核心功能: + +- 查看每日行程 +- 查看预算拆分 +- 再次生成和导出 + +#### 5. 历史计划页 `app:/history` + +核心功能: + +- 查看历史计划 +- 重新打开 +- 重新生成 + +#### 6. 反馈与导出页 `app:/exports` + +核心功能: + +- 导出计划 +- 提交反馈 + +### C. 后台管理台 `admin.xxx.com` + +#### 7. 后台首页 `admin:/` + +核心功能: + +- 热门目的地 +- 任务成功率 +- 失败任务数 + +#### 8. 任务与反馈页 `admin:/runs` + +核心功能: + +- 查看失败任务 +- 查看用户反馈 +- 排查异常计划 + +## 5.2 关键用户链路 + +```mermaid +flowchart TD + user["用户"] --> login["登录"] + login --> planner["规划页"] + planner --> submit["提交旅行需求"] + submit --> agent["Agent 编排层"] + agent --> result["生成结构化行程"] + result --> detail["行程详情页"] + detail --> history["保存到历史计划"] + detail --> export["导出 / 分享"] + admin["管理员"] --> runs["任务与反馈页"] + runs --> optimize["排查失败任务"] +``` + +关键状态流: + +- 规划任务:待生成 -> 生成中 -> 成功 / 失败 +- 行程:草稿 -> 已保存 -> 已导出 +- 反馈:未处理 -> 已查看 -> 已关闭 + +推荐技术栈: + +- Next.js App Router +- TypeScript +- Tailwind CSS + +建议页面: + +| 页面 | 路径 | 说明 | +|------|------|------| +| 首页 | `/` | 产品介绍与创建入口 | +| 规划页 | `/planner` | 输入需求并提交 | +| 行程详情页 | `/trips/:id` | 查看每日计划、预算和注意事项 | +| 历史记录页 | `/history` | 查看历史计划 | +| 管理后台 | `/admin` | 查看任务状态和平台统计 | + +前端关键组件: + +- 旅行需求表单 +- 任务进度状态条 +- Day by Day 行程卡片 +- 预算拆分卡片 +- 历史记录列表 +- 错误重试与反馈组件 + +## 6. 后端实现 + +推荐技术栈: + +- Node.js + NestJS/Express +- PostgreSQL / Supabase +- LLM API +- 可选 Redis 做短缓存 + +后端模块: + +- `auth` +- `trip-plans` +- `planner` +- `exports` +- `admin` +- `feedback` + +建议数据表: + +```sql +trip_plans ( + id uuid primary key, + user_id uuid, + origin text, + destination text, + start_date date, + end_date date, + budget numeric, + preferences jsonb, + pace text, + status text, + created_at timestamptz +) + +itinerary_days ( + id uuid primary key, + trip_plan_id uuid, + day_index int, + title text, + summary text, + day_budget numeric +) + +itinerary_items ( + id uuid primary key, + itinerary_day_id uuid, + start_time text, + end_time text, + place_name text, + category text, + notes text, + estimated_cost numeric +) + +planner_runs ( + id uuid primary key, + trip_plan_id uuid, + provider text, + latency_ms int, + status text, + error_message text, + created_at timestamptz +) + +trip_feedback ( + id uuid primary key, + trip_plan_id uuid, + user_id uuid, + score int, + comment text, + created_at timestamptz +) +``` + +## 6.1 后台指标与监控 + +后台建议至少查看这些指标: + +- 日规划任务数 +- 规划成功率 +- 平均生成耗时 +- 热门目的地排行 +- 用户反馈评分分布 +- 导出次数 + +基础监控建议: + +- 模型调用成功率 +- 外部信息源失败率 +- 任务重试次数 +- 数据库存取耗时 + +## 7. 功能清单 + +必须完成: + +- 创建旅行计划 +- 返回结构化每日行程 +- 查看历史计划 +- 重生成计划 +- 预算拆分 +- 管理端查看失败任务 + +可选增强: + +- 热门目的地榜单 +- POI 数据二次校验 +- 导出为分享图 + +## 8. 接口草案 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/trips/plan` | 创建新的规划任务 | +| `GET` | `/api/trips/:id` | 获取计划详情 | +| `POST` | `/api/trips/:id/regenerate` | 按原条件重新生成 | +| `PATCH` | `/api/trips/:id/preferences` | 更新偏好后重算 | +| `GET` | `/api/history` | 获取历史计划列表 | +| `POST` | `/api/trips/:id/export` | 导出行程 | +| `POST` | `/api/trips/:id/feedback` | 提交用户反馈 | +| `GET` | `/api/admin/planner-runs` | 获取生成日志 | + +`POST /api/trips/plan` 请求示例: + +```json +{ + "origin": "上海", + "destination": "成都", + "startDate": "2026-05-01", + "endDate": "2026-05-04", + "budget": 3500, + "preferences": ["美食", "历史文化"], + "pace": "standard" +} +``` + +## 9. 关键业务规则 + +- 第一版限制单目的地 +- 只支持 3 到 7 天 +- 预算必须返回总预算与每日预算 +- 失败任务必须可重试 +- 生成结果需要有结构化 JSON,不能只返回自由文本 + +## 10. 非功能要求 + +- 规划结果要有稳定的结构化 JSON +- 长任务必须有状态反馈 +- 外部信息源失败时要优雅降级 +- 导出失败可重试 +- 移动端至少可查看详情和历史计划 + +## 11. 开发顺序建议 + +1. 规划页表单与 mock 结果 +2. 创建计划与详情接口 +3. 历史记录与重生成 +4. 导出与反馈 +5. 管理后台日志页 + +## 12. 待确认项 + +- 第一版是否需要接外部天气/地图数据 +- 导出先做 PDF 还是纯文本下载 +- 行程生成是否需要“省钱/均衡/深度游”预设模板 +- 管理端是否需要查看用户反馈详情 diff --git a/docs/zh-cn/stage-2/assignments/travel-planning-agent-platform/index.md b/docs/zh-cn/stage-2/assignments/travel-planning-agent-platform/index.md index 00de111..4845fc6 100644 --- a/docs/zh-cn/stage-2/assignments/travel-planning-agent-platform/index.md +++ b/docs/zh-cn/stage-2/assignments/travel-planning-agent-platform/index.md @@ -1,282 +1,120 @@ -# 智能旅游规划 Agent 平台 +# 智能旅游规划 Agent 平台开发实战 -很多人做 AI 项目时,常见问题不是模型不会调,而是应用链路不完整:能聊天,但不能真正“规划一趟旅行”。 +这个项目不是“做一个会聊天的旅行助手”,而是围绕一份真实 PRD,把一个可执行的旅行规划产品从想法推进到可上线原型。 -这个大作业的目标,就是把一个“会说话的 Demo”做成“可执行的产品原型”。 +你会同时看到三件事: -::: tip 🎯 这次做什么? -打造一个 **智能旅游规划 Agent 平台**。用户输入出发地、目的地、日期、预算和偏好后,系统自动生成每日行程、预算拆分、景点与餐饮建议,并支持导出或保存计划。管理员可查看热门目的地、生成成功率和用户反馈。 +- 项目要做成什么 +- 如何基于 PRD 拆解并推进开发 +- 最后应该交付出什么样的效果 + +::: tip PRD 入口 +本项目的需求文档在同级页面: [查看 PRD](./PRD.md) :::
-## 为什么这个题目值得做? +## 这个项目到底在做什么? -因为它同时覆盖了现代 AI 应用最关键的 4 类能力: +这是一个旅行规划 Agent 平台: -- **结构化输入**:把用户偏好转成可计算参数 -- **Agent 编排**:任务拆解、信息收集、行程生成与校验 -- **真实业务约束**:预算、时长、交通可行性、营业时间 -- **产品化交付**:保存历史、查看详情、导出分享 +- 用户输入出发地、目的地、日期、预算和偏好 +- 系统生成每日行程、预算拆分和建议 +- 用户可以保存历史计划、再次生成、导出 +- 管理员可以查看热门目的地、失败任务和反馈 -做完这个项目,你学到的不只是“会调用 LLM”,而是“会做一个可落地的 AI 产品”。 +## 开发过程怎么走? -## 先看全景:系统主链路是什么? +### 1. 先看 PRD,不要上来就写代码 + +先确认: + +- 第一版是否只做单目的地 +- 行程输出是否必须结构化 +- 导出能力做多深 +- 后台统计和任务日志范围是否清楚 + +### 2. 先让 AI 生成“骨架版” + +第一轮先生成: + +- 首页 +- 规划页 +- 行程详情页 +- 历史记录页 +- 管理后台页 + +### 3. 再进入“监工模式” + +你要重点盯这几件事: + +- 输入表单字段是否和 PRD 一致 +- 行程输出是否真的结构化 +- 预算、节奏和每日活动是否合理 +- 历史计划和重生成是否闭环 +- 失败任务有没有被记录 + +### 4. 最后做联调和上线 ```mermaid flowchart TD - user["用户"] --> form["填写旅行需求"] - form --> orchestrator["Agent 编排层"] - orchestrator --> planner["行程生成器"] - orchestrator --> poi["POI / 景点与餐饮数据"] - orchestrator --> weather["天气与交通信息"] - planner --> validator["预算与时间校验"] - validator --> result["输出每日行程"] - result --> db["保存到数据库"] - db --> history["历史计划页"] - result --> export["导出 PDF / 图片 / 文本"] + prd["PRD"] --> planner["规划页"] + planner --> agent["Agent 编排层"] + agent --> model["模型调用"] + agent --> db["数据库"] + db --> history["历史计划"] + db --> admin["后台统计与日志"] ``` -```mermaid -sequenceDiagram - autonumber - actor U as 用户 - participant FE as 前端页面 - participant API as 后端 API - participant AG as Agent 服务 - participant DB as 数据库 +## 怎么让 AI 帮你生成? - U->>FE: 输入目的地、日期、预算、偏好 - FE->>API: POST /api/trips/plan - API->>AG: 创建规划任务 - AG->>AG: 拆解子任务并生成草案行程 - AG-->>API: 返回结构化计划 - API->>DB: 保存 trip 与 itinerary - API-->>FE: 返回计划详情 - U->>FE: 调整偏好并再次生成 - FE->>API: POST /api/trips/:id/regenerate +```text +请基于当前 PRD,帮我生成一个智能旅游规划 Agent 平台的前端骨架。 + +要求: +1. 页面包括:首页、规划页、行程详情页、历史记录页、管理页 +2. 规划页左侧是表单,右侧是结果预览 +3. 先只生成页面结构和假数据,不接真实接口 +4. 风格要像现代 AI 产品 ``` -## 1. 定范围:先把题目收住,避免“越做越大” +## 怎么“监工”才有效? -### 角色设计 - -| 角色 | 核心动作 | +| 检查项 | 要看什么 | |------|------| -| 普通用户 | 创建旅行计划、查看每日行程、调整偏好、保存与导出 | -| 管理员 | 查看使用统计、热门城市、失败任务日志、用户反馈 | +| 页面是否对 | 页面数量、功能是否符合 PRD | +| 接口是否对 | 规划、详情、历史、重生成是否闭环 | +| 输出是否对 | 行程结果是不是结构化且可读 | +| 数据是否对 | trip、itinerary、logs 是否一致 | +| 演示是否对 | 是否能演示“输入 -> 生成 -> 保存 -> 再次生成” | -### 核心页面 +## 最后的预期效果 -| 页面 | 路径 | 说明 | -|------|------|------| -| 首页 | `/` | 介绍产品价值与创建入口 | -| 规划页 | `/planner` | 填写需求并发起生成 | -| 行程详情页 | `/trips/:id` | 查看每日计划与预算拆分 | -| 历史记录页 | `/history` | 查看过去的规划任务 | -| 管理后台 | `/admin` | 查看统计数据与任务健康状态 | +- 一套可运行的旅行规划 Agent 平台 +- 一份同级 PRD 文档 +- 首页、规划、详情、历史、后台五类页面 +- Agent 编排、结构化输出、历史管理、后台统计 +- README 和演示方案 -### 第一版边界(强烈建议) +## 验收标准 -- 只做单人行程,不做多人协同编辑 -- 只支持 1 个目的地,不做多城市跳转 -- 只做 3-7 天行程,不做超长旅行计划 -- 先使用一种语言输出,不做多语言切换 -- 先接一个外部信息源,避免数据接入过多导致失控 +| 维度 | 最低达标 | +|------|------| +| PRD 对齐 | 页面、功能、数据结构基本符合 PRD | +| 产品闭环 | 规划、保存、历史、重生成可以跑通 | +| 后台能力 | 任务统计和失败日志可以查看 | +| 工程完整度 | 前端、后端、数据库、模型调用链路已接通 | +| 展示能力 | 可以清楚演示“从 PRD 到成品”的过程 | -## 2. 搭前台:先把“用户可见闭环”跑通 - -### 推荐技术栈 - -- 前端:Next.js / React + TypeScript + Tailwind CSS + 组件库 -- 后端:Node.js (Nest/Express) 或 Spring Boot -- 数据库:PostgreSQL / Supabase -- AI:OpenAI / Claude / Gemini 任选其一 -- 可选:Redis(缓存热门目的地与提示词模板) - -### 第一步:生成页面骨架 - -把这段提示词给你的 AI IDE: - -```text -请帮我生成一个“智能旅游规划 Agent 平台”的前端骨架。 - -技术栈: -- Next.js App Router -- TypeScript -- Tailwind CSS - -页面: -1. 首页 / -2. 规划页 /planner -3. 行程详情页 /trips/[id] -4. 历史记录页 /history -5. 管理页 /admin - -要求: -- 规划页左侧是需求表单,右侧是计划预览 -- 行程详情按 Day1 / Day2 分段展示 -- 有 loading、空状态、错误提示 -- 移动端可用 -``` - -### 第二步:补齐规划页交互 - -```text -请完善 /planner 页面。 - -输入字段: -- 出发地 -- 目的地 -- 出行日期(开始/结束) -- 总预算 -- 旅行偏好(自然风光/历史文化/亲子/美食) -- 每日节奏(轻松/标准/高强度) - -输出区域: -- 每日行程卡片 -- 预算拆分 -- 交通建议 -- 注意事项 - -要求: -- 点击“生成行程”后显示任务进度 -- 失败时显示可重试按钮 -- 首屏有示例数据引导 -``` - -
- - - -
- -## 3. 接智能:让 Agent 真正参与业务 - -### 数据模型建议 - -```sql -users ( - id uuid primary key, - email text, - role text, -- user / admin - created_at timestamptz -) - -trip_plans ( - id uuid primary key, - user_id uuid, - origin text, - destination text, - start_date date, - end_date date, - budget numeric, - preferences jsonb, - status text, -- pending / success / failed - created_at timestamptz -) - -itinerary_days ( - id uuid primary key, - trip_plan_id uuid, - day_index int, - title text, - activities jsonb, - day_budget numeric -) - -generation_logs ( - id uuid primary key, - trip_plan_id uuid, - model_name text, - prompt_snapshot text, - latency_ms int, - status text, - created_at timestamptz -) -``` - -### 第三步:实现规划接口 - -```text -请帮我实现 /api/trips/plan 接口。 - -目标: -1. 接收用户输入(目的地、日期、预算、偏好) -2. 调用 LLM 生成结构化 JSON 行程 -3. 校验 JSON 字段完整性 -4. 保存到 trip_plans 和 itinerary_days 表 -5. 返回给前端展示 - -要求: -- 明确 DTO 和校验规则 -- 返回统一错误码 -- 记录模型调用耗时与失败日志 -``` - -### 第四步:实现再生成与优化 - -```text -请帮我实现“微调行程”接口 /api/trips/:id/regenerate。 - -用户可输入: -- “预算再低 20%” -- “减少步行” -- “多加亲子场景” - -要求: -- 保留旧版本行程 -- 生成新版本并对比差异 -- 前端支持一键切换版本 -``` - -## 4. 上线与交付 - -### 交付物 - -- 完整项目仓库(前后端或单体) -- 可访问演示链接 -- README(安装、配置、启动、部署、排障) -- 60 秒左右演示视频 -- 至少 4 张截图:首页、规划页、结果页、管理页 - -### 验收标准 - -| 维度 | 最低达标 | 加分项 | -|------|------|------| -| 功能闭环 | 可创建计划、查看结果、保存历史 | 可做二次优化并保留版本 | -| 智能质量 | 输出结构化、基本可执行 | 有预算校验和冲突提示 | -| 工程质量 | 接口清晰、错误可追踪 | 有缓存与性能优化 | -| 产品体验 | loading/空态/错误态完整 | 支持导出分享 | -| 运维交付 | 可部署、文档可复现 | 有后台统计看板 | - -## 提交前最后检查 - - - - -
    -
  • -
  • -
  • -
  • -
  • -
  • -
-
+::: tip 🚀 完成后你会得到什么? +你得到的不只是一个旅游聊天 Demo,而是一套带结构化输入、Agent 编排和任务管理的 AI 产品开发样例。 +::: diff --git a/docs/zh-cn/stage-2/index.md b/docs/zh-cn/stage-2/index.md index 29653e1..0577fa3 100644 --- a/docs/zh-cn/stage-2/index.md +++ b/docs/zh-cn/stage-2/index.md @@ -137,32 +137,32 @@ flowchart LR