1. 项目背景与需求分析
在公共卫生领域,传染病防控宣传一直是重要但容易被忽视的环节。传统宣传方式存在信息更新滞后、覆盖范围有限、互动性差等问题。我们团队基于微信生态开发的"weixin063传染病防控宣传系统",正是为了解决这些痛点。
这个系统的核心需求来源于三个实际场景:
- 疾控中心需要实时发布权威防控指南
- 社区居民希望获取个性化的预防建议
- 基层医疗机构缺乏高效的宣教工具
微信小程序作为载体具有天然优势:截至2023年,微信月活用户已突破13亿,小程序日活超过4亿。这种渗透率使得基于小程序的解决方案能够触达最广泛的受众群体。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构方案
系统采用经典的三层架构:
code复制前端:微信小程序 + uni-app跨端框架
中间层:Java EE + Spring Boot
数据层:MySQL 8.0 + Redis缓存
选择uni-app而非原生开发主要考虑两点:
- 后续可快速扩展至其他平台(如支付宝、百度小程序)
- 团队有Vue技术栈积累,学习成本低
2.2 数据库设计要点
MySQL表结构设计遵循传染病防控的业务特点:
sql复制CREATE TABLE `disease_info` (
`id` int NOT NULL AUTO_INCREMENT,
`disease_name` varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '疾病名称',
`symptoms` text COLLATE utf8mb4_bin COMMENT '典型症状',
`prevention` text COLLATE utf8mb4_bin COMMENT '预防措施',
`high_risk_group` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '高危人群',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
FULLTEXT KEY `ft_idx` (`disease_name`,`symptoms`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
特别设计了全文索引(ft_idx)以支持症状关键词搜索,这是防控宣传中的高频操作。
3. 核心功能实现
3.1 疫情地图可视化
采用腾讯位置服务+ECharts实现动态疫情展示:
javascript复制// 小程序端地图组件配置
Component({
properties: {
markers: Array,
polygons: Array
},
methods: {
onMarkerTap(e) {
this.triggerEvent('markertap', {
markerId: e.markerId
})
}
}
})
实际开发中发现:微信小程序原生地图组件在渲染大量标记点时性能较差。最终解决方案是:
- 使用聚类算法减少显示点数
- 分区域动态加载数据
- 启用canvas绘制替代原生组件
3.2 智能问答模块
基于关键词匹配的问答引擎实现流程:
- 用户输入问题文本
- 进行分词和关键词提取
- 在MySQL全文索引中检索
- 返回匹配度最高的5条结果
核心Java代码片段:
java复制public List<QaPair> searchAnswers(String question) {
// 使用IKAnalyzer进行中文分词
List<String> keywords = analyzer.doAnalyze(question);
String sql = "SELECT * FROM qa_pairs WHERE MATCH(question,answer) AGAINST(? IN BOOLEAN MODE)";
return jdbcTemplate.query(sql,
ps -> ps.setString(1, String.join(" ", keywords)),
new QaPairRowMapper());
}
4. 性能优化实践
4.1 缓存策略设计
采用多级缓存架构:
- 热点数据:Redis缓存(TTL 5分钟)
- 静态资源:CDN加速
- 本地缓存:小程序storage API
缓存更新策略对比表:
| 策略 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 定时刷新 | 实现简单 | 实时性差 | 变更不频繁的数据 |
| 主动失效 | 实时性强 | 系统复杂度高 | 核心业务数据 |
| 懒加载 | 资源利用率高 | 首次访问慢 | 低频访问数据 |
最终选择混合方案:基础数据定时刷新(每日2次),用户行为数据采用懒加载。
4.2 MySQL优化实例
通过EXPLAIN分析发现疾病查询接口存在全表扫描问题。优化过程:
- 原SQL:
sql复制SELECT * FROM disease_info WHERE symptoms LIKE '%发热%';
- 优化方案:
- 改为全文索引查询
- 增加查询条件限制
- 只返回必要字段
- 优化后SQL:
sql复制SELECT id,disease_name FROM disease_info
WHERE MATCH(symptoms) AGAINST('发热' IN BOOLEAN MODE)
AND update_time > DATE_SUB(NOW(), INTERVAL 3 MONTH)
优化效果对比:
- 查询耗时从1200ms降至80ms
- CPU使用率下降40%
5. 安全与合规设计
5.1 内容审核机制
建立三级审核流程:
- 自动过滤:敏感词库匹配(使用DFA算法)
- 人工审核:疾控专家后台
- 定时巡检:每周全量内容检查
敏感词检测Java实现:
java复制public boolean containsSensitiveWords(String content) {
return SensitiveWordFilter.contains(
content,
SensitiveWordFilter.MinMatchType
);
}
5.2 数据隐私保护
严格遵循《个人信息保护法》要求:
- 用户位置信息脱敏处理
- 搜索记录7天自动清除
- 采用HTTPS传输加密
特别注意:小程序获取用户授权时,必须提供清晰的用途说明。我们采用分步授权策略,只在真正需要时才请求对应权限。
6. 部署与运维方案
6.1 服务器配置建议
生产环境推荐配置:
- 应用服务器:4核8G ×2(负载均衡)
- 数据库:8核16G + SSD存储
- 带宽:10Mbps以上
实际运营中发现:疫情防控期间会出现突发流量高峰,因此增加了自动扩容策略:
- CPU持续>70%持续5分钟触发扩容
- 流量回落30分钟后缩容
6.2 监控体系搭建
使用Prometheus+Grafana构建监控看板,关键指标包括:
- 小程序API响应时间(P99<500ms)
- MySQL查询QPS(警戒值800)
- 并发用户数(峰值预警)
报警规则示例:
code复制groups:
- name: mysql.rules
rules:
- alert: HighQPS
expr: rate(mysql_global_status_questions[1m]) > 800
for: 5m
7. 项目演进方向
当前系统已实现基础功能,后续规划包括:
- 接入AI对话能力:基于传染病知识图谱的智能咨询
- 扩展多端支持:H5、支付宝小程序
- 建设开放平台:供第三方机构接入
特别在AI应用方面,我们正在测试将LLM模型与现有问答系统结合,初步验证显示:
- 准确率提升35%
- 用户满意度提高28%
- 但响应时间增加200ms(需要进一步优化)
这个项目的开发经历让我深刻体会到:技术方案的选择必须紧密结合业务场景。比如最初考虑使用MongoDB存储非结构化数据,但考虑到疾控数据的强一致性和事务需求,最终还是选择了关系型数据库。这种权衡在实际项目中几乎每天都会遇到。
