1. 项目背景与核心需求
健康体检预约系统是当前医疗信息化领域的热门应用方向。随着移动互联网的普及,越来越多的体检机构开始通过微信小程序提供在线预约服务。这种模式不仅方便用户随时随地进行体检预约,还能有效分流线下排队压力,优化体检中心的服务流程。
我们采用uni-app框架开发微信小程序前端,配合Python后端服务,主要解决以下几个核心痛点:
- 跨平台兼容性问题:传统开发方式需要为不同平台(iOS/Android/Web)分别开发,而uni-app可以一套代码多端运行,大幅降低开发成本
- 预约流程繁琐:线下预约需要电话沟通或现场排队,线上系统可以实现7×24小时自助预约
- 体检项目管理困难:体检中心需要动态管理各类体检套餐、医生排班等信息
- 数据统计分析缺失:传统方式难以收集和分析用户预约行为数据
2. 技术架构设计
2.1 整体架构方案
系统采用前后端分离架构:
code复制前端:uni-app(Vue.js) → 编译为微信小程序
后端:Python(Django/Flask) + MySQL
通信:RESTful API + WebSocket(可选)
选择uni-app的主要原因:
- 基于Vue.js生态,开发体验好
- 丰富的组件库和插件市场
- 完善的微信小程序适配支持
- 一次开发可发布到多个平台
2.2 关键技术选型
前端技术栈
- uni-app框架:使用Vue语法开发跨平台应用
- uView UI:uni-app生态中最成熟的UI框架
- 微信小程序原生API:调用微信支付、位置服务等能力
- Vuex状态管理:管理全局的预约状态、用户信息
后端技术栈
- Python Flask:轻量级Web框架,适合快速开发API
- SQLAlchemy:ORM工具,简化数据库操作
- Redis:缓存热门体检项目、处理并发预约
- Celery:异步任务处理(如发送预约通知)
3. 核心功能实现
3.1 用户端功能实现
3.1.1 体检预约流程
- 项目展示页面
vue复制<template>
<view class="package-list">
<u-card v-for="item in packages" :key="item.id">
<template #header>
<text>{{item.name}}</text>
</template>
<template #body>
<u-tag :text="item.category" />
<text>¥{{item.price}}</text>
</template>
</u-card>
</view>
</template>
<script>
export default {
data() {
return {
packages: [] // 从API获取的体检套餐数据
}
},
onLoad() {
this.loadPackages()
},
methods: {
async loadPackages() {
const res = await uni.request({
url: '/api/packages',
method: 'GET'
})
this.packages = res.data
}
}
}
</script>
- 预约时间选择
- 对接微信日历组件
- 实时获取医生排班数据
- 实现日期禁用逻辑(节假日、已约满时段)
3.1.2 支付系统集成
微信小程序支付实现要点:
javascript复制// 发起支付请求
async function requestPayment(orderId) {
const res = await uni.request({
url: '/api/pay/prepay',
data: { orderId }
})
uni.requestPayment({
provider: 'wxpay',
...res.data,
success: () => {
// 支付成功处理
},
fail: (err) => {
console.error('支付失败', err)
}
})
}
注意:微信支付需要配置合法域名和HTTPS,开发阶段可使用微信开发者工具的"不校验合法域名"选项
3.2 管理端功能实现
3.2.1 预约管理后台
Python Flask实现基础API示例:
python复制from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@localhost/db'
db = SQLAlchemy(app)
class Appointment(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer)
package_id = db.Column(db.Integer)
schedule = db.Column(db.DateTime)
status = db.Column(db.String(20))
@app.route('/api/appointments', methods=['GET'])
def get_appointments():
appointments = Appointment.query.all()
return jsonify([a.to_dict() for a in appointments])
3.2.2 数据统计模块
使用Python pandas处理预约数据:
python复制import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql://user:pass@localhost/db')
df = pd.read_sql('SELECT * FROM appointments', engine)
# 按套餐统计预约量
package_stats = df.groupby('package_id').size()
# 按时间段统计
time_stats = df.groupby(pd.to_datetime(df['schedule']).dt.hour).size()
4. 关键技术难点与解决方案
4.1 高并发预约处理
体检预约系统在促销期间可能面临高并发问题,我们采用以下方案:
- Redis缓存预热
python复制# 提前加载热门套餐到Redis
def cache_hot_packages():
hot_packages = db.session.query(Package).order_by(Package.view_count.desc()).limit(10).all()
for p in hot_packages:
redis_client.set(f'package:{p.id}', p.to_json())
- 库存扣减优化
- 使用Redis原子操作保证库存准确性
- 采用预扣库存+异步确认机制
4.2 微信小程序性能优化
- 分包加载
json复制// manifest.json
{
"mp-weixin": {
"optimization": {
"subPackages": true
}
}
}
- 图片懒加载
vue复制<u-image
:src="item.image"
mode="aspectFill"
lazy-load
></u-image>
- 数据分页加载
javascript复制async loadMore() {
if(this.loading || this.finished) return
this.loading = true
const res = await this.$http.get('/api/packages', {
params: {
page: this.page++,
size: 10
}
})
this.list = [...this.list, ...res.data]
this.loading = false
this.finished = res.data.length < 10
}
5. 部署与运维方案
5.1 小程序发布流程
- 开发环境配置
- 微信开发者工具
- 配置合法域名
- 申请微信支付商户号
- uni-app编译发布
bash复制# 开发环境
npm run dev:mp-weixin
# 生产环境
npm run build:mp-weixin
5.2 后端服务部署
推荐使用Docker容器化部署:
dockerfile复制FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "-w 4", "-b :5000", "app:app"]
部署命令:
bash复制docker build -t health-booking .
docker run -d -p 5000:5000 --name booking health-booking
6. 常见问题与解决方案
6.1 微信登录失败排查
- 检查AppID配置
- 确保uni-app项目的manifest.json中配置了正确的微信小程序AppID
- 检查微信开放平台的应用配置
- 域名白名单设置
- 登录微信公众平台
- 开发→开发设置→服务器域名
- 添加request合法域名
6.2 支付接口常见错误
| 错误码 | 原因 | 解决方案 |
|---|---|---|
| -1 | 系统错误 | 检查统一下单接口参数 |
| -2 | 用户取消 | 引导用户重新支付 |
| -3 | 发送失败 | 检查网络连接 |
| -4 | 授权失败 | 检查支付权限 |
6.3 数据库性能优化
- 索引优化
python复制class Appointment(db.Model):
__table_args__ = (
db.Index('idx_user', 'user_id'),
db.Index('idx_schedule', 'schedule'),
)
- 查询优化
- 使用SQLAlchemy的lazy loading
- 避免N+1查询问题
- 对大表进行分表处理
7. 项目扩展方向
- 智能推荐系统
- 基于用户历史体检数据推荐套餐
- 实现协同过滤算法
- 体检报告查询
- 对接医院LIS系统
- 开发报告解读功能
- 健康档案管理
- 长期保存用户体检记录
- 生成健康趋势分析图表
- 家庭账户体系
- 支持为家人预约体检
- 共享健康档案
在实际开发中,我们发现uni-app的跨平台特性确实大幅提升了开发效率,一套代码可以同时发布到微信小程序、H5和App。Python后端的简洁语法也让API开发变得非常高效。特别是在处理体检预约这种典型的高并发场景时,Redis的合理使用显著提升了系统稳定性。
