1. 项目概述
这个基于SpringBoot的智能抗疫互助服务平台,是我在2022年疫情期间完成的一个Java毕业设计项目。当时观察到社区防疫物资调配存在信息不对称问题,很多居民急需的药品、口罩等物资无法及时获取,而另一些家庭却有富余物资闲置。于是萌生了开发一个能够连接供需双方的数字化平台的想法。
平台核心功能包括物资捐赠与申领、防疫信息共享、志愿者服务对接等模块。采用SpringBoot+Vue前后端分离架构,整合了Redis缓存、RabbitMQ消息队列等技术,实现了高并发场景下的稳定运行。项目上线后在本市三个社区试点运行,累计促成物资互助交易300余次,验证了技术方案的可行性。
2. 核心需求解析
2.1 疫情防控痛点分析
疫情期间主要存在三个核心痛点:
- 物资分配不均:部分家庭囤积过量物资,而孤寡老人等弱势群体难以获取基本防疫用品
- 信息传递滞后:社区通知、核酸检测点变更等信息无法实时触达居民
- 志愿者资源浪费:志愿者服务需求与供给缺乏有效匹配机制
2.2 功能需求分解
基于上述痛点,平台设计了三大功能模块:
- 物资互助系统:包含捐赠发布、需求申报、智能匹配功能
- 信息共享中心:实时推送防疫政策、核酸检测点等权威信息
- 志愿服务平台:志愿者注册、任务发布、服务记录功能
2.3 非功能性需求
- 高并发能力:需支持瞬时千人级访问
- 数据安全:敏感信息加密存储
- 响应速度:核心接口响应时间<500ms
3. 技术架构设计
3.1 整体架构
采用经典的三层架构:
code复制表现层:Vue3+Element Plus
业务层:SpringBoot 2.7 + Spring Security
数据层:MySQL 8.0 + Redis 6.2
3.2 关键技术选型
- 消息队列:选用RabbitMQ处理异步通知,相比Kafka更轻量
- 缓存方案:Redis实现热点数据缓存和分布式锁
- 地图服务:集成高德地图API实现物资点定位
- 安全框架:Spring Security + JWT实现认证授权
3.3 数据库设计
核心表包括:
- 用户表(t_user):存储用户基础信息
- 物资表(t_material):记录物资详情和状态
- 订单表(t_order):管理物资流转记录
- 消息表(t_message):存储系统通知
注意:所有表都添加了create_time和update_time字段,便于后期数据分析
4. 核心功能实现
4.1 智能匹配算法
物资匹配是系统的核心功能,实现逻辑如下:
java复制public List<MaterialVO> matchMaterials(MaterialQuery query) {
// 1. 从Redis获取附近5km内的可用物资
List<Material> materials = materialMapper.selectNearby(
query.getLongitude(),
query.getLatitude(),
5000);
// 2. 基于优先级排序(医疗物资>生活物资)
return materials.stream()
.filter(m -> m.getStatus() == 0)
.sorted(Comparator.comparing(Material::getType))
.map(this::convertToVO)
.collect(Collectors.toList());
}
4.2 高并发优化方案
针对物资抢购场景做了以下优化:
- 使用Redis分布式锁防止超卖
- 商品详情页静态化处理
- 采用令牌桶算法限流
4.3 安全防护措施
- 敏感字段加密:使用AES加密用户手机号
- SQL防护:MyBatis全部使用#{}参数绑定
- XSS防护:Jackson配置HTML转义
- 接口防刷:Redis记录IP访问频次
5. 开发难点与解决方案
5.1 地理位置查询优化
初期直接使用MySQL计算距离导致性能瓶颈:
sql复制SELECT * FROM t_material
WHERE ST_Distance_Sphere(point(longitude,latitude), point(116.404,39.915)) < 5000
优化方案:
- 建立空间索引
- 使用Redis GEO存储热点数据
- 采用Geohash预处理坐标
5.2 分布式事务处理
物资交易涉及多个服务调用,采用本地消息表+定时任务实现最终一致性:
- 创建订单时写入本地消息表
- 定时任务扫描未处理消息
- 调用库存服务进行补偿
5.3 缓存一致性保障
物资状态变更时采用双删策略:
- 先更新数据库
- 再删除缓存
- 延迟1s再次删除
6. 项目部署方案
6.1 环境配置
- JDK:Amazon Corretto 11
- 应用服务器:Tomcat 9
- 中间件:Nginx 1.18 + Redis 6.2
6.2 容器化部署
使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
redis:
image: redis:6.2-alpine
app:
build: .
ports:
- "8080:8080"
6.3 监控方案
- Spring Boot Admin监控应用状态
- Prometheus+Grafana监控系统指标
- ELK收集分析日志
7. 测试与优化
7.1 压力测试结果
使用JMeter模拟1000并发:
- 物资查询接口:平均RT 238ms
- 下单接口:平均RT 356ms
- 错误率:0.05%
7.2 性能优化记录
通过Arthas定位到的性能瓶颈:
- 日志框架改为AsyncAppender
- MyBatis二级缓存启用
- 线程池参数调优
7.3 安全测试发现
使用OWASP ZAP扫描发现的问题:
- 密码复杂度未强制要求 → 添加正则校验
- 验证码可重复使用 → 改为一次性验证
- 敏感信息未脱敏 → 增加响应过滤器
8. 项目总结与扩展
在实际开发过程中,有几个关键经验值得分享:
- 地理空间查询要提前考虑性能问题
- 分布式环境下事务处理需要特别设计
- 疫情防控类系统要特别重视数据安全
未来可扩展方向:
- 接入微信小程序扩大使用范围
- 增加智能客服自动应答常见问题
- 引入区块链技术确保捐赠记录不可篡改
这个项目让我深刻体会到,技术真正的价值在于解决实际问题。在开发过程中,除了要掌握技术原理,更需要理解业务场景的真实需求。比如在物资匹配算法中,我们不仅考虑了距离因素,还加入了物资优先级、用户信用等级等维度,这使得系统在实际运行中更加实用。
