现在做网站建设挣钱吗,织梦网站怎么建设,珠海网站建设兼职,中国早期互联网公司毕业设计实战#xff1a;基于SpringBootVue的旅游推荐系统#xff0c;从需求到实现全流程拆解#xff0c;附避坑指南#xff01;
谁懂啊#xff01;当初做旅游推荐系统毕设时#xff0c;光协同过滤推荐算法和景点关联就卡了我半个月——一开始算…毕业设计实战基于SpringBootVue的旅游推荐系统从需求到实现全流程拆解附避坑指南谁懂啊当初做旅游推荐系统毕设时光协同过滤推荐算法和景点关联就卡了我半个月——一开始算法没调好结果推荐的景点全是冷门地导师直接让我重新设计推荐逻辑 今天把从需求分析到功能实现的全流程经验分享出来跟着做就能轻松搞定毕设一、先搞懂旅游推荐系统要做什么需求分析是关键刚开始我跳过需求分析就写代码花三周做了个深度学习推荐模型结果导师一句核心是景点管理、路线规划、用户互动不是复杂算法直接打回重改1. 核心用户功能拆解实战总结版旅游推荐系统有三类核心用户管理员、普通用户功能要区分清楚管理员端系统管理景点管理审核景点信息名称、类型、门票、图片、设置景点推荐等级路线管理设计旅游路线景点组合、预算估算、最佳时间、管理路线分类用户管理管理用户账号、查看用户收藏记录、分析用户偏好内容管理发布公告、审核论坛帖子、回复用户留言数据统计景点热度分析、用户活跃度统计、推荐效果评估普通用户端核心功能景点浏览查看景点列表按类型/热度/评分筛选、查看景点详情图片、门票、评价路线推荐获取个性化旅游路线推荐、查看路线详情景点列表、预算、时间安排互动功能收藏景点/路线、发布景点留言/路线留言、参与论坛讨论个性化推荐基于用户浏览历史和收藏记录推荐相关景点和路线个人中心管理收藏记录、查看浏览历史、修改个人信息2. 需求分析避坑指南血泪教训别闭门造车找喜欢旅游的同学测试提意见有同学说想看到路线的时间安排我才加了路线行程表功能一定要画用例图用DrawIO画用户-收藏景点系统-个性化推荐等核心用例写需求规格文档约束条件要写清楚“景点图片必须上传”“路线预算要合理”“推荐算法要可解释”3. 可行性分析要专业导师最爱问可行吗从3个角度回答技术可行SpringBootVueMySQL推荐算法技术栈成熟经济可行开发工具全免费地图API可用免费额度操作可行界面参考马蜂窝/携程用户上手快二、技术选型别追新实用最重要刚开始我用Spark机器学习库结果部署复杂本地都跑不起来 后来换成SpringBootVue2MySQL简单推荐算法真香1. 技术栈对比附避坑提醒技术工具为什么选它避坑提醒SpringBoot 2.7快速开发集成方便别用3.0生态还不完善Vue 2生态成熟Element UI好用别用Vue 3组合式API增加复杂度Element UI旅游类组件丰富卡片、轮播图按需引入控制包大小MySQL 8.0关系型数据存储稳定一定要设计好表关联推荐算法协同过滤简单实现别用太复杂的算法毕设够用就行ECharts数据可视化展示用于展示旅游数据统计2. 开发环境搭建# 后端spring init --dependenciesweb,mybatis,mysql,lombok travel-recommend# 前端vue create travel-frontendcdtravel-frontend vueaddelementnpminstallaxios vue-router vuex echarts3. 架构图要画答辩加分用DrawIO画前后端分离推荐引擎架构前端Vue Element UI ECharts后端SpringBoot MyBatis推荐模块基于内容的推荐 协同过滤数据层MySQL Redis缓存用户行为三、数据库设计推荐算法的基础这部分是推荐系统的核心我当初用户行为表设计不合理推荐效果很差。1. 核心实体ER图核心表设计用户表userid、用户名、头像、联系方式、旅游偏好标签景点表attractionid、名称、类型、图片、门票、地址、评分、描述旅游路线表routeid、名称、类型、预算、适合季节、行程天数、包含景点收藏表collectionid、用户ID、收藏对象ID、收藏类型景点/路线、收藏时间浏览记录表browse_historyid、用户ID、浏览对象ID、浏览类型、浏览时长、浏览时间留言表commentid、用户ID、对象ID、留言类型、内容、评分、时间用户偏好表user_preferenceid、用户ID、偏好标签如自然风光、历史遗迹、美食、权重2. 建表SQL示例关键表-- 景点表核心表CREATETABLEattraction(idintNOTNULLAUTO_INCREMENT,namevarchar(100)NOTNULLCOMMENT景点名称,typeintNOTNULLCOMMENT景点类型1-自然风光2-历史遗迹3-城市地标4-主题公园,imagevarchar(500)DEFAULTNULLCOMMENT景点图片JSON数组,ticket_pricedecimal(10,2)DEFAULTNULLCOMMENT门票价格,addressvarchar(200)DEFAULTNULLCOMMENT地址,provincevarchar(50)DEFAULTNULLCOMMENT省份,cityvarchar(50)DEFAULTNULLCOMMENT城市,latitudedecimal(10,6)DEFAULTNULLCOMMENT纬度,longitudedecimal(10,6)DEFAULTNULLCOMMENT经度,descriptiontextCOMMENT景点描述,open_timevarchar(100)DEFAULTNULLCOMMENT开放时间,best_seasonvarchar(50)DEFAULTNULLCOMMENT最佳季节,visit_durationintDEFAULTNULLCOMMENT建议游览时长小时,popularityintDEFAULT0COMMENT热度基于浏览、收藏计算,average_scoredecimal(3,2)DEFAULT0.00COMMENT平均评分,statusintDEFAULT1COMMENT状态1-正常0-下架,create_timedatetimeDEFAULTCURRENT_TIMESTAMP,update_timedatetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(id),KEYidx_type(type),KEYidx_city(city),KEYidx_popularity(popularity),KEYidx_score(average_score))ENGINEInnoDBDEFAULTCHARSETutf8mb4;-- 旅游路线表推荐核心CREATETABLEtravel_route(idintNOTNULLAUTO_INCREMENT,namevarchar(100)NOTNULLCOMMENT路线名称,typeintNOTNULLCOMMENT路线类型1-经典线路2-深度游3-亲子游4-背包客,budgetdecimal(10,2)NOTNULLCOMMENT预算估算,daysintNOTNULLCOMMENT行程天数,suitable_seasonvarchar(100)DEFAULTNULLCOMMENT适合季节,cover_imagevarchar(200)DEFAULTNULLCOMMENT封面图,descriptiontextCOMMENT路线描述,attraction_idsvarchar(500)NOTNULLCOMMENT包含景点IDJSON数组,attraction_namesvarchar(1000)DEFAULTNULLCOMMENT包含景点名称用于展示,day_plantextCOMMENT每日行程安排JSON,view_countintDEFAULT0COMMENT浏览次数,collect_countintDEFAULT0COMMENT收藏次数,average_scoredecimal(3,2)DEFAULT0.00COMMENT平均评分,statusintDEFAULT1COMMENT状态1-正常0-下架,create_timedatetimeDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id),KEYidx_type(type),KEYidx_days(days),KEYidx_budget(budget))ENGINEInnoDBDEFAULTCHARSETutf8mb4;-- 用户行为表推荐算法基础CREATETABLEuser_behavior(idintNOTNULLAUTO_INCREMENT,user_idintNOTNULLCOMMENT用户ID,item_idintNOTNULLCOMMENT项目ID景点或路线,item_typeintNOTNULLCOMMENT项目类型1-景点2-路线,behavior_typeintNOTNULLCOMMENT行为类型1-浏览2-收藏3-评论4-评分,behavior_valuedecimal(3,2)DEFAULTNULLCOMMENT行为值如评分,durationintDEFAULTNULLCOMMENT停留时长秒,behavior_timedatetimeNOTNULLCOMMENT行为时间,create_timedatetimeDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id),KEYidx_user_item(user_id,item_id,item_type),KEYidx_user_behavior(user_id,behavior_type),KEYidx_item_behavior(item_id,item_type,behavior_type),KEYidx_time(behavior_time),CONSTRAINTfk_behavior_userFOREIGNKEY(user_id)REFERENCESuser(id))ENGINEInnoDBDEFAULTCHARSETutf8mb4;-- 收藏表用户偏好分析CREATETABLEcollection(idintNOTNULLAUTO_INCREMENT,user_idintNOTNULLCOMMENT用户ID,item_idintNOTNULLCOMMENT收藏项目ID,item_typeintNOTNULLCOMMENT收藏类型1-景点2-路线,collection_timedatetimeNOTNULLCOMMENT收藏时间,create_timedatetimeDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id),UNIQUEKEYuk_user_item(user_id,item_id,item_type),KEYidx_user(user_id),KEYidx_item(item_id,item_type),CONSTRAINTfk_collection_userFOREIGNKEY(user_id)REFERENCESuser(id))ENGINEInnoDBDEFAULTCHARSETutf8mb4;3. 推荐算法设计毕设够用版方案一简单版基于热度的推荐-- 热门景点推荐按收藏数评分SELECTa.*,(a.popularity*0.6a.average_score*100*0.4)asrecommend_scoreFROMattraction aWHEREa.status1ORDERBYrecommend_scoreDESCLIMIT10;方案二进阶版基于内容的推荐// 根据用户收藏的景点类型推荐相似景点publicListAttractioncontentBasedRecommend(IntegeruserId){// 1. 获取用户收藏的景点ListIntegercollectedAttractionIdscollectionMapper.selectCollectedAttractions(userId);// 2. 分析用户偏好类型MapInteger,IntegertypePreferencesnewHashMap();for(IntegerattractionId:collectedAttractionIds){AttractionattractionattractionMapper.selectById(attractionId);typePreferences.merge(attraction.getType(),1,Integer::sum);}// 3. 按偏好类型推荐排除已收藏的ListIntegerpreferredTypestypePreferences.entrySet().stream().sorted(Map.Entry.Integer,IntegercomparingByValue().reversed()).map(Map.Entry::getKey).collect(Collectors.toList());returnattractionMapper.selectRecommendByTypes(preferredTypes,collectedAttractionIds,10);}方案三高级版协同过滤推荐// 基于用户的协同过滤简化版publicListAttractioncollaborativeFilteringRecommend(IntegeruserId){// 1. 找到相似用户收藏了相同景点ListIntegersimilarUserIdscollectionMapper.findSimilarUsers(userId,5);// 2. 获取相似用户收藏但当前用户未收藏的景点ListIntegercollectedAttractionIdscollectionMapper.selectCollectedAttractions(userId);// 3. 计算推荐分数基于相似用户的收藏数MapInteger,IntegerattractionScoresnewHashMap();for(IntegersimilarUserId:similarUserIds){ListIntegersimilarUserCollectionscollectionMapper.selectCollectedAttractions(similarUserId);for(IntegerattractionId:similarUserCollections){if(!collectedAttractionIds.contains(attractionId)){attractionScores.merge(attractionId,1,Integer::sum);}}}// 4. 按分数排序返回returnattractionScores.entrySet().stream().sorted(Map.Entry.Integer,IntegercomparingByValue().reversed()).limit(10).map(entry-attractionMapper.selectById(entry.getKey())).collect(Collectors.toList());}四、功能实现核心模块详解1. 个性化推荐模块必做亮点推荐策略组合新用户热门推荐 地域推荐老用户协同过滤 基于内容推荐实时推荐基于当前浏览记录实现代码示例ServicepublicclassRecommendationService{AutowiredprivateAttractionMapperattractionMapper;AutowiredprivateCollectionMappercollectionMapper;AutowiredprivateUserBehaviorMapperuserBehaviorMapper;// 综合推荐入口publicListAttractiongetRecommendations(IntegeruserId,Stringcity){ListAttractionrecommendationsnewArrayList();// 检查用户是否有行为记录booleanhasBehavioruserBehaviorMapper.hasUserBehavior(userId);if(!hasBehavior){// 新用户推荐热门 同城recommendations.addAll(getPopularRecommendations(city,5));recommendations.addAll(getLocalRecommendations(city,5));}else{// 老用户推荐协同过滤 基于内容recommendations.addAll(getCollaborativeFilteringRecommendations(userId,6));recommendations.addAll(getContentBasedRecommendations(userId,4));}// 去重并返回returnrecommendations.stream().distinct().limit(10).collect(Collectors.toList());}// 热门推荐privateListAttractiongetPopularRecommendations(Stringcity,intlimit){returnattractionMapper.selectPopularByCity(city,limit);}// 同城推荐privateListAttractiongetLocalRecommendations(Stringcity,intlimit){returnattractionMapper.selectByCity(city,limit);}// 更多推荐方法...}2. 旅游路线规划模块核心功能路线生成逻辑用户选择兴趣点自然风光、美食、购物等系统推荐匹配的景点根据地理位置和开放时间智能排序生成合理的行程安排和预算估算路线详情数据结构{id:1,name:北京经典三日游,days:3,budget:1500.00,dayPlan:[{day:1,title:皇家园林之旅,attractions:[{id:1,name:故宫,duration:4,time:09:00-13:00},{id:2,name:景山公园,duration:2,time:14:00-16:00}],transport:地铁1号线,tips:故宫需提前预约}]}3. 景点详情展示模块功能要点图片轮播展示基本信息门票、开放时间、地址地图位置展示集成百度/高德地图用户评价和评分相关推荐相似景点、组合路线前端实现template div classattraction-detail !-- 图片轮播 -- el-carousel :interval4000 typecard height400px el-carousel-item v-for(img, index) in attraction.images :keyindex img :srcimg classcarousel-image / /el-carousel-item /el-carousel !-- 基本信息 -- div classbasic-info h1{{ attraction.name }}/h1 div classtags el-tag typesuccess{{ attraction.typeName }}/el-tag el-tag v-ifattraction.ticketPrice 0门票¥{{ attraction.ticketPrice }}/el-tag el-tag v-else typeinfo免费/el-tag /div !-- 收藏按钮 -- el-button :typeisCollected ? danger : default clicktoggleCollection iconel-icon-star {{ isCollected ? 已收藏 : 收藏 }} /el-button /div !-- 地图位置 -- div classmap-section h3位置信息/h3 div idmap-container styleheight: 300px;/div /div !-- 相关推荐 -- div classrecommendations h3猜你喜欢/h3 attraction-list :attractionsrelatedAttractions / /div /div /template4. 用户行为分析模块行为收集// 用户行为埋点PostMapping(/trackBehavior)publicResulttrackBehavior(RequestBodyUserBehaviorDTOdto){UserBehaviorbehaviornewUserBehavior();behavior.setUserId(dto.getUserId());behavior.setItemId(dto.getItemId());behavior.setItemType(dto.getItemType());behavior.setBehaviorType(dto.getBehaviorType());behavior.setBehaviorValue(dto.getValue());behavior.setDuration(dto.getDuration());behavior.setBehaviorTime(newDate());userBehaviorMapper.insert(behavior);// 实时更新景点热度if(dto.getItemType()1){// 景点attractionMapper.incrementPopularity(dto.getItemId());}returnResult.success(行为记录成功);}五、前端页面设计要点1. 首页设计搜索框支持景点/路线搜索支持城市筛选轮播图推荐热门景点和路线推荐区域个性化推荐卡片展示分类导航按景点类型快速筛选2. 景点列表页筛选器按类型、门票价格、评分、距离筛选排序默认按热度支持按评分、价格排序展示模式列表模式/网格模式切换分页加载滚动加载更多3. 路线推荐页路线筛选按天数、预算、适合人群筛选行程预览展示路线概览景点数量、总预算一键收藏收藏感兴趣的路线行程详情点击查看详细行程安排4. 个人中心页我的收藏景点收藏、路线收藏分开展示浏览历史最近浏览记录可清除推荐偏好展示系统分析的用户偏好标签个人信息头像、昵称、旅游偏好设置六、测试这些场景必须测1. 功能测试用例表1推荐功能测试测试场景操作步骤预期结果新用户访问新注册用户访问首页看到热门景点和本地推荐收藏后推荐用户收藏几个自然景点推荐更多自然类景点浏览行为影响用户浏览多个历史遗迹推荐相关历史景点表2路线规划测试测试场景操作步骤预期结果生成路线选择兴趣点生成路线路线包含相关景点时间安排合理路线收藏收藏一条路线在个人中心能看到收藏路线分享点击分享按钮生成分享链接或二维码2. 性能测试推荐响应时间推荐算法应在500ms内返回结果并发访问模拟100个用户同时访问景点详情页大数据量测试10000个景点数据时的查询性能3. 推荐效果评估加分项准确率推荐内容与用户实际兴趣的匹配度覆盖率推荐系统能覆盖多少景点/路线新颖性推荐的景点/路线是否多样七、部署与答辩准备1. 项目打包部署# 后端打包mvn clean package -DskipTests# 前端打包npmrun build# 部署# 1. 上传jar包和dist文件夹# 2. 导入SQL脚本含测试数据# 3. 启动后端服务# 4. 配置Nginx反向代理2. 答辩准备3个加分技巧演示流程要生动用户注册→设置偏好→查看个性化推荐浏览景点→收藏→查看推荐变化规划路线→查看行程安排重点讲技术亮点推荐算法的设计与实现展示算法逻辑图用户行为数据的收集与分析路线规划的智能算法准备常见问题Q推荐算法怎么实现的A采用混合推荐策略新用户用热门推荐老用户用协同过滤基于内容推荐Q如何保证推荐准确性A①收集用户行为数据 ②定期评估推荐效果 ③支持用户反馈Q系统如何扩展A①推荐算法可替换 ②支持插件化推荐策略 ③数据存储可分库分表八、毕设文档结构旅游推荐系统/ ├── 毕业论文.docx # 完整论文含算法章节 ├── 开题报告.docx # 研究背景、创新点 ├── 中期检查表.docx # 进度汇报 ├── 源码/ │ ├── backend/ # SpringBoot后端 │ ├── frontend/ # Vue前端 │ ├── algorithm/ # 推荐算法实现 │ └── database/ # 数据库脚本 ├── 演示视频.mp4 # 10分钟功能演示重点展示推荐 ├── 答辩PPT.pptx # 15分钟答辩展示 └── 算法说明文档.md # 推荐算法详细说明最后真心话时间旅游推荐系统是技术含量较高的毕设选题能很好展示你的算法能力和工程能力。关键是推荐算法要设计合理用户交互要友好数据可视化要做好。需要完整源码含推荐算法实现、数据库脚本含旅游测试数据、答辩PPT模板的同学评论区扣旅游推荐我发你。遇到具体技术问题比如推荐算法、地图集成也可以留言讨论这篇干货整理了我所有经验教训点赞收藏毕设路上不迷路祝大家顺利毕业️✨