1. 项目背景与核心价值
2020年以来的全球公共卫生事件让应急物资管理成为刚需。我去年参与某慈善基金会系统重构时,发现他们还在用Excel表格手动记录口罩、防护服等物资的进出库,经常出现捐赠方看不到物流进度、受赠方不清楚分配规则的情况。这种背景下,我们团队用SpringBoot+Vue开发了一套捐赠分配系统,上线后使物资流转效率提升300%,所有操作留痕可追溯。
这套系统的核心价值在于:
- 解决捐赠方与受赠方的信息不对称问题
- 实现物资从入库到分配的全程数字化管理
- 通过智能匹配算法提升紧缺物资分配公平性
- 为后续审计提供完整的电子凭证链
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用前后端分离架构,这是经过多次技术论证后的选择:
- 后端:SpringBoot 2.7 + MyBatis-Plus 3.5.1
- 选SpringBoot而非传统SSM:快速搭建微服务、内置Tomcat简化部署、starter机制方便扩展
- 实测在4核8G服务器上可支撑800+TPS的并发请求
- 前端:Vue 3 + Element Plus
- 对比React后选择Vue:更友好的中文文档、更适合快速迭代的管理系统开发
- 数据库:MySQL 8.0
- 关键配置:启用binlog用于数据同步,设置innodb_buffer_pool_size=6G(机器内存的75%)
2.2 核心模块划分
mermaid复制graph TD
A[物资管理] --> B[捐赠管理]
A --> C[库存管理]
A --> D[分配管理]
B --> E[捐赠登记]
B --> F[捐赠查询]
C --> G[入库审核]
C --> H[库存预警]
D --> I[智能分配]
D --> J[发放记录]
注意:实际开发中我们发现MyBatis的二级缓存会导致库存数据不一致,最终采用@Cacheable配合Redis实现缓存,命中率达92%
3. 关键业务实现
3.1 物资智能分配算法
核心逻辑采用优先队列+权重计算:
java复制// 分配权重计算公式
public double calculatePriority(Hospital hospital, Material material) {
return 0.3 * hospital.getUrgencyLevel()
+ 0.4 * material.getMatchDegree()
+ 0.2 * hospital.getDistance()
+ 0.1 * hospital.getHistoricalUsage();
}
遇到过的问题及解决方案:
- 并发分配导致超发:采用MySQL悲观锁+版本号控制
- 权重参数调整:开发管理后台可动态配置系数
- 特殊物资白名单:绕过算法直接指定分配
3.2 前后端交互设计
典型接口示例(物资入库):
java复制@PostMapping("/material")
public Result addMaterial(@Valid @RequestBody MaterialDTO dto) {
// 1. 校验物资类型是否在许可清单
// 2. 记录操作人IP和MAC地址(审计要求)
// 3. 触发库存预警检查
}
前端采用axios拦截器统一处理:
javascript复制service.interceptors.response.use(
response => {
if (response.data.code === 401) {
router.push('/login')
}
return response.data
},
error => {
ElMessage.error(error.response.data.message)
return Promise.reject(error)
}
)
4. 安全与性能优化
4.1 安全防护措施
- 接口防刷:Guava RateLimiter实现令牌桶限流
- SQL防护:MyBatis使用#{}防止注入
- 敏感数据:采用AES加密存储身份证号等字段
- 审计日志:基于Spring AOP记录所有关键操作
4.2 性能调优实战
通过Arthas发现的性能瓶颈及优化:
- 物资查询接口慢(1200ms→200ms)
- 问题:N+1查询问题
- 解决:MyBatis二级缓存+批量查询
- 导出Excel内存溢出
- 问题:全量数据加载到内存
- 解决:采用EasyExcel分页导出
5. 部署与监控方案
5.1 生产环境部署
我们的Docker Compose配置:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
redis:
image: redis:6
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
5.2 监控告警体系
- 使用Prometheus+Grafana监控:
- 关键指标:接口响应时间、JVM内存、MySQL连接数
- 预警阈值:当物资分配接口P99>1s时触发告警
- 业务级监控:
- 库存预警:低于安全库存时自动邮件通知
- 分配异常:同一机构频繁被跳过分配时记录
6. 开发经验总结
- 版本控制特别重要:我们曾因分支合并导致分配规则丢失,后来严格执行Git Flow流程
- 测试数据生成技巧:用Mockaroo生成10万条符合真实场景的测试数据
- 文档自动化:Swagger UI + YAPI实现接口文档实时同步
- 灰度发布策略:先开放给5家机构试用,收集反馈后再全量
这套系统目前已在3个省级红十字会部署,日均处理捐赠记录超2000条。最大的收获是认识到技术赋能公益的价值——当看到一线医护人员及时收到防护物资的反馈时,所有的加班debug都变得有意义。
