2020年新冠疫情暴发后,高校疫情防控管理面临前所未有的挑战。作为一名经历过三次校园封控的技术人员,我深刻体会到传统Excel表格+微信群接龙的管理方式存在诸多痛点:物资申领流程繁琐、健康上报数据滞后、信息孤岛现象严重。这正是我选择开发这套抗疫物资管理系统的初衷。
现有高校防疫系统主要存在三个典型问题:
经过对三个技术方案的对比测试,最终确定采用SSM+Vue的全栈方案:
| 方案 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| PHP+Laravel | 开发速度快 | 并发性能差 | 小型应用 |
| Django+React | 管理后台完善 | 学习成本高 | 中大型CMS |
| SSM+Vue | 生态成熟 性能均衡 |
配置较复杂 | 企业级应用 |
选择SSM(Spring+SpringMVC+MyBatis)作为后端框架,主要基于以下考虑:
前端选用Vue3+ElementPlus的组合,实测比React方案减少30%的代码量,特别适合快速迭代的管理系统开发。
系统采用微内核架构,核心模块包括:
java复制// 领域模型示例
public class EpidemicMaterial {
private String materialId; // 物资ID
private String name; // 物资名称
private Integer stock; // 当前库存
private Integer safetyStock;// 安全库存阈值
// 省略getter/setter
}
public class MaterialApplication {
private String applicationId;
private String userId;
private List<MaterialItem> items;
private Integer status; // 0-待审核 1-已通过 2-已发放
// 关联查询方法
public List<MaterialApplication> findByUser(String userId) {
return materialMapper.selectByUser(userId);
}
}
物资抢购场景下的库存超卖问题是系统最大挑战。我们采用三级防护策略:
javascript复制// 物资加入申请车按钮
<el-button
v-throttle="1000"
@click="addToCart">
加入申请
</el-button>
java复制public boolean deductStock(String materialId, int num) {
String lockKey = "lock:material:" + materialId;
try {
// 获取分布式锁
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
if(locked) {
// 实际扣减逻辑
return materialMapper.updateStock(materialId, num) > 0;
}
return false;
} finally {
redisTemplate.delete(lockKey);
}
}
sql复制UPDATE material_stock
SET stock = stock - #{num},
version = version + 1
WHERE material_id = #{materialId}
AND version = #{version}
为满足各院系不同的健康上报需求,设计了可配置表单系统:
json复制{
"fields": [
{
"type": "input",
"label": "体温",
"unit": "℃",
"required": true,
"validator": "number|min:35|max:42"
},
{
"type": "select",
"label": "症状",
"options": ["咳嗽", "发热", "乏力"]
}
]
}
vue复制<template>
<div v-for="field in schema.fields" :key="field.key">
<component
:is="`form-${field.type}`"
v-model="formData[field.key]"
v-bind="field" />
</div>
</template>
在JMeter压力测试中发现的三个性能瓶颈及解决方案:
@FetchType.EAGER注解并重构SQLnginx复制http {
client_max_body_size 20M;
}
针对高校系统的特殊安全需求,实施以下措施:
java复制@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(12);
}
java复制// 错误示例
public void applyMaterial() {
updateStock(); // 内部调用了this.deductStock()
createOrder();
}
private void updateStock() {
transactionTemplate.execute(status -> {
deductStock(); // 事务不生效
return null;
});
}
系统在本校试运行三个月后的关键指标:
| 指标 | 改进前 | 改进后 | 提升幅度 |
|---|---|---|---|
| 物资申领时效 | 8小时 | 25分钟 | 95% |
| 健康漏报率 | 12% | 1.8% | 85% |
| 服务器负载 | 75% | 40% | 47% |
特别在2023年12月的疫情反弹期间,系统平稳支撑了单日1.2万次的健康上报和3000+的并发物资申请,没有出现服务中断情况。