1. 项目背景与核心价值
高校实验室危化试剂管理一直是校园安全工作的重点难点。传统的手工台账登记方式存在效率低下、追溯困难、安全隐患大等问题。去年我校化学实验室就发生过一起因试剂过期未及时清理导致的泄漏事故,直接经济损失超过20万元。这件事让我下定决心开发一套专业的危化试剂管理系统。
这套系统采用当前主流的前后端分离架构,具有以下核心优势:
- 安全管控:实现试剂从入库到报废的全生命周期追踪,自动预警临期试剂
- 流程优化:电子化审批流程,审批时间从原来的平均3天缩短至2小时内
- 数据可视化:通过看板实时展示库存状态,管理人员可随时掌握动态
- 合规管理:自动生成符合《危险化学品安全管理条例》要求的台账报表
提示:系统特别设计了双人复核机制,所有高危试剂操作必须由两名管理员共同确认,这是从某高校真实事故案例中吸取的教训。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 整体架构设计
系统采用经典的三层架构:
code复制前端层:Vue3 + Element Plus + ECharts
网关层:Nginx反向代理 + JWT鉴权
服务层:SpringBoot 2.7 + MyBatis-Plus + MySQL 8.0
2.2 关键技术选型原因
前端技术栈:
- Vue3组合式API:相比Options API更利于复杂业务逻辑组织
- Element Plus:提供完善的表单验证和表格组件,特别适合管理系统开发
- ECharts 5:满足危化品存量热力图、过期趋势图等专业可视化需求
后端技术栈:
- SpringBoot 2.7:稳定的LTS版本,避免踩新版本兼容性坑
- MyBatis-Plus 3.5:极大简化单表CRUD操作,内置分页插件
- Hutool 5.8:国产工具包,Excel导出等实用功能开箱即用
数据库设计要点:
- 采用库存快照机制:每天凌晨自动备份库存状态
- 试剂表设置多级分类:按危险等级(1-5级)、化学品类别双重分类
- 操作日志全记录:满足审计要求,保留6个月操作记录
3. 核心功能实现细节
3.1 智能预警模块
java复制// 过期预警核心逻辑
public List<Reagent> checkExpiredReagents() {
return lambdaQuery()
.le(Reagent::getExpireDate, LocalDate.now().plusDays(30))
.eq(Reagent::getStatus, ReagentStatus.NORMAL)
.list();
}
预警规则设计:
- 一级预警(红色):距有效期≤7天
- 二级预警(黄色):8-30天内到期
- 三级预警(蓝色):31-90天内到期
3.2 双人复核流程
mermaid复制sequenceDiagram
申请人->>管理员A: 提交高危操作申请
管理员A->>系统: 初审通过
系统->>管理员B: 推送复核任务
管理员B->>系统: 最终确认
系统->>申请人: 通知结果
注意:实际开发中我们发现Chrome浏览器对mermaid支持不佳,最终改用纯前端实现审批流程图
3.3 安全审计功能
审计日志表关键字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| operation | varchar | 操作类型 |
| operator | varchar | 操作人工号 |
| ip | varchar | 操作终端IP |
| params | text | 请求参数快照 |
| status | tinyint | 操作结果 |
4. 部署实战指南
4.1 环境准备
服务器最低配置:
- CPU:4核(建议8核)
- 内存:8GB(建议16GB)
- 磁盘:100GB SSD(日志单独挂载盘)
软件版本要求:
- JDK:Amazon Corretto 11
- Node.js:16.x LTS
- MySQL:8.0.28+(必须开启binlog)
4.2 数据库初始化
关键步骤:
sql复制-- 创建专属用户
CREATE USER 'reagent_admin'@'%' IDENTIFIED BY 'Complex@Password123';
GRANT ALL PRIVILEGES ON reagent_db.* TO 'reagent_admin'@'%';
-- 重要表空间配置
ALTER TABLE reagent_log DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=8;
4.3 前端部署优化
实测有效的vite配置:
javascript复制// vite.config.js
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor'
}
}
}
}
}
})
5. 踩坑实录与解决方案
5.1 MyBatis动态SQL陷阱
错误写法:
xml复制<if test="status != null and status != ''">
AND status = #{status}
</if>
正确写法:
xml复制<if test="status != null">
AND status = #{status}
</if>
教训:空字符串判断会导致Integer类型参数被错误过滤
5.2 Vue响应式丢失问题
典型场景:
javascript复制// 错误做法
this.reagentList = res.data
// 正确做法
this.reagentList = Object.freeze(res.data)
5.3 SpringBoot多环境配置
推荐结构:
code复制resources/
├── application.yml
├── application-dev.yml
├── application-test.yml
└── application-prod.yml
激活命令:
bash复制java -jar reagent.jar --spring.profiles.active=prod
6. 系统扩展方向
- 物联网集成:通过RFID标签实现试剂自动盘点
- 智能采购预测:基于历史用量机器学习预测采购量
- 移动端适配:开发微信小程序用于紧急审批
- 应急预案库:关联MSDS数据,事故时自动推送处置方案
我在实际部署中发现Nginx的worker_connections参数需要根据并发量调整,建议生产环境设置为:
nginx复制events {
worker_connections 4096;
multi_accept on;
}
这套系统目前已在3所高校稳定运行1年以上,日均处理审批流程200+次,拦截违规操作17起,有效提升了危化品管理效率。所有源码已做好完整注释,特别适合需要快速构建类似系统的团队参考。
