1. 项目背景与核心价值
儿童疫苗接种是每个家庭都必须面对的重要事项。作为一名长期关注医疗信息化领域的开发者,我深知家长们在疫苗接种管理上的痛点:错过接种时间、忘记带接种证、排队等候时间过长等问题屡见不鲜。这正是我们团队决定开发"儿童疫苗接种预约医疗提醒系统"的初衷。
这个系统基于微信小程序作为前端入口,结合Python后端服务和uniapp跨平台框架,实现了三大核心功能:
- 智能预约:家长可实时查看附近接种点的可预约时段
- 精准提醒:基于接种计划自动推送提醒通知
- 电子档案:数字化管理孩子的完整接种记录
特别提示:系统设计时我们重点考虑了数据安全性,所有健康数据均采用医疗级加密存储,符合《儿童个人信息网络保护规定》的要求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计解析
2.1 整体技术栈选型
经过多次技术论证,我们最终确定了以下技术组合:
code复制前端:微信小程序 + uniapp框架
后端:Python Flask + MySQL
部署:Docker容器化 + Nginx负载均衡
选择这套方案主要基于以下考虑:
- 微信小程序覆盖了95%以上的目标用户群体,无需额外安装APP
- uniapp的跨平台特性让我们后续可快速扩展至其他平台(如支付宝小程序)
- Python Flask框架在医疗领域的成熟应用案例丰富,开发效率高
- Docker部署保证了不同环境的一致性,降低运维成本
2.2 关键接口设计
疫苗接种系统涉及多个核心接口,这里以预约接口为例说明设计要点:
python复制@app.route('/api/v1/appointment', methods=['POST'])
def create_appointment():
# 参数校验
required_fields = ['child_id', 'vaccine_id', 'clinic_id', 'time_slot']
if not all(field in request.json for field in required_fields):
return jsonify({'code': 400, 'message': '缺少必要参数'})
# 预约冲突检查
existing = Appointment.query.filter_by(
clinic_id=request.json['clinic_id'],
time_slot=request.json['time_slot']
).first()
if existing:
return jsonify({'code': 409, 'message': '该时段已被预约'})
# 创建预约记录
new_appt = Appointment(
child_id=request.json['child_id'],
vaccine_id=request.json['vaccine_id'],
clinic_id=request.json['clinic_id'],
time_slot=request.json['time_slot'],
status=0 # 0-待确认
)
db.session.add(new_appt)
db.session.commit()
# 发送微信模板消息
send_template_msg(
user_openid=get_openid_by_child(request.json['child_id']),
template_id='预约成功通知模板ID',
data={
'time': format_time(request.json['time_slot']),
'clinic': get_clinic_name(request.json['clinic_id']),
'vaccine': get_vaccine_name(request.json['vaccine_id'])
}
)
return jsonify({'code': 200, 'data': {'appointment_id': new_appt.id}})
3. 微信小程序前端实现细节
3.1 uniapp跨端适配方案
我们使用uniapp的条件编译特性处理平台差异:
javascript复制// #ifdef MP-WEIXIN
const systemInfo = wx.getSystemInfoSync()
const navBarHeight = systemInfo.statusBarHeight + 44
// #endif
// #ifdef H5
const navBarHeight = 44
// #endif
针对微信小程序特有的顶部导航栏高度问题,我们封装了通用工具方法:
javascript复制export function getSafeArea() {
const systemInfo = uni.getSystemInfoSync()
const menu = wx.getMenuButtonBoundingClientRect()
return {
statusBarHeight: systemInfo.statusBarHeight,
navBarHeight: (menu.top - systemInfo.statusBarHeight) * 2 + menu.height
}
}
3.2 预约日历组件开发
疫苗接种预约对日期选择有特殊要求:
- 需排除接种点休息日
- 需根据疫苗类型过滤可接种日期
- 需实时显示各时段剩余名额
我们基于uni-calendar二次开发了智能日历组件:
javascript复制<uni-calendar
:selected="selectedDates"
:disable-before="today"
:show-month="false"
@change="handleDateChange"
:custom-style="{
'background': '#f7f7f7',
'selected-background': '#4cd964',
'disabled-color': '#cccccc'
}">
<template v-slot:content="{date}">
<view v-if="isAvailable(date)" class="slot-item">
<text>{{ getAvailableSlots(date) }}个时段</text>
</view>
</template>
</uni-calendar>
4. 提醒服务实现方案
4.1 接种计划计算引擎
系统内置了国家免疫规划疫苗程序表,并支持自定义计算规则:
python复制class VaccineScheduler:
def __init__(self, birth_date):
self.birth_date = parse_date(birth_date)
def get_schedule(self):
return [
{
'vaccine': '乙肝疫苗',
'dose': 1,
'recommended_date': self.birth_date,
'min_date': self.birth_date,
'max_date': self.birth_date + timedelta(days=1)
},
{
'vaccine': '卡介苗',
'dose': 1,
'recommended_date': self.birth_date + timedelta(days=30),
'min_date': self.birth_date + timedelta(days=28),
'max_date': self.birth_date + timedelta(days=365)
}
# 其他疫苗...
]
4.2 多渠道提醒触发机制
我们设计了三级提醒策略:
- 提前7天:微信服务通知
- 提前3天:短信提醒
- 当天:小程序弹窗+语音提醒
提醒服务核心逻辑:
python复制def check_reminders():
now = datetime.now()
upcoming = Vaccination.query.filter(
Vaccination.scheduled_date.between(now, now + timedelta(days=7)),
Vaccination.status == 'pending'
).all()
for item in upcoming:
delta = (item.scheduled_date - now.date()).days
if delta == 7:
send_wechat_reminder(item)
elif delta == 3:
send_sms_reminder(item)
elif delta == 0:
send_push_notification(item)
5. 部署与性能优化
5.1 高并发场景处理
疫苗接种预约往往在特定时段(如新疫苗上市)会出现流量高峰。我们采用以下优化策略:
-
Redis缓存:热门接种点信息缓存30秒
python复制@cache.memoize(timeout=30) def get_clinic_availability(clinic_id): return db.session.query(...).filter(...).all() -
消息队列:异步处理预约确认通知
python复制@celery.task def send_confirmation(appointment_id): appt = Appointment.query.get(appointment_id) # 发送逻辑... -
数据库读写分离:查询操作使用只读副本
5.2 监控与告警体系
我们建立了多维度的监控指标:
- 预约成功率
- 提醒到达率
- 接口响应时间
- 异常错误率
使用Prometheus+Grafana构建的监控看板示例配置:
yaml复制scrape_configs:
- job_name: 'vaccine_app'
metrics_path: '/metrics'
static_configs:
- targets: ['app:5000']
6. 实际开发中的经验总结
6.1 微信小程序特定问题解决
问题1:iOS设备视频播放异常
解决方案:需要对视频链接做HTTPS校验和格式转换
javascript复制function fixVideoUrl(url) {
// #ifdef MP-WEIXIN
if (uni.getSystemInfoSync().platform === 'ios') {
return url.replace('http://', 'https://')
.replace('.mp4', '.m3u8')
}
// #endif
return url
}
问题2:用户隐私授权处理
解决方案:需要兼容新旧授权API
javascript复制function checkPrivacy() {
return new Promise((resolve) => {
if (wx.getPrivacySetting) {
wx.getPrivacySetting({
success: res => {
if (res.needAuthorization) {
wx.requirePrivacyAuthorize({ resolve })
} else {
resolve()
}
}
})
} else {
resolve()
}
})
}
6.2 性能优化技巧
-
小程序分包加载:将预约模块和档案模块拆分为独立分包
json复制{ "subPackages": [{ "root": "packageA", "pages": ["pages/appointment/index"] }] } -
接口数据瘦身:使用GraphQL替代RESTful接口
javascript复制query { child(id: "123") { name vaccinations { date vaccine { name } } } } -
图片优化:所有图片经过TinyPNG压缩并转换为WebP格式
7. 扩展功能与未来规划
当前系统已经实现了核心的预约和提醒功能,但我们还在持续迭代:
- 智能推荐:基于地理位置和接种历史推荐最优接种点
- 健康档案:整合体检数据生成儿童健康报告
- 在线咨询:接入儿科医生在线答疑服务
- 接种反应记录:家长可上传接种后反应情况
一个正在开发中的特色功能是接种点人流量预测:
python复制def predict_crowd(clinic_id, date):
# 基于历史数据+天气+节假日等因素的预测模型
model = load_model(f'clinic_{clinic_id}.h5')
features = prepare_features(date)
return model.predict(features)[0]
这套系统在实际运营中已经服务了超过10万家庭,平均为每个孩子减少2小时的接种等待时间。开发过程中最深的体会是:医疗类应用必须把数据准确性和系统稳定性放在首位,任何功能设计都要以减轻家长焦虑为目标。
