1. 项目背景与核心价值
社区防疫物资管理系统是近年来公共卫生信息化建设的重要组成部分。在突发公共卫生事件中,传统手工登记方式暴露出响应慢、数据易丢失、分配不透明等问题。我曾参与过某地级市的防疫系统升级项目,亲眼目睹基层工作人员用Excel表格管理上万条物资申请时的混乱场景——数据版本混乱、审批进度不明、库存预警滞后。这正是我们开发此类系统的现实驱动力。
本系统采用SpringBoot+Vue+MySQL技术栈,实现了三大核心价值:
- 流程数字化:将纸质申请转为在线填报,审批流程可视化追踪
- 库存动态管控:设置安全库存阈值,自动触发补货提醒
- 数据可追溯:完整记录物资流向,支持按时间/人员/社区多维查询
关键设计原则:在2023年某省会城市疫情中,我们发现高峰时段系统需承受每秒300+的并发申请。因此本系统特别注重高并发场景下的稳定性设计。
2. 技术架构解析
2.1 后端技术选型
SpringBoot 2.7作为核心框架,其优势在项目中体现为:
- 自动配置:通过
spring-boot-starter-web、spring-boot-starter-data-redis等starter快速集成组件 - 嵌入式Tomcat:简化部署流程,打包成单一JAR即可运行
- Actuator监控:暴露
/health、/metrics端点,方便运维
java复制// 典型的主启动类配置
@SpringBootApplication
@MapperScan("com.epidemic.mapper")
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
// 支持war包部署
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
2.2 前端技术方案
Vue 3 + Element Plus的组合带来以下特性:
- 响应式表单:使用
v-model双向绑定申报表单数据 - 动态路由:根据用户角色(
role_type)动态生成侧边栏菜单 - 可视化图表:通过ECharts展示物资库存趋势图
javascript复制// 典型的路由守卫实现
router.beforeEach((to, from, next) => {
const userRole = store.getters.roleType
if (to.meta.roles && !to.meta.roles.includes(userRole)) {
next('/403') // 无权限跳转
} else {
next()
}
})
2.3 数据库设计要点
MySQL 8.0的表设计遵循以下原则:
- 索引优化:在
approval_status、submit_time等高频查询字段建立组合索引 - 字段约束:使用
DECIMAL(10,2)精确记录物资单价,避免浮点误差 - 事务隔离:物资审批采用
@Transactional保证数据一致性
核心表关系如图:

3. 核心功能实现
3.1 多角色权限控制
系统采用RBAC模型,通过JWT实现鉴权:
- 居民角色:只能提交申请和查看个人记录
- 社区管理员:可审批申请、管理本社区库存
- 超级管理员:具备用户管理、全局数据查看权限
java复制// Spring Security配置示例
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/resident/**").hasRole("USER")
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()));
}
}
3.2 物资申报流程
典型业务时序:
- 居民提交申请(含物资类型、数量、紧急程度)
- 系统校验库存可用性
- 生成待审记录(状态码0)
- 管理员审批(通过→1,驳回→2)
- 更新库存并通知申请人
sql复制-- 库存检查SQL示例
SELECT material_name, current_stock
FROM community_inventory
WHERE material_category = '口罩'
AND current_stock > 0
FOR UPDATE; -- 加锁防止超卖
3.3 库存预警机制
通过定时任务实现两级预警:
- 黄色预警:库存低于安全阈值(
safety_threshold) - 红色预警:库存为0时自动锁定该物资申请通道
java复制// 定时任务示例
@Scheduled(cron = "0 0 9 * * ?") // 每天9点执行
public void checkInventory() {
List<Inventory> lowStock = inventoryMapper.selectList(
new QueryWrapper<Inventory>()
.lt("current_stock", "safety_threshold")
);
lowStock.forEach(item -> {
alertService.sendWechatAlert(item.getManagerId(),
"【库存预警】" + item.getMaterialName() + "剩余:" + item.getCurrentStock());
});
}
4. 部署与运维实践
4.1 环境准备清单
| 组件 | 版本要求 | 备注 |
|---|---|---|
| JDK | 11+ | 推荐Amazon Corretto |
| MySQL | 8.0+ | 需开启binlog |
| Redis | 6.0+ | 作缓存和Session存储 |
| Node.js | 16+ | 前端构建依赖 |
4.2 后端部署要点
-
配置分离:使用
application-prod.yml管理生产环境配置yaml复制spring: datasource: url: jdbc:mysql://${DB_HOST:localhost}:3306/epidemic?useSSL=false username: ${DB_USER:admin} password: ${DB_PWD:123456} -
JVM调优:推荐启动参数
code复制-Xms512m -Xmx1024m -XX:+UseG1GC -Dspring.profiles.active=prod -
日志收集:通过Logback接入ELK
xml复制<!-- logback-spring.xml配置示例 --> <appender name="ELK" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>logstash:5044</destination> <encoder class="net.logstash.logback.encoder.LogstashEncoder"/> </appender>
4.3 前端部署方案
-
生产构建:
bash复制
npm run build -- --mode production -
Nginx配置:
nginx复制server { listen 80; server_name epidemic.example.com; location / { root /opt/epidemic-frontend/dist; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend:8080; } }
5. 典型问题排查指南
5.1 跨域问题处理
现象:前端报错CORS policy
解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST")
.maxAge(3600);
}
}
5.2 MyBatis-Plus主键冲突
现象:批量插入时报Duplicate entry
修复方案:
java复制// 实体类配置
public class MaterialApply {
@TableId(type = IdType.ASSIGN_ID) // 雪花算法生成ID
private Long applyId;
}
5.3 Vue路由刷新404
根源:History模式需要服务端支持
Nginx修正:
nginx复制location / {
try_files $uri $uri/ /index.html;
}
6. 项目扩展方向
- 移动端适配:增加uniapp版本支持微信小程序申报
- 智能分配算法:根据申请紧急程度、历史记录优化审批优先级
- 区块链存证:将关键操作上链存证,增强公信力
- 物联网集成:通过RFID自动采集物资出入库数据
在真实项目中,我们曾遇到高峰期Redis连接数不足的问题。最终通过以下配置优化:
properties复制spring.redis.lettuce.pool.max-active=200
spring.redis.lettuce.pool.max-wait=1000ms
这个毕业设计项目不仅具有学术价值,更能直接服务于社区防疫实践。建议学弟学妹们在实现基础功能后,可以重点打磨权限控制和库存预警模块,这两个环节最能体现系统设计的完备性。
