
简介这是一套面向计算机相关专业学生与项目实战学习者的微信小程序智慧医疗系统完整源码包可作为毕业设计或课程设计参考方案。项目采用SSMSpring、SpringMVC、MyBatis后端架构前端结合微信小程序、JSP、HTML、CSS、JavaScript与jQuery数据库使用MySQL整体遵循MVC与B/S架构开发环境涉及微信开发者工具、Eclipse或IDEA、Tomcat等。系统分为小程序端与后台管理端覆盖用户、医生、管理员三种角色小程序端支持登录注册、科室与医生信息查看、新闻与留言浏览、在线预约及个人信息修改后台端提供科室、医生、病人、用户、预约、新闻、留言及系统管理等模块。资源包共4个文件以3个zip源码压缩包和1份SQL数据库脚本为主整体约31.45MB源码、脚本与说明文档分类清晰便于快速部署与二次开发。目前已有126人学习适合需要完整医疗类小程序实战案例的读者参考。1. 从一份 SSM JSP 微信小程序的智慧医疗系统源码说起打开这份「java 项目源码 微信小程序的智慧医疗系统 医院 智能医疗 ssm jsp」的压缩包你会看到三个彼此独立又互相咬合的工程一个跑在 Tomcat 上的 SSMSpring SpringMVC MyBatis后台一个用 JSP 渲染的医院管理端页面还有一个用微信小程序原生框架写的患者端。它解决的不是「AI 看病」这种玄学命题而是医院信息化里最朴素的一环——把挂号、科室、医生排班、病历、缴费这些线下流程搬到线上让患者在小程序里点几下就能完成让管理员在 JSP 后台里改数据、看统计。适合谁适合正在做毕设的计算机专业学生、想拿一套完整 Java Web 全栈项目练手的初中级工程师以及需要快速搭一个医疗类业务原型的开发者。它不追求高并发但胜在链路完整小程序发请求、SSM 接住、MyBatis 落库、JSP 回显一条线走通你就能把「智慧医疗」这四个字从概念变成能跑起来的东西。2. 先看清这套智慧医疗系统的三层架构与数据流向2.1 SSM 后台、JSP 管理端、小程序端各自负责什么这套系统的分层非常典型几乎是把 Java Web 的教科书结构原样搬进了医疗场景。SSM 后台是核心Spring 负责 IoC 和事务SpringMVC 负责把 HTTP 请求映射到 ControllerMyBatis 负责 SQL 映射和结果集封装。它对外暴露两类接口一类给 JSP 管理端用返回 ModelAndView 或直接转发页面另一类给微信小程序用返回 JSON。JSP 管理端是给医院管理员用的比如医生管理、科室管理、挂号记录查询、公告发布页面用 JSTL 标签渲染表单提交走传统的同步请求。微信小程序端是给患者用的登录、选科室、选医生、选时间段、提交挂号、查看个人挂号记录全部通过 wx.request 调后台 JSON 接口。三层之间的数据流是这样的小程序端拿到用户 openid 或手机号后调后台登录接口后台查用户表返回 token 或 sessionId之后每次请求带上这个标识后台校验后查 MyBatis Mapper把结果以 JSON 返回JSP 端则依赖 Session 里的管理员对象直接走 SpringMVC 的视图解析器跳转。理解这条链路后面改任何功能你都知道该动哪一层。2.2 数据库表结构与核心字段设计医疗系统的表设计有几个绕不开的实体用户、医生、科室、排班、挂号记录、病历。下面这张表是这套源码里最核心的几张表及其关键字段你拿到数据库脚本后可以对照看。表名作用关键字段注意点user患者/管理员账号id,openid,phone,role,passwordrole区分患者和管理员openid存小程序唯一标识doctor医生信息id,name,dept_id,title,introdept_id外键关联科室title是职称department科室id,name,location科室名要唯一避免小程序端下拉框重复schedule排班id,doctor_id,date,time_slot,remainremain是剩余号源挂号时要做扣减registration挂号记录id,user_id,schedule_id,status,create_timestatus用 0/1/2 表示待就诊/已就诊/已取消medical_record病历id,user_id,doctor_id,diagnosis,prescription诊断和处方字段长度要留够设计上最容易翻车的是schedule表的remain字段。很多人直接在小程序端显示剩余号源但扣减逻辑写在 Java 里如果并发上来两个请求同时读到remain1就会超卖。常见做法是在 SQL 里用update schedule set remain remain - 1 where id ? and remain 0靠数据库行锁保证原子性而不是先查再改。2.3 从数据库脚本到可运行工程的落地步骤拿到源码后不要急着改代码先把环境跑通。下面这套步骤是我一般会走的顺序按它来能少踩很多环境坑。第一步导入数据库脚本。用 Navicat 或命令行连上 MySQL创建数据库smart_medical字符集选utf8mb4然后执行源码里的.sql文件。注意脚本里如果有DROP TABLE IF EXISTS确认你连的不是生产库。# 登录 MySQL 并创建数据库 mysql -u root -p CREATE DATABASE smart_medical DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE smart_medical; SOURCE /path/to/smart_medical.sql;这段命令的逻辑是先建库并指定字符集再切到该库执行脚本。utf8mb4是为了支持 emoji 和生僻字医疗系统里患者姓名偶尔会有生僻字用utf8可能存进去变问号。执行完用SHOW TABLES;确认表都建出来了。第二步配置 SSM 工程的数据库连接。打开src/main/resources下的jdbc.properties或db.properties把jdbc.url、jdbc.username、jdbc.password改成你本地的。常见配置如下jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/smart_medical?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的密码serverTimezone必须设否则 MySQL 8 会报时区错误。characterEncodingutf8要和数据库字符集对应不然中文乱码。第三步部署到 Tomcat 并启动。把工程打成 war 包或直接在 IDEA 里配 Tomcat启动后访问http://localhost:8080/项目名/能看到 JSP 登录页就说明后台通了。如果报 404检查web.xml里的DispatcherServlet映射和spring-mvc.xml的组件扫描路径。第四步导入微信小程序工程。用微信开发者工具打开小程序目录改app.js或config.js里的baseUrl指向你本机后台地址。注意小程序开发工具默认不校验合法域名但真机调试必须用 HTTPS 且域名备案本地测试勾选「不校验合法域名」即可。3. 微信小程序端与 SSM 后台的接口对接实操3.1 小程序登录与获取手机号的完整链路微信小程序的登录不是简单的账号密码而是wx.login拿 code后端拿 code 加appid、secret调微信接口换openid和session_key。这套源码里通常会在后台写一个/wx/login接口处理。下面是小程序端的核心代码// pages/login/login.js wx.login({ success(res) { if (res.code) { wx.request({ url: baseUrl /wx/login, method: POST, data: { code: res.code }, success(r) { // 后端返回 openid 和自定义 token wx.setStorageSync(token, r.data.token); wx.setStorageSync(openid, r.data.openid); } }); } } });逻辑说明wx.login的 code 只能用一次五分钟有效所以必须立刻发给后端。后端拿到 code 后调https://api.weixin.qq.com/sns/jscode2session用appid、secret、code换openid。参数上appid和secret写在后台配置文件里不要硬编码在小程序端否则泄露。获取手机号则是另一个接口getPhoneNumber需要用户点击按钮授权拿到加密的encryptedData和iv后端用session_key解密。这里最常见的坑是session_key过期解密失败解决方法是让用户重新登录。3.2 挂号接口的参数设计与号源扣减挂号是这套系统里业务最重的一环。小程序端选完科室、医生、日期、时间段后调/registration/add接口。请求参数一般包括doctorId、scheduleId、userId、timeSlot。后端 Controller 收到后先校验schedule的remain是否大于 0再插入registration记录最后扣减号源。这三步必须在一个事务里。// RegistrationServiceImpl.java Transactional public Result addRegistration(Integer userId, Integer scheduleId) { // 原子扣减避免超卖 int updated scheduleMapper.reduceRemain(scheduleId); if (updated 0) { return Result.fail(号源已满); } Registration reg new Registration(); reg.setUserId(userId); reg.setScheduleId(scheduleId); reg.setStatus(0); reg.setCreateTime(new Date()); registrationMapper.insert(reg); return Result.success(挂号成功); }逻辑说明reduceRemain对应的 SQL 是update schedule set remain remain - 1 where id #{id} and remain 0返回影响行数。如果返回 0说明号源已被抢完直接返回失败不插入记录。Transactional保证扣减和插入要么都成功要么都回滚。参数上status0表示待就诊后续医生端可以改成 1 已就诊或 2 已取消。这里不要用「先 select 再 update」的写法那是超卖的经典翻车现场。3.3 JSP 管理端如何展示挂号记录与医生排班JSP 管理端用的是传统的 SpringMVC JSTL。Controller 返回ModelAndView把挂号记录列表放进modelJSP 用c:forEach遍历渲染。下面是一个典型的 JSP 片段% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % table trth患者/thth医生/thth科室/thth时间/thth状态/th/tr c:forEach items${regList} varreg tr td${reg.userName}/td td${reg.doctorName}/td td${reg.deptName}/td td${reg.scheduleDate} ${reg.timeSlot}/td td c:choose c:when test${reg.status 0}待就诊/c:when c:when test${reg.status 1}已就诊/c:when c:otherwise已取消/c:otherwise /c:choose /td /tr /c:forEach /table逻辑说明c:forEach遍历后台传来的regList每条记录是一个包含患者名、医生名、科室名、排班时间和状态的 VO。状态用c:choose做条件渲染比在 Java 里拼字符串更清晰。参数上regList需要在 Controller 里通过 MyBatis 的关联查询拿到通常写一个selectRegistrationWithDetail的 SQL用join把 user、doctor、department、schedule 四张表连起来。注意 JSP 页面里不要写太多 Java 代码% %脚本片段能少用就少用否则后期维护是黑匣子。4. 部署与联调中最容易翻车的五个坑4.1 中文乱码从数据库到 JSP 到小程序的连锁反应现象JSP 页面显示的中文变成问号或者小程序端收到的 JSON 里中文乱码。原因字符集在某一层没对齐。数据库建库时用了latin1或者 JDBC URL 没加characterEncodingutf8或者 Tomcat 的server.xml里 Connector 没设URIEncodingUTF-8。解决按「数据库 → 连接串 → Tomcat → 响应头」的顺序排查。数据库执行ALTER DATABASE smart_medical CHARACTER SET utf8mb4;JDBC URL 加characterEncodingutf8Tomcat Connector 加URIEncodingUTF-8SpringMVC 配置StringHttpMessageConverter的默认编码为 UTF-8。4.2 小程序请求后台报「不在合法域名列表」现象开发者工具里请求成功真机预览时报域名不合法。原因微信小程序正式环境要求所有请求域名必须 HTTPS 且在小程序后台配置。解决开发阶段在开发者工具「详情 → 本地设置」勾选「不校验合法域名、web-view、TLS 版本以及 HTTPS 证书」。上线前必须把后台部署到 HTTPS 域名并备案然后在微信公众平台配置request合法域名。本地测试也可以用内网穿透工具生成临时 HTTPS 地址但注意这类工具仅用于开发调试。4.3 MyBatis 映射文件字段名与实体类对不上现象查询返回的对象字段全是 null但 SQL 在数据库里能查到数据。原因数据库字段是dept_id实体类是deptIdMyBatis 默认不开启驼峰映射。解决在mybatis-config.xml里加setting namemapUnderscoreToCamelCase valuetrue/或者在 Mapper XML 里手动写resultMap做字段映射。我一般会开驼峰映射省得每个字段都写一遍。4.4 挂号并发时号源超卖现象两个用户同时挂同一个号结果都成功了但号源只剩一个。原因先select查remain再update扣减两步之间有时间窗口。解决把扣减写成原子 SQLupdate schedule set remain remain - 1 where id ? and remain 0根据返回的影响行数判断是否成功。这是血泪经验别问我是怎么知道的。4.5 JSP 页面引入静态资源 404现象JSP 里写的 CSS、JS、图片路径在浏览器里 404。原因SpringMVC 的DispatcherServlet拦截了所有请求包括静态资源。解决在spring-mvc.xml里加mvc:resources mapping/static/** location/static//和mvc:default-servlet-handler/把静态资源放行。路径上建议用${pageContext.request.contextPath}/static/xxx避免项目名变化后路径失效。5. 让这套源码真正变成你的东西二次开发与验证技巧拿到一套能跑的源码只是起点真正有价值的是你能不能在它上面加功能、改逻辑、验证正确性。我一般会从三个方向动手加一个「医生端查看今日挂号」接口把号源扣减改成 Redis 预扣减用 Postman 做接口回归。先看加接口。在DoctorController里加一个/doctor/todayRegistrations参数是doctorId返回当天该医生的挂号列表。SQL 用select * from registration r join schedule s on r.schedule_id s.id where s.doctor_id ? and s.date curdate()。这个功能能帮你理解 SSM 的 Controller-Service-Mapper 三层怎么串。再看 Redis 预扣减。原方案靠数据库行锁并发再高会压数据库。改进思路是排班创建时把号源数量写进 Redis挂号时用decrement原子扣减扣到负数就拒绝然后异步落库。验证方法是写一个 JMeter 脚本100 个线程同时调挂号接口看最终registration表记录数是否等于初始号源数。如果多了说明扣减逻辑还有漏洞。最后是接口回归。用 Postman 建一个 Collection把登录、查科室、查医生、挂号、查记录五个接口串成一条链路每次改代码后跑一遍。参数化token和scheduleId用 Tests 脚本断言status code和返回 JSON 的code字段。这套习惯让我在改任何一处代码后都能快速知道有没有把别的功能弄坏。我自己的教训是不要一上来就重构。先把源码跑通把数据库脚本、配置文件、接口文档三样东西对齐再动第一行代码。改的时候一次只改一个功能改完立刻用 Postman 或小程序真机验证。这套智慧医疗系统源码的价值不在于它多完美而在于它给了你一个完整的、能跑通的 Java Web 全栈骨架你往里面填什么它就变成什么。希望帮到你。本文还有配套的精品资源点击获取