简介:这是一份由武汉理工大学计算机学院软件1101班编写的校园一卡通管理系统需求设计文档,面向高校信息化建设、软件工程课程设计与系统设计人员,重点解决身份认证、消费支付、信息记录与集中管理的一致性设计问题。资源为PDF格式,共1个文件,压缩包大小1.44MB;内容覆盖项目背景、组织结构与角色定义、系统用例图、日常事务与消费处理流程、功能与性能需求、输入输出及接口要求等章节,结构完整,便于直接阅读或归档。已有339人浏览/学习,可用于需求分析课程、数据库课设或高校一卡通项目的文档撰写参考。读者可以从中获取需求分析规格说明书的标准写法,并借助办卡、充值、挂失、解挂、餐厅超市校车消费、信息查询等用例,快速梳理校园一卡通系统的业务边界与功能清单。
1. 校园一卡通管理系统,难的不是代码而是这张图纸
先说一个反直觉的结论:校园一卡通管理系统这类项目,真正让开发团队翻车的往往不是写代码,而是那份被当成“走流程”的需求设计文档。你随便搜“校园一卡通管理系统”,能出来上百套开源代码,但几乎没有哪套能直接部署到一所现实中的学校——因为每所学校的结算规则、退款流程、食堂补贴政策都不一样,代码只是末端的执行者,真正决定系统走向的是需求设计文档。这份PDF标题里的“需求设计文档”六个字,才是整个项目的灵魂。
这份文档要解决的不只是“学生能刷卡吃饭”这么简单。它得回答清楚:卡丢了怎么挂失、余额怎么退、临时人员怎么发卡、食堂和超市的账怎么对、财务每天怎么结算。这些问题如果不在一开始就写死,后期开发就不是写代码,而是无尽的扯皮和返工。适合看这篇文章的人有两类:一类是刚接手这类系统的产品经理和需求分析师,另一类是负责评估外包方案或自研方案的学校信息中心工程师。接下来我按做过的方案,把一份能落地的需求设计文档拆开讲清楚。
2. 先定边界再谈功能:角色、应用场景与卡状态机
2.1 角色与应用场景:谁在用、在哪儿用、用什么用
需求设计文档的第一件事不是画界面,而是把人理清楚。校园一卡通系统里的角色比看起来复杂,简单列至少有六类:在校学生、在编教职工、退休教职工、后勤聘用人员、临时访客、系统管理员。每类人对卡的需求完全不同:学生要吃饭充值,教职工要进图书馆和校车,后勤人员要考勤,临时访客可能只需要进宿舍楼三天有效期。
我在需求设计文档里一般用一张“角色×场景”的二维矩阵来定边界,行是角色,列是消费、门禁、考勤、图书借阅、水控电控这几个经典应用场景。
| 角色 | 食堂消费 | 超市消费 | 门禁/宿舍 | 图书借阅 | 水控电控 | 考勤 |
|---|---|---|---|---|---|---|
| 在校学生 | 支持 | 支持 | 支持 | 支持 | 支持 | 不支持 |
| 在编教师 | 支持 | 支持 | 支持 | 支持 | 可选 | 可选 |
| 退休教职工 | 支持 | 支持 | 仅白名单区域 | 支持 | 不支持 | 不支持 |
| 后勤聘用 | 可选 | 可选 | 仅指定楼栋 | 不支持 | 不支持 | 支持 |
| 临时访客 | 预付费卡 | 不支持 | 限时门禁 | 不支持 | 不支持 | 不支持 |
| 管理员 | 不消费 | 不消费 | 全部区域无限制 | 不借阅 | 不涉及 | 查看报表 |
这张矩阵的价值在于它逼着需求方回答“这个角色到底要不要这个功能”。最典型的坑在“退休教职工”这一行:很多学校退休教师仍然享受食堂补贴,但补贴额度和扣除方式又和在职不同。如果不在这张表里写清楚,开发时就会漏掉一个“身份类型为退休教师但在职教师窗口消费”的分支逻辑。文档里有了这张表,开发人员才能知道权限校验、消费折扣、补贴计算都要按照角色维度去实现。
2.2 卡生命周期的状态机:挂失、冻结、解冻、注销是四个不同动作
很多需求文档把卡状态只写成“正常/挂失/注销”三态,这是后续所有对账混乱的根源。实际操作里,一卡通的卡状态至少要有七个:待激活、正常、挂失、冻结、注销、过期、黑名单。待激活是发卡后第一次充值前;挂失是持卡人主动报失,卡内余额还在;冻结是系统检测到可疑交易或欠费等条件时自动触发的;过期主要用于临时卡;黑名单是挂失或冻结后允许离线终端拒绝交易的名单。
每个状态之间的转换条件和触发方必须写清楚。挂失只能由持卡人通过自助终端或窗口发起,挂失后卡在联网终端立即失效,离线终端需在下一次黑名单同步时生效。解冻只能由管理员操作,且必须填写解冻原因编码。注销前必须完成余额退款清算,退款记录要和财务系统对接。
在需求文档里不能用文字描述这堆关系,应该画一张状态转换表:
| 当前状态 | 动作 | 触发方 | 结果状态 | 是否生成对账单 |
|---|---|---|---|---|
| 正常 | 持卡人挂失 | 持卡人 | 挂失 | 否 |
| 正常 | 系统风险冻结 | 系统 | 冻结 | 是 |
| 挂失 | 挂失后补卡 | 持卡人+管理员 | 待激活 | 是,需重制卡工本费 |
| 挂失 | 撤销挂失 | 持卡人 | 正常 | 否 |
| 冻结 | 管理员解冻 | 管理员 | 正常 | 否 |
| 正常/挂失/冻结 | 清算后退款 | 财务+管理员 | 注销 | 是,必须退款 |
这张表一旦定下来,数据库的卡表设计就非常清晰:state 字段、last_event_time、operator_id、reason_code 是必有的四个列。我在评审时见过好多团队把“挂失”和“冻结”混成一个字段,导致财务退款时不知道某笔冻结余额是否已被消费掉。这张状态转换表就是给后续开发和财务审计看的,写多少都不算多。
3. 核心业务流程与数据约定:把结算逻辑写成能校验的东西
3.1 从充值到消费的完整链路:联机、离线与余额分账
校园一卡通的消费链路和普通线上支付完全不同。食堂的 POS 机终端经常在断网环境下运行,所以卡片内余额和后台账户余额天然存在“双余额”问题。需求文档里必须把这条链路拆开写清楚。
充值流程相对简单:用户在应用或充值机提交金额,支付网关回调成功,后台账户余额增加,随后在下次卡片刷卡时把后台最新余额写入卡片。但这里有一个关键参数需要写明:卡内余额的上限和下限。很多学校把卡内余额上限设为 500 元,下限为 0 元,这是为了防止大额盗刷。充值后如果卡内余额达到上限,则不能继续充值,这一条要写进文档,免得后端被问“为什么用户充值 500 被拒”。
消费流程分两条线。联机消费:POS 机与后台实时通信,后台校验卡状态、余额、黑名单,逐笔记录交易流水。离线消费:POS 机先在本机校验卡片黑名单文件,扣卡内余额,保存脱机流水,等到网络恢复时批量上传。这里最重要的参数是“脱机消费累计限额”——比如校内食堂单笔限额 50 元、单日累计限额 200 元。超过这个额度后,即便卡片离线也必须强制转联机核验。这条线若不在需求文档里写明,开发时极易被遗忘,而一旦遗忘,就会出现学生拿一张已挂失的卡在断网小卖部刷爆的情况。
退款环节是个重灾区。需求文档至少要把两种退款模式区分开:未消费退卡(全额退卡内余额)和部分退款(比如食堂充值赠送金额的回收)。很多学校有“充 100 送 10”的活动,这 10 元赠送金额在退款时是否退还?我在文档里见过最清楚的写法是:建立“账户余额=自有余额+赠送余额”的双层余额模型,消费时按比例扣减,退款时只退自有余额,赠送余额做回收处理。
3.2 数据库表结构与接口约定:字段清单是文档的重武器
需求设计文档不该写具体 SQL,但至少要把核心实体的字段清单列出来。这会避免开发时说“我建表时没想那么多,先跑通再说”的后续返工。对于校园一卡通管理系统,下面这几张表是必不可少的。
卡片账户表要把“卡内余额”和“账户余额”分开存放,这个设计是双余额模型落地的关键。建议字段包括:card_id、uid、user_type、balance_card(卡内余额)、balance_acc(账户余额)、freeze_balance(冻结金额)、status、issue_time、expire_time、last_used_at。同时还要配一张补贴账户表专门存各种补贴和赠送金额。
交易流水表是后续对账的根,字段必须包含:trade_id、card_id、terminal_no、trade_type(消费/充值/退款/调整)、amount、balance_before、balance_after、trade_time、settle_status(未结算/已结算/对账异常)。这里的 settle_status 字段是财务对账是否顺畅的关键,很多团队一开始不设计它,等到财务要求出日结报表时才后悔。
接口约定里,最容易被忽略的是“返回码”的统一。我在需求文档里宁可多花两页列出核心返回码字典:0000 表示成功,1001 表示卡状态异常,1002 表示余额不足,1003 表示卡片过期,1004 表示超过单笔限额,2001 表示终端未授权,2002 表示终端离线积压流水过多。这些返回码统一了,POS 机端、App 端和管理后台报错展示才不会各说各话。
| 返回码 | 含义 | 处理动作 |
|---|---|---|
| 0000 | 成功 | 正常完成 |
| 1001 | 卡状态异常 | 提示用户联系管理员 |
| 1002 | 余额不足 | 提示充值 |
| 1003 | 卡片过期 | 提示续期 |
| 1004 | 超单笔限额 | 转联机核验或拒绝 |
| 2001 | 终端未授权 | 提示商户联系管理员 |
| 2002 | 终端离线积压 | 强制联机或暂停服务 |
3.3 对账结算与日终处理:财务要求的不是流水而是平账
需求文档里如果只管到“交易成功”而不管“账平不平”,那这个系统上线一个月后就会被财务部门叫停。校园一卡通每天的账应该这么对:每个终端的脱机流水上传后,系统以“后台账户余额变动”为主账,以终端上传流水为从账,逐笔匹配交易流水号,匹配不上的进“异常池”。
日终结算时间点需要仔细选,我一般建议凌晨 1:00 到 4:00 之间,避开食堂宵夜和加班的零星消费。结算前系统要执行三个动作:冻结新交易、催促所有离线终端上传流水、检查“上传率”。如果某终端连不上或被跳过,要自动生成一张“未上传终端清单”,次日由运维人员督办。日终结束后,系统出一张三栏报表:终端上传笔数、后台记录笔数、差异笔数。差异笔数为零才能归档。
这里还要考虑一个容易被忽略的问题:跨日交易的归属。晚上 11:50 的消费,POS 机因网络延迟在 0:10 才上传,算哪一天?需求文档里要明确“按消费时间归属账期,而不是上传时间归属账期”。否则财务看到的日营收永远和终端记录对不上。我见过一个学校因为这个归属规则没写清楚,财务每月都要人工调账两百多笔。
4. 五个避坑记录:从需求文档评审到上线后的血泪经验
4.1 权限矩阵没写“管理员能做什么”,上线一周被学生攻破
现象:系统上线后,有学生通过自助终端的“卡片信息查询”接口,遍历到了其他学生的姓名和学号。
原因:需求文档只写了“学生可以查询自己”而没写“管理员可以查询某人”,结果开发时接口的权限注解写反了,学生角色误配了管理员的查询权限。
解决:权限设计不能只写“角色能做什么”,还要写“角色不能做什么”。在需求文档里加一列“禁止行为”,比如学生角色禁止调用按学号模糊搜索接口,管理员角色禁止充值余额到自己的卡。权限矩阵越具体,开发实现越少歧义。
4.2 补贴金额的失效规则没定义,食堂月底炸锅
现象:月底食堂窗口的补贴消费报表和财务系统差了好几万,查了半天发现是“毕业生离职后补贴仍在发放”。
原因:需求文档里写了“每月 1 日给教职工发放通勤补贴 200 元”,但没写“离职或退休后什么时候停发”。开发按“只要状态正常就发放”实现,毕业生退学后状态变注销,但退休人员的状态仍然是正常。
解决:在文档里明确补贴的触发条件必须同时满足身份类型和有效期两个维度,并补充一条“当月如果发生注销/过期,补贴按天折算或停止发放”的规则。规则写到字段级别:发放补贴前必须 JOIN 用户身份表校验 user_status AND valid_until。
4.3 离线 POS 机的黑名单同步参数设错,挂失卡照刷不误
现象:学生挂失两小时后,在校内一个断网超市刷了 80 元。
原因:POS 机的黑名单同步策略写的是“每次交易时后台推送”,但该超市 POS 机长期离线,根本没收到新黑名单。需求文档里没有规定黑名单文件的更新机制和强制生效时间。
解决:需求设计文档里必须写明“黑名单每日至少全量同步两次,且每笔离线交易前校验本机黑名单版本号”。参数建议:黑名单版本号落后于后台最新版本超过 1 天时,该终端降级为只收现金不接受刷卡。这个机制写进文档后,虽然不能完全杜绝风险窗口,但把风险时间从几天压缩到了几小时。
4.4 退款原路返回的周期没定,财务被学生电话打爆
现象:学生注销退卡时显示“退款成功”,但半个月没到账。
原因:文档写了“支持微信/支付宝原路返回”,但没写“退款无异常 3 个工作日内到账,若原渠道已关闭则转人工线下退款”。部分学生用的是校园虚拟卡,支付渠道本身就是一个密钥过期的历史账户。
解决:在退款流程里增加“退款状态机”:待提交、处理中、已退回、渠道失败待人工。渠道失败的单子要每天定时跑批每天下午 4 点把失败清单发给财务专员,超过 5 天未处理的升级到部门主管。文档再补一句“退款失败后不允许原卡注销完成”,从流程上保证每一笔退款都有终态。
4.5 水控电控的计费单位错位,一晚上跑了大半个月的电费
现象:宿舍电控系统上线后,有宿舍一夜之间被扣了 300 多,学生投诉系统乱扣费。
原因:需求文档里写的是“0.6 元/度”,但电控终端设备是按“分”上报的,开发当时没看清单位,把 0.6 元存成了 0.6 分。这不是技术问题,是文档里少了一个“计量单位”字段。
解决:在需求设计文档的所有涉及金额的实体上都标注单位:元、分、度、笔。并统一约定:与外部设备交互的接口一律用最小单位(分)传输,展示层再转换。自那以后我在文档里专门设了一节叫“计量单位与精度约定”,把所有金额、电量、水量的精度都钉死。
5. 用评审清单验证需求文档质量,并让版本变更可追溯
最后一个实际技巧,是用一份“需求文档评审清单”来验收这份 PDF 的完整性。我一般在内部评审时逐条打勾,比自由讨论有效率得多。
| 检查项 | 通过标准 |
|---|---|
| 角色覆盖完整性 | 学生、教师、退休、后勤、访客、管理员都在矩阵内 |
| 状态机闭合性 | 每个状态都有入态动作和出态动作,没有死状态 |
| 对账规则唯一性 | 账期归属、双余额扣减顺序、退款方式,每个只有一种解释 |
| 接口返回码覆盖 | 核心接口的异常分支全部有返回码定义 |
| 金额精度与单位 | 所有金额字段的单位统一,无 分/元混用 |
| 离线终端边界 | 脱机消费限额、黑名单强制版本号、强制联机条件都写明 |
| 异常人工流程 | 每类失败场景都有责任人、时限、状态机 |
这份清单如果全部通过,这份需求设计文档才具备让开发估算工作量的资格。我在项目里只要发现任何一项打不了勾,就要求需求负责人改文档而不是先出工期,这个习惯帮我避免过至少三次“上线后排期全部作废”的局面。
版本变更记录也是一个常被忽略的细节。需求文档从 v0.1 到 v1.0,每一版的变更必须保留“日期+变更人+变更原因+影响范围”四个字段。特别是“影响范围”这一栏,写“修改了退款流程”是不够的,要写“退款流程第 3 步状态流转变更,涉及消费子系统、财务子系统、自助终端三个模块”。这一栏写清楚,后续测试回归时才知道要连带测哪些模块,不用把整个系统跑一遍。
这套做法是我做了三个学校的一卡通项目后慢慢摸索出来的。中间也吃过亏,有一次因为没写“补贴停发时间”导致现场补了两周的数据,从那以后我宁愿在需求文档里多写一句多余的话,也不愿在系统里打一个尴尬的补丁。希望这篇笔记在你动笔写需求设计文档时,能帮你少走一段弯路,也希望你学校的一卡通系统上线后不用天天接学生投诉电话。
本文还有配套的精品资源,点击获取