1. 项目背景与核心价值
2020年以来的全球公共卫生事件让社会互助需求激增。作为一名经历过多次社区封控的Java开发者,我深刻体会到传统物资调配方式存在信息滞后、资源错配等问题。这正是我选择开发"基于SpringBoot的智能抗疫互助平台"作为毕业设计的初衷。
这个系统要解决三个核心痛点:
- 物资供需信息不对称(居民不知道哪里能获取口罩,社区不清楚谁家缺菜)
- 志愿者服务调度低效(任务分配靠微信群接龙,容易遗漏)
- 紧急求助响应延迟(特殊人群的需求难以及时触达相关方)
平台采用微服务架构设计,主要包含以下功能模块:
- 物资供需智能匹配(基于LBS的推荐算法)
- 志愿者任务调度系统(基于优先级的自动分配)
- 紧急求助快速响应通道(分级预警机制)
- 疫情信息权威发布(对接卫健委API)
开发过程中发现:单纯的CRUD实现无法满足真实场景需求,必须考虑高并发下的系统稳定性、敏感数据的隐私保护等实际问题。
2. 技术选型与架构设计
2.1 为什么选择SpringBoot
作为应届生技术栈中的"瑞士军刀",SpringBoot的自动配置特性大幅降低了项目复杂度:
- 内嵌Tomcat简化部署(传统SSM项目需要单独配置Web容器)
- Starter依赖一键集成(比如spring-boot-starter-data-redis)
- Actuator提供完善的监控端点(/health, /metrics等)
实测对比:
- 传统SSM项目搭建平均需要2天(各种XML配置)
- SpringBoot初始项目仅需15分钟(start.spring.io生成)
2.2 核心架构图解
code复制[前端]
Vue.js + ElementUI
↑↓ HTTP/JSON
[网关层]
Spring Cloud Gateway
↑↓
[微服务层]
│ ├── 用户服务 (JWT认证)
│ ├── 物资服务 (MySQL主从)
│ ├── 任务服务 (Redis缓存)
│ └── 消息服务 (RabbitMQ)
↑↓
[基础设施]
Prometheus监控 + ELK日志
关键设计决策:
- 放弃Thymeleaf选用前后端分离:便于多端适配(后来确实接到了小程序接入需求)
- 采用Redisson分布式锁:解决物资库存超卖问题
- 引入Sentinel流控:预防突发流量击穿系统
3. 核心功能实现细节
3.1 智能匹配算法实现
物资匹配的核心代码逻辑:
java复制public List<SupplyMatchVO> matchDemands(Location userLoc, Integer range) {
// 1. 获取用户周边5km内的物资点(GIS查询)
List<SupplyPO> supplies = supplyMapper.selectNearby(
userLoc.getLongitude(),
userLoc.getLatitude(),
range);
// 2. 优先级排序(库存量*距离系数)
return supplies.stream()
.map(s -> new SupplyMatchVO(s, calculateScore(userLoc, s)))
.sorted(Comparator.comparing(SupplyMatchVO::getScore).reversed())
.limit(20)
.collect(Collectors.toList());
}
private double calculateScore(Location user, SupplyPO supply) {
double distance = GeoUtils.getDistance(user, supply.getLocation());
return supply.getStock() * (1 / (distance + 1)); // 距离加1防止除零
}
遇到的坑:
- 最初直接用MySQL计算距离(性能极差)
- 改进方案:使用Redis GEO存储坐标数据,查询速度提升40倍
3.2 志愿者任务调度
采用状态机模式设计任务流转:
mermaid复制stateDiagram
[*] --> PENDING
PENDING --> ASSIGNED: 系统分配
PENDING --> ACCEPTED: 主动认领
ASSIGNED --> IN_PROGRESS: 志愿者确认
ACCEPTED --> IN_PROGRESS
IN_PROGRESS --> COMPLETED: 提交报告
IN_PROGRESS --> FAILED: 任务异常
关键实现技巧:
- 使用Spring StateMachine框架
- 每个状态变更触发消息通知
- 超时未接单任务自动重新分配(Quartz定时任务)
4. 性能优化实战记录
4.1 缓存策略优化
原始方案:所有物资查询走MySQL
问题:高峰期QPS达到200+时响应延迟明显
优化步骤:
- 引入Redis缓存热点数据
- 使用ZSET存储物资点评分排名
- 对每个物资点设置1小时过期时间
- 采用多级缓存策略
java复制public SupplyDetail getSupplyDetail(Long id) { // 1. 查本地缓存(Caffeine) SupplyDetail detail = localCache.get(id); if (detail != null) return detail; // 2. 查Redis detail = redisTemplate.opsForValue().get("supply:" + id); if (detail != null) { localCache.put(id, detail); return detail; } // 3. 查数据库 detail = supplyMapper.selectById(id); if (detail != null) { redisTemplate.opsForValue().set("supply:" + id, detail, 1, HOURS); } return detail; }
效果:平均响应时间从320ms降至45ms
4.2 数据库分库分表
当注册用户突破10万时出现的性能瓶颈:
- 用户表数据量过大
- 物资订单表写入频繁
解决方案:
- 按地区分库(华北、华东等6个区域)
- 订单表按月分表(order_202301, order_202302)
- 使用ShardingSphere实现透明分片
配置示例:
yaml复制spring:
shardingsphere:
datasource:
names: ds0,ds1
sharding:
tables:
t_order:
actual-data-nodes: ds$->{0..1}.t_order_$->{202301..202312}
table-strategy:
standard:
sharding-column: create_time
precise-algorithm-class-name: com.example.TimeMonthShardingAlgorithm
5. 安全防护方案
5.1 敏感数据保护
- 联系方式脱敏处理:
java复制public static String maskPhone(String phone) { if (StringUtils.isEmpty(phone)) return ""; return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); } - 数据库字段加密:
- 使用Jasypt加密身份证号等字段
- 配置示例:
properties复制jasypt.encryptor.password=${JASYPT_PASSWORD} jasypt.encryptor.algorithm=PBEWithMD5AndDES
5.2 接口防刷策略
- 验证码防护:
- 图形验证码(登录场景)
- 短信限流(1分钟1条)
- API频率限制:
java复制@RateLimiter(value = 10, key = "#userId") @PostMapping("/api/help") public Result submitHelpRequest(@RequestBody HelpRequest request) { // ... } - 恶意请求过滤:
- 使用Spring AOP记录异常请求模式
- 自动触发IP临时封禁
6. 部署与监控方案
6.1 容器化部署
Docker Compose编排文件示例:
yaml复制version: '3'
services:
app:
image: registry.example.com/help-platform:${TAG}
environment:
- SPRING_PROFILES_ACTIVE=prod
ports:
- "8080:8080"
depends_on:
- redis
- mysql
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
redis_data:
6.2 监控告警配置
Prometheus监控指标示例:
yaml复制- name: help_platform
metrics_path: /actuator/prometheus
static_configs:
- targets: ['app:8080']
labels:
service: 'help-platform'
关键监控项:
- JVM内存使用率(超过80%告警)
- 接口成功率(低于99.9%告警)
- 数据库连接池使用率
7. 毕业设计答辩技巧
7.1 演示数据准备
建议构造真实场景数据:
sql复制-- 模拟疫情爆发区域
INSERT INTO epidemic_area (name, longitude, latitude, risk_level)
VALUES ('XX小区', 116.404, 39.915, 3);
-- 生成物资需求
INSERT INTO material_demand (user_id, material_type, quantity, address)
SELECT
id,
CASE WHEN RAND() > 0.5 THEN '口罩' ELSE '消毒液' END,
FLOOR(1 + RAND() * 10),
CONCAT('单元', FLOOR(1 + RAND() * 20), '-', FLOOR(1 + RAND() * 10))
FROM user
WHERE create_time > DATE_SUB(NOW(), INTERVAL 7 DAY);
7.2 常见问题应对
Q:为什么不用Python/Django开发?
A:Java生态在以下方面更具优势:
- 成熟的微服务解决方案(Spring Cloud)
- 更好的并发处理能力(线程池/NIO)
- 企业级应用更广泛的技术栈延续性
Q:系统能承受多大并发量?
A:经过压测(JMeter):
- 单节点:800 QPS(CPU 4核8G)
- 集群部署:可通过Nginx水平扩展
- 关键瓶颈是数据库,已设计分库方案
