基于微信小程序的陪诊服务系统:技术栈、背景意义与核心代码实战
2026/9/5 13:37:34 网站建设 项目流程

1. 引言

随着我国人口老龄化进程加快以及独居青年、异地就医人群的增多,“就医难、陪诊难”成为社会痛点。陪诊服务作为一种新兴的本地生活服务,能够为患者提供挂号取号、排队缴费、取药送检、记录医嘱等全程陪伴,有效缓解就医焦虑、提升就诊效率。微信小程序凭借其“即用即走、无需下载、社交裂变”的优势,成为陪诊服务落地的最佳载体。本文将从背景意义、技术选型、系统架构和核心代码四个维度,完整讲解一个基于微信小程序的陪诊服务系统的设计与开发。

2. 背景与意义

2.1 行业背景

国家统计局数据显示,截至2025年底,我国60岁及以上人口已超过3.1亿,占总人口的22%以上。老年人普遍存在行动不便、不熟悉智能设备、对医院流程陌生等问题,独自就医困难重重。与此同时,一二线城市中大量“空巢青年”和异地务工人员,在生病时也缺乏家人陪伴。陪诊服务正是针对这一供需缺口应运而生的专业化服务。

2.2 系统意义

  • 社会价值:缓解老年人及弱势群体的就医困难,提升就医体验,减轻家属负担。
  • 商业价值:陪诊服务客单价高、复购率强,是本地生活服务的新蓝海,具备良好的盈利空间。
  • 技术价值:小程序端 + 云开发/自建后端 + 管理后台的三端架构,是典型的全栈实战项目,适合作为毕业设计或技术进阶项目。

3. 技术栈选型

3.1 前端(小程序端)

  • 框架:微信小程序原生框架(WXML + WXSS + JS),或 Taro / uni-app 跨端框架(可选)。
  • UI 组件库:Vant Weapp 或 TDesign 小程序组件库,快速搭建美观界面。
  • 状态管理:小程序全局 App 实例 + 本地缓存 Storage,复杂场景可引入 MobX。
  • 地图与定位:微信内置wx.getLocation与腾讯位置服务,用于陪诊员定位与导航。

3.2 后端

  • 语言与框架:Node.js + Express / Koa,或 Java + Spring Boot(二选一,本文以 Node.js 为例)。
  • 数据库:MySQL 8.0(关系数据)+ Redis(缓存与会话)。
  • ORM:Sequelize(Node.js)或 MyBatis-Plus(Java)。
  • 鉴权:微信登录 code2session 换取 openid,配合 JWT 生成访问令牌。

3.3 管理后台

  • 框架:Vue 3 + Element Plus,或 React + Ant Design。
  • 功能:陪诊员审核、订单管理、服务定价、数据统计。

3.4 部署与运维

  • 云服务:腾讯云 / 阿里云 ECS,Nginx 反向代理,HTTPS 证书。
  • 对象存储:腾讯云 COS / 阿里云 OSS,用于存储用户头像、证件照片等。
  • 消息推送:微信订阅消息,用于订单状态变更通知。

4. 系统架构设计

4.1 整体架构

系统采用经典的前后端分离架构,整体分为三层:

flowchart TD A[微信小程序客户端] -->|HTTPS 请求| B[Nginx 网关] B --> C[Node.js 后端服务] C --> D[(MySQL 数据库)] C --> E[(Redis 缓存)] C --> F[腾讯云 COS 对象存储] C --> G[微信订阅消息 API] H[管理后台 Vue3] --> B

4.2 核心功能模块

  • 用户模块:微信一键登录、个人资料维护、历史订单查询。
  • 陪诊员模块:入驻申请、资质审核、接单/拒单、服务状态更新。
  • 订单模块:下单、支付(微信支付)、订单状态流转(待接单→进行中→已完成→已评价)。
  • 评价模块:服务完成后双方互评,评分影响陪诊员信用等级。
  • 消息模块:订单状态变更通过微信订阅消息实时通知用户。

5. 数据库设计

核心数据表包括用户表、陪诊员表、订单表、评价表。以下为订单表的核心结构:

CREATE TABLE `orders` ( `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `order_no` VARCHAR(32) NOT NULL COMMENT '订单编号', `user_id` BIGINT UNSIGNED NOT NULL COMMENT '下单用户ID', `escort_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '陪诊员ID', `hospital_name` VARCHAR(100) NOT NULL COMMENT '医院名称', `appointment_time` DATETIME NOT NULL COMMENT '预约就诊时间', `service_type` TINYINT NOT NULL DEFAULT 1 COMMENT '服务类型:1全程陪诊 2半程陪诊', `status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0待接单 1已接单 2进行中 3已完成 4已取消', `amount` DECIMAL(10,2) NOT NULL COMMENT '订单金额', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY `idx_user_id` (`user_id`), KEY `idx_escort_id` (`escort_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='陪诊订单表';

6. 核心代码实现

6.1 微信登录接口(后端 Node.js)

小程序端调用wx.login获取临时 code,后端通过 code 换取 openid 并签发 JWT。

// routes/auth.js const express = require('express'); const axios = require('axios'); const jwt = require('jsonwebtoken'); const { User } = require('../models'); const router = express.Router(); const APPID = process.env.WX_APPID; const SECRET = process.env.WX_SECRET; const JWT_SECRET = process.env.JWT_SECRET; router.post('/wxlogin', async (req, res) => { const { code, nickname, avatar } = req.body; if (!code) return res.status(400).json({ msg: '缺少code' }); try { // 1. code 换取 openid const { data } = await axios.get('https://api.weixin.qq.com/sns/jscode2session', { params: { appid: APPID, secret: SECRET, js_code: code, grant_type: 'authorization_code' } }); if (data.errcode) { return res.status(500).json({ msg: '微信登录失败: ' + data.errmsg }); } const { openid } = data; // 2. 查找或创建用户 let user = await User.findOne({ where: { openid } }); if (!user) { user = await User.create({ openid, nickname: nickname || '微信用户', avatar: avatar || '' }); } // 3. 签发 JWT const token = jwt.sign({ userId: user.id, openid }, JWT_SECRET, { expiresIn: '7d' }); res.json({ token, user: { id: user.id, nickname: user.nickname, avatar: user.avatar } }); } catch (err) { console.error(err); res.status(500).json({ msg: '服务器内部错误' }); } }); module.exports = router;

6.2 创建订单接口

用户提交陪诊需求,后端校验参数并生成订单。

// routes/order.js const express = require('express'); const { Order } = require('../models'); const authMiddleware = require('../middleware/auth'); const router = express.Router(); // 创建订单(需登录) router.post('/create', authMiddleware, async (req, res) => { const { hospitalName, appointmentTime, serviceType, amount, remark } = req.body; const userId = req.userId; if (!hospitalName || !appointmentTime || !serviceType || !amount) { return res.status(400).json({ msg: '参数不完整' }); } try { const orderNo = 'PZ' + Date.now() + Math.floor(Math.random() * 1000); const order = await Order.create({ orderNo, userId, hospitalName, appointmentTime: new Date(appointmentTime), serviceType, amount, remark: remark || '', status: 0 }); res.json({ code: 0, data: order }); } catch (err) { console.error(err); res.status(500).json({ msg: '创建订单失败' }); } }); module.exports = router;

6.3 小程序端下单页面(WXML + JS)

小程序端表单收集用户信息并调用后端接口。

<!-- pages/order/create.wxml --> <view class="container"> <view class="form-item"> <text class="label">医院名称</text> <input class="input" placeholder="请输入医院名称" bindinput="onHospitalInput" /> </view> <view class="form-item"> <text class="label">预约时间</text> <picker mode="date" bindchange="onDateChange"> <view class="picker">{{date || '请选择日期'}}</view> </picker> </view> <view class="form-item"> <text class="label">服务类型</text> <radio-group bindchange="onTypeChange"> <radio value="1" checked>全程陪诊</radio> <radio value="2">半程陪诊</radio> </radio-group> </view> <view class="form-item"> <text class="label">备注</text> <textarea class="textarea" placeholder="如:需要轮椅、行动不便等" bindinput="onRemarkInput" /> </view> <button class="submit-btn" bindtap="onSubmit">提交订单</button> </view>
// pages/order/create.js const app = getApp(); Page({ data: { hospitalName: '', date: '', serviceType: 1, amount: 199, remark: '' }, onHospitalInput(e) { this.setData({ hospitalName: e.detail.value }); }, onDateChange(e) { this.setData({ date: e.detail.value }); }, onTypeChange(e) { const type = Number(e.detail.value); this.setData({ serviceType: type, amount: type === 1 ? 199 : 129 }); }, onRemarkInput(e) { this.setData({ remark: e.detail.value }); }, async onSubmit() { const { hospitalName, date, serviceType, amount, remark } = this.data; if (!hospitalName || !date) { wx.showToast({ title: '请填写完整信息', icon: 'none' }); return; } const token = wx.getStorageSync('token'); if (!token) { wx.showToast({ title: '请先登录', icon: 'none' }); return; } wx.showLoading({ title: '提交中...' }); try { const res = await new Promise((resolve, reject) => { wx.request({ url: 'https://your-api.com/api/order/create', method: 'POST', header: { 'Authorization': 'Bearer ' + token }, data: { hospitalName, appointmentTime: date + ' 09:00:00', serviceType, amount, remark }, success: resolve, fail: reject }); }); wx.hideLoading(); if (res.data.code === 0) { wx.showToast({ title: '下单成功', icon: 'success' }); setTimeout(() => wx.navigateBack(), 1500); } else { wx.showToast({ title: res.data.msg || '下单失败', icon: 'none' }); } } catch (err) { wx.hideLoading(); wx.showToast({ title: '网络异常', icon: 'none' }); } } });

6.4 陪诊员接单接口

陪诊员查看待接单列表并抢单,抢单成功后订单状态更新。

// routes/escort.js const express = require('express'); const { Order, Escort } = require('../models'); const authMiddleware = require('../middleware/auth'); const router = express.Router(); // 陪诊员接单 router.post('/accept/:orderId', authMiddleware, async (req, res) => { const { orderId } = req.params; const userId = req.userId; try { const escort = await Escort.findOne({ where: { userId } }); if (!escort || escort.status !== 1) { return res.status(403).json({ msg: '您还不是审核通过的陪诊员' }); } const order = await Order.findByPk(orderId); if (!order) return res.status(404).json({ msg: '订单不存在' }); if (order.status !== 0) return res.status(400).json({ msg: '订单已被接取' }); // 事务更新,防止并发抢单 const [updated] = await Order.update( { status: 1, escortId: escort.id }, { where: { id: orderId, status: 0 } } ); if (updated === 0) return res.status(400).json({ msg: '手慢了,订单已被抢走' }); res.json({ code: 0, msg: '接单成功' }); } catch (err) { console.error(err); res.status(500).json({ msg: '接单失败' }); } }); module.exports = router;

7. 总结与展望

本文完整介绍了基于微信小程序的陪诊服务系统的背景意义、技术栈选型、系统架构、数据库设计以及核心代码实现。该系统覆盖了微信登录、订单流转、陪诊员接单等关键业务闭环,是一个兼具社会价值与商业价值的全栈实战项目。后续可在此基础上扩展在线支付(微信支付)、实时定位追踪、AI 智能分单、信用评价体系等功能,进一步提升系统的智能化水平与用户体验。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询