团队项目第一次作业
活动智囊:把校园活动策划从“拍脑袋”变成“可执行”
一次策划会,最贵的不是创意,而是那些没被写下来的细节。
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class78-Grade2024-CS |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/Class78-Grade2024-CS/homework/16767 |
| 这个作业的目标 | 以团队形式完整走一遍软件工程项目流程:完成需求分析与规格说明,实现前端、后端与智能体的协同开发,完成测试排错与文档交付,掌握项目的工程化实现思路,积累团队协作与大模型应用开发经验,为课程后续综合性大项目做好技术储备 |
| 团队名称 | 远航小队 |
| 团队成员 | 3124004449 袁炜轩、3124004439 王安亮、3124004441 王俊霖、3124004451 张帅 |
| 项目代码仓库 | https://github.com/zs666700/raungong2 |
一、团队展示
1. 队名
远航小队
“远航”取的是出发和抵达两层意思:一方面,我们做的是一个把活动从“一句想法”推进到“能照着执行”的方案系统,从策划到落地本身就是一段航程;另一方面,对小队四个人来说,前后端协同加智能体接入都是一次全新的技术探索,这次开发也是一次技术上的远航,希望大家一起稳步推进、把项目真正跑起来。
2. 团队项目的具体规划及描述
我们小组本次要开发的项目是校园活动智能策划平台「活动智囊」,接口契约与前端工程名为 activity-mind,代码托管在 GitHub:https://github.com/zs666700/raungong2。
2.1 要解决的问题
校园活动的策划几乎全靠“有经验的人 + 微信群 + 一张 Excel”:
- 经验不可复制:做过三届迎新晚会的人心里有数,第一次接手的人只能到处问“去年怎么办的”。
- 方案不完整:多数策划书只有流程和节目单,缺预算明细、物资采购渠道、风险预案、复盘模板;真到执行才发现“灯光没人负责、备用话筒没买、下雨没有 Plan B”。
- 预算靠估:金额不加总、超支没人发现,报销时才暴露。
- 一次性的:写完锁在某个人的电脑里,下一届从零开始。
2.2 产品定位与能力
面向高校学生组织(班级、社团、学生会)的在线活动策划工作台:输入 6 个核心参数,几十秒内产出一份结构化、可编辑、可导出、金额自洽的完整方案。它不替代人的判断,负责把“该想到的都摆出来”,把策划从“回忆式写作”变成“填空 + 修改”。
| 能力 | 说明 |
|---|---|
| 生成 | 主题 / 类型 / 人数 / 预算 / 时间 / 地点六参数 → 异步生成完整方案 |
| 编辑 | 六大章节按节编辑,乐观锁防并发覆盖 |
| 管理 | 列表、关键词搜索、分页、复制、软删除 |
| 交付 | 一键导出 Markdown,浏览器打印为 A4 PDF |
2.3 交付的六大章节
| 章节 | 内容要点 |
|---|---|
| 策划案 plan | 摘要、背景、目标、亮点、成功标准、阶段计划(起止日期)、当日流程 rundown、预算(含应急金与资金来源) |
| 物资清单 materials | 品类、规格、单价、数量、小计、采购渠道、负责人、到位时间 |
| 分工表 tasks | 阶段、角色、负责人、协作人、开始 / 截止时间、优先级、依赖、验收口径 |
| 宣传文案 promotion | Slogan、关键信息、推文标题正文话题标签、渠道排期、海报三行文案 |
| 风险清单 risks | 类别、等级、发生概率、影响、触发信号、缓解措施、应急预案、责任人(≥6 条) |
| 复盘模板 review | KPI(指标 / 目标值 / 统计方式)、复盘问题、检查清单、可复用模板 |
2.4 技术方案
| 层 | 选型 | 说明 |
|---|---|---|
| 前端 | Vue 3 + Vite + TypeScript + Pinia + Vue Router + Element Plus | 组合式 API;页面级状态与登录态分离 |
| 后端 | FastAPI + SQLAlchemy Async + Pydantic v2 | 全异步,/docs 即接口文档 |
| 数据库 | SQLite(开发)/ PostgreSQL(生产) | 时间存 UTC、金额存“分”、ID 用 UUID 字符串 |
| 智能体 | LangGraph 三节点 + DeepSeek + BM25 RAG | 三节点分别产出“策划案 + 预算”“物资 + 分工”“宣传 + 风险 + 复盘”,上下文逐级传递 |
| 契约 | OpenAPI + JSON Schema | 前后端以 contracts/ 为准,改接口先改契约 |
| 鉴权 | JWT(HS256)+ 密码哈希 | 只允许访问本人数据 |
| 导出 | 前端生成 Markdown,浏览器打印为 PDF | 避免服务端中文字体依赖 |
智能体链路:
POST /plans/generate → 建 plan + task → 202
↓ 后台 run_generation()
BM25 检索 knowledge/campus_activity.md
↓
节点1 策划案+预算 → 节点2 物资+分工 → 节点3 宣传+风险+复盘
↓
content_validator:Schema 校验 + 单价×数量重算 + 预算超支告警
↓
plan.status = ready(超时/失败 → 重试 1 次 → 规则模板降级 degraded=true)
2.5 开发分五个阶段推进
| 阶段 | 内容 | 产出 |
|---|---|---|
| 第一阶段 | 需求梳理,统一对项目的理解,确定契约与验收标准 | 需求规格说明书、选题报告、OpenAPI、内容 Schema、DDL |
| 第二阶段 | 优先做后端与智能体模块,单独调试模型链路与校验逻辑 | 后端骨架、认证、202 任务、Mock / 真实智能体 |
| 第三阶段 | 开发前端页面,完成布局与接口对接 | 登录、新建、生成中、列表、详情、打印六个页面 |
| 第四阶段 | 前后端联调,编写测试用例,反复测试修 bug | 联调记录、接口端到端检查、缺陷修复 |
| 第五阶段 | 整理截图、撰写博客、汇总小组材料 | 博客、截图、演示数据与演示脚本 |
规划时刻意控制了功能范围,不去写很难实现的功能,保证文档里写的内容都能在截止时间前落地,不做脱离实际的规划。
3. 队员风采
| 学号 | 姓名 | 性格 | 擅长的技术 | 兴趣爱好 | 团队角色 |
|---|---|---|---|---|---|
| 3124004449 | 袁炜轩 | 细心稳重、做事有条理,遇到报错能沉下心一步步排查 | Python、接口测试、SQLite 数据核对、日志与缺陷排查 | 骑行、翻看开源项目与技术文档 | 测试工程师(测试负责人) |
| 3124004439 | 王安亮 | 动手能力强、不怕陌生技术,逻辑清晰,擅长复现问题 | Python 基础、本地环境部署、命令行调试、文档与素材整理 | 研究数码硬件、学习计算机底层知识 | 博客与文档负责人 |
| 3124004441 | 王俊霖 | 开朗、擅长沟通,能把模糊想法整理成规范条目,责任心强 | Python、FastAPI 接口开发、SQLAlchemy 数据模型、接口契约设计 | 打羽毛球、浏览技术博客与产品设计 | 后端开发负责人 |
| 3124004451 | 张帅 | 执行力强、上手快,能按约定效果完成页面并快速调整 | 前端页面开发、布局调整、交互效果实现 | 看影视、玩单机游戏、留意 UI 设计 | 前端开发 |
袁炜轩(3124004449):性格细心稳重,做事有条理,面对报错可以沉下心一步步排查,耐心充足,擅长梳理接口之间的逻辑。熟悉 Python 与 FastAPI 接口结构,能读懂后端实现与接口契约,擅长接口测试、数据一致性与缺陷排查。平时喜欢骑行,也经常翻看各类开源项目和技术文档。在团队中担任测试工程师,负责编写测试用例、执行接口端到端检查、核对金额重算与章节完整性,复现缺陷并跟踪修复结果,按验收标准逐条自测留档。
王安亮(3124004439):动手能力很强,遇到陌生技术不会畏难,愿意主动查阅资料动手试错,逻辑思路清晰,很擅长复现程序里出现的问题。熟悉 Python 基础、本地开发环境部署、命令行调试,也习惯把过程整理成可读的文字。爱好研究数码硬件,平时会主动学习计算机底层相关知识。在小组里承担博客与文档工作,负责团队博客撰写、需求文档成文与版本维护,汇总截图与演示材料,同时负责本地运行环境部署与演示脚本的准备,保证提交的材料前后一致、能照着操作复现。
王俊霖(3124004441):性格开朗,擅长沟通,很擅长把模糊零散的想法整理成清晰规范的条目,有不错的责任心,能够协调小组内部对齐口径。擅长 Python 开发、FastAPI 接口开发、SQLAlchemy 异步数据模型,能把需求梳理的功底用在接口契约设计上。课余喜欢打羽毛球,经常浏览技术博客,学习产品设计思路。在团队中是后端开发负责人,负责后端主体框架搭建、认证与方案 / 任务接口、智能体适配与内容校验(金额重算、超支告警)等核心逻辑,并对照 contracts/ 维护接口实现的一致性。
张帅(3124004451):执行力强,学习新知识上手速度快,能够按照约定的效果完成页面开发,收到修改意见之后可以快速调整页面样式。擅长前端页面开发、页面布局调整、交互效果实现。平时喜欢看影视、玩单机游戏,也会留意各类软件 UI 设计。在项目中负责前端开发,完成登录页、新建方案页、生成中页、方案列表与详情页、打印页的开发与样式优化,并完成与后端接口的对接。
4. 团队的首次合照

5. 团队愿景
我们希望「活动智囊」成为校园里最省事的那份策划书:任何一个第一次接手活动的同学,输入几个参数,就能拿到一份金额算得对、物资买得齐、风险想到了、宣传能直接发的方案;上一届的经验不再随着人毕业而消失,而是沉淀成可复用的模板。也希望通过这次“远航”,把四人协作与智能体开发真正跑通,让它成为我们后续项目的起点。
二、选题报告
1. 选题名称与基本信息
| 项目 | 内容 |
|---|---|
| 选题名称 | 活动智囊——校园活动智能策划平台 |
| 选题类型 | 智能体应用类(大模型 + 结构化内容生成) |
| 团队名称 | 远航小队 |
| 团队成员 | 3124004449 袁炜轩(测试)、3124004439 王安亮(博客与文档)、3124004441 王俊霖(后端)、3124004451 张帅(前端) |
| 开发周期 | 2026 年 10 月 28 日 — 2026 年 11 月 8 日 |
2. 选题背景与问题来源
选题来自我们自己在班里办活动的经历。一次班级迎新晚会、一次社团招新,真正耗时间的不是想节目,而是把方案写成别人能照着执行的东西:预算要一项项加、物资要一件件数、谁负责什么要说清楚、下雨了怎么办要提前想。这些活每一届都在重复,却每一届都从零开始。
我们把这个过程里反复出现的四个问题归了一下:
- 经验停留在个人身上,换人接手就断档;
- 方案结构不固定,缺预算、缺物资、缺风险预案,执行时才暴露;
- 金额靠估,不加总、不核对,报销时才发现超支;
- 写完就锁在本地文件里,第二年无法复用。
这些问题不是靠“写得更认真”能解决的,而是缺一套把结构固定下来、把核算交给程序的办法。这正是本项目要回答的问题。
3. 选题意义
对使用者:把一次活动的策划从“回忆式写作”变成“填表 + 修改”。参数只需要 6 个核心项,产出却是六节完整、金额自洽的方案,第一次接手活动的同学也能拿到有据可依的底稿。
对团队:这是一次完整的工程训练。四人分别在前后端、测试与文档上各担一段,用同一份接口契约把四段工作缝在一起,走完需求、开发、联调、验收的完整流程;同时第一次把大模型接进一个需要结构约束、需要失败兜底的真实系统,而不是停留在调用一次接口看输出的层面。
对课程:选题规模与技术栈都在一周内可完成的范围内,交付物可演示、可复现,适合作为课程综合性大项目之前的一次预演。
4. 选题目标
| 类别 | 目标 |
|---|---|
| 功能目标 | 完成“登录 → 创建方案 → 异步生成 → 查看详情 → 按节编辑 → 复制 / 删除 → 导出”的主链路 |
| 内容目标 | 单次生成交付六个内容节:策划案(含预算)、物资清单、分工表、宣传文案、风险清单(≥6 条)、复盘模板 |
| 质量目标 | 金额由后端按单价 × 数量重算,误差为 0;章节缺失判失败;超预算写入告警 |
| 容错目标 | 模型不可用时降级生成并标记,演示流程不依赖外网与密钥 |
| 工程目标 | 接口以 OpenAPI 契约为准,前端类型检查通过,仓库不含密钥与数据库文件 |
| 学习目标 | 掌握智能体三节点编排、结构约束与降级兜底的做法,理解契约优先的前后端协作方式 |
5. 选题内容与范围
本期确定要做的是:单用户账号体系;方案六节生成与分节编辑;异步任务与进度轮询;列表搜索分页、复制、软删除;Markdown 导出与打印视图;模型供应商可切换(Mock / Dify / Coze / LangGraph)与规则降级;健康检查与统一错误码。
本期明确不做的是:方案版本历史与回滚、单节重新生成、模板库复用与共享、多人协同编辑与评论、服务端 PDF 渲染、第三方登录与消息通知、在线支付与场地真实预订。这些要么涉及额外的数据同步机制,要么超出课程周期,宁可写清楚不做,也不在文档里留空头承诺。
6. 技术路线与关键难点
技术路线:前端 Vue 3 + Vite + TypeScript + Element Plus 负责交互与展示;后端 FastAPI + SQLAlchemy 异步 + Pydantic v2 负责接口、任务与数据;智能体用 LangGraph 编排三个节点,接入 DeepSeek,配合 BM25 在本地知识库检索片段;接口契约用 OpenAPI,内容结构用 JSON Schema,数据库用 db-schema.sql 固化。
四个关键难点及我们的处理办法:
| 难点 | 具体表现 | 处理办法 |
|---|---|---|
| 输出结构不稳 | 模型偶发少字段、包一层说明文字、数字写成字符串 | 提示词固定字段与示例;写库前按 Schema 校验;非法 JSON 先做修复抽取,仍失败重试 1 次 |
| 金额必须算对 | 单价 × 数量与合计不一致,超预算无人发现 | 后端重算金额,覆盖模型给出的数字;超预算只写入 warnings,不改用户输入 |
| 长请求会超时 | 一次生成几十秒,直接同步返回易被网关断开 | 生成接口立即 202,落库任务记录后后台执行,前端按 poll_after_ms 轮询进度 |
| 没有网络也要能演示 | 演示现场断网或额度用尽 | 适配器模式隔离供应商;失败两次后走规则模板降级,标记 degraded=true 并在页面提示 |
7. 可行性分析
技术上可行:所用技术栈都是课程内已接触或可在一周内上手的开源方案,DeepSeek 接口按 token 计费、成本低;LangGraph 的节点编排只需三个节点,链路短、易调试。时间上可行:需求与契约在第一个迭代冻结,后端与智能体、前端各占一个迭代,留一个迭代专门联调与修缺陷。资源上可行:四人各自有明确的一段工作,互不空等;开发期用 SQLite 单文件,不需要额外服务器。
风险也如实列出:最大的不确定性是模型输出结构与耗时波动,因此我们把“校验 + 重试 + 降级”写进了需求,而不是等出问题再补;其次是四人课表不同步,靠接口契约和每日一次进度同步来降低等待成本。
8. 进度安排
| 阶段 | 时间 | 主要工作 | 阶段产物 |
|---|---|---|---|
| 第一阶段 | 10.28–10.31 | 选题确认、需求梳理、契约与验收标准定稿 | 选题报告、需求规格说明书、OpenAPI、内容 Schema、DDL |
| 第二阶段 | 11.01–11.03 | 工程骨架、认证、方案与任务接口、智能体三节点与校验 | 可跑的后端与 Mock 智能体 |
| 第三阶段 | 11.03–11.05 | 六个页面开发与接口对接 | 登录、新建、生成中、列表、详情、打印页 |
| 第四阶段 | 11.05–11.07 | 前后端联调、用例执行、缺陷修复 | 接口端到端检查记录、修复清单 |
| 第五阶段 | 11.07–11.08 | 材料整理与提交 | 截图、演示数据、团队博客与文档 |
9. 成员分工
| 成员 | 角色 | 主要职责 |
|---|---|---|
| 王俊霖(3124004441) | 后端开发负责人 | 后端框架与数据模型、认证与方案 / 任务接口、智能体适配与内容校验、接口契约维护 |
| 张帅(3124004451) | 前端开发 | 六个页面与组件开发、分节编辑交互、导出与打印排版、接口对接 |
| 袁炜轩(3124004449) | 测试工程师 | 测试用例编写、接口端到端检查、金额与章节一致性核对、缺陷复现与回归 |
| 王安亮(3124004439) | 博客与文档负责人 | 选题报告与需求文档成文、博客撰写、截图与材料汇总、本地环境部署与演示脚本 |
10. 预期成果
一份可运行的平台代码(前端、后端、Mock 服务与契约文件);一份需求规格说明书与一份选题报告;一份团队博客;一组演示数据与截图;一份可照着操作的演示脚本。验收时以需求文档中的验收标准逐条对照,未实现项已在范围边界中列明。
三、需求分析文档
本文参考《软件需求规格说明规范》的组织方式,按目标与范围、总体描述、功能与数据需求、接口需求、非功能需求、验收标准的顺序编写,内容与仓库 contracts/ 目录下的 openapi.json、plan-content.schema.json、db-schema.sql 保持一致。
3.1 迭代记录表
| 迭代 | 时间 | 目标 | 交付物 | 状态 | 遗留问题 / 下一步 |
|---|---|---|---|---|---|
| 迭代一·需求与契约 | 10.28–10.31 | 需求梳理、范围冻结、确定接口与内容契约 | 需求规格说明书、选题报告、OpenAPI、内容 Schema、DDL、示例方案 JSON | 已完成 | 风险条目下限(≥6 条)与预算字段口径在评审中定稿 |
| 迭代二·后端骨架与认证 | 11.01–11.03 | 工程骨架、建库、注册登录 | /healthz、/docs、三张核心表、JWT 认证 |
已完成 | 用户名重复等错误码统一为 {code,message} 结构 |
| 迭代三·生成主流程 | 11.03–11.05 | 202 异步任务、轮询、智能体与校验降级 | Mock / 真实智能体、任务状态机、金额重算 | 已完成 | 真实模型输出格式不稳,补 JSON 修复重试 |
| 迭代四·编辑与交付 | 11.05–11.07 | 按节编辑、列表搜索分页、复制删除、导出 | 编辑接口 + 409、列表接口、Markdown 导出 | 已完成 | 列表接口确认不返回大 JSON,只返回摘要 |
| 迭代五·联调测试与材料 | 11.07–11.08 | 前后端联调、用例执行、缺陷修复、材料整理 | 接口端到端检查、演示数据、博客与截图 | 进行中 | 按验收标准逐条自测并截图留档 |
3.2 项目标志

设计说明:绿色底板取“可用、稳妥”,白色方案卡片代表一份被结构化下来的策划书,卡片内的对勾代表“条目可执行、可验收”,右上角暖色四角星是“智囊的灵感”。整体无文字,缩到 32px 仍可辨认,可直接用作站点图标。
3.3 思维导图
主要分支:
- 用户与权限:注册、登录、JWT、当前用户、数据隔离
- 方案生成:参数表单(主题 / 类型 / 人数 / 预算 / 时间 / 时长 / 地点 / 受众 / 目标 / 语气 / 约束)、异步任务(202 + 轮询)、智能体(三节点 + RAG + 超时重试 + 降级)
- 内容产物:策划案(含预算)、物资、分工、宣传、风险、复盘
- 编辑与交付:按节编辑、乐观锁冲突、Markdown 导出、打印 PDF
- 方案管理:列表、搜索、分页、复制、软删除
- 系统能力:枚举字典、健康检查、统一错误码、Mock 演示
3.4 类图(数据模型)
实体与关键约束(依据 contracts/db-schema.sql):
| 实体 | 关键字段 | 约束 |
|---|---|---|
| users | id、username、password_hash、display_name、role | username 唯一;role ∈ user/admin |
| plans | user_id、title、status、version、budget_fen、input_json、content_json、degraded、deleted_at | version ≥ 1 用于乐观锁;软删除;金额存“分” |
| generation_tasks | plan_id、user_id、type、section_key、status、progress、idempotency_key、attempt | progress 0–100;idempotency_key 唯一防重复生成 |
| plan_versions | plan_id、version、content_json、editor_id | (plan_id, version) 唯一 |
| templates | user_id、name、input_json、content_json、use_count | 用户内未删除方案名唯一 |
| export_records | plan_id、format、file_size | format ∈ markdown/pdf |
| agent_calls | task_id、provider、latency_ms、tokens_in/out、error_code | 用于统计成功率与耗时 |
本期使用 users、plans、generation_tasks 三张表,其余四张是后续版本要用的扩展表。
3.5 功能描述
3.5.1 前端需求
| 编号 | 页面 / 模块 | 功能点 | 交互与状态 |
|---|---|---|---|
| F-01 | 登录 LoginView | 注册与登录切换、表单校验、错误提示、来源回跳 | 未登录访问受保护路由 → 重定向登录;Token 存本地并注入请求头 |
| F-02 | 新建 PlanCreateView | 主题、活动类型(枚举下拉)、人数、预算、开始时间、时长、地点;进阶:受众、目标(≤5 条)、语气、约束 | 前端做与后端一致的字段校验;提交成功跳转生成中页并携带 task_id |
| F-03 | 生成中 GeneratingView | 轮询任务、阶段文案、进度条、失败原因、超时提示、可离开 | 轮询间隔按返回值 poll_after_ms;成功跳详情,失败可重试 |
| F-04 | 列表 PlanListView | 卡片列表、关键词搜索(防抖)、分页、状态标签、空态、骨架屏 | 搜索与翻页只更新查询参数;异常统一走错误提示 |
| F-05 | 详情 PlanDetailView | 六大章节分区渲染、按节编辑弹窗、保存 / 取消、版本冲突提示 | 保存携带 version;返回 409 时提示“内容已被更新”,要求刷新后再改 |
| F-06 | 分节编辑组件 | 预算行增删改与实时合计、物资表格、分工表、宣传卡片、风险表、复盘清单 | 编辑区与展示区同源数据,金额前端即时预览、后端最终重算 |
| F-07 | 方案操作 | 复制方案、软删除、导出 Markdown、打印 | 删除需二次确认;导出用 Blob 下载并复用后端文件名 |
| F-08 | 打印 PrintView | 打印版式、分页控制、隐藏按钮 | 通过 @media print 与独立打印页保证 A4 排版 |
| F-09 | 全局 | 登录态、服务状态徽标(/healthz 判断智能体是否就绪)、统一错误码文案、加载与空态 |
Pinia 管理登录态;错误码 → 中文提示映射 |
| F-10 | 演示 Mock | 无后端时可跑通全流程 | devmock/ 提供同契约的假接口,只需改 VITE_API_BASE_URL |
3.5.2 后端需求(接口清单)
| 方法 | 路径 | 说明 | 关键约束 |
|---|---|---|---|
| GET | /healthz |
健康检查,含智能体 provider 与是否已配置 | 生产部署探活使用 |
| POST | /api/v1/auth/register |
注册 | 用户名重复 → 409 USERNAME_TAKEN |
| POST | /api/v1/auth/login |
登录,返回 JWT | 密码错误 → 401 |
| GET | /api/v1/auth/me |
当前用户 | 需 Bearer Token |
| GET | /api/v1/meta/enums |
活动类型、状态、章节、风险等级、优先级、语气字典 | 前端不硬编码枚举 |
| POST | /api/v1/plans/generate |
创建生成任务 | 立即 202;返回 task_id、plan_id、poll_url、poll_after_ms;同参数可复用未完成任务 |
| GET | /api/v1/tasks/{task_id} |
轮询任务 | 返回 status、stage、progress、error_code/message |
| GET | /api/v1/plans |
方案列表 | 只返回摘要字段,不返回 content_json;分页 + 关键词 |
| GET | /api/v1/plans/{plan_id} |
方案详情 | 含 latest_task、degraded、meta.agent |
| PATCH | /api/v1/plans/{plan_id}/sections/{section_key} |
按节编辑 | 必须带 version;版本不一致 → 409;成功后 version+1 |
| POST | /api/v1/plans/{plan_id}/duplicate |
复制方案 | 生成新 plan,内容同源、状态 ready |
| DELETE | /api/v1/plans/{plan_id} |
删除方案 | 软删除,仅本人 |
| GET | /api/v1/plans/{plan_id}/export?format=markdown |
导出 | Content-Disposition 文件名中文正确;CORS 已暴露该头 |
统一错误结构:
{ "detail": { "code": "USERNAME_TAKEN", "message": "用户名已存在" } }
生成请求字段约束(schemas/plan.py):
| 字段 | 类型 | 约束 |
|---|---|---|
| theme | str | 2–60 字 |
| activity_type | str | 必须在枚举内 |
| participants | int | 10–2000 |
| budget_yuan | float | 0–1,000,000 |
| starts_at | datetime | ISO 8601 |
| duration_minutes | int | 30–480,默认 120 |
| location | str | 1–120 字 |
| target_audience / constraints / extra_notes | str | 分别不超过 120 / 500 / 500 字 |
| goals | list | ≤5 条 |
| tone | str | lively / warm / formal / creative |
3.5.3 智能体与内容校验
- 异步:接口不等待模型返回,后台任务执行、前端轮询,避免网关超时。
- 三节点:策划案 + 预算 → 物资 + 分工 → 宣传 + 风险 + 复盘;后一节点入参携带前一节点 JSON 与 BM25 检索片段(top-k=4)。
- 超时与重试:
AGENT_TIMEOUT_SECONDS=120,失败重试 1 次;仍失败且ENABLE_FALLBACK=true时用知识库规则模板生成,标记degraded=true、meta.agent.provider=fallback,前端提示“方案为降级生成”。 - 校验:非 JSON 可修复抽取;缺章节判失败;单价 × 数量、物资小计、预算合计由后端重算,误差为 0;超预算写入
warnings,不改用户输入。
3.5.4 非功能需求
| 类别 | 要求 |
|---|---|
| 性能 | 列表接口本地 ≤300ms;单次生成 60s 内完成(真实模型实测约 48s);前端首屏 ≤3s |
| 可用性 | 智能体不可用时仍能降级出方案;任务失败有可读错误码,不白屏 |
| 安全 | 密码哈希存储;JWT 鉴权且只能访问本人数据;.env 与 Key 不入库不入日志;列表不返回大 JSON |
| 一致性 | 契约优先:接口变更先改 OpenAPI,再改实现与文档 |
| 兼容 | Chrome/Edge 最新两个版本;最小宽度 1280px 桌面优先,移动端仅保证可读 |
| 可维护 | 前端页面 / 组件 / 工具分层;后端 api / services / agent / models 分层;统一错误码 |
3.6 验收标准
| 编号 | 场景 | 验收标准(可演示、可复现) |
|---|---|---|
| A-01 | 健康检查 | GET /healthz 返回 200,且 agent.provider 与 agent.configured 正确反映当前配置 |
| A-02 | 注册登录 | 注册 → 登录 → 带 Token 访问 /auth/me 成功;重复用户名 409 USERNAME_TAKEN;密码错误 401 |
| A-03 | 权限隔离 | 未带 Token 访问受保护接口 401;用户 A 无法读取 / 修改用户 B 的方案 |
| A-04 | 生成主流程 | 输入“迎新晚会 / 100 人 / 2000 元 / 一周后 / 学校礼堂 / 120 分钟”,5–60 秒内状态变为 ready,返回六个章节 |
| A-05 | 任务轮询 | 提交返回 202 与 poll_url;轮询可见 queued→running→succeeded;失败任务带 error_code 与可读 message |
| A-06 | 金额自洽 | 任一物资 amount = quantity × unit_price,小计与合计由后端重算且误差为 0;超预算时 warnings 非空 |
| A-07 | 风险完整 | 风险清单 ≥6 条,每条含等级、触发信号、缓解措施、责任人 |
| A-08 | 按节编辑 | 修改任一章节保存成功,刷新后仍在;用旧 version 再提交返回 409 |
| A-09 | 列表能力 | 列表只返回摘要字段;关键词搜索命中主题;分页正确;删除的方案不再出现 |
| A-10 | 复制与导出 | 复制生成新方案内容一致;导出 Markdown 中文不乱码、含六章节、文件名为中文方案名 |
| A-11 | 降级可用 | 不配置 API Key 时,ENABLE_FALLBACK=true 仍能产出方案,且 degraded=true、前端有降级提示 |
| A-12 | 工程质量 | pnpm typecheck 通过;接口与 contracts/openapi.json 一致;仓库无 .env、*.db、.venv、node_modules |
| A-13 | 无后端演示 | 仅启动 devmock + 前端,可独立走完“登录 → 新建 → 生成中 → 详情 → 编辑 → 导出”全流程 |
A-01 至 A-10 为验收必过项,A-11 至 A-13 为容错与演示项。
3.7 范围边界
- 版本历史与恢复、单节重新生成、模板复用;
- 服务端 PDF 生成,改用浏览器打印;
- 多用户协同编辑、方案分享与团队共享;
- 在线支付、场地真实预订、外部供应商对接;
- 移动 App、消息推送。
3.8 已知风险与应对
| 风险 | 影响 | 应对 |
|---|---|---|
| 模型输出格式不稳(缺字段、非法 JSON) | 方案生成失败或前端渲染异常 | Schema 校验 + JSON 修复重试 + 规则降级兜底 |
| 真实生成耗时波动(实测约 48s) | 演示时等待过长或被网关超时 | 一律异步 202 + 轮询;演示前预热或准备现成方案 |
| 公网免费实例不能持久化 SQLite | 重启后数据丢失 | 生产切 PostgreSQL;演示用本地库 |
| 联调时间紧 | 功能不完整 | 保核心链路,其余按余力补齐 |

浙公网安备 33010602011771号