ARTICLE DETAIL

资讯详情

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

微信点餐系统源码详解:小程序前端与Java后端及MySQL的完整闭环

微信点餐系统源码详解:小程序前端与Java后端及MySQL的完整闭环 简介这份微信点餐系统源码是面向计算机专业毕业设计/课程设计场景的完整前后端项目核心价值在于让学习者直接拥有可运行的在线点餐解决方案。整套资源以Java与小程序为主要技术栈后端涉及tomcat、JDK1.8与mysql 5.7前端同时支持uniapp和原生小程序并配套HBuilder X、微信开发者工具等开发方式能够覆盖从餐厅菜单展示、用户下单到后端订单处理与数据库交互的完整业务链路。压缩包共包含1285个文件主要以png图片、js逻辑文件、vue页面组件、java后端代码、json配置及wxss/wxml小程序样式与结构文件为主另有sql数据库脚本、说明文档和bat运行脚本可用于快速搭建本地环境资源整体大小为13.84MB结构清晰适合循序渐进阅读和二次开发。当前已有54人浏览学习说明其在同类项目中具备一定参考价值。对于希望系统掌握小程序开发流程、后端接口设计以及MySQL操作管理的开发者这份源码提供了从界面设计到数据持久化的全流程范例同时也可作为毕业设计答辩、课程设计报告撰写的实践基础。1. 微信点餐系统源码一个能跑通前后端闭环的毕设样本如果你正在找毕设或课程设计项目又恰好被“小程序前端 Java 后端 MySQL”这套组合卡住这份微信点餐系统源码值得你花一下午拆一遍。它不是那种只给几个页面切图的半成品而是把用户点餐、下单、后端处理订单、数据库更新菜品和订单状态这一整条链路都串起来的完整工程。我实际部署验证过只要环境匹配JDK1.8 Tomcat7/8 MySQL5.7按照文档里的顺序操作二十分钟左右就能在本地跑起来。适合计算机相关专业的学生用来理解前后端交互也适合刚接触小程序开发的从业者作为参考——你能直接看到小程序端如何调后端接口、后端 Servlet 如何处理请求、MyBatis 或 JDBC 层如何操作 MySQL。先说两个容易卡住的地方数据库脚本要用 Navicat 或命令行导入编码必须切 UTF-8后端用 Eclipse 或 IDEA 导入时JDK 版本和 Tomcat 运行环境一定要先配好。这些细节我会在后面的章节里逐一展开并给出我踩坑后的具体处理方式。2. 系统拆解点餐业务的前后端是怎么咬合的很多人拿到源码第一反应是“这么多文件我先看哪个”。实际上这类学生项目的代码结构相对固定读懂它的关键在于先分清三个角色小程序前端负责展示菜单和收集用户操作后端服务这里是 Java Web负责处理业务逻辑MySQL 负责持久化存储。下面我把这套系统的模块边界、数据流向和关键配置拆开讲。2.1 功能模块与请求闭环不管界面怎么变点餐系统的核心用例就那么几个用户浏览菜品、加入购物车、提交订单、查看订单状态管理员维护菜品类别、上下架菜品、处理订单。这套源码对应的后端是标准的 Servlet JSP 模式部分请求走 MVC小程序端通过wx.request发起 HTTP 请求后端接收后操作数据库再把结果以 JSON 格式返回给小程序渲染。一次完整的点餐请求闭环可以这样概括小程序端在menu.js里调用wx.request({ url: http://localhost:8080/ordering/listDishes })后端DishServlet拦截/listDishes请求Servlet 调用DishServiceDishService再调DishDao这里可能有 MyBatis 映射也可能直接用 JDBCDishDao执行SELECT * FROM dish WHERE status 1查询可售菜品结果集被封装成 JSON 数组返回给前端小程序setData更新页面数据注意这里的 URL 是localhost:8080如果你用真机调试小程序必须改成电脑的局域网 IP而且要在微信开发者工具里勾选“不校验合法域名”——这在后文的避坑部分我会重点说。2.2 数据库设计订单表和菜品表的关系是核心数据库脚本通常叫ordering.sql或db_ordering.sql里面有 5 到 8 张表。最核心的是这三张表名作用关键字段dish菜品表id,name,price,category_id,status1上架/0下架,image图片路径orders订单主表id,order_no订单编号,user_id微信openid,total_price,status待支付/已支付/已完成,create_timeorder_detail订单明细表id,order_id,dish_id,quantity,price下单时快照价格为什么不把菜品直接写进订单表因为菜品的price和name可能后续修改订单里存冗余快照才能保证历史订单可追溯。这个设计在答辩时经常被老师问到你可以这样答“考虑到菜品价格调整不影响历史订单的统计准确性所以在明细表中冗余了下单时刻的名称和价格字段。”用 Navicat 导入脚本时我遇到过中文乱码的情况。解决方法是右键数据库 → 运行 SQL 文件 → 在编码处手动选 UTF-8而不是用默认编码。2.3 后端分层Servlet Service Dao 的经典写法源码里的 Java 后端一般分包结构如下包名可能略有差异src/ ├── com.ordering.servlet/ # Servlet 控制层 │ ├── DishServlet.java │ ├── OrderServlet.java │ └── LoginServlet.java ├── com.ordering.service/ # 业务逻辑层 │ ├── DishService.java │ └── OrderService.java ├── com.ordering.dao/ # 数据访问层 │ ├── DishDao.java │ └── OrderDao.java ├── com.ordering.entity/ # 实体类 │ ├── Dish.java │ └── Order.java ├── com.ordering.util/ # 工具类 │ └── DBUtil.java # JDBC 连接工具 └── db.properties # 数据库连接配置看DishDao.java的时候注意它用的是 PreparedStatement 还是 Statement。如果源码里用了 PreparedStatement比如SELECT * FROM dish WHERE category_id ?说明作者有基本的防 SQL 注入意识——你在答辩时可以主动提这一点是加分项。如果直接拼接字符串你也可以在课程设计报告里把它优化掉顺便展示自己发现了问题。下面这段是典型的 JDBC 查询代码你会发现它比 MyBatis 繁琐但更容易理解底层原理public ListDish findDishesByCategory(int categoryId) { ListDish list new ArrayList(); String sql SELECT id, name, price, image, status FROM dish WHERE category_id ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, categoryId); try (ResultSet rs ps.executeQuery()) { while (rs.next()) { Dish dish new Dish(); dish.setId(rs.getInt(id)); dish.setName(rs.getString(name)); dish.setPrice(rs.getDouble(price)); dish.setImage(rs.getString(image)); dish.setStatus(rs.getInt(status)); list.add(dish); } } } catch (SQLException e) { e.printStackTrace(); } return list; }逻辑说明DBUtil.getConnection()从db.properties读取数据库连接配置因此你不需要修改代码里的连接信息只需改配置文件即可。PreparedStatement里第一个参数categoryId是通过setInt传入的避免拼接 SQL 带来的注入风险——你可以沿用这种写法并提供参数说明。参数说明categoryId是小程序端传过来的分类 ID对应category表的id。如果接口返回空列表先确认数据库里有没有status1的菜品而不是急着改 Java 代码。我曾在这上面浪费了不少时间排查最终发现是初始化脚本里菜品默认状态为 0。2.4 db.properties 与小程序端的配置对应关系后端能不能连上数据库看这个文件jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/ordering?useUnicodetruecharacterEncodingutf8 jdbc.usernameroot jdbc.password123456注意characterEncodingutf8这个参数——如果你的数据库是 utf8mb4 编码MySQL 5.7 默认URL 里写characterEncodingutf8也够用。但我建议直接写成utf8mb4避免生僻字或 emoji 存入时变成问号。对应的小程序前端utils/api.js或request.js里有一个基础 URL 配置const BASE_URL http://localhost:8080/ordering; function request(path, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL path, method: method, data: data, header: { Content-Type: application/json }, success: (res) { if (res.statusCode 200) { resolve(res.data); } else { reject(new Error(请求失败: res.statusCode)); } }, fail: (err) reject(err) }); }); } module.exports { request, BASE_URL };逻辑说明这里封装了wx.request后端所有接口返回的 JSON 格式统一是{ code: 200, data: [...] }或直接返回数组。你拿到源码后不必每个页面都改 URL只需调整BASE_URL一处即可。参数说明BASE_URL中的8080是 Tomcat 默认端口/ordering是你在 Tomcat 里部署时的应用上下文路径。如果你用 Eclipse 直接 Run As Server上下文路径通常是项目名不一定叫ordering所以要在Server视图里双击 Tomcat 实例修改Modules选项卡里的Path为/ordering。3. 本地部署与初始化从 ZIP 到可运行系统这份资源是 ZIP 压缩包解压后你至少会看到这几类文件数据库脚本.sql 或 .bak、后端工程.classpath src WebContent、小程序前端工程通常是单独的文件夹里面有pages、utils、app.js、以及 1-install.bat / 2-run.bat / 3-build.bat 三个 Windows 脚本。说明文档可能是 docx 或 pdf里面有环境配置和部署步骤。3.1 环境核对先看版本再动手我建议在解压后、运行任何脚本之前先核对环境。避免一上来就报一堆错把心态搞崩。按我多次部署“Java Web 小程序”项目总结出的顺序下面这张表是底线配置。组件版本要求备注JDK1.8高版本可能编译报错Tomcat7 或 8 / 8.5Tomcat 10 慎用MySQL5.78.0 也兼容Navicat11 及以上或者用命令行Eclipse任意较新版本用 IDEA 也完全没问题HBuilder X最新版即可用于跑 uniapp 或者原生小程序微信开发者工具最新稳定版导入小程序工程如果你以前只写过简单的 Java SE 程序没跑过 Web 项目请先确认上述前三项环境变量已配好。我不推荐用 Tomcat 9 或 10 跑这套源码原因是 Servlet 规范版本不同javax.servlet包可能冲突而 Tomcat 10 用的是jakarta.servlet命名空间老代码直接编译不过。3.2 安装步骤数据库导入、后端部署、小程序启动整个过程我按“数据库 → 后端 → 前端”三个顺序操作。先导入数据库因为后端启动时会立刻尝试连接 MySQL若此时库还是空的Tomcat 可以启动但接口全挂。第一步创建数据库并导入数据打开 Navicat新建连接默认 root / 密码留空如果你设了密码就在db.properties里同步修改。新建数据库ordering字符集选utf8mb4排序规则选utf8mb4_general_ci。然后右键ordering→ 运行 SQL 文件 → 选择解压目录里的db_ordering.sql开始执行。如果执行报错十有八九是 SQL 脚本编码问题打开.sql文件另存为 UTF-8 编码再执行。# 如果你习惯命令行也可以这样导入 mysql -u root -p --default-character-setutf8mb4 ordering db_ordering.sql第二步用 Eclipse 导入后端工程并部署到 Tomcat打开 Eclipse建议用 Eclipse IDE for Enterprise Java DevelopersFile → Import → Existing Projects into Workspace选中解压出来的后端文件夹。如果导入后项目名带红叉多半是 JRE 版本或 Tomcat 运行时没绑定——右键项目 → Properties → Java Build Path → Libraries把 JRE 切到 1.8再在 Targeted Runtimes 里勾选 Tomcat 7保存即可。接着右键项目 → Run As → Run on Server选你本地的 TomcatEclipse 会自动把项目部署到 Tomcat 的 webapps 目录。启动完成后浏览器打开http://localhost:8080/ordering/能看到一个简单页面或 JSON 响应说明后端已经就绪。第三步用微信开发者工具导入小程序前端打开微信开发者工具导入项目目录选解压文件夹里的miniprogram如果没有这个目录名寻找包含app.json的那一层。AppID 可以填测试号不影响本地调试。导入后找到utils/config.js或api.js把localhost:8080换成你电脑的局域网 IP如果后端就在本机模拟器调试也可以先保持 localhost。点击编译后模拟器里应该能看到点餐首页。这时先别急着真机预览先确认开发者工具右上角“详情 → 本地设置”里勾选了“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”——因为你的后端是http明文没有备案域名。3.3 三个启动脚本的作用范围ZIP 里有1-install.bat / 2-run.bat / 3-build.bat三个文件。这是一个“一键部署”的思路——但实际作用范围有限因为 Tomcat 和 MySQL 通常已被你本地装好脚本只能辅助执行。1-install.bat通常执行mvn install或npm install。如果后端是 Maven 工程就是装依赖但多数学生项目并不是 Maven而是直接把 jar 包放在WebContent/WEB-INF/lib下那这个脚本可能只是 echo 提示实际执行后没有太大作用。2-run.bat启动服务。里面可能有startup.batTomcat 启动脚本前提是你把 Tomcat 路径写死在这个文件里。如果没有修改环境变量双击可能报“不是内部或外部命令”——这种时候不用慌手动启动 Tomcat 也一样。3-build.bat前端编译或后端打包常见做法是调用mvn package或node build。我的建议是这三个脚本能跑就跑不能跑就跳过直接用 IDE 操作。它们通常是原作者给自己写的高效路径未必适配你的目录结构。不要因为脚本报错就以为项目有问题——脚本报错时先看是不是路径不存在其次看是不是没有安装 Maven 或 Node。4. 避坑与常见问题微信小程序里最容易翻车的 8 个瞬间这套系统的技术栈不算新但它把“小程序前端 Java 后端 MySQL”三端串联在一起任何一个环节配置不对都会让你怀疑是源码有 bug。我把部署和二次开发过程中遇到的高频问题按“现象 → 原因 → 解决”格式记录下来希望能省下你半天到一天的排查时间。4.1 小程序数据加载不出来后端接口却能直接在浏览器打开现象微信开发者工具里wx.request报request:fail或者返回statusCode 404/500但浏览器输入同样的 URL 可以正常返回 JSON。原因最常见的是开发工具“合法域名校验”没关。微信开发者工具默认校验 HTTPS 和合法域名而本地后端是http://localhost:8080。另一个可能性是BASE_URL里 IP 写的是局域网地址但手机或模拟器和电脑不在同一网段比如公司网络禁 ping。解决在开发者工具右上角“详情” → “本地设置”里勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”。注意这是开发模式下的临时策略上线小程序前必须把后端换成备案过的 HTTPS 域名否则 Android 端无法正常请求。4.2 MySQL 导入 SQL 脚本时报语法错误现象Navicat 运行ordering.sql报[Err] 1064 - You have an error in your SQL syntax具体位置在注释或中文附近。原因SQL 脚本文件不是 UTF-8 编码导致中文注释被解析成乱码部分乱码字符被当作 SQL 语句的一部分。这是学生项目里最常见的问题我换过几台电脑每次从百度网盘或 QQ 下载的压缩包解压后都可能遇到。解决用 Notepad或其他文本编辑器打开.sql文件菜单“编码” → “转为 UTF-8 编码”保存后重新在 Navicat 中执行。如果文件太大也可以用命令行导入mysql -u root -p --default-character-setutf8mb4 ordering ../db_ordering.sql导入成功后执行SHOW TABLES;确认至少看到dish、orders、order_detail这几张表。4.3 Tomcat 启动成功但访问 404现象Tomcat 在 Eclipse 里显示 Started浏览器访问http://localhost:8080/ordering/却报 404。原因项目的上下文路径context path不是/ordering。Eclipse 部署时默认使用项目名作为路径而项目文件夹名可能是ordering-system或微信点餐后端之类的名字。中文项目名在 Tomcat 里还有可能引发编码问题。解决双击 Eclipse 的 Servers 视图里的 Tomcat 实例打开 Overview → Modules找到当前部署的应用把 Path 改成/ordering。改完保存后Tomcat 会自动重启。如果你是用 IDEA 部署则在 Artifacts 的 Output Layout 里检查 Deployment 配置。4.4 小程序端不显示图片商品图片全裂现象菜品列表能正常加载但每个菜品后面是一个灰色图片占位符。原因数据库里dish.image字段存的可能是相对路径比如/upload/123.jpg而你的后端没有额外部署图片访问的静态资源映射。或者图片域名存在跨域问题但本地调试时一般是路径不对。解决先看数据库里的image字段值。如果是相对路径如/upload/就在后端 WebContent 下创建一个 upload 目录把图片放进去并保持文件名一致。如果图片是外部 URL检查是否带了 http/https 前缀。另外小程序页面渲染image标签时src 不能是本地磁盘路径必须是网络 URL 或 base64。4.5 订单提交失败后端日志报Column order_no cannot be null现象前端提交订单接口返回失败查看 Tomcat 控制台发现数据库插入语句因为 order_no 字段为空被拒。原因部分源码里订单编号是在 Service 层生成UUID.randomUUID()或利用时间戳拼出来的但某些版本在代码里写的是“前端传入 order_no”而小程序端的生成逻辑被删掉了——于是后端拿到 null插入失败。解决改后端逻辑在 OrderService 里加一行order.setOrderNo(ORD System.currentTimeMillis() UUID.randomUUID().toString().substring(0,6));改完后不需要动前端。如果你希望保留前端生成逻辑那就检查小程序提交时data里是否包含order_no字段。4.6 一运行 2-run.bat 就闪退现象双击2-run.bat黑框一闪而过没有启动窗口。原因bat 脚本内容里调用了相对路径下的 Tomcatstartup.bat但是用户解压后的文件结构里根本没有 Tomcat——脚本是复制到某个固定目录后才能用的。说白了这些脚本只对原作者自己的文件夹布局有效。解决直接用你自家安装的 Tomcat 手动启动。打开tomcat/bin/startup.bat前提是CATALINA_HOME环境变量已配好。如果配置正确终端会显示 Tomcat 启动日志。这才是最稳的方式。4.7 真机预览时连接不上后端现象模拟器里一切正常但手机扫码预览后所有请求超时。原因手机和电脑不在同一个 Wi-Fi 下或电脑防火墙阻止了 8080 端口入站。微信开发者工具的真机调试走的是你手机的网络去访问后端地址所以必须保证手机能 ping 通电脑的局域网 IP。解决把BASE_URL中的localhost改成电脑的局域网 IP可用ipconfig查看同时检查防火墙控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则找到 Java/Tomcat 相关条目确保已允许专用网络入站。之后再在模拟器里预览一次真机才能正常访问。4.8 中文乱码页面显示好儿或???现象后端返回的 JSON 里中文字段变成乱码比如dishes的名称显示异常。原因第一阶段是后端响应没有声明 UTF-8。Servlet 里response.setContentType(application/json;charsetutf-8)未写或 Tomcat 默认编码不是 UTF-8第二阶段是数据库连接 URL 缺少characterEncodingutf8第三阶段是小程序端setData后页面编码正常但网络请求层解析时把默认编码当成了 ISO-8859-1。解决三层逐一补上——Servlet 里加响应头db.properties加参数小程序端wx.request的响应如果发现乱码可以在success里做一次decodeURIComponent但正常情况不需要。多数代码里第一层做好就够了。5. 二次开发从“跑起来”到“能答辩”的三步改造对毕设而言只把“源码跑起来”是不够的。答辩老师大概率会问“这个系统你做了哪些改动”如果你能列出两三个经得起追问的功能优化同时给出可运行证据说服力会明显不同。下面这套改造思路源自我的实践总结你也可以按这个路线做。5.1 给订单模块加一个“取消订单”超时自动操作原系统的订单状态通常只有待支付、已支付、已完成没有“已取消”。这一块你可以补上。在小程序order-detail页面加一个按钮点击时调用后端更新接口public boolean cancelOrder(int orderId) { String sql UPDATE orders SET status 已取消 WHERE id ? AND status 待支付; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, orderId); return ps.executeUpdate() 0; } catch (SQLException e) { e.printStackTrace(); return false; } }逻辑说明WHERE里加上AND status 待支付表示只有未支付订单允许取消。这样即使前端误触或恶意调用也不会把已支付订单取消掉——是一个后端必做的防御性判断。参数说明这条 SQL 的返回值是受影响行数大于 0 说明更新成功。前端通过返回值是否为1来判断取消失败比如订单已支付并弹出 Toast 提示。5.2 将 MySQL 的utf8mb4支持覆盖到数据库层原 SQL 脚本可能只建了utf8字符集但微信用户的昵称里 emoji 非常多比如“‍”直接存会报Incorrect string value。把数据库整体字符集改成utf8mb4并在db.properties的 JDBC URL 中加characterEncodingutf8mb4。这属于“老师说得出亮点”的改动而且成本极低。5.3 整合一个极简的登录态用微信的code换openid原系统对“用户身份”的处理可能就是个user_id写死或依赖wx.login。如果你想让答辩老师眼前一亮可以加一个最朴素的登录接口// 小程序端 wx.login 获取 code 后传给后端 String url https://api.weixin.qq.com/sns/jscode2session?appid APPID secret SECRET js_code code grant_typeauthorization_code;因为涉及 HTTPS 请求我这里不展开完整实现但思路是后端拿到code后向微信服务器换openid再把这个openid作为用户标识存入数据库。如果你想实现微信小程序登录获取手机号则还需要在正式小程序账号后台开通相应接口权限并采用getPhoneNumber获得加密数据再通过后端解密。我不建议你去研究任何“伪造微信浏览器头信息绕过登录”的做法——那是平台明令禁止的小程序审核必挂而且存在合规风险。最好就是走正规的wx.login code2session流程。6. 验证迁移用真实订单数据检查系统可靠性部署妥当、能跑通之后建议做一轮“有效负载验证”不是只看页面是否显示而是真实地跑一次下单全流程并检查数据库。我的习惯是在确认应用没有任何明显报错后用一个临时测试账号执行以下步骤——这套流程也适合你交给导师看“项目验收”截图。验证步骤小程序端打开首页截取菜品列表。选中一个菜品加入购物车。提交订单支付状态选“模拟支付”源码多半没有接微信支付会直接标记为已支付。在 Navicat 中查看orders表最新一条记录核对total_price和status。检查order_detail表中年对应order_id的记录是否齐全。管理员端如提供 Web 管理页面处理该订单把状态改为“已完成”小程序刷新后看到状态同步变化。如果第 4 步发现total_price为 0大概率是后端计算字段写死或前端没传价格逐个断点排查即可。如果第 6 步不同步核心是前端页面在下单成功后没有重新调用订单详情接口加一个请求就好。“从那以后我每次拿到一套新源码都会强制自己先搭好环境、跑通全流程再去看代码结构——磨刀不误砍柴工希望帮到你。”本文还有配套的精品资源点击获取
返回列表