毕业设计实战:基于SpringBoot+MySQL的旅游网站设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
谁懂啊!当初做旅游网站毕设时,光“旅游路线表”和“路线收藏表”的外键关联就卡了3天——一开始没给收藏表设“路线id”外键,查某条路线的所有收藏记录时数据全串错,导师看了直接让我“重新画数据库E-R图”😫 后来踩遍无数坑才摸出一套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全说透,宝子们不用再熬夜改代码,轻松搞定毕设!
一、先搞懂“旅游网站要啥”!需求分析别瞎蒙
刚开始我跳过需求分析就写代码,花两周加了个“智能路线推荐算法”,结果导师一句“核心是景点管理、旅游动态、用户交互,不是复杂算法”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
旅游网站就两类核心用户:管理员和普通用户(别加“导游子角色”!我当初加了后,权限逻辑混乱,导游能修改景点定价,最后砍掉才顺畅),功能要明确区分,避免越权操作:
- 管理员端(必做功能):
- 用户管理:维护用户账号(新增/重置密码/标记假删)、查看用户信息(姓名、手机号、身份证号、头像)、按用户名/注册时间筛选(我当初没加,找用户要翻几十页)
- 景点管理:维护景点信息(新增名称/类型/图片、修改详情、标记“逻辑删除”)、管理景点留言(查看用户提问、回复咨询)、按景点类型/名称筛选
- 内容管理:旅游动态管理(发布动态标题/图片/详情、删除无效动态)、旅游路线管理(新增路线编号/类型/图片、修改路线详情)、公告管理(发布通知、上传封面、标记假删)
- 基础管理:论坛管理(审核帖子、删除违规内容)、字典表维护(配置景点类型、动态类型等基础数据)、公司简介管理(编辑企业信息、上传宣传图)
- 用户端(核心功能):
- 景点操作:浏览景点列表(按类型/发布时间排序)、查看景点详情(图片、简介、留言)、收藏感兴趣景点、给景点留言(咨询游玩问题)
- 旅游相关操作:浏览旅游动态(按类型筛选)、查看旅游路线(路线详情、图片、编号)、收藏重点路线、发布论坛帖子(分享游玩经验)
- 信息查询:浏览公告(按类型筛选)、查看公司简介、查询个人记录(收藏、留言、帖子)
- 个人中心:管理个人信息(修改密码/联系方式、上传头像)、查看收藏记录、管理发布的帖子
2. 需求分析避坑指南(血泪教训!)
- 别光靠“空想”!找2个同学分别模拟管理员和用户提意见:比如有用户说“想快速区分已收藏/未收藏的路线”,我才加了“收藏状态标色”(已收藏标蓝色实心星/未收藏标灰色空心星),比瞎加“智能推荐”实用多了
- 一定要画用例图!用DrawIO画简单版,标清“管理员-审核论坛帖子”“用户-收藏旅游路线”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听25分钟还没get到逻辑)
- 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“景点名称非空”“路线图片格式为JPG/PNG”“用户手机号需唯一”“公告标题非空”),编码时对着做,不会跑偏
3. 可行性分析别敷衍!3点写清楚就能过
导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从3个核心角度写,显得专业:
- 技术可行性:SpringBoot、MySQL、Vue、Java都是课堂学过的,图书馆有《SpringBoot实战》《MySQL数据库设计》,遇到问题能查资料(别用SpringBoot 3.x!我当初想试,跟Vue2联调时景点图片上传接口卡了5天,换回SpringBoot 2.7才顺利)
- 经济可行性:所有工具全免费!IntelliJ IDEA(社区版)、MySQL、Tomcat官网直接下,不用花钱买版权,答辩时说“开发成本为0,还能帮旅游企业节约信息管理人工成本”,导师会觉得你懂成本控制
- 操作可行性:界面参考主流旅游平台,按钮布局简洁(比如“收藏路线”“查看详情”按钮放路线列表页显眼位置),我找同学测试,10分钟就学会浏览景点、收藏路线,导师直接认可
二、技术选型别跟风!这套组合稳到爆
刚开始我跟风用SpringBoot 3.x+Vue3+Redis,结果“用户路线收藏缓存”卡了4天——Redis的持久化配置没设对,重启后收藏数据全丢😫 后来换成Java 8+SpringBoot 2.7+MySQL 8.0+Tomcat 9+IntelliJ IDEA 2022+Vue2,新手友好度拉满,调试效率翻两倍!
1. 技术栈详细对比(附避坑提醒)
宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了6个核心工具的选择理由和坑点,直接抄:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| Java 8 | 语法简洁,支持面向对象编程,学习资料丰富,SpringBoot 2.7对其兼容性最佳 | 别用Java 11+!部分SpringBoot依赖对高版本Java支持差,会出现“类加载失败”错误 |
| SpringBoot 2.7 | 简化Spring配置,自带Tomcat容器,支持自动装配,开发效率比SSM高30% | 别用3.x版本!与Vue2、MySQL 8.0兼容性差,且部分依赖(如mybatis-spring-boot-starter)适配不完善 |
| MySQL 8.0 | 支持事务和外键,存景点、路线、用户数据足够用,占内存小,支持utf8mb4编码(解决生僻字乱码) | 安装时设“utf8mb4”编码!我当初用默认latin1编码,用户姓名含生僻字(如“䶮”)乱码,查2小时才解决 |
| Tomcat 9 | 轻量级服务器,SpringBoot默认集成,配置简单,与MySQL 8.0兼容性强 | 别手动升级到10!版本过高导致Servlet API包名变化(javax.servlet→jakarta.servlet),项目启动报错“类找不到” |
| IntelliJ IDEA 2022 | 对Java开发支持好,自带SpringBoot插件,调试工具直观,代码提示功能强 | 别用2023+版本!高版本对老电脑兼容性差,编译项目时经常卡顿,且部分插件(如Vue Plugin)适配不稳定 |
| Vue2 | 上手简单,组件丰富,与SpringBoot联调顺畅,学习资料多 | 别用Vue 3!组合式API对新手不友好,且与后端接口联调时数据格式转换容易出问题 |
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”即成功
- 装IntelliJ IDEA 2022(社区版):选“IntelliJ IDEA Community Edition”,首次打开勾选“Spring Boot”“Vue.js”插件,自动安装
- 装MySQL 8.0:用Navicat管理(可视化工具超方便),新建数据库“lvyouwangzhan”,编码设“utf8mb4”,排序规则选“utf8mb4_general_ci”
- 新建SpringBoot项目:打开IDEA,选“Spring Initializr”,Group填“com.example”,Artifact填“lvyouwangzhan”,勾选“Spring Web”“MyBatis Framework”“MySQL Driver”依赖,自动生成项目结构
- 配置数据库连接:在application.properties中添加配置(spring.datasource.url=jdbc:mysql://localhost:3306/lvyouwangzhan?useSSL=false&serverTimezone=UTC,spring.datasource.username=root,spring.datasource.password=自己设的密码),写“查询景点列表”接口,运行后能返回数据即完成初始化
3. 架构图一定要画!答辩加分项
用DrawIO画SpringBoot+Vue分层架构图,标清“客户端(浏览器)-前端(Vue页面)-控制层(Controller)-服务层(Service)-数据访问层(Mapper)-数据库(MySQL)”:比如用户点“收藏旅游路线”→Vue页面传请求→Controller接收参数→Service校验路线状态(是否存在、是否有效)→Mapper操作数据库(插入收藏记录)→返回收藏结果→Vue页面更新收藏状态。去年答辩时,评委特意夸这图“逻辑清晰”,比光说“我用了SpringBoot+MySQL”专业多了!
三、数据库设计:别让表关联坑了你
这部分是毕设的“核心骨架”,我当初没关联“旅游路线表”和“路线收藏表”,查“某条路线的收藏记录”要写3层嵌套SQL,调试到凌晨1点😫 后来按“实体-属性-关系”设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定“实体”(管理员、用户、景点、旅游路线、旅游动态、公告、论坛帖子、字典表),再想“属性”,别漏关键字段!我整理了必做的8张表,直接照着画ER图:
- 用户表(yonghu):id(主键)、yonghu_name(用户姓名)、yonghu_phone(手机号)、yonghu_id_number(身份证号)、yonghu_photo(头像路径)、yonghu_email(邮箱)、yonghu_delete(假删标识:0=未删,1=已删)、create_time(注册时间)
- 景点信息表(jingdian):id(主键)、jingdian_name(景点名称)、jingdian_types(景点类型)、jingdian_photo(景点图片路径)、jingdian_content(景点详情)、insert_time(发布时间)、create_time(创建时间)
- 旅游路线表(lvyouluxian):id(主键)、lvyouluxian_uuid_number(路线编号)、lvyouluxian_name(路线标题)、lvyouluxian_types(路线类型)、lvyouluxian_photo(路线图片路径)、lvyouluxian_content(路线详情)、insert_time(发布时间)
- 路线收藏表(lvyouluxian_collection):id(主键)、lvyouluxian_id(关联路线)、yonghu_id(关联用户)、insert_time(收藏时间)、create_time(创建时间)
画ER图用Visio或亿图,记住3个规则:
- 矩形代表“实体”(比如“用户”“旅游路线”)
- 椭圆代表“属性”(比如用户的“手机号”“头像”,路线的“标题”“类型”)
- 菱形代表“关系”(比如“用户-路线收藏”是一对多,一个用户可收藏多条路线;“旅游路线-路线收藏”是一对多,一条路线可被多个用户收藏;“用户-景点留言”是一对多,一个用户可给多个景点留言) 避坑提醒:别把“景点图片、路线图片”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/jingdian/photo1.jpg、/static/luxian/photo1.png)才对。
2. 数据库物理设计(附建表SQL示例)
ER图画好后,转成实际表,字段类型和约束别瞎设!比如“路线类型”用INT(1/2/3标识),“景点名称”用VARCHAR(200),“手机号”设UNIQUE约束(避免重复注册),“发布时间”用DATE类型。
给宝子们贴“旅游路线表”和“路线收藏表”的建表SQL,复制到Navicat就能用:
-- 旅游路线表
CREATE TABLE `lvyouluxian` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '路线ID',
`lvyouluxian_uuid_number` VARCHAR(50) DEFAULT NULL COMMENT '路线编号',
`lvyouluxian_name` VARCHAR(200) NOT NULL COMMENT '路线标题',
`lvyouluxian_types` INT DEFAULT NULL COMMENT '路线类型(1-自然风光,2-人文历史,3-休闲度假)',
`lvyouluxian_photo` VARCHAR(200) DEFAULT NULL COMMENT '路线图片路径',
`lvyouluxian_content` TEXT DEFAULT NULL COMMENT '路线详情',
`insert_time` DATE DEFAULT NULL COMMENT '发布时间',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='旅游路线表';
-- 路线收藏表
CREATE TABLE `lvyouluxian_collection` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '收藏ID',
`lvyouluxian_id` INT DEFAULT NULL COMMENT '关联路线ID(外键)',
`yonghu_id` INT DEFAULT NULL COMMENT '关联用户ID(外键)',
`insert_time` DATETIME DEFAULT NULL COMMENT '收藏时间',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `fk_luxian_collection` (`lvyouluxian_id`),
KEY `fk_yonghu_collection` (`yonghu_id`),
CONSTRAINT `fk_luxian_collection` FOREIGN KEY (`lvyouluxian_id`) REFERENCES `lvyouluxian` (`id`),
CONSTRAINT `fk_yonghu_collection` FOREIGN KEY (`yonghu_id`) REFERENCES `yonghu` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='路线收藏表';
3. 表关联测试!别等编码才发现错
建完表一定要测关联!比如在“用户表”插数据(id=1,姓名=“张三”,手机号=13800138000),在“旅游路线表”插数据(id=1,编号=“LX20240501”,标题=“黄山自然风光游”,类型=1,图片=/static/luxian/photo1.jpg),在“路线收藏表”插关联数据(lvyouluxian_id=1,yonghu_id=1,收藏时间=2024-05-01 10:00:00),用JOIN查询“某条路线的收藏记录”:
SELECT u.yonghu_name, u.yonghu_phone, c.insert_time
FROM lvyouluxian_collection c
JOIN yonghu u ON c.yonghu_id = u.id
WHERE c.lvyouluxian_id = 1;
如果能查出“用户名+手机号+收藏时间”,说明关联没问题;如果报错“Cannot add or update a child row”,大概率是外键没设对,赶紧检查表结构(比如路线ID是否存在、用户ID是否有效)。
四、功能实现:核心模块操作+页面设计
不用做所有功能!先搞定3个核心模块,答辩时足够出彩。每个模块我都附关键操作逻辑和页面设计要点,宝子们直接套就行。
1. 管理员端:景点信息管理模块(必做!)
这是管理员的核心功能,实现“景点信息维护+留言管理”,重点说“景点名称唯一性校验”和“逻辑删除逻辑”——别漏这两步,我当初就是这里踩了大坑!
(1)关键操作逻辑
- 新增景点前,校验“景点名称非空且唯一”“景点类型已在字典表定义”“图片格式为JPG/PNG”(缺一项提示“请完善景点信息”);
- 上传景点图片时,限制大小≤5MB(避免占用过多服务器空间);
- 删除景点时,采用“逻辑删除”(新增“jingdian_delete”字段,设为1表示已删),避免删除后关联的留言、收藏数据丢失。
(2)页面设计要点(Vue+Bootstrap)
页面标题:管理员-景点信息管理页面
(插入图片位置:此处放“景点信息管理页面截图”,需包含以下元素)
- 筛选区:
- 输入框:景点名称(模糊查)
- 下拉框:景点类型(全部/自然风光/人文历史/休闲度假)、是否删除(全部/未删/已删)
- 按钮:“查询”(蓝色btn-primary)、“新增景点”(绿色btn-success)
- 景点列表区:
- 表格列名:景点名称、景点类型、景点图片、发布时间、操作
- 图片显示:缩略图(点击查看大图)
- 操作按钮:“编辑”(橙色btn-warning)、“删除”(红色btn-danger,执行逻辑删除)、“查看详情”(蓝色btn-info)、“管理留言”(灰色btn-default)
- 新增景点弹窗:
- 表单元素:景点名称(必填)、景点类型(下拉选,必填)、景点图片(上传框,JPG/PNG,必填)、景点详情(文本域,必填)、发布时间(日期选择器,默认当前时间)
- 按钮:“提交”(绿色)、“取消”(灰色)
(3)避坑提醒
- 景点名称唯一性校验与逻辑删除逻辑!加代码(Service层):
// 景点名称唯一性校验 String jingdianName = jingdian.getJingdianName(); LambdaQueryWrapper nameWrapper = new LambdaQueryWrapper<>(); nameWrapper.eq(Jingdian::getJingdianName, jingdianName) .eq(Jingdian::getJingdianDelete, 0); // 只校验未删除的景点 if (jingdianService.count(nameWrapper) > 0) { return Result.error("该景点名称已存在,请勿重复添加!"); } // 景点类型校验(需在字典表存在) Integer jingdianType = jingdian.getJingdianTypes(); LambdaQueryWrapper typeWrapper = new LambdaQueryWrapper<>(); typeWrapper.eq(Dictionary::getDicCode, "jingdian_type") .eq(Dictionary::getCodeIndex, jingdianType); if (dictionaryService.count(typeWrapper) == 0) { return Result.error("景点类型无效,请选择正确类型!"); } // 逻辑删除逻辑 public Result deleteJingdian(Integer id) { Jingdian jingdian = jingdianService.getById(id); jingdian.setJingdianDelete(1); // 1表示已删除 jingdianService.updateById(jingdian); return Result.success("景点已删除!"); }
2. 用户端:旅游路线收藏模块(核心需求!)
用户用系统的核心是“找路线-收藏-参考”,流程别复杂:浏览路线→查看详情→点击收藏→在个人中心查看/取消收藏,我当初漏了“重复收藏”校验,导致用户多次收藏同一条路线,补了半天逻辑才好。
(1)关键操作逻辑
- 收藏路线前,校验“未重复收藏该路线”“路线状态为有效(未删除)”(不满足提示“无法收藏此路线”);
- 收藏成功后,页面实时更新收藏状态(空心星→实心星,标蓝);
- 取消收藏时,直接删除收藏记录,不影响路线本身数据。
(2)页面设计要点(Vue+Bootstrap)
页面标题:用户-旅游路线详情与收藏页面
(插入图片位置:此处放“路线详情与收藏页面截图”,需包含以下元素)
- 路线详情区:
- 显示:路线图片(大图,支持轮播)、标题、编号、类型、发布时间、路线详情(分段显示,含行程安排、注意事项)
- 按钮:“收藏路线”(空心星/实心星切换,已收藏标蓝)、“返回列表”(灰色btn-default)
- 留言区:
- 输入框:留言内容(提示“请输入您的疑问或建议”)
- 按钮:“提交留言”(蓝色)
- 留言列表:显示其他用户留言+管理员回复,按时间倒序排列
- 我的收藏区(个人中心):
- 表格列名:路线标题、路线类型、收藏时间、操作
- 操作按钮:“查看路线”(蓝色)、“取消收藏”(红色)
(3)避坑提醒
- 重复收藏校验!加代码(Controller层):
@PostMapping("/collectLuxian") @ResponseBody public Result collectLuxian(Integer lvyouluxianId, Integer yonghuId) { // 1. 校验路线状态(未删除) Lvyouluxian luxian = lvyouluxianService.getById(lvyouluxianId); if (luxian == null) { return Result.error("该路线不存在,无法收藏!"); } // 2. 校验是否重复收藏 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(LvyouluxianCollection::getLvyouluxianId, lvyouluxianId) .eq(LvyouluxianCollection::getYonghuId, yonghuId); if (lvyouluxianCollectionService.count(wrapper) > 0) { return Result.error("您已收藏过此路线,请勿重复操作!"); } // 3. 保存收藏记录 LvyouluxianCollection collection = new LvyouluxianCollection(); collection.setLvyouluxianId(lvyouluxianId); collection.setYonghuId(yonghuId); collection.setInsertTime(new Date()); lvyouluxianCollectionService.save(collection); return Result.success("路线收藏成功!"); }
3. 管理员端:旅游动态管理模块(答辩亮点!)
这个功能最能体现“旅游信息传播闭环”,导师超爱问!核心是“发布动态-管理动态-用户查看”,别漏“动态图片预览”,不然用户看不到游玩实景细节。
页面设计要点(Vue+Bootstrap)
页面标题:管理员-旅游动态管理页面
(插入图片位置:此处放“旅游动态管理页面截图”,需包含以下元素)
- 筛选区:
- 输入框:动态标题(模糊查)
- 下拉框:动态类型(全部/景点推荐/旅行攻略/活动通知)、发布时间(日期范围选择)
- 按钮:“查询”(蓝色)、“新增动态”(绿色)
- 动态列表区:
- 表格列名:动态标题、动态类型、动态图片、发布时间、操作
- 图片显示:缩略图(点击预览)
- 操作按钮:“编辑”(橙色)、“删除”(红色)、“查看详情”(蓝色)
- 新增动态弹窗:
- 表单元素:动态标题(必填)、动态类型(下拉选,必填)、动态图片(上传框,JPG/PNG,必填)、动态详情(文本域,必填,描述景点特色或旅行技巧)、发布时间(日期选择器,默认当前时间)
- 按钮:“提交”(绿色)、“取消”(灰色)
(3)避坑提醒
- 动态图片上传与预览!加代码(Controller层):
@PostMapping("/uploadDongtaiPhoto") @ResponseBody public Result uploadDongtaiPhoto(@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:/IDEAWorkspace/lvyouwangzhan/src/main/resources/static/dongtai/"; 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 = "/static/dongtai/" + newFileName; return Result.success("图片上传成功!", photoUrl); } catch (Exception e) { e.printStackTrace(); return Result.error("图片上传失败!"); } }
五、测试别敷衍!这3步让答辩不翻车
很多宝子觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“已删除景点仍可留言”场景,导致用户能给删除景点留言,导师说“不符合信息管理逻辑”,当场扣分😫 测试一定要针对性做!
1. 功能测试(必测3个模块)
别全测!重点测“核心功能”,我整理了测试用例表,直接填结果:
(1)景点信息管理测试(表1:景点测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 景点名称重复新增 | 新增景点→填已存在名称→提交 | 提示“该景点名称已存在,请勿重复添加!” | ||
| 上传非支持格式图片 | 新增景点→上传Excel文件→提交 | 提示“仅支持JPG、PNG格式图片!” | ||
| 正常新增景点 | 填唯一名称+选有效类型+传PNG图片+写详情→提交 | 提示“新增成功!”,列表显示该景点(未删状态) |
(2)路线收藏测试(表2:收藏测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 重复收藏同一路线 | 选已收藏路线→点击“收藏”→确认操作 | 提示“您已收藏过此路线,请勿重复操作!” | ||
| 收藏不存在路线 | 输入无效路线ID→点击“收藏”→确认操作 | 提示“该路线不存在,无法收藏!” | ||
| 正常收藏路线 | 选有效路线→点击“收藏”→确认操作 | 提示“路线收藏成功!”,个人中心显示该收藏(实心蓝星) |
(3)旅游动态管理测试(表3:动态测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 动态标题为空新增 | 新增动态→标题不填→提交 | 提示“动态标题不能为空,请重新输入!” | ||
| 正常新增动态 | 填标题+选类型+传JPG图片+写详情→提交 | 提示“动态新增成功!”,列表显示该动态 |
2. 兼容性测试(容易忽略的点)
别只在自己电脑测!答辩时评委可能用不同浏览器,我当初没测IE,结果景点图片显示变形,赶紧加兼容性CSS才好:
- 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
- 分辨率测试:1920×1080、1366×768(别让页面出现横向滚动条,用Bootstrap的“container-fluid”布局,加“overflow-x: hidden”样式)
3. 测试报告要写好!答辩加分
把测试结果整理成“测试报告”,含“目的、范围、用例、结果、问题总结”,导师会觉得你“做事严谨”。比如:
- 问题总结:“IE浏览器下景点图片显示变形,通过添加IE专属CSS(*html .jingdian-photo { width: 150px !important; height: 100px !important; })修复;已删除景点仍可留言,加景点删除状态(jingdian_delete)校验修复”
- 测试结论:“核心功能(景点管理、路线收藏、旅游动态管理)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用,满足旅游信息管理需求”
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给“良好”:
- 演示流程要顺畅:提前录演示视频(怕现场系统崩),按“管理员新增景点→管理员发布旅游动态→用户浏览并收藏路线→用户给景点留言→管理员回复留言”的流程来,别跳步,每个操作后停顿2秒,让评委看清结果
- 重点讲“你解决了啥问题”:比如“一开始用户能重复收藏路线,加重复校验(查询收藏表是否已有该用户-路线关联)解决;已删除景点仍可留言,加景点删除状态(jingdian_delete)校验修复;表关联错误导致查不到收藏记录,重新设计外键(lvyouluxian_id关联路线表id)解决”,比光说“我用了SpringBoot+MySQL”有亮点
- 准备常见问题:导师大概率问“为啥选SpringBoot不选SSM”“数据多了怎么优化”,提前答:“SpringBoot简化配置(不用手动整合xml),自带Tomcat容器,开发效率高;数据多就给景点表的jingdian_name加索引(CREATE INDEX idx_jingdian_name ON jingdian(jingdian_name);),优化查询速度,还能分表存储历史动态数据(按年份分表,如lvyoudongtai_2024、lvyoudongtai_2025)”
最后:毕设通关的小私心
以上就是基于SpringBoot+MySQL的旅游网站从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能(比如智能推荐、AI客服),把核心功能(景点、路线、动态)做扎实,答辩就能过。
需要核心源码(带详细注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“旅游网站”,我私发你;卡在某个模块(比如景点上传、路线收藏),也可以留言,我看到必回!
点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘