ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

软件工程图书管理系统课程设计:从用例图到数据库与文档全流程指南

软件工程图书管理系统课程设计:从用例图到数据库与文档全流程指南 简介软件工程课程设计中的图书馆查询借阅系统完整开发文档面向计算机相关专业学生、课程设计者及需要参考软件工程规范文档的开发者。文档以图书馆图书查询借阅系统为案例完整覆盖可行性研究报告、需求分析、概要设计、详细设计、测试报告五大阶段从项目背景、功能要求、技术经济可行性到数据结构、接口设计与出错处理均有细致阐述可直接作为同类课程设计或毕业设计的书写模板。资源为单份doc文档压缩包仅1个文件大小约947KB内容结构清晰按软件工程标准流程编排便于按章节查阅。目前该资源已有1700余人学习浏览实用性和参考价值得到一定认可。参考其中的图表说明、功能模块分解与非功能需求分析可快速理解图书管理系统的设计思路尤其适合需要撰写完整软件开发报告的初学者借鉴。1. 课程设计的成绩一半藏在 .doc 里软件工程图书管理系统课程设计这份作业代码只是入场券成绩的决定权在最后那个 .doc 上。评阅老师通常不会把项目跑起来他翻文档的顺序基本固定先看用例图画没画全角色再看流程图分支完整度随后核对数据字典字段最后抽查测试用例。这门课的技术含量不在写 CRUD而在把借书还书的业务流程用软件工程符号重新表达一遍并让每张图表互相可追溯。这是第一次完整走“需求分析→概要设计→详细设计→编码测试”闭环的机会。适合赶课程设计的本科生、被拉去当助教的研究生以及拿图书馆模块练手工程化流程的开发者下面这套做法按能直接写进文档的标准来。2. 需求分析先立住图书管理系统的用例视图与流程图很多同学拿到题目第一件事是建数据库表这是课程设计里最亏的做法。表结构是设计阶段的产物需求没定就建表每改一次用例图表就要跟着动。先花半天把角色、用例和流程定下来后面画类图、写代码、补文档都是在替这两张图填空。2.1 从“谁在操作”反推角色权限用例视图别画出第五个角色图书管理系统用例图的主角只有三个读者、图书管理员、系统管理员。访客要不要单独画课程设计范围内不建议检索做成无需登录的业务挂在读者名下即可。数据库、第三方接口都不是人不进用例图它们属于设计阶段的组件。角色拥有的用例建议收掉的权限读者图书检索、借书、续借、查看本人借阅记录直接还书现实中扫码归还由馆员完成图书管理员图书入库、图书下架、借书登记、还书登记、罚款处理修改读者信用等级系统管理员读者档案维护、借阅参数设置借期、罚款单价、可借上限手工改借阅记录状态这张表的用意是防止“角色溢出”。常见的低分图是把管理员权限平铺给三个角色每个角色都画六七个用例评阅老师一眼看出没做过需求分析。权限边界用一句话写进文档读者对图书只有查询和使用权对借阅记录只有查看权写操作一律经管理员或系统校验后落库。2.2 用 5 条用例描述把“借书”讲透include 和 extend 只各标一对用例图只是轮廓评阅老师真正看的是用例描述能不能验证。课程设计里 5 到 8 条用例就够数量不是越多越好。下面这张表是图书管理系统的用例清单编号在文档和代码注释里都要复用。编号用例名主参与者后置条件UC-001图书检索读者返回匹配图书列表及在库状态UC-002借书读者生成借阅记录图书状态置为已借出UC-003还书图书管理员借阅记录关闭图书状态恢复在库UC-004续借读者应还日期按规则顺延UC-005罚款处理图书管理员逾期记录生成罚款金额并登记缴款状态以 UC-002 为例用例描述的粒度要写到能直接转化为代码的级别用例编号UC-002 用例名称借书 参与者读者借书登记时由图书管理员代操作 前置条件读者状态正常在借数量未达上限目标图书状态为在库 后置条件borrow_record 新增一条 status0 的记录book.status 置为已借出 基本流程 1. 系统根据读者证号查出读者档案 2. 系统校验读者状态与在借数量 3. 系统根据图书条码查出图书信息 4. 系统校验图书状态为在库 5. 系统生成借阅记录应还时间 当前时间 借期参数 6. 系统将图书状态置为已借出 异常流程 2a. 读者已挂失或在借数量达上限提示具体原因并终止 4a. 图书非在库状态提示“当前不可借阅” 业务规则同一本书同一时刻只能被一个读者借出用例之间的关系课程设计里最多画一对 include 和一对 extend。include 表示必然发生的子流程比如借书包含“读者身份校验”extend 表示可选分支比如还书时检测到逾期才扩展出罚款处理。两者区别一句话就能说清include 不执行则主流程失败extend 不触发主流程照样完成。答辩时能说清这句比画十根虚线有用。2.3 图书管理系统流程图判断节点只问“是/否”分支写全软件工程流程图里最容易扣分的是判断节点乱写。一个判断节点只能回答一个“是/否”问题不能把“读者可借吗、图书在库吗、还有没有配额”三个条件叠在一起。借书流程按顺序是这样一串节点开始圆角矩形进入扫描或输入读者证号。读者状态判断是否存在且未挂失。否则提示“读者不可借”结束。在借数量判断是否小于可借上限。否则提示“已达借阅上限”结束。图书状态判断是否在库。否则提示“不可借阅”结束。写入借阅记录并更新图书状态结束。还书流程把判断换成“借阅记录是否存在且未归还”并在通过后加一个罚款计算分支。在 Word 里画图时注意三处细节开始/结束用圆角矩形、操作用矩形、判断用菱形判断分支上写“是/否”不写 Y/N按参与者分泳道读者和图书管理员各占一列节点摆到对应泳道里。图内文字统一字体字号导出前打开对齐网格这是文档观感的隐形加分项。3. 系统设计一次定清图书管理系统选型、数据库表与状态机需求图定稿后选型和数据模型要一次定清楚。课程设计里换技术栈是返工重灾数据库表加字段更是能拖垮文档里所有图表的一致性。下面按最容易过审的方案给参数所有建议都按“能写进文档答辩”的标准筛过。3.1 Java、PHP、Python 三套选型对照先看课程背景再挑技术选型不必求新要的是资料多、部署省心、答辩可控。图书管理系统是典型 CRUD 题目三套主流方案都能扛住差别在周边成本。方案优点主要成本适合的课程背景Java Spring Boot MySQL图书管理系统java 的成套资料最多类图、时序图都有参考环境变量和依赖下载耗时项目体积大学校开了 Java 企业级开发课PHP MySQL原生或 ThinkPHPphp图书管理系统 教程直白XAMPP 一键起服务现代工程写法弱后期加接口要返工偏 Web 方向且课时紧Python Flask SQLite/MySQLpython软件工程 脚手架轻量改代码快并发演示不能吹课程用 Python 或自由选题我一般建议按课程指定语言来定自由选题优先 Python 或 Java。选型理由写一段话进文档的“技术要求”匹配课程实践范围、部署环境成熟、可查到的资料能支撑答辩。不要写“性能优越、高并发”这类话评阅老师看到只会追问压测数据。三套方案默认都是 B/S 结构课程设计不要引入 C/S 双端。3.2 图书表、读者表、借阅记录表最小可用 DDL 与字段口径数据模型用三张核心表加一张可选的管理员表就够。book 存书目与库存reader 存读者档案borrow_record 存每次借还的完整轨迹。下面的 DDL 可以直接抄字段注释留好它就是文档里数据字典的素材CREATE TABLE book ( id INT AUTO_INCREMENT PRIMARY KEY, isbn VARCHAR(32) NOT NULL COMMENT ISBN用于书目查重, title VARCHAR(128) NOT NULL COMMENT 书名, author VARCHAR(64) NOT NULL DEFAULT COMMENT 作者, category VARCHAR(32) NOT NULL DEFAULT COMMENT 分类号如 TP312, publisher VARCHAR(64) NOT NULL DEFAULT COMMENT 出版社, status TINYINT NOT NULL DEFAULT 0 COMMENT 0在库 1已借出 2预约锁定 3下架, total_copies INT NOT NULL DEFAULT 1 COMMENT 馆藏总册数, available_copies INT NOT NULL DEFAULT 1 COMMENT 当前可借册数, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_book_status (status), KEY idx_book_title (title) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT图书表; CREATE TABLE reader ( id INT AUTO_INCREMENT PRIMARY KEY, card_no VARCHAR(20) NOT NULL COMMENT 读者证号借还书扫码用, name VARCHAR(32) NOT NULL COMMENT 姓名, status TINYINT NOT NULL DEFAULT 1 COMMENT 1正常 0挂失, max_borrow_num INT NOT NULL DEFAULT 10 COMMENT 最大在借数量, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_reader_card (card_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT读者表; CREATE TABLE borrow_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY, reader_id INT NOT NULL, book_id INT NOT NULL, borrow_time DATETIME NOT NULL COMMENT 借出时间, due_time DATETIME NOT NULL COMMENT 应还时间由借期参数算出, return_time DATETIME DEFAULT NULL COMMENT 实际归还时间未还为空, renew_count TINYINT NOT NULL DEFAULT 0 COMMENT 续借次数上限3, status TINYINT NOT NULL DEFAULT 0 COMMENT 0借阅中 1已归还 2逾期已还, KEY idx_borrow_reader (reader_id, status), KEY idx_borrow_book (book_id, status), CONSTRAINT fk_borrow_reader FOREIGN KEY (reader_id) REFERENCES reader(id), CONSTRAINT fk_borrow_book FOREIGN KEY (book_id) REFERENCES book(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT借阅记录表;表设计里有三个口径要在文档里写明白。第一status 统一用 TINYINT 而不用字符串枚举改状态值不用动字段定义数据字典里用注释对应即可。第二book 表同时存在 status 和 available_copiesstatus 描述单本状态available_copies 是物化的剩余册数属于读写权衡的冗余答辩被问到就按这个逻辑答。第三借阅记录用自增主键而不是 reader_id 与 book_id 联合主键同一读者分时借同一本书会产生多条记录联合键兜不住。外键只保留这两条不要对 available_copies 加 CHECK 约束数据一致性交给事务层。3.3 图书状态机在库、已借出、预约、下架的四态流转图书管理系统的核心状态机在 book.status 上很多实现把状态拆成多张关联表课程设计没必要。四个状态加一组迁移事件刚好撑起一张状态图当前状态触发事件下一状态附带操作0 在库借书成功1 已借出available_copies 减 10 在库读者预约2 预约锁定生成预约记录2 预约锁定预约者到馆借书1 已借出关闭预约记录2 预约锁定超时未取0 在库释放预约1 已借出还书成功0 在库available_copies 加 10 在库下架处理3 下架检索列表不再展示3 下架重新上架0 在库恢复展示这里要强调状态机画的是 book.status而 borrow_record.status 是另一套状态借阅中、已归还、逾期已还两套不能合并。文档里常出现“还书时把图书状态改成 0”这种一句话实现正确做法是还书操作在同一事务里同时关闭借阅记录并变更图书状态。状态图只画图书迁移触发事件写业务名还书、借书、预约不要在上面标注 SQL。4. 借书、还书、逾期与查询图书管理系统核心代码与参数下面是三个可以直接照抄的核心函数代码用 Python 写业务逻辑SQL 部分换到 Java、PHP 里同样成立。参数全部用常量或配置项答辩时改参数演示是最有效的验证手段。4.1 借书先锁后查再写事务边界要覆盖两次状态变更借书不是一条 INSERT 就结束。它要完成“校验读者→校验图书→写借阅记录→改图书状态”四个动作任何一个失败都不能留下半截数据所以必须放进同一个事务并用行锁挡住并发def borrow_book(reader_id, book_id, conn): cur conn.cursor() try: conn.begin() # 1. 锁读者行防止并发下超上限借书 cur.execute( SELECT id, status, max_borrow_num FROM reader WHERE id%s FOR UPDATE, (reader_id,)) reader cur.fetchone() if not reader or reader[status] ! 1: raise BusinessError(读者不存在或已挂失) # 2. 统计在借数量并比对上限 cur.execute( SELECT COUNT(*) AS cnt FROM borrow_record WHERE reader_id%s AND status0, (reader_id,)) if cur.fetchone()[cnt] reader[max_borrow_num]: raise BusinessError(已达到最大借阅数量) # 3. 锁图书行同一本书的并发请求在这里排队 cur.execute( SELECT id, status FROM book WHERE id%s FOR UPDATE, (book_id,)) book cur.fetchone() if not book or book[status] ! 0: raise BusinessError(图书不存在或不在库) # 4. 生成借阅记录应还时间由借期参数算出 cur.execute( INSERT INTO borrow_record(reader_id, book_id, borrow_time, due_time, status) VALUES(%s, %s, NOW(), DATE_ADD(NOW(), INTERVAL %s DAY), 0), (reader_id, book_id, BORROW_DAYS)) # 5. 图书状态与可借数量一并更新 cur.execute( UPDATE book SET status1, available_copiesavailable_copies-1 WHERE id%s, (book_id,)) conn.commit() except BusinessError: conn.rollback() raise这里的顺序有讲究先锁读者再锁图书全系统所有事务都按这个顺序加锁可以从根上避免死锁。两条 SELECT 都带 FOR UPDATE第二个事务要操作同一本书时会在第 3 步阻塞等第一个事务提交后读到最新状态然后走异常分支。如果去掉 FOR UPDATE并发下同一本书可能被借出两次这是答辩必被追问的点。所有校验都在写之前完成BusinessError 一旦抛出直接回滚不会留下只有借阅记录、图书状态没变的脏数据。4.2 还书与逾期罚款以还书时刻为准参数口径写进文档还书逻辑是对称的一套锁借阅记录判断是否逾期计算罚款然后把借阅记录和图书状态一起更新。逾期判断不推荐用冗余字段用两个时间比对推导最稳def return_book(record_id, conn): cur conn.cursor() try: conn.begin() cur.execute( SELECT * FROM borrow_record WHERE id%s FOR UPDATE, (record_id,)) record cur.fetchone() if not record or record[status] ! 0: raise BusinessError(借阅记录不存在或已归还) now datetime.now() overdue_days (now - record[due_time]).days # 按自然日截断 fine 0.0 if overdue_days 0: fine overdue_days * FINE_PER_DAY # 关闭借阅记录并把图书状态恢复在库 cur.execute( UPDATE borrow_record SET return_time%s, status2, fine_amount%s WHERE id%s, (now, fine, record_id)) cur.execute( UPDATE book SET status0, available_copiesavailable_copies1 WHERE id%s, (record[book_id],)) conn.commit() return fine except BusinessError: conn.rollback() raise罚款计算的口径要固定按自然日截断不足一天按一天还是精确到小时二选一并在文档业务规则里写死。这里用 (now - due_time).daysPython 的 days 直接截断小数部分口径就是“不足一天不计费”答辩被问到能立刻答出来。下面这张参数表放进文档的“系统参数设置”一节参数名示例值说明BORROW_DAYS30默认借期单位天配置化RENEW_LIMIT3单本图书最大续借次数FINE_PER_DAY0.10每日罚款单价不足一天按一天计续借实现是借书的变体先校验 renew_count 小于 RENEW_LIMIT 且当前未逾期然后把 due_time 顺延 BORROW_DAYS并给 renew_count 加 1。注意续借是原地延长不是先还再借否则会在 borrow_record 里多出一条假借阅记录。4.3 图书查询与分页参数LIKE 模糊匹配的取舍要能说清图书检索是交互最密集的功能课程设计里用模糊匹配加分页是标准做法SQL 就三句话SELECT id, title, author, category, status, available_copies FROM book WHERE title LIKE CONCAT(%, %s, %) ORDER BY created_at DESC LIMIT %s OFFSET %s;参数按 page 和 page_size 传入page_size 默认 10、上限 50OFFSET 用 (page - 1) * page_size 计算。服务端要校验 page 大于 0、page_size 不超过上限否则前端传负数会把 OFFSET 打穿这在课程设计演示里很丢分。LIKE %关键字% 属于全模糊匹配走不了 B-Tree 索引数据量上到十万级才会明显变慢课程设计规模完全够用。答辩标准回答是“当前规模下全模糊可接受后续容量上来可换全文索引或独立检索引擎”。如果检索条件用 OR 连接多个字段比如 title LIKE 或 author LIKE联合索引会失效这也是字段注释里不建多余索引的原因。5. 把 .doc 写成能过审的软件工程文档目录、图表与答辩备用交 .doc 还是 .docx 按老师要求来内容结构一样。文档骨架直接套软件工程导论里的经典四阶段需求分析、系统设计、详细设计与实现、测试。需求分析放用例图、用例描述表、流程图和数据字典系统设计放架构图、ER 图、表结构说明和状态机图详细设计放类图、时序图和核心代码测试放测试用例表、执行结果截图。这套骨架拿到软件工程毕业设计里同样成立只是多补一章可行性分析。Word 里用多级列表开标题图表标题统一编成“图2-1 借书用例图”这种带章节号的格式正文里至少引用一次目录自动生成后评阅老师按图索骥能找到实现。5.1 类图、时序图、ER 图各取所需图与代码要能互指类图画 6 个类封顶User、Reader、Book、BorrowRecord、LibraryService 和 LibraryControllerLibraryService 里列出 borrowBook、returnBook、renewBook、searchBooks 四个方法签名和第四章节的函数一一对应。时序图画一条借书主线ER 图画三张表及一对多关系。图的主题越单一越好一张图塞十个类只会暴露设计不一致。5.2 三个必被问倒的问题提前把答案钉在文档里为什么 book 表同时有 status 和 available_copies冗余计数避免列表查询每次都 COUNT一致性由事务保证。逾期不足一天按多少罚款按自然日截断不足一天不计参数可配代码注释写明口径。两个人同时借同一本书怎么办行锁 FOR UPDATE 让后到的事务读到最新状态并异常退出靠事务回滚兜底。这三个答案分别埋在数据字典、业务规则和数据库设计说明里答辩时直接指到对应章节。定稿前做一遍编号体检用例编号出现在用例描述、代码注释和测试用例三处缺一个补一个。评阅老师随手翻开一页看到注释里的 UC-002 能回溯到文档用例这套文档的专业度就立住了。本文还有配套的精品资源点击获取
返回列表