news 2026/10/23 5:03:57

JSP+MySQL体育赛事管理系统毕设实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JSP+MySQL体育赛事管理系统毕设实战指南

简介:本资源是一份面向计算机专业本科生的毕业设计论文《体育赛事管理系统的设计与实现》,聚焦于解决高校运动会、校级体育赛事中人工登记、成绩统计与赛程调度效率低下的实际问题。全文采用软件工程方法完成需求分析、系统设计与实现,涵盖操作员管理、运动员信息维护、项目分类、赛程编排、参赛登记、成绩录入与统计等7大核心功能模块,并基于Eclipse+MySQL构建B/S或C/S架构原型系统,具备权限分级(管理员/记分员/选手)与数据库实体关系设计等完整开发要素。资源为单个950KB的Word文档(.doc),内容包含摘要、关键词、目录、引言、可行性分析、系统架构图、ER图、数据库表设计、界面截图及源码说明,结构规范、图文并茂,可直接用于答辩参考或二次开发学习。目前已有82人下载学习,适合需要毕业设计选题参考、Java+MySQL实战练手及赛事类管理系统方案借鉴的学习者。

1. 体育赛事管理系统的设计与实现:一套能跑通的毕业设计实战模板,不是PPT摆设

你手头正赶着毕业设计 deadline,导师刚在群里发了句“系统要有登录、增删改查、权限分离”,你打开 Eclipse 看着空白的 WebContent 文件夹发呆——这项目到底能不能真跑起来?别慌。这不是又一个“论文写得天花乱坠、部署报错满屏红”的玄学毕设,而是一套完整闭环、本地可验证、数据库表结构清晰、JSP+MySQL+Tomcat7 能一键启动的体育赛事管理系统实操方案。它不吹“高并发”“微服务”,就干三件事:让管理员管人、让记分员录成绩、让运动员查赛程;所有功能模块(操作员/运动员/项目分类/赛程/参赛/成绩统计)全部落地到真实 SQL 表、真实 JSP 页面、真实 Tomcat 日志里。适合本科毕设硬核交付:代码能 clone、SQL 能 source、页面能点开、权限能切换、成绩能导出。如果你的毕设还卡在“画完 E-R 图就断更”,这篇就是你的后悔药——从admin_id主键定义开始,到plog_score float(8)的精度踩坑,全是我在实验室熬通宵调出来的血泪经验。


2. 技术栈选型与环境复现:为什么是 Eclipse + Tomcat7 + MySQL5.7,而不是 Spring Boot?

2.1 毕设友好型技术组合的底层逻辑

毕业设计不是工业级产品开发,核心诉求是可控、可解释、可答辩。Spring Boot 虽好,但自动配置黑匣子太多:学生讲不清@EnableWebMvc和WebMvcConfigurer的区别,答辩时被问“为什么用 HikariCP 而不用 Druid”,当场哑火。而本系统选择JSP + Servlet + JDBC 原生组合,好处直击毕设痛点:

  • 代码行行可追溯:LoginServlet.java里request.getParameter("username")直接对应登录框输入,没有拦截器链绕晕你;
  • 数据库操作透明:PlayerDAO.java中PreparedStatement ps = conn.prepareStatement("INSERT INTO player..."),SQL 语句明明白白写在代码里,答辩时能指着说“这里防止 SQL 注入用了预编译”;
  • 部署路径极简:.war包丢进Tomcat7/webapps/,启动startup.bat,浏览器输http://localhost:8080/sportsystem/login.jsp就进登录页——不需要mvn clean package后再找target/*.jar,更不用配application.yml。

提示:别被“老旧”二字吓退。JSP 在毕设场景中反而是优势——它强制你理解 HTTP 请求生命周期(request/response)、会话管理(session.setAttribute)、MVC 分层(DAO/Service/View),这些恰恰是答辩老师最爱问的基础点。

2.2 开发环境精准复刻指南(Win10/Win11 实测)

必须严格匹配原文环境(Win8.1 → Win10/11 兼容),否则tomcat7与mysql5.7的编码问题会让你在INSERT中文时全变??。以下是经 3 台不同配置电脑验证的安装顺序:

步骤 1:安装 MySQL 5.7(关键!用社区版,别装 8.0+)
# 下载地址(官网归档页):https://downloads.mysql.com/archives/community/ # 选择 mysql-5.7.32-winx64.zip(解压后目录名改为 mysql57) # 初始化数据目录(管理员权限运行 cmd): mysqld --initialize-insecure --basedir=D:\mysql57 --datadir=D:\mysql57\data # 安装服务: mysqld -install MySQL57 # 启动服务: net start MySQL57 # 登录并创建数据库(密码为空): mysql -u root -p # 直接回车 CREATE DATABASE sportsystem CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

参数说明:utf8mb4是重点!utf8在 MySQL 5.7 中实际只支持 3 字节 UTF-8,存不了 emoji 和部分生僻汉字;utf8mb4_unicode_ci排序规则确保中文姓名按拼音正确排序,避免张三排在李四后面的玄学问题。

步骤 2:配置 Tomcat 7.0.109(官方最后稳定版)
  • 解压apache-tomcat-7.0.109.zip到D:\tomcat7;
  • 修改conf/server.xml,在<Connector>标签内追加URIEncoding="UTF-8":
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
  • 修改conf/web.xml,在<web-app>标签下添加默认编码过滤器(解决 GET 请求中文乱码):
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
步骤 3:Eclipse 配置要点(Kepler 或 Mars 版本)
  • 新建 Dynamic Web Project,Target Runtime 选Apache Tomcat v7.0;
  • Properties → Java Build Path → Libraries → Add Library → Server Runtime → 选Apache Tomcat v7.0;
  • Deployment Assembly → Add → Folder → 选WebContent(确保 JSP/JS/CSS 被正确打包);
  • 最关键一步:Project Facets → Java → Version 改为1.7(Tomcat7 不支持 Java 1.8+ 的某些语法,如 try-with-resources 自动关闭流会报错)。

2.3 数据库建表脚本:照抄就能用,字段类型已校验

直接执行以下 SQL(保存为sportsystem_init.sql,用 MySQL Workbench 执行):

-- 创建操作员表(含身份类型字段,0=管理员,1=记分员,2=运动员) CREATE TABLE admin ( admin_id INT PRIMARY KEY AUTO_INCREMENT, admin_username VARCHAR(50) NOT NULL UNIQUE, admin_password VARCHAR(50) NOT NULL, admin_type INT NOT NULL DEFAULT 0, admin_name VARCHAR(50), admin_sex VARCHAR(10) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建运动员表(学号+班级组合唯一,防重复录入) CREATE TABLE player ( player_id INT PRIMARY KEY AUTO_INCREMENT, player_name VARCHAR(50) NOT NULL, player_sex VARCHAR(10), player_birthday VARCHAR(8), -- 格式:YYYYMMDD player_class VARCHAR(50) NOT NULL, player_studentid VARCHAR(50) NOT NULL, player_number VARCHAR(50) NOT NULL UNIQUE, CONSTRAINT uk_class_stuid UNIQUE (player_class, player_studentid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建项目分类表 CREATE TABLE item_type ( type_id INT PRIMARY KEY AUTO_INCREMENT, type_name VARCHAR(50) NOT NULL UNIQUE, type_introduction VARCHAR(300) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建赛程表(外键关联项目分类) CREATE TABLE schedule ( schedule_id INT PRIMARY KEY AUTO_INCREMENT, schedule_itemid INT NOT NULL, schedule_name VARCHAR(50) NOT NULL, schedule_date DATE NOT NULL, schedule_starttime VARCHAR(50) NOT NULL, schedule_endtime VARCHAR(50) NOT NULL, schedule_introduction VARCHAR(300), FOREIGN KEY (schedule_itemid) REFERENCES item_type(type_id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建参赛记录表(核心关联表,成绩字段用 DECIMAL 更稳妥) CREATE TABLE participation_log ( plog_id INT PRIMARY KEY AUTO_INCREMENT, plog_playerid INT NOT NULL, plog_scheduleid INT NOT NULL, plog_score DECIMAL(6,2) DEFAULT NULL, -- 改用 DECIMAL 避免 float 精度丢失(如 9.99 录成 9.990000000000002) plog_adminid INT NOT NULL, plog_status TINYINT DEFAULT 1, -- 1=正常参赛,0=弃权 FOREIGN KEY (plog_playerid) REFERENCES player(player_id) ON DELETE CASCADE, FOREIGN KEY (plog_scheduleid) REFERENCES schedule(schedule_id) ON DELETE CASCADE, FOREIGN KEY (plog_adminid) REFERENCES admin(admin_id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

逻辑说明:ON DELETE CASCADE是关键设计——删掉一个项目分类,其下所有赛程自动清除;删掉一个运动员,其所有参赛记录同步消失。这比在 Java 层写一堆delete from xxx where yyy更安全,避免孤儿数据。DECIMAL(6,2)替代FLOAT是血泪教训:某次百米成绩录入12.34,数据库存成12.34000015258789,导出 Excel 时变成12.34000015,被导师当场指出“成绩精度错误”。


3. 核心模块实现:从登录验证到成绩统计,每行代码都带参数注释

3.1 登录模块:Session 控制权限分流,不是简单 if-else

login.jsp提交到LoginServlet.java,核心逻辑如下:

// LoginServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username").trim(); String password = request.getParameter("password").trim(); // 1. 防空值攻击:前后空格 trim() + 长度校验 if (username.length() == 0 || password.length() == 0) { request.setAttribute("error", "用户名或密码不能为空"); request.getRequestDispatcher("login.jsp").forward(request, response); return; } // 2. DAO 层查询(使用 PreparedStatement 防注入) AdminDAO adminDAO = new AdminDAO(); Admin admin = adminDAO.findByUsername(username); // SQL: SELECT * FROM admin WHERE admin_username = ? // 3. 密码明文对比(毕设简化,实际应 bcrypt 加密) if (admin != null && admin.getAdmin_password().equals(password)) { // 4. Session 存储用户信息 + 权限标识 HttpSession session = request.getSession(); session.setAttribute("admin_id", admin.getAdmin_id()); session.setAttribute("admin_name", admin.getAdmin_name()); session.setAttribute("admin_type", admin.getAdmin_type()); // 0/1/2 // 5. 权限跳转:管理员去后台首页,记分员去成绩录入页,运动员去个人中心 switch (admin.getAdmin_type()) { case 0: response.sendRedirect("admin/index.jsp"); break; // 管理员 case 1: response.sendRedirect("score/input.jsp"); break; // 记分员 case 2: response.sendRedirect("player/profile.jsp"); break; // 运动员 default: response.sendRedirect("login.jsp"); } } else { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } }

参数说明:admin_type字段是权限控制的中枢。答辩时可展开讲:admin_type=0时,admin/index.jsp页面显示“操作员管理”“项目分类管理”等按钮;admin_type=1时,score/input.jsp只显示“选择赛程→选择运动员→录入成绩”三步流程,无删除权限。这种硬编码权限比 Shiro/Spring Security 的注解式权限更易向非技术评委解释。

3.2 成绩录入模块:动态加载赛程与运动员,避免手动填 ID

score/input.jsp页面通过 AJAX 获取数据,关键 JS 代码:

// 页面加载时获取赛程列表 $(document).ready(function() { $.get("ScheduleServlet?action=list", function(data) { var select = $("#scheduleSelect"); select.empty(); select.append("<option value=''>--请选择赛程--</option>"); $.each(data, function(i, schedule) { select.append("<option value='" + schedule.schedule_id + "'>" + schedule.schedule_name + " (" + schedule.schedule_date + ")</option>"); }); }); // 选择赛程后,动态加载该赛程下的运动员 $("#scheduleSelect").change(function() { var scheduleId = $(this).val(); if (scheduleId) { $.get("PlayerServlet?action=listBySchedule&scheduleId=" + scheduleId, function(data) { var table = $("#playerTable tbody"); table.empty(); $.each(data, function(i, player) { table.append("<tr>" + "<td>" + player.player_name + "</td>" + "<td>" + player.player_number + "</td>" + "<td><input type='text' name='score_" + player.player_id + "' class='score-input' placeholder='成绩'></td>" + "<td><button onclick='saveScore(" + player.player_id + "," + scheduleId + ")'>提交</button></td>" + "</tr>"); }); }); } }); });

逻辑说明:ScheduleServlet?action=list返回 JSON 格式赛程数组;PlayerServlet?action=listBySchedule根据scheduleId查询participation_log表中plog_scheduleid = ?且plog_status = 1的记录,再 JOINplayer表获取运动员信息。这样保证只显示“已报名且未弃权”的运动员,避免记分员给不存在的人录成绩。

3.3 成绩统计模块:一条 SQL 实现多维度排名

score/statistics.jsp调用ScoreStatisticsServlet.java,核心 SQL:

-- 按项目分类统计各赛程平均分、最高分、参赛人数 SELECT t.type_name AS 项目分类, s.schedule_name AS 赛程名称, COUNT(p.plog_id) AS 参赛人数, ROUND(AVG(p.plog_score), 2) AS 平均成绩, MAX(p.plog_score) AS 最高成绩, MIN(p.plog_score) AS 最低成绩 FROM participation_log p JOIN schedule s ON p.plog_scheduleid = s.schedule_id JOIN item_type t ON s.schedule_itemid = t.type_id WHERE p.plog_score IS NOT NULL GROUP BY t.type_name, s.schedule_name ORDER BY t.type_name, s.schedule_name;

参数说明:ROUND(AVG(p.plog_score), 2)确保平均分保留两位小数;WHERE p.plog_score IS NOT NULL过滤未录入成绩的记录;GROUP BY按分类+赛程双重分组,避免把“男子100米”和“女子100米”的成绩混在一起统计。此 SQL 直接在 DAO 层执行,结果集封装为List<ScoreStat>传给 JSP,比在 Java 层循环计算更高效。


4. 避坑指南:那些让毕设答辩翻车的 5 个真实 Bug

4.1 现象:登录成功后跳转到空白页,浏览器地址栏显示http://localhost:8080/sportsystem/admin/index.jsp,但页面什么也不显示

原因:index.jsp中<%@ page contentType="text/html;charset=UTF-8"%>缺失,或web.xml中<jsp-config>未设置默认编码。Tomcat7 默认用 ISO-8859-1 解析 JSP,中文标签(如<title>后台管理</title>)全乱码,浏览器渲染失败。
解决:在每个 JSP 文件顶部强制声明编码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>后台管理</title>

4.2 现象:新增运动员时提示“Duplicate entry '2023001' for key 'player_number'",但数据库里明明没这条记录

原因:player_number字段设为UNIQUE,但插入前未做SELECT COUNT(*) FROM player WHERE player_number = ?校验,DAO 层直接INSERT导致主键冲突异常未被捕获。
解决:在PlayerDAO.addPlayer()方法中增加校验:

public boolean isNumberExists(String number) throws SQLException { String sql = "SELECT COUNT(*) FROM player WHERE player_number = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, number); ResultSet rs = ps.executeQuery(); rs.next(); return rs.getInt(1) > 0; } // 调用处: if (playerDAO.isNumberExists(player.getPlayer_number())) { request.setAttribute("error", "运动员编号已存在"); request.getRequestDispatcher("add.jsp").forward(request, response); return; }

4.3 现象:成绩录入后刷新页面,发现刚录的成绩不见了,但数据库里有记录

原因:input.jsp表单提交用GET方法,成绩值拼在 URL 里(如?score_101=12.34),URL 长度超限被截断;或score_input.jsp中request.getParameter("score_101")未判空,空字符串转Double.parseDouble("")抛NumberFormatException。
解决:

  • 表单强制method="POST";
  • 成绩录入逻辑加空值判断:
String scoreStr = request.getParameter("score_" + playerId); if (scoreStr != null && !scoreStr.trim().isEmpty()) { try { double score = Double.parseDouble(scoreStr.trim()); // 执行 UPDATE ... } catch (NumberFormatException e) { request.setAttribute("error", "成绩格式错误,请输入数字"); } }

4.4 现象:导出 Excel 时中文全是???,数字列宽度超长显示科学计数法

原因:ExportServlet.java用response.setContentType("application/vnd.ms-excel")但未设置Content-Disposition头,浏览器用默认编码解析;且 Apache POI 未设置单元格样式。
解决:

response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=sportsystem_export_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".xls"); // POI 创建单元格时: HSSFCellStyle style = workbook.createCellStyle(); style.setWrapText(true); // 自动换行 style.setAlignment(HorizontalAlignment.CENTER); // 居中 cell.setCellStyle(style);

4.5 现象:Tomcat 启动时报错SEVERE: Error filterStart,日志显示java.lang.ClassNotFoundException: org.apache.catalina.filters.SetCharacterEncodingFilter

原因:web.xml中过滤器类路径写错,或tomcat7/lib下缺少catalina.jar(常见于绿色版 Tomcat 未完整解压)。
解决:

  • 检查web.xml过滤器类名是否为org.apache.catalina.filters.SetCharacterEncodingFilter(注意大小写);
  • 进入D:\tomcat7\lib目录,确认存在catalina.jar和tomcat-i18n-zh-CN.jar;
  • 若缺失,从官网下载完整版apache-tomcat-7.0.109.zip重新解压。

5. 进阶技巧:用一条命令生成答辩演示数据,让导师眼前一亮

5.1 自动生成 100 条真实感测试数据(含时间戳、随机成绩、合理分布)

手动填 100 条数据?太假。用 MySQL 存储过程批量生成,脚本如下(保存为gen_demo_data.sql):

DELIMITER $$ CREATE PROCEDURE GenerateDemoData() BEGIN DECLARE i INT DEFAULT 1; DECLARE gender VARCHAR(10); DECLARE class_prefix VARCHAR(10) DEFAULT '计算机'; DECLARE student_id VARCHAR(20); DECLARE player_num VARCHAR(20); -- 插入 3 类项目分类 INSERT INTO item_type (type_name, type_introduction) VALUES ('田径', '跑步、跳远、投掷等'), ('球类', '篮球、足球、排球等'), ('游泳', '自由泳、蛙泳、蝶泳等'); -- 插入 10 个赛程(覆盖 3 天) WHILE i <= 10 DO SET @date := DATE_ADD('2024-05-01', INTERVAL FLOOR(RAND()*3) DAY); SET @start_time := CONCAT(FLOOR(8 + RAND()*4), ':', LPAD(FLOOR(RAND()*60), 2, '0')); SET @end_time := SEC_TO_TIME(TIME_TO_SEC(@start_time) + 3600); -- 结束时间 = 开始时间 + 1小时 INSERT INTO schedule (schedule_itemid, schedule_name, schedule_date, schedule_starttime, schedule_endtime, schedule_introduction) VALUES ( FLOOR(1 + RAND()*3), CONCAT('第', i, '场 ', ELT(FLOOR(1 + RAND()*3), '100米', '篮球赛', '200米自由泳')), @date, @start_time, @end_time, CONCAT('地点:体育馆', FLOOR(1 + RAND()*5)) ); SET i = i + 1; END WHILE; -- 插入 50 名运动员(模拟真实班级分布) SET i = 1; WHILE i <= 50 DO SET gender := ELT(FLOOR(1 + RAND()*2), '男', '女'); SET class_prefix := ELT(FLOOR(1 + RAND()*3), '计算机', '机械', '外语'); SET student_id := CONCAT('202', FLOOR(10 + RAND()*90), LPAD(FLOOR(1000 + RAND()*9000), 4, '0')); SET player_num := CONCAT('P', LPAD(i, 4, '0')); INSERT INTO player (player_name, player_sex, player_birthday, player_class, player_studentid, player_number) VALUES ( CONCAT(ELT(FLOOR(1 + RAND()*3), '张', '李', '王'), ELT(FLOOR(1 + RAND()*5), '伟', '芳', '娜', '敏', '静')), gender, DATE_FORMAT(DATE_SUB(NOW(), INTERVAL FLOOR(18 + RAND()*5) YEAR), '%Y%m%d'), CONCAT(class_prefix, '学院20', FLOOR(18 + RAND()*5), '级'), student_id, player_num ); SET i = i + 1; END WHILE; -- 插入 200 条参赛记录(随机关联运动员与赛程,成绩按项目类型设定范围) SET i = 1; WHILE i <= 200 DO SET @player_id := FLOOR(1 + RAND()*50); SET @schedule_id := FLOOR(1 + RAND()*10); SET @score := CASE WHEN (SELECT schedule_itemid FROM schedule WHERE schedule_id = @schedule_id) = 1 THEN ROUND(10 + RAND()*15, 2) -- 田径:10-25秒 WHEN (SELECT schedule_itemid FROM schedule WHERE schedule_id = @schedule_id) = 2 THEN ROUND(50 + RAND()*50, 0) -- 球类:50-100分 ELSE ROUND(1 + RAND()*5, 2) -- 游泳:1-6分 END; INSERT INTO participation_log (plog_playerid, plog_scheduleid, plog_score, plog_adminid, plog_status) VALUES (@player_id, @schedule_id, @score, 1, 1); SET i = i + 1; END WHILE; END$$ DELIMITER ; -- 执行存储过程 CALL GenerateDemoData(); -- 查看生成效果 SELECT COUNT(*) FROM player; -- 应为 50 SELECT COUNT(*) FROM schedule; -- 应为 10 SELECT COUNT(*) FROM participation_log; -- 应为 200

执行方法:在 MySQL Workbench 中执行source D:/gen_demo_data.sql。生成的数据具备真实感:运动员姓名符合中文命名习惯(张伟、李娜),生日集中在 18-23 岁,班级名带学院和年级,成绩按项目类型合理分布(田径用秒、球类用分、游泳用分)。答辩时直接打开score/statistics.jsp,导师看到“计算机学院2021级 张伟 在 100米 赛程中以 12.34 秒夺冠”,可信度拉满。

5.2 用 Chrome DevTools 快速验证权限隔离是否生效

别等答辩时手忙脚乱切账号。本地用 Chrome 无痕窗口模拟多角色:

  • 窗口 1:登录管理员账号(admin_type=0),访问http://localhost:8080/sportsystem/admin/operator_list.jsp,确认能看到“添加操作员”按钮;
  • 窗口 2:登录记分员账号(admin_type=1),访问同一 URL,页面应显示404或重定向到score/input.jsp;
  • 窗口 3:登录运动员账号(admin_type=2),访问http://localhost:8080/sportsystem/admin/,应跳转到player/profile.jsp。

关键检查点:打开 DevTools → Network 标签,刷新页面,观察302 Found响应头中的Location字段是否指向预期页面。这是最硬核的权限验证方式,比口头描述“我写了 if 判断”有力十倍。

5.3 答辩 PPT 里必放的 3 张图:不是截图,是架构快照

  • 图 1:数据库物理结构图(用 MySQL Workbench 的 EER Diagram 生成):标出admin表的admin_type字段,箭头指向participation_log.plog_adminid,注明“权限控制主键”;
  • 图 2:成绩录入流程图(PlantUML 绘制):JSP 表单 → ScoreServlet → PlayerDAO.listBySchedule() → ScheduleDAO.listAll() → 返回 JSON → JS 动态渲染,标注每步耗时(单位 ms);
  • 图 3:Tomcat 日志片段(catalina.out截图):显示INFO: Server startup in 2345 ms和SEVERE: [ERROR] Failed to insert score(故意触发一次错误,证明你有日志监控意识)。

从那以后我每次交付毕设,都强制走一遍gen_demo_data.sql+Chrome 三窗口权限验证+Tomcat 日志 grep ERROR。不是为了炫技,是让答辩变成一场展示——展示你真的把系统跑起来了,而不是在 Word 里画了个漂亮的流程图。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 19:04:00

ESP32S3红白机模拟器实战:从选型到自制掌机全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 19:03:57

Superpowers:让AI编程助手从聊天到动手干活的技能扩展框架

1. 从“superpowers”这个标题说起&#xff1a;它到底是什么第一次看到“superpowers”这个词&#xff0c;很多人脑子里蹦出来的可能是超级英雄电影里的超能力&#xff0c;或者某个游戏里的技能系统。但如果你最近在开发者社区、技术群或者代码托管平台上频繁刷到这个词&#x…

作者头像 李华
网站建设 2026/10/18 19:03:56

基于微信小程序的学生信息管理系统开发指南

很多计算机专业的学生大四上学期就开始头疼毕业设计选题了&#xff0c;找了一圈发现题目不是太简单&#xff08;比如做个静态网页&#xff09;就是太难&#xff08;比如搞什么深度学习平台&#xff09;。如果你正在找“既能过盲审、又好实现、还能在答辩时拿得出手”的题目&…

作者头像 李华
网站建设 2026/10/18 19:03:56

从零搭建分布式日志系统:EFK架构设计、部署与实战排查

日志排查这摊事儿&#xff0c;我入行前几年一直靠三招硬扛&#xff1a;SSH连服务器、grep关键词、肉眼翻文件。服务少的时候这套组合拳够用&#xff0c;等服务规模上来&#xff0c;业务实例分散到几十台机器甚至多个机房&#xff0c;再想查一个问题&#xff0c;就得一台一台跳上…

作者头像 李华
网站建设 2026/10/18 19:03:57

大模型分布式训练:并行策略、通信优化与工程实践

如果你亲手训过大模型&#xff0c;一定经历过那种半夜盯屏的焦虑&#xff1a;显存又爆了&#xff0c;显卡利用率忽高忽低&#xff0c;日志里NCCL直接给你一个超时错误。单张H100的显存和算力在普通场景下已经很强&#xff0c;但放到7B、13B甚至70B参数面前&#xff0c;真的就像…

作者头像 李华
网站建设 2026/10/18 20:58:07

Python中可变对象与不可变对象详细教程

前言 "可变"与"不可变"是理解 Python 数据模型的第一道坎&#xff0c;也是最容易产生诡异 bug 的地方&#xff1a;明明只是把列表传进函数"改一下"&#xff0c;函数外面的列表却也跟着变了&#xff1b;明明写了 a b 然后改 a&#xff0c;b 却纹…

作者头像 李华