1. 项目背景与核心价值
新冠疫情期间,物资管理成为各级机构面临的重大挑战。传统手工登记方式效率低下、易出错,而市面上的通用管理系统往往无法满足防疫物资的特殊管理需求(如效期追踪、紧急调拨、捐赠对接等)。这个基于SpringBoot+Vue的前后端分离系统,正是为解决这些痛点而生。
我去年为某地疾控中心部署这套系统时,他们最看重的三个特性:
- 物资全生命周期追踪:从入库、分配到报废的完整链路
- 多维度统计报表:实时可视化各仓库物资存量
- 权限精细控制:不同级别人员操作权限严格隔离
系统采用主流技术栈组合:
- 后端:SpringBoot 2.7 + MyBatis 3.5
- 前端:Vue 3 + Element Plus
- 数据库:MySQL 8.0
- 部署:Nginx + Docker
提示:这套技术栈的选择考虑了中小型政务项目的典型需求——开发效率高、社区支持强、运维成本低。实际部署时可根据硬件条件调整组件版本。
2. 系统架构设计解析
2.1 前后端分离实践方案
与传统JSP项目不同,本系统采用完全解耦的架构:
code复制[浏览器]
↔ [Nginx(前端静态资源)]
↔ [Vue.js]
↔ [Axios]
↔ [SpringBoot REST API]
↔ [MyBatis]
↔ [MySQL]
这种架构带来三个显著优势:
- 并行开发:前端团队与后端团队只需约定API文档
- 性能优化:静态资源由Nginx直接分发,减轻应用服务器压力
- 技术栈灵活:前后端可独立升级技术版本
2.2 数据库关键表设计
核心表结构设计示例(物资管理模块):
sql复制CREATE TABLE `material` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '物资名称',
`spec` varchar(200) NOT NULL COMMENT '规格型号',
`stock` int NOT NULL DEFAULT '0' COMMENT '当前库存',
`safety_stock` int NOT NULL COMMENT '安全库存',
`expire_date` date DEFAULT NULL COMMENT '失效日期',
`batch_no` varchar(50) DEFAULT NULL COMMENT '批次号',
`storage_location` varchar(100) DEFAULT NULL COMMENT '存放位置',
`qr_code` varchar(200) DEFAULT NULL COMMENT '二维码路径',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意:实际项目中我们为expire_date字段建立了索引,并在后台设置了30天有效期预警。
3. 核心功能实现细节
3.1 物资入库的防重复设计
在接收捐赠物资时,容易出现同一批物资多次录入的情况。我们通过组合校验解决:
java复制@PostMapping("/material/in")
public Result materialIn(@RequestBody MaterialInDTO dto) {
// 检查同批次同名称物资是否已存在
LambdaQueryWrapper<Material> query = new LambdaQueryWrapper<>();
query.eq(Material::getName, dto.getName())
.eq(Material::getBatchNo, dto.getBatchNo());
if (materialService.count(query) > 0) {
return Result.fail("相同批次的该物资已存在,请直接修改库存");
}
// 其他业务逻辑...
}
3.2 库存预警的三种触发方式
- 定时任务检查:每天凌晨2点扫描临近效期物资
java复制@Scheduled(cron = "0 0 2 * * ?")
public void checkExpire() {
List<Material> materials = materialMapper.selectExpiring(7); // 7天内过期
materials.forEach(m -> sendAlert(m));
}
- 操作触发检查:每次出库时检查安全库存
- 手动强制检查:管理员点击"库存检查"按钮
4. 部署实战与避坑指南
4.1 生产环境部署清单
| 组件 | 推荐版本 | 关键配置项 |
|---|---|---|
| JDK | 11 | -Xms512m -Xmx2048m |
| MySQL | 8.0 | innodb_buffer_pool_size=2G |
| Nginx | 1.20 | worker_processes auto; |
| Redis | 6.2 | maxmemory 1gb |
4.2 常见部署问题解决
问题1:Vue打包后访问API 404
- 原因:未配置Nginx反向代理
- 解决:
nginx复制location /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
问题2:SpringBoot启动报数据库连接失败
- 检查点:
- MySQL的max_connections是否足够(建议≥200)
- 连接串时区参数:?serverTimezone=Asia/Shanghai
- 账号的host权限(建议用'user'@'%')
5. 二次开发建议
5.1 可扩展功能方向
- 移动端适配:增加uniapp版本实现扫码入库
- 智能预测:基于历史数据预测物资需求
- 区块链存证:重要操作上链存证
5.2 性能优化实践
我们在实际项目中采用的优化措施:
- 热点数据缓存:使用Redis缓存物资分类信息
- 批量操作接口:替代单条记录的循环操作
- 文件异步导出:用线程池处理大数据量报表
java复制// 示例:使用MyBatis的批量插入
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO material(...) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.spec}, ...)
</foreach>
</insert>
6. 项目源码使用指南
源码结构说明:
code复制├── covid-material-backend # SpringBoot项目
│ ├── config # 配置类
│ ├── controller # 控制层
│ ├── entity # 实体类
│ └── service # 业务逻辑
├── covid-material-frontend # Vue项目
│ ├── public # 静态资源
│ ├── src # 源码目录
│ │ ├── api # 接口定义
│ │ └── views # 页面组件
└── docs # 文档
├── sql # 数据库脚本
└── deployment.md # 部署说明
快速启动步骤:
- 导入MySQL脚本(docs/sql/init.sql)
- 后端启动:修改application.yml中的数据库配置
- 前端启动:配置.env.development中的API地址
- 访问:http://localhost:8081
我在实际部署中发现一个易忽略的点:MySQL的group_concat_max_len参数默认值太小,可能导致某些统计查询被截断,建议在初始化脚本中加入:
sql复制SET GLOBAL group_concat_max_len = 102400;
