ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

自助购药小程序源码解析:Java后端与微信前端实战指南

2026/9/24 18:32:52 拓冰建站 浏览量
自助购药小程序源码解析:Java后端与微信前端实战指南 简介这是一份基于Java与SSM框架开发的自助购药小程序完整源码面向毕业设计、课程设计及小程序Java全栈学习者覆盖用户端、商家端与后台管理端可解决从药品展示、下单支付到发票管理等全流程设计问题。压缩包共1319个文件体积22.55MB以Vue前端、Java后端、微信小程序WXML/WXSS及JS脚本为主另含PNG图片、JSON配置、SQL数据库文件等目录结构清晰。目前已有57人浏览学习。项目包含完整前后端源码与MySQL数据库文件并附详细环境说明JDK1.8、Tomcat7、Maven3.3、微信开发者工具等已集成用户管理、药品分类、发票信息、系统管理等模块开发者可直接导入IDE运行也便于二次扩展与学习参考。1. 这个“自助购药小程序源码包”具体在讲什么浏览器里搜“基于小程序的自助购药小程序源代码”跳出来的多数是打包好的毕业设计资源Java 后端、微信小程序前端、MySQL 建库脚本外加一份 LW论文说明文档压缩成一个 zip。这套代码解决的问题很直白——把药品做分类展示、查看详情、加入购物车、提交订单后台再管理药品上下架和订单列表本质是“小程序商城”只是货架换成了药品。如果你正在做毕业设计或者想弄懂一个完整的小程序前后端项目是怎么从零跑起来的这包源码比看一百篇零散教程更值得入手。它可能不是最新技术却是一条能闭环演示的完整链路适合按骨架改业务、照着答辩。2. 源码包结构和技术选型为什么是Java小程序MySQL这个组合2.1 解压 zip 后先看清这四类文件再动手很多第一次拿到这种源码包的人上来就双击某个 Java 工程直接导入 IDEA结果发现小程序目录、SQL 文件、Word 文档全混在同一层找半天找不到主入口。我一般会先建一个新文件夹把 zip 解压进去再按四类文件归类文件类型判断方式作用Java 后端工程存在 pom.xml 或 build.gradle提供购药业务接口连接 MySQL微信小程序前端存在 app.json、project.config.json用户端页面和交互逻辑SQL 脚本扩展名为 .sql建库建表、初始化数据LW 文档.doc/.docx/.pdf设计说明书答辩用有一个容易忽略的细节zip 解压后可能不是工程根目录而是外层再套一层带学号或日期的文件夹比如“自助购药系统_张三_2024”。直接把这一层导入 IDEAMaven 经常识别不到 pom.xml。正确做法是层层往下找直到看见 pom.xml 那一层再打开。如果 Java 目录里有target子目录说明作者本地编译运行过那是构建产物直接忽略。SQL 文件可能不止一个多个时通常一个建库、一个建表按文件名顺序导入即可。2.2 为什么这个组合成了自助购药类毕设的主流自助购药本质上是“商品 购物车 订单”的业务Web 端能做Vue 也能做为什么大量毕设题目偏偏是“Java 小程序 MySQL”三个决定性原因。第一Java 后端生态对新手最友好。Spring Boot 一个SpringBootApplication注解就能启动服务内置 Tomcat不用单独配容器MyBatis 或 MyBatis-Plus 把 SQL 写在 Mapper 里出错时能直接看到是哪条查询的问题。热搜词里“mysql安装教程”“java环境变量配置”一直居高不下恰好说明这个人群最需要资料多、报错好搜的技术栈。第二小程序演示效果比网页强。微信小程序不用安装答辩时手机扫码就能真机操作直接递给老师看购物车和下单流程。小程序原生开发也不需要 Node 环境和 Webpack 构建打开微信开发者工具就能改对没有前端工程化经验的学生很友好。第三MySQL 正好卡在课程考核点上。Java 操作数据库用 JDBC 或 MyBatis小程序通过 HTTP 调 Java 接口数据最终落在 MySQL 表里。数据库范式、事务、索引这些考点都能在药品表、购物车表、订单表里找到实例答辩时老师问数据库设计直接指着表结构就能答。2.3 为什么不是更新的前后端分离方案现在实际开发里已经是 Vue/React Spring Boot 前后端分离的天下这套源码却停留在小程序原生加 Java 单体结构。不是它落后而是题目限定“小程序”本身就是一种选型结果。小程序原生是免构建的前端不用处理跨域——微信开发者工具里发请求只需要管 url 和 header不像 Vue 项目要配 devServer 代理小程序也不用装一堆 npm 依赖拉下来就能跑。后端用单体 Java 而不是微服务道理一样微服务要拆模块、配注册中心、处理服务间调用对单机演示的毕设来说这些都是翻车点。所以这套组合的定位不是“最新”而是“最稳妥”。2.4 LW 文档不是摆设先读它再读代码很多人把 LW 文档当成一堆要上交的 Word 文字解压后看都不看。这是最亏的做法。LW论文里通常写了需求分析、数据库设计、功能结构图、测试用例它最大的作用不是上交而是让你快速理解作者的设计意图。拿到源码包先花二十分钟翻一遍 LW 的目录和数据库设计章节再回去看代码比你逐个文件硬翻省两个小时。很多后端代码里留着大量TODO和注释掉的调试代码而 LW 反而是全项目最完整的“程序说明书”。我自己的习惯是先看论文里的表结构清单再看 Controller 路由最后才打开 Mapper 里的 SQL这样读代码是顺着业务走的而不是被代码牵着走。3. 把项目跑起来初始化 MySQL 到启动 Java 后端3.1 数据库初始化导入 SQL 文件与账号密码修改源码包里通常带一个drug.sql或shop_db.sql文件打开后是CREATE DATABASE、CREATE TABLE和INSERT语句。导入前先确认本机 MySQL 版本5.7 或 8.0 问题不大太老的 5.6 对 utf8mb4 支持不完整太新的 8.4 又可能遇到认证插件不兼容。用命令行导入最稳不需要任何 GUI 工具-- 先创建数据库指定字符集避免中文乱码 CREATE DATABASE IF NOT EXISTS drug_shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE drug_shop; -- 然后执行 sql 文件里的建表和初始化数据 SOURCE /your/local/path/drug_shop.sql;注意 Windows 下SOURCE的路径分隔符必须用/用\会报Failed to open file。如果你的 sql 文件开头自带CREATE DATABASE就把第一步注释掉直接SOURCE整个文件避免重复建库报错。导入完成后执行SHOW TABLES;药品表、分类表、购物车表、订单表一张都不能少缺表的话 MyBatis 启动阶段就会在控制台抛找不到表的异常。导入只是第一步后端要连上库还得改配置。在application.yml或application.properties里找到这段spring: datasource: url: jdbc:mysql://localhost:3306/drug_shop?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver三个重点说清楚。URL 里的serverTimezoneAsia/Shanghai必须保留MySQL 8.0 之后不指定时区会直接报错或连接超时字符集和建库保持统一都用utf8mb4否则中文全部变问号账号密码要改成你自己本机的真实值。如果你刚按 mysql 安装配置教程搭好环境密码多半还是初始密码这里不改后端起不来。为安全起见也可以单独建一个应用账号只授予该项目所需数据库的权限不过我见过的大多数毕设源码都是直接用 root。3.2 Java 后端启动从 IDEA 导入到第一个接口连通后端是源码包的重头。用 IDEA 打开 Java 工程选到 pom.xml 那一层等 Maven 下载依赖完成。首次下载可能五到十分钟一直卡住的话把 Maven 仓库换成国内镜像在settings.xml的mirrors里加这一段mirror idaliyunmaven/id urlhttps://maven.aliyun.com/repository/public/url mirrorOfcentral/mirrorOf /mirror依赖下载完成后找到main方法的启动类右键运行。控制台出现Started Application in xxx seconds就算成功。Spring Boot 内置 Tomcat所以不需要额外部署默认占 8080 端口。然后用浏览器或 Postman 验证一个接口比如访问http://localhost:8080/api/drug/list能返回 JSON 数组说明后端已经通到数据库。这里有个常被忽略的配置server.servlet.context-path。有的项目会配成/drug那访问地址就要变成http://localhost:8080/drug/api/drug/list。判断方法很简单看启动日志里有没有Tomcat started on port(s): 8080有的话再确认上下文路径。后端接口能通环境就成功了一大半。3.3 小程序端运行微信开发者工具导入与域名配置后端跑通后打开微信开发者工具选择“导入项目”目录指到源码包里的miniprogram文件夹。第一次导入大概率会遇到请求报错原因是小程序默认要求所有请求走https且域名已备案本地开发不满足。在开发者工具右上角“详情”里勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”就能放行本地 HTTP 请求。只是勾选还不够还要改小程序里的请求地址。打开utils/request.js或app.js找到baseUrl// 小程序全局请求封装所有页面共用 const baseUrl http://localhost:8080; // 后端端口若改了这里要同步改 function request({ url, method GET, data {} }) { return new Promise((resolve, reject) { wx.request({ url: baseUrl url, method: method, data: data, header: { Content-Type: application/json }, success: (res) resolve(res.data), fail: (err) reject(err) }); }); } module.exports { request };这段代码决定了联调能不能通。baseUrl没拼对所有接口都会 404。header里是否需要加 token取决于后端有没有写登录拦截器——很多毕设项目压根没做鉴权全接口裸奔如果后端有Interceptor或Filter请求头必须带后端约定的字段否则返回 401。到这里改完配置点“编译”首页能刷出药品列表整条链路就算通了。从“数据库连不上”到“前端看到商品图”分水岭就在这三步里。把这一步走通之后剩下的都是业务细节。4. 购药业务的核心链路与数据表设计从“浏览药品”到“提交订单”4.1 药品、分类、购物车三张表的字段设计逻辑自助购药的业务是“数据表驱动”的看懂了表就理解了项目。一份结构完整的源码drug表至少长这样CREATE TABLE drug ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(100) NOT NULL COMMENT 药品名称, category_id int(11) NOT NULL COMMENT 分类ID, price decimal(10,2) NOT NULL COMMENT 价格, stock int(11) NOT NULL DEFAULT 0 COMMENT 库存, image_url varchar(255) DEFAULT NULL COMMENT 商品图路径, description text COMMENT 药品说明书, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_category (category_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT药品表;为什么价格用decimal(10,2)不用floatfloat 在 Java 和 MySQL 之间传输会出 0.1 0.2 不等于 0.3 的精度问题。price是金额必须用定点数。description用text而不是varchar(255)因为药品说明书动不动几百字varchar 超长会直接插入报错。分类表通常就id、name、sort三个字段没太多花样。购物车表是理解“自助”的第二个关键点CREATE TABLE cart_item ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL COMMENT 用户ID, drug_id int(11) NOT NULL COMMENT 药品ID, quantity int(11) NOT NULL DEFAULT 1 COMMENT 数量, checked tinyint(1) NOT NULL DEFAULT 1 COMMENT 是否勾选结算, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_user_drug (user_id, drug_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT购物车表;关键在uk_user_drug这行联合唯一索引。它的作用是让“同一用户 同一药品”在表里只有一条记录后端加购时执行INSERT ... ON DUPLICATE KEY UPDATE quantity quantity 1重复加购只会累加数量不会产生重复行。很多翻车项目购物车里出现两条相同药品就是因为少了这个约束前端只能在 for 循环里做去重。注意checked字段有的源码没有。没有时前端只能把勾选状态存在变量里小程序一关闭就丢失。判断一套购药源码细不细看购物车表有没有这个字段就知道。4.2 订单与库存自助购药的业务闭环订单模块是整套源码的收口包含两张表orders订单主表和order_item订单明细表。主表存一次下单的整体信息明细表存这笔订单买了哪些药、各多少份。容易被忽略的是两个字段字段所属表作用order_no主表生成后返回给前端作为用户查询订单的标识status主表0/1/2/3 分别对应待付款、待发货、已完成、已取消drug_name明细表冗余一份药名防止药品删除后历史订单查不到amount明细表记录下单时单价快照防止改价后历史金额错乱很多初学的人不理解明细表为什么要冗余drug_name和amount。原因是drug表是可变数据管理员改一次价历史订单如果通过关联表查账就全变了药品一旦下架关联查询直接落空。真正的订单系统明细表必须能独立自洽。答辩时老师追问“为什么冗余”能讲清这一点基本就能看出你是真看了代码还是只会跑。下单的后端逻辑可以概括成三步校验库存、扣减库存、生成订单。扣库存的 SQL 是血泪经验不能先SELECT stock再UPDATE stock而是要一条 UPDATE 完成条件更新-- 乐观锁方式扣减库存只有当库存足够时才更新成功 UPDATE drug SET stock stock - #{quantity} WHERE id #{drugId} AND stock #{quantity};执行后如果受影响行数为 0说明库存不足后端要立刻抛异常回滚事务。这种写法能扛住“两个用户同时买最后一个库存”的并发场景比先查再改少一次竞态窗口。如果你拿到的源码是先 SELECT 再 UPDATE建议改成这条 SQL否则答辩时老师一问并发你就卡住。改完后确认表引擎是 InnoDBMyISAM 不支持行锁也不支持事务。4.3 前端下单页的流程控制与后端接口对接小程序端结算页是把链路串起来的最后一环。很多源码这里写得比较简陋但核心逻辑就一段// 小程序结算页-提交订单 submitOrder() { const selectedItems this.data.cartItems.filter(item item.checked); if (selectedItems.length 0) { wx.showToast({ title: 请先勾选要结算的药品, icon: none }); return; } const orderData { userId: wx.getStorageSync(userId), addressId: this.data.selectedAddress.id, items: selectedItems.map(item ({ drugId: item.drugId, quantity: item.quantity })) }; wx.request({ url: ${baseUrl}/api/order/create, method: POST, data: orderData, success: (res) { if (res.data.code 200) { wx.redirectTo({ url: /pages/order-detail/index?id${res.data.data.orderId} }); } else { wx.showModal({ title: 下单失败, content: res.data.msg, showCancel: false }); } } }); }这里的filter(item item.checked)是前端购物车业务的关键动作。后端收到items后逐条做 4.2 的库存扣减最后返回orderId前端跳转到订单详情。整条闭环到这一步才算完整。实际调试时最耗时的不是业务逻辑而是前后端字段名对不上——后端要drugId前端传drug_id接口直接 500。排查时先看 Network 面板的请求体和后端 Controller 的RequestBody实体类把字段名对齐这类问题基本能消掉一半。5. 避坑指南跑这套商城源码最常见的翻车点为什么同样是源码包别人二十分钟跑通你折腾三天大多数翻车都集中在这几个地方按“现象、原因、解决”写清楚。5.1 小程序请求不到后端域名校验与局域网 IP现象模拟器里所有请求一直转圈控制台报request:fail或者直接提示url not in domain list。原因小程序默认只允许请求已备案的https域名本地开发地址是http://localhost:8080不在合法域名列表里请求被微信开发者工具直接拦截。解决在开发者工具右上角“详情”里勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”勾完重启工具。如果手机真机调试仍然request:fail把baseUrl里的 localhost 改成电脑的局域网 IP手机和电脑连同一个 WiFi。注意手机真机调试时开发者工具右上角“详情”同样要勾选不校验域名否则手机端也会拦截。5.2 数据库中文乱码字符集层层对齐现象导入 sql 后药品表里的名称全是???前端页面标题和商品名没法看。原因字符集没对齐。MySQL 5.7 默认字符集是 latin1建库时不指定 utf8mb4中文一插入就被转成问号后端连接串里的characterEncodingutf8丢了也会出现同样问题。解决建库 SQL 前先执行SET NAMES utf8mb4;再建库后端 URL 加characterEncodingutf8。如果两层都改了仍是乱码检查 sql 文件本身的编码——用记事本打开“另存为”编码选 UTF-8不要选 ANSI。这套流程走完重新导入中文就正常了。5.3 药品图片一片白本地图片路径没映射现象后端接口通了药品列表和详情都正常但图片位置一片空白控制台报 404 或Failed to load image。原因image_url存的是/upload/xxx.jpg这种相对路径后端没做静态资源映射小程序拿到路径后去请求后端返回 404。解决在 Spring Boot 里加一个静态资源映射配置把磁盘上的上传目录映射成/upload/**Configuration public class StaticResourceConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceLocations(file:D:/drug_shop/upload/); } }配置完成后图片地址http://ip:8080/upload/xxx.jpg就能正常访问。如果image_url存的是完整网络链接反而没有这个问题但要注意小程序 image 组件的mode属性不对图片做宽高适配时长图会显示成奇怪的比例影响答辩观感。5.4 下单成功但库存没减事务和表引擎一起查现象前端能下单订单也能查到但drug表里库存不变或者库存扣了但订单明细没有。原因下单方法没加事务注解。扣库存和生成订单是两个独立操作前一步成功、后一步抛异常时如果没有Transactional数据就处于不一致状态。解决在 Service 层对应方法上加Transactional(rollbackFor Exception.class)。这里写rollbackFor Exception.class而不是RuntimeException因为有些受检异常默认不触发回滚。加了事务仍不生效检查表引擎是不是 MyISAMMyISAM 不参与事务要用ALTER TABLE drug ENGINE InnoDB;转换。这个坑最容易让人以为代码写错了实际上是建表脚本里ENGINEMyISAM残留。5.5 支付环节走不通别在答辩前夜才发现现象点击微信支付提示“支付签名验证失败”或“商家参数格式有误”。原因毕设源码里的支付模块基本都是模型代码商户号、API 密钥、证书全是假的或测试值。微信支付需要真实商户号和证书源码包不可能提供。解决把支付改造成“模拟支付”流程——前端点支付按钮请求后端/order/pay接口后端直接把订单状态从“待付款”改成“待发货”。答辩演示到“提交订单 → 模拟支付成功 → 状态流转”已经足够说明业务闭环。如果你想接真实微信支付需要去微信支付商户平台申请商户号按 API v3 重写签名逻辑这是二次开发工作量不适合放在答辩前临时做。5.6 排查节奏别把后端控制台当成黑匣子遇到问题先别急着改代码按“配置 → 环境 → 代码”的顺序排查。第一步看application.yml的数据库账号、端口、context-path 有没有改对第二步确认 MySQL 服务在跑、sql 导入成功、表里能查到数据第三步才打开后端控制台看异常堆栈——每一行堆栈都是线索不是黑匣子。这个习惯能帮你把排查时间缩短一半以上。6. 验证与再开发如何确定这套源码真正属于你了跑通只是开始。真正检验你对这套源码掌握程度的是能不能顺着业务流程把它完整走一遍再动手改出一点自己的东西。验证可以按一条满分链路来执行首页选一个药品进详情加入购物车进购物车勾选它点结算填收货地址提交订单。每一步盯着开发者工具的 Network 面板看请求是否 200、返回是否符合预期后端控制台同步看有没有异常堆栈。整条流程走完再去数据库里查orders和order_item表确认订单记录和库存扣减都对得上这套代码才算真正被你验收了。二次开发我建议从两个小方向入手。第一是给药品列表加搜索功能小程序首页放一个搜索框后端加一个LIKE查询接口工作量不大但答辩时能清晰讲出“我改了什么”第二是给库存做预警比如库存低于 10 时在管理端标红这能体现你对业务的理解而不只是会跑通别人的代码。两个方向都能引导你去读真正改过的那部分源码被追问时也不慌。我自己的习惯是拿到任何源码包先把pom.xml依赖版本看一遍再用全局搜索找TODO和localhost判断作者留了多少调试痕迹。这两个动作能让你在半小时内决定这套代码值不值得深挖。最后还是那句话源码包只是起点能把它跑通、讲明、改出自己的功能才是你真正攒下的本钱。希望帮到你。本文还有配套的精品资源点击获取