1. 项目背景与需求分析
2020年新冠疫情爆发以来,核酸检测已成为常态化防疫手段。传统医院检测流程存在几个痛点:现场排队增加感染风险、纸质登记效率低下、结果查询不便。这正是我们开发微信小程序核酸检测服务系统的核心驱动力。
选择微信小程序作为载体具有天然优势:无需安装、即用即走,用户基数大(微信月活超12亿),特别适合中老年群体快速上手。系统需要实现三大核心功能:
- 在线预约分流:分时段预约避免人群聚集
- 电子化信息登记:减少接触传播风险
- 报告实时推送:降低纸质报告传递的病毒传播可能
从技术架构看,系统采用经典三层架构:
- 前端:微信小程序(WXML+WXSS+JS)
- 后端:Java Spring Boot
- 数据库:MySQL 8.0
提示:选择Spring Boot而非PHP/Python等语言,主要考虑医院系统对稳定性和并发能力的要求,以及后续与HIS系统对接的便利性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块设计
2.1 预约挂号子系统
采用分时段的号源池设计是核心创新点。每个检测点设置如下参数:
- 单日最大检测量(如2000人次)
- 单时段容量(如每30分钟100人次)
- 特殊时段设置(如早高峰增加20%容量)
java复制// 号源生成算法示例
public List<TimeSlot> generateTimeSlots(LocalDate date, int dailyCapacity) {
List<TimeSlot> slots = new ArrayList<>();
int slotsPerDay = 24 * 2; // 30分钟为一个时段
int capacityPerSlot = (int) Math.ceil(dailyCapacity * 1.0 / slotsPerDay);
for (int i = 0; i < slotsPerDay; i++) {
LocalTime start = LocalTime.of(i/2, (i%2)*30);
slots.add(new TimeSlot(date, start, capacityPerSlot));
}
return slots;
}
2.2 检测登记模块
采用OCR识别身份证技术减少手动输入错误:
- 调用微信原生camera组件拍照
- 通过腾讯云OCR API提取信息
- 自动填充表单字段
javascript复制// 小程序端调用相机
wx.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['camera'],
success: function(res) {
uploadIDCard(res.tempFilePaths[0])
}
})
2.3 报告查询系统
结果推送采用双通道保障机制:
- 微信服务通知(即时推送)
- 短信备份(6小时后未查看时触发)
数据库设计关键表:
sql复制CREATE TABLE `test_report` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '预约单号',
`patient_id` varchar(18) NOT NULL COMMENT '身份证号',
`test_time` datetime NOT NULL,
`result_time` datetime DEFAULT NULL,
`result` varchar(10) DEFAULT NULL COMMENT '阴性/阳性',
`ct_value` decimal(5,2) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_order_no` (`order_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 关键技术实现细节
3.1 高并发预约处理
采用Redis缓存+数据库双写策略应对预约高峰:
- 号源数据预热到Redis
- 使用Lua脚本保证原子性扣减
- 异步落库保证最终一致性
java复制// Redis库存扣减Lua脚本
String script = "local current = redis.call('get', KEYS[1]) " +
"if current and tonumber(current) >= tonumber(ARGV[1]) then " +
"return redis.call('decrby', KEYS[1], ARGV[1]) " +
"else return -1 end";
Long result = redisTemplate.execute(
new DefaultRedisScript<>(script, Long.class),
Collections.singletonList("slot:20230501:AM"),
Collections.singletonList("1")
);
3.2 小程序性能优化
通过三方面提升用户体验:
- 分包加载:将检测点选择、预约等非核心功能拆分为子包
- 缓存策略:本地缓存医院列表等静态数据
- 骨架屏:数据加载时显示占位UI
javascript复制// app.json分包配置
{
"pages": ["pages/index/index"],
"subpackages": [
{
"root": "packageHospital",
"pages": ["select/index", "map/index"]
}
]
}
3.3 安全防护措施
重点防范三大风险:
- 刷号:图形验证码+手机号验证
- 数据泄露:字段级加密(如身份证号)
- 越权访问:JWT鉴权+RBAC模型
java复制// 身份证加密存储示例
public String encryptIDCard(String idCard) {
String salt = SecureRandomUtil.randomString(6);
return salt + "|" + DigestUtils.sha256Hex(idCard + salt);
}
4. 项目部署与上线
4.1 服务器环境配置
推荐最低配置:
- 云服务器:2核4G(突发峰值需自动扩容)
- 数据库:MySQL 8.0主从架构
- 中间件:Redis哨兵模式
bash复制# 示例部署命令
nohup java -jar -Xms512m -Xmx1024m \
-Dspring.profiles.active=prod \
hospital-test.jar > log.out 2>&1 &
4.2 小程序审核要点
特别注意三类问题:
- 医疗资质:需上传医疗机构合作证明
- 隐私政策:明确说明数据收集范围
- 支付规范:检测费需走微信支付
注意:个人开发者账号无法上线医疗类小程序,必须使用医院主体注册企业账号。
4.3 监控运维方案
建立三级监控体系:
- 基础监控:CPU/内存/磁盘(Zabbix)
- 业务监控:预约成功率(Prometheus)
- 日志分析:异常请求(ELK)
5. 毕业设计扩展建议
5.1 论文写作方向
可深入研究的三个维度:
- 系统架构设计:微服务化改造路径
- 算法优化:动态号源分配算法
- 社会效益:数字化防疫的投入产出比分析
5.2 功能扩展思路
值得增加的三个功能:
- 团队预约:企业/学校批量预约
- 异常预警:CT值异常自动提醒
- 数据可视化:区域检测热力图
python复制# 热力图生成示例(伪代码)
def generate_heatmap():
data = query_test_results()
folium_map = folium.Map(location=[city_lat, city_lng])
HeatMap(data).add_to(folium_map)
return folium_map._repr_html_()
5.3 源码使用指南
项目包含三个关键分支:
- master:稳定生产版本
- dev:最新开发版本
- thesis:论文配套代码
建议开发环境:
- JDK 11+
- MySQL 8.0.25+
- Redis 6.2+
我在实际部署中发现一个易错点:微信支付回调地址必须使用HTTPS且备案域名,本地测试时可使用natapp等内网穿透工具,但正式环境必须配置正规域名证书。另一个实用技巧是使用阿里云OSS存储检测报告PDF文件,比直接存数据库更经济高效。
