news 2026/9/26 11:23:31

智慧乡村旅游小程序毕设:SSM+微信小程序+MySQL全栈搭建指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
智慧乡村旅游小程序毕设:SSM+微信小程序+MySQL全栈搭建指南

简介:面向计算机专业毕业设计的智慧乡村旅游服务平台小程序资源包,基于微信小程序、SSM 框架与 MySQL 数据库构建,涵盖管理员、用户、商家三类角色,完整覆盖旅游景点管理、路线规划、订单处理、我的收藏、账户充值、购物车、我的订单等前后台核心功能。包内共 895 个文件,压缩后约 40.48MB;以 vue/java/js 源码为主体,包含大量前端页面组件与后端业务类,同时配有图片与图标素材、JSON/XML 配置文件、SQL 数据库初始化脚本,以及毕业论文文档和 MP4 演示录屏,还提供安装、运行、构建的 bat 脚本,便于快速启动整套项目。目前已有 313 人学习下载,适合需要毕业设计参考、小程序全栈实践或希望基于 SSM 框架进行二次开发的读者。压缩包内文件按源码、数据库、论文与视频分类归档,论文覆盖系统分析、可行性分析、功能设计与数据库设计,能直接对照源码梳理完整实现链路,是一份可用于课程设计或毕业设计的完整蓝本。

1. 智慧乡村旅游小程序:一套SSM+微信小程序的毕设方案值不值得做

毕业季打开选题库,你很可能刷到过“智慧乡村旅游服务平台小程序”这类题目:前端是微信小程序,后端是SSM(Spring+SpringMVC+MyBatis),数据库是MySql。它比单纯的后台管理系统多了一个“小程序端”的移动场景,对于想体现完整项目的毕设来说,能覆盖注册登录、景点展示、民宿/特产下单、管理员维护数据这条完整业务链。你搜“微信小程序+ssm+mysql源码”时看到的那些项目包,通常还带数据库脚本、毕业论文和视频演示——这套组合能不能落到你手里跑起来,才是关键。适作者包括准备Java毕业设计的在校生、想给学生做课设案例的指导老师,以及想快速上手SSM+小程序协作的初学者。

2. 功能与数据库设计:先拆模块再建表,10张表撑起乡村旅游平台

2.1 业务闭环拆解:游客、商家、管理员三个角色各要什么

拿到“智慧乡村旅游服务平台”这个题目,第一件事不是打开IDE,而是把用例画清楚。我一般先按角色拆需求:游客,也就是正在某个乡村景区玩的人,他要能浏览景点列表、查看景点详情和图文介绍,能看到民宿和特产,能下订单,能在个人中心看到自己的历史订单。为了体现“智慧”,还可以加一个“智能路线推荐”,实现方式可以朴素:按景点热度排序,配上用户收藏记录推荐。游客登录用微信小程序授权登录,后端用SSM完成session和token管理。

商家,就是录入民宿/特产的运营人员,他需要发布商品或房源、修改库存、查看订单、处理订单状态。在毕设答辩里,商家和管理员权限经常合并到“后台管理端”,你只需要做两种角色:普通用户(游客)和管理员,管理员往下兼任商家功能。管理员是后台系统的核心,负责维护景点分类、轮播图、订单审核、评论删除、数据统计。数据统计别贪多,完成“每日订单量、各订单状态占比、本月营业额”三个小图表就够了。

把业务闭环画出来后,后台接口的数量就清楚了:用户登录、景点列表、景点详情、民宿列表、特产列表、订单创建、订单列表、订单状态更新、评论提交、管理端CRUD。对应到SSM后端,大约十个Controller,这个工作量对毕设来说刚好,不空也不至于做不完。

2.2 数据库表怎么建:核心表结构、字段类型与索引这样设

我通常建议用10张表左右支撑这个平台,表太多答辩说不清,太少又显得模块不完整。核心表是这样一组:用户表(t_user)、管理员表(t_admin)、景点分类表(t_category)、景点表(t_scenic)、民宿表(t_hotel)、特产表(t_goods)、订单表(t_order)、订单明细表(t_order_item)、评论表(t_comment)、轮播图表(t_banner)。下面给一张核心订单表的建表SQL,其它表按同样的设计习惯来:

CREATE DATABASE IF NOT EXISTS rural_travel DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE rural_travel; CREATE TABLE t_order ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单id', order_no VARCHAR(32) NOT NULL COMMENT '订单编号,业务上全局唯一', user_id INT NOT NULL COMMENT '下单用户id,关联t_user.id', hotel_id INT DEFAULT NULL COMMENT '关联民宿id,预订民宿时使用', goods_id INT DEFAULT NULL COMMENT '关联特产id,购买特产时使用', goods_count INT DEFAULT 1 COMMENT '购买数量,民宿订单填1', total_price DECIMAL(10,2) NOT NULL COMMENT '订单总金额,单位元', status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0待付款 1已付款 2已完成 3已取消', create_time DATETIME NOT NULL COMMENT '下单时间', pay_time DATETIME DEFAULT NULL COMMENT '支付时间', remark VARCHAR(255) DEFAULT NULL COMMENT '用户备注', INDEX idx_user (user_id), INDEX idx_status (status), UNIQUE KEY uk_order_no (order_no) ) ENGINE=InnoDB COMMENT '订单表';

这段SQL里有几个参数是毕设演示时的关键点:字符集采用utf8mb4而不是utf8,因为用户评论里可能出现生僻字和Emoji,utf8存4字节字符会报错;引擎用InnoDB,保证订单表和订单明细表能跨表查事务;状态字段status用TINYINT而不是String,枚举值在Java里定义常量,前端用数字映射文字,这样排序和统计都省事。order_no用唯一键约束,业务上生成规则一般是用时间戳加随机数或UUID短串,保证演示时连续下单不冲突。

t_user表里字段不一定要存openid,你可以把openid放t_user表,但注意openid是第三方标识,不要把它当主键;主键用自增id,openid加唯一索引。t_scenic表记得留image_url和content(长文本)字段,景点详情页要展示多图中的首图,后台富文本编辑器发出来的HTML片段就存在content里。t_goods表需要stock字段,下单时先查库存再扣减,演示时可以让库存为0的特产显示“已售罄”,这是一个很加分的细节。

2.3 MySQL初始化:字符集、时区、root连接串的常见配置

数据库导到你电脑上时,如果只有.sql脚本,你要先在本地跑通MySQL再导入。第一步是安装MySQL,这个过程经常成为毕设第一道坎。我一般建议装MySQL 8.0,安装时选utf8mb4默认字符集,root密码记牢,端口用默认的3306,如果你电脑上已经装了5.7,也完全能用,只是连接驱动和SQL语法略有差异。

导入脚本最常见的方式是命令行:

mysql -u root -p < rural_travel.sql

如果提示ERROR 2002 (HY000): Can't connect to local MySQL server through socket ...,说明MySQL服务没启动,Linux上用systemctl start mysqld,Windows上去服务管理器启动。另一个高频问题是时区:在MySQL连接串后加serverTimezone=Asia/Shanghai,否则JDBC连接时8.0驱动会报The server time zone value '�й���ʱ��' is unrecognized,这个报错很折磨人,看到乱码别慌,就是时区没对上。字符集和时区属于MySQL安装配置教程里最容易被跳过的两行,但这两行能解决一半的连接类报错。

3. SSM后端搭建:Spring+SpringMVC+MyBatis的最小可运行工程

3.1 为什么这个毕业设计还用SSM而不是Spring Boot

很多拿到源码的人第一句话是:怎么不用Spring Boot?原因很现实:不少学校毕设题目模板还停留在SSM,教学大纲也把SpringMVC+MyBatis当作考查点。SSM的配置方式虽然繁琐,但配置即学习,你在web.xml里能看到请求是怎么进DispatcherServlet的,在applicationContext.xml里能看到Bean是怎么被管理的,答辩时每一个组件都能讲出“为什么在这”。SSM框架的黄金时代虽然过去,但对做课设/毕设的人来说,它比Spring Boot更接近“手写框架”的底层逻辑,导师问起原理,你能答得上。

这不是说SSM更好,而是这个题目语境下SSM足够。它没有Spring Boot的自动配置,所以每一步都需要显式声明,新手出问题时反而容易通过报错堆栈定位。真正需要注意的边界是:SSM工程需要外置Tomcat运行,pom.xml里多包版本容易冲突,这也是下一小节要解决的。

3.2 三个核心配置:web.xml、applicationContext.xml、mybatis-config.xml

搭建SSM工程时,web.xml是入口,它负责加载Spring容器和DispatcherServlet:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

关键参数有两个:load-on-startup设成1,让DispatcherServlet随容器启动初始化,避免第一次请求时才开始加载SpringMVC;<url-pattern>/</url-pattern>把所有请求交给SpringMVC处理,但.jsp和静态资源也要放行,否则/images/xx.jpg会被DispatcherServlet拦截,导致图片加载不出来。常见做法是把静态资源映射单独加在springmvc.xml中。

applicationContext.xml中最重要的就是数据源和SqlSessionFactory:

<context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="initialPoolSize" value="5"/> <property name="maxPoolSize" value="20"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:com/rural/mapper/*.xml"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <mybatis:scan base-package="com.rural.dao"/>

C3P0连接池的参数按毕设体量调成initialPoolSize=5、maxPoolSize=20足够,别写成几百,浪费内存不说,答辩时被问“为什么是这个值”你会不好答。mybatis:scan是MyBatis-Spring提供的扫描标签,它会自动把com.rural.dao下的接口代理成Mapper。

mybatis-config.xml则放一些通用配置,最重要的是开启驼峰映射:

<configuration> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <package name="com.rural.pojo"/> </typeAliases> </configuration>

mapUnderscoreToCamelCase设为true后,数据库字段user_id能自动映射到Java属性userId,不用再写一堆resultMap。如果你从源码里看到这个配置被删了,几乎可以断定查询普遍为null。

3.3 一个景点接口的完整链路:Controller → Service → Mapper XML

看源码最快的路径不是从头读,而是挑一个最小接口从浏览器的URL一路追到SQL。我用“景点列表”这个接口说明链路长什么样。Controller层:

@Controller @RequestMapping("/api/scenic") public class ScenicController { @Autowired private ScenicService scenicService; @RequestMapping(value = "/list", method = RequestMethod.GET) @ResponseBody public Result list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize) { PageResult<Scenic> data = scenicService.pageQuery(page, pageSize); return Result.success(data); } }

Controller上的@ResponseBody让返回的Java对象通过Jackson序列化成JSON。注意@RequestParam(defaultValue = "1"),如果不加默认值,小程序端请求/api/scenic/list不带page时会报400,很多前端错误就是这么来的。

Service层负责事务和分页逻辑,最简单的是用PageHelper:

@Service public class ScenicServiceImpl implements ScenicService { @Autowired private ScenicMapper scenicMapper; @Override public PageResult<Scenic> pageQuery(Integer page, Integer pageSize) { PageHelper.startPage(page, pageSize); List<Scenic> list = scenicMapper.selectList(); PageInfo<Scenic> pageInfo = new PageInfo<>(list); return PageResult.build(pageInfo); } }

PageHelper是SSM搭配MyBatis时最常用的分页插件,PageHelper.startPage(page, pageSize)后面必须紧跟第一条查询语句,中间不能插别的逻辑,这是它作为拦截器生效的规则。

Mapper接口和XML:

public interface ScenicMapper { List<Scenic> selectList(); }
<mapper namespace="com.rural.dao.ScenicMapper"> <select id="selectList" resultType="com.rural.pojo.Scenic"> SELECT id, scenic_name, image_url, address, hot_level, description FROM t_scenic ORDER BY hot_level DESC </select> </mapper>

resultType写实体类的全限定名,前提是mybatis-config.xml里配置了typeAliases,否则就要写全名。这里有个细节:查询字段列表和数据库真实字段必须一致,哪怕少一个description,Javabean对应属性就是null。反过来多查一个不存在的字段,MyBatis倒不会报错,只是浪费一点IO。

3.4 Maven依赖版本匹配:别让不同版本的包各说各话

SSM最经典的坑是版本冲突。spring-beans如果是5.x,spring-webmvc却拉到4.x,运行时会报各种奇怪的ClassNotFoundException。我给毕设项目固定一个骨架版本族:

<properties> <spring.version>5.1.9.RELEASE</spring.version> <mybatis.version>3.5.3</mybatis.version> <mybatis-spring.version>2.0.3</mybatis-spring.version> <mysql.version>8.0.19</mysql.version> </properties>

Spring各模块统一用同一个版本;MyBatis和MyBatis-Spring要按官方对应列表选,mybatis-spring 2.0.x要求MyBatis 3.5+;MySQL驱动用mysql-connector-java的8.0.x,配合MySQL 8.0数据库。另外javax.servlet-api建议用provided作用域,打包时不会把Tomcat自带的servlet-api打进去,否则部署到Tomcat可能冲突。

依赖管理是SSM的黑匣子之一,排错的通用办法是看启动日志第一条异常里有没有“Caused by”,这个才是真正出问题的依赖。查看依赖树可以用mvn dependency:tree,如果看到两个不同版本的spring-core,那就是传递依赖打架了,用<exclusions>排除旧版本即可。

4. 微信小程序端:登录、请求封装与首页渲染

4.1 wx.login换token:小程序登录的正确姿势

智慧乡村旅游服务平台的微信小程序端,第一步就是登录。很多人把wx.login得到的code直接当登录凭证用,其实code有效期5分钟且只能换一次,拿它直接当token是毕设答辩时的常见败笔。正确流程是:

login() { wx.login({ provider: 'weixin', success: (res) => { if (res.code) { wx.request({ url: `${apiBase}/api/user/login`, method: 'POST', data: { code: res.code }, success: (r) => { const token = r.data.data.token; wx.setStorageSync('token', token); } }); } } }); }

后端拿到code后调微信的jscode2session接口,得到openid和session_key,用openid查用户表,不存在则自动注册,存在就直接登录。为了安全,不要把小程序的session_key返回给前端,而是后端生成一个自己的token(比如UUID),存到Redis或数据库里。

我在毕设里见过最简单的token方案就是把它写进用户表的token字段,请求时前端带上,后端查表比对。演示时够用,也不用过度设计。关键是wx.request的header要带上Authorization: token,没有带的话后端拦截器会直接401,前端就卡在首页加载不出来。

4.2 封装request.js:baseURL、状态码、带参上传统一处理

小程序每个页面都调wx.request会写大量重复代码,而且不好统一处理登录过期。我习惯在utils/request.js里封装一层:

const BASE_URL = 'http://localhost:8080/rural-server'; function request(options) { return new Promise((resolve, reject) => { wx.request({ url: BASE_URL + options.url, method: options.method || 'GET', data: options.data || {}, header: { 'Content-Type': 'application/json', 'Authorization': wx.getStorageSync('token') || '' }, success: (res) => { const code = res.data.code; if (code === 401) { wx.removeStorageSync('token'); wx.navigateTo({ url: '/pages/login/login' }); reject(new Error('登录过期')); } else if (code === 0 || code === 200) { resolve(res.data.data); } else { wx.showToast({ title: res.data.msg || '请求失败', icon: 'none' }); reject(new Error(res.data.msg)); } }, fail: (err) => { wx.showToast({ title: '网络异常', icon: 'none' }); reject(err); } }); }); } module.exports = { request, BASE_URL };

BASE_URL在开发时可以填http://localhost:8080,但真机上不能填localhost,要填电脑的局域网IP,比如http://192.168.1.100:8080/rural-server。这里还有微信小程序的硬规则:正式版小程序要求请求域名必须配置到小程序管理后台的合法域名里,而且不支持IP、不支持HTTP明文;只有在开发者工具勾选“不校验合法域名”才能跳过。毕设演示一般用开发者工具跑,这个问题不大,但要提前知道它存在。

关于请求状态码,我建议后端返回结构统一成{code: 0, msg: "成功", data: ...},code为0表示成功。小程序端把它和HTTP状态码解耦,这样后端报错时能更有效地拿到msg并展示给用户。

4.3 首页列表渲染:图片域名、自定义导航栏和富文本的三个坑

首页往往是这个小程序的门面,最容易出问题的三个点分别是图片、顶部导航栏、富文本。图片问题通常来自后台录入的图片URL是相对路径或外域地址,小程序端image组件的src必须用完整URL且要求图片域名在downloadFile合法域名中(开发者工具可跳过)。最好的做法是后台存相对路径,前端拼接BASE_URL + path。

顶部导航栏高度是另一个高频报错来源:机型不同,状态栏高度不同,自定义导航栏时如果写死navigationStyle: custom后顶部留白不足,内容会刘海屏遮挡。我一般用wx.getSystemInfoSync()获取statusBarHeight,再用胶囊按钮位置动态算导航栏高度,而不是写死44px。

富文本详情页,小程序端的rich-text组件对后台传来的HTML支持有限,style里的部分CSS不生效,图片可能无法自适应。如果后端用的是UEditor之类生成HTML,我通常让后台只存纯文本和图片地址,前端用rich-text渲染纯文本内容,图片单独用image组件加载并开启mode="widthFix",这样图片宽度不会溢出。

5. 避坑手册:联调阶段最容易翻车的5个现场

SSM加小程序这套组合,出问题的高发区其实非常固定。下面五条是我在多个毕设项目里反复见到、也亲手修过的血泪现场,每一条都按“现象→原因→解决”的顺序写,你对照着排错,比漫无边际地改代码快得多。

5.1 MySQL 8.0连接报Public Key Retrieval is not allowed

现象:按照网上教程配好jdbc.properties后,后端启动报SQLNonTransientConnectionException,提示Public Key Retrieval is not allowed。页面所有接口都500,后台日志只有这一条。

原因:MySQL 8.0默认身份认证插件是caching_sha2_password,JDBC连接时客户端如果没有allowPublicKeyRetrieval=true,服务端不能通过非加密连接发送公钥。这不是你密码错了,而是连接协议没协商好。

解决:在jdbc连接串中显式加两个参数:useSSL=false和allowPublicKeyRetrieval=true。完整一行是jdbc:mysql://localhost:3306/rural_travel?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai。注意allowPublicKeyRetrieval在公网环境有安全风险,本地毕设无妨,但答辩时如果被问到,能说出“仅用于本地开发展示”这句话就够了。如果你用的是新下载的MySQL Community Server 8.0,也可以把用户改回mysql_native_password插件,但不建议动它,加参数更干净。

5.2 真机请求失败但开发者工具正常:域名合法性和TLS版本

现象:开发者工具里所有接口正常,一到真机预览,所有请求request:fail,后台甚至没有收到请求。

原因:微信小程序真机环境强制校验request合法域名。开发者工具默认勾选了“不校验合法域名”,能访问http://192.168.x.x:8080,真机不行。即便你配置了合法域名,后端必须是HTTPS并且SSL证书有效,且不能是自签名证书。

解决:三条路。第一条,演示用开发者工具,这是最稳的,但要提前在工具里勾选“不校验合法域名”。第二条,把后端部署到带HTTPS的云服务器并配置备案域名,这对毕设成本高不推荐。第三条,用内网穿透把本机HTTP映射成临时HTTPS域名,再把临时域名加入小程序后台的request合法域名,演示完立即关闭,别一直挂着。不管哪条,都要知道演示前一小时把所有域名和端口测一遍,别临上台改配置。我的习惯是开发者工具演示为主,手机截图放论文为辅,真机不是毕设必须。

5.3 查询返回null但数据库有记录:驼峰映射没开

现象:列表接口返回的JSON中所有下划线字段对应属性都是null,比如order_no变成orderNo属性是null。字段少还不会报错,看起来就是某个值丢了。

原因:MyBatis默认映射是列名和Java属性名严格相等,order_no不能直接匹配orderNo。这个坑在SSM框架中非常经典,因为Java规范用驼峰,MySQL命名习惯用下划线。

解决:打开mybatis-config.xml,在<settings>里加<setting name="mapUnderscoreToCamelCase" value="true"/>。同时确认实体类的userId、orderNo这些字段名和JavaBean规范一致。另一个隐蔽点是:如果你在resultMap里手写了映射,驼峰配置在某些情况下会被resultMap覆盖,所以尽量别在一个项目里混用两种映射方式。源码拿回来后第一步就检查这里,能节省半天查错时间。

5.4 日期格式变成一串带T和Z:Jackson时区和格式配置

现象:接口返回JSON中日期是2024-06-01T12:00:00.000+00:00,前端时间控件显示英文和UTC时间,与本地时间差8小时。

原因:SpringMVC默认由Jackson序列化Date,Jackson默认输出ISO-8601格式,且时区用的是UTC。数据库里create_time存DATETIME没问题,但序列化时没按北京时间格式化。

解决:一种方案是在实体类的createTime字段上加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8"),一劳永逸。另一种在springmvc.xml里配置全局Jackson的ObjectMapper,设置dateFormat为yyyy-MM-dd HH:mm:ss、timeZone为Asia/Shanghai。我一般推荐全局配置,这样所有Date字段统一格式,不会出现有的接口格式化、有的没格式化。另外,如果前端需要传日期到后端,建议前端传字符串,后端用@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")接收。这个坑属于“不报错但不正常”类,答辩前最好把每个接口的返回JSON都过一眼,别让评委看到乱码般的日期。

5.5 演示视频录到一半token过期:token过期与静默续期

现象:演示功能时前十分钟一切正常,突然点击下单就跳回登录页,重新登录后历史数据还在,但演示流程断了。

原因:后端把token过期时间设为2小时或30分钟,而毕设答辩很可能提前登录过,或者演示时间拉长。如果后端在单次会话里直接让token失效且前端没有续期逻辑,就会这样。

解决:在request.js的success回调里,遇到code === 401时不直接跳登录页,而是先调用一次静默登录,拿到新token后重试原请求。代码大致如下:

if (code === 401) { silentLogin().then(() => { request(options).then(resolve).catch(reject); }).catch(() => { wx.navigateTo({ url: '/pages/login/login' }); }); return; }

这样即使token过期,用户只会感觉稍等半秒,业务流程不中断。同时建议把后端token有效期设为24小时,对本地演示足够;如果使用JWT,注意服务端时钟不能偏差过大,否则签发和校验都对不上。演示视频录制前,重新登录一次、重启后端,让所有环境处于“新鲜”状态,这个习惯能避免大量临场问题。

6. 让毕设从能跑到能答辩:验证技巧、演示脚本与论文配图习惯

6.1 用Postman做一轮完整接口预演,答辩前心里有底

别等答辩当天才用手点页面,强烈建议提前把核心接口按业务流程在Postman里存成一个Collection。顺序是:管理员登录、维护景点、游客登录、查看列表、提交订单、更新状态。每个请求记录下预期返回值和实际返回截图,这张表直接可以作为“系统测试”章节的素材。Postman里环境变量把baseUrl配好,从笔记本搬到台式机也能一键切环境。

6.2 演示视频录制顺序:先跑业务,再讲代码亮点

演示视频一般5到8分钟。我惯用的顺序是:先打开小程序,从游客视角走一遍“浏览景点→查看民宿→下单特产→查看订单”,中间把鼠标停留2秒,让评委看清每个页面;然后切换到后台管理端展示数据变化,特别要展示新增一个景点后小程序端马上能看到。讲代码时挑2个亮点:一个是登录token流程,一个是订单事务。不要通读源码,评委想听的亮点是“你如何解决了一个问题”。

6.3 论文里的三张关键图:ER图、系统架构图、时序图

论文里最容易被扣分的点是图太少。至少要画三张图:数据库ER图(用PowerDesigner或Navicat生成后调整布局)、系统架构图(小程序端→SpringMVC→Service→MyBatis→MySQL)、典型业务时序图(以登录或下单为例)。时序图我习惯用Visio或draw.io画,画完放到“系统设计”一章,答辩时点着图讲,逻辑会清晰很多。

我自己的血泪经验是:答辩前一周把所有功能按真实业务走三遍,录屏存好,再准备一份关键报错的排查笔记。很多同学栽在“明明演示了一遍没问题”,结果答辩当天数据库服务没启动,第一眼就失去了好感。记住:把你的后端启动命令、数据库导入命令、小程序AppID切换方法写进README,让下一个打开你电脑的人也能五分钟跑起来。希望帮到你,祝你的智慧乡村旅游小程序顺利通过答辩。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 11:22:20

Atlas 300V 24G推理卡部署YOLO实战:从模型转换到性能优化

1. Atlas 300V 24G到底算什么卡&#xff0c;先说大方向Atlas 300V 24G这名字&#xff0c;放在做AI部署的圈子里&#xff0c;基本等同于一个很多人都在问的问题&#xff1a;国产推理卡到底好不好用&#xff1f;我见过不少项目组把这卡和某知名推理卡放在同一张采购对比表里&…

作者头像 李华
网站建设 2026/9/26 11:22:15

在线SPC质量分析系统落地:控制图、判异规则与Python实现

简介&#xff1a;面向制造企业质量管理的在线统计过程控制&#xff08;SPC&#xff09;毕业设计&#xff0c;提供一套可运行的产品质量在线分析系统。系统围绕控制图绘制、过程稳定性判定和异常报警展开&#xff0c;涵盖数据采集、统计分析与可视化界面&#xff0c;适用于需要学…

作者头像 李华
网站建设 2026/9/26 11:21:48

基于YOLOv8的智慧果园避障割草机器人毕设资源解析

简介&#xff1a;一份基于YOLOv8的智慧果园避障割草机器人项目&#xff0c;适合计算机视觉、人工智能方向的毕业设计或课程设计。资源已通过运行测试&#xff0c;包含完整源码、训练好的pt权重、可视化交互界面、完整数据集与部署说明&#xff0c;简单部署即可运行&#xff0c;…

作者头像 李华
网站建设 2026/9/26 11:21:20

农业AI毕业设计实战:小样本水稻病害识别与轻量化部署

简介&#xff1a;本资源是一套完整的农作物病虫害智能识别毕业设计项目&#xff0c;面向计算机、农林信息化及人工智能方向的本科生与初学者&#xff0c;解决农业场景中病害图像分类与模型部署的实际问题。压缩包共56个文件&#xff0c;包含15张示例PNG图像、9个Jupyter Notebo…

作者头像 李华
网站建设 2026/9/26 11:20:52

JEV实战:桥接PostgreSQL与RAG,提升AI Agent召回率

1. 从一次深夜调试说起&#xff1a;JEV 到底解决了什么问题第一次听到 JEV 这个词&#xff0c;是在一个做 AI Agent 项目的朋友群里。当时有人甩了一张截图&#xff0c;说“这个 JEV 把我们的 RAG 召回率从 62% 拉到了 89%”&#xff0c;群里瞬间炸了锅。我当时的反应是&#x…

作者头像 李华