基于微信小程序的陪诊服务系统设计开发实现
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缓存与会话。ORMSequelizeNode.js或 MyBatis-PlusJava。鉴权微信登录 code2session 换取 openid配合 JWT 生成访问令牌。3.3 管理后台框架Vue 3 Element Plus或 React Ant Design。功能陪诊员审核、订单管理、服务定价、数据统计。3.4 部署与运维云服务腾讯云 / 阿里云 ECSNginx 反向代理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] -- B4.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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 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 classcontainer view classform-item text classlabel医院名称/text input classinput placeholder请输入医院名称 bindinputonHospitalInput / /view view classform-item text classlabel预约时间/text picker modedate bindchangeonDateChange view classpicker{{date || 请选择日期}}/view /picker /view view classform-item text classlabel服务类型/text radio-group bindchangeonTypeChange radio value1 checked全程陪诊/radio radio value2半程陪诊/radio /radio-group /view view classform-item text classlabel备注/text textarea classtextarea placeholder如需要轮椅、行动不便等 bindinputonRemarkInput / /view button classsubmit-btn bindtaponSubmit提交订单/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 智能分单、信用评价体系等功能进一步提升系统的智能化水平与用户体验。