技术栈分析
后端技术栈
- Spring Boot 2.x:快速构建微服务架构,提供自动化配置和依赖管理。
- Spring Security:负责用户认证和授权,保障系统安全。
- MyBatis/MyBatis-Plus:数据库ORM框架,简化SQL操作。
- Redis:缓存高频访问数据(如居民健康档案摘要)。
- Swagger:自动生成API文档,便于前后端协作。
前端技术栈
- Vue 3.x:响应式前端框架,采用Composition API。
- Element Plus/ANT Design Vue:UI组件库,快速搭建管理界面。
- Axios:处理HTTP请求,与后端交互。
- ECharts:可视化健康数据(如血压趋势图)。
辅助工具
- Lombok:减少Java样板代码。
- Hutool:Java工具库,简化开发。
- Logback:日志管理。
核心功能模块
居民档案管理
- 基本信息录入:姓名、性别、身份证号、联系方式等。
- 健康数据记录:既往病史、过敏史、家族病史。
- 档案检索:支持多条件组合查询(如按年龄段+慢性病筛选)。
健康监测模块
- 体检数据上传:支持Excel批量导入或手动输入。
- 指标预警:自动标记异常数值(如血糖超标)。
- 趋势分析:生成月度/年度健康指标对比图表。
医生工作站
- 电子处方开具:与医保系统对接的标准化处方模板。
- 随访计划:设置下次复查时间并自动提醒。
- 病历编写:结构化病历模板,支持语音输入转文字。
系统管理
- 角色权限控制:区分管理员、医生、社区工作人员权限。
- 操作日志审计:记录关键数据修改行为。
- 数据备份:定时全量备份+增量备份策略。
数据库设计要点
主要表结构
-- 居民基础表
CREATE TABLE `resident` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`id_card` VARCHAR(18) UNIQUE,
`name` VARCHAR(50) NOT NULL,
`gender` ENUM('M','F','U'),
`birth_date` DATE,
`address` TEXT,
`contact_phone` VARCHAR(20)
);
-- 健康档案表
CREATE TABLE `health_record` (
`record_id` BIGINT PRIMARY KEY,
`resident_id` BIGINT FOREIGN KEY REFERENCES resident(id),
`blood_type` ENUM('A','B','AB','O'),
`allergy_history` TEXT,
`chronic_diseases` JSON -- 存储疾病数组
);
-- 体检记录表
CREATE TABLE `checkup` (
`checkup_id` BIGINT PRIMARY KEY,
`resident_id` BIGINT,
`check_date` DATETIME,
`bmi` DECIMAL(5,2),
`blood_pressure` VARCHAR(10), -- 格式"120/80"
`glucose` DECIMAL(5,2),
FOREIGN KEY (resident_id) REFERENCES resident(id)
);
索引优化
- 居民表:对
id_card
建立唯一索引,name
+birth_date
建立联合索引。 - 体检表:对
resident_id
+check_date
建立复合索引。
关键代码示例
Spring Boot数据层
// 体检记录Repository
public interface CheckupRepository extends JpaRepository<Checkup, Long> {
@Query("SELECT c FROM Checkup c WHERE c.residentId = :residentId ORDER BY c.checkDate DESC")
List<Checkup> findByResidentId(@Param("residentId") Long residentId);
@Query(value = "SELECT AVG(glucose) FROM checkup WHERE resident_id = ?1 AND check_date >= ?2", nativeQuery = true)
Double calculateAvgGlucose(Long residentId, LocalDate startDate);
}
Vue体检数据展示
<template>
<el-table :data="checkupData" stripe>
<el-table-column prop="checkDate" label="日期" width="180"/>
<el-table-column label="血压">
<template #default="{row}">
<span :class="{ 'warning': isHighBloodPressure(row.bloodPressure) }">
{{ row.bloodPressure }}
</span>
</template>
</el-table-column>
</el-table>
</template>
<script setup>
const isHighBloodPressure = (bp) => {
const [systolic] = bp.split('/').map(Number);
return systolic > 140;
};
</script>
测试方案
单元测试(JUnit5)
@Test
void testAbnormalBloodPressureDetection() {
HealthAlertService service = new HealthAlertService();
Checkup normal = new Checkup("120/80");
Checkup abnormal = new Checkup("150/95");
assertFalse(service.checkAbnormal(normal));
assertTrue(service.checkAbnormal(abnormal));
}
集成测试(Postman)
- 测试场景:提交新体检记录并验证预警触发
- 请求示例:
POST /api/checkups Content-Type: application/json { "residentId": 1024, "bloodPressure": "145/90", "glucose": 6.2 }
- 预期响应:应包含
hasWarning: true
字段
压力测试(JMeter)
- 模拟500并发用户同时查询档案
- 关键指标要求:
- 平均响应时间 < 800ms
- 错误率 < 0.5%
- CPU利用率峰值 ≤ 75%