[长文手敲] 擦桥的产品——AI文旅(其一)
情景再现
领导:小白啊,最近有x州有一个文旅项目,你去和客户对接一下,顺便维持一下客户的关系。这个客户是一个新客户,而且要做AI的产品,你去收集一下需求,然后给个内部评估的成本价,最后最好是驻场开发一下。
我:

x总你看要不先把上次差旅报销和补贴发了。
领导:小白,你要懂得奉献,你还年轻,要知道做事业是要牺牲一下小我来成就大我······
我:

那么经过嘚啵嘚,脚打屁股头颠倒的长途二等座之后,也是到了x州。
客户A:诶呀,欢迎欢迎,我们x州钟灵毓秀,山川大好,以后得多来多看。
我:x主任您客气了,我这次主要就是收集一下咱们AI文旅的一些需求。
客户A:

(你小汁)
来,小白,你看我们这里其实需求挺多的,总得需要慢慢来,你来吃饭没有,咱先去吃个饭。
我:走!
我一心热爱工作,x主任您找个人来和我对接就行了。
客户A:彳亍,那你在这里等会儿。
···
快速的等待ing——
此时一阵不明意义的鼓点响起,可惜这里没有大排档椅子

欧呦,原来是关中王来了B工来了。
客户B:你就是小白吧,你好你好。
我:B工你好^-^,咱们今天下午从哪里开始呢?

客户B:今天下午要开个会,你也来一起参加,听一下领导对这个事情说明。
我:好好好。
···
拿起小本本参加会议。
不知名的领导A:在x州地方大力推行文旅兴业的政策下,我们要深入贯彻落实有关决策部署,紧紧围绕文旅产业高质量发展这一主线,立足本地资源禀赋和产业基础,进一步整合区域文化资源、旅游资源和特色产业资源,持续完善基础设施建设,优化公共服务供给,丰富文旅产品业态,提升品牌传播效能,切实把资源优势转化为产业优势、发展优势和竞争优势。
要坚持规划引领、项目带动、业态融合和市场运作相结合,深入挖掘地方历史文化、民俗文化、生态文化和特色文化内涵,积极推动文化、旅游、商业、农业、体育等产业协同发展,着力打造一批具有地方辨识度、市场吸引力和持续运营能力的文旅项目。
同时,我们要强化部门协同,健全工作机制,优化营商环境,加大招商引资和项目服务力度,推动重点任务落地落实,不断提升文旅产业对经济增长、就业带动和乡村振兴的支撑作用,为X州经济社会高质量发展注入新的动力。
(没错我就是恶意水字数)
···
来,小B(客户B),给大家讲讲你对我们这个项目的看法。
客户B:在我看来,AI文旅这件事,核心仍然是资源、内容、服务和运营,人工智能真正能够发挥作用的地方,是把过去散落在各部门、各景区、各平台的数据连接起来,让管理更精细,让服务更主动,让文旅资源更容易被游客看见、理解和消费。
当前不少地方的文旅信息化已经具备一定基础。景区有票务系统,交通部门有客流数据,公安和应急部门有安全监测数据,市场监管部门有商户信息,各类网络平台上还有游客评价、搜索热度和消费反馈。但这些数据往往各在各的系统里,像是几个部门分别守着几口井,井里都有水,却没有形成一张能够统一调度的水网。AI文旅要做的第一步,就是把这些基础数据治理好、标准统一好、权限划分好。
···
我:(叽里咕噜的在讲什么东西)
客户B:所以我们需要做一个既能统筹协调各个地方的数据,又能管理本地的文旅资源,并且以AI驱动的文旅系统。
我:(听君一席话,浪费两小时)
···
会议结束,我拉住B工。

我:B工,我觉得咱们还有些小细节需要再讨论讨论。
客户B:你有哪些不太懂的地方?
我:咱们的数据是从公安和市监那边拿吗,还是怎么搞?
客户B:从Excel导入,到时候会同步给你。
我:那我先设计一版效果图,然后再商量具体的内容。
客户B:那辛苦你了小白。
抽象的开头
开始动手了,既然我们的GPT这么强大,那我肯定不要自己动手。
图来!


哇咔咔,效果看起来还是不错的嘛。
那么我们接下来就是来确定一下技术栈,想快速一点的开发肯定得是上Python了,要用什么框架吗?
NONONO

直接用下面这一套
| 类别 | 技术选型 | 用途 |
|---|---|---|
| 运行环境 | Node.js 24 LTS | 前端开发、构建和依赖管理 |
| 包管理器 | pnpm 10.x | Monorepo和依赖管理 |
| 前端框架 | React 19.2 | 页面和组件开发 |
| 开发构建 | Vite 8.x | 开发服务器和生产构建 |
| 开发语言 | TypeScript 5.x | 类型约束和接口类型生成 |
| 后台组件库 | Ant Design 6.x | 表格、表单、弹窗、菜单和后台组件 |
| 路由 | React Router | 路由、嵌套路由和权限守卫 |
| 服务端状态 | TanStack Query 5 | 请求缓存、分页、刷新和失效管理 |
| 客户端状态 | Zustand | 用户界面和临时全局状态 |
| 表单 | React Hook Form | 复杂表单状态管理 |
| 数据校验 | Zod | 表单与接口数据校验 |
| 图表 | Apache ECharts 6 | 大屏和后台统计图表 |
| 地图 | MapLibre GL JS | 景区地图、路线、热力和区域图层 |
| 空间计算 | Turf.js | 缓冲区、距离、范围等前端空间运算 |
| 日期处理 | dayjs | 时间格式化和日期计算 |
| HTTP请求 | Axios或统一Fetch封装 | REST接口请求 |
| 实时通信 | WebSocket、SSE | 实时指标和AI流式回答 |
| 测试 | Vitest、Testing Library、Playwright | 单元、组件和端到端测试 |
| 代码质量 | ESLint、Prettier、Stylelint | 代码检查和格式统一 |
别问为什么,问就是之前写文档的时候用过的技术栈,能复制的东西就不要自己写 ^-^
接下来我们看看架构,首先可以肯定的是一定要接入AI,至于到时候是做成客服还是做成Agent效果另说,那么就是传统的架构拼上AI、GIS相关的东西就行,什么网关、rabbit就往里面造就完事了。

非常好的架构图,使我的滨州发光旋转。
好了,这个做项目呢就有点像是命题作文,不同的命题其实都有相似的套路和解法。
基本工作准备完毕,来,我们继续去battle,拿一个不同业务流程的完整技术方案出来。
你过来呀!
客户B:哎呦,小白你怎么还在工作,我都要下班了
我:哦哦哦,没什么事情,我来问一点事情,你看这是我给你设计的原型图,B工你看怎么样
客户B:设计的不错,但是我还想增加一点东西···
我:今天不聊腿的事这些细节问题,咱们先确定核心的几块业务,然后我回去给你出几套技术方案
客户B:那我简单给你说一下,主要就是几个点,首先是平台中所有景区、景点、酒店、民宿、餐饮、非遗、文物、旅游线路、活动和公共服务设施啥的,都需要在这一业务线中形成统一档案和唯一编码,并且还得和现在的管理编码兼容。这个到时候通过数据包导入,得兼容一下。
然后是将静态资源档案转化为可持续管理的对象,比如嘞,我们上传的一些附件、图片等等都要做管理滴~并且我们的运营状态也能实时同步显示,主要面向文旅主管部门、县区管理人员和景区运营单位看的,这一部分呢先做一版,后面我们再给你修改。
我们这次还加了一个平台应将客流、交通和停车作为一条协同业务线的需求,这就是会上提到的统一协作(有有吗?可能是听睡着了),数据暂时从Excel导入来测试,这个后面都发给你。
还需要增加一条风险预警,差不多就是客流、交通这些全部都做进去。
还得要一个统一的服务平台给游客使用,这个就用微信小程序吧(嘶——)
还有····


我:好的好的好的(不要再有了),耽误你时间了B工。(说的这都是啥这是,这么多东西就给这么一点钱,还是先做再签,抓紧跑路吧)

(还得挣窝囊费,还是再忍忍吧)
短暂整理一下
主要的核心业务线大概就是管理景区的一些数据、运营状态、管理交通,后面还会有微信小程序啥的。
不过这个项目还好,现在已经是对接到可以说话的领导了,其他人可能插手的情况比较少。
那么先来决定一下我们的一期工程大概都要做点什么,首先是基本的框架要搭起来,然后就是做一个登录系统、权限控制、部门管理等基本的内容,然后就是主要的最重要的还是管理景区的资产和运营状态、驾驶舱的内容以及gis显示啥的,这个肯定是一期要做的事情。
然后就是一些大概率实现不了的东西就是交通管理啥的,暂时只放一个占位符,不进行任何开发。
那么最后做的就是风险预警、工单处理、小程序,小程序可以放在一期,风险预警做一个基础的框架,工单处理也是只做基础的框架,可以完成基本的功能即可,剩下的和AI相关的就放在二期里面。Agent开发通常都是需要基于一个比较成熟完善的系统来说的,现在这个还是处于搭框架的阶段。
中间边迭代边演示。
需求确认和范围管理
简单整理成为表格如下所示
| 需求模块 | 客户需求 | 一期处理方式 | 优先级 | 备注 |
|---|---|---|---|---|
| 用户与权限 | 用户、角色、部门和数据权限 | 完整实现 | P0 | 系统基础能力 |
| 文旅资源管理 | 景区、景点、酒店、非遗等统一档案 | 完整实现核心资源 | P0 | 支持Excel导入 |
| 景区运营 | 状态、开放时间、附件和图片 | 完整实现 | P0 | 驾驶舱依赖 |
| GIS地图 | 景区点位、边界和地图展示 | 实现基础版本 | P0 | 暂不做复杂编辑 |
| 驾驶舱 | 综合指标和地图态势 | 实现一期指标 | P0 | 使用模拟和导入数据 |
| 交通停车 | 实时交通、停车协同 | 页面占位 | P2 | 缺少真实数据源 |
| 风险预警 | 客流和运营状态预警 | 实现规则框架 | P1 | 首期人工数据触发 |
| 工单处理 | 投诉受理和处理 | 实现基础流转 | P1 | 不引入复杂流程引擎 |
| 微信小程序 | 游客查询和基础服务 | 实现基础版本 | P1 | 不做复杂会员体系 |
| AI服务 | 问答、导游和Agent | 二期建设 | P2 | 依赖知识库和业务数据 |
第一个完整的业务,文旅资源建档与发布
管理员登录
→ 创建或导入文旅资源
→ 系统校验统一编码
→ 补充图片、附件和地图位置
→ 提交审核
→ 审核人员通过
→ 正式发布
→ 驾驶舱和地图同步展示
第二个业务,景区运营状态维护与驾驶舱联动
景区运营人员更新开放状态
→ 填写变更原因和生效时间
→ 提交状态
→ 系统记录操作日志
→ 驾驶舱更新景区状态
→ 地图图层改变状态颜色
→ 游客端读取最新开放信息
第三个业务,基础风险预警与处置
导入景区客流数据
→ 系统计算景区承载率
→ 达到规则阈值
→ 自动生成预警
→ 推送至待办中心
→ 管理人员签收
→ 填写处置结果
→ 关闭预警
→ 驾驶舱更新预警数量
然后我们根据业务的内容,将一期系统拆成七个模块:
1. 系统管理
- 用户管理
- 角色管理
- 部门管理
- 菜单管理
- 字典管理
- 登录日志
- 操作日志
- 数据权限
2. 文旅资源中心
- 景区管理
- 景点管理
- 酒店和民宿
- 非遗和文物
- 餐饮资源
- 旅游线路
- 公共服务设施
- 图片和附件管理
- Excel导入
首期重点实现景区、景点和公共服务设施,其他资源暂时先沿用统一模型或提供基础页面。
3. 景区运营中心
- 景区开放状态
- 开放时间
- 承载量
- 门票和预约信息
- 设施状态
- 运营数据填报
- 状态变更记录
4. GIS地图中心
- 景区点位
- 景区边界
- 公共设施点位
- 图层控制
- 地图查询
- 地图选点
- 地图资源展示
5. 驾驶舱
- 文旅资源总览
- 景区运营状态
- 客流趋势
- 热门景区排行
- 地图态势
- 预警统计
- 数据更新时间
6. 风险预警
- 预警规则
- 预警记录
- 预警详情
- 预警签收
- 处置记录
- 预警关闭
7. 工单和游客服务
- 工单列表
- 工单创建
- 工单分派
- 处理记录
- 基础游客端
- 景区查询
- 地图浏览
- 开放状态查询
然后简单说明一下模块之间的关系:
系统管理提供权限
文旅资源提供基础档案
景区运营维护动态状态
GIS负责空间展示
预警读取运营和客流数据
驾驶舱汇总全部业务
游客端读取已发布内容
数据来源
一期项目的数据来源
客户提供Excel数据包
后台人工录入
系统内模拟数据
地图边界和点位文件
Excel导入流程
下载模板
→ 填写数据
→ 上传文件
→ 字段校验
→ 数据预览
→ 错误提示
→ 重复数据处理
→ 确认导入
→ 生成导入报告
必须有的能力:
- 必填字段检查
- 数据类型检查
- 枚举值检查
- 统一编码检查
- 重复资源检查
- 行政区匹配
- 经纬度合法性检查
- 错误行下载
- 导入结果统计
客户发过来的数据是不能直接使用的,得挑选出来合适的字段使用,或者是我们进行预处理之后再导入系统,比如下面这个需要存入系统的字段,其他的字段都是不太必要的,后面需要的再加,或者是客户需要了再加。
| 字段 | 是否必填 | 示例 |
|---|---|---|
| 管理编码 | 是 | WL-JQ-00001 |
| 管理编码(原) | 否 | XX-0101-09 |
| 资源名称 | 是 | X州古城景区 |
| 资源类型 | 是 | 景区 |
| 所属区域 | 是 | X州X县 |
| 经度 | 否 | 116.12345 |
| 纬度 | 否 | 39.12345 |
| 运营状态 | 是 | 正常开放 |
| 最大承载量 | 否 | 30000 |
数据库与原型
必须要做的原型
- 登录页
- 后台总览
- 文旅资源列表
- 资源编辑页
- Excel导入弹窗
- 景区运营状态页面
- 地图资源页面
- 预警列表
- 预警详情
- 工单列表
- 驾驶舱
核心的数据实体主要包含
用户
部门
角色
权限
文旅资源
景区
景点
资源附件
资源图片
资源分类
景区运营状态
运营状态记录
客流数据
停车数据
预警规则
预警事件
预警处置记录
工单
工单处理记录
地图图层
地图要素
数据导入任务
操作审计
一些关键的关系设计
一个景区属于一个行政区域
一个景区包含多个景点
一个景区包含多个附件和图片
一个景区拥有多条运营状态记录
一个景区对应多条客流数据
一条预警规则可以生成多个预警事件
一个预警事件包含多条处置记录
一个工单可以经历多次流转
核心接口设计
POST /auth/login
GET /users/me
GET /tourism-resources
POST /tourism-resources
POST /tourism-resources/import
POST /tourism-resources/{id}/submit
POST /tourism-resources/{id}/approve
GET /scenic-areas
PATCH /scenic-areas/{id}/operation-status
GET /dashboard/overview
GET /dashboard/map-status
GET /alerts
POST /alerts/{id}/accept
POST /alerts/{id}/handle
POST /alerts/{id}/close
GET /tickets
POST /tickets
POST /tickets/{id}/process
一期迭代
迭代一,基础工程
- 前后端工程初始化
- 登录
- 用户和权限
- 部门和角色
- 基础布局
- 数据库迁移
- 日志和异常处理
迭代二,资源管理
- 景区资源模型
- 资源增删改查
- 分类和字典
- 图片和附件
- Excel导入
- 审核发布
迭代三,运营与GIS
- 景区运营状态
- 承载量
- 地图选点
- 景区边界
- POI展示
- 图层控制
迭代四,驾驶舱
- 综合指标
- 地图态势
- 客流趋势
- 景区排行
- 运营状态
- 数据快照
迭代五,预警和工单
- 预警规则
- 预警生成
- 签收和处置
- 工单基础流转
- 待办中心
成本估算
内部成本 = 人员人天成本 + 差旅成本 + 服务器与模型成本(一般2g只考虑部署的时间成本) + 第三方服务成本 + 风险预留
按照一人月22天计算,然后可以大致估算出来开发时间和开发成本,我这里的计算数据就不展示出来了,大家可以自己估算一下。
风险预留也是一个大头,重点风险包括不限于:
- Excel数据质量不可控
- 小程序是否涉及认证主体和备案
- 地图服务是否有授权
- 客户临时增加字段
- 大屏指标没有真实来源
- AI二期边界不清晰
- 客户验收人员中途变化
- 交通数据长期无法提供
等等
关于需求变更
需求变更分为:
缺陷修复
原需求没有正确实现
需求优化
不改变主要工作量
新增需求
增加页面、流程、数据或接口
范围变更
影响排期、成本或架构
最重要的是范围变更,也是我们开发过程中经常遇见的,比如“小白你先把这个页面功能做了看看”“我觉得这个流程得改一改”等等,其实新增功能还是比较好预测的,主要是原有的业务变更。
交付范围
用户权限
- 用户能够正常登录和退出
- 不同角色显示不同菜单
- 县区用户不能查看其他区域受限数据
- 所有关键操作保留审计日志
文旅资源
- 支持景区资源新增、编辑、审核和发布
- 支持标准Excel模板导入
- 错误数据能够定位到具体行
- 资源能够绑定图片、附件和地图位置
景区运营
- 支持维护景区开放状态和承载量
- 状态变更能够记录历史
- 驾驶舱能够读取最新状态
GIS地图
- 能够展示景区和服务设施点位
- 能够根据区域和类型筛选
- 能够查看资源详情
- 能够定位到指定景区
驾驶舱
- 能够展示规定的核心指标
- 指标具有明确数据来源
- 地图和列表能够联动
- 页面在目标分辨率下正常显示
风险预警
- 能够配置基础阈值规则
- 测试数据满足条件时能够生成预警
- 预警能够签收、处置和关闭
- 全流程保留操作记录
工单
- 能够创建和分派工单
- 能够填写处理结果
- 能够查询处理记录
- 能够完成基本关闭流程
最后还要列出交付物:
源代码
数据库脚本
部署文件
接口文档
操作手册
管理员手册
测试报告
验收报告
培训材料
第三方依赖清单
账号权限清单
备份恢复说明
···
拆解需求到任务
那么一条合格的项目任务,需要同时满足以下条件:
- 只有一个主要目标。
- 只有一个直接责任人。
- 能够独立判断完成或未完成。
- 预计工作量原则上不超过两个工作日。
- 明确前置依赖。
- 明确交付物。
- 明确验收标准。
- 能够关联原始需求、页面、接口和测试用例。
例如,下面这条任务不合格。
完成景区管理模块
因为它并没有说明是做列表、表单、接口、数据库,还是导入、审核和权限这些内容。
所以拆解后应该变成:
创建景区资源数据库表
实现景区列表查询接口
实现景区分页查询页面
实现景区新增表单
实现景区新增接口
实现景区编辑接口
实现景区详情页面
实现景区删除权限校验
实现景区图片上传
实现景区附件关联
实现景区Excel导入模板
实现导入数据校验
实现导入错误报告下载
任务名称统一采用“动词+业务对象+明确结果”的格式。
推荐使用:
设计景区资源数据模型
实现景区列表查询接口
编写景区导入字段校验规则
配置景区编辑按钮权限
验证景区状态同步结果
不建议使用:
景区功能
处理地图
完善权限
优化接口
弄一下导入
其他相关工作
当然,你写日志可以这么搞
建立需求台账
拆解前,先建立需求台账。每一条客户需求都必须获得唯一编号,后续的原型、任务、接口、测试用例和验收项都与该编号关联。当然如果你使用禅道、jira、飞书、Teambition或者是其他的什么项目管理工具,就只需要专注于任务的拆解即可。
建议字段如下:
| 字段 | 说明 |
|---|---|
| 需求编号 | 例如 REQ-RES-001 |
| 需求名称 | 景区资源统一建档 |
| 需求来源 | 客户B、会议纪要、补充文件 |
| 原始描述 | 保留客户原话 |
| 标准描述 | 产品人员整理后的正式描述 |
| 所属业务线 | 文旅资源、景区运营、预警等 |
| 用户角色 | 州级管理员、县区管理员、景区人员 |
| 优先级 | P0、P1、P2 |
| 建设阶段 | 一期、二期、预留 |
| 数据来源 | Excel、人工录入、第三方接口 |
| 验收方式 | 页面操作、接口验证、数据比对 |
| 负责人 | 产品或项目负责人 |
| 当前状态 | 待分析、已确认、已冻结、已变更 |
需求状态采用统一流程。
待收集
→ 待分析
→ 待确认
→ 已确认
→ 已拆解
→ 已冻结
→ 开发中
→ 已验收
未经确认的需求不能直接进入开发。开发如果听到说“这个应该很简单吧”,也不能顺手加进迭代里面去。
任务应该怎么写
项目任务建议划分为六类:
讨论
设计
开发
测试
缺陷
交付
其中,讨论和设计属于开发前置工作;开发负责产出功能;测试负责验证功能;缺陷(bug)负责修复已经确认的问题;交付负责部署、文档和验收。
一、讨论任务
讨论任务用于解决尚未明确的问题,目标是形成决定,不直接产出程序功能。
适用场景包括:
- 需求范围讨论
- 业务流程讨论
- 数据口径讨论
- 权限规则讨论
- 技术方案讨论
- 第三方接口讨论
- 验收标准讨论
- 需求变更评审
任务名称采用:
讨论 + 业务对象 + 待确定事项
例如:
讨论景区统一编码兼容方案
讨论景区运营状态流转规则
讨论客流预警阈值计算口径
讨论县区管理员数据权限范围
讨论Excel导入重复数据处理方式
讨论任务必须包含:
背景
待解决问题
参与人员
候选方案
需要作出的决定
计划完成时间
完成标准不能写成“已经开会”等,应该写成:
已经形成明确结论
已经记录未决事项
已经明确责任人
已经更新需求或设计文档
参与方已经确认会议结论
讨论任务的交付物通常是:
- 会议纪要
- 决策记录
- 需求确认单
- 方案评审结论
- 待办事项清单
没有形成结论的会议不算完成。
二、设计任务
设计任务用于将已经确认的需求转化为可以开发的方案。
设计任务可以继续划分为:
产品设计
交互设计
视觉设计
技术设计
数据设计
接口设计
测试设计
部署设计
任务名称采用:
设计 + 业务对象 + 具体成果
例如:
设计景区资源新增流程
设计景区资源列表页面
设计景区运营状态数据模型
设计Excel导入校验规则
设计客流预警规则接口
设计驾驶舱指标数据口径
设计生产环境部署拓扑
设计任务必须明确最终产物。
| 设计类型 | 主要交付物 |
|---|---|
| 产品设计 | 业务流程、功能说明、状态规则 |
| 交互设计 | 页面原型、操作流程、异常提示 |
| 视觉设计 | UI效果图、组件规范、设计标注 |
| 技术设计 | 模块结构、时序图、技术方案 |
| 数据设计 | ER图、表结构、字段字典 |
| 接口设计 | OpenAPI、请求响应结构、错误码 |
| 测试设计 | 测试范围、测试用例、测试数据 |
| 部署设计 | 网络拓扑、资源配置、部署流程 |
设计任务的完成标准包括:
设计成果已经输出
边界和异常场景已经说明
关联需求已经标记
相关开发人员已经评审
评审问题已经处理
设计结果已经进入版本管理
设计任务未完成前,不建议直接进入正式开发。
三、开发任务
开发任务用于实现一个可以验证的功能结果。
开发任务应按照前端、后端、数据、GIS、AI、运维等技术方向拆分,不能只写“开发景区管理模块”。
任务名称采用:
实现 + 业务对象 + 具体能力
例如:
实现景区资源分页查询接口
实现景区资源新增表单
实现景区图片上传功能
实现景区状态变更记录
实现Excel导入数据预览
实现驾驶舱地图点位图层
实现预警事件WebSocket推送
一个标准开发任务必须包含:
关联需求
关联设计
输入条件
实现范围
不包含范围
前置依赖
接口或数据结构
异常处理要求
权限要求
测试要求
完成标准
开发任务原则上控制在半天到两个人日以内(测试普遍稍微多一点时间,不过也是最多16h,bug和小任务可以控制在0.5~6h以内)。超过两个人日时,应继续拆分。
例如“实现景区Excel导入”应拆为:
实现Excel文件上传接口
实现模板版本校验
实现表头校验
实现必填字段校验
实现管理编码校验
实现重复数据检测
实现导入数据预览
实现错误报告下载
实现确认导入功能
实现导入批次记录
开发任务完成标准建议采用统一定义:
代码已经实现
代码已经自测
异常情况已经处理
权限校验已经实现
数据库迁移脚本已经提交
接口文档已经更新
单元测试已经通过
代码已经提交评审
评审问题已经修复
代码已经合并到目标分支
仅仅“代码写完了”不能算完成,需要进行测试,不过一般情况下覆盖不了所有的测试,而且团队人数少的情况下也没有人力进行测试。
四、测试任务
测试任务用于验证某一项需求、功能或业务流程是否符合设计和验收要求。
任务名称采用:
验证 + 业务对象 + 具体场景
例如:
验证景区资源新增流程
验证景区资源导入异常数据处理
验证县区管理员数据隔离
验证景区状态与驾驶舱联动
验证客流达到阈值后生成预警
验证WebSocket断线重连
测试任务可以分为:
单元测试
接口测试
功能测试
集成测试
权限测试
兼容性测试
性能测试
安全测试
回归测试
验收测试
每条测试任务必须包含:
测试对象
测试环境
前置条件
测试数据
执行步骤
预期结果
实际结果
关联需求
关联缺陷
测试任务的完成标准包括:
计划用例已经执行
测试结果已经记录
发现的问题已经创建缺陷
阻塞性问题已经处理
回归测试已经通过
测试报告已经更新
测试发现问题后,不直接修改原开发任务,而应创建独立缺陷任务。
五、缺陷任务
缺陷任务用于记录实际结果与已确认需求、设计或验收标准之间的偏差。
任务名称采用:
修复 + 发生位置 + 问题表现
例如:
修复景区列表区域筛选无效问题
修复Excel导入重复编码未提示问题
修复县区用户能够查看全州数据问题
修复驾驶舱断线后数据不更新问题
修复预警关闭后统计数量未刷新问题
缺陷任务必须包含:
问题描述
发现环境
复现步骤
预期结果
实际结果
影响范围
严重等级
优先级
截图或日志
初步原因
关联版本
关联需求
严重等级建议统一为:
| 等级 | 说明 |
|---|---|
| 致命 | 系统不可用、数据丢失、严重安全问题 |
| 严重 | 核心流程无法完成,没有替代方式 |
| 一般 | 部分功能异常,但存在替代方式 |
| 轻微 | 文案、样式、提示或低影响问题 |
| 建议 | 不属于缺陷,属于体验优化 |
缺陷处理流程:
新建
→ 已确认
→ 修复中
→ 待验证
→ 已关闭
特殊状态包括:
无法复现
重复缺陷
设计如此
延期处理
拒绝修复
重新打开
缺陷关闭标准:
根因已经明确
修复代码已经合并
原问题已经验证通过
关联场景已经回归
没有引入新的问题
缺陷原因和处理结果已经记录
六、交付任务
交付任务用于将开发完成的功能部署到目标环境,并形成客户能够接收和使用的成果。
任务名称采用:
部署、编写、整理、执行 + 交付对象
例如:
部署一期系统至验收环境
执行生产数据库初始化
编写后台管理员操作手册
整理一期接口文档
执行客户系统培训
整理一期验收材料
执行数据库备份恢复演练
交付任务主要包括:
环境部署
配置初始化
数据迁移
发布验证
操作文档
部署文档
测试报告
培训
验收
备份恢复
源代码移交
交付完成标准包括:
目标环境部署成功
系统健康检查通过
数据库迁移执行成功
核心业务冒烟测试通过
配置和账号完成移交
操作文档已经提供
客户培训已经完成
遗留问题已经登记
交付记录已经签字确认
任务之间的标准关系
一个功能从提出到交付,通常按照以下链路推进:
讨论任务
→ 设计任务
→ 开发任务
→ 测试任务
→ 缺陷任务
→ 回归测试
→ 交付任务
例如“景区运营状态管理”可以拆成:
讨论景区运营状态范围
讨论运营状态转换规则
设计景区状态业务流程
设计景区状态数据库结构
设计景区状态变更页面
设计景区状态接口
实现景区状态查询接口
实现景区状态变更接口
实现状态变更记录
实现后台状态变更表单
实现驾驶舱状态同步
验证景区状态正常变更
验证非法状态转换被拦截
验证县区用户数据权限
验证驾驶舱状态实时更新
修复定时状态未按时生效问题
修复状态更新后地图颜色未变化问题
部署景区状态功能至验收环境
整理景区状态操作说明
不要把任务类型和任务状态混在一起
“开发”“测试”“缺陷”是任务类型。
“待处理”“进行中”“已完成”是任务状态。
推荐任务类型:
讨论
设计
开发
测试
缺陷
交付
文档
运维
推荐任务状态:
待澄清
待处理
进行中
待评审
待联调
待测试
待验收
已完成
已阻塞
已取消
例如:
任务类型:设计
任务状态:待评审
任务类型:开发
任务状态:进行中
任务类型:缺陷
任务状态:待验证
这样才能统计:
- 本周完成了多少开发任务
- 当前有多少设计任务未评审
- 测试阶段发现了多少缺陷
- 缺陷平均修复时间是多少
- 哪类任务最容易阻塞项目
统一任务模板
每条任务至少包含以下字段:
任务编号
任务类型
任务名称
所属项目
所属迭代
关联需求
任务描述
输入条件
输出结果
不包含范围
前置依赖
负责人
协作人
预计人天
计划开始时间
计划结束时间
完成标准
验收人
当前状态
风险说明
相关文档
相关接口
相关页面
相关测试用例
任务描述模板可以统一为:
背景
为什么需要执行该任务。
目标
完成后要解决什么问题。
范围
本任务需要完成哪些内容。
非范围
本任务明确不处理哪些内容。
输入
执行任务所需的需求、设计、数据或接口。
输出
完成后必须提交哪些代码、页面、文档或结果。
依赖
开始前需要完成哪些任务。
完成标准
满足哪些可验证条件后可以关闭任务。
核心写法示例
一条任务必须回答六个问题:
为什么做
具体做什么
明确不做什么
依赖什么
产出什么
如何证明已经完成
例如:
任务名称
实现景区资源Excel表头校验
为什么做
防止客户上传错误模板后进入后续导入流程。
具体做什么
读取上传文件第一行表头,对照当前模板版本校验必填列、
列名和重复列。
明确不做什么
本任务不校验具体数据行,也不写入正式业务数据。
依赖什么
标准导入模板和字段字典已经确认。
产出什么
表头校验服务、错误码、接口响应和单元测试。
如何证明完成
正确模板校验通过;缺列、错列和重复列能够返回明确错误;
相关自动化测试全部通过。
基础平台与工程底座任务拆解
阶段目标
本阶段目标是建立后续业务开发所依赖的公共底座,使系统达到以下状态:
- 前后端工程能够在本地、测试环境独立启动。
- 管理后台能够完成登录、退出和身份恢复。
- 用户、部门、角色、权限具备基础数据结构。
- 前端具备路由守卫、按钮权限和统一请求能力。
- 后端具备认证鉴权、异常处理、日志记录和数据库迁移能力。
- PostgreSQL、Redis、RabbitMQ和对象存储可以通过容器启动。
- OpenAPI可以生成前端接口类型。
- 核心流程具备自动化测试。
- 项目可以通过CI完成检查、测试和构建。
- 测试环境可以重复部署,并具备基本回滚能力。
本阶段完成后,后续业务模块只需要按照既定规范增加领域模块,不需要重复建设登录、权限、异常处理、日志、部署和测试框架等。
阶段范围
本阶段包含
项目仓库和目录结构
前端基础工程
后端基础工程
数据库和缓存连接
登录认证
用户、部门、角色和权限基础模型
路由权限和按钮权限
统一请求和响应
统一异常处理
结构化日志
操作审计基础能力
OpenAPI接口生成
Docker开发环境
CI基础流水线
自动化测试基础框架
部署和开发文档
本阶段明确不包含
景区资源管理
景点、酒店、民宿和非遗管理
Excel业务数据导入
GIS地图业务
驾驶舱真实指标
风险预警业务
工单业务
游客端小程序
AI知识库
智能问答
数字导游
交通停车业务
这些内容进入后续迭代。本阶段可以预留目录和接口空间,但不能把业务开发混入基础底座。
任务分类
本阶段任务分为六类:
讨论任务
设计任务
开发任务
测试任务
缺陷任务
交付任务
讨论任务
讨论任务的目标是形成明确决定。只开会、不形成结论不能关闭任务。
| 编号 | 任务名称 | 主要输出 | 验收标准 |
|---|---|---|---|
| DISC-001 | 讨论一期基础阶段范围 | 阶段范围说明 | 明确包含项和不包含项 |
| DISC-002 | 讨论项目决策和确认机制 | 干系人清单 | 明确需求提出人、确认人和验收人 |
| DISC-003 | 讨论前后端仓库组织方式 | 仓库决策记录 | 确认Monorepo或多仓库方案 |
| DISC-004 | 讨论开发分支管理方式 | Git分支规范 | 明确主分支、开发分支和发布分支 |
| DISC-005 | 讨论身份认证方案 | 认证决策记录 | 明确本地认证、OIDC或统一认证边界 |
| DISC-006 | 讨论Token和会话策略 | 会话规范 | 明确有效期、刷新、注销和失效方式 |
| DISC-007 | 讨论用户和组织来源 | 用户来源说明 | 明确本地维护或第三方同步 |
| DISC-008 | 讨论权限控制层级 | 权限范围说明 | 明确菜单、路由、按钮和数据权限 |
| DISC-009 | 讨论行政区数据权限预留 | 数据权限草案 | 明确全州、县区和景区级范围 |
| DISC-010 | 讨论开发环境依赖 | 环境依赖清单 | 确认PostgreSQL、Redis等组件 |
| DISC-011 | 讨论测试环境部署方式 | 部署决策记录 | 明确服务器、域名、端口和网络限制 |
| DISC-012 | 讨论浏览器和分辨率要求 | 兼容性范围 | 明确后台支持浏览器和目标分辨率 |
| DISC-013 | 讨论接口响应和错误码规范 | 接口规范结论 | 统一响应格式和错误码命名 |
| DISC-014 | 讨论日志和审计范围 | 日志范围说明 | 明确登录、操作、错误和接口日志 |
| DISC-015 | 讨论敏感信息处理规则 | 脱敏规则 | 明确密码、Token、手机号等处理方式 |
| DISC-016 | 讨论代码评审规则 | 评审规范 | 明确合并条件和评审责任人 |
| DISC-017 | 讨论任务和缺陷流转方式 | 项目工作流 | 确认任务状态、缺陷等级和关闭条件 |
| DISC-018 | 讨论阶段退出标准 | 阶段验收表 | 形成可执行的阶段完成标准 |
讨论任务统一完成条件
已经形成书面结论
未决问题已经单独登记
结论已经明确责任人
相关文档已经更新
关键参与方已经确认
···
设计任务
- 总体工程设计
| 编号 | 任务名称 | 交付物 |
|---|---|---|
| DES-001 | 设计项目总体目录结构 | 项目目录设计 |
| DES-002 | 设计前端Monorepo结构 | 前端工作区设计 |
| DES-003 | 设计后端模块化目录结构 | 后端分层设计 |
| DES-004 | 设计公共包划分 | 公共模块清单 |
| DES-005 | 设计环境配置体系 | 环境变量规范 |
| DES-006 | 设计本地、测试和生产环境差异 | 环境矩阵 |
| DES-007 | 设计版本管理规则 | 版本发布规范 |
| DES-008 | 设计依赖锁定规则 | 依赖管理规范 |
- 前端基础设计
| 编号 | 任务名称 | 交付物 |
|---|---|---|
| DES-FE-001 | 设计后台整体布局 | 布局原型 |
| DES-FE-002 | 设计登录页面 | 登录页原型 |
| DES-FE-003 | 设计前端路由结构 | 路由树 |
| DES-FE-004 | 设计前端权限守卫 | 权限流程图 |
| DES-FE-005 | 设计按钮权限组件接口 | 权限组件设计 |
| DES-FE-006 | 设计统一请求客户端 | 请求层设计 |
| DES-FE-007 | 设计接口错误处理方式 | 错误处理流程 |
| DES-FE-008 | 设计服务端状态管理边界 | Query使用规范 |
| DES-FE-009 | 设计客户端状态管理边界 | Zustand使用规范 |
| DES-FE-010 | 设计前端主题变量 | 设计Token清单 |
| DES-FE-011 | 设计403、404和500页面 | 异常页原型 |
| DES-FE-012 | 设计前端代码分层规范 | 模块目录规范 |
- 后端基础设计
| 编号 | 任务名称 | 交付物 |
|---|---|---|
| DES-BE-001 | 设计FastAPI应用启动结构 | 应用初始化设计 |
| DES-BE-002 | 设计接口版本规则 | API版本规范 |
| DES-BE-003 | 设计统一响应结构 | 响应Schema |
| DES-BE-004 | 设计业务错误码体系 | 错误码规范 |
| DES-BE-005 | 设计异常处理流程 | 异常映射表 |
| DES-BE-006 | 设计请求追踪机制 | request_id和trace_id规范 |
| DES-BE-007 | 设计数据库会话管理 | Session生命周期说明 |
| DES-BE-008 | 设计数据库迁移规范 | Alembic迁移规范 |
| DES-BE-009 | 设计Redis Key规范 | Redis Key命名规则 |
| DES-BE-010 | 设计健康检查接口 | 健康检查规范 |
| DES-BE-011 | 设计操作审计结构 | 审计字段清单 |
| DES-BE-012 | 设计服务启动配置检查 | 启动校验规则 |
- 身份与权限设计
| 编号 | 任务名称 | 交付物 |
|---|---|---|
| DES-IAM-001 | 设计用户数据模型 | 用户表设计 |
| DES-IAM-002 | 设计部门数据模型 | 部门表设计 |
| DES-IAM-003 | 设计角色数据模型 | 角色表设计 |
| DES-IAM-004 | 设计权限数据模型 | 权限表设计 |
| DES-IAM-005 | 设计用户角色关联关系 | 关联表设计 |
| DES-IAM-006 | 设计角色权限关联关系 | 关联表设计 |
| DES-IAM-007 | 设计登录流程 | 登录时序图 |
| DES-IAM-008 | 设计Token刷新流程 | 刷新时序图 |
| DES-IAM-009 | 设计退出和Token失效流程 | 注销时序图 |
| DES-IAM-010 | 设计密码存储方式 | 密码安全规范 |
| DES-IAM-011 | 设计登录失败锁定规则 | 账号锁定规范 |
| DES-IAM-012 | 设计数据权限上下文 | 数据范围对象设计 |
| DES-IAM-013 | 设计超级管理员初始化方式 | 初始化方案 |
| DES-IAM-014 | 设计权限缓存和失效方式 | 权限缓存方案 |
- 测试与部署设计
| 编号 | 任务名称 | 交付物 |
|---|---|---|
| DES-TST-001 | 设计前端测试目录 | 前端测试规范 |
| DES-TST-002 | 设计后端测试目录 | 后端测试规范 |
| DES-TST-003 | 设计测试数据生成方式 | Fixture规范 |
| DES-TST-004 | 设计登录E2E测试流程 | E2E测试方案 |
| DES-TST-005 | 设计权限测试矩阵 | 权限用例清单 |
| DES-OPS-001 | 设计Docker Compose拓扑 | 容器拓扑图 |
| DES-OPS-002 | 设计Nginx路由结构 | 代理配置方案 |
| DES-OPS-003 | 设计CI执行流程 | CI流程图 |
| DES-OPS-004 | 设计发布和回滚流程 | 发布规范 |
| DES-OPS-005 | 设计数据库备份方案 | 备份恢复方案 |
| DES-OPS-006 | 设计密钥和配置管理方式 | 配置安全规范 |
设计任务和退出条件
设计文档已经完成
关键边界已经明确
异常场景已经覆盖
开发和测试人员已经评审
评审问题已经处理
最终版本已经进入版本管理
开发任务
- 仓库和工程初始化
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-BASE-001 | 创建项目根仓库 | DES-001 | 仓库可以正常克隆 |
| DEV-BASE-002 | 创建frontend目录 | DEV-BASE-001 | 前端目录已提交 |
| DEV-BASE-003 | 创建backend目录 | DEV-BASE-001 | 后端目录已提交 |
| DEV-BASE-004 | 创建infrastructure目录 | DEV-BASE-001 | 基础设施目录已提交 |
| DEV-BASE-005 | 创建deploy目录 | DEV-BASE-001 | 部署目录已提交 |
| DEV-BASE-006 | 创建docs目录 | DEV-BASE-001 | 文档目录已提交 |
| DEV-BASE-007 | 创建根目录README | DEV-BASE-001 | 包含项目启动入口 |
| DEV-BASE-008 | 创建统一.gitignore | DEV-BASE-001 | 构建产物和密钥不会提交 |
| DEV-BASE-009 | 创建.editorconfig | DEV-BASE-001 | IDE格式规则统一 |
| DEV-BASE-010 | 创建环境变量示例文件 | DES-005 | 不包含真实密钥 |
| DEV-BASE-011 | 配置提交信息规范 | DISC-004 | 非法提交可被检查 |
| DEV-BASE-012 | 配置Git Hook | DEV-BASE-011 | 提交前自动执行基础检查 |
- 前端基础工程
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-FE-001 | 初始化pnpm workspace | DEV-BASE-002 | workspace命令可以执行 |
| DEV-FE-002 | 创建admin React应用 | DEV-FE-001 | 后台应用可以启动 |
| DEV-FE-003 | 创建cockpit React应用 | DEV-FE-001 | 驾驶舱空壳可以启动 |
| DEV-FE-004 | 创建共享ui包 | DEV-FE-001 | 应用可以引用公共组件 |
| DEV-FE-005 | 创建共享types包 | DEV-FE-001 | 公共类型可以导入 |
| DEV-FE-006 | 创建api-client包 | DEV-FE-001 | 接口代码有固定目录 |
| DEV-FE-007 | 创建auth公共包 | DEV-FE-001 | 权限逻辑具备独立目录 |
| DEV-FE-008 | 创建theme公共包 | DEV-FE-001 | 主题变量可共享 |
| DEV-FE-009 | 配置TypeScript基础规则 | DEV-FE-002 | 类型检查通过 |
| DEV-FE-010 | 配置ESLint | DEV-FE-002 | lint命令可执行 |
| DEV-FE-011 | 配置Prettier | DEV-FE-002 | 格式化命令可执行 |
| DEV-FE-012 | 配置Stylelint | DEV-FE-002 | 样式检查可执行 |
| DEV-FE-013 | 配置Vitest | DEV-FE-002 | 示例测试通过 |
| DEV-FE-014 | 配置React Testing Library | DEV-FE-013 | 示例组件测试通过 |
| DEV-FE-015 | 配置Playwright | DEV-FE-002 | 浏览器测试可启动 |
| DEV-FE-016 | 配置开发环境代理 | DEV-FE-002 | API请求可代理到后端 |
| DEV-FE-017 | 配置前端环境变量读取 | DEV-FE-002 | 不同环境配置可切换 |
| DEV-FE-018 | 配置生产构建命令 | DEV-FE-002 | admin构建成功 |
| DEV-FE-019 | 配置驾驶舱构建命令 | DEV-FE-003 | cockpit构建成功 |
- 前端公共能力
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-FE-020 | 集成Ant Design | DEV-FE-002 | 基础组件正常显示 |
| DEV-FE-021 | 配置全局主题变量 | DEV-FE-020 | 主题配置统一生效 |
| DEV-FE-022 | 配置React Router | DEV-FE-002 | 基础路由正常跳转 |
| DEV-FE-023 | 实现后台基础布局 | DEV-FE-020、022 | 顶栏、侧栏和内容区可用 |
| DEV-FE-024 | 实现菜单配置模型 | DEV-FE-023 | 菜单可由配置生成 |
| DEV-FE-025 | 实现面包屑组件 | DEV-FE-023 | 路由变化时正确展示 |
| DEV-FE-026 | 实现页面加载状态组件 | DEV-FE-020 | 页面加载状态统一 |
| DEV-FE-027 | 实现空数据状态组件 | DEV-FE-020 | 无数据时统一展示 |
| DEV-FE-028 | 实现全局错误边界 | DEV-FE-002 | 页面错误不会导致整站白屏 |
| DEV-FE-029 | 实现403页面 | DES-FE-011 | 无权限时可展示 |
| DEV-FE-030 | 实现404页面 | DES-FE-011 | 未知路由可展示 |
| DEV-FE-031 | 实现500页面 | DES-FE-011 | 系统错误可展示 |
| DEV-FE-032 | 配置TanStack Query | DEV-FE-002 | Query Provider可用 |
| DEV-FE-033 | 配置Zustand基础Store | DEV-FE-002 | 全局UI状态可保存 |
| DEV-FE-034 | 实现统一HTTP客户端 | DES-FE-006 | 统一处理基础地址和超时 |
| DEV-FE-035 | 实现请求认证信息注入 | DEV-FE-034 | 登录后请求携带凭证 |
| DEV-FE-036 | 实现统一接口错误转换 | DEV-FE-034 | 错误能转换为统一结构 |
| DEV-FE-037 | 实现全局错误提示 | DEV-FE-036 | 常见接口错误有用户提示 |
| DEV-FE-038 | 实现请求取消机制 | DEV-FE-034 | 页面卸载后可取消请求 |
| DEV-FE-039 | 配置OpenAPI代码生成 | DEV-FE-006 | 可生成接口类型 |
| DEV-FE-040 | 增加接口生成脚本 | DEV-FE-039 | pnpm命令可重新生成接口 |
- 后端基础工程
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-BE-001 | 使用uv初始化Python项目 | DEV-BASE-003 | uv同步依赖成功 |
| DEV-BE-002 | 创建FastAPI应用入口 | DEV-BE-001 | 服务可以启动 |
| DEV-BE-003 | 创建应用工厂 | DEV-BE-002 | 测试可创建独立应用 |
| DEV-BE-004 | 配置Pydantic Settings | DEV-BE-001 | 环境变量可以加载 |
| DEV-BE-005 | 实现启动配置校验 | DEV-BE-004 | 缺少必要配置时启动失败 |
| DEV-BE-006 | 配置异步SQLAlchemy | DEV-BE-004 | 可以连接PostgreSQL |
| DEV-BE-007 | 配置数据库连接池 | DEV-BE-006 | 连接池参数可配置 |
| DEV-BE-008 | 配置Alembic | DEV-BE-006 | 可以执行迁移 |
| DEV-BE-009 | 创建初始数据库迁移 | DEV-BE-008 | 空库可升级到最新版本 |
| DEV-BE-010 | 配置Redis客户端 | DEV-BE-004 | 可以读写测试Key |
| DEV-BE-011 | 配置RabbitMQ连接参数 | DEV-BE-004 | 配置可以被Worker读取 |
| DEV-BE-012 | 配置对象存储客户端骨架 | DEV-BE-004 | 可以完成连接检查 |
| DEV-BE-013 | 实现请求ID中间件 | DES-BE-006 | 每次请求具有request_id |
| DEV-BE-014 | 实现统一响应模型 | DES-BE-003 | 接口使用统一结构 |
| DEV-BE-015 | 实现统一异常处理器 | DES-BE-005 | 异常转换为标准错误 |
| DEV-BE-016 | 实现业务异常基类 | DEV-BE-015 | 模块可以定义业务错误 |
| DEV-BE-017 | 建立错误码注册机制 | DEV-BE-016 | 错误码不会重复 |
| DEV-BE-018 | 配置结构化日志 | DEV-BE-013 | 日志包含请求和服务信息 |
| DEV-BE-019 | 实现访问日志中间件 | DEV-BE-018 | 记录接口、状态和耗时 |
| DEV-BE-020 | 实现敏感字段过滤器 | DEV-BE-018 | 密码和Token不进入日志 |
| DEV-BE-021 | 实现存活检查接口 | DES-BE-010 | /health/live可访问 |
| DEV-BE-022 | 实现就绪检查接口 | DES-BE-010 | 检查数据库和Redis |
| DEV-BE-023 | 配置OpenAPI标题和版本 | DEV-BE-002 | 文档信息正确 |
| DEV-BE-024 | 配置API版本前缀 | DES-BE-002 | 接口统一使用/api/v1 |
| DEV-BE-025 | 配置CORS安全策略 | DEV-BE-002 | 仅允许配置域名 |
| DEV-BE-026 | 配置请求体大小限制 | DEV-BE-002 | 超限请求被拒绝 |
| DEV-BE-027 | 配置基础接口限流骨架 | DEV-BE-010 | 可为登录接口配置限流 |
- 用户、部门、角色和权限模型
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-IAM-001 | 创建用户SQLAlchemy模型 | DES-IAM-001 | 字段和约束符合设计 |
| DEV-IAM-002 | 创建部门SQLAlchemy模型 | DES-IAM-002 | 支持部门层级 |
| DEV-IAM-003 | 创建角色SQLAlchemy模型 | DES-IAM-003 | 角色编码唯一 |
| DEV-IAM-004 | 创建权限SQLAlchemy模型 | DES-IAM-004 | 权限编码唯一 |
| DEV-IAM-005 | 创建用户角色关联模型 | DES-IAM-005 | 支持多角色 |
| DEV-IAM-006 | 创建角色权限关联模型 | DES-IAM-006 | 支持多权限 |
| DEV-IAM-007 | 创建IAM数据库迁移 | DEV-IAM-001至006 | 新库可正确建表 |
| DEV-IAM-008 | 创建用户领域Schema | DEV-IAM-001 | 输入输出模型隔离 |
| DEV-IAM-009 | 创建角色领域Schema | DEV-IAM-003 | 输入输出模型隔离 |
| DEV-IAM-010 | 创建权限领域Schema | DEV-IAM-004 | 输入输出模型隔离 |
| DEV-IAM-011 | 实现用户Repository | DEV-IAM-001 | 支持按用户名和ID查询 |
| DEV-IAM-012 | 实现角色Repository | DEV-IAM-003 | 支持查询角色权限 |
| DEV-IAM-013 | 实现部门Repository | DEV-IAM-002 | 支持查询部门层级 |
| DEV-IAM-014 | 实现权限聚合查询 | DEV-IAM-012 | 能获取用户全部权限 |
| DEV-IAM-015 | 实现超级管理员初始化脚本 | DES-IAM-013 | 首次部署可创建管理员 |
| DEV-IAM-016 | 实现基础角色初始化脚本 | DEV-IAM-015 | 可初始化标准角色 |
| DEV-IAM-017 | 实现基础权限初始化脚本 | DEV-IAM-016 | 可初始化权限编码 |
| DEV-IAM-018 | 实现初始化脚本幂等控制 | DEV-IAM-015至017 | 重复执行不会产生重复数据 |
- 登录认证开发
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-AUTH-001 | 集成密码哈希库 | DES-IAM-010 | 密码不以明文保存 |
| DEV-AUTH-002 | 实现密码校验服务 | DEV-AUTH-001 | 正确和错误密码可区分 |
| DEV-AUTH-003 | 实现访问令牌生成 | DISC-006 | Token包含必要声明 |
| DEV-AUTH-004 | 实现刷新令牌生成 | DEV-AUTH-003 | 刷新令牌可独立失效 |
| DEV-AUTH-005 | 实现Token解析和校验 | DEV-AUTH-003 | 过期和伪造Token被拒绝 |
| DEV-AUTH-006 | 实现登录接口 | DEV-AUTH-002至005 | 正确账号可登录 |
| DEV-AUTH-007 | 实现登录失败次数记录 | DEV-BE-010 | Redis记录失败次数 |
| DEV-AUTH-008 | 实现登录失败锁定 | DEV-AUTH-007 | 达到阈值后临时锁定 |
| DEV-AUTH-009 | 实现刷新Token接口 | DEV-AUTH-004、005 | 有效刷新令牌可换取新令牌 |
| DEV-AUTH-010 | 实现退出接口 | DEV-BE-010 | 退出后Token失效 |
| DEV-AUTH-011 | 实现当前用户接口 | DEV-IAM-014 | 返回用户、角色和权限 |
| DEV-AUTH-012 | 实现认证依赖 | DEV-AUTH-005 | 接口可要求登录 |
| DEV-AUTH-013 | 实现权限校验依赖 | DEV-IAM-014 | 接口可要求指定权限 |
| DEV-AUTH-014 | 实现数据权限上下文骨架 | DES-IAM-012 | 请求上下文包含数据范围 |
| DEV-AUTH-015 | 实现登录日志记录 | DEV-AUTH-006 | 成功和失败均有日志 |
| DEV-AUTH-016 | 实现退出日志记录 | DEV-AUTH-010 | 退出行为可追踪 |
| DEV-AUTH-017 | 实现操作审计装饰器或服务 | DES-BE-011 | 业务接口可记录审计日志 |
- 前端登录与权限
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-FEAUTH-001 | 实现登录页面布局 | DES-FE-002 | 页面符合设计 |
| DEV-FEAUTH-002 | 实现登录表单校验 | DEV-FEAUTH-001 | 空值和格式错误被拦截 |
| DEV-FEAUTH-003 | 接入登录接口 | DEV-AUTH-006 | 正确账号可进入后台 |
| DEV-FEAUTH-004 | 实现认证状态Store | DEV-FE-033 | 可保存当前用户状态 |
| DEV-FEAUTH-005 | 实现应用启动身份恢复 | DEV-AUTH-011 | 刷新页面后身份可恢复 |
| DEV-FEAUTH-006 | 实现访问令牌刷新 | DEV-AUTH-009 | 令牌到期可自动刷新 |
| DEV-FEAUTH-007 | 实现退出功能 | DEV-AUTH-010 | 退出后返回登录页 |
| DEV-FEAUTH-008 | 实现路由认证守卫 | DEV-FE-022 | 未登录用户无法进入后台 |
| DEV-FEAUTH-009 | 实现路由权限守卫 | DEV-AUTH-013 | 无权限用户进入403页 |
| DEV-FEAUTH-010 | 实现按钮权限组件 | DES-FE-005 | 无权限按钮不展示或禁用 |
| DEV-FEAUTH-011 | 实现菜单权限过滤 | DEV-FE-024 | 只展示有权菜单 |
| DEV-FEAUTH-012 | 实现Token失效处理 | DEV-FE-036 | 失效后清理状态并重新登录 |
| DEV-FEAUTH-013 | 实现登录错误提示 | DEV-FE-037 | 错误原因有明确提示 |
| DEV-FEAUTH-014 | 实现账号锁定提示 | DEV-AUTH-008 | 展示锁定状态和恢复提示 |
| DEV-FEAUTH-015 | 实现当前用户展示组件 | DEV-AUTH-011 | 顶栏显示用户信息 |
- 基础管理页面
本阶段只实现能够验证权限底座的最小页面。
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-ADM-001 | 实现当前用户个人信息页 | DEV-AUTH-011 | 可以查看当前账号信息 |
| DEV-ADM-002 | 实现用户基础列表接口 | DEV-IAM-011 | 支持分页和关键词查询 |
| DEV-ADM-003 | 实现用户基础列表页 | DEV-ADM-002 | 可以查看用户列表 |
| DEV-ADM-004 | 实现部门树查询接口 | DEV-IAM-013 | 返回正确层级结构 |
| DEV-ADM-005 | 实现部门树展示页 | DEV-ADM-004 | 可以查看组织层级 |
| DEV-ADM-006 | 实现角色列表接口 | DEV-IAM-012 | 可以查询角色 |
| DEV-ADM-007 | 实现角色列表页 | DEV-ADM-006 | 可以查看角色列表 |
| DEV-ADM-008 | 实现权限列表接口 | DEV-IAM-014 | 可以查询权限编码 |
| DEV-ADM-009 | 实现权限列表页 | DEV-ADM-008 | 可以查看权限列表 |
- 基础设施和部署开发
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-OPS-001 | 编写PostgreSQL容器配置 | DES-OPS-001 | 数据库可启动 |
| DEV-OPS-002 | 编写Redis容器配置 | DES-OPS-001 | Redis可启动 |
| DEV-OPS-003 | 编写RabbitMQ容器配置 | DES-OPS-001 | 管理端和Broker可启动 |
| DEV-OPS-004 | 编写对象存储容器配置 | DES-OPS-001 | Bucket可初始化 |
| DEV-OPS-005 | 编写后端开发Dockerfile | DEV-BE-002 | 后端镜像可构建 |
| DEV-OPS-006 | 编写后端生产Dockerfile | DEV-BE-002 | 生产镜像可启动 |
| DEV-OPS-007 | 编写前端生产Dockerfile | DEV-FE-018 | 前端镜像可构建 |
| DEV-OPS-008 | 编写Docker Compose开发配置 | DEV-OPS-001至007 | 一条命令启动全部依赖 |
| DEV-OPS-009 | 配置容器健康检查 | DEV-BE-021、022 | 异常服务可以被识别 |
| DEV-OPS-010 | 编写Nginx后台静态资源配置 | DEV-FE-018 | 后台可通过Nginx访问 |
| DEV-OPS-011 | 编写Nginx API代理配置 | DEV-BE-024 | /api可代理到后端 |
| DEV-OPS-012 | 编写Nginx安全头配置 | DISC-015 | 基础安全头生效 |
| DEV-OPS-013 | 编写数据库初始化脚本 | DEV-BE-009 | 空环境可自动初始化 |
| DEV-OPS-014 | 编写管理员初始化命令 | DEV-IAM-015 | 部署后可创建管理员 |
| DEV-OPS-015 | 编写数据库备份脚本 | DES-OPS-005 | 能生成可用备份文件 |
| DEV-OPS-016 | 编写数据库恢复脚本 | DEV-OPS-015 | 能在空库恢复数据 |
| DEV-OPS-017 | 编写本地一键启动脚本 | DEV-OPS-008 | 新开发人员可以快速启动 |
| DEV-OPS-018 | 编写本地一键停止脚本 | DEV-OPS-008 | 可清理容器和网络 |
| DEV-OPS-019 | 编写日志目录和轮转配置 | DEV-BE-018 | 日志不会无限增长 |
- CI基础流水线
| 编号 | 原子任务 | 依赖 | 完成标准 |
|---|---|---|---|
| DEV-CI-001 | 配置前端依赖安装缓存 | DEV-FE-001 | CI可复用缓存 |
| DEV-CI-002 | 配置前端格式检查 | DEV-FE-011 | 格式错误导致失败 |
| DEV-CI-003 | 配置前端Lint检查 | DEV-FE-010 | Lint错误导致失败 |
| DEV-CI-004 | 配置前端类型检查 | DEV-FE-009 | 类型错误导致失败 |
| DEV-CI-005 | 配置前端单元测试 | DEV-FE-013 | 测试失败阻止合并 |
| DEV-CI-006 | 配置前端构建 | DEV-FE-018 | 构建失败阻止合并 |
| DEV-CI-007 | 配置后端依赖安装缓存 | DEV-BE-001 | CI可复用缓存 |
| DEV-CI-008 | 配置后端格式检查 | DEV-BE-001 | 格式错误导致失败 |
| DEV-CI-009 | 配置后端静态检查 | DEV-BE-001 | 静态错误导致失败 |
| DEV-CI-010 | 配置后端单元测试 | DEV-BE-003 | 测试失败阻止合并 |
| DEV-CI-011 | 配置Alembic迁移检查 | DEV-BE-008 | 迁移异常导致失败 |
| DEV-CI-012 | 配置OpenAPI导出 | DEV-BE-023 | CI可生成接口文档 |
| DEV-CI-013 | 配置前端接口类型一致性检查 | DEV-FE-039 | 接口变化可被发现 |
| DEV-CI-014 | 配置Docker镜像构建 | DEV-OPS-005至007 | 镜像可在CI构建 |
| DEV-CI-015 | 配置合并请求检查规则 | DISC-016 | 未通过流水线不能合并 |
测试任务
- 工程基础测试
| 编号 | 测试任务 | 预期结果 |
|---|---|---|
| TST-BASE-001 | 验证新环境安装前端依赖 | 无缺失依赖 |
| TST-BASE-002 | 验证新环境安装后端依赖 | uv同步成功 |
| TST-BASE-003 | 验证前端开发服务器启动 | admin和cockpit均可访问 |
| TST-BASE-004 | 验证后端服务启动 | 健康检查正常 |
| TST-BASE-005 | 验证数据库迁移 | 空库可以升级 |
| TST-BASE-006 | 验证迁移重复执行 | 不产生重复结构 |
| TST-BASE-007 | 验证Redis连接 | 读写正常 |
| TST-BASE-008 | 验证RabbitMQ连接 | Broker可访问 |
| TST-BASE-009 | 验证对象存储连接 | Bucket操作正常 |
| TST-BASE-010 | 验证Docker Compose一键启动 | 所有服务健康 |
| TST-BASE-011 | 验证生产构建 | 前后端构建成功 |
| TST-BASE-012 | 验证Nginx代理 | 页面和API均可访问 |
- 登录认证测试
| 编号 | 测试任务 | 预期结果 |
|---|---|---|
| TST-AUTH-001 | 验证正确账号登录 | 返回有效身份信息 |
| TST-AUTH-002 | 验证错误密码登录 | 返回明确错误 |
| TST-AUTH-003 | 验证不存在账号登录 | 不泄露账号是否存在 |
| TST-AUTH-004 | 验证连续失败锁定 | 达到阈值后账号被锁定 |
| TST-AUTH-005 | 验证锁定到期恢复 | 到期后可以重新登录 |
| TST-AUTH-006 | 验证访问令牌有效期 | 到期Token不可使用 |
| TST-AUTH-007 | 验证刷新令牌 | 可以获得新访问令牌 |
| TST-AUTH-008 | 验证伪造Token | 请求被拒绝 |
| TST-AUTH-009 | 验证退出登录 | 退出后Token不可继续使用 |
| TST-AUTH-010 | 验证当前用户接口 | 返回正确用户和权限 |
| TST-AUTH-011 | 验证未登录路由访问 | 跳转登录页面 |
| TST-AUTH-012 | 验证无权限路由访问 | 显示403页面 |
| TST-AUTH-013 | 验证按钮权限 | 无权限按钮不可操作 |
| TST-AUTH-014 | 验证菜单权限 | 无权限菜单不显示 |
| TST-AUTH-015 | 验证刷新页面身份恢复 | 用户无需重新登录 |
| TST-AUTH-016 | 验证登录和退出日志 | 审计记录完整 |
- 接口和异常测试
| 编号 | 测试任务 | 预期结果 |
|---|---|---|
| TST-API-001 | 验证统一响应结构 | 所有接口格式一致 |
| TST-API-002 | 验证参数校验错误 | 返回统一参数错误 |
| TST-API-003 | 验证业务异常 | 返回稳定业务错误码 |
| TST-API-004 | 验证未知异常 | 不暴露内部堆栈 |
| TST-API-005 | 验证请求ID | 响应和日志可关联 |
| TST-API-006 | 验证接口限流 | 超过阈值后被限制 |
| TST-API-007 | 验证CORS | 非允许来源被拒绝 |
| TST-API-008 | 验证请求体限制 | 超限请求被拒绝 |
| TST-API-009 | 验证日志敏感信息 | 不记录密码和Token |
| TST-API-010 | 验证OpenAPI生成 | 文档可生成前端类型 |
- 自动化和端到端测试
| 编号 | 测试任务 | 预期结果 |
|---|---|---|
| TST-AUTO-001 | 编写后端健康检查测试 | 自动测试通过 |
| TST-AUTO-002 | 编写登录成功单元测试 | 自动测试通过 |
| TST-AUTO-003 | 编写登录失败单元测试 | 自动测试通过 |
| TST-AUTO-004 | 编写Token校验测试 | 自动测试通过 |
| TST-AUTO-005 | 编写权限依赖测试 | 自动测试通过 |
| TST-AUTO-006 | 编写前端登录表单测试 | 自动测试通过 |
| TST-AUTO-007 | 编写前端路由守卫测试 | 自动测试通过 |
| TST-AUTO-008 | 编写登录E2E测试 | 浏览器流程通过 |
| TST-AUTO-009 | 编写退出E2E测试 | 浏览器流程通过 |
| TST-AUTO-010 | 编写无权限访问E2E测试 | 正确进入403页面 |
| TST-AUTO-011 | 在CI执行全部自动化测试 | 流水线通过 |
缺陷任务
- 缺陷管理基础任务
| 编号 | 任务名称 | 完成标准 |
|---|---|---|
| BUG-MGT-001 | 创建缺陷任务模板 | 包含复现步骤、预期和实际结果 |
| BUG-MGT-002 | 定义缺陷严重等级 | 致命、严重、一般、轻微、建议 |
| BUG-MGT-003 | 定义缺陷优先级 | P0至P3规则明确 |
| BUG-MGT-004 | 定义缺陷状态流转 | 新建到关闭流程明确 |
| BUG-MGT-005 | 定义缺陷关闭标准 | 修复和回归条件明确 |
| BUG-MGT-006 | 定义缺陷响应时限 | 不同等级有响应要求 |
| BUG-MGT-007 | 建立每日缺陷评审机制 | 阻塞缺陷能够及时处理 |
- 实际缺陷任务命名规则
修复 + 发生位置 + 问题表现
例如:
修复登录页面错误密码无提示问题
修复刷新Token后用户状态丢失问题
修复县区角色可以访问管理员路由问题
修复数据库迁移在空库执行失败问题
修复Docker环境后端健康检查异常问题
3. 缺陷处理任务链
每个缺陷应形成以下子任务或状态:
确认问题
→ 定位根因
→ 实施修复
→ 补充自动化测试
→ 执行原场景验证
→ 执行关联场景回归
→ 记录修复结果
→ 关闭缺陷
交付和文档任务
| 编号 | 原子任务 | 交付物 |
|---|---|---|
| DOC-001 | 编写项目总体README | 项目说明 |
| DOC-002 | 编写本地开发环境搭建文档 | 开发环境手册 |
| DOC-003 | 编写前端开发规范 | 前端规范 |
| DOC-004 | 编写后端开发规范 | 后端规范 |
| DOC-005 | 编写Git分支和提交规范 | Git规范 |
| DOC-006 | 编写环境变量说明 | 配置字典 |
| DOC-007 | 编写数据库迁移说明 | 迁移手册 |
| DOC-008 | 编写接口响应和错误码规范 | API规范 |
| DOC-009 | 编写用户角色权限说明 | 权限说明 |
| DOC-010 | 编写测试执行说明 | 测试手册 |
| DOC-011 | 编写Docker启动说明 | 容器部署手册 |
| DOC-012 | 编写测试环境部署文档 | 测试环境部署手册 |
| DOC-013 | 编写数据库备份恢复文档 | 备份恢复手册 |
| DOC-014 | 导出一期基础OpenAPI文档 | 接口文档 |
| DOC-015 | 整理第三方依赖清单 | 依赖清单 |
| DOC-016 | 整理开源许可证清单 | 许可证清单 |
| DOC-017 | 编写阶段测试报告 | 测试报告 |
| DOC-018 | 编写阶段遗留问题清单 | 遗留问题台账 |
| DOC-019 | 创建阶段发布标签 | Git版本标签 |
| DOC-020 | 形成阶段验收记录 | 内部验收记录 |
推荐执行顺序
1.范围和方案固定下来
完成任务:
DISC-001至DISC-018
DES-001至DES-OPS-006
输出:
阶段范围
认证方案
权限方案
工程结构
数据库设计
部署设计
测试方案
退出条件:
- 关键方案完成评审。
- 不存在阻塞开发的未决问题。
- 阶段边界已经确认。
2.工程骨架可运行
完成任务:
DEV-BASE
DEV-FE-001至019
DEV-BE-001至027
DEV-OPS-001至012
输出:
- 前端可以启动。
- 后端可以启动。
- 数据库和Redis可以连接。
- Docker环境可以启动。
- 健康检查可用。
3.登录和权限闭环
完成任务:
DEV-IAM
DEV-AUTH
DEV-FEAUTH
DEV-ADM
输出:
管理员可以初始化
用户可以登录和退出
身份可以刷新和恢复
菜单和路由受权限控制
基础组织和权限数据可以查询
登录和关键操作可以审计
4.质量和交付基线
完成任务:
DEV-CI
TST全部任务
BUG-MGT
DOC全部任务
输出:
- 自动化检查进入CI。
- 核心认证流程有自动化测试。
- 测试环境部署成功。
- 文档和版本完成归档。
关键路径
本阶段关键路径为:
范围确认
→ 工程架构设计
→ 仓库初始化
→ 后端数据库连接
→ IAM数据模型
→ 登录认证接口
→ 前端登录接入
→ 路由和按钮权限
→ 自动化测试
→ Docker部署
→ 阶段验收
以下任务一旦延期,会直接影响整个阶段:
DISC-005 身份认证方案
DES-IAM-001至014 权限设计
DEV-BE-006 数据库连接
DEV-IAM-007 IAM迁移
DEV-AUTH-006 登录接口
DEV-FEAUTH-003 登录接入
DEV-FEAUTH-008 路由守卫
DEV-OPS-008 Docker Compose
DEV-CI-010 后端自动化测试
TST-AUTO-008 登录E2E测试
阶段工作量参考
以下为基础估算。
| 工作类型 | 参考人天 |
|---|---|
| 讨论与需求确认 | 2~3 |
| 产品和技术设计 | 4~6 |
| 前端基础工程 | 6~9 |
| 后端基础工程 | 8~12 |
| 登录与权限 | 7~10 |
| Docker与CI | 4~6 |
| 测试与缺陷修复 | 5~8 |
| 文档和内部交付 | 2~4 |
| 合计 | 38~58 |
推荐人员配置:
产品或项目负责人 1人
前端开发 1人
后端开发 1人
测试 0.5至1人
运维支持 0.25至0.5人
任务准入标准
一条开发任务进入“待开发”前,必须满足:
关联需求已经确认
相关设计已经评审
输入和输出已经明确
接口或数据结构已经明确
前置依赖已经完成
权限要求已经说明
异常场景已经说明
完成标准可以验证
任务完成标准
开发任务只有同时满足以下条件才能标记为完成:
代码已经实现
本地自测已经完成
异常场景已经处理
权限校验已经实现
数据库迁移已经提交
接口文档已经更新
自动化测试已经补充
代码评审已经通过
评审问题已经修复
代码已经合并
测试环境验证已经通过
不过一般情况下人比较少都是本地测测没啥大问题就直接过了,只有大厂里面才会弄得非常详细。
阶段退出标准
第一期第一步只有满足以下条件才能结束:
- 前后端项目可以在新环境独立启动。
- Docker Compose可以启动全部基础依赖。
- 数据库可以从空库完成迁移。
- 超级管理员可以通过脚本初始化。
- 管理员可以正常登录、刷新身份和退出。
- 无权限用户无法进入受限路由。
- 前端按钮权限和菜单权限正常生效。
- 后端接口完成独立权限校验。
- 登录日志和基础操作审计能够查询。
- OpenAPI可以生成前端接口类型。
- CI可以完成格式、类型、测试和构建检查。
- 登录主流程E2E测试通过。
- 测试环境部署成功。
- 数据库备份和恢复至少完成一次演练。
- 阻塞级和严重级缺陷已经关闭。
- 阶段文档已经完成。
- 已创建基础版本标签。
- 内部评审确认可以进入景区资源业务开发。
写在最后
已经燃尽了佬友们,写一期要掏空脑子中基本所有的梗,下一期随缘更新,要去刷半年小破站、xhh、dy、xhs、贴吧来努力学习烂梗,所有的需求我都尽量按时间完成,不会超时(maybe),后面会更新一个开源库来同步代码。
有的佬友问为什么最近水的少了,文章也不更了,主要是调岗了换了房子,之前是在总公司,平薪调到子公司了,远离了某位,换了房子主要是虽然子公司还在本地但是位置离了老远,正好之前的房子也到期了就顺势搬家了。
-
harriman 08-03 00:351楼你这个太nb了,跟小说似的实战经验
-
白芸汐 楼主 08-03 07:092楼前半部分还好,后半部分都是很无聊的具体拆分,写的时间是有点长 ^-^
- ↑最近claude普号疯狂封号啊,怎么办
- ↑Bybit领取空投403003报错的一点解决方案
- ↑voxi的WiFicalling问题
- ↑OpenCodeGO是仅限中国了吗
- ↑claude反代的开源项目
- 📍 [长文手敲] 擦桥的产品——AI文旅(其一)
- ↓[合集] 擦桥的产品
- ↓编程控制米家设备指南
- ↓电脑花屏了,求助各位佬
- ↓kimi k3做网站有什么建议吗佬
- ↓【Giffgaff WiFiCalling】成功拉到了,但是我已经被封了