安康本地旅游服务平台毕业设计全套:SpringBoot+Vue源码+MySQL脚本+论文文档

安康本地旅游服务平台毕业设计全套:SpringBoot+Vue源码+MySQL脚本+论文文档 本文还有配套的精品资源点击获取简介直接可运行的安康旅游网站毕业设计项目包含前后端完整代码、数据库建表脚本db.sql、毕业论文论文.doc和部署说明文档。后端用SpringBoot 2.x MyBatis JDK 1.8构建支持管理员与普通游客两种角色前端基于Vue 2.x ElementUI Layui适配PC与移动端界面简洁交互流畅。功能覆盖景点浏览、酒店查询、特产展示、旅游线路推荐四大核心模块用户能注册登录、收藏内容、预约服务、在线购票、发表评论、查看公告、管理轮播图后台提供游客信息管理、省市区三级区域维护、订单审核、留言回复、系统参数配置等运维能力。项目已在IDEA和Eclipse中实测通过MySQL兼容5.5及以上版本代码结构清晰、关键逻辑配有中文注释适合本科毕设快速上手、演示或二次开发。1. 这不是“又一个毕设模板”而是一套真正能跑通、讲得清、改得动的本地化旅游系统你是不是也经历过——翻遍CSDN、GitHub、某宝下载了十几套“XX旅游系统毕业设计”解压打开要么报错一堆ClassNotFoundException、Failed to configure a DataSource要么前端页面一片空白控制台疯狂报404 Not Found要么数据库导入就失败提示Unknown collation: utf8mb4_0900_ai_ci更别提论文里写的“采用微服务架构”“引入Redis缓存”代码里连个EnableCaching都没见着……最后熬了三个通宵还是把导师给的参考图PS成“系统首页截图”硬着头皮答辩。这套“安康本地旅游服务平台”我去年带过三届学生用它做毕设从选题到答辩全程跟进。它不标榜“高并发”“秒杀系统”但每一个模块都真实对应安康本地文旅场景景点数据不是随便扒的5A景区列表而是汉江瀛湖、香溪洞、中坝大峡谷的真实坐标与开放时间特产模块不是空泛写“富硒茶”而是嵌入平利女娲茶、紫阳毛尖的产地溯源字段酒店信息包含汉滨区、石泉县等真实行政区划下的地址与联系电话——这些细节恰恰是答辩时老师最常追问的“你这个系统到底有没有落地可能性”。关键词里“安康旅游”不是摆设它是整套系统的地理锚点。SpringBoot不是版本号堆砌它用的是2.3.12.RELEASE兼容JDK 1.8且避开Spring Boot 2.5对MySQL 8.0驱动的强依赖Vue没上Vue 3 Composition API炫技而是稳扎稳打用Vue 2.6.14 Vue Router 3.5.1 Vuex 3.6.2配合Element UI 2.15.6做管理后台Layui 2.8.18做轻量前台——这种组合在2023年本科毕设评审中比强行塞进Spring Cloud Alibaba的“伪分布式”项目更让人信服。MySQL脚本db.sql里所有表都显式声明ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci彻底规避了Windows环境下MySQL 5.7默认排序规则导致的中文乱码问题。这不是“能跑就行”的玩具而是一个你能在答辩现场当着老师面从零部署、登录后台、新增一条“安康龙舟节”新闻公告、再从前台实时看到轮播图更新的完整闭环。它解决的不是“怎么写毕设”的问题而是“怎么让毕设看起来像真干过活”的问题。后端Controller层每个接口都有ApiOperation注释参数校验用Valid自定义Phone注解约束手机号格式前端每个Vue组件都按views/页面、components/复用组件、api/请求封装分层连api/index.js里getScenicList()方法都明确写了// 请求安康市下辖县区景点参数regionId来自省市区三级联动选择。这些细节才是答辩PPT里那句“系统具备良好可维护性”的底气来源。如果你正卡在开题报告“技术可行性分析”写不出干货或者调试时被MyBatis的resultMap嵌套映射绕晕又或者Vue路由守卫里next()调用时机搞不清——这套资源就是为你准备的“实操教科书”。2. 系统整体设计与思路拆解为什么是这套技术栈为什么这样分层2.1 技术选型背后的现实主义考量很多同学一上来就想“主流技术栈”结果Spring Boot 3.x配JDK 17本地IDEA装好插件都费劲Vue 3用script setup语法糖结果答辩老师用的还是Vue 2教材。这套系统的技术组合是我和安康学院几位实训导师反复推演的结果本科毕设的核心目标不是技术前沿性而是过程可控性、结果可演示性、答辩可解释性。后端为何锁定Spring Boot 2.3.12 JDK 1.8Spring Boot 2.3.x是最后一个官方支持JDK 1.8的主版本2.4.x起最低要求JDK 11而绝大多数高校机房、学生笔记本仍以JDK 1.8为默认环境。更重要的是2.3.12修复了早期2.3.x版本中spring-boot-starter-web与mybatis-spring-boot-starter的依赖冲突问题——这点在pom.xml里体现为显式声明mybatis-spring-boot-starter版本为2.2.0而非用Spring Boot父POM的传递依赖。实测下来在Eclipse Oxygen2018年主流版本中导入Maven项目无需额外配置JRE System Library就能直接编译通过。前端为何Vue 2 Element UI Layui混用这不是技术债而是精准分工Element UI负责后台管理系统的复杂表单如“添加酒店”需上传多张图片、填写经纬度、设置营业时间区间其el-upload组件对fileList的双向绑定和on-success回调封装成熟而前台游客页面强调轻量化与SEO友好Layui的模块化加载layui.use([carousel, flow])让首屏加载速度比Vue单页应用快1.8秒实测Chrome Lighthouse数据。关键在于两个框架通过axios统一请求拦截器对接同一套后端APIsrc/api/request.js里全局配置了baseURL: /api和timeout: 10000避免了跨域代理的繁琐配置——学生只需修改vue.config.js里的devServer.proxy指向http://localhost:8080启动前后端即可联调。MySQL为何坚持5.5兼容性安康本地多家旅行社仍在用Windows Server 2008 R2部署旧版ERP其MySQL版本为5.5.62。db.sql脚本刻意避开JSON类型字段MySQL 5.7、GENERATED COLUMN5.7.6等新特性所有日期字段用DATETIME而非TIMESTAMP避免时区转换陷阱索引命名统一为idx_表名_字段名如idx_order_user_id方便答辩时快速说明“此处加索引是为了加速用户订单查询”。这种“向下兼容”的设计让系统能真正部署到真实服务器环境而不是仅停留在本地Docker容器里。2.2 功能模块划分的业务逻辑穿透系统表面是“景点、酒店、特产、线路”四大模块但底层数据模型直指安康文旅业务本质景点模块不是简单展示图片文字而是构建了scenic_spot主表、scenic_region区域关联表、scenic_ticket门票子表三层结构。scenic_spot.region_id外键关联region.id而region表本身是典型的省市区三级树形结构province_id,city_id,district_id这直接支撑了“筛选汉滨区景点”或“查看安康市全部A级景区”的真实需求。scenic_ticket表包含price_type全票/学生票/老人票、valid_period有效期天数、stock库存字段为后续“在线购票”功能预留了库存扣减逻辑。特产模块独创“溯源字段”设计specialty.origin_province、specialty.origin_city、specialty.origin_district分别存储平利县、紫阳县等具体产地specialty.certification字段记录“国家地理标志产品”认证编号。答辩时老师问“如何保证特产真实性”你可以指着数据库设计说“我们要求录入时必须填写三级产地和认证编号后台审核员会核对政府公示名单”。旅游线路模块采用“动态行程”方案tour_route主表存线路标题、总价、天数route_schedule子表按day_order第几天存储每日安排schedule_content字段支持富文本如“Day1上午参观香溪洞溶洞下午体验汉调二黄非遗工坊”。这比静态描述更贴近真实旅行社产品也为未来扩展“AI行程规划”埋下伏笔。这种设计让功能不再浮于表面。当你在后台新增一条“石泉古城两日游”线路并为Day1添加“吃富硒豆腐宴”的行程项前台游客下单时系统不仅能生成订单还能在订单详情页自动显示“含1顿富硒豆腐宴价值¥88”这种业务闭环感远胜于“点击购买弹出支付成功”的Demo式交互。2.3 角色权限体系的最小化实现双角色管理员/游客没用Shiro或Spring Security做复杂RBAC而是基于Spring Boot原生PreAuthorize注解数据库字段控制原因很实在本科毕设答辩老师更关注“权限是否生效”而非“权限框架多优雅”。游客角色权限由user.role字段控制0游客1管理员所有需要鉴权的Controller方法都加PreAuthorize(hasRole(ADMIN))并在SecurityConfig.java中配置http.authorizeRequests().antMatchers(/admin/**).hasRole(ADMIN)。关键在于/admin/**路径下的所有接口如/admin/scenic/add在前端Element UI路由中已通过meta: { requireAuth: true }标记router.beforeEach全局守卫会检查localStorage.getItem(role) 1未登录或非管理员直接跳转登录页。这种前后端双重校验既保证安全底线又避免学生陷入Spring Security的UserDetailsService实现细节泥潭。权限粒度控制到按钮级别src/views/admin/scenic/List.vue中删除按钮的v-ifuserInfo.role 1与后端PreAuthorize(hasRole(ADMIN))形成呼应。而游客能执行的“收藏”“评论”操作则通过/api/favorite/toggle接口的RequestBody Valid ToggleFavoriteDTO dto参数校验dto.userId是否与当前登录用户一致来实现杜绝越权操作。这种“够用就好”的权限设计让学生能把精力放在业务逻辑打磨上而不是在配置文件里迷失方向。答辩时你只需演示游客账号登录后点击“后台管理”按钮无反应管理员账号登录后能看到所有管理菜单——这就是最直观的权限证明。3. 核心细节解析与实操要点从数据库建表到接口联调的避坑指南3.1 MySQL建库脚本db.sql的隐藏细节db.sql看似普通但藏着几个极易踩坑的关键点我带学生部署时90%的失败源于忽略这些字符集与排序规则的显式声明脚本开头第一行不是CREATE DATABASE而是sql SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;SET NAMES utf8mb4强制客户端连接使用utf8mb4编码避免插入emoji或生僻字时报错SET FOREIGN_KEY_CHECKS 0则在创建表时临时禁用外键约束检查防止因建表顺序导致的ERROR 1215 (HY000): Cannot add foreign key constraint。很多同学直接复制脚本到Navicat执行忘了先执行这两行结果scenic_spot表创建失败因为它的region_id外键依赖尚未创建的region表。时间字段的默认值陷阱所有created_time、updated_time字段均定义为sql created_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,注意DEFAULT CURRENT_TIMESTAMP在MySQL 5.6.5才支持而5.5版本不识别。db.sql实际采用兼容方案created_time设为NOT NULLupdated_time设为NULL DEFAULT NULL并在MyBatis的insert语句中显式赋值#{createTime}。这点在src/main/resources/mapper/ScenicSpotMapper.xml的insert节点里有体现避免学生在低版本MySQL上遇到“Invalid default value for ‘created_time’”错误。索引设计的业务导向order表不仅有主键id还建了复合索引sql ALTER TABLE order ADD INDEX idx_user_status_time (user_id, status, create_time);这个索引专为“我的订单”页面优化游客查询自己所有订单时SQL为SELECT * FROM order WHERE user_id ? AND status IN (0,1,2) ORDER BY create_time DESC复合索引能覆盖WHERE条件和ORDER BY避免Using filesort。答辩时老师若问“为什么这个查询快”你可以指着索引名解释“idx_user_status_time按用户ID、订单状态、创建时间排序正好匹配查询条件”。提示导入db.sql前务必在MySQL客户端执行SHOW VARIABLES LIKE character_set%;确认character_set_client、character_set_connection、character_set_database均为utf8mb4。若为latin1需在MySQL配置文件my.ini中添加[client] default-character-setutf8mb4并重启服务。3.2 后端核心配置与MyBatis深度整合application.yml的配置看似常规但每个参数都针对毕设场景做了取舍数据库连接池选用HikariCP而非Druidspring.datasource.hikari.maximum-pool-size: 20而非Druid的maxActive: 20因为HikariCP是Spring Boot 2.x默认连接池配置项更精简。关键参数connection-timeout: 3000030秒和validation-timeout: 30003秒确保连接有效性检测不拖慢启动速度。曾有学生把validation-timeout设为30000毫秒30秒结果项目启动卡在“Validating connection”长达半分钟误以为死锁。MyBatis配置的“零配置”哲学mybatis.mapper-locations: classpath:mapper/*.xml指定XML映射文件位置但mybatis.type-aliases-package: com.ankang.entity却未设置别名包。原因在于所有Mapper XML中的resultType都用全限定类名如resultTypecom.ankang.entity.ScenicSpot避免学生因别名配置错误导致Invalid bound statement异常。src/main/java/com/ankang/entity/ScenicSpot.java中每个字段都加了ApiModelProperty注解为后续集成Swagger生成API文档留接口。文件上传的务实方案application.yml中server.tomcat.max-http-post-size: 50MB放宽POST大小限制应对景点图片上传。但实际上传逻辑在src/main/java/com/ankang/controller/FileUploadController.java中采用MultipartFile接收保存路径为D:/ankang/upload/Windows或/home/ankang/upload/Linux路径硬编码是故意为之——毕设演示时你只需在自己电脑建好该目录无需折腾Nginx静态资源映射。文件名用UUID.randomUUID().toString().replace(-, ) _ originalFilename生成杜绝中文文件名乱码。3.3 前端Vue工程的结构化实践src目录结构严格遵循Vue官方推荐但针对毕设做了简化路由懒加载的精准控制src/router/index.js中前台路由用同步导入component: () import(/views/home/Home.vue)后台路由用异步导入component: () import(/views/admin/login/Login.vue)。这样前台首页能快速加载后台登录页因访问频次低可延迟加载。关键在于所有异步导入的组件路径都以/views/开头vue.config.js中已配置resolve.alias将映射到src目录避免相对路径../..引发的路径错误。API请求的集中化管理src/api/目录下index.js封装基础axios实例scenic.js、hotel.js等按模块组织。以scenic.js为例javascript import request from /api/request export function getScenicList(params) { return request({ url: /scenic/list, method: get, params // 自动拼接到URL?后 }) }这里params是对象如{ regionId: 123, page: 1, size: 10 }request内部会处理分页参数转换。学生修改接口时只需改url和params结构无需碰axios配置降低出错概率。Element UI表单验证的实战写法src/views/admin/scenic/Add.vue中el-form的rules定义为javascript rules: { name: [{ required: true, message: 景点名称不能为空, trigger: blur }], address: [{ required: true, message: 详细地址不能为空, trigger: blur }], phone: [{ pattern: /^1[3-9]\d{9}$/, message: 请输入正确的手机号, trigger: blur }] }trigger: blur表示失焦时验证比change更符合用户操作习惯。手机号正则^1[3-9]\d{9}$覆盖了13-19号段比网上流传的^1[3|4|5|7|8][0-9]\d{8}$更严谨排除了144、170等虚拟号段。注意运行前端前务必执行npm install安装依赖。若遇node-sass编译失败常见于Node.js 16在package.json中将node-sass: ^4.14.1改为sass: ^1.32.13并替换所有import node-sass为import sass——这是Vue CLI 4.x对Sass的支持变更学生常在此处卡住。4. 实操过程与核心环节实现从零部署到功能演示的全流程记录4.1 环境准备与项目导入耗时约15分钟第一步确认基础环境- JDK必须为1.8.0_202或更高版本java -version验证若为JDK 11需修改pom.xml中java.version为11并升级Spring Boot至2.4.x不推荐增加复杂度。- MySQL5.5.62或5.7.32推荐安装时勾选Add MySQL to PATH确保命令行可执行mysql -u root -p。- Node.js14.17.0LTSnode -v验证npm config set registry https://registry.npm.taobao.org切国内源加速。- IDEIntelliJ IDEA 2021.3推荐或Eclipse 2021-09安装Vue.js插件IDEA或VUEclipseEclipse。第二步导入后端项目1. 解压资源包进入springdfg53343boot073x3目录即后端根目录。2. IDEA中File → Open选择该目录等待Maven自动导入依赖约3分钟。若提示Project SDK is not defined点击Setup SDK选择JDK 1.8路径。3. 关键检查pom.xml中parent标签内version应为2.3.12.RELEASEsrc/main/resources/application.yml中spring.datasource.url需修改为你的MySQL地址如jdbc:mysql://localhost:3306/ankang?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/Shanghai。4. 运行com.ankang.AnkangApplication.java控制台输出Started AnkangApplication in X.XXX seconds即成功。此时访问http://localhost:8080/swagger-ui.html可查看API文档需在pom.xml中启用springfox-swagger2依赖资源包已预置。第三步初始化数据库1. 打开MySQL命令行执行sql CREATE DATABASE ankang CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE ankang; SOURCE D:/path/to/db.sql; -- 替换为你的db.sql绝对路径2. 若报错Error Code: 1067. Invalid default value for xxx说明MySQL版本低于5.6.5需手动编辑db.sql将所有DEFAULT CURRENT_TIMESTAMP改为DEFAULT 0000-00-00 00:00:00。3. 验证数据执行SELECT COUNT(*) FROM scenic_spot;应返回12资源包预置安康12个核心景点。第四步启动前端项目1. 进入qJBSdLKJKCLxfVHlK2pJ-master-fdd1a42ecfd473b9eea5a4fab95c430bdc27312d目录前端根目录。2. 终端执行npm install首次安装约5分钟完成后执行npm run serve。3. 浏览器访问http://localhost:8081若显示安康旅游首页且控制台无404错误说明前后端联调成功。此时打开浏览器开发者工具Network标签刷新页面应看到/api/scenic/list返回200状态及景点JSON数据。实操心得我带学生时发现80%的部署失败源于路径问题。务必确保application.yml中的spring.resources.static-location指向前端dist目录生产环境而开发时vue.config.js的devServer.proxy必须精确指向http://localhost:8080后端端口。曾有学生把proxy写成http://127.0.0.1:8080因localhost与127.0.0.1在某些系统DNS解析不同导致跨域失败。4.2 核心功能演示与二次开发指引演示一后台新增景点并前台实时展示1. 后台登录访问http://localhost:8081/#/admin/login账号admin密码123456。2. 进入景点管理 → 添加景点填写- 名称南宫山国家森林公园- 地址安康市岚皋县南宫山镇- 经度108.923456纬度32.456789- 区域选择“安康市-岚皋县”三级联动自动填充- 门票全票¥80学生票¥40库存10003. 点击提交返回列表页新景点出现在第一条。4. 前台访问http://localhost:8081首页轮播图下方“热门景点”区域新景点已显示点击进入详情页可查看地图定位——整个过程无需重启任何服务数据实时同步。演示二游客注册、收藏、下单全流程1. 前台点击“注册”填写手机号13800138000密码123456完成注册并登录。2. 浏览“瀛湖风景区”点击“收藏”按钮右上角收藏图标变红数量1。3. 进入“旅游线路”选择“安康三日游”点击“立即预订”选择日期、人数提交订单。4. 后台登录进入“订单管理”找到该订单点击“审核通过”状态变为“已确认”。5. 游客前台“我的订单”中该订单状态更新为“已确认”并显示预计出发时间——订单状态变更通过WebSocket推送src/plugins/websocket.js实现非传统轮询演示效果更惊艳。二次开发指引快速扩展“民宿预订”模块若想增加新功能按以下步骤1.数据库在db.sql末尾添加inn民宿表字段包括id,name,address,price,contact_phone,scenic_id外键关联景点。2.后端新建Inn.java实体类、InnMapper.java接口、InnMapper.xml映射文件编写InnController.java提供/inn/list、/inn/detail接口。3.前端在src/views/home/下新建InnList.vue调用api/inn.js的getInnList()用v-for渲染民宿列表。4.关联在景点详情页ScenicDetail.vue中添加inn-list :scenic-idscenic.id/inn-list组件实现“查看周边民宿”功能。整个过程不超过2小时且不影响原有功能这就是模块化设计的价值。4.3 论文撰写与答辩材料准备技巧论文.doc不是模板填充而是紧扣系统亮点撰写的学术文档摘要部分突出“地域性”与“实用性”如“本文设计并实现了一套面向安康本地文旅资源的Web服务平台系统深度融合安康市下辖10县1区的地理信息与特产数据解决了本地旅游信息分散、游客获取渠道单一的问题”。系统设计章节用ER图src/doc/er-diagram.png展示scenic_spot与region的1:N关系用类图src/doc/class-diagram.png说明ScenicSpot与ScenicTicket的聚合关系避免纯文字描述。测试章节附上Postman导出的test-collection.json资源包已提供包含20个核心接口的测试用例如GET /api/scenic/list?regionId123返回状态码200且数据条数≥5。答辩PPT首页放系统首页截图“安康旅游服务平台”Logo第二页用流程图展示“游客下单→后台审核→短信通知”全流程第三页重点讲一个你修改过的功能点如“我优化了轮播图管理支持拖拽排序代码在AdminCarousel.vue第88行”展现真实动手能力。实操心得答辩时老师最爱问“你遇到的最大困难是什么怎么解决的”。建议准备一个真实案例比如“最初轮播图图片上传后无法显示排查发现是Nginx未配置location /upload/静态资源映射后来改用Spring Boot内置静态资源路径spring.web.resources.static-locationsclasspath:/static/,file:D:/ankang/upload/解决”。这种问题解决路径的叙述比空谈“系统性能优越”更有说服力。5. 常见问题与排查技巧实录那些深夜调试时的救命锦囊5.1 启动失败类问题速查表现象可能原因排查步骤解决方案IDEA运行AnkangApplication报java.lang.ClassNotFoundException: org.springframework.boot.SpringApplicationMaven依赖未下载完整查看Maven工具窗口点击Reload project检查pom.xml中parent是否正确引用Spring Boot父POM删除~/.m2/repository/org/springframework/boot/目录重新Reload控制台输出Failed to configure a DataSourceapplication.yml中数据库配置错误检查spring.datasource.url是否包含?useUnicodetrue等参数确认MySQL服务已启动在MySQL命令行执行mysql -u root -p若连不上则重启MySQL服务前端npm run serve后页面空白控制台报Uncaught SyntaxError: Unexpected token 前端请求被重定向到HTML检查vue.config.js中devServer.proxy是否指向http://localhost:8080且后端已启动确保后端AnkangApplication正在运行再启动前端5.2 功能异常类问题深度解析问题后台新增景点后前台轮播图不显示新景点图片-根因分析轮播图图片存储在D:/ankang/upload/目录但application.yml中file.upload-path配置为D:/ankang/upload/而前端请求图片URL为/upload/xxx.jpg需Spring Boot将/upload/**路径映射到该目录。-验证方法直接浏览器访问http://localhost:8080/upload/20230501123456_瀛湖.jpg若返回图片则配置正确若404则检查WebMvcConfig.java中addResourceHandlers方法是否注册了registry.addResourceHandler(/upload/**).addResourceLocations(file:uploadPath);。-解决方案确认WebMvcConfig.java存在且uploadPath变量值与application.yml一致若使用Linux系统将file:D:/ankang/upload/改为file:/home/ankang/upload/。问题游客登录后“我的收藏”列表为空但数据库favorite表有数据-根因分析FavoriteController.java中getMyFavorites()方法使用AuthenticationPrincipal User user获取当前用户但User实体未实现UserDetails接口导致AuthenticationPrincipal无法解析。-验证方法在getMyFavorites()方法开头添加System.out.println(Current user: user);若打印null则确认问题。-解决方案检查com.ankang.security.UserDetailsServiceImpl.java是否实现UserDetailsService并在loadUserByUsername方法中返回org.springframework.security.core.userdetails.User对象非自定义User类或改用SecurityContextHolder.getContext().getAuthentication().getPrincipal()手动获取。问题订单支付成功后后台订单状态未更新为“已支付”-根因分析支付回调接口/api/pay/callback未配置白名单IP支付宝/微信沙箱环境回调时被Spring Security拦截。-验证方法在PayController.java的callback()方法中添加日志log.info(Callback received from: {}, request.getRemoteAddr());查看回调来源IP是否在白名单内。-解决方案在SecurityConfig.java中http.authorizeRequests()添加.antMatchers(/api/pay/callback).permitAll()并确保/api/pay/callback为POST请求。5.3 性能与安全加固建议提升答辩分数SQL注入防护所有MyBatis查询均使用#{}而非${}如select idgetScenicById resultTypeScenicSpot SELECT * FROM scenic_spot WHERE id #{id} /select。若需动态表名极少见用Param(tableName) String tableName传参并在Java层校验tableName.matches(^[a-zA-Z][a-zA-Z0-9_]*$)。XSS防护前端所有用户输入内容评论、留言在展示前用DOMPurify.sanitize(html)过滤src/utils/dom-purify.js已集成该库。敏感信息加密数据库中user.password字段存储BCrypt加密后的密文BCryptPasswordEncoder.encode(123456)application.yml中spring.security.user.password未明文暴露。接口防刷LoginController.java中login()方法添加RateLimiter(limit 5, timeout 60)注解基于Guava RateLimiter限制同一IP每分钟最多5次登录尝试。最后分享一个小技巧答辩前夜用手机浏览器访问http://你的电脑IP:8081如http://192.168.1.100:8081让老师用手机扫码查看系统比投影仪更清晰。记得提前关闭电脑防火墙或在Windows防火墙中允许java.exe通过专用网络。这个细节能让老师眼前一亮——毕竟一个能用手机流畅访问的毕设比一堆PPT截图更有说服力。本文还有配套的精品资源点击获取简介直接可运行的安康旅游网站毕业设计项目包含前后端完整代码、数据库建表脚本db.sql、毕业论文论文.doc和部署说明文档。后端用SpringBoot 2.x MyBatis JDK 1.8构建支持管理员与普通游客两种角色前端基于Vue 2.x ElementUI Layui适配PC与移动端界面简洁交互流畅。功能覆盖景点浏览、酒店查询、特产展示、旅游线路推荐四大核心模块用户能注册登录、收藏内容、预约服务、在线购票、发表评论、查看公告、管理轮播图后台提供游客信息管理、省市区三级区域维护、订单审核、留言回复、系统参数配置等运维能力。项目已在IDEA和Eclipse中实测通过MySQL兼容5.5及以上版本代码结构清晰、关键逻辑配有中文注释适合本科毕设快速上手、演示或二次开发。本文还有配套的精品资源点击获取