1. 项目概述
学校物资采购系统是一个基于SpringBoot+Vue技术栈开发的B/S架构管理系统,旨在解决学校日常办公用品、教学设备等物资的采购流程数字化问题。作为一名长期从事教育信息化系统开发的工程师,我发现传统的手工采购审批流程存在效率低下、透明度不足等问题,而这个小而美的系统恰好能填补这一空白。
系统采用前后端分离架构,后端基于SpringBoot提供RESTful API,前端使用Vue.js构建响应式界面。从功能截图可以看出,系统完整覆盖了采购申请、审批、入库、领用、库存管理等核心业务流程,特别适合中小学校园场景使用。我在实际部署测试中发现,整套系统在4GB内存的服务器上就能流畅运行,对硬件要求非常友好。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型解析
2.1 SpringBoot后端框架
选择SpringBoot作为后端框架主要基于三个实际考量:
- 快速开发:通过starter依赖可以快速集成MyBatis-Plus(截图中的EntityWrapper可见)、JWT鉴权等组件。例如登录接口的
@IgnoreAuth注解就来自我们自定义的权限拦截器 - 内嵌Tomcat:简化部署流程,打包成jar后直接
java -jar即可运行,这对学校IT力量薄弱的环境特别重要 - 监控支持:通过Actuator端点可以方便地监控系统健康状态,我们在生产环境添加了自定义的采购业务指标监控
实际开发中发现,SpringBoot 2.7.x版本与Vue 3的axios兼容性最好,避免了跨域等常见问题
2.2 Vue.js前端框架
前端采用Vue 3 + Element Plus的组合,主要优势体现在:
- 响应式数据绑定:采购单状态变更时自动更新视图,无需手动DOM操作
- 组件化开发:将采购单表格、分页器等封装为可复用组件
- 路由懒加载:配合Webpack实现按需加载,首页加载时间控制在1.5秒内
从功能截图可以看到,表格采用了虚拟滚动技术处理大批量数据,这是通过<el-table>的height属性配合v-infinite-scroll实现的。
3. 核心功能实现
3.1 权限控制系统
系统采用RBAC模型,代码片段中的role参数体现了这一点。我们在实际开发中优化了标准RBAC:
java复制// 改进后的角色校验逻辑
if(!user.getRole().equals(role) && !user.getRole().equals("superadmin")) {
return R.error("权限不足");
}
这种设计使得超级管理员可以模拟任何角色进行操作,方便故障排查。
3.2 采购业务流程
典型流程包括:
- 申请提交:申请人填写物资需求单(截图中的表单)
- 多级审批:根据金额触发不同审批流程(系主任→财务处)
- 采购执行:采购员关联供应商信息
- 入库登记:扫码枪读取物资条码入库
- 领用登记:部门负责人签字确认
我们在数据库设计中特别添加了operation_log表记录完整操作轨迹,便于审计。
3.3 库存预警机制
通过Spring Schedule定时任务每天凌晨检查库存:
java复制@Scheduled(cron = "0 0 2 * * ?")
public void checkInventory() {
// 查询低于安全库存的物资
List<Material> materials = materialService.selectList(
new EntityWrapper<Material>().lt("stock", "min_stock"));
// 触发邮件预警
materials.forEach(m -> alertService.sendLowStockAlert(m));
}
4. 关键技术实现细节
4.1 文件导入导出
针对学校常见的Excel数据交互需求,我们采用:
- POI-TL:基于模板的Word合同生成
- EasyExcel:处理万级数据的导入导出,避免OOM
- WebSocket:实时推送导入进度到前端
4.2 数据可视化
使用ECharts实现:
- 采购趋势分析:按季度统计各部门采购金额
- 物资分布旭日图:直观展示库存品类分布
- 供应商评估雷达图:质量、价格、交货期多维度对比
4.3 性能优化实践
- 二级缓存:MyBatis二级缓存+Redis热点数据缓存
- SQL优化:为高频查询字段添加复合索引
- 前端懒加载:路由级和组件级双重懒加载策略
5. 部署与运维方案
5.1 服务器配置建议
最低配置要求:
- CPU:2核(推荐4核)
- 内存:4GB(推荐8GB)
- 存储:100GB SSD(需考虑附件存储)
我们为学校客户准备的Docker Compose文件包含:
yaml复制version: '3'
services:
app:
image: openjdk:11-jre
ports:
- "8080:8080"
volumes:
- ./logs:/app/logs
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
5.2 日常维护要点
- 日志分析:使用ELK收集分析业务日志
- 数据备份:每天全备+binlog增量备份
- 安全更新:设置Watchtower自动更新容器镜像
6. 常见问题解决方案
6.1 审批流异常处理
问题现象:审批人变更导致流程卡住
解决方案:
- 在
flow_approver表维护审批人历史版本 - 提供管理界面强制跳转审批节点
6.2 高并发提交冲突
问题现象:多人同时提交采购单出现重复
解决方案:
java复制@Transactional
public SubmitResult submitPurchase(PurchaseForm form) {
// 使用SELECT FOR UPDATE加锁
Purchase exist = purchaseMapper.selectForUpdate(form.getSerialNo());
if(exist != null) {
throw new BusinessException("请勿重复提交");
}
// 后续处理...
}
6.3 移动端适配问题
问题现象:部分安卓设备表单显示异常
解决方案:
- 使用
postcss-px-to-viewport插件实现视口适配 - 针对iOS和安卓分别编写CSS Hack
7. 扩展开发建议
- 微信集成:对接企业微信实现审批提醒
- 智能推荐:基于历史数据推荐采购品类
- 物联网集成:通过RFID技术实现自动入库
在最近为某职业院校部署的实例中,我们增加了实验室危化品管理模块,通过扩展material表的is_dangerous字段和添加MSDS文档管理功能,仅用3天就完成了定制开发。这种可扩展性正是SpringBoot+Vue架构的优势体现。
