ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

微信点餐小程序毕设:SSM+MySql最小闭环实战与避坑指南

微信点餐小程序毕设:SSM+MySql最小闭环实战与避坑指南 简介这份资源是面向高校计算机相关专业毕业设计场景的微信点餐小程序完整项目包采用微信小程序前端搭配Java SSM框架与MySQL数据库开发适合正在准备毕设或需要小程序全栈实战练习的学生参考。压缩包共915个文件约16.55MB涵盖134个java后端源码、102个vue管理端页面、114个js脚本、28个wxss与27个wxml小程序页面以及2个sql数据库脚本、3个doc文档和bat启动脚本等前后端与数据库结构齐全。资源内含开题报告、毕业论文与视频演示配合源码可完整还原选题分析、功能设计与数据库设计过程。系统区分管理员与用户两类角色管理员可管理用户、菜品、新上菜品、预定订单、活动信息、用户评价与系统订单用户端支持订购菜品、我的订单、我的收藏与评价菜品。目前已有252人学习适合需要完整赛题方案、论文素材与可运行代码的读者。1. 微信点餐小程序毕设一套能跑通答辩的 SSMMySql 最小闭环很多同学做微信点餐小程序毕业设计卡住的地方不是不会写代码而是不知道一套「能演示、能答辩、能交差」的系统到底要包含哪些东西。答辩老师不会看你写了几万行他只看三件事小程序能不能点菜下单、后台能不能改菜品和订单状态、数据库里数据是不是真的落库了。这套基于微信小程序SSMMySql 的方案核心就是把这三点串成一条最短闭环小程序端负责展示菜单和下单SSMSpringSpringMVCMyBatis后端提供接口MySql 存菜品、订单、用户三张核心表。它适合计算机、软件工程专业的本科毕设也适合基础一般、想两周内把系统跑起来再补论文的同学。下面我按「先跑通、再讲清、最后避坑」的顺序把每一步落到能抄的代码和参数上。2. 环境与工程骨架SSM 后端怎么搭才不返工2.1 为什么毕设选 SSM 而不是 SpringBoot先说选型。现在企业里新项目基本用 SpringBoot但毕设场景下 SSM 反而更稳原因有三个。第一SSM 的 XML 配置把「请求怎么进、对象怎么管、SQL 怎么映射」全摊在明面上答辩时老师问「你的请求是怎么到 Controller 的」你可以直接翻 spring-mvc.xml 指给他看SpringBoot 的自动配置反而说不清。第二网上 SSM 的现成模板多出问题搜得到SpringBoot 版本迭代快教程和你的版本对不上是常事。第三SSM 强制你手写 Mapper XMLSQL 能力能体现出来论文里「数据库设计」那一章有东西可写。常见做法是 Maven 多模块或者单模块毕设单模块就够别搞多模块给自己加难度。目录结构我一般这样分controller放接口service放业务mapper放 MyBatis 接口entity放实体resources/mapper放 XMLresources下放spring-*.xml和jdbc.properties。2.2 依赖与数据库连接配置先看pom.xml里必须有的依赖版本用稳定的即可别追最新。!-- Spring 核心 MVC -- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.3.20/version /dependency !-- MyBatis 与 Spring 整合 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.0.7/version /dependency !-- MySql 驱动8.x 用 com.mysql.cj.jdbc.Driver -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.28/version /dependency !-- 连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.8/version /dependency逻辑说明spring-webmvc提供 DispatcherServlet 和注解驱动mybatis-spring是把 SqlSession 交给 Spring 管理的关键没有它你就得自己管连接mysql-connector-java8.x 的驱动类名变了写错直接报ClassNotFoundException。参数上Druid 连接池的initialSize设 5、maxActive设 20 对毕设足够别设太大本地 MySql 扛不住。数据库连接写在jdbc.propertiesjdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/food_order?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse jdbc.usernameroot jdbc.password你的密码这里serverTimezone必须写不写 8.x 驱动会报时区错误useSSLfalse是本地开发省事生产别这么干。food_order是库名建库语句后面给。2.3 三张核心表与建表 SQL毕设别把表设计得太复杂菜品、订单、订单明细、用户四张表就能撑起整个点餐流程。下面是最小可用版本。CREATE TABLE dish ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL COMMENT 菜品名, price DECIMAL(10,2) NOT NULL COMMENT 价格, img VARCHAR(200) COMMENT 图片路径, category VARCHAR(20) COMMENT 分类, status TINYINT DEFAULT 1 COMMENT 1上架 0下架 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, total DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 0 COMMENT 0待接单 1制作中 2已完成, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE order_item ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, dish_id INT NOT NULL, num INT NOT NULL, price DECIMAL(10,2) NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;逻辑说明orders和order_item拆开是标准的一对多答辩时这是加分项说明你懂范式。price用DECIMAL不用FLOAT金额算错是毕设常见翻车点。status用TINYINT存状态码比存字符串省空间也好判断。注意create_time给了默认值插入时不用手动传。3. 小程序端到后端点餐下单接口怎么打通3.1 微信开发者工具里发起请求的正确姿势小程序端调后端核心就一个wx.request。但毕设最容易翻车的地方在这里开发者工具里要勾选「不校验合法域名」否则localhost请求直接被拦。真机预览时更麻烦手机访问不了你电脑的localhost得用局域网 IP比如http://192.168.1.100:8080。// pages/menu/menu.js Page({ data: { dishList: [] }, onLoad() { wx.request({ url: http://localhost:8080/dish/list, // 真机换成局域网IP method: GET, success: (res) { // 后端统一返回 {code:200, data:[...]} if (res.data.code 200) { this.setData({ dishList: res.data.data }); } }, fail: (err) { console.error(请求失败, err); // 先看这里多半是域名校验 } }); } });逻辑说明success里判断code是约定后端别直接返回数组统一包一层{code, msg, data}前端好处理。参数上method默认 GET下单要用 POST。fail回调一定要写console.error不然请求失败你连错在哪都看不到这是血泪经验。3.2 SSM 侧菜品列表与下单接口后端 Controller 用注解驱动RestController直接返回 JSON省得配视图解析器。RestController RequestMapping(/dish) public class DishController { Autowired private DishService dishService; GetMapping(/list) public MapString, Object list() { MapString, Object result new HashMap(); result.put(code, 200); result.put(data, dishService.listOnSale()); // 只查上架菜品 return result; } }逻辑说明RestControllerControllerResponseBody返回对象自动转 JSON前提是配了 Jackson 消息转换器spring-mvc.xml里开mvc:annotation-driven/就有。listOnSale在 Service 层调 MapperSQL 写在 XML 里where status 1下架菜品不展示。下单接口要处理事务这是答辩必问点。Service public class OrderServiceImpl implements OrderService { Autowired private OrderMapper orderMapper; Autowired private OrderItemMapper itemMapper; Transactional // 关键订单和明细要么都成功要么都回滚 public void createOrder(OrderDTO dto) { Orders order new Orders(); order.setUserId(dto.getUserId()); order.setTotal(dto.getTotal()); orderMapper.insert(order); // 插入后 MyBatis 回填自增 id for (OrderItem item : dto.getItems()) { item.setOrderId(order.getId()); // 用回填的订单 id itemMapper.insert(item); } } }逻辑说明Transactional保证订单主表和明细表一致中途报错全部回滚不然会出现「有订单没明细」的脏数据。参数上order.getId()能拿到值是因为 MyBatis 的insert useGeneratedKeystrue keyPropertyid配置这个不配就是 null明细全插不进去这是新手最常踩的坑。3.3 订单状态流转与后台管理后台管理端可以用简单的 JSP 或者另一个网页要能改订单状态。状态从 0 到 1 到 2每次改都走一个接口。PostMapping(/updateStatus) public MapString, Object updateStatus(RequestParam Integer orderId, RequestParam Integer status) { MapString, Object result new HashMap(); int rows orderService.updateStatus(orderId, status); result.put(code, rows 0 ? 200 : 500); return result; }逻辑说明RequestParam接收表单或 URL 参数前端传orderId和status即可。rows 0判断是否真的更新成功比直接返回 200 严谨。参数上 status 只允许 0/1/2Service 层最好加个校验防止前端乱传。4. 避坑与排查毕设跑不起来时先看这几条4.1 现象小程序请求报「不在以下 request 合法域名列表中」原因开发者工具默认校验域名localhost和 IP 都不在白名单。解决详情 → 本地设置 → 勾选「不校验合法域名、web-view、TLS 版本以及 HTTPS 证书」。真机调试时手机和电脑连同一个 WiFi把localhost换成电脑局域网 IPWindows 用ipconfig查Mac 用ifconfig。4.2 现象后端启动报「No qualifying bean of type xxxMapper」原因MyBatis 的 Mapper 接口没被扫描到Spring 不知道要生成代理对象。解决在spring-mybatis.xml里配mybatis:scan base-packagecom.xxx.mapper/或者用MapperScan注解。另外 XML 文件位置要在sqlSessionFactory的mapperLocations里配classpath:mapper/*.xml路径写错也会报找不到映射。4.3 现象插入订单后明细表 order_id 全是 null原因insert没配useGeneratedKeys和keyProperty主键没回填。解决改成insert idinsert useGeneratedKeystrue keyPropertyid。注意keyProperty要和实体类属性名一致实体里叫id就写id别写成orderId。4.4 现象中文菜品名存进数据库变成问号原因数据库、表、连接三处字符集不统一。解决建库用utf8mb4连接 URL 加characterEncodingutf8MySql 8.x 默认就是 utf8mb4但老版本要手动改。三处都对了才不会乱码只改一处没用。4.5 现象答辩演示时订单状态改了但列表没刷新原因小程序端onLoad只加载一次返回页面不会重新请求。解决把加载逻辑抽成loadOrders方法在onShow里调用而不是只在onLoad里调。onShow每次页面显示都触发从后台改完状态切回来就能看到最新数据。5. 从能跑到能答辩论文与演示的收尾技巧系统跑通只是及格线答辩要拿高分得让老师看到你「想过边界」。这里说几个我踩过坑之后总结的具体技巧。第一给接口加统一返回和异常处理。写一个GlobalExceptionHandler用ExceptionHandler捕获异常返回{code:500, msg:系统繁忙}别让前端看到一堆 Java 堆栈。答辩时老师问「如果下单失败前端怎么知道」你就有话说。第二数据库加索引。orders表的user_id和order_item的order_id加普通索引查询订单列表时能体现优化意识。论文「数据库优化」那一章直接写这个比空谈理论强。第三准备一份演示脚本。按「打开小程序 → 浏览菜单 → 加购物车 → 下单 → 后台改状态 → 小程序看到状态变化」走一遍全程不超过三分钟。演示前把数据库重置成干净数据别让老师看到一堆测试脏数据。第四论文里的「系统测试」章节别只写「功能正常」。列一个表格把每个接口的输入、预期输出、实际输出写清楚比如下单接口传空菜品列表应该返回错误提示。这种边界测试是加分项。测试项输入预期实际菜品列表无返回上架菜品一致下单正常菜品订单明细落库一致下单空列表返回参数错误一致改状态status3拒绝非法状态需补校验最后说个习惯我一般会在答辩前一天把整个系统在另一台电脑上从零部署一遍包括装 MySql、导数据、改 IP。这一步能暴露 90% 的环境问题比答辩当天手忙脚乱强。毕设这东西代码写得再花跑不起来就是零分稳比炫重要。希望帮到你。本文还有配套的精品资源点击获取
返回列表