毕业设计实战:基于SSM+MySQL的影院订票系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
谁懂啊!当初做影院订票系统毕设时,光“电影订单表”和“电影收藏表”的外键关联就卡了3天——一开始没给收藏表设“电影id”外键,查某部电影的所有收藏记录时数据全串错,导师看了直接让我“重新画数据库E-R图”😫 后来踩遍无数坑才摸出一套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全说透,宝子们不用再熬夜改代码,轻松搞定毕设!
一、先搞懂“影院订票系统要啥”!需求分析别瞎蒙
刚开始我跳过需求分析就写代码,花两周加了个“电影智能推荐算法”,结果导师一句“核心是电影管理、订单处理、公告与论坛互动,不是复杂算法”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
影院订票系统就两类核心用户:管理员和普通用户(别加“售票员子角色”!我当初加了后,权限逻辑混乱,售票员能修改电影定价,最后砍掉才顺畅),功能要明确区分,避免越权操作:
- 管理员端(必做功能):
- 电影管理:维护电影信息(新增名称/类型/座位数、上传海报、设置原价/现价、标记“逻辑删除”)、管理电影互动(查看点赞/踩数、回复评价)、按电影类型/名称筛选(我当初没加,找电影要翻几十页)
- 订单管理:查看订单列表(订单号/实付价格/支付类型)、跟踪订单状态(待支付/已完成/已取消)、按用户/订单时间筛选
- 内容管理:公告管理(发布公告标题/图片/详情、删除无效公告)、公告类型管理(新增类型编码/名称、修改类型信息)、论坛管理(审核帖子、删除违规内容、标记帖子状态)
- 用户与基础管理:用户管理(查看用户信息、重置密码、禁用账号)、字典表维护(配置电影类型、支付类型等基础数据)、轮播图信息配置(上传图片、调整显示顺序)
- 用户端(核心功能):
- 电影操作:浏览电影列表(按类型/点赞数排序)、查看电影详情(海报、座位、原价/现价、简介)、收藏感兴趣电影、评价已看电影(填写评价内容)
- 订票操作:选择电影座位(可视化选座,已售座位标红)、提交订单(选择支付类型)、查看订单记录(订单号、实付价格、座位信息)
- 互动交流:浏览公告(按类型筛选)、发布论坛帖子(分享观影感受)、查看他人帖子、回复管理员反馈
- 个人中心:查看个人信息(收藏记录、评价历史、余额)、修改密码/联系方式、管理个人头像
2. 需求分析避坑指南(血泪教训!)
- 别光靠“空想”!找2个同学分别模拟管理员和用户提意见:比如有用户说“想快速区分已收藏/未收藏的电影”,我才加了“收藏状态标色”(已收藏标黄色实心星/未收藏标灰色空心星),比瞎加“智能推荐”实用多了
- 一定要画用例图!用DrawIO画简单版,标清“管理员-审核论坛帖子”“用户-收藏电影”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听25分钟还没get到逻辑)
- 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“电影名称非空”“海报格式为JPG/PNG”“用户手机号需唯一”“订单实付价格≥0”),编码时对着做,不会跑偏
3. 可行性分析别敷衍!3点写清楚就能过
导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从3个核心角度写,显得专业:
- 技术可行性:SSM框架、MySQL、JSP、Java都是课堂学过的,图书馆有《SSM实战》《MySQL数据库设计与优化》,遇到问题能查资料(别用高版本Java!我当初试Java 11,部分SSM依赖不兼容,换回Java 8才顺利)
- 经济可行性:所有工具全免费!Eclipse(社区版)、MySQL、Tomcat官网直接下,不用花钱买版权,答辩时说“开发成本为0,且系统上线后能帮影院节约人工售票成本”,导师会觉得你懂成本控制
- 操作可行性:界面参考主流购票平台,按钮布局简洁(比如“选座购票”“收藏电影”按钮放电影详情页显眼位置),我找同学测试,10分钟就学会浏览电影、提交订单,导师直接认可
二、技术选型别跟风!这套组合稳到爆
刚开始我跟风用SSM+Vue3+Redis,结果“用户电影收藏缓存”卡了4天——Redis的持久化配置没设对,重启后收藏数据全丢😫 后来换成Java 8+SSM框架(Spring+SpringMVC+MyBatis)+MySQL 8.0+Tomcat 9+Eclipse 2022+JSP,新手友好度拉满,调试效率翻两倍!
1. 技术栈详细对比(附避坑提醒)
宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了6个核心工具的选择理由和坑点,直接抄:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| Java 8 | 语法简洁,支持面向对象编程,学习资料丰富,SSM框架对其兼容性最佳 | 别用Java 11+!部分SSM依赖(如Spring 5.2.x)对高版本Java支持差,会出现“类加载失败”错误 |
| SSM框架 | 分层清晰(控制层+业务层+数据层),MyBatis灵活操作数据库,SpringMVC简化请求处理 | 别手动整合SSM!用Eclipse的SSM模板自动生成,避免applicationContext.xml与spring-mvc.xml配置冲突(我当初手动配,xml文件报错查了3天) |
| MySQL 8.0 | 支持事务和外键,存电影、订单、用户数据足够用,占内存小,支持utf8mb4编码(解决生僻字乱码) | 安装时设“utf8mb4”编码!我当初用默认latin1编码,用户姓名含生僻字(如“䶮”)乱码,查2小时才解决 |
| Tomcat 9 | 轻量级服务器,支持Java Web项目部署,配置简单,与SSM兼容性强 | 别用Tomcat 10!版本过高导致Servlet API包名变化(javax.servlet→jakarta.servlet),项目启动报错“类找不到” |
| Eclipse 2022 | 对Java Web开发支持好,自带SSM插件,调试工具直观,免费开源 | 别更到2023+版本!高版本对老电脑兼容性差,编译项目时经常卡顿,且部分插件(如MyBatis Tools)适配不完善 |
| JSP | 与SSM框架无缝衔接,无需额外学习前端框架,适合新手快速开发页面 | 别混用Vue!我当初想加Vue组件,结果JSP的EL表达式与Vue语法冲突({{}}符号重复),调试1天没解决,纯用JSP才顺畅 |
2. 开发环境搭建(step by step 实操)
很多宝子卡在“环境配置”,跟着步骤来超简单,我当初一次成功:
- 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”环境变量,Path中添加“%JAVA_HOME%\bin”,cmd输入“java -version”显示“1.8.x”即成功
- 装Eclipse 2022(社区版):选“Eclipse IDE for Enterprise Java Developers”,首次打开勾选“Spring Tools”“MyBatis Tools”插件,自动安装
- 装MySQL 8.0:用Navicat管理(可视化工具超方便),新建数据库“yingyuandingpiaoxi统”,编码设“utf8mb4”,排序规则选“utf8mb4_general_ci”
- 装Tomcat 9:解压到本地路径(如D:\Tomcat 9),在Eclipse中配置“Server”,关联JDK 1.8,启动后访问“
- 配SSM项目:在Eclipse中新建“Dynamic Web Project”,导入SSM框架依赖(spring-context.jar、mybatis.jar等),配置applicationContext.xml(数据库连接:url=jdbc:mysql://localhost:3306/yingyuandingpiaoxi统?useSSL=false&serverTimezone=UTC,用户名=root,密码=自己设的密码)和spring-mvc.xml(视图解析:前缀=/WEB-INF/jsp/,后缀=.jsp),写“查询电影列表”接口,运行后能在页面显示电影即完成初始化
3. 架构图一定要画!答辩加分项
用DrawIO画SSM+B/S分层架构图,标清“客户端(浏览器)-表示层(JSP页面)-控制层(Controller)-业务层(Service)-数据访问层(Dao/Mapper)-数据库(MySQL)”:比如用户点“收藏电影”→浏览器传请求→Controller接收参数→Service校验电影状态(是否上架、是否删除)→Mapper操作数据库(插入收藏记录)→返回收藏结果→JSP页面更新收藏状态。去年答辩时,评委特意夸这图“逻辑清晰”,比光说“我用了SSM+MySQL”专业多了!
三、数据库设计:别让表关联坑了你
这部分是毕设的“核心骨架”,我当初没关联“电影表”和“电影收藏表”,查“某部电影的收藏记录”要写3层嵌套SQL,调试到凌晨1点😫 后来按“实体-属性-关系”设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定“实体”(管理员、用户、电影、电影收藏、电影订单、公告信息、论坛帖子、字典表),再想“属性”,别漏关键字段!我整理了必做的8张表,直接照着画ER图:
- 用户表(yonghu):id(主键)、yonghu_name(用户姓名)、yonghu_phone(手机号)、yonghu_id_number(身份证号)、yonghu_photo(头像路径)、new_money(余额)、yonghu_delete(逻辑删除:0=未删,1=已删)、create_time(注册时间)
- 电影表(dianying):id(主键)、dianying_name(电影名称)、dianying_photo(电影海报路径)、dianying_types(电影类型)、zuowei_number(电影座位数)、dianying_old_money(原价)、dianying_new_money(现价)、zan_number(点赞数)、cai_number(踩数)、shangxia_types(是否上架:0=下架,1=上架)
- 电影收藏表(dianying_collection):id(主键)、dianying_id(关联电影)、yonghu_id(关联用户)、dianying_collection_types(收藏类型)、insert_time(收藏时间)
- 电影订单表(dianying_order):id(主键)、dianying_order_uuid_number(订单号)、dianying_id(关联电影)、yonghu_id(关联用户)、buy_zuowei_number(购买的座位)、buy_zuowei_time(购买日期)、dianying_order_true_price(实付价格)
画ER图用Visio或亿图,记住3个规则:
- 矩形代表“实体”(比如“用户”“电影”)
- 椭圆代表“属性”(比如用户的“手机号”“余额”,电影的“名称”“座位数”)
- 菱形代表“关系”(比如“用户-电影收藏”是一对多,一个用户可收藏多部电影;“电影-电影收藏”是一对多,一部电影可被多个用户收藏;“用户-电影订单”是一对多,一个用户可下多个订单) 避坑提醒:别把“电影海报、用户头像”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/dianying/photo1.jpg、/static/yonghu/avatar1.png)才对。
2. 数据库物理设计(附建表SQL示例)
ER图画好后,转成实际表,字段类型和约束别瞎设!比如“电影座位数”用INT,“电影名称”用VARCHAR(200),“手机号”设UNIQUE约束(避免重复注册),“实付价格”用DECIMAL(10,2)(保留两位小数)。
给宝子们贴“电影表”和“电影收藏表”的建表SQL,复制到Navicat就能用:
-- 电影表
CREATE TABLE `dianying` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '电影ID',
`dianying_name` VARCHAR(200) NOT NULL COMMENT '电影名称',
`dianying_photo` VARCHAR(200) DEFAULT NULL COMMENT '电影海报路径',
`dianying_types` INT DEFAULT NULL COMMENT '电影类型(1-动作片,2-喜剧片,3-爱情片)',
`zuowei_number` INT DEFAULT 0 COMMENT '电影座位数',
`dianying_old_money` DECIMAL(10,2) DEFAULT NULL COMMENT '原价',
`dianying_new_money` DECIMAL(10,2) NOT NULL COMMENT '现价',
`zan_number` INT DEFAULT 0 COMMENT '点赞数',
`cai_number` INT DEFAULT 0 COMMENT '踩数',
`shangxia_types` INT DEFAULT 1 COMMENT '是否上架(0-下架,1-上架)',
`dianying_delete` INT DEFAULT 0 COMMENT '逻辑删除(0-未删,1-已删)',
`dianying_content` TEXT DEFAULT NULL COMMENT '电影简介',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='影院电影表';
-- 电影收藏表
CREATE TABLE `dianying_collection` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '收藏ID',
`dianying_id` INT DEFAULT NULL COMMENT '关联电影ID(外键)',
`yonghu_id` INT DEFAULT NULL COMMENT '关联用户ID(外键)',
`dianying_collection_types` INT DEFAULT 1 COMMENT '收藏类型(1-正常收藏)',
`insert_time` DATETIME DEFAULT NULL COMMENT '收藏时间',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `fk_dianying_collection` (`dianying_id`),
KEY `fk_yonghu_collection` (`yonghu_id`),
CONSTRAINT `fk_dianying_collection` FOREIGN KEY (`dianying_id`) REFERENCES `dianying` (`id`),
CONSTRAINT `fk_yonghu_collection` FOREIGN KEY (`yonghu_id`) REFERENCES `yonghu` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='电影收藏表';
3. 表关联测试!别等编码才发现错
建完表一定要测关联!比如在“电影表”插数据(id=1,名称=“流浪地球”,类型=1,海报=/static/dianying/photo1.jpg,座位数=100,现价=39.90),在“用户表”插数据(id=1,姓名=“张三”,手机号=13800138000,余额=200.00),在“电影收藏表”插关联数据(dianying_id=1,yonghu_id=1,收藏时间=2024-05-01 10:00:00),用JOIN查询“某部电影的收藏记录”:
SELECT u.yonghu_name, u.yonghu_phone, c.insert_time, c.dianying_collection_types
FROM dianying_collection c
JOIN yonghu u ON c.yonghu_id = u.id
WHERE c.dianying_id = 1;
如果能查出“用户名+手机号+收藏时间+收藏类型”,说明关联没问题;如果报错“Cannot add or update a child row”,大概率是外键没设对,赶紧检查表结构(比如电影ID是否存在、用户ID是否有效)。
四、功能实现:核心模块操作+页面设计
不用做所有功能!先搞定3个核心模块,答辩时足够出彩。每个模块我都附关键操作逻辑和页面设计要点,宝子们直接套就行。
1. 管理员端:电影管理模块(必做!)
这是管理员的核心功能,实现“电影信息维护+上下架管理”,重点说“电影名称唯一性校验”和“逻辑删除逻辑”——别漏这两步,我当初就是这里踩了大坑!
(1)关键操作逻辑
- 新增电影前,校验“电影名称非空且唯一”“电影类型已在字典表定义”“座位数≥0”“现价≥0”(缺一项提示“请完善电影信息”);
- 上传电影海报时,限制格式为JPG/PNG,大小≤5MB(避免占用过多服务器空间,影响访问速度);
- 删除电影时,采用“逻辑删除”(修改dianying_delete为1),避免删除后关联的订单、收藏数据丢失(物理删除会导致用户查不到已购电影信息)。
(2)页面设计要点(JSP+Bootstrap)
页面标题:管理员-电影管理页面
(插入图片位置:此处放“电影管理页面截图”,需包含以下元素)
- 筛选区:
- 输入框:电影名称(模糊查)
- 下拉框:电影类型(全部/动作片/喜剧片/爱情片)、是否上架(全部/已上架/已下架)、逻辑删除状态(全部/未删/已删)
- 按钮:“查询”(蓝色btn-primary)、“新增电影”(绿色btn-success)
- 电影列表区:
- 表格列名:电影名称、海报、类型、座位数、原价、现价、点赞数、是否上架、创建时间、操作
- 海报显示:缩略图(点击查看大图)
- 操作按钮:“编辑”(橙色btn-warning)、“删除”(红色btn-danger,点击后执行逻辑删除)、“查看详情”(蓝色btn-info)、“上下架切换”(灰色btn-default,上架→下架/下架→上架)
- 新增电影弹窗:
- 表单元素:电影名称(必填)、电影类型(下拉选,必填)、电影海报(上传框,JPG/PNG)、座位数(数字输入框,≥0,必填)、原价(数字输入框,≥0)、现价(数字输入框,≥0,必填)、电影简介(文本域,必填)
- 按钮:“提交”(绿色)、“取消”(灰色)
(3)避坑提醒
- 电影名称唯一性校验与逻辑删除逻辑!加代码(Service层):
// 电影名称唯一性校验 String movieName = dianying.getDianyingName(); LambdaQueryWrapper nameWrapper = new LambdaQueryWrapper<>(); nameWrapper.eq(Dianying::getDianyingName, movieName) .eq(Dianying::getDianyingDelete, 0); // 只校验未删除的电影 if (dianyingService.count(nameWrapper) > 0) { return Result.error("该电影名称已存在,请勿重复添加!"); } // 电影类型校验(需在字典表存在) Integer movieType = dianying.getDianyingTypes(); LambdaQueryWrapper typeWrapper = new LambdaQueryWrapper<>(); typeWrapper.eq(Dictionary::getDicCode, "dianying_type") .eq(Dictionary::getCodeIndex, movieType); if (dictionaryService.count(typeWrapper) == 0) { return Result.error("电影类型无效,请选择正确类型!"); } // 逻辑删除逻辑(不物理删除) public Result deleteMovie(Integer id) { Dianying movie = dianyingService.getById(id); movie.setDianyingDelete(1); // 1表示已删除 dianyingService.updateById(movie); return Result.success("电影已删除!"); }
2. 用户端:电影订票模块(核心需求!)
用户用系统的核心是“选电影-选座位-提交订单”,流程别复杂:浏览电影→查看详情→选择座位→提交订单→完成支付,我当初漏了“座位占用校验”,导致多个用户能选同一座位,补了半天逻辑才好。
(1)关键操作逻辑
- 选座前,校验“电影状态为已上架且未删除”“所选座位未被占用”(不满足提示“无法选择此座位”);
- 提交订单时,生成唯一订单号(格式:DY+日期+随机6位数,如DY20240501123456),计算实付价格(直接取电影现价,无需额外折扣逻辑,新手友好);
- 订单提交后,锁定所选座位(避免并发选座冲突),用户支付完成后更新订单状态为“已完成”。
(2)页面设计要点(JSP+Bootstrap)
页面标题:用户-电影订票页面
(插入图片位置:此处放“电影订票页面截图”,需包含以下元素)
- 电影详情区:
- 显示:电影海报(大图)、名称、类型、座位数(标红提示“余票不足”当剩余座位≤10时)、原价(划横线)、现价(红色加粗)、电影简介(分段显示)
- 按钮:“收藏电影”(空心星/实心星切换)、“立即订票”(红色btn-danger,点击进入选座页)
- 座位选择区:
- 可视化选座:用方格模拟座位,已售座位标红色(不可选)、可选座位标绿色(点击选中)、已选座位标蓝色
- 显示:当前选中座位号(如“5排8座,5排9座”)、总金额(选中座位数×现价)
- 按钮:“确认选座”(绿色,点击进入订单提交页)、“重置选择”(灰色)
- 订单提交区:
- 表单元素:支付类型(下拉选“微信支付/支付宝支付”,必填)、联系人手机号(默认用户手机号,可修改)
- 显示:订单号(自动生成)、所选座位、总金额
- 按钮:“提交订单”(绿色)、“取消”(灰色)
(3)避坑提醒
- 座位占用校验与订单号生成!加代码(Controller层):
@RequestMapping("/submitOrder") @ResponseBody public Result submitOrder(Integer dianyingId, Integer yonghuId, String zuoweiIds, Integer payType) { // 1. 校验电影状态(已上架且未删除) Dianying movie = dianyingService.getById(dianyingId); if (movie == null || movie.getDianyingDelete() == 1 || movie.getShangxiaTypes() == 0) { return Result.error("该电影已下架或已删除,无法订票!"); } // 2. 校验座位是否已占用(模拟查询已售座位,此处简化为列表对比) List soldZuowei = Arrays.asList("5排8座"); // 实际应从订单表查询已售座位 if (soldZuowei.contains(zuoweiIds)) { return Result.error("所选座位已被占用,请重新选择!"); } // 3. 生成唯一订单号 String orderNo = "DY" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + String.format("%06d", new Random().nextInt(1000000)); // 4. 计算实付价格(选中座位数×现价,此处简化为1个座位) BigDecimal truePrice = movie.getDianyingNewMoney().multiply(new BigDecimal(1)); // 5. 保存订单 DianyingOrder order = new DianyingOrder(); order.setDianyingOrderUuidNumber(orderNo); order.setDianyingId(dianyingId); order.setYonghuId(yonghuId); order.setBuyZuoweiNumber(zuoweiIds); order.setBuyZuoweiTime(new Date()); order.setDianyingOrderTruePrice(truePrice); order.setDianyingOrderPaymentTypes(payType); order.setInsertTime(new Date()); dianyingOrderService.save(order); return Result.success("订单提交成功!订单号:" + orderNo); }
3. 管理员端:公告管理模块(答辩亮点!)
这个功能最能体现“影院信息通知闭环”,导师超爱问!核心是“发布观影通知-管理公告类型-用户查看”,别漏“公告图片预览”,不然用户看不到活动海报细节。
页面设计要点(JSP+Bootstrap)
页面标题:管理员-公告管理页面
(插入图片位置:此处放“公告管理页面截图”,需包含以下元素)
- 筛选区:
- 输入框:公告标题(模糊查)
- 下拉框:公告类型(全部/观影活动/系统通知)、假删状态(全部/未删/已删)
- 按钮:“查询”(蓝色)、“新增公告”(绿色)、“公告类型管理”(灰色,跳转类型管理页)
- 公告列表区:
- 表格列名:公告标题、公告类型、公告图片、发布时间、假删状态、操作
- 图片显示:缩略图(点击预览)
- 操作按钮:“编辑”(橙色)、“删除”(红色,执行假删)、“查看详情”(蓝色)
- 新增公告弹窗:
- 表单元素:公告标题(必填)、公告类型(下拉选,必填)、公告图片(上传框,JPG/PNG)、发布时间(日期选择器,默认当前时间)、公告详情(文本域,必填,描述活动规则或通知内容)
- 按钮:“提交”(绿色)、“取消”(灰色)
- 公告类型管理页:
- 功能:新增类型(输入类型名称、编码)、编辑现有类型、删除无效类型(无关联公告时可删)
(3)避坑提醒
- 公告图片上传与预览!加代码(Controller层):
@RequestMapping("/uploadNoticePhoto") @ResponseBody public Result uploadNoticePhoto(@RequestParam("file") MultipartFile file) { try { // 1. 校验文件格式 String originalFilename = file.getOriginalFilename(); String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); if (!".jpg".equals(suffix) && !".png".equals(suffix)) { return Result.error("仅支持JPG、PNG格式图片!"); } // 2. 校验文件大小(≤5MB) if (file.getSize() > 5 * 1024 * 1024) { return Result.error("图片大小不能超过5MB!"); } // 3. 上传图片(存到项目static目录) String filePath = "D:/EclipseWorkspace/yingyuandingpiaoxi统/WebContent/static/notice/"; File destDir = new File(filePath); if (!destDir.exists()) { destDir.mkdirs(); // 创建目录 } String newFileName = System.currentTimeMillis() + suffix; File destFile = new File(filePath + newFileName); file.transferTo(destFile); // 4. 返回图片路径(前端预览用) String photoUrl = "/yingyuandingpiaoxi统/static/notice/" + newFileName; return Result.success("图片上传成功!", photoUrl); } catch (Exception e) { e.printStackTrace(); return Result.error("图片上传失败!"); } }
五、测试别敷衍!这3步让答辩不翻车
很多宝子觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“已下架电影仍可订票”场景,导致用户能订下架电影,导师说“不符合影院运营逻辑”,当场扣分😫 测试一定要针对性做!
1. 功能测试(必测3个模块)
别全测!重点测“核心功能”,我整理了测试用例表,直接填结果:
(1)电影管理测试(表1:电影测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 电影名称重复新增 | 新增电影→填已存在名称→提交 | 提示“该电影名称已存在,请勿重复添加!” | ||
| 座位数为负数 | 新增电影→座位数填-10→提交 | 提示“电影座位数不能为负数,请重新输入!” | ||
| 正常新增电影 | 填唯一名称+选有效类型+传PNG海报+座位100+现价39.9→提交 | 提示“新增成功!”,列表显示该电影(已上架、未删除) | ||
| 逻辑删除电影后查询 | 删除电影→选“已删”筛选→查询 | 显示该电影;选“未删”筛选→不显示 |
(2)电影订票测试(表2:订票测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 选择已售座位 | 选电影→选已售座位→点击“确认选座” | 提示“所选座位已被占用,请重新选择!” | ||
| 订已下架电影 | 选“已下架”电影→点击“立即订票”→提交订单 | 提示“该电影已下架或已删除,无法订票!” | ||
| 正常提交订单 | 选“已上架且未删”电影→选可选座位→选支付类型→提交订单 | 提示“订单提交成功!订单号:XXX”,订单列表显示该订单 |
(3)公告管理测试(表3:公告测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 上传非支持格式图片 | 新增公告→上传Excel文件→提交 | 提示“仅支持JPG、PNG格式图片!” | ||
| 公告标题为空新增 | 新增公告→标题不填→提交 | 提示“公告标题不能为空,请重新输入!” | ||
| 正常新增公告 | 填标题+选类型+传JPG图片+写详情→提交 | 提示“公告新增成功!”,列表显示该公告 |
2. 兼容性测试(容易忽略的点)
别只在自己电脑测!答辩时评委可能用不同浏览器,我当初没测IE,结果电影海报显示变形,赶紧加兼容性CSS才好:
- 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
- 分辨率测试:1920×1080、1366×768(别让页面出现横向滚动条,用Bootstrap的“container-fluid”布局,加“overflow-x: hidden”样式)
3. 测试报告要写好!答辩加分
把测试结果整理成“测试报告”,含“目的、范围、用例、结果、问题总结”,导师会觉得你“做事严谨”。比如:
- 问题总结:“IE浏览器下电影海报显示变形,通过添加IE专属CSS(*html .dianying-photo { width: 150px !important; height: 200px !important; })修复;已下架电影仍可订票,加电影上架状态(shangxiaTypes)校验修复”
- 测试结论:“核心功能(电影管理、电影订票、公告管理)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用,满足影院订票与信息管理需求”
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给“良好”:
- 演示流程要顺畅:提前录演示视频(怕现场系统崩),按“管理员新增电影→用户浏览并收藏电影→用户选座提交订单→管理员发布公告→用户查看公告”的流程来,别跳步,每个操作后停顿2秒,让评委看清结果
- 重点讲“你解决了啥问题”:比如“一开始多个用户能选同一座位,加座位占用校验(查询已售座位列表)解决;已下架电影仍可订票,加电影上架状态(shangxiaTypes)校验修复;表关联错误导致查不到收藏记录,重新设计外键(dianying_id关联电影表id,yonghu_id关联用户表id)解决”,比光说“我用了SSM+MySQL”有亮点
- 准备常见问题:导师大概率问“为啥选SSM不选SpringBoot”“数据多了怎么优化”,提前答:“SSM分层清晰(Controller/Service/Dao),适合本科毕设理解开发流程;数据多就给电影表的dianying_name加索引(CREATE INDEX idx_dianying_name ON dianying(dianying_name);),优化模糊查询速度,还能分表存储历史订单数据(按年份分表,如dianying_order_2024、dianying_order_2025)”
最后:毕设通关的小私心
以上就是基于SSM+MySQL的影院订票系统从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能(比如智能推荐、AI客服),把核心功能(电影、订单、公告)做扎实,答辩就能过。
需要核心源码(带详细注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“影院订票系统”,我私发你;卡在某个模块(比如电影上传、订单提交),也可以留言,我看到必回!
点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘