Java+SSM+MySQL+微信小程序购药系统源码:环境搭建与核心模块拆解
简介这份资源是面向计算机专业学生与Java初学者的一套自助购药小程序完整源码可作为毕业设计、课程设计或SSM框架实战练习的参考方案。项目采用Java语言与SSM框架基于B/S架构和MySQL 5.7数据库前端由微信开发者工具与HBuilderX完成涵盖首页、个人中心、用户管理、商家管理、药品信息管理、药品分类管理、发票信息管理及系统管理等模块实现药品搜索、浏览、下单与支付等完整购药流程。压缩包共1319个文件约22.55MB包含120个Java源文件、138个Vue组件、181个JavaScript脚本、86个WXSS与84个WXML小程序页面文件以及2个SQL数据库脚本和若干PNG、SVG等静态资源前后端源码与数据库文件齐全。目前已有57人学习。读者可据此掌握SSM整合开发、小程序页面搭建与数据库设计思路并借助清晰的目录结构快速定位后端接口、前端页面与建表脚本适合作为项目复现与二次开发的参考模板。1. 从一份能跑起来的购药小程序源码说起很多同学做毕业设计时最头疼的不是写代码而是找不到一份结构完整、能跑通、有数据库、前后端都齐全的参考工程。市面上流传的“自助购药小程序”源码不少但真正能导入 IDE、连上 MySQL、跑起 SSM 后端、再用微信开发者工具打开小程序前端的其实不多。这份基于 Java SSM MySQL 微信小程序的购药系统源码就是那种“拿到手能直接拆”的类型。它覆盖了首页、个人中心、用户管理、商家管理、药品信息管理、药品分类管理、发票信息管理、系统管理八个模块后端用 Spring SpringMVC MyBatis前端是微信小程序数据库是 MySQL 5.7JDK 1.8Maven 3.3Tomcat 7。如果你正在找一份能写进论文、能答辩演示、能二次开发的购药类项目这份源码值得你花时间跑一遍。下面我按“先跑通、再拆解、后避坑”的顺序把这份资源从环境搭建到核心模块改造讲清楚。2. 环境搭建与工程导入把 SSM 后端和小程序前端同时跑起来2.1 后端环境准备与依赖版本锁定这份源码的后端是标准 SSM 结构但版本卡得比较死。JDK 必须用 1.8MySQL 用 5.7Tomcat 用 7Maven 用 3.3。如果你用 JDK 11 或 Tomcat 9大概率会在启动时报ClassNotFoundException或NoSuchMethodError。我一般会先把环境对齐再动代码。先确认本机 Java 版本java -version # 期望输出java version 1.8.0_xxx如果版本不对去装一个 JDK 1.8并在 IDE 里把编译级别设为 1.8。Maven 的pom.xml里通常已经锁定了 Spring 4.x 和 MyBatis 3.x不要随意升级。数据库方面用 Navicat 11 或更高版本导入sql文件即可。导入前先建库CREATE DATABASE drug_store DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;然后把源码里附带的.sql文件导入这个库。注意MySQL 5.7 默认的sql_mode可能包含ONLY_FULL_GROUP_BY如果导入后查询报错临时关掉SET GLOBAL sql_mode(SELECT REPLACE(sql_mode,ONLY_FULL_GROUP_BY,));这一步不做后面药品分类统计的 SQL 可能会翻车。2.2 用 IDEA 导入 Maven 工程并配置 Tomcat源码根目录下有.classpath和pom.xml说明它原本是 Eclipse 工程但 IDEA 也能直接打开。导入时选“Maven 项目”IDEA 会自动下载依赖。如果下载慢在settings.xml里换阿里云镜像。依赖拉完后检查src/main/resources下的jdbc.properties把数据库连接改成你自己的jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/drug_store?useUnicodetruecharacterEncodingutf-8useSSLfalse jdbc.usernameroot jdbc.password你的密码注意useSSLfalse不能省MySQL 5.7 在高版本驱动下会警告。然后配置 Tomcat 7 运行环境部署 artifact 选war exploded应用上下文设为/。启动后访问http://localhost:8080/如果看到登录页或首页接口返回 JSON说明后端通了。2.3 小程序前端导入与接口地址修改小程序前端用 HBuilderX 或微信开发者工具打开。源码里通常有一个common或utils目录里面放着request.js或config.js定义了后端接口的 baseUrl。你需要把它改成你本机的 IP 和端口// utils/config.js const baseUrl http://192.168.1.100:8080/; export default baseUrl;注意微信开发者工具里要勾选“不校验合法域名”否则本地 HTTP 请求会被拦截。如果你用真机调试手机和电脑必须在同一局域网且电脑防火墙放行 8080 端口。改完后编译运行首页应该能加载药品列表。如果列表空白先看开发者工具的 Network 面板确认请求是否发出、返回码是否 200。3. 数据库表结构与核心模块拆解药品、订单、发票怎么串起来3.1 药品信息表与分类表的关联设计这份源码的药品模块是核心。通常会有drug_info药品信息和drug_category药品分类两张表通过category_id外键关联。药品表里一般包含药品名称、图片、价格、库存、描述、商家 ID 等字段。分类表则是一级或二级分类。我拆过不少类似工程发现一个常见问题分类删除时没有级联处理导致药品表里出现孤儿记录。这份源码里如果没做级联你需要在业务层手动处理。查询药品列表的 MyBatis 映射通常长这样select idselectDrugList resultMapDrugResultMap SELECT d.*, c.name AS categoryName FROM drug_info d LEFT JOIN drug_category c ON d.category_id c.id WHERE d.status 1 if testkeyword ! null and keyword ! AND d.name LIKE CONCAT(%, #{keyword}, %) /if ORDER BY d.create_time DESC /select这里status 1表示上架状态LEFT JOIN保证即使分类被删药品也能查出来。如果你要做分类筛选再加一个categoryId条件即可。参数说明keyword是搜索关键词categoryId是分类 ID两者都可选。3.2 订单与发票模块的状态流转购药小程序的订单状态一般有待付款、待发货、待收货、已完成、已取消。发票模块则关联订单用户下单时可以申请发票商家发货后开票。源码里通常用order_info和invoice_info两张表通过order_id关联。状态字段用数字表示比如0待付款、1待发货、2待收货、3已完成、4已取消。订单创建的核心逻辑在 Service 层Transactional public void createOrder(OrderInfo order) { order.setOrderNo(UUID.randomUUID().toString().replace(-, )); order.setStatus(0); // 待付款 order.setCreateTime(new Date()); orderMapper.insert(order); // 扣减库存 for (OrderItem item : order.getItems()) { drugMapper.reduceStock(item.getDrugId(), item.getQuantity()); } }注意Transactional不能少否则扣库存和插订单不在一个事务里高并发下会出现超卖。参数说明orderNo用 UUID 生成避免重复status初始为 0扣库存用UPDATE drug_info SET stock stock - #{qty} WHERE id #{id} AND stock #{qty}这样能防止库存变负。3.3 用户管理与商家管理的权限隔离用户和商家是两类角色通常用role字段区分或者分两张表。源码里如果是分表登录时就要判断是查user表还是merchant表。商家管理模块一般包含入驻审核、药品上架、订单处理。用户管理则包含注册、登录、个人信息、收货地址。一个容易忽略的点小程序登录获取手机号。微信小程序获取手机号需要后端调用phonenumber.getPhoneNumber接口且需要access_token。源码里如果没实现你可以用微信官方提供的解密方式// 伪代码需引入微信解密工具类 String phone WxDecryptUtil.decrypt(sessionKey, encryptedData, iv);但注意这个接口需要小程序认证个人开发者账号可能没有权限。如果只是做毕业设计可以先用模拟手机号代替答辩时说明即可。4. 避坑与常见问题排查从 404 到乱码的五个血泪经验4.1 启动报 404Tomcat 上下文与 web.xml 配置现象Tomcat 启动成功但访问任何接口都返回 404。原因通常是web.xml里DispatcherServlet的url-pattern配成了/api/*而你的请求路径没带/api。或者 Tomcat 的 application context 设成了/drug你访问的是/。解决检查web.xml和 Tomcat 部署配置确保路径一致。我一般会在web.xml里配/然后 Controller 上用RequestMapping(/drug)这类前缀。4.2 数据库连接失败驱动版本与时区问题现象启动时报Communications link failure或Unknown system variable query_cache_size。原因MySQL 驱动版本和数据库版本不匹配或者连接串没加时区。解决MySQL 5.7 用mysql-connector-java 5.1.x连接串加serverTimezoneUTC。如果还报错检查jdbc.properties里的用户名密码以及 MySQL 是否允许远程连接。4.3 小程序请求失败域名校验与 HTTPS 限制现象开发者工具里请求正常真机预览时接口全部失败。原因微信小程序正式环境要求 HTTPS且域名需备案。开发阶段可以在开发者工具里勾选“不校验合法域名”真机调试则需要在手机端开启调试模式。解决本地开发用 HTTP 不校验如果要上线必须配 HTTPS 证书并在小程序后台配置合法域名。4.4 中文乱码数据库字符集与后端编码现象药品名称显示为???或乱码。原因数据库、表、连接串、Tomcat 四处字符集不一致。解决建库时用utf8mb4连接串加characterEncodingutf-8Tomcat 的server.xml里Connector加URIEncodingUTF-8后端返回 JSON 时设置produces application/json;charsetutf-8。四处都对齐基本不会乱码。4.5 发票模块报错关联订单不存在现象申请发票时提示“订单不存在”或外键约束失败。原因发票表的order_id外键指向订单表但订单可能已被删除或者事务未提交。解决检查订单状态只有已完成的订单才能开票发票插入前先查订单是否存在如果用了外键确保订单表引擎是 InnoDB。5. 二次开发与进阶技巧把购药小程序改成你的毕业设计亮点5.1 增加药品库存预警与定时任务原始源码可能没有库存预警。你可以加一个定时任务每天检查库存低于阈值的药品给商家发消息。用 Spring 的Scheduled即可Component public class StockWarningTask { Autowired private DrugMapper drugMapper; Scheduled(cron 0 0 8 * * ?) // 每天早8点 public void checkStock() { ListDrugInfo lowStockList drugMapper.selectLowStock(10); for (DrugInfo drug : lowStockList) { // 发送站内信或邮件 System.out.println(库存预警 drug.getName()); } } }参数说明cron表达式按需调整selectLowStock(10)是自定义查询查库存小于 10 的药品。这个功能写进论文比单纯 CRUD 有亮点。5.2 用 MyBatis-Plus 简化 CRUD 并自动生成 SQL如果你觉得原生 MyBatis 写 XML 太繁琐可以引入 MyBatis-Plus。它可以根据 Java 实体类自动生成建表 SQL 和 CRUD 语句。比如TableName(drug_info) public class DrugInfo { TableId(type IdType.AUTO) private Long id; private String name; private BigDecimal price; // getter/setter }然后 Mapper 继承BaseMapperDrugInfo就能直接用selectList、insert等方法。注意MyBatis-Plus 和原生 MyBatis 可以共存但要把pom.xml里的 MyBatis 依赖换成 MyBatis-Plus 的 starter。这个改造能让你的代码量减少一半答辩时也显得更现代。5.3 小程序端动态设置标题与单选框优化微信小程序里药品分类筛选常用picker或单选框。动态设置导航栏标题用wx.setNavigationBarTitlewx.setNavigationBarTitle({ title: 药品分类 });单选框建议用radio-group绑定bindchange事件把选中的分类 ID 传给后端。注意小程序顶部导航栏高度在不同机型上不一样可以用wx.getSystemInfoSync().statusBarHeight获取状态栏高度再计算导航栏高度。这个细节做不好页面会错位。5.4 验证源码完整性的三个习惯我每次拿到一份源码都会先做三件事第一检查pom.xml里的依赖是否全部能下载第二导入 SQL 后看表数量和外键是否完整第三跑一遍登录、下单、开票的主流程。如果这三步都过基本就能用。这份购药小程序源码在这三方面都算完整适合作为毕业设计或课程设计的起点。从那以后我每次拆新项目都强制走一遍“依赖→数据库→主流程”的检查省得后面翻车。希望帮到你。本文还有配套的精品资源点击获取