1. 项目概述
这个老年人健康检查就诊就医管理系统,是我去年为某社区养老服务中心开发的一套信息化解决方案。当时他们面临的主要问题是:社区里800多位老人的健康档案分散在纸质表格里,每次体检数据更新不及时,家属想了解老人健康状况还得专门跑一趟服务中心。
系统采用ThinkPHP+Vue前后端分离架构,实现了从预约挂号、健康档案管理到用药提醒的全流程数字化。最让我自豪的是,我们针对老年人操作习惯做了大量优化——比如把常规的6步预约流程简化到3步,字体放大到常规网站的1.5倍,还接入了语音播报功能。
2. 核心需求解析
2.1 用户角色划分
系统主要服务三类用户:
- 社区医护人员:需要批量导入体检数据、设置用药提醒、查看异常指标预警
- 老年患者:重点关注预约挂号、报告查询、用药提醒等高频功能
- 家属子女:需要远程查看老人健康趋势、接收异常报警
2.2 典型使用场景
以最常见的血压异常处理流程为例:
- 智能血压仪自动上传数据到系统
- 当收缩压>140mmHg时触发预警规则
- 系统同时给医护端推送待处理提醒,给家属端发送短信通知
- 医护人员通过系统直接预约复诊时间
- 老人收到语音播报:"张阿姨,明天上午10点请到2楼体检室复查血压"
3. 技术架构设计
3.1 后端技术选型
选择ThinkPHP6主要基于三点考虑:
- 成熟的RBAC权限控制模块,方便实现医护/患者/家属的多级权限
- 内置的Excel导入导出功能,兼容社区医院现有的体检数据格式
- 队列系统支持定时任务,用于每日用药提醒推送
关键配置示例:
php复制// 在config/cache.php配置Redis缓存
'default' => env('cache.driver', 'redis'),
'stores' => [
'redis' => [
'driver' => 'redis',
'connection' => 'default',
],
],
3.2 前端交互优化
Vue3的组合式API让我们能更好地封装老年人常用功能组件:
- 超大按钮组件:尺寸是常规按钮的200%,带震动反馈
- 语音导航混入(mixin):自动朗读当前页面主要功能
- 简化版表单:默认隐藏非必填项,减少选择焦虑
javascript复制// 语音播报指令实现
app.directive('speak', {
mounted(el, binding) {
if (el.dataset.speech !== 'disabled') {
const utterance = new SpeechSynthesisUtterance(binding.value);
utterance.rate = 0.8; // 放慢语速
speechSynthesis.speak(utterance);
}
}
})
4. 核心功能实现
4.1 健康数据可视化
采用ECharts实现的关键指标趋势图,特别做了这些适配:
- 对比度调到AAA级无障碍标准
- 支持点击图表区域语音播报数值
- 异常值自动用红色闪烁标注
javascript复制// 血压图表配置片段
option = {
color: ['#e062ae','#67e0e3'],
grid: { top: '15%', right: '5%' },
dataZoom: [{
type: 'slider',
height: 30, // 放大滚动条高度
}]
}
4.2 智能提醒系统
用药提醒的三种触发方式:
- 定时推送:根据医嘱设置每日提醒
- 联动提醒:血压异常时自动提示服用降压药
- 人工触发:医护人员可临时添加提醒
数据库设计关键表:
sql复制CREATE TABLE `medication_reminders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '关联老人ID',
`drug_name` varchar(50) NOT NULL COMMENT '药品名称',
`dosage` varchar(20) NOT NULL COMMENT '服用剂量',
`reminder_type` tinyint(1) NOT NULL COMMENT '1定时 2联动 3临时',
`cron_expression` varchar(30) DEFAULT NULL COMMENT 'Cron表达式',
`trigger_condition` json DEFAULT NULL COMMENT '联动条件',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5. 适老化设计实践
5.1 界面交互优化
我们通过用户测试发现的典型问题及解决方案:
- 问题:老人经常误触屏幕边缘
解决:增加20px的无效边缘区域 - 问题:看不清验证码
解决:开发图形验证码+语音验证码双模式 - 问题:忘记操作步骤
解决:关键流程添加常驻指引按钮
5.2 辅助功能实现
-
语音控制方案:
- 唤醒词:"小助小助"
- 支持方言识别(已适配粤语、闽南语)
- 核心指令包括:"查报告"、"约医生"、"提醒我"
-
大字体模式实现技巧:
css复制/* 通过CSS变量控制字体缩放 */
:root {
--font-scale: 1;
}
.font-large {
--font-scale: 1.5;
}
body {
font-size: calc(16px * var(--font-scale));
}
6. 安全与隐私保护
6.1 数据加密方案
健康数据采用双层加密:
- 传输层:HTTPS+国密SM2算法
- 存储层:敏感字段使用AES-256加密
加密配置示例:
php复制// 数据加密服务类
class HealthDataEncryptor
{
public static function encrypt($data)
{
$key = config('app.encrypt_key');
return openssl_encrypt(
$data,
'aes-256-cbc',
$key,
0,
substr(md5($key), 0, 16)
);
}
}
6.2 权限控制策略
基于角色的访问控制(RBAC)实现要点:
- 家属只能查看直系亲属数据
- 医护人员按科室划分数据权限
- 超级管理员操作需二次验证
权限检查中间件示例:
php复制public function handle($request, Closure $next, $permission)
{
if (!auth()->user()->can($permission)) {
return response()->json([
'code' => 403,
'message' => '无权限访问'
], 403);
}
return $next($request);
}
7. 部署与运维实践
7.1 服务器配置建议
针对老年人早高峰访问特点的优化方案:
- 采用Nginx的限流模块控制挂号时段并发
- 静态资源部署在CDN加速
- 数据库配置读写分离
Nginx关键配置:
nginx复制limit_req_zone $binary_remote_addr zone=register:10m rate=30r/m;
location /api/register {
limit_req zone=register burst=5;
proxy_pass http://backend;
}
7.2 监控指标设计
重点监控的三类指标:
- 服务可用性:API成功率、页面加载时间
- 业务健康度:每日活跃老人比例、提醒送达率
- 系统性能:并发用户数、数据库查询耗时
使用Prometheus的监控指标示例:
yaml复制- name: health_check_success_rate
type: gauge
help: "健康检查接口成功率"
labels: [instance]
- name: medication_reminder_delivered
type: counter
help: "用药提醒成功送达次数"
labels: [user_type]
8. 项目演进方向
在实际运行半年后,我们正着手这些改进:
- 接入智能穿戴设备实时数据
- 开发家属端微信小程序
- 增加跌倒检测AI算法
- 试点与三甲医院的数据互通
其中设备接入的协议选型对比:
| 协议类型 | 延迟 | 功耗 | 适用场景 |
|---|---|---|---|
| Bluetooth | 低 | 中 | 室内短距离 |
| LoRaWAN | 高 | 低 | 社区范围 |
| NB-IoT | 中 | 低 | 广域覆盖 |
这个项目给我的最大启示是:适老化设计不能停留在放大字体这种表面功夫,需要从交互逻辑、错误预防、多模态反馈等维度系统性地重构用户体验。我们正在把沉淀的适老组件抽象成独立的前端库,后续会考虑开源。