
每年三到五月“计算机毕业设计”相关搜索量都会明显涨一波。如果你正在选题“高校教材管理系统”大概率在候选名单里。这类项目胜在业务清晰教材信息管理、入库、订购、发放、统计每个功能都能对应到实际教务工作不会出现“做了个系统但不知道给谁用”的问题。再加上基于 jspm 这种 JSP Servlet JavaBean 的经典架构实现不依赖重框架放在本科毕业设计里技术难度适中代码量又能撑起一篇完整论文。这篇文章围绕一套“基于 jspm 的高校教材管理系统”毕业设计源码和配套 LW 文档来拆适合三类人刚拿到源码不知道怎么跑的同学、打算参考同类题目自己重写的同学、以及中期或答辩前需要补文档和演示流程的同学。1. 先搞清楚这套项目到底能帮你解决什么1.1 为什么教材管理系统是毕业设计的“安全牌”毕业设计选题有个隐形标准业务不能太简单到没东西可写也不能复杂到本科阶段做不完。教材管理系统正好卡在中间。从业务量看它至少包含教材信息管理、教材类别管理、教材入库与库存管理、教材订购计划、教材发放登记、学生或班级领用记录、统计报表这些模块。每个模块都能单独写一节实现也能单独设计测试用例论文篇幅很容易撑起来。从技术角度看JSP 页面负责展示Servlet 负责请求分发JavaBean 负责业务数据和数据库操作正好能对应到 MVC 架构里的 View、Controller、Model 三层。答辩时老师问你“用了什么设计思想”你可以从 MVC 开始讲再延伸到三层架构的职责划分回答起来不会虚。这套项目还有个现实优势它属于内部管理类系统不需要对接第三方支付、短信、地图等外部服务。这意味着部署环境很干净只要 JDK、Tomcat、MySQL 三件套准备好基本就能本地跑通。不会出现因为某个外部 SDK 过期、某个接口改版导致系统直接瘫痪的情况。1.2 jspm 到底是什么答辩时怎么讲很多同学看到“jspm”这个缩写会懵。这里要先说清楚在毕业设计语境里jspm 通常指 JSP Servlet JavaBean 组合成的经典 Web 开发架构有些教材里也叫 JSP Model 1 或 Model 2。它不是 Spring、Spring Boot 那类全家桶框架而是更底层的 Java Web 原生技术栈。理解这一点很重要因为答辩时老师可能直接问“你为什么不用 Spring Boot”如果把这个词理解成框架你可能会被问住。正确理解是把它拆开讲JSPJava Server Pages负责页面展示和表单交互。Servlet负责接收浏览器请求、调用业务逻辑、跳转或转发页面。JavaBean封装业务数据负责访问数据库和执行具体操作。这样的回答既承认了这是课程体系里常见的教学架构又能顺势说明“它结构简单能让评审老师更清楚看到三层职责划分”。如果你确实在项目里用了 JSTL、EL 表达式、Filter 过滤器等 JSP 相关技术也都可以归到 jspm 技术栈里讲。1.3 一套完整源码包应该包含哪些东西拿到“源码 LW 文档”压缩包后建议先做一次清单核对别急着解压导入。常见情况下一个完整的教材管理系统毕业设计包应该包含内容说明没有会怎样数据库脚本通常是一个 .sql 文件包含建库、建表、初始数据项目启动后查不到任何数据功能无法演示项目源码可能是 Eclipse 的 .project 工程也可能是 IDEA 的 Maven 工程需要判断用哪个 IDE 打开说明文档可能叫 README、部署说明、环境配置说明需要自己猜数据库账号密码LW 文档/论文毕业论文 Word 文档结构上从绪论到测试答辩材料不齐流程图或 ER 图部分源码包会附带设计文档图片论文插图需要自己补画如果包里缺了数据库脚本先去搜一下“项目名 sql”或看源码里有没有 sql 文件夹。如果连说明文档都没有就按照第 4 章的通用部署流程走必要时打开源码里负责数据库连接的工具类直接把账号密码读取出来。这一步不算偷懒本质是排查很多项目跑不起来都是卡在数据库配置上。2. 拿到源码后先看环境再看代码更稳2.1 运行需要哪些东西JDK、Tomcat、MySQL、IDE这类基于 jspm 的老牌毕业设计项目环境组合一般是JDK 1.7 或 1.8MySQL 5.5 到 5.7 左右Tomcat 7 或 8Eclipse 或 IntelliJ IDEAMySQL 客户端工具比如 Navicat、SQLyog、或者直接用命令行这里有个常见问题如果你的电脑装的是新版 JDK 17 或 MySQL 8.0项目不一定能直接跑。JDK 9 之后移除了一些老 APIMySQL 8.0 的驱动类名和连接配置也和 5.x 不一样。建议优先安装 JDK 1.8 和 MySQL 5.7兼容性最好。如果想用 MySQL 8.0需要把驱动 jar 换成 8.x 版本连接 URL 也要调整例如把驱动类改成com.mysql.cj.jdbc.Driver并在连接串里加上时区参数。还有一点容易被忽略Tomcat 和 JDK 的位数要匹配Tomcat 8 搭配 JDK 8 是最常见的组合。如果你电脑装了多个 JDK记得在 IDE 里逐一确认项目编译级别、服务器 JRE 都指向同一个版本否则会出现编译正常但启动失败的问题。2.2 源码包常见目录结构说明jspm 项目不像 Maven 工程那样有统一的src/main/java结构。常见老式 Eclipse 工程大概是这样的TextbookMS/ ├── src/ │ ├── com.xxx.bean/ // 实体类对应数据库表 │ ├── com.xxx.servlet/ // 控制器层 │ ├── com.xxx.dao/ // 数据库访问层 │ ├── com.xxx.util/ // 数据库连接工具、字符串工具等 │ └── com.xxx.filter/ // 过滤器比如登录拦截、编码处理 ├── WebContent/ 或 WebRoot/ │ ├── login.jsp │ ├── index.jsp │ ├── css/ js/ images/ │ └── WEB-INF/ │ ├── web.xml │ └── lib/ // 依赖 jar 包 └── database/ └── textbook_db.sql这个结构本身就是一个很好的答辩素材。你能说出每个包负责什么比照抄代码不知道在写什么要强很多。如果你的项目是 Maven 工程结构会变成src/main/java、src/main/webapp和pom.xml。打开pom.xml就能看到引入了哪些依赖。判断项目类型最简单的方式就是看根目录有没有pom.xml有就是 Maven没有基本就是老式 Web 工程。2.3 数据库脚本和配置文件先找这四处不要急着把整个项目代码读一遍。先找四个最容易决定“能不能跑”的地方web.xml看欢迎页面、Servlet 映射、过滤器配置。你启动后访问什么地址入口就在这里。数据库连接工具类文件名通常叫DBUtil.java、DBConnection.java、BaseDao.java等里面写着jdbc:mysql://localhost:3306/xxx账号密码直接能读到。SQL 脚本开头的注释有些脚本里会写“请在 MySQL 5.7 下运行”“默认密码为 admin”这类提示。项目根目录或doc文件夹下的说明文档很多源码发布者会把部署步骤写在里面第一步干什么、第二步干什么写得很清楚。把这四处看完你对项目的判断会比读完十个 Java 文件更准确。因为毕业设计项目跑不起来的瓶颈绝大部分不在业务代码而在数据库连接、路径配置和依赖缺失上。3. 教材管理系统核心功能与数据表怎么拆3.1 功能模块登录、教材信息、入库、订购、发放、统计一套高校教材管理系统即使不同源码包命名不同核心功能也基本围绕教材业务的完整链路展开。按业务顺序理一遍会更清楚用户登录区分系统管理员、教务人员、院系负责人等角色。教材信息管理录入教材编号、名称、作者、出版社、ISBN、价格、适用年级或专业。教材类别管理按公共课、专业课、选修课等维度分类方便筛选。教材入库管理处理采购入库增加库存数量记录入库时间和单号。教材订购管理各院系或班级提交订购计划管理员审核并汇总订购数据。教材发放登记开学时按班级发放教材登记领取数量和领取人。库存查询与统计查看当前库存、发放情况、学期教材使用汇总。这个流程对应到“实际业务”里是合理的教材先有基础信息再有采购入库然后各班报订购计划管理员汇总后发放最后形成统计报表。答辩时按这个业务流程讲比照着代码念类名和文件名强得多。3.2 典型数据表设计与关联关系毕业设计论文里的数据库设计重点不是表建得多花哨而是表和表之间的关系能说清楚。教材管理系统常见的表大致有这些表名主要字段作用user用户ID、用户名、密码、角色、院系、联系方式登录和权限控制textbook_category类别ID、类别名称、备注教材分类textbook教材ID、书名、ISBN、作者、出版社、单价、类别ID教材基础信息supplier供应商ID、名称、联系人、电话采购来源信息stock库存ID、教材ID、入库数量、剩余数量、入库时间库存动态记录order_info订购ID、教材ID、院系/班级、数量、状态、申请时间订购申请和审核issue_record发放ID、教材ID、班级、数量、领取人、发放时间教材发放记录这些表之间最常见的外键关联是textbook.category_id指向textbook_category.idstock.textbook_id指向textbook.idorder_info.textbook_id指向textbook.id。你写论文时不用硬套“一对一、一对多”的说法直接说“一本教材对应多条订购记录一条订购记录只属于一个班级”这种业务上的关系老师更容易理解。一个很常见的坑很多同学把库存数据直接写进textbook表用一个“数量”字段表示库存。这样写代码简单但每次入库和发放都要更新这个字段历史记录也丢了。更好的做法是单独建stock表每次入库生成一条新的库存记录查询时汇总剩余数量。你拿到源码后可以看看它用的是哪种设计如果只有一张表可以在论文“改进方向”里提一句“未来可以引入独立库存流水表”这反而是加分项。3.3 角色和权限为什么要单独设计高校教材管理系统里至少有两种角色管理端教材管理员和普通用户端教务或院系人员。管理端负责教材信息维护、订购审核、发放普通用户可能只能查询教材信息和提交订购申请。在实现上最直接的做法是用user表里的角色字段区分再用一个过滤器拦截未被登录的请求。登录成功后把当前用户信息放入 Session每次页面渲染前判断角色控制菜单和按钮显示。这里建议你认真看懂权限判断这段代码因为答辩时几乎必问“系统怎么控制不同角色的权限”如果代码里只是判断角色名是否等于admin你也要能说出“这是基于角色的访问控制通过 Session 保存登录状态在请求入口统一拦截”这个设计思路。即使实现简单表达上也要完整。4. 本地部署一步一步跑通4.1 导入项目到 IDE 的前后顺序先把环境装好再导入项目这是最省事的顺序。如果你用的是 Eclipse确认 JDK、Tomcat、MySQL 已经安装。打开 Eclipse设置工作空间编码为 UTF-8Window - Preferences - General - Workspace - Text file encoding。点击 File - Import - General - Existing Projects into Workspace选择项目根目录。如果导入后没有自动识别为 Web 项目右键项目 - Properties - Project Facets勾选 Dynamic Web Module。在 Servers 窗口添加 Tomcat 8右键项目 - Run As - Run on Server。如果你用的是 IDEA要注意项目是普通 Web 工程还是 Maven 工程。普通项目通过 File - Open 打开装好 Tomcat 后在 Run Configuration 里配置 Application Server。Maven 项目直接等依赖下载完再配置 Tomcat 启动。导入成功后先不要跑先看WEB-INF/lib下有没有 MySQL 驱动 jar。如果没有去下载一个对应版本MySQL 5.x 用mysql-connector-java-5.1.x.jar复制到WEB-INF/lib目录下同时右键项目 Build Path 里添加进去。这一步不做启动后大概率报ClassNotFoundException: com.mysql.jdbc.Driver。4.2 创建数据库并导入脚本打开 MySQL 命令行或图形客户端执行这几步CREATE DATABASE IF NOT EXISTS textbook_db DEFAULT CHARACTER SET utf8; USE textbook_db; SOURCE D:/path/to/textbook_db.sql;如果脚本里已经带CREATE DATABASE你就不用手动建库直接SOURCE或运行整个脚本就行。导入完成后重点检查三件事数据表是否都建出来了数量跟论文章节里描述的是不是一致。是否有初始用户数据比如管理员账号。很多脚本里会插入admin / admin或admin / 123456。教材表里有没有测试数据。如果一张表都没有数据后面演示发放教材时只能自己手动录入。如果你不会用命令行用 Navicat 或 SQLyog 直接新建数据库然后右键“运行 SQL 文件”也可以。导入时注意选择正确的编码一般选 UTF-8避免中文乱码。4.3 修改连接配置再启动 Tomcat数据库脚本导入成功后打开数据库连接工具类确认或修改这几项String url jdbc:mysql://localhost:3306/textbook_db?characterEncodingutf8; String username root; String password 123456;如果是 MySQL 5.7 默认配置本地连接一般不需要 SSL 和时区参数。如果是 MySQL 8.0上面这一套要改成String url jdbc:mysql://localhost:3306/textbook_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; Class.forName(com.mysql.cj.jdbc.Driver);账号密码必须和你本机 MySQL 一致。如果你不确定 MySQL 密码先在命令行里验证mysql -u root -p如果能进去说明密码没错那就把项目代码里的密码改成这个。这一步是项目能否跑通的第一个关键点排错时优先查这里。然后启动 Tomcat在浏览器访问http://localhost:8080/项目名/login.jsp项目名通常和 WebContent 目录名或context path一致。如果不知道路径看web.xml里的welcome-file配置再根据部署后 IDEA 或 Eclipse 提示的 URL 访问即可。4.4 跑通之后逐个验证角色流程项目能打开登录页只算成功了一半。真正验收项目要按照业务流程走一遍而不是点开几个菜单就关掉。建议按这个顺序验证管理员登录进入后台首页。新增一条教材信息看列表是否出现。新增一个教材类别并把教材归入该类别。做一笔入库操作查看库存数量变化。提交一个订购申请然后以管理员身份审核。做一次教材发放登记验证库存是否扣减。查询统计页面确认汇总数据与实际录入一致。每一步都要记录结果。如果某一步报错或数据不对这就是你论文测试章节里的真实测试用例素材。即使项目本身没问题这套验证记录也能直接填进“系统测试”这一章。5. 几个关键代码点看懂代码比复制代码重要5.1 登录过滤器为什么每个页面都要拦截毕业设计系统里最常见的漏洞就是“不登录也能直接访问页面”。比如用户知道某个 URL绕过登录页直接打开后台页面。所以很多项目会写一个登录过滤器在你的源码包里通常是一个Filter类并在web.xml里配置拦截规则。示意逻辑大概是这样public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req (HttpServletRequest) request; HttpServletResponse resp (HttpServletResponse) response; HttpSession session req.getSession(); if (session.getAttribute(loginUser) null) { resp.sendRedirect(login.jsp); return; } chain.doFilter(request, response); }你要看明白的只有两点第一登录成功后用户信息存进了 Session第二过滤器在请求进入 Servlet 之前拦截没有登录就跳回登录页。答辩时老师很可能问“如何控制用户必须登录”你直接讲这个过滤器流程就行。注意一个细节有些项目会把登录页本身也拦截导致无限跳转。正确做法是把login.jsp、loginServlet或者注册相关的路径排除在拦截范围之外。如果你拿到代码后出现“访问登录页也跳到登录页”的循环多半就是这里的问题。5.2 教材订购和库存扣减的逻辑顺序教材业务里最容易出问题的就是库存扣减。常见场景是班级提交订购申请管理员审核通过系统从库存里扣减相应数量。一个稳妥的做法是先检查剩余库存够不够够再扣减库存不够时给出提示。示意代码int stockCount stockDao.getRemainCount(textbookId); if (stockCount orderCount) { // 返回“库存不足”提示 } else { stockDao.deduct(textbookId, orderCount); orderDao.updateOrderStatus(orderId, 已通过); }这个逻辑难点在于如果两步之间系统崩溃或重启就可能导致库存已经扣了但订单状态没更新或者反过来。毕业设计里不需要你做分布式事务但你要能在论文里说明“当前实现的方法是顺序操作优点是简单直观缺点是极端情况下可能出现数据不一致后续可以引入事务机制来保证一致性”。这段话能体现你考虑到了问题老师会认可。5.3 列表查询的分页和模糊搜索实现教材列表页通常要支持分页和按书名、出版社等条件模糊搜索。老式 jspm 项目里分页方式一般是用 SQL 的LIMIT关键字每次查询当前页的数据。关键参数有三个pageNow当前页码。pageSize每页显示条数常见的值是 10 或 15。totalCount总记录数用来算总页数。分页 SQL 大致是SELECT * FROM textbook WHERE book_name LIKE CONCAT(%, ?, %) LIMIT ?, ?;第一个问号传模糊查询关键字第二个问号传(pageNow - 1) * pageSize第三个传pageSize。你拿到源码后建议把分页部分单独读一遍。因为这是论文“系统详细设计”里高频出现的内容也是老师喜欢问“你是怎么做分页的”这个问题的答案。哪怕代码是抄的你也要能讲清楚LIMIT的两个参数是偏移量和条数不是“第几页”和“几条”。如果项目用的是 PageBean 这样的封装类就去看它封装了哪些属性。通常包含list、pageNow、pageSize、totalCount、totalPageCount。能在答辩时手写出这个类的结构会非常加分。6. LW 文档怎么写才能不被答辩老师挑问题6.1 论文结构和各章写作重点LW 文档一般指毕业设计论文文档。很多源码包里附带的 Word 文档并不完整有的是初稿有的缺图片有的章节顺序不对。拿到之后先用一周时间检查结构。一篇标准的高校教材管理系统毕业论文章节大致是章节写作重点常见错误绪论选题背景、国内外研究现状、论文组织结构抄一段“随着信息技术发展”开头没有结合本校实际相关技术JSP、Servlet、JavaBean、MySQL、Tomcat 介绍大段抄百科没有说明选型理由需求分析可行性分析、功能需求、用例图、非功能需求只写功能清单不写角色和操作流程系统设计总体架构、功能模块设计、数据库设计、ER 图、表结构数据库表字段和实际代码不一致系统实现各页面和核心代码实现、运行截图截图太多缺少实现思路说明系统测试测试环境、测试用例、测试结果只写“系统运行正常”没有具体用例总结完成了什么、不足、展望大段感慨没有实际内容这里最容易出问题的就是“数据库表字段和代码不一致”。如果你拿到源码后改了表结构或者源码里本身就少字段一定要把论文里的表结构描述改成和数据库一致。答辩老师查源码时最先看的不是功能而是论文和代码对不上的地方。6.2 图表、测试用例和截图怎么放毕业设计论文不要求写得像专业书籍但要求有配图和测试数据。配图至少要包含系统架构图或模块图数据库 ER 图管理员登录流程图或订购业务流程图登录页面截图教材管理列表截图订购管理截图库存统计截图截图建议用自己的真实运行结果重新截一遍。很多 LW 文档里用的是别人电脑上的截图水印或路径都对不上答辩时很容易露馅。重新截图不麻烦但能避免非常尴尬的场面。测试用例表是论文里很有说服力的部分。格式大致如下测试编号测试功能操作步骤预期结果实际结果是否通过TC01管理员登录输入正确账号密码点击登录进入后台首页进入后台首页通过TC02管理员登录输入错误密码点击登录提示账号或密码错误提示账号或密码错误通过TC03新增教材填写教材信息并提交列表出现新教材列表出现新教材通过TC04库存不足订购提交大于库存的订购数量提示库存不足提示库存不足通过不需要写几十条能覆盖登录、增删改查、异常输入这三类就够用。6.3 答辩常见的几个提问点答辩时老师一般不会让你从头演示一遍而是边看边提三五个问题。围绕教材管理系统出现频率比较高的提问有“为什么选择 JSP Servlet JavaBean而不是 SSM 或 Spring Boot”回答方向这是课程体系中经典架构适合理解 Web 开发底层过程并且项目本身业务不复杂原生技术就能实现全部功能。“用户密码是怎么存储的”如果项目是明文存储你要诚实说明同时补充“自己知道这个不足计划用 MD5 加盐或 BCrypt 改进”。如果源码里已经加密了就直接讲加密方式。“如何防止 SQL 注入”关键看 DAO 层用的是Statement还是PreparedStatement。用后者可以有效防止 SQL 注入这个知识点要会讲。“库存不够时系统做了什么”对照第 5.2 节的逻辑回答。“系统有哪些不足”不要回答“没有不足”。哪怕说“分页效率不高、日志记录不完整、没有做并发控制”都能体现你考虑过系统边界。提前把这些问题想好答案比背代码效果更好。7. 常见报错与排查顺序7.1 404、500、数据库连接失败拿到源码第一次运行时最常见的三大类报错是404 Not Found页面或 Servlet 路径找不到。先看访问地址里项目名是否写对再看web.xml里servlet-mapping的 URL 路径。有些项目入口是/login.jsp有些是/login要对准。500 Internal Server Error服务器端代码或资源出问题。第一时间看 Tomcat 的catalina.out或 IDEA 控制台日志报错堆栈会直接告诉你哪一行出了问题。不要盯着页面上的英文乱猜。数据库连接失败日志里出现Access denied、Connection refused、Unknown database这几个关键词时按顺序检查MySQL 服务是否启动。账号密码是否正确。数据库名是否和连接串一致。驱动 jar 是否在WEB-INF/lib下。MySQL 端口是否默认 3306是否被占用。这里最容易忽略的是第四点。很多老项目把驱动 jar 放在 Tomcat 公共 lib 里而你的 Tomcat 是后装的公共 lib 没有这个 jar就会报找不到驱动。解决办法很简单把 jar 复制到项目的WEB-INF/lib下。7.2 中文乱码问题中文乱码在 jspm 项目里非常常见而且原因不止一个。优先排查顺序JSP 页面第一行是否设置了pageEncodingUTF-8。web.xml里是否有编码过滤器把CharacterEncodingFilter的编码设为 UTF-8。数据库连接串是否带characterEncodingutf8。数据库表本身字符集是否为 utf8。提交表单时Servlet 里是否调用了request.setCharacterEncoding(UTF-8)。如果你在新增教材时输入中文保存成功后页面显示乱码多半是第 3 或第 4 点问题。如果数据库里存的中文是正常的但页面上显示乱码多半是第 1 或第 2 点问题。如果是从 MySQL 查询出来乱码先连接一下客户端看存储是不是本来就是乱码缩小范围再处理。7.3 端口被占用和启动失败Tomcat 启动时报Port 8080 was already in use说明 8080 被其他程序占了。这里有几种处理方式# Windows 下查看端口占用进程 netstat -ano | findstr 8080 # 然后按 PID 结束进程 taskkill /PID 具体的PID /F如果这个端口是另一个服务在跑不想结束它也可以改 Tomcat 端口。打开conf/server.xml把Connector port8080改成8081或其他未占用端口。改完后访问地址也要跟着变。如果 Tomcat 启动时提示LifecycleException或Context [/项目名] start failed常见原因是web.xml里配了不存在的过滤器或监听器也可能是某个 Servlet 类编译失败。同样先看控制台完整日志不要只盯着最下面一行。8. 想拿高评价这几个小改造值得做8.1 添加验证码和密码加密老毕业设计里登录页通常只有账号密码输入框。你如果加上一个图形验证码功能虽然简单但在答辩时是一个很直观的亮点。实现思路也不复杂用 Java 的BufferedImage生成一张带随机字母数字的图片把验证码存到 Session登录时比对。密码加密也一样。如果原项目密码是明文存储你可以引入 MD5 加密工具类注册或新增用户时把密码转成 MD5 字符串存储。为了让效果更可信可以加上盐值比如MD5(password username)。登录校验时同样先加密再比对。这个改造不需要大改数据库在 Service 层加一个方法就行。8.2 Excel 导入导出教材管理系统和 Excel 天然契合。很多教务人员手里就是 Excel 教材清单如果系统能一键导入会显得很完整。常见做法是使用 POI 库导出教材信息列表到.xls文件查询教材表数据写入 Excel 行。导入教材清单读取 Excel 每一行组装成Textbook对象批量插入数据库。实现时注意两点第一处理 Excel 中的空行和重复编号导入完成后给出“成功多少条、失败多少条”的反馈第二POI 库版本要和你 JDK 兼容老项目用 POI 3.x 配合 JDK 8 比较稳。这个功能做出来后不仅能写进论文“系统实现”章节还可以在“进一步工作”里说改进了系统实用性。8.3 操作日志和异常页面原项目如果没有任何日志记录可以加一个简单的操作日志表记录登录时间、操作模块、操作内容。比如管理员删除教材时往日志表插入一条记录。实现方式可以写一个拦截器或者直接在每个 Servlet 的核心操作后调用日志工具类。再一个低成本改进在web.xml里配置错误页面把 404、500 页面改成友好的提示页。这样测试时截图更完整用户体验也更好。这两个小改动的代码量都不大但对系统完整性的提升非常明显。答辩时老师问“系统怎么做安全防护的”你可以把日志记录和错误页面都算进去。最后说句实在话。这套教材管理系统能不能帮你顺利毕业关键不在源码包多完整而在你是否愿意把每一步都跑通、把每一处报错都搞明白。源码只是地基论文和答辩演示才是结果。把部署流程、核心模块逻辑、数据库表关系、测试用例这几个点整理清楚不管是自己独立写代码还是基于已有源码快速二次开发都能很稳地交出一份合格的毕业设计。