毕业设计实战:基于Java+MySQL的实习管理系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

38 阅读18分钟

毕业设计实战:基于Java+MySQL的实习管理系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

谁懂啊!当初做实习管理系统毕设时,光学生表和实习表的关联就卡了4天——一开始没设外键,查某学生的所有实习记录时数据全混在一起,导师看了直接让我“重新梳理数据库关系”😫 后来踩遍无数坑才摸出一套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全说透,宝子们不用再熬夜改代码,轻松搞定毕设!

一、先搞懂“实习管理系统要啥”!需求分析别瞎蒙

刚开始我跳过需求分析就写代码,花三周加了个“实习社交互动功能”,结果导师一句“核心是实习流程管理与数据统计,不是社交”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。

1. 核心用户&功能拆解(踩坑后总结版)

实习管理系统就三类核心用户:管理员老师学生(别加“企业角色”!我当初加了后,权限逻辑混乱,企业端能修改学生成绩,最后砍掉才顺畅):

  • 管理员端(必做功能):
    • 用户管理:维护老师/学生账号(新增、重置密码、禁用账号),支持按姓名/学号/手机号模糊查询(我当初没加,查学生要翻几十页)
    • 实习管理:审核学生提交的实习信息、查看所有实习记录、导出实习统计报表(用下拉框选“月度/学期”筛选,效率翻倍)
    • 公告管理:发布实习通知、修改公告内容、管理公告类型(如“实习安排”“成绩通知”),支持上传公告图片
    • 基础数据管理:维护字典表(如单位性质、院系、班级)、设置系统基础参数(如实习审核周期)
  • 老师端(核心功能):
    • 实习指导:查看负责学生的实习信息、审核实习周报、填写实习评语与成绩
    • 数据统计:按班级统计实习完成率、查看学生成绩分布(柱状图直观展示)
    • 留言管理:回复学生的实习分享留言、处理学生咨询
  • 学生端(核心功能):
    • 实习操作:提交实习信息(填单位名称、岗位、时间等)、上传实习周报、查看审核结果
    • 分享互动:发布实习分享(带照片)、收藏有用的分享内容、给其他同学留言
    • 个人中心:修改个人信息(头像、联系方式)、查看实习成绩、浏览系统公告

2. 需求分析避坑指南(血泪教训!)

  • 别光靠“空想”!找2个同学分别模拟老师和学生提意见:比如有学生说“想实时知道实习审核进度”,我才加了“审核状态标色”(待审核黄色/已通过绿色/已驳回红色),比瞎加“社交功能”实用多了
  • 一定要画用例图!用DrawIO画简单版,标清“管理员-审核实习”“老师-填写成绩”“学生-提交周报”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听25分钟还没get到逻辑)
  • 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“实习时间不能跨学期”“成绩分数范围0-100”),编码时对着做,不会跑偏

3. 可行性分析别敷衍!5点写清楚就能过

导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从5个角度写,显得专业:

  • 技术可行性:Java、MySQL、B/S模式都是课堂学过的,图书馆有《Java Web开发实战》《MySQL数据库设计》,遇到问题能查资料(别选Vue!我当初想试,前后端联调卡了一周,换回JSP才顺利)
  • 经济可行性:所有工具全免费!IDEA(社区版)、MySQL、Tomcat官网直接下,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你懂成本控制
  • 操作可行性:界面参考主流教务系统,按钮布局简洁,我找同学测试,5分钟就学会提交实习信息,导师直接认可
  • 时间可行性:预留2个半月开发,从需求分析到测试,每天投入3小时,能完成核心功能(我当初合理规划,提前10天完成)
  • 法律可行性:开发用的资料来自图书馆和开源社区,无侵权风险;代码独立编写,无抄袭,符合毕业设计要求

二、技术选型别跟风!这套组合稳到爆

刚开始我跟风用Java+Vue+Redis,结果“实习数据缓存”卡了6天——Redis的持久化配置没设对,重启后学生实习记录全丢😫 后来换成Java+MySQL+JSP+Tomcat9+B/S模式,新手友好度拉满,调试效率翻两倍!

1. 技术栈详细对比(附避坑提醒)

宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了5个核心工具的选择理由和坑点,直接抄:

技术工具为啥选它避坑提醒!(重点!)
Java语言面向对象、跨平台,适合管理系统开发,学习资料多别用最新版JDK!JDK 1.8就行,高版本兼容性差,会报“类加载错误”
MySQL 8.0占内存小,存用户、实习、成绩数据足够用安装时设“utf8mb4”编码!我当初用默认编码,学生姓名含生僻字乱码,查3小时才解决
Tomcat 9.0稳定!和Java、JSP适配最好,支持热部署别用Tomcat 10!会出现“Servlet API包名变更”,答辩时系统崩了就完了
JSP上手简单,不用单独学前端框架,适合后端新手别用EL表达式老版本!用JSTL 1.2,避免“表达式无法解析”报错
IDEA 2022对Java Web支持好,自带代码提示,调试方便别更到2023+版本!高版本对老电脑兼容性差,经常卡顿闪退

2. 开发环境搭建(step by step 实操)

很多宝子卡在“环境配置”,跟着步骤来超简单,我当初一次成功:

  1. 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”环境变量别写错,不然IDEA认不到JDK
  2. 装IDEA(社区版):选“Community Edition”,免费够用,首次打开勾选“Java EE”“Maven”插件,自动安装
  3. 装MySQL 8.0:用Navicat管理(可视化工具超方便,新建表直接选字段类型,比命令行快10倍),新建数据库“internship_system”,编码设“utf8mb4”
  4. 配Tomcat 9.0:在IDEA中添加服务器,选“Apache Tomcat v9.0”,关联安装路径,启动后看到“Server startup in XX ms”就是成功
  5. 导入依赖:在pom.xml中添加Java Web、MySQL驱动、JSTL依赖,注意版本匹配(附依赖代码片段)

3. 架构图一定要画!答辩加分项

用DrawIO画B/S三层架构图(像论文里的“系统架构图”),标清“表现层(JSP/Controller)-业务层(Service)-数据访问层(DAO)”:比如学生点“提交实习信息”→JSP页面传请求→Servlet接收→Service校验数据→DAO存MySQL。去年答辩时,评委特意夸这图“逻辑清晰”,比光说“我用了B/S模式”专业多了!

三、数据库设计:别让表关联坑了你

这部分是毕设的“核心骨架”,我当初没关联“学生表”和“实习成绩表”,查“某学生的实习成绩”要写4层嵌套SQL,调试到凌晨2点😫 后来按“实体-属性-关系”设计,终于理清了。

1. 核心实体&属性(附ER图绘制技巧)

先确定“实体”(学生、老师、实习、成绩、周报、分享),再想“属性”,别漏关键字段!我整理了必做的8张表,直接照着画ER图:

  • 学生表(xuesheng):id(主键)、xuesheng_uuid_number(学号,唯一)、xuesheng_name(姓名)、xuesheng_phone(手机号)、yuanxi_types(院系)、banji_types(班级)、xuesheng_photo(头像路径)
  • 老师表(laoshi):id(主键)、laoshi_name(姓名)、laoshi_phone(手机号)、laoshi_id_number(身份证号)、laoshi_email(邮箱)、laoshi_photo(头像路径)
  • 实习表(shixi):id(主键)、xuesheng_id(关联学生,外键)、shixi_uuid_number(实习编号)、shixi_name(单位名称)、shixi_address(单位地址)、shixi_gangwei(实习岗位)、kaishi_time(开始时间)、jieshu_time(结束时间)、shixi_yesno_types(审核状态)
  • 实习成绩表(shixi_chengji):id(主键)、shixi_id(关联实习,外键)、xuesheng_id(关联学生,外键)、shixi_chengji_uuid_number(成绩编号)、fenshu(分数)、shixi_chengji_yesno_text(评语)
  • 实习周报表(shixi_zhoubao):id(主键)、xuesheng_id(关联学生)、shixi_id(关联实习)、shixi_zhoubao_uuid_number(周报编号)、shixi_zhoubao_name(周报标题)、shixi_zhoubao_content(详情)、shixi_zhoubao_types(第几周)

画ER图用Visio或亿图,记住3个规则:

  1. 矩形代表“实体”(比如“学生”“实习”)
  2. 椭圆代表“属性”(比如学生的“姓名”“学号”)
  3. 菱形代表“关系”(比如“学生-参与-实习”是一对多,一个学生能参与多个实习;“实习-关联-成绩”是一对一,一个实习对应一个成绩) 避坑提醒:别把“学生头像、实习分享照片”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/img/xuesheng1.jpg)才对。

2. 数据库物理设计(附建表SQL示例)

ER图画好后,转成实际表,字段类型和约束别瞎设!比如“成绩分数”用DECIMAL(5,1),别用INT,不然无法存小数;“学号”设UNIQUE约束,避免重复注册。

给宝子们贴“实习表”的建表SQL,复制到Navicat就能用:

CREATE TABLE `shixi` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '实习ID',
  `xuesheng_id` INT DEFAULT NULL COMMENT '关联学生ID(外键)',
  `shixi_uuid_number` VARCHAR(50) DEFAULT NULL COMMENT '实习唯一编号',
  `shixi_name` VARCHAR(200) NOT NULL COMMENT '单位名称',
  `shixi_address` VARCHAR(300) DEFAULT NULL COMMENT '单位地址',
  `shixi_types` INT DEFAULT NULL COMMENT '单位性质(1-国营,2-私营)',
  `shixi_gangwei` VARCHAR(100) NOT NULL COMMENT '实习岗位',
  `kaishi_time` DATE DEFAULT NULL COMMENT '实习开始时间',
  `jieshu_time` DATE DEFAULT NULL COMMENT '实习结束时间',
  `shixi_content` TEXT DEFAULT NULL COMMENT '实习详情',
  `shixi_yesno_types` INT DEFAULT 0 COMMENT '审核状态(0-待审核,1-已通过,2-已驳回)',
  `shixi_yesno_text` VARCHAR(500) DEFAULT NULL COMMENT '审核意见',
  `insert_time` DATETIME DEFAULT NULL COMMENT '录入时间',
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `fk_xuesheng_shixi` (`xuesheng_id`), -- 外键关联学生表
  UNIQUE KEY `uk_shixi_uuid` (`shixi_uuid_number`) -- 实习编号唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='实习表';

3. 表关联测试!别等编码才发现错

建完表一定要测关联!比如在“实习成绩表”插数据(学生ID=1,实习ID=1,分数=85.5),用JOIN查询“某学生的实习信息及成绩”:

SELECT u.xuesheng_name, s.shixi_name, s.shixi_gangwei, c.fenshu, c.shixi_chengji_yesno_text
FROM shixi_chengji c
JOIN xuesheng u ON c.xuesheng_id = u.id
JOIN shixi s ON c.shixi_id = s.id
WHERE u.id = 1;

如果能查出“学生姓名+单位名称+实习岗位+分数+评语”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。

四、功能实现:核心模块操作+页面设计

不用做所有功能!先搞定3个核心模块,答辩时足够出彩。每个模块我都附关键操作逻辑和页面设计要点,宝子们直接套就行。

1. 学生端:实习信息提交模块(必做!)

这是学生的核心功能,实现“填单位信息、选时间、提交审核”,重点说“审核状态同步”和“数据校验”——别漏这两步,我当初就是这里踩了大坑!

(1)关键操作逻辑
  1. 提交实习前,先校验“实习时间是否合理”(开始时间不能晚于结束时间,不能早于当前学期);
  2. 填写单位信息时,限制“单位名称非空”“岗位名称长度≤50字”,避免无效数据;
  3. 提交后,自动同步审核状态为“待审核”(标黄色),并给负责老师发送系统通知。
(2)页面设计要点(JSP+Bootstrap)

页面标题:学生-实习信息提交页面
(插入图片位置:此处放“实习信息提交页面截图”,需包含以下元素)

  • 表单元素:
    • 单位名称(输入框,必填,提示“如:XX科技有限公司”)
    • 单位地址(输入框,必填,支持输入联想)
    • 单位性质(下拉框,选“国营/私营/外资”,必填)
    • 实习岗位(输入框,必填,限制50字以内)
    • 实习时间(日期选择器,开始时间+结束时间,必填,校验逻辑:开始≤结束)
    • 实习详情(文本域,选填,提示“描述实习内容、职责”)
  • 按钮:“提交审核”(绿色btn-success)、“保存草稿”(蓝色btn-primary)、“重置”(灰色btn-default)
  • 提示信息:红色显“时间选择错误/单位名称为空”,绿色显“实习信息提交成功,待审核!”
(3)避坑提醒
  • 禁止不合理时间提交!加校验逻辑:
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date start = sdf.parse(shixi.getKaishiTime());
    Date end = sdf.parse(shixi.getJieshuTime());
    Date now = new Date();
    if (start.after(end)) {
        return Result.warn("实习开始时间不能晚于结束时间!");
    }
    if (start.before(getTermStartTime())) { // getTermStartTime()获取当前学期开始时间
        return Result.warn("实习开始时间不能早于当前学期!");
    }
    
  • 同步审核状态!提交后自动设为“待审核”:
    public Result addShixi(Shixi shixi) {
        // 设置默认审核状态:待审核(0)
        shixi.setShixiYesnoTypes(0);
        // 生成唯一实习编号(学号+日期)
        String uuid = shixi.getXueshengId() + "_" + new SimpleDateFormat("yyyyMMdd").format(new Date());
        shixi.setShixiUuidNumber(uuid);
        // 保存数据
        shixiDao.insert(shixi);
        // 发送通知给负责老师(省略通知逻辑)
        return Result.success("实习信息提交成功,待审核!");
    }
    

2. 管理员端:实习审核模块(核心需求!)

管理员用系统的核心是“把控实习流程”,流程别复杂:查待审核列表→看实习详情→批通过/驳回→填审核意见,我当初加“多级审核”,代码量翻倍,其实“单级审核+意见记录”更实用。

(1)关键操作逻辑
  1. 审核前,查看学生提交的完整实习信息(含单位名称、岗位、时间),确保信息真实;
  2. 审核时,选择“通过”或“驳回”,驳回需填理由(不能为空),避免学生不知驳回原因;
  3. 审核后,同步更新实习状态(通过标绿色/驳回标红色),并给学生发送审核结果通知。
(2)页面设计要点(JSP+Bootstrap)

页面标题:管理员-实习审核页面
(插入图片位置:此处放“实习审核页面截图”,需包含以下元素)

  • 筛选条件:审核状态(下拉框“待审核/已通过/已驳回”)、学生姓名(模糊查)、审核时间(日期范围)
  • 实习列表表格:列名“学生姓名、学号、单位名称、岗位、实习时间、审核状态、操作”,待审核标黄色、已通过标绿色、已驳回标红色
  • 操作按钮:“查看详情”(蓝色btn-info)、“审核”(橙色btn-warning)
  • 审核弹窗:
    • 显示学生实习完整信息(只读,避免修改)
    • 审核结果(单选框“通过”“驳回”,必填)
    • 审核意见(文本域,驳回时必填,提示“请说明驳回原因”)
    • 确认按钮(“提交审核”,绿色)、取消按钮(灰色)
(3)避坑提醒
  • 驳回必须填理由!加校验逻辑:
    if (shixi.getShixiYesnoTypes() == 2) { // 2代表驳回
        if (StringUtils.isEmpty(shixi.getShixiYesnoText())) {
            return Result.error("驳回需填写审核意见,告知学生原因!");
        }
    }
    
  • 记录审核时间!方便后续追溯:
    @Transactional
    public Result auditShixi(Shixi shixi) {
        // 更新审核状态和意见
        shixi.setShixiYesnoText(shixi.getShixiYesnoText());
        shixi.setShixiYesnoTypes(shixi.getShixiYesnoTypes());
        // 记录审核时间
        shixi.setUnpdateTime(new Date());
        shixiDao.updateById(shixi);
        // 发送审核结果给学生(省略通知逻辑)
        return Result.success("实习审核操作成功!");
    }
    

3. 老师端:成绩填写模块(答辩亮点!)

这个功能最能体现“实习管理闭环”,导师超爱问!核心是“关联实习与成绩,记录评语”,别漏“分数范围控制”,不然老师能填超出0-100的分数。

页面设计要点

页面标题:老师-实习成绩填写页面
(插入图片位置:此处放“成绩填写页面截图”,需包含以下元素)

  • 筛选条件:班级(下拉框,选负责班级)、学生姓名(模糊查)、实习状态(已通过)
  • 学生列表:
    • 每项含“学生姓名、学号、实习单位、实习岗位、实习时间、操作”
    • 操作按钮:“填写成绩”(蓝色)
  • 成绩填写弹窗:
    • 学生基本信息(姓名、学号、实习单位,只读)
    • 成绩分数(输入框,必填,正则校验“0-100,最多1位小数”)
    • 实习评语(文本域,选填,提示“评价学生实习表现、优缺点”)
    • 确认按钮(“提交成绩”,绿色)、取消按钮(灰色)
  • 提示信息:红色显“分数超出范围/格式错误”,绿色显“成绩填写成功!” 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、测试别敷衍!这3步让答辩不翻车

很多宝子觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“驳回实习时不填理由”,导致系统允许无理由驳回,导师说“不符合管理逻辑”,当场扣分😫 测试一定要针对性做!

1. 功能测试(必测3个模块)

别全测!重点测“核心功能”,我整理了测试用例表,直接填结果:

(1)实习信息提交测试(表1:实习提交测试用例)
测试场景操作步骤预期结果实际结果测试结论
开始时间晚于结束时间填开始时间2024-09-01→结束时间2024-08-01→提交提示“实习开始时间不能晚于结束时间!”
单位名称为空单位名称不填→选单位性质→填岗位→提交提示“请输入单位名称!”
正常提交填完整信息→开始≤结束→提交提示“实习信息提交成功,待审核!”,状态为待审核
(2)实习审核测试(表2:审核测试用例)
测试场景操作步骤预期结果实际结果测试结论
驳回不填理由选待审核实习→选“驳回”→不填意见→提交提示“驳回需填写审核意见,告知学生原因!”
正常审核通过选待审核实习→看详情→选“通过”→提交提示“实习审核操作成功!”,状态变为已通过
审核后查状态审核通过后→筛选“已通过”→查该实习列表中该实习状态标绿色,显示审核时间
(3)成绩填写测试(表3:成绩测试用例)
测试场景操作步骤预期结果实际结果测试结论
分数超出100填分数105→写评语→提交提示“成绩分数范围0-100,请重新输入!”
分数为负数填分数-5→写评语→提交提示“成绩分数不能为负,请重新输入!”
正常填写填分数88.5→写评语→提交提示“成绩填写成功!”,学生端能查看分数

2. 兼容性测试(容易忽略的点)

别只在自己电脑测!答辩时评委可能用不同浏览器,我当初没测IE,结果成绩填写页面的日期选择器显示错乱,赶紧加兼容性CSS才好:

  • 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
  • 分辨率测试:1920×1080、1366×768(别让页面出现横向滚动条,用Bootstrap的响应式布局)

3. 测试报告要写好!答辩加分

把测试结果整理成“测试报告”,含“目的、范围、用例、结果、问题总结”,导师会觉得你“做事严谨”。比如:

  • 问题总结:“IE浏览器下日期选择器错乱,通过引入html5shiv.js修复;未登录用户能访问审核页面,加Session拦截器控制”
  • 测试结论:“核心功能(实习提交、审核、成绩填写)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”

六、答辩准备:3个加分小技巧

毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给“良好”:

  1. 演示流程要顺畅:提前录演示视频(怕现场系统崩),按“学生提交实习→管理员审核通过→老师填写成绩→学生查看成绩”的流程来,别跳步
  2. 重点讲“你解决了啥问题”:比如“一开始实习编号重复,改成‘学号+日期’生成唯一编号;驳回无理由,加校验强制填意见”,比光说“我用了Java”有亮点
  3. 准备常见问题:导师大概率问“为啥选B/S不选C/S”“数据多了怎么优化”,提前答:“B/S不用装客户端,学生老师随时访问;数据多就加索引(如实习表的xuesheng_id和shixi_yesno_types联合索引),优化查询速度”

最后:毕设通关的小私心

以上就是基于Java+MySQL的实习管理系统从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能。

需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“实习管理系统”,我私发你;卡在某个模块(比如实习审核、成绩关联),也可以留言,我看到必回!

点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘