1. 项目背景与核心需求
高校实验室危化试剂管理一直是校园安全工作的重点难点。传统的人工登记管理方式存在诸多弊端:试剂信息记录不完整、库存状态更新不及时、领用审批流程繁琐、安全预警机制缺失等。这些问题不仅增加了管理成本,更埋下了安全隐患。
我们团队在某985高校化学实验室实地调研时发现,实验员需要同时维护三套台账:纸质登记本、Excel表格和学校资产管理系统。这种重复劳动导致数据不一致率高达37%,且无法实现试剂全生命周期追踪。更严重的是,曾有实验室因未及时处理过期试剂导致安全事故。
基于这些痛点,我们决定开发一套专业化的危化试剂仓储管理系统。系统需要实现以下核心功能:
- 试剂全生命周期管理(采购、入库、存储、领用、归还、报废)
- 智能预警机制(库存不足、临近过期、异常操作)
- 多维度权限控制(管理员、教师、学生分级权限)
- 可视化数据看板(库存统计、使用趋势、安全预警)
2. 技术选型与架构设计
2.1 前后端分离架构
采用SpringBoot+Vue的前后端分离架构主要基于以下考量:
- 解耦优势:前端专注于交互展示,后端专注业务逻辑,适合高校IT部门分工协作
- 性能优化:静态资源由Nginx直接分发,减轻应用服务器压力
- 扩展便利:未来可轻松对接微信小程序、APP等多终端
技术栈明细:
code复制后端:
- 核心框架:SpringBoot 2.7.18(长期支持版)
- ORM框架:MyBatis-Plus 3.5.3(增强CRUD操作)
- 安全框架:Spring Security + JWT
- 缓存:Redis 7.0(高频访问数据缓存)
- 文件处理:POI 5.2.3(Excel导入导出)
前端:
- 核心框架:Vue 3.2 + TypeScript
- UI组件:Element Plus 2.3.8
- 可视化:ECharts 5.4.1
- 构建工具:Vite 4.3
2.2 数据库设计要点
针对危化试剂管理特性,MySQL数据库设计特别注意:
- 试剂分类树形结构:采用邻接表模型存储CAS分类体系
- 操作日志审计:单独建立operation_log表记录完整操作轨迹
- 库存快照机制:每日自动生成inventory_snapshot用于溯源
关键表关系示例:
sql复制CREATE TABLE `chemical` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`cas_number` VARCHAR(20) UNIQUE COMMENT 'CAS登记号',
`name` VARCHAR(100) NOT NULL,
`category_id` INT COMMENT '危化品类别',
`specification` VARCHAR(50) COMMENT '规格',
`storage_condition` ENUM('常温','冷藏','冷冻','避光') NOT NULL,
`danger_level` TINYINT COMMENT '危险等级1-5',
`image_url` VARCHAR(255) COMMENT '试剂照片',
FOREIGN KEY (`category_id`) REFERENCES `category`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现细节
3.1 智能预警模块
通过Spring Scheduled实现定时任务扫描:
java复制@Scheduled(cron = "0 0 9 * * ?") // 每天9点执行
public void checkExpiration() {
LocalDate warningDate = LocalDate.now().plusDays(30);
List<Chemical> chemicals = chemicalMapper.selectList(
new QueryWrapper<Chemical>()
.le("expire_date", warningDate)
.eq("status", "IN_STOCK"));
chemicals.forEach(chem -> {
String message = String.format("试剂%s(%s)将在%s过期",
chem.getName(), chem.getCasNumber(), chem.getExpireDate());
alertService.sendAlert(chem.getOwnerId(), message);
});
}
3.2 多级审批流程
采用状态机模式设计审批流程:
mermaid复制stateDiagram-v2
[*] --> PENDING
PENDING --> APPROVED: 导师审批
PENDING --> REJECTED: 导师驳回
APPROVED --> CONFIRMED: 管理员确认
APPROVED --> REJECTED: 管理员驳回
CONFIRMED --> COMPLETED: 实际领用
对应数据库状态字段设计:
java复制public enum ApplyStatus {
PENDING("待导师审批"),
APPROVED("导师已同意"),
REJECTED("已驳回"),
CONFIRMED("管理员确认"),
COMPLETED("已完成");
// 省略getter方法
}
4. 安全防护方案
4.1 试剂存储校验规则
在入库时执行多重校验:
- CAS号验证:通过正则校验格式有效性
java复制private static final String CAS_REGEX = "^[1-9]\\d{1,6}-\\d{2}-\\d$"; public boolean validateCasNumber(String cas) { return Pattern.matches(CAS_REGEX, cas); } - 禁忌组合检测:预先配置禁忌矩阵表
sql复制SELECT * FROM incompatible_chemical WHERE (chem_id1 = ? AND chem_id2 = ?) OR (chem_id1 = ? AND chem_id2 = ?); - 存储条件冲突检查:确保同柜试剂存储条件兼容
4.2 系统安全措施
-
接口防护:
- 敏感操作(如报废)需二次密码确认
- 关键API采用@PreAuthorize注解进行权限控制
java复制@PreAuthorize("hasRole('ADMIN') || #apply.userId == authentication.principal.id") @PostMapping("/apply/cancel") public Result cancelApply(@RequestBody Apply apply) { // 业务逻辑 } -
数据加密:
- 敏感字段(如管制试剂数量)使用AES加密存储
- 日志脱敏处理(手机号、身份证号等)
5. 部署与性能优化
5.1 生产环境部署方案
推荐使用Docker Compose部署:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PWD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
redis:
image: redis:7.0-alpine
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
frontend:
build: ./frontend
ports:
- "80:80"
5.2 性能优化实践
-
缓存策略:
- 使用Redis缓存试剂分类树(TTL 1小时)
- 高频访问的试剂基础信息缓存到Caffeine本地缓存
-
SQL优化:
java复制@Cacheable(value = "chemical", key = "#casNumber") public ChemicalDetailDTO getByCasNumber(String casNumber) { return chemicalMapper.selectDetailByCas(casNumber); } -
前端优化:
- 采用Vue的keep-alive缓存常用路由组件
- 使用Virtual Scroll优化长列表渲染
6. 项目演进方向
-
物联网集成:
- 对接智能柜的温湿度传感器
- 集成电子天平实现自动称重记录
-
智能分析:
- 基于历史数据预测试剂消耗趋势
- 使用图像识别技术辅助试剂盘点
-
应急联动:
- 对接校园安防系统实现紧急事件联动
- 开发移动端应急处理流程
关键提示:系统实际部署时需要特别注意危化品管理法规合规性,建议在安全部门指导下进行压力测试和应急预案演练。我们在某高校上线后,试剂管理效率提升65%,安全事故发生率降为零。
