ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

软件工程图书管理系统课程设计:需求分析、数据库建模到测试用例全解析

软件工程图书管理系统课程设计:需求分析、数据库建模到测试用例全解析 简介这是一份面向软件工程课程设计的图书馆查询借阅系统完整开发文档适合计算机、软件工程专业学生用于课程设计或毕业设计参考。压缩包共1个doc文件大小947KB文件为完整Word报告可直接编辑使用。已有1712人学习下载。文档按软件开发全流程组织依次包含可行性研究报告、需求分析、概要设计、详细设计和测试报告五大部分系统功能覆盖新书入库、图书借还处理、图书信息查询、损坏丢失处罚、超期读者公告等典型场景。每部分均结合福建工程学院实际项目展开配有数据流图、接口设计、数据结构设计及出错处理设计程序描述与复杂度度量也一并给出能够直观展示软件工程各阶段文档的写法与要点。对需要完成图书管理类课程设计或学习软件工程文档规范的同学是一份结构完整、内容详实的参考资料。1. 这份软件工程图书管理系统课程设计文档拆开看是一套可复用的项目骨架这份名为“软件工程图书管理系统课程设计..doc”的资料表面上是一份 Word 文档实际是一套完整到可以直接对照复现的软件开发过程记录。从可行性研究、需求分析、概要设计、详细设计到测试报告五个阶段一个不少甚至连数据流图、E-R 图、数据字典、经济可行性中的贷款利息计算都给出了具体数字。对于正在做软件工程课程设计、数据库课程设计或者毕业设计的人它比网上散的源码包更有参考价值因为你看到的不只是“怎么实现”而是“为什么这样设计”。对五年以上经验的开发者也值得翻一翻里面关于借阅规则、数据流分层和测试用例设计的边界处理能反推出当年需求分析时踩过的坑。2. 需求分析实操把“图书馆查询借阅系统”的用户需求翻译成数据流图和数据字典2.1 从功能需求中提取角色与权限文档第一部分就列出了借阅者、图书管理员两类主要参与者但深入看功能需求实际上还隐含一个系统管理员角色。借阅者持有借阅卡每人限借 5 本借期 30 天图书管理员负责新书入库、借还处理、损坏丢失处罚、公布超期名单系统管理员则负责注册、修改、删除借阅者和书目信息以及系统维护。做需求分析时第一步就是把角色和权限拆出来否则后面用例图、数据流图都会画乱。角色主要权限典型操作借阅者查询图书、借书、还书、续借按书名/作者/ISBN 查询提交借阅申请图书管理员图书与借阅管理新书入库、借还处理、超期罚款登记系统管理员用户与系统配置创建/修改/删除读者账户维护书目数据这里要注意文档中“图书管理员可以创建新的借阅者账户”这个描述实际把管理员和系统管理员的部分职责合并了。在真实系统里建议把“读者管理”和“图书管理”分开避免权限过大。课程设计报告中如果能把角色矩阵单独画一张表需求评审时能少挨很多问。2.2 数据流图分层从顶层到二层图的拆解方法数据流图是这份文档的核心之一。顶层图只有两个外部实体借阅者和图书管理员和一个处理过程图书查阅借阅系统。一层图开始出现新书入库、借还书籍处理、库存信息、书籍需求四个处理过程。二层图进一步细化出 P1.1 书籍损坏丢失处理等子过程。常见做法是先用顶层图画系统边界再逐层放大。每层只细化一个处理过程保证父图和子图的输入输出平衡。可以用文本方式描述一个简化的一层图外部实体: 借阅者 E1, 图书管理员 E2 处理过程: P1 书籍需求 - 接收E1的书籍需求F1输出需求量F2给P3 P2 库存信息 - 读取D2库存清单输出图书信息F4和库存清单F7 P3 新书入库 - 接收F2和E2的新书入库F3更新D1需求清单与D2库存清单 P4 借还书籍处理 - 接收E2的F8借阅书籍更新D5借阅书籍信息输出超期名单F13 数据存储: D1 需求清单, D2 库存清单, D3 超期读者名单, D5 借阅书籍信息这段文本图不是标准图形但能帮你核对数据流编号。真正的 Visio 图可以按这个结构去画。画图时最容易犯的错是漏掉“数据存储”或把外部实体直接连到数据存储正确的做法是外部实体必须通过处理过程访问数据存储。到这一层你已经能看出系统需要几张表、哪些数据要在模块间传递。2.3 数据字典的四个条目怎么写数据字典是对数据流图里每个元素的定义。文档里给了库存清单、规章制度、损坏丢失书籍清单、图书四个条目。格式很规范名字、别名、描述、定义、位置。实际写课程设计时不需要把所有元素都写成数据字典只要把核心数据流和数据存储写清楚即可。以“图书”条目为例定义可以写成数据项类型说明ISBN 号char(13)主键图书唯一标识书名varchar(50)检索主要字段作者varchar(20)可多个作者拼接出版年int用于按年份筛选出版社varchar(40)用于分类统计这里的关键是让数据字典和后面的 E-R 图、数据库表字段保持一致。文档里图书信息“ISBN 号书名作者出版社”少了出版年和主题词但需求部分又要求按出版年、主题词查询这就是需求分析阶段常见的遗漏。我做这种课程设计时会先用数据字典把所有查询字段列出来再反推表结构能避免后续返工。2.4 状态图与业务规则的补充文档中还有一张状态图描述图书从“闲置”到“借出”再到“超期处理”的流转。状态图最重要的价值是把异常分支画出来借书时查询不到、还书时超期、损坏赔偿。这些分支在普通功能列表里很容易被忽略但在测试阶段会集中暴露。一个可以直接抄进课程设计的业务规则表规则编号规则内容触发条件处理结果R001每人限借 5 本当前借出数5拒绝借阅并提示R002借期 30 天超期未还列入超期名单按天罚款R003图书损坏丢失归还时检测异常赔偿处理并更新库存有了这些规则后面的详细设计和测试用例设计就有了依据。建议在需求分析章节末尾单独列一节“业务规则清单”这是加分项。状态图不用画得太复杂把“可借、已借、超期、赔偿”四个状态画清楚就够了。2.5 非功能需求怎么落到测试指标原文档 2.6 节列出了非功能需求包括响应时间、7x24 可用性、低内存占用、故障后重启数据自动恢复。这些在课程设计报告里经常被抄一遍就完事但测试阶段需要可验证。比如“查询速度不超过 10 秒”可以用 JMeter 或简单秒表验证“故障恢复时间不超过 5 小时”可以靠备份还原策略保证。建议在测试报告里把每条非功能需求映射到一个验证方法这样答辩时不会被问倒。3. 概要设计与数据库建模从 E-R 图到 SQL Server 表结构3.1 模块划分与依赖关系概要设计阶段文档把系统分成三个大功能模块查询模块、用户管理模块、书籍管理模块。这三个模块看起来简单但要注意它们之间的数据依赖。查询模块依赖书籍表和借阅表用户管理模块依赖读者表书籍管理模块依赖书籍表和库存表。在概要设计文档里需要用模块图或层次图表达这种关系同时定义模块之间传递的数据结构。模块依赖数据表对外功能查询模块Books、BorrowRecords图书检索、借阅状态查询用户管理模块Readers注册、修改、删除读者书籍管理模块Books、BorrowRecords新书入库、书目编辑、库存调整模块划分时最容易犯的错是把“查询”当成一个独立系统实际上查询模块是横切在用户管理和书籍管理之上的。所有模块最终都要落到数据库表的增删改查所以概要设计阶段把表结构定清楚比先写代码再补数据库要省事得多。3.2 E-R 图转关系模式文档中的 E-R 图包含实体图书、图书管理员、借阅者。联系有“管理”“服务”“借阅”。其中“借阅”是借阅者和图书之间的多对多联系必须单独转成一张表。转换原则E-R 元素类型关系模式图书实体Books(ISBN, Title, Author, PublishYear, Publisher)借阅者实体Readers(Account, Password, Name, Age, Gender)图书管理员实体Admins(Id, Name, Account, Password)借阅联系BorrowRecords(Account, ISBN, BorrowDate, DueDate, ReturnDate, Status)注意图书在需求里还有“数量”和“是否可借”这说明图书实体是书目信息不是单本实例。一个 ISBN 对应多本书所以借阅表必须能区分是具体哪一本在借。简单设计可以再加一个“馆藏流水号”字段否则同一本书有两个副本时无法确定用户还的是哪一本。很多课程设计都栽在这个细节上。3.3 建表 SQL 与约束设计基于上面分析用 SQL Server 2005 语法建核心三张表。字段名和类型参考文档中的输入输出项。CREATE TABLE Books ( ISBN CHAR(13) PRIMARY KEY, -- 图书编号 Title NVARCHAR(50) NOT NULL, -- 书名 Author NVARCHAR(20) NOT NULL, -- 作者 Publisher NVARCHAR(40), -- 出版社 PublishYear INT, -- 出版年 TotalCount INT DEFAULT 1, -- 总数 AvailableCount INT DEFAULT 1, -- 可借数量 IsAvailable BIT DEFAULT 1 -- 是否可借 ); CREATE TABLE Readers ( Account VARCHAR(20) PRIMARY KEY, -- 用户账号 Password VARCHAR(32) NOT NULL, -- 账号密码 Name NVARCHAR(20) NOT NULL, -- 姓名 Age INT, -- 年龄 Gender CHAR(1) -- 性别 ); CREATE TABLE BorrowRecords ( Id INT IDENTITY PRIMARY KEY, -- 流水号 Account VARCHAR(20) NOT NULL REFERENCES Readers(Account), ISBN CHAR(13) NOT NULL REFERENCES Books(ISBN), BorrowDate DATETIME DEFAULT GETDATE(), DueDate DATETIME NOT NULL, ReturnDate DATETIME NULL, Status TINYINT DEFAULT 0 -- 0借出 1已还 2超期 );逻辑说明借阅表里的 DueDate 是还书期限BorrowDate 加上 30 天Status 字段记录当前状态。在业务层限制每人限借 5 本数据库层也可以加一个触发器但一般建议放在事务里检查反馈更友好。Password 字段建议存 MD5 加盐后的值文档里没写但这是数据库课程设计答辩时的高频提问点。3.4 接口与运行环境设计文档规定运行环境是 Windows 7 SQL Server 2005 .NET Framework 2.0Browser/Server 结构。实际做课程设计时硬件环境可以放宽但接口设计要明确用户界面通过浏览器访问后端通过 ADO.NET 连接数据库。数据库连接字符串放在配置文件里不要写死在代码里。文档里“支持 EXCEL 导入导出”的要求在设计接口时要预留数据导入导出的类比如读取 Excel 后批量 Insert 到 Books 表。如果换成 Java 课程设计连接字符串就是jdbc:mysql://localhost:3306/library这样核心设计思路完全一致。4. 详细设计与关键模块实现借书、还书、超期罚款与多条件查询逻辑4.1 分层结构与核心类设计详细设计阶段要从模块细分到类和函数。虽然原文档没有给代码但按“三层架构数据库”的常见做法可以分成表示层、业务逻辑层、数据访问层。实体类对应 Book、Reader、BorrowRecord业务类包括 BorrowService、BookService、UserService。类名职责关键方法BookService图书信息查询与管理queryBooks(), addBook(), updateBook()BorrowService借书、还书、续借、罚款borrowBook(), returnBook(), renewBook()UserService读者账户管理register(), updateReader(), deleteReader()DataAccess数据库通用访问executeQuery(), executeUpdate()以借书为例BorrowService 需要暴露一个 borrowBook 方法方法内部依次做校验。这里给出一个到 Java 的映射原文档技术栈是 .NET但多数课程设计会用 Java 重写所以下面代码用 JDBC 演示。核心逻辑是通用的换成 C# 也只是把PreparedStatement换成SqlCommand的问题。4.2 借书事务的 Java 实现借书逻辑必须使用事务防止“插入了借阅记录但库存没减”这类不一致问题。按原文档的规则读者已借书数量必须小于 5同时目标图书可借数量必须大于 0。Connection conn dataSource.getConnection(); try { conn.setAutoCommit(false); // 查询读者借阅数量 PreparedStatement ps1 conn.prepareStatement( SELECT COUNT(*) FROM BorrowRecords WHERE Account? AND Status0); ps1.setString(1, account); ResultSet rs ps1.executeQuery(); rs.next(); if (rs.getInt(1) 5) { throw new BusinessException(每人限借5本); } // 更新库存 PreparedStatement ps2 conn.prepareStatement( UPDATE Books SET AvailableCountAvailableCount-1 WHERE ISBN? AND AvailableCount0); ps2.setString(1, isbn); int rows ps2.executeUpdate(); if (rows 0) { throw new BusinessException(暂无可借库存); } // 插入借阅记录 PreparedStatement ps3 conn.prepareStatement( INSERT INTO BorrowRecords(Account, ISBN, BorrowDate, DueDate, Status) VALUES(?,?,NOW(),DATE_ADD(NOW(), INTERVAL 30 DAY),0)); ps3.setString(1, account); ps3.setString(2, isbn); ps3.executeUpdate(); conn.commit(); } catch (Exception e) { conn.rollback(); throw e; } finally { conn.setAutoCommit(true); conn.close(); }参数说明ps1 中的 Status0 表示在借ps2 里的AvailableCount0是乐观锁防止并发下超借ps3 里 DATE_ADD 直接生成 30 天后的截止日期。这个三段式是先校验规则、再扣库存、最后写记录顺序不能反否则会出现扣了库存但插入失败的情况。事务提交前任何一步抛异常都会 rollback保证库存和借阅记录一致。4.3 超期名单查询用 SQL 算清滞纳金原文档要求“公布借书超期读者名单”借期 30 天。查询时用 DATEDIFF 函数计算超期天数同时关联读者表方便管理员联系。SELECT r.Account, r.Name, b.Title, br.BorrowDate, br.DueDate, DATEDIFF(DAY, br.DueDate, GETDATE()) AS OverdueDays FROM BorrowRecords br JOIN Readers r ON br.Account r.Account JOIN Books b ON br.ISBN b.ISBN WHERE br.Status 0 AND br.DueDate GETDATE() ORDER BY OverdueDays DESC;逻辑说明DATEDIFF 返回截止日期到当前日期的天数大于 0 就是超期。注意这里用 Status0 过滤确保只统计还没还的书。实际罚款金额可以按 OverdueDays 乘以单价在业务层计算而不是用 SQL因为涉及到不同图书的罚款标准SQL 里写死不利于维护。4.4 查询模块的多条件组合与 SQL 注入防护文档要求按分类、书名、作者、ISBN、出版年、主题词、关键词查询。最容易出问题的是把用户输入直接拼进 SQL 字符串导致注入。用 JDBC 的 PreparedStatement 做动态条件拼接是比较稳的方式。StringBuilder sql new StringBuilder( SELECT * FROM Books WHERE 11); ListObject params new ArrayList(); if (title ! null !title.isEmpty()) { sql.append( AND Title LIKE ?); params.add(% title %); } if (author ! null !author.isEmpty()) { sql.append( AND Author ?); params.add(author); } if (isbn ! null !isbn.isEmpty()) { sql.append( AND ISBN ?); params.add(isbn); } if (keyword ! null !keyword.isEmpty()) { sql.append( AND (Title LIKE ? OR Author LIKE ?)); params.add(% keyword %); params.add(% keyword %); } PreparedStatement ps conn.prepareStatement(sql.toString()); for (int i 0; i params.size(); i) { ps.setObject(i 1, params.get(i)); }条件里用“11”只是为了方便拼接没有实际过滤作用。参数化后即使用户输入英文单引号也不会破坏 SQL 语句结构。如果还想做分类和出版年范围可以继续追加AND Category?和AND PublishYear BETWEEN ? AND ?。这套写法在图书管理系统 Java 课程设计里可以原样复现换成 C# 的 SqlParameter 也是一回事。4.5 程序复杂程度的定量度量原文档第 4.4 节提到程序复杂程度的定量度量最常见的是 McCabe 环路复杂度。计算方式是 V(G)E-N2E 是边数N 是结点数。以借书事务为例至少包含 4 个判断节点读者存在、限借数量、库存、插入成功所以环路复杂度为 5。如果再加并发检查和状态位判断复杂度会继续上升。这个数值可以写进详细设计章节配合测试用例说明为什么需要覆盖多条路径。5. 测试报告与验证技巧用文档里的测试用例反推系统边界5.1 从需求规则生成测试用例原文档的测试报告部分给出了测试项目说明但比较笼统。真正有效的做法是把需求中的业务规则表转成一张可执行测试用例表。借书规则 R001“每人限借 5 本”可以拆成多个用例来覆盖边界。用例编号前置条件输入操作预期结果TC-BORROW-001读者已借 4 本借一本库存充足的图书借阅成功库存减 1TC-BORROW-002读者已借 5 本再借任何图书提示“每人限借5本”库存不变TC-BORROW-003目标图书库存为 0执行借阅提示“暂无库存”TC-BORROW-004超期未还查询超期名单显示超期天数和书名执行测试时不要手工点点点就完事可以写一个简单的 JUnit 或 shell 脚本循环调用借书接口验证库存扣减和记录插入是否一致。文档里“平均故障间隔时间不低于 200 小时”这类指标在测试评价里直接说“通过压力测试验证”即可不需要真的跑 200 小时。5.2 数据字典驱动测试数据构造构造测试数据是个容易被忽略的细节。建议按照第 2 章的数据字典来造ISBN 用 13 位数字姓名长度不超过 20 字符年龄填数字状态字段用 0/1/2。很多系统出错就是因为测试数据不合法导致 SQL 报错或页面异常。可以写一段 SQL 批量插入测试数据INSERT INTO Readers(Account, Password, Name, Age, Gender) VALUES (2024001, e10adc3949ba59abbe56e057f20f883e, 张三, 20, M), (2024002, e10adc3949ba59abbe56e057f20f883e, 李四, 21, F);最后再提醒一个最实用的验证技巧验证超期逻辑时不要真实等待 30 天直接把 BorrowRecords 表里的 DueDate 改成昨天再用超期名单 SQL 查询。这样三分钟就能看到超期名单和滞纳金计算效果也是答辩现场最快出效果的操作。本文还有配套的精品资源点击获取
返回列表