资讯动态

智能旅游推荐系统Python毕设:Flask+Vue+MySQL部署改造全指南

发布时间:2026/10/13 20:28:02 来源:尧图企业网站定制
简介面向Python毕业设计的智能旅游推荐系统项目包涵盖完整的前端页面、后端逻辑与数据库脚本适合高校学生用于毕业设计、课程设计或Python综合实战练习也方便开发者快速复用。压缩包共797个文件约20.19MB文件类型以JavaScript、HTML、CSS、Vue组件等支撑前端交互界面以Python源码和pyc文件完成后端业务处理并包含SQL数据库脚本、启动脚本、安装脚本及说明文档目录结构清晰便于按模块查阅。项目具备旅游信息展示、智能线路推荐、用户管理等功能界面友好、操作简洁所有代码均经过严格调试可在PyCharm等环境下顺利运行数据库采用MySQL并附有Navicat相关配置从环境配置到项目启动均有配套说明可有效降低上手门槛。目前已有133人学习研究对希望通过完整项目理解前后端协作、掌握Web系统开发流程的读者来说是一份高价值的实战参考。1. 智能旅游推荐系统源码一份能跑起来的 Python 毕业设计长什么样每年答辩季都会有人花几小时下载一个 python 毕业设计源码包结果一运行就飘红最后只能对着导师说“我回去再调调”。这份基于 Python 的智能旅游推荐系统是我拆过的毕设包里结构比较规整的一套前端页面、Python 后端、MySQL 数据库脚本、一键启动脚本全都在压缩包里前后端分离的代码也保留得很完整。它解决的是旅游信息展示、景点推荐、后台管理这一整条业务闭环界面上有首页推荐、景点列表、登录注册和后台管理菜单适合拿来做 Python 课程设计、毕业设计或者想快速搭一个“推荐系统”演示项目的同学直接二次开发。这套源码最大的价值不在“代码本身多优雅”而在它是真跑得通这在这个品类里本身就够稀缺了。2. 先拆包再动手技术栈、文件结构与一次推荐请求的完整链路2.1 前后端分离的目录结构别被一堆 .bak 后缀吓到打开压缩包先别急着点运行先把文件目录过一遍。这套项目里你会看到大量.vue.bak文件比如IndexMain.vue.bak、IndexAsideStatic.vue.bak、BreadCrumbs.vue.bak、IndexHeader.vue.bak还有index.html.bak和update-password.vue.bak。很多人第一次看到 .bak 会以为这是损坏文件或者病毒残留其实不是它只是作者改版前留下的备份。文件 / 脚本在项目里的角色实际作用index.html.bak前端入口备份浏览器加载的起点SPA 挂载根节点IndexMain.vue.bak后台主布局后台管理页的整体框架包含侧边栏、顶栏、内容区IndexAsideStatic.vue.bak侧边栏菜单后台导航菜单景点管理、用户管理、订单管理入口IndexHeader.vue.bak顶栏组件当前用户信息、退出登录按钮BreadCrumbs.vue.bak面包屑导航显示当前页面层级位置方便返update-password.vue.bak功能页面用户修改密码的业务表单安装.bat/运行.bat一键脚本首次安装依赖、日常启动服务2-run.bat/3-build.bat构建脚本启动后端服务 / 前端打包从这套文件能判断出来管理后台是基于 Vue 组件化开发的.vue 文件把页面拆成了主布局、侧边栏、顶栏、面包屑这些独立模块互不干扰。前端的静态页面构建好之后由 Python 后端统一托管所以你最后访问的是一个地址而不是前端一个端口、后端一个端口分开跑。这里的 .bak 备份文件还提示了一个重要信息这份源码在前一版遇到过问题作者改动后把旧文件留作对照。我建议你先不要删它们等系统跑通之后再清理。2.2 一次推荐请求从点击到出数据经过了哪些环节这套系统的核心业务是“智能旅游推荐”你得先搞清楚一次推荐数据是怎么从数据库里捞出来、最终渲染到页面上的否则答辩时只能背代码。典型的请求链路是这样用户打开首页前端 Vue 组件加载向 Python 后端发起GET /api/recommend请求。后端路由函数接收请求建立 PyMySQL 数据库连接。执行 SQL 查询从scenic_spot景点表里取数据按热度、评分或城市条件排序。查询结果组装成 JSON 数组返回给前端。前端拿到 JSON 后用 Vue 的v-for渲染成景点卡片展示在推荐区域。这个链路里最容易被忽略掉的是数据库那一步。很多人以为“推荐系统”一定有什么算法模型实际上这套项目里的推荐核心是 SQL 查询加排序规则它根据景点评分、访问热度、城市匹配来给用户推结果。这并不丢人很多商业系统的第一版也是这么做的。你先把这个请求链路在纸上画一遍再去看代码就会发现app.py或main.py里的路由函数无非就是“连接数据库、执行 SQL、返回 JSON”这三件事整个后端的复杂度远比你想象的低。2.3 技术选型为什么这样组合Flask Vue MySQL 的适用边界摘要里写得很清楚后台框架是 Python建议 3.7数据库是 MySQL前端是 HTML 配合 Vue 组件。这组搭配在毕设项目里出现频率极高因为它每一环都有现成的资料遇到问题搜索到的解决方案最多。Python 3.7 是生态兼容性最好的版本基本所有第三方库都能装上MySQL 承担数据持久化行业里最通用的关系型数据库Vue 负责页面交互组件拆分后代码好写也好看。这组技术栈的边界你也得心里有数。如果导师要求“分布式架构”“高并发场景”这套组合就不合适了——单机部署、MySQL 单库、前端服务由后端托管撑不起大流量。但如果只是课程设计、毕业设计或者个人作品演示它的开发和运维成本是最低的。选型理由在答辩时是必问题你要讲清楚“为什么不用 Django”“为什么要选 MySQL 而不是 SQLite”Django 虽然自带 Admin 后台但对前端模板的控制不够灵活前后端分离时 Flask 更轻路由自己定义JSON 返回更直接SQLite 虽然零配置但并发写入能力和数据管理体验都不如 MySQL而且 Navicat 可视化操作 MySQL 非常方便调试效率高。3. 部署全流程Pycharm、MySQL、Navicat 四步把项目跑起来3.1 环境准备版本选对了后面一半的坑都不会踩我这个项目拆得多了最大的感受是毕设源码跑不起来十次有八次是环境版本问题。这套系统建议用的 Python 版本是 3.7不要一上来装最新的 3.12因为部分依赖库的编译版本没跟上会报一些莫名其妙的错误。MySQL 建议 5.7 或 8.0 都行Navicat 用来导入数据库脚本和可视化查数据开发工具用 Pycharm社区版就够。组件建议版本说明Python3.7.x依赖库兼容性最好避免 3.10MySQL5.7 / 8.0两者都试过8.0 注意认证插件选 mysql_native_passwordNavicat15 / 16导入 SQL 脚本、查看表数据最方便Pycharm社区版即可不需要专业版打开项目、跑 Python 文件足够装好之后打开 Pycharm把项目文件夹拖进去先别急着点运行。在右下角解释器设置里给这个项目单独配一个虚拟环境Python 版本选 3.7。这个习惯能救你很多次——很多人图省事直接用全局解释器结果把系统环境搞得一团糟项目之间依赖互相污染。独立虚拟环境是毕设项目的第一条后悔药路径后面装多少包都不影响你电脑上其他项目。3.2 导入数据库脚本建库、运行 SQL、改连接配置三件事环境配好之后第一件事不是写代码而是把数据库建起来。项目压缩包里应该带有.sql数据库脚本用 Navicat 打开你的 MySQL 连接右键新建数据库库名建议直接叫travel_db字符集选utf8mb4。为什么不用utf8因为utf8mb4才能完整支持 Emoji 和特殊字符景点简介里偶尔会带一些特殊符号用utf8存进去就可能报错。选中新建的数据库右键运行 SQL 文件选择包内的.sql脚本点击开始等待底部提示执行成功。然后双击打开数据库看表是否都建出来了。景点表、用户表、订单表、收藏表这几张核心表应该都在。建表语句大概长这样-- 景点信息表项目里最常见的核心表结构 CREATE TABLE scenic_spot ( id int NOT NULL AUTO_INCREMENT COMMENT 景点ID, name varchar(50) NOT NULL COMMENT 景点名称, city varchar(20) DEFAULT NULL COMMENT 所在城市, type varchar(20) DEFAULT NULL COMMENT 景点类型自然/人文/主题乐园, price decimal(8,2) DEFAULT 0.00 COMMENT 门票价格, score decimal(3,1) DEFAULT 0.0 COMMENT 评分推荐排序用, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT景点信息表;表建好之后去项目里找数据库连接配置文件常见的位置是config.py或者app.py顶部。你需要把里面的数据库名、用户名、密码改成你自己的否则后端连不上库# config.py —— 数据库连接参数和 Navicat 里的保持一致 DB_CONFIG { host: 127.0.0.1, # MySQL 地址本地就写 127.0.0.1 port: 3306, # MySQL 默认端口 user: root, # 你的 MySQL 用户名 password: 123456, # 改成你自己的 MySQL 密码 database: travel_db, # 和 Navicat 里建的库名一致 charset: utf8mb4 # 字符集不要改成 utf8 }这里最容易翻车的是密码不一致。你在 Navicat 里能连上不代表 Python 能连上——Python 读的是配置文件里的密码不是 Navicat 记住的密码。三个东西必须对齐MySQL 服务里真实的 root 密码、Navicat 连接里填的密码、config.py里写的密码。任何一处不一样启动时都会报Access denied。3.3 后端启动依赖安装和 Pycharm 运行数据库就绪后回到 Pycharm。项目通常自带requirements.txt如果没有就手动安装核心依赖 flask、flask-cors、pymysql 这三个多数这种结构的毕设后端都跑在这三个库上。我一般习惯用国内镜像源安装速度快得多不会卡在下载阶段# 使用清华镜像源安装依赖等价于双击“安装.bat”做的事情 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 如果没有 requirements.txt就逐个装 pip install flask2.2.5 flask-cors pymysql1.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple为什么 flask 建议锁 2.2.5 而不是直接装最新版因为 Flask 2.x 对 Python 3.7 的支持最稳定新版本 3.x 对 Python 版本有更高要求在 3.7 上可能直接不允许安装。pymysql 锁 1.0.2 也是同理。这种“锁版本”的写法看起来保守但在跑别人源码时就是最省事的。依赖装完找到入口文件一般是app.py右键点击运行。控制台出现类似下面这种输出就说明启动成功了* Serving Flask app app * Debug mode: on * Running on http://127.0.0.1:8080然后浏览器打开http://127.0.0.1:8080首页能出图就说明整套链路是通的。你的前端构建产物被 Flask 托管在static目录或templates目录下所以不用单独开前端服务。3.4 前端构建与一键脚本安装.bat、运行.bat、2-run.bat、3-build.bat 到底谁先谁后压缩包里那四个 .bat 脚本很多人不知道先后顺序。按我的经验首次部署的正确顺序是先双击安装.bat装依赖然后双击3-build.bat构建前端最后用2-run.bat或运行.bat启动服务。如果代码没有被改动过运行.bat一条就够了。# 3-build.bat 等价的手动操作进入前端目录构建产物到 dist cd frontend || cd web # 实际目录名以项目里为准 npm install # 安装前端依赖首次运行必需 npm run build # 构建输出 dist 目录这里有个坑要提醒你如果直接双击运行.bat发现页面出来但没有样式大概率是前端没有构建Flask 托管的是空的 index.html 或者旧文件。先跑3-build.bat生成最新前端产物再启动后端页面才会正常。批处理脚本在后台做了什么你看不见但它的逻辑本质上就是“装依赖 起服务”手动执行一遍能帮你定位到具体是哪一步出了问题。4. 常见问题排查五个让毕设源码翻车的坑逐个给解法4.1 双击运行.bat 后窗口一闪而过什么都没有现象双击运行.bat黑色命令行窗口闪了一下就消失了网页也打不开。原因脚本执行出错但因为批处理没有加pause窗口在出错后直接关闭错误信息根本没机会展示。这种情况通常是依赖没装全、Python 不在 PATH 环境变量里或者端口被占用。解决不要直接双击在命令行里手动执行启动命令。比如python app.py这样报错信息会停留在屏幕上。如果是端口被占用把配置里的8080改成8081再试如果是python命令识别不了说明 Python 3.7 没有加入 PATH到安装目录里勾选“Add Python to PATH”重装一遍。4.2 ModuleNotFoundError: No module named flask现象Pycharm 里运行app.py控制台第一行就是ModuleNotFoundError: No module named flask。原因看一下 Pycharm 右下角你用的是什么解释器。如果你在命令行里用pip install flask装到了系统 Python但 Pycharm 里选的是虚拟环境解释器两边是隔离的互不可见。这是我见过最多的低级别翻车纯属环境指向问题。解决在 Pycharm 的设置里确认项目解释器是哪个然后点击 Terminal 面板确认命令行前缀里出现了你的虚拟环境目录名再重新执行pip install flask。装完之后在代码里import flask不再飘红那就对了。4.3 pymysql.err.OperationalError: (1045, Access denied for user rootlocalhost)现象后端一启动就报 1045 错误提示用户访问被拒绝。原因config.py里的用户名或密码和 MySQL 实际的不一致。注意 MySQL 也有自己的用户表root密码如果在安装 MySQL 时设置是123456那你 Navicat 里填的、配置里写的都得是123456不能顺手写成root或者其他值。解决打开 Navicat看当前连接能否正常工作能正常说明 Navicat 记住了正确密码去config.py里改成 Navicat 连接属性里显示的那个密码。改完重启后端不要热更新加载旧配置。4.4 pymysql.err.OperationalError: (1049, Unknown database travel_db)现象数据库用户名密码都对了但报 1049提示找不到名为travel_db的数据库。原因你的 MySQL 服务里根本没有建这个库或者建的库名拼写和配置里不一致。这个错误最常见的原因不是没建库而是建库用了别的名字比如travel、traveldb配置里写travel_db就差一个下划线就匹配不上。解决在 Navicat 左侧导航树里确认数据库列表如果有库但名字不一样改成和配置完全一致的如果压根没有按 3.2 的步骤新建库并重新导入.sql脚本。这里有个细节导入 SQL 文件时先选中目标库再点右键运行如果没选中直接执行表可能被建到了默认库里。4.5 页面能打开但接口请求全部 404 或 500现象浏览器能打开登录页但登录时报接口请求失败或者接口返回 500控制台一堆 Python 堆栈。原因404 基本是两种一种是你访问的前端页面和 Flask 路由前缀对不上比如前端请求/api/login而 Flask 路由只写了/login另一种是前端构建产物里请求的是别的端口。500 一般就是 SQL 语句执行报错比如表名、字段名和代码里写的不一致。解决按 F12 打开浏览器开发者工具切到 Network 面板重新操作一次看到底哪个请求失败、请求 URL 是什么。然后去后端代码里搜这个 URL 路径改到一致。如果是 500看控制台最后一段报错找到 SQL 关键字去数据库里执行一遍这条 SQL多半是字段名拼写问题。5. 把毕设改成你自己的推荐算法替换、前端改造与答辩前自检5.1 推荐算法升级从“按评分排序”到“基于内容相似度”这套系统自带的推荐逻辑本质是排序——按评分、热度、城市来筛。如果你在答辩时想多说点东西可以把它升级成基于内容的推荐给每个景点提取特征向量包括是否海滨、是否人文古迹、消费档位、是否适合亲子然后计算用户当前浏览景点和其他景点之间的余弦相似度把最相似的前 N 个推荐出来。这个算法在数学上不复杂但要能讲清楚原理代码量也不大import math def cos_sim(vec_a, vec_b): 余弦相似度两个特征向量夹角越小值越接近 1表示越相似 dot sum(x * y for x, y in zip(vec_a, vec_b)) norm_a math.sqrt(sum(x ** 2 for x in vec_a)) norm_b math.sqrt(sum(x ** 2 for x in vec_b)) if norm_a 0 or norm_b 0: return 0 return dot / (norm_a * norm_b) # 四个维度依次为是否海滨、是否人文古迹、消费档位(0低1高)、是否适合亲子 feature_map { 鼓浪屿: [1, 0, 1, 1], 故宫: [0, 1, 1, 1], 西湖: [0, 1, 0, 1], } print(cos_sim(feature_map[鼓浪屿], feature_map[西湖])) # 输出一个 0~1 的相似度分值你把这段逻辑封装成一个函数在原来推荐接口里调用score DESC的 SQL 排序就变成了业务层计算后的重新排序。可以人工核对一下鼓浪屿和西湖同为适合亲子的海滨/水域景区相似度应该明显高于鼓浪屿和故宫这样差异大的组合。5.2 前端页面改造把模板换成自己的校名和配色前端这块不用重写只改几个关键位置就能让整套系统看起来像是你自己的作品。主布局在IndexMain.vue.bak里页面顶部是IndexHeader顶栏左侧是IndexAsideStatic侧边栏菜单中间内容区通过router-view切换页面// IndexMain.vue 主布局改造点替换顶栏标题、侧边栏菜单项 template div classlayout-wrapper IndexHeader :title智慧旅游推荐系统 logouthandleLogout / IndexAsideStatic :menusmenus / div classmain-content BreadCrumbs :pathscurrentPaths / router-view / /div /div /template把:title里的字符串改成你的毕业设计题目把menus数组里的菜单名从“景点管理”改成你想要的模块名称再找到首页的轮播图和推荐卡片区域换几张你自己的景点图片整套系统的辨识度立刻就不一样了。记住一个原则只改数据不轻易改结构除非你想给自己挖坑。5.3 答辩前自检清单四件事比代码跑通更重要代码跑通了只是起点答辩时导师看的是你的理解和掌控力。我每次给学生检查毕设都会过一遍这个自检表检查项操作通过标准数据库演示在 Navicat 里改一条景点评分刷新页面页面数据跟着变化核心链路讲解从首页点击到推荐结果出现逐步解释能说出每次请求经过的路由和 SQL异常场景提问在数据库里删掉一个景点再访问页面不崩溃能处理空数据增删改查演示在后台管理里新增一个景点并展示写入成功且列表实时更新导师最爱问的一句话是“你这个推荐系统推荐逻辑是什么”你直接回答“基于景点评分和城市匹配的 SQL 排序并且我做了内容相似度计算的升级”然后现场改一行城市条件给他看数据变化这一关就稳了。最怕的就是只会点鼠标代码一问三不知——你把这几个接口的 SQL 背下来比准备任何 PPT 都有用。我在带学生做毕设时有个习惯拿到任何一套源码先花十分钟确认三件事——入口文件是哪个、数据库脚本在哪个目录、配置文件改哪里。这三个位置确认完项目基本就稳了一半另一半就是部署时踩坑填坑。以上这些坑几乎每届学生都会踩一遍所以我把它们整理成了这份排查清单希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑