简介:这是一套基于Java+JSP+MySQL开发的Web版学生信息管理系统完整工程,专为计算机专业本科生课程设计与期末大作业打造,覆盖Servlet基础、MVC分层实践、JDBC数据库操作及前端交互等核心教学知识点。资源包含241个文件,主体为109个Java后端类(含DAO、Service、Servlet)、56个JSP页面(登录、学生列表、增删改查等模块)、23个JS脚本(表单校验、AJAX交互)及15个运行依赖JAR包;配套SQL建库脚本、Layui前端样式资源(CSS/JS/图标字体)与详细文档说明,整体压缩包仅9.17MB,轻量易部署。已有247人学习下载,所有代码均经本地编译验证可直接运行,评审得分高达98分,内容由助教审定,结构清晰、注释规范,涵盖数据库设计说明、功能模块划分图与常见部署问题解决方案,适合初学者系统掌握B/S架构开发全流程。
1. Java+JSP+MySQL学生信息管理系统:不是Demo,是能跑通评审、改三遍还能交的课程设计“保命包”
你是不是正卡在期末大作业deadline前48小时,对着Eclipse里一堆红叉发呆?老师说“用Java Web做学生管理系统”,你搜出十几个GitHub项目——点开全是index.jsp报404,web.xml缺servlet-mapping,MySQL连不上还提示Access denied for user 'root'@'localhost'?别慌。这份Java+JSP+MySQL学生信息管理系统源码,不是网上那种“仅作学习参考”的半成品,而是本地实测可运行、数据库脚本一键导入、LayUI前端不报错、登录/增删改查/分页全链路走通的“交作业友好型”工程。它专为课程设计和期末大作业打磨:难度适中(没硬塞Spring Boot或MyBatis Plus增加理解负担),结构清晰(MVC分层明确,Servlet控制层逻辑干净),文档带截图(连Tomcat端口怎么改、MySQL密码怎么重置都写了)。如果你需要的是一个“下载解压→配环境→启动→截图交差”的确定性路径,而不是在Stack Overflow里翻三天还搞不定ClassNotFoundException: com.mysql.jdbc.Driver,那这份资源就是你现在最该点开的压缩包。
2. 环境搭起来:JDK 8 + Tomcat 8.5 + MySQL 5.7 的黄金组合与避坑清单
这套系统不是为最新技术栈设计的,它的稳定恰恰来自对成熟生态的精准锁定。我反复验证过:用JDK 17跑会因javax.servlet包冲突直接挂掉;Tomcat 10默认用Jakarta EE命名空间,而JSP里写的还是javax.servlet.*——这俩一碰就炸。所以必须严格按老但稳的组合来:JDK 8u202、Tomcat 8.5.99、MySQL 5.7.42。下面每一步我都贴了命令、路径和关键检查点,照着敲,少踩一半坑。
2.1 JDK 8 安装与验证:别信java -version,要看CLASSPATH
# 下载地址(Oracle官网已下架,用国内镜像站): # https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-windows-x64.exe # 安装后设置环境变量(Windows示例): JAVA_HOME=C:\Program Files\Java\jdk1.8.0_202 PATH=%JAVA_HOME%\bin;%PATH% CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar提示:
CLASSPATH里那个.(当前目录)不能省!很多同学只配了JAVA_HOME和PATH,结果编译Servlet时提示package javax.servlet does not exist——因为tools.jar和servlet-api.jar根本没被加载。验证命令不是java -version,而是:javac -version && java -cp "%JAVA_HOME%\lib\servlet-api.jar" javax.servlet.Servlet如果第二条没报错,说明Servlet API已就位。
2.2 Tomcat 8.5 部署:解压即用,但端口和权限得动两刀
# 下载地址(Apache存档站): # https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.99/bin/apache-tomcat-8.5.99-windows-x64.zip # 解压到 D:\tomcat85(路径别含中文、空格!) # 修改 conf/server.xml:把 Connector port="8080" 改成 port="8081"(避开公司内网常用端口) # 修改 conf/tomcat-users.xml:添加manager角色(用于后续部署验证) <role rolename="manager-gui"/> <user username="admin" password="123456" roles="manager-gui"/>注意:Tomcat 8.5 默认禁用
manager-gui访问。除了加用户,还得改webapps/manager/META-INF/context.xml,注释掉IP限制段:<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->否则浏览器访问
http://localhost:8081/manager/html会403。
2.3 MySQL 5.7 安装与初始化:跳过密码强度校验,直奔建库
# 下载地址(MySQL官网存档): # https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.42-winx64.zip # 解压到 D:\mysql57,创建 my.ini(关键配置): [mysqld] port=3306 basedir=D:\\mysql57 datadir=D:\\mysql57\\data max_connections=200 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 跳过密码强度校验(避免安装时卡在validate_password插件) validate_password=OFF # 允许root从任意host连接(开发阶段省事) skip-grant-tables血泪经验:MySQL 5.7安装后首次启动,如果卡在
Starting MySQL...不动,大概率是datadir路径权限问题。右键D:\mysql57\data→ 属性 → 安全 → 编辑 → 添加Users组并赋予“完全控制”。启动服务后,用命令行执行:mysql -u root -p -- 密码为空直接回车 UPDATE mysql.user SET authentication_string=PASSWORD('root') WHERE User='root'; FLUSH PRIVILEGES; EXIT;然后删掉
my.ini里的skip-grant-tables,重启服务。这才是真正的“root/root”可用状态。
2.4 避坑:环境配置的四大翻车现场与后悔药
| 现象 | 原因 | 解决 |
|---|---|---|
| Eclipse里新建Dynamic Web Project,Target Runtime找不到Tomcat 8.5 | Eclipse没识别到Tomcat安装目录,或Tomcat版本被误判为9.x | Window → Preferences → Server → Runtime Environments → Add → Apache → Tomcat v8.5 → Browse选D:\tomcat85,务必勾选“Create a new local server”,否则Eclipse不认 |
启动Tomcat后访问http://localhost:8081显示404,但http://localhost:8081/manager/html能进 | 项目没部署成功,或web.xml里<welcome-file-list>指向的首页不存在 | 检查WebContent/index.jsp是否真实存在;确认web.xml中<welcome-file>写的是index.jsp而非index.html;在Eclipse Servers视图右键Tomcat → “Add Deployment” → 选中你的项目 |
MySQL Workbench连不上,报Authentication plugin 'caching_sha2_password' cannot be loaded | MySQL 8.0+默认认证插件不兼容JDBC 5.x驱动 | 本资源用的是MySQL 5.7,但如果你误装了8.0,执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';再FLUSH PRIVILEGES; |
JSP页面中文乱码,表单提交后数据库存的是?? | 三个地方没统一UTF-8:JSP文件编码、Tomcat URIEncoding、MySQL连接URL | 在conf/server.xml的Connector标签里加URIEncoding="UTF-8";JSP文件顶部加<%@ page contentType="text/html;charset=UTF-8" %>;数据库连接URL末尾加?useUnicode=true&characterEncoding=UTF-8 |
3. 源码结构拆解:从web.xml入口到StudentDAO实现,看懂MVC怎么落地
拿到源码包,别急着跑。先花5分钟理清骨架——这决定你后续改功能时往哪加代码、哪里容易崩。整个项目是标准的Servlet+JSP MVC,没有框架遮掩,所有流转逻辑都裸露在代码里。核心就四层:web.xml定路由 →Servlet做控制器 →DAO操作数据库 →JSP渲染页面。下面按调用链带你过一遍关键文件。
3.1web.xml:所有请求的总开关,<servlet-mapping>是命门
<!-- web.xml 片段 --> <servlet> <servlet-name>StudentServlet</servlet-name> <servlet-class>com.student.servlet.StudentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>StudentServlet</servlet-name> <url-pattern>/student</url-pattern> </servlet-mapping> <!-- 注意:这个 /student 就是所有增删改查的统一入口 --> <!-- JSP里表单action="/student?method=add",全部打到这里 -->逻辑说明:所有HTTP请求(如
/student?method=list)先被Tomcat捕获,根据<url-pattern>匹配到StudentServlet,再由Servlet内部request.getParameter("method")分发。这种设计比每个功能写一个Servlet清爽得多,但要求你千万别手抖改错<servlet-name>和<servlet-mapping>里的名字——它们必须严格一致,否则404。
3.2StudentServlet.java:控制器的核心,doPost里藏着所有业务分支
// com.student.servlet.StudentServlet.java 关键片段 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String method = request.getParameter("method"); StudentDAO dao = new StudentDAO(); // DAO实例化放在这里,避免每次new开销 if ("list".equals(method)) { List<Student> list = dao.findAll(); request.setAttribute("studentList", list); request.getRequestDispatcher("list.jsp").forward(request, response); } else if ("add".equals(method)) { String name = request.getParameter("name"); String id = request.getParameter("id"); Student stu = new Student(id, name, ...); dao.add(stu); response.sendRedirect("student?method=list"); // 重定向防重复提交 } else if ("delete".equals(method)) { String id = request.getParameter("id"); dao.delete(id); response.sendRedirect("student?method=list"); } }参数说明:
request.getParameter("method")是整个控制流的开关;request.setAttribute()把数据传给JSP;response.sendRedirect()是重定向,确保刷新页面不重复提交;dao.add(stu)调用的是StudentDAO的插入方法——这里没用事务,因为课程设计级别不需要。
3.3StudentDAO.java:数据库操作黑匣子,JDBC模板写法教科书级
// com.student.dao.StudentDAO.java 片段 public class StudentDAO { private static final String URL = "jdbc:mysql://localhost:3306/studentdb?useUnicode=true&characterEncoding=UTF-8"; private static final String USER = "root"; private static final String PASSWORD = "root"; public List<Student> findAll() { List<Student> list = new ArrayList<>(); String sql = "SELECT * FROM student ORDER BY id ASC"; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { while (rs.next()) { Student s = new Student(); s.setId(rs.getString("id")); s.setName(rs.getString("name")); s.setGender(rs.getString("gender")); list.add(s); } } catch (SQLException e) { e.printStackTrace(); // 课程设计允许打印堆栈,生产环境要log } return list; } public void add(Student student) { String sql = "INSERT INTO student (id, name, gender, ...) VALUES (?, ?, ?, ...)"; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, student.getId()); ps.setString(2, student.getName()); ps.setString(3, student.getGender()); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } }关键细节:
PreparedStatement防SQL注入是必须的;try-with-resources自动关连接,不用写finally{conn.close()};URL里useUnicode=true&characterEncoding=UTF-8解决中文乱码;密码明文写死在代码里——这是课程设计的合理妥协,真项目必须抽到配置文件。
3.4list.jsp:LayUI前端怎么和Servlet数据对接
<%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>学生列表</title> <link rel="stylesheet" href="layui/css/layui.css"> </head> <body> <div class="layui-container"> <table class="layui-table"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>性别</th> <th>操作</th> </tr> </thead> <tbody> <c:forEach items="${studentList}" var="stu"> <tr> <td>${stu.id}</td> <td>${stu.name}</td> <td>${stu.gender}</td> <td> <a href="student?method=delete&id=${stu.id}" class="layui-btn layui-btn-xs">删除</a> <a href="edit.jsp?id=${stu.id}" class="layui-btn layui-btn-xs">编辑</a> </td> </tr> </c:forEach> </tbody> </table> </div> <script src="layui/layui.js"></script> </body> </html>玄学点:
<c:forEach>能用,前提是你的web.xml里声明了JSTL支持(本资源已配好);${stu.id}能取到值,是因为Servlet里request.setAttribute("studentList", list)把List对象绑到了request域;href="student?method=delete&id=${stu.id}"直接拼URL,没走AJAX——简单粗暴,适合课程设计。
4. 数据库导入与字段解析:studentdb.sql里藏着哪些设计巧思
数据库不是随便建的。这份studentdb.sql脚本经过助教审定,字段类型、约束、索引都按教学场景优化过。它没用外键(避免初学者理解困难),但用NOT NULL和DEFAULT保证基础数据质量;id设为VARCHAR(10)而非INT,因为学号可能是20230001这种字符串;create_time用TIMESTAMP DEFAULT CURRENT_TIMESTAMP自动记录入库时间——这些细节,都是交作业时老师会扫一眼的加分项。
4.1studentdb.sql完整脚本与字段注释
-- 创建数据库 CREATE DATABASE IF NOT EXISTS studentdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE studentdb; -- 学生表 CREATE TABLE student ( id VARCHAR(10) NOT NULL PRIMARY KEY COMMENT '学号,主键', name VARCHAR(20) NOT NULL COMMENT '姓名', gender ENUM('男','女') DEFAULT '男' COMMENT '性别,枚举类型更安全', major VARCHAR(30) DEFAULT '' COMMENT '专业', grade INT DEFAULT 2023 COMMENT '年级,如2023表示2023级', phone VARCHAR(15) DEFAULT '' COMMENT '手机号', email VARCHAR(50) DEFAULT '' COMMENT '邮箱', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表'; -- 插入测试数据(3条,够演示用) INSERT INTO student (id, name, gender, major, grade, phone, email) VALUES ('20230001', '张三', '男', '计算机科学与技术', 2023, '13800138000', 'zhangsan@xxx.edu.cn'), ('20230002', '李四', '女', '软件工程', 2023, '13800138001', 'lisi@xxx.edu.cn'), ('20230003', '王五', '男', '数据科学与大数据技术', 2023, '13800138002', 'wangwu@xxx.edu.cn');为什么这样设计:
ENUM('男','女')比VARCHAR更省内存且防脏数据;grade INT DEFAULT 2023让年级可排序(ORDER BY grade DESC);update_time自动更新,省去在DAO里手动写时间戳;COMMENT字段在Navicat里鼠标悬停就能看到说明——老师评审时会觉得你考虑周全。
4.2 导入SQL的两种可靠方式:命令行 vs Workbench
方式一:命令行(推荐,快且无GUI干扰)
# 打开CMD,cd到sql文件所在目录 mysql -u root -p studentdb < studentdb.sql # 输入密码 root,回车后无输出即成功 # 验证:mysql -u root -p -e "USE studentdb; SELECT COUNT(*) FROM student;"方式二:MySQL Workbench(可视化,适合新手)
- 连接MySQL服务器(Host: localhost, Port: 3306, Username: root, Password: root)
- 左侧SCHEMAS → 右键
studentdb→ “Table Data Import Wizard” - 选择
studentdb.sql文件 → Next → 确认目标Schema为studentdb→ Finish
注意:如果Workbench报错“Error Code: 1046. No database selected”,说明你没在第一步选中
studentdb库。必须先在SCHEMAS里双击打开studentdb,再右键导入。
4.3 字段边界验证:哪些字段能为空?哪些必须填?
| 字段名 | 类型 | 是否允许NULL | 默认值 | 业务含义 | 交作业时检查点 |
|---|---|---|---|---|---|
id | VARCHAR(10) | NOT NULL | — | 学号为主键,绝对不能为空 | 表单提交时JS校验if(!id) alert('学号必填') |
name | VARCHAR(20) | NOT NULL | — | 姓名不能为空 | Servlet里`if(name==null |
gender | ENUM | DEFAULT '男' | '男' | 性别有默认值,降低录入门槛 | LayUI下拉框默认选“男” |
major | VARCHAR(30) | DEFAULT '' | 空字符串 | 专业可为空,适应转专业学生 | JSP里${empty stu.major ? '未填写' : stu.major} |
phone | VARCHAR(15) | DEFAULT '' | 空字符串 | 手机号非强制,但格式要校验 | 前端用正则^1[3-9]\d{9}$验证 |
排查技巧:如果新增学生时报错
Column 'name' cannot be null,不是数据库问题,而是JSP表单里<input name="name">没传值,或者Servlet里request.getParameter("name")返回null——这时要在add分支开头加日志:System.out.println("name received: [" + name + "]");
5. 功能扩展实战:加一个“按专业查询”功能,从零到上线只需改3个文件
课程设计交完不等于结束。老师常会问:“如果我想查‘软件工程’专业的学生,怎么加?”——这题考的就是你对MVC的理解深度。下面带你手把手加一个/student?method=searchByMajor&major=软件工程功能,全程不碰Tomcat、不改数据库,只动3个文件:StudentServlet.java、StudentDAO.java、list.jsp。改完立刻生效,连服务器都不用重启。
5.1StudentServlet.java:加一个searchByMajor分支
// 在doPost方法里,else if块中新增: } else if ("searchByMajor".equals(method)) { String major = request.getParameter("major"); List<Student> list = dao.findByMajor(major); // 新增DAO方法 request.setAttribute("studentList", list); request.setAttribute("searchMajor", major); // 把搜索关键词传回JSP,方便高亮 request.getRequestDispatcher("list.jsp").forward(request, response); }为什么加
request.setAttribute("searchMajor", major):JSP里要用${searchMajor}显示当前搜索条件,比如“您正在搜索:软件工程”,提升用户体验。这不是必须,但能让老师觉得你懂产品思维。
5.2StudentDAO.java:写一个带参数的查询方法
// 在StudentDAO类里新增方法 public List<Student> findByMajor(String major) { List<Student> list = new ArrayList<>(); String sql = "SELECT * FROM student WHERE major LIKE ? ORDER BY id ASC"; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, "%" + major + "%"); // 模糊查询,支持“软件”“软件工程”都命中 try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { Student s = new Student(); s.setId(rs.getString("id")); s.setName(rs.getString("name")); s.setGender(rs.getString("gender")); s.setMajor(rs.getString("major")); list.add(s); } } } catch (SQLException e) { e.printStackTrace(); } return list; }参数说明:
LIKE ?配合ps.setString(1, "%" + major + "%")实现模糊匹配;ORDER BY id ASC保持列表有序;try-with-resources嵌套确保ResultSet也自动关闭。
5.3list.jsp:加搜索框和结果提示
<!-- 在<table>上方加搜索区域 --> <div class="layui-form"> <form class="layui-form" action="student" method="get"> <input type="hidden" name="method" value="searchByMajor"> <div class="layui-input-inline"> <input type="text" name="major" required lay-verify="required" placeholder="请输入专业名称" autocomplete="off" class="layui-input" value="${param.major != null ? param.major : ''}"> </div> <button class="layui-btn" lay-submit lay-filter="search">搜索</button> <a href="student?method=list" class="layui-btn layui-btn-primary">重置</a> </form> </div> <!-- 在表格标题下方加提示 --> <c:if test="${not empty searchMajor}"> <div class="layui-alert layui-alert-info">共找到 <strong>${fn:length(studentList)}</strong> 条“${searchMajor}”相关记录</div> </c:if>关键点:
<input name="major">的name必须和Servlet里request.getParameter("major")一致;value="${param.major != null ? param.major : ''}"让搜索后输入框保留关键词,符合用户预期;<c:if>判断searchMajor是否存在,只在搜索时显示提示——这是JSTL的典型用法。
5.4 避坑:扩展功能时的三个隐形雷区
| 现象 | 原因 | 解决 |
|---|---|---|
| 搜索后列表为空,但数据库里明明有数据 | major字段在数据库里存的是软件工程,但用户搜软件,LIKE '%软件%'能命中;如果搜软工,'%软工%'就查不到——这是模糊查询的天然局限 | 在DAO方法里加日志:System.out.println("Searching major: [" + major + "]");,确认传入值正确;或改用CONCAT('%', ?, '%')更安全 |
搜索框输入中文,URL里变成乱码?method=searchByMajor&major=%E8%BD%AF%E4%BB%B6 | 浏览器GET请求默认UTF-8编码,但Tomcat没配URIEncoding | 回头检查conf/server.xml的Connector标签,确认有URIEncoding="UTF-8",否则request.getParameter("major")拿到的就是乱码 |
| 点击“重置”按钮后,页面显示“您正在搜索:软件工程”,但列表是全部学生 | searchMajor属性只在搜索时设置,重置链接student?method=list没清掉它,JSP里${searchMajor}仍非空 | 在list分支的Servlet里加request.removeAttribute("searchMajor"),或JSP里用<c:if test="${not empty param.major}">替代<c:if test="${not empty searchMajor}"> |
6. 评审答辩通关技巧:从代码注释到答辩话术,把“能跑”变成“讲得清”
交作业只是起点,答辩才是终局。老师不会逐行看你代码,但会盯着三个地方问:为什么用JSP不用Thymeleaf?为什么DAO没用连接池?为什么分页没做?这些问题背后,考的是你对技术选型的理解,不是背答案。我当年答辩被问懵过,后来总结出一套“三句话回应法”:先认事实,再讲约束,最后提演进。下面用真实场景拆解。
6.1 代码注释规范:不是写“// 初始化变量”,而是写“为什么这么初始化”
很多同学注释写成说明书:“// 获取数据库连接”。这没用。老师想听的是决策逻辑。看这份源码里StudentDAO.java的真实注释:
// 使用DriverManager而非DBCP连接池 // 原因:课程设计要求体现JDBC原生操作,连接池属于框架范畴,超出考核范围 // 且单用户并发低,连接开销可接受 private static final String URL = "jdbc:mysql://localhost:3306/studentdb?useUnicode=true&characterEncoding=UTF-8"; // PreparedStatement预编译,非Statement拼接 // 原因:防止SQL注入(如name='张三\' OR \'1\'=\'1'),且提升重复查询性能 public List<Student> findAll() { // ... }为什么有效:每条注释都回答了“为什么选A不选B”。答辩时老师问“为什么不用HikariCP?”,你直接指这段注释:“因为助教明确要求展示JDBC底层操作,连接池是后续Spring Boot阶段的内容”。
6.2 答辩话术模板:把技术缺陷转化成教学设计亮点
| 老师可能问 | 错误回应(扣分) | 正确回应(加分) |
|---|---|---|
| “登录没做密码加密,不安全” | “啊…忘了加…” | “是的,当前用明文存储。这是因为课程设计重点在MVC流程贯通,密码加密涉及SHA256/BCrypt等算法,属于信息安全专项内容,计划在后续《Web安全》课中深入实践。” |
| “没做分页,大数据量会卡” | “还没来得及做…” | “目前数据量<100条,内存全量加载响应更快。分页需改造DAO层加limit/offset,以及Servlet传pageNo/pageSize参数——这正是我下一步拓展计划,已写在文档‘后续优化’章节。” |
| “为什么用LayUI不用Bootstrap?” | “网上下载的…” | “LayUI组件更轻量,CSS文件少(本项目只用layui.css/layer.css),适合教学演示;且其表格、弹窗API更简洁,减少学生理解成本——助教审定时也认可这点。” |
底层逻辑:答辩不是考试,是展示你的工程权衡能力。所有“缺点”都要包装成“在约束下的合理选择”,并指向明确的演进路径。
6.3 文档交付 checklist:让老师3秒内看到你的工作量
评审老师平均每人看10份作业,你只有30秒抓住注意力。文档不是越多越好,而是关键证据前置。我当年把文档做成三页PDF,第一页就是“成果速览”:
| 项目模块 | 实现功能 | 截图位置 | 技术要点 |
|---|---|---|---|
| 登录模块 | 用户名密码校验、错误提示 | P2 图1 | login.jsp表单action指向LoginServlet,checkUser()方法查库 |
| 学生管理 | 增删改查、按专业搜索 | P3 图2-5 | StudentServletmethod分发,findByMajor()模糊查询 |
| 前端交互 | LayUI表格、弹窗确认删除 | P4 图6 | layer.confirm()二次确认,防误操作 |
| 数据库 | studentdb建库脚本、字段注释 | P5 表结构 | ENUM类型防脏数据,TIMESTAMP自动更新 |
从那以后我每次交课程设计,都强制走一遍这个checklist:先写好这页速览表,再补截图和详细说明。老师翻开第一页,看到表格里“技术要点”列写着
method分发、模糊查询、二次确认,就知道你真干了活,而不是Ctrl+C/V。希望帮到你。
本文还有配套的精品资源,点击获取