ARTICLE DETAIL

资讯详情

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

Java学生成绩管理系统毕业设计:从环境搭建到二次开发全攻略

Java学生成绩管理系统毕业设计:从环境搭建到二次开发全攻略 简介这是一套面向高校计算机专业学生与Java初学者、用于毕业设计或课程实践的完整学生成绩管理系统源码包围绕学生信息、课程信息、成绩录入查询与统计分析等核心业务展开帮助读者理解Java Web从数据库设计到系统落地的全过程。压缩包共1073个文件约123.1MB以js、html、css等前端资源与gif、png图片为主另含java源码、class编译文件、xml配置、sql建库脚本及properties配置并附部署文档与mp4部署视频便于对照环境搭建与运行调试。资源覆盖MVC分层、JDBC数据访问、DAO与Service业务实现、登录过滤器及成绩统计等关键模块已有215人学习。读者可据此获得一套可直接参考的赛题级项目方案、数据库脚本、部署录屏与排错思路适合作为Java后端入门与数据库管理的实战素材。1. 从一份 zip 说起Java 学生成绩管理系统毕业设计到底交付了什么很多计算机专业的同学在选题阶段会拿到一个压缩包名字通常长这样基于 Java 的学生成绩管理系统毕业设计里面塞着源代码、数据库脚本、部署文档和一段部署视频。第一次拿到它的人往往有两种反应一种是“终于有东西可以交了”另一种是“这堆文件我该从哪看起”。这两种反应其实指向同一个问题这个系统到底由哪些部分组成每一部分在答辩和后续二次开发里承担什么角色。我带的几届学生里真正把这个系统跑起来并且讲清楚的人靠的不是背文档而是先建立一张“交付物地图”。这张地图上有四块Java 后端代码负责业务逻辑数据库负责数据落地部署文档负责环境还原部署视频负责把抽象步骤变成可对照的操作。把这四块串起来你才能回答老师那句“你这个系统是怎么跑起来的”。这篇文章就按这张地图展开从环境准备到数据库设计再到代码结构和部署排错最后落到怎么在这个基础上做出自己的东西。适合正在做毕业设计、需要把系统跑通并讲明白的本科生也适合想拿它练手 Java Web 的初学者。2. 环境准备与项目导入把 zip 变成能跑的工程2.1 JDK、Maven 与 IDE 的版本对齐拿到源码后第一件事不是急着点运行而是确认本机环境和项目要求是否对得上。Java 学生成绩管理系统这类毕业设计常见的技术栈是 JDK 8 或 JDK 11 加 Maven 加 Spring Boot前端可能是 JSP、Thymeleaf 或者前后端分离的 Vue。版本不对齐后面会出现一堆看起来像玄学的报错。先检查本机 Java 版本java -version javac -version mvn -v这三条命令分别看运行时、编译器和构建工具。如果java -version显示 17 而项目用的是 JDK 8 的语法和依赖Spring Boot 2.x 在某些版本组合下会直接启动失败。我一般会建议用 JDK 8 或 JDK 11 跑这类老项目因为很多毕业设计里的依赖版本偏旧用高版本 JDK 容易碰到模块化相关的坑。Maven 的作用是把pom.xml里声明的依赖下载到本地仓库。如果下载慢可以在settings.xml里配置国内镜像。这一步不是可选项依赖下不全项目连编译都过不去。提示不要用 IDE 自带的 Maven 捆绑版本去覆盖系统 Maven两者混用会导致依赖路径不一致排查起来很费时间。2.2 导入工程后先看三份文件把项目导入 IntelliJ IDEA 或 Eclipse 之后先别动代码按顺序看三份文件。第一份是pom.xml它告诉你项目用了哪些依赖、Spring Boot 版本是多少、打包方式是什么。重点看spring-boot-starter-web、mybatis或spring-data-jpa、以及数据库驱动mysql-connector-java的版本。第二份是application.yml或application.properties数据库连接信息、端口号、日志级别都在这里。很多同学导入后启动报错十有八九是这里的数据库地址、用户名、密码和本机对不上。第三份是数据库脚本通常是.sql文件。它决定了你要先建库还是先建表表名和字段名要和实体类对得上。spring: datasource: url: jdbc:mysql://localhost:3306/score_manage?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver这段配置里serverTimezone不写经常会导致时间字段差 8 小时characterEncodingutf8不写则可能出现中文乱码。这两个参数是血泪经验不是可写可不写。2.3 用 Maven 命令验证依赖完整性导入之后在项目根目录执行mvn clean compileclean清掉旧的编译产物compile重新编译。如果这一步报错说明依赖或代码有问题先解决编译错误再谈运行。常见错误是某个依赖下载失败或者 JDK 版本和pom.xml里maven.compiler.source不一致。编译通过后再执行mvn spring-boot:run或者找到主启动类直接运行。启动成功的标志是控制台出现 Tomcat 启动端口和 Spring 上下文初始化完成的日志。如果卡在数据库连接上回到application.yml检查连接串。3. 数据库设计与建表成绩管理系统的数据底座3.1 核心表结构与字段含义学生成绩管理系统的数据库设计不算复杂但表与表之间的关系必须清楚。常见做法是四张核心表学生表、课程表、成绩表、用户表。用户表负责登录和权限学生表存学生基本信息课程表存课程信息成绩表是学生和课程的多对多关联同时记录分数。表名主要字段说明studentid, student_no, name, class_id, gender学生基本信息student_no 唯一courseid, course_no, course_name, credit, teacher课程信息credit 为学分scoreid, student_id, course_id, score, exam_time成绩记录student_id 和 course_id 联合索引sys_userid, username, password, role登录用户role 区分管理员和教师成绩表的设计有一个容易翻车的地方把学生姓名和课程名直接冗余进去。这样做查询方便但一旦学生改名或课程调整数据就不一致。正确做法是用外键关联查询时用 JOIN。CREATE TABLE score ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_id INT NOT NULL, score DECIMAL(5,2) DEFAULT NULL, exam_time DATE DEFAULT NULL, UNIQUE KEY uk_student_course (student_id, course_id), CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES student(id), CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;DECIMAL(5,2)表示最多三位整数两位小数足够存 100.00 以内的分数。UNIQUE KEY防止同一个学生同一门课重复录入成绩。utf8mb4比utf8更完整能存生僻字。3.2 导入 SQL 脚本的两种方式拿到.sql文件后可以用命令行导入也可以用图形化工具。命令行方式适合脚本化图形化方式适合边看边改。命令行导入mysql -u root -p -e CREATE DATABASE score_manage DEFAULT CHARACTER SET utf8mb4; mysql -u root -p score_manage score_manage.sql第一条建库第二条把脚本导入指定库。注意是输入重定向不是比较符号。如果脚本里已经有CREATE DATABASE和USE语句第二条命令直接执行即可。图形化工具比如 Navicat、DBeaver操作是右键连接、新建数据库、运行 SQL 文件。导入后检查表是否齐全可以用USE score_manage; SHOW TABLES; SELECT COUNT(*) FROM student;SHOW TABLES看表清单SELECT COUNT(*)看初始数据有没有进去。如果表是空的可能是脚本里只有建表语句没有插入语句或者插入语句被注释掉了。3.3 初始账号与权限数据登录功能依赖sys_user表里的初始账号。常见做法是插入一条管理员账号密码用 MD5 或 BCrypt 加密。如果直接存明文答辩时老师可能会问安全性问题。INSERT INTO sys_user (username, password, role) VALUES (admin, e10adc3949ba59abbe56e057f20f883e, ADMIN);这里的密码值是123456的 MD5。实际项目中更推荐 BCrypt因为 MD5 已经被证明不够安全。如果项目代码里用的是 BCrypt就不能直接插 MD5 值否则登录会失败。判断方法是在登录逻辑里看它调用的是DigestUtils.md5DigestAsHex还是BCryptPasswordEncoder.matches。4. 代码结构与核心功能从登录到成绩录入4.1 分层结构与请求流转Java Web 项目通常分 Controller、Service、Mapper/DAO 三层。Controller 接收 HTTP 请求Service 处理业务逻辑Mapper 负责数据库操作。理解这个流转你才能知道改一个功能要动哪几个文件。以登录为例请求从浏览器发到/loginController 拿到用户名密码调用 ServiceService 调用 Mapper 查数据库查到的用户对象返回给 ControllerController 再决定跳转页面还是返回 JSON。PostMapping(/login) public String login(String username, String password, HttpSession session) { SysUser user userService.findByUsername(username); if (user null || !passwordEncoder.matches(password, user.getPassword())) { return redirect:/login?error; } session.setAttribute(currentUser, user); return redirect:/index; }这段代码里passwordEncoder.matches做的是密文比对不是明文比对。session.setAttribute把用户信息存到会话里后续页面通过 session 判断是否登录。如果登录后刷新页面又回到登录页检查 session 是否被正确设置以及拦截器有没有放行静态资源。4.2 成绩录入与查询的实现要点成绩录入通常是一个表单选择学生、选择课程、输入分数。后端接收后先校验是否重复再插入或更新。public void saveScore(Integer studentId, Integer courseId, BigDecimal score) { Score existing scoreMapper.findByStudentAndCourse(studentId, courseId); if (existing ! null) { existing.setScore(score); scoreMapper.updateById(existing); } else { Score record new Score(); record.setStudentId(studentId); record.setCourseId(courseId); record.setScore(score); scoreMapper.insert(record); } }这段逻辑是“存在则更新不存在则插入”。参数说明studentId和courseId来自前端下拉框score来自输入框。如果前端传的是字符串后端要用BigDecimal接收并做转换避免精度丢失。查询成绩时常见需求是按学生查、按课程查、按班级查。SQL 里用 JOIN 把学生姓名和课程名带出来SELECT s.name AS studentName, c.course_name AS courseName, sc.score FROM score sc JOIN student s ON sc.student_id s.id JOIN course c ON sc.course_id c.id WHERE s.class_id #{classId} ORDER BY sc.score DESC;ORDER BY sc.score DESC让成绩从高到低排方便做排名。如果数据量大class_id上要加索引否则查询会慢。4.3 页面跳转与静态资源路径如果项目用的是 Thymeleaf 或 JSP页面文件放在templates或webapp目录下。静态资源如 CSS、JS、图片放在static目录。路径写错会导致页面样式丢失或 404。常见做法是在application.yml里配置spring: thymeleaf: prefix: classpath:/templates/ suffix: .html cache: falsecache: false在开发阶段很有用改完页面刷新就能看到效果不用重启。上线时再改成true。5. 部署与排错把系统搬到另一台机器上5.1 打包与运行开发完成后用 Maven 打包mvn clean package -DskipTests-DskipTests跳过测试加快打包速度。打包成功后target目录下会生成一个.jar文件。运行java -jar target/score-manage-0.0.1-SNAPSHOT.jar如果打包出来的是.war需要放到 Tomcat 的webapps目录下运行。判断方式是看pom.xml里的packaging标签。5.2 部署文档和视频的使用方法部署文档通常写明了环境要求、数据库导入步骤、配置文件修改点、启动命令。部署视频则是把这些步骤录屏演示一遍。我一般建议先看视频快速过一遍流程再对着文档一步步操作遇到不一致的地方以文档为准因为视频可能录的是旧版本。如果文档里写了“修改 application.yml 中的数据库密码”就去改。如果写了“执行 init.sql”就去执行。不要跳步跳步的结果往往是启动报错后不知道从哪查。5.3 常见启动失败排查顺序启动失败时按这个顺序查先看控制台最后一段异常堆栈通常是Caused by那一行再看数据库连接是否成功然后看端口是否被占用最后看依赖是否完整。端口被占用的报错是Port 8080 was already in use解决办法是改端口或杀掉占用进程。数据库连接失败的报错是Access denied或Communications link failure分别对应密码错误和数据库没启动。6. 避坑与常见问题那些答辩前夜才发现的坑6.1 中文乱码从数据库到页面的全链路排查现象页面显示的问号或乱码数据库里查出来也是乱码。原因数据库字符集、连接串字符集、页面编码三者不一致。常见是数据库建库时用了latin1或者连接串没写characterEncodingutf8。解决建库时指定utf8mb4连接串加useUnicodetruecharacterEncodingutf8页面头部加meta charsetUTF-8。三处都对齐后乱码基本消失。6.2 登录后立刻跳回登录页现象输入正确账号密码登录成功一瞬间又回到登录页。原因session 没存住或者拦截器把登录后的请求也拦了。常见于前后端分离项目里跨域导致 session 丢失。解决检查拦截器配置放行/login和静态资源。如果是跨域后端要配置allowCredentials(true)前端请求要带withCredentials。6.3 成绩录入重复提交现象点一次保存数据库里出现两条相同记录。原因表单没有防重复提交或者前端按钮没禁用。解决数据库层加唯一索引后端插入前先查重前端提交后禁用按钮。三层防护缺一层都可能出问题。6.4 打包后运行报找不到主类现象java -jar报no main manifest attribute。原因pom.xml里没配置 Spring Boot 的打包插件或者打包方式不对。解决确认pom.xml里有spring-boot-maven-plugin并且执行的是mvn package而不是mvn compile。6.5 数据库脚本导入一半报错现象导入 SQL 时中途报错后面的表没建出来。原因脚本里有外键依赖建表顺序不对或者重复执行导致表已存在。解决按依赖顺序建表先建被引用的表。脚本开头加DROP TABLE IF EXISTS或者导入前先清空数据库。7. 在现有系统上做出自己的东西二次开发与答辩加分项把系统跑通只是及格线真正让答辩老师眼前一亮的是你在这个基础上做了什么改动。我一般会建议从三个方向入手加一个统计图表、改一处业务逻辑、优化一个性能点。加统计图表是最容易出效果的。比如在成绩查询页面加一个按课程统计平均分的柱状图用 ECharts 引入后端提供一个/api/score/avg接口返回 JSON 数据。GetMapping(/api/score/avg) ResponseBody public MapString, Object avgByCourse() { ListMapString, Object list scoreMapper.avgByCourse(); MapString, Object result new HashMap(); result.put(courses, list.stream().map(m - m.get(courseName)).collect(Collectors.toList())); result.put(averages, list.stream().map(m - m.get(avgScore)).collect(Collectors.toList())); return result; }对应的 SQLSELECT c.course_name AS courseName, AVG(sc.score) AS avgScore FROM score sc JOIN course c ON sc.course_id c.id GROUP BY c.course_name;这段代码返回两个数组前端 ECharts 直接消费。参数说明courseName是 X 轴avgScore是 Y 轴。如果平均分有小数前端可以toFixed(2)保留两位。改业务逻辑可以从权限入手。比如原来只有管理员能录入成绩现在增加教师角色教师只能录入自己教的课程。这需要在sys_user表加角色字段在 Service 层加判断。优化性能可以从 SQL 入手。比如成绩查询原来用SELECT *改成只查需要的字段或者在student_id和course_id上建联合索引。用EXPLAIN看执行计划确认索引是否生效。EXPLAIN SELECT s.name, c.course_name, sc.score FROM score sc JOIN student s ON sc.student_id s.id JOIN course c ON sc.course_id c.id WHERE sc.student_id 1;看type列是不是ref或eq_ref看key列有没有用到索引。如果type是ALL说明全表扫描需要加索引。答辩时老师最爱问的三个问题是你这个系统有什么创新点、数据库为什么这样设计、如果并发量大了怎么办。创新点可以答统计图表和权限细化数据库设计可以答三范式和外键约束并发问题可以答加索引、加缓存、或者用连接池。提前准备好这些答案比临场发挥稳得多。我自己带学生做毕业设计这些年最大的教训是不要等到答辩前一周才开始跑系统。提前跑通、提前改一处、提前想好被问什么这三件事做到答辩就不会慌。希望帮到你。本文还有配套的精品资源点击获取
返回列表