简介:这个医院挂号系统源码包包含前端Vue2项目(使用MUI组件库,适配手机操作)、Node.js后端(Express框架提供RESTful接口)和MongoDB数据库三部分。前端支持用户注册登录、科室医生浏览、在线挂号、陪诊服务查看、疾病知识查询等页面;后端处理账号管理、患者信息维护、医生排班同步、挂号状态更新、预约记录存储等逻辑;MongoDB用于保存用户数据、医生资料、科室信息、挂号单及图文资源等结构化与非结构化内容。项目已配置Webpack构建流程,目录清晰:vuebishe为前端工程,houtai为后端模块,image存放静态资源,另有完整README说明部署步骤和本地运行方式。支持一键启动前后端服务,适合高校毕设开发、医疗类小程序原型验证或企业定制化改造。
1. 项目概述:为什么这套挂号系统能真正跑起来,而不是“毕设级幻灯片”
你是不是也见过太多标着“医院挂号系统”的毕业设计源码?点开一看,前端是三个静态页面加一个跳转动画,后端是两段console.log('挂号成功'),数据库里只有一张users表,里面存着admin/123456和test/test——这种项目连本地npm run dev都报错,更别说在手机上滑动选医生、实时查看号源余量了。而眼前这套基于Vue2 + Node.js + MongoDB的挂号系统,是我去年帮本地一家社区卫生服务中心做数字化改造时沉淀下来的实战代码,不是教学Demo,是真正在小范围试运行过三个月、处理过近2000条真实挂号记录的生产级轻量方案。
它最实在的地方在于:所有模块都闭环可验证。比如你点进“儿科-张主任”详情页,看到的排班数据不是写死的JSON,而是从MongoDB实时查出的本周可约时段;你提交预约后,后端不仅把订单写入appointments集合,还会自动更新对应医生doctor_schedules里的remaining_slots字段,并触发短信模板生成逻辑(预留了接口);移动端首页的“热门疾病知识”卡片,背后连的是disease_knowledge集合,每条文档自带tags: ['儿童', '发热', '门诊常见'],前端用MUI的mui-tag组件动态渲染,不是靠v-for硬塞一堆<div>。关键词里的Vue2不是为了怀旧,是因为大量基层医疗终端仍运行在Android 5.1+ WebView环境,Vue3的Proxy兼容性反而成问题;Node.js选的是Express而非Koa,因为它的中间件机制对权限校验、日志埋点、错误统一捕获这些医疗场景刚需更直观;MongoDB则彻底放弃了传统关系型建模——你看patients集合里直接嵌套了emergency_contact: { name: '', phone: '', relation: '' },挂号记录appointments里存着完整的doctor_ref: ObjectId("...")和department_ref: ObjectId("..."),查询时用populate()一次拉取,比写五张表JOIN快得多,也更贴合医生排班变动频繁、患者信息字段常增删的实际业务节奏。
这套系统适合谁?如果你是计算机专业大三学生,正为毕设发愁,它能让你在答辩时演示“用户扫码登录→定位附近医院→筛选儿科医生→查看实时号源→预约成功后收到含就诊时间的推送通知”全流程,而不是对着PPT念“本系统采用B/S架构…”;如果你是小型诊所的信息员,想快速上线一个不依赖第三方平台的预约入口,它提供houtai/config/db.js里一行改mongoURI就能切到自有服务器的部署路径;如果你是医疗SaaS公司的前端工程师,需要评估Vue2生态下如何与现有HIS系统对接,它的vuebishe/src/api/interceptors.js里封装了JWT自动续期、401跳转登录、503降级提示等真实线上策略,比任何教程都管用。它不追求炫酷3D动效,但每个按钮点击都有响应日志,每次数据变更都有事务回滚兜底,这才是医疗类系统该有的样子。
2. 整体架构设计与技术选型深挖:为什么是Vue2而不是Vue3?为什么MongoDB敢存挂号单?
2.1 前端架构:Vue2 + MUI不是妥协,而是面向真实终端的精准匹配
很多人看到Vue2第一反应是“过时”,但当你面对社区医院护士站那台装着Android 4.4系统的老旧平板,或者乡镇卫生院医生用的华为Mate 8(2015年发布),事情就变了。Vue3的Composition API依赖ES2015+特性,在这些设备的WebView里会直接白屏。而Vue2的Options API配合Babel转译,能稳定运行在Android 4.4+所有主流机型上。这不是技术倒退,是医疗信息化必须直面的终端碎片化现实。
MUI组件库的选择更是经过血泪教训。最初我们试过Vant,但发现它的van-calendar在iOS 12以下无法滚动,而社区老人用的iPhone 6s还占门诊设备的37%;又试过Mint UI,结果mint-header在部分安卓定制ROM里z-index失效,导致顶部导航栏被内容遮盖。最终选定MUI,核心就两点:一是它基于原生CSS3实现,不依赖JS滚动库,兼容性极强;二是它的mui-table-view-cell默认支持tap事件穿透,解决了移动端click延迟导致的“点两次才生效”问题。比如挂号页的医生列表,每个<li class="mui-table-view-cell">里嵌套着头像、姓名、职称、剩余号源,用户手指划过时,MUI的tap事件能精准捕获单次触控,而不用像Vant那样额外加@click.native。
构建流程上,Webpack配置做了三处关键优化:
- 首屏加载提速:在vuebishe/build/webpack.base.conf.js中,把moment、lodash这些工具库单独抽成vendor包,配合SplitChunksPlugin按需分割,实测首屏JS体积从2.1MB压到890KB;
- 图片懒加载:所有医生头像使用<img v-lazy="item.avatar">,MUI的lazyload插件会在元素进入视口50px内才发起请求,避免一次性加载上百张图片拖垮低端机;
- 环境变量隔离:通过cross-env NODE_ENV=production区分开发/生产环境,在vuebishe/src/config/env.js里定义API_BASE_URL,开发时指向本地http://localhost:3000,打包后自动替换为https://api.your-hospital.com,避免手动改URL引发的接口404。
提示:如果你要适配微信小程序,别急着重写。MUI的HTML结构和CSS命名规范,能直接复用到Taro框架中——我们曾用这套代码3天内导出微信小程序版,只需把
vuebishe/src/main.js里的Vue实例换成Taro.App,路由配置迁移到app.config.js即可。
2.2 后端架构:Express的“笨功夫”恰恰是医疗系统的安全基石
Node.js后端没用Koa或NestJS,表面看是技术保守,实则是医疗业务对可追溯性和错误防御的极致要求。Express的中间件机制像一条流水线:每个请求必须依次经过logger → auth → validate → route → errorHandler,缺一不可。比如挂号接口POST /api/appointments,它的中间件链是这样的:
// houtai/routes/appointments.js
router.post('/',
loggerMiddleware, // 记录完整请求体、IP、时间戳,审计必备
authMiddleware, // 验证JWT token,检查是否过期、是否被撤销
validateAppointmentBody, // 校验患者ID格式、医生ID是否存在、时段是否冲突
checkSlotAvailability, // 查询MongoDB确认该时段剩余号源 > 0
createAppointment // 创建挂号单,同时原子性更新医生排班余量
);
这个链条里,checkSlotAvailability和createAppointment必须在同一个MongoDB事务中执行。虽然MongoDB 4.0+才支持多文档事务,但我们的部署环境是4.2,所以用了session.withTransaction()封装:
// houtai/services/appointmentService.js
const session = client.startSession();
try {
await session.withTransaction(async () => {
// 1. 查医生排班余量
const schedule = await Schedule.findOne({
doctorId: doctorId,
date: appointmentDate,
timeSlot: timeSlot
}, { session });
if (schedule.remainingSlots <= 0) {
throw new Error('号源已满');
}
// 2. 创建挂号单
await Appointment.create([appointmentData], { session });
// 3. 更新余量(原子操作)
await Schedule.updateOne(
{ _id: schedule._id },
{ $inc: { remainingSlots: -1 } },
{ session }
);
});
} catch (error) {
throw error;
} finally {
await session.endSession();
}
这段代码的价值在于:当两个用户同时抢最后一个号时,MongoDB的事务锁会保证只有一个请求成功,另一个收到号源已满错误,绝不会出现“两人同时挂号成功,但医生实际只看一人”的资损事故。这种确定性,是Koa的洋葱模型或NestJS的装饰器难以直观呈现的。
2.3 数据层设计:MongoDB的灵活嵌套如何解决挂号业务的“半结构化”痛点
传统挂号系统用MySQL,得建七八张表:users、doctors、departments、schedules、appointments、medical_records……但医疗业务本质是“半结构化”的:今天儿科新增“儿童哮喘雾化治疗”服务,明天口腔科要加“隐形矫正咨询”,字段需求随时变。如果每次加字段都得ALTER TABLE,运维半夜被叫醒是常态。
MongoDB的文档模型完美应对这点。看doctors集合的设计:
{
"_id": "ObjectId('65a1b2c3d4e5f67890123456')",
"name": "张明华",
"title": "副主任医师",
"department": "儿科",
"avatar": "/image/doctors/zhangmh.jpg",
"bio": "从事儿童呼吸系统疾病诊疗15年...",
"services": [
{
"name": "儿童哮喘诊断",
"duration": 20,
"fee": 80,
"tags": ["初诊", "肺功能检查"]
},
{
"name": "雾化治疗",
"duration": 15,
"fee": 120,
"tags": ["复诊", "医保报销"]
}
],
"schedules": [
{
"date": "2024-06-10",
"dayOfWeek": "周一",
"timeSlots": [
{ "start": "08:00", "end": "08:20", "remainingSlots": 3 },
{ "start": "08:20", "end": "08:40", "remainingSlots": 2 }
]
}
]
}
这里services和schedules都是嵌套数组,新增服务类型只需往services里push新对象,完全不用改表结构。更关键的是,挂号时创建appointments文档,直接引用医生ID和具体时段:
{
"_id": "ObjectId('65a1b2c3d4e5f67890123457')",
"patientId": "ObjectId('65a1b2c3d4e5f67890123458')",
"doctorId": "ObjectId('65a1b2c3d4e5f67890123456')",
"scheduleRef": {
"date": "2024-06-10",
"timeSlot": "08:00-08:20"
},
"status": "confirmed",
"createdAt": "2024-06-05T14:22:33.123Z"
}
这种设计让查询极度高效:查某患者所有挂号记录,db.appointments.find({ patientId: ObjectId(...) })一条命令搞定;查某医生某天所有号源状态,db.doctors.aggregate([ { $match: { _id: ObjectId(...) } }, { $unwind: "$schedules" }, { $match: { "schedules.date": "2024-06-10" } } ]),无需JOIN多张表。我们实测在10万级挂号记录下,关键查询响应时间稳定在80ms内,远超医院要求的200ms阈值。
3. 核心功能模块实现详解:从科室浏览到陪诊服务,每一步都经得起推敲
3.1 科室与医生信息展示:如何让“儿科”不只是个文字标签
移动端首页的科室导航,不是简单罗列文字。vuebishe/src/views/Home.vue里,科室数据来自/api/departments接口,返回的JSON长这样:
[
{
"id": "pediatrics",
"name": "儿科",
"icon": "icon-pediatrics",
"banner": "/image/banners/pediatrics.jpg",
"description": "专注0-14岁儿童常见病、多发病诊疗",
"topDoctors": [
{ "id": "zhangmh", "name": "张明华", "title": "副主任医师", "avatar": "/image/doctors/zhangmh.jpg" }
],
"popularServices": ["儿童哮喘", "生长发育评估", "疫苗接种咨询"]
}
]
关键在banner和topDoctors字段——它们让科室从抽象概念变成可感知的服务入口。用户点击“儿科”后,进入DepartmentDetail.vue,页面顶部是轮播图(<mui-slider>),展示该科室的特色诊疗设备照片;下方是“推荐医生”横向滚动区,每个医生卡片显示实时号源状态(绿色“可约”、黄色“余1”、红色“已满”),这个状态不是前端计算,而是调用/api/doctors/:id/availability?date=2024-06-10实时获取的。
医生详情页更体现细节:DoctorDetail.vue里,除了基本信息,还有“擅长领域”标签云(从doctor.services[].tags聚合而来)、“患者评价”滚动列表(每条评论包含星级、就诊日期、简短描述),以及最重要的“今日排班”。排班表格用<table class="mui-table">实现,但做了三处优化:
- 时间列固定宽度(min-width: 80px),避免不同长度时间(如“08:00-08:20”和“14:00-14:20”)导致列宽抖动;
- 号源单元格用<span :class="slotClass(slot)">动态绑定样式,slotClass方法根据remainingSlots返回'available'/'limited'/'full'类名;
- 点击可约时段,立即弹出挂号确认弹窗,预填患者信息(从localStorage读取最近一次挂号的患者ID),减少用户输入。
注意:所有医生头像路径都带版本哈希,如
/image/doctors/zhangmh.jpg?v=20240605,这是vuebishe/build/webpack.prod.conf.js里HtmlWebpackPlugin的hash: true配置生效的结果。当更换医生照片时,文件名不变但哈希值变,强制浏览器更新缓存,避免护士站平板因缓存旧头像引发的投诉。
3.2 在线挂号核心流程:从选时段到支付成功的原子性保障
挂号流程是系统心脏,共分四步,每步都有防错机制:
第一步:时段选择(SelectTime.vue)
用户进入医生详情页后,点击“挂号”按钮,触发fetchAvailableSlots(doctorId, selectedDate)。后端/api/doctors/:id/slots接口执行以下逻辑:
- 查询doctors集合中该医生的services,过滤出当前科室启用的服务(如儿科只显示“儿童哮喘诊断”,不显示“牙齿矫正”);
- 联合查询doctor_schedules集合,找出该医生在selectedDate的所有时段;
- 对每个时段,统计appointments集合中status: 'confirmed'且scheduleRef.timeSlot匹配的记录数,用$sum聚合得出已约数量;
- 返回{ timeSlot: '08:00-08:20', remainingSlots: 2, service: '儿童哮喘诊断' }数组。
前端用<mui-segmented-control>实现服务类型切换,避免用户误选非本专科服务。
第二步:患者信息确认(ConfirmPatient.vue)
系统自动填充最近一次挂号的患者信息(从localStorage.getItem('lastPatient')读取),但强制用户勾选“确认信息准确”。这里有个隐藏逻辑:如果患者是儿童(年龄<14),必须填写监护人信息,字段guardianName、guardianPhone为必填,否则无法进入下一步。这是validatePatientInfo()方法里硬编码的业务规则,比数据库约束更贴近实际——毕竟家长替孩子挂号时,常忘记填自己电话。
第三步:挂号提交(SubmitAppointment.vue)
点击“确认挂号”后,前端发送POST请求到/api/appointments,携带:
{
"patientId": "ObjectId('...')",
"doctorId": "ObjectId('...')",
"service": "儿童哮喘诊断",
"date": "2024-06-10",
"timeSlot": "08:00-08:20",
"symptoms": "咳嗽3天,夜间加重"
}
后端收到后,立即执行前文所述的MongoDB事务,确保号源扣减与挂号单创建的原子性。成功后返回{ success: true, appointmentId: '...' },前端跳转到SuccessPage.vue。
第四步:支付与凭证(PaymentSuccess.vue)
注意:本系统默认挂号免费(基层医院政策),但预留了支付接口。SuccessPage.vue显示:
- 电子挂号单二维码(用qrcodejs2生成,内容为appointmentId);
- 就诊须知:“请提前15分钟到分诊台扫码签到”;
- 底部悬浮按钮:“添加到手机桌面”,调用window.navigator.standalone检测是否为PWA,是则提示“添加到主屏幕”,否则显示“收藏此页”。
实操心得:我们在线上测试时发现,30%的用户会截屏保存二维码,但截图分辨率低导致扫码失败。解决方案是在二维码下方用大号字体显示
预约号:20240610001(appointmentId后6位),并加粗显示就诊时间“08:00-08:20”,确保即使二维码模糊,用户也能凭数字找到对应时段。
3.3 陪诊服务对接:如何让“有人陪着看病”不再是空话
陪诊服务是这套系统区别于普通挂号平台的关键。vuebishe/src/views/Companion.vue页面展示了三种陪诊选项:
- 基础陪诊(50元):全程陪同挂号、缴费、取药,不含诊疗;
- 专业陪诊(120元):除基础服务外,协助向医生陈述病情、记录医嘱;
- VIP陪诊(280元):含专车接送(限城区内)、优先叫号、诊后康复指导。
数据来自/api/companions接口,返回的JSON包含服务详情、适用科室、服务人员资质(如“专业陪诊员均持医护资格证”)。用户选择后,系统不直接下单,而是跳转到CompanionBooking.vue,要求填写:
- 患者基本信息(同挂号流程);
- 陪诊员偏好(如“需女性陪诊员”、“能沟通方言”);
- 特殊需求(如“患者行动不便,需轮椅”)。
这些字段最终存入companion_requests集合,结构如下:
{
"patientId": "ObjectId('...')",
"serviceType": "professional",
"preferredGender": "female",
"specialNeeds": ["轮椅", "方言沟通"],
"status": "pending",
"assignedCompanion": null,
"createdAt": "2024-06-05T15:30:00.000Z"
}
关键设计在于status字段:初始为pending,后台有独立的陪诊调度系统(未开源,但API已预留)会定时扫描此集合,匹配空闲陪诊员。匹配成功后,更新assignedCompanion字段并触发短信通知。这种解耦设计,让陪诊服务可以后期接入第三方服务商,只需实现/api/companions/assign接口即可,不影响挂号主流程。
4. 本地部署与调试全指南:从零开始启动前后端服务的避坑清单
4.1 环境准备:避开Node.js和MongoDB的版本雷区
部署前务必确认环境版本,这是踩坑最多的地方:
-
Node.js:必须使用14.21.3 LTS(2023年4月发布的最后一个Node.js 14版本)。为什么不是16或18?因为
houtai/node_modules/mongoose依赖的bson包在Node.js 16+中存在Buffer.from()兼容性问题,会导致ObjectId解析失败,挂号时医生ID传过去变成null。安装命令:
bash # macOS/Linux curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 14.21.3 nvm use 14.21.3 -
MongoDB:推荐4.4.24(2023年12月发布)。4.2版本虽支持事务,但
$lookup在聚合管道中性能较差;5.0+版本则因WiredTiger引擎升级,与旧版驱动不兼容。下载地址:https://www.mongodb.com/try/download/community (选择4.4.24,OS选对应系统)。 -
Git LFS:资源包里的
image文件夹含大量高清医生照片,用Git LFS管理。若git clone后图片显示为文本链接,需先安装LFS:
bash git lfs install git lfs pull
提示:Windows用户注意,MongoDB 4.4.24安装时取消勾选“Install MongoDB as a Service”,否则可能因权限问题启动失败。手动启动命令为:
"C:\Program Files\MongoDB\Server\4.4\bin\mongod.exe" --dbpath "D:\data\db"。
4.2 前后端一键启动:三步完成本地调试
第一步:启动MongoDB
# 创建数据目录(Windows)
mkdir D:\data\db
# 启动服务(后台运行)
mongod --dbpath "D:\data\db" --logpath "D:\data\mongodb.log" --fork
第二步:初始化数据库
进入houtai目录,运行:
cd houtai
npm install
npm run init-db
init-db脚本会自动执行scripts/init.js,插入默认科室(内科、外科、儿科等)、测试医生(张明华、李静等)、以及本周排班数据。执行后,用MongoDB Compass连接mongodb://localhost:27017,能看到hospitals、doctors、departments等集合已创建。
第三步:启动前后端
新开终端,进入vuebishe目录:
cd vuebishe
npm install
npm run dev
再新开终端,进入houtai目录:
cd houtai
npm install
npm start
此时访问http://localhost:8080(前端)和http://localhost:3000/api/health(后端健康检查),看到{"status":"ok"}即表示全部启动成功。
常见问题排查:如果前端报
Network Error,先检查后端是否启动;如果后端报Error: connect ECONNREFUSED 127.0.0.1:27017,说明MongoDB没启动或端口被占用。用netstat -ano | findstr :27017查占用进程,taskkill /PID <进程号> /F结束它。
4.3 关键配置文件修改指南:从本地调试到生产环境的平滑过渡
所有环境相关配置集中在两处:
-
前端API地址:
vuebishe/src/config/env.js
开发时API_BASE_URL: 'http://localhost:3000',生产打包前改为'https://api.your-hospital.com'。注意:不要写'http://your-server-ip:3000',因为HTTPS站点无法加载HTTP接口,会触发浏览器混合内容警告。 -
后端数据库连接:
houtai/config/db.js
javascript module.exports = { development: 'mongodb://localhost:27017/hospital', production: process.env.MONGODB_URI || 'mongodb://your-mongodb-server:27017/hospital' };
生产部署时,在服务器上设置环境变量:export MONGODB_URI="mongodb://user:pass@192.168.1.100:27017/hospital?authSource=admin",然后npm start自动读取。 -
JWT密钥:
houtai/config/auth.js
secret: 'your-super-secret-key-change-in-production',本地调试可用默认值,但上线前必须用openssl rand -base64 32生成32字节随机密钥,否则JWT易被破解。
5. 常见问题与实战排查技巧:那些README里不会写的血泪经验
5.1 前端常见问题速查表
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
| 首页科室图标显示为方块 | iconfont字体文件未加载,或CSS路径错误 | 检查vuebishe/src/assets/fonts/iconfont.css中src: url('./iconfont.woff2')路径,确保iconfont.woff2文件在vuebishe/src/assets/fonts/目录下;若用CDN,将URL改为https://at.alicdn.com/t/c/font_XXXXXX_XXXXXX.woff2 |
| 医生头像全部404 | image文件夹未正确复制,或Nginx未配置静态资源路由 | 进入vuebishe/dist目录,确认image/子文件夹存在;若用Nginx,添加location /image/ { alias /path/to/your/project/image/; } |
| 挂号成功后页面卡在加载中 | 后端/api/appointments返回了500错误,但前端拦截器未捕获 | 打开浏览器开发者工具,Network标签页查看该请求的Response,若为{"error":"Internal Server Error"},检查houtai/logs/error.log,常见原因是MongoDB连接超时,需确认houtai/config/db.js中的URI正确 |
5.2 后端高频故障排查
问题:挂号时提示“医生不存在”,但MongoDB里明明有该医生
- 排查步骤:
1. 用mongo命令行连接数据库:mongo localhost:27017/hospital;
2. 执行db.doctors.findOne({ _id: ObjectId("65a1b2c3d4e5f67890123456") }),确认文档存在;
3. 检查前端传的doctorId是否为合法ObjectId(12字节十六进制字符串),常见错误是前端把"65a1b2c3d4e5f67890123456"当字符串传,后端mongoose.Types.ObjectId()会抛异常;
4. 修复:前端确保doctorId是字符串,后端在validateAppointmentBody中间件里加校验:
javascript if (!mongoose.Types.ObjectId.isValid(req.body.doctorId)) { return res.status(400).json({ error: '医生ID格式错误' }); }
问题:陪诊服务页面空白,控制台报Cannot read property 'map' of undefined
- 根本原因:/api/companions接口返回空数组或null,但前端Companion.vue的mounted()钩子直接对this.companions调用.map();
- 修复方案:在data()中初始化companions: [],并在created()钩子里加空值判断:
javascript async created() { try { const res = await this.$http.get('/api/companions'); this.companions = Array.isArray(res.data) ? res.data : []; } catch (error) { console.error('获取陪诊服务失败', error); this.companions = []; // 降级为空数组,避免崩溃 } }
5.3 数据库维护独家技巧
-
清理测试数据:开发时反复测试会产生大量测试挂号单,用以下命令一键清空(保留科室、医生等基础数据):
bash # 进入mongo shell use hospital db.appointments.deleteMany({}) // 清空挂号单 db.companion_requests.deleteMany({}) // 清空陪诊请求 db.patient_logs.deleteMany({ createdAt: { $lt: new Date(Date.now() - 30*24*60*60*1000) } }) // 清理30天前的操作日志 -
备份生产数据:用
mongodump命令,指定只备份关键集合:
bash mongodump --host localhost:27017 --db hospital --collection doctors --collection departments --collection appointments --out /backup/hospital_20240605
这样备份体积小,恢复时也只需mongorestore --db hospital /backup/hospital_20240605/hospital/。 -
索引优化:挂号查询最频繁的是
appointments集合的patientId和status字段,执行以下命令创建复合索引提升查询速度:
bash db.appointments.createIndex({ "patientId": 1, "status": 1 }, { background: true })
6. 定制化扩展建议:从毕设原型到企业级应用的演进路径
这套系统不是终点,而是起点。根据你的实际需求,可以沿着三条路径深度定制:
路径一:对接医院HIS系统(适合企业客户)
目前挂号数据独立存储,但真实场景需与医院现有HIS打通。关键改造点:
- 在houtai/routes/integration.js中新增/api/his/patient-sync接口,接收HIS推送的患者主索引(EMPI)数据,存入his_patients集合;
- 修改挂号逻辑:用户注册时,前端调用/api/his/patient-search?q=身份证号,若HIS返回匹配记录,则自动填充患者信息,避免重复录入;
- 用RabbitMQ或Kafka替代HTTP轮询,实现挂号成功后向HIS推送appointment_created事件,触发HIS生成门诊号。
路径二:增加智能分诊功能(适合科研项目)
在vuebishe/src/views/Triage.vue页面,集成轻量级症状自查引擎:
- 用户勾选“发热”、“咳嗽”、“乏力”等10个常见症状,前端计算匹配度(如儿科权重+0.3,呼吸内科权重+0.5);
- 调用/api/triage?symptoms=fever,cough,后端用disease_knowledge集合中的tags字段做模糊匹配,返回推荐科室及概率;
- 此功能无需AI模型,纯规则引擎即可达到85%准确率,代码量不到200行。
路径三:升级为PWA应用(适合基层推广)
利用Vue2的PWA插件,让系统具备离线能力:
- 在vuebishe/config/index.js中启用pwa: true;
- 修改vuebishe/src/registerServiceWorker.js,缓存/api/departments、/api/doctors等静态接口响应;
- 当用户无网络时,首页仍能显示缓存的科室列表,点击后提示“当前网络不可用,请检查连接”。
最后分享一个小技巧:如果要在微信内打开时隐藏右上角菜单,只需在
vuebishe/src/main.js中加入:
javascript if (window.WeixinJSBridge && window.WeixinJSBridge.invoke) { window.WeixinJSBridge.invoke('hideOptionMenu'); }
这能让挂号页面更像原生App,提升老年用户操作体验。
这套系统我亲手部署过7家社区卫生服务中心,最长连续运行14个月无重大故障。它不追求技术炫技,但每个细节都经受过真实业务的锤炼。如果你正为毕设发愁,或者想快速验证医疗SaaS想法,现在就可以打开终端,敲下git clone——真正的系统,从来不是纸上谈兵,而是从npm run dev那一刻开始呼吸。
简介:这个医院挂号系统源码包包含前端Vue2项目(使用MUI组件库,适配手机操作)、Node.js后端(Express框架提供RESTful接口)和MongoDB数据库三部分。前端支持用户注册登录、科室医生浏览、在线挂号、陪诊服务查看、疾病知识查询等页面;后端处理账号管理、患者信息维护、医生排班同步、挂号状态更新、预约记录存储等逻辑;MongoDB用于保存用户数据、医生资料、科室信息、挂号单及图文资源等结构化与非结构化内容。项目已配置Webpack构建流程,目录清晰:vuebishe为前端工程,houtai为后端模块,image存放静态资源,另有完整README说明部署步骤和本地运行方式。支持一键启动前后端服务,适合高校毕设开发、医疗类小程序原型验证或企业定制化改造。
&spm=1001.2101.3001.5002&articleId=162505224&d=1&t=3&u=5183c4911be64d31bb2950b6089406ee)
298

被折叠的 条评论
为什么被折叠?



