1. 项目概述抗疫物资管理系统的现实意义与技术选型2020年以来的公共卫生事件让全球意识到应急物资管理的重要性。作为计算机专业的学生我选择开发这套抗疫物资管理系统作为毕业设计不仅因为它具有现实意义更因为它能全面检验我对前后端技术的掌握程度。系统采用SpringBootVueMySQL的技术栈实现了从物资入库、调拨到消耗统计的全流程数字化管理。这个系统特别适合两类人群一是需要完成类似毕业设计的学生可以直接参考技术实现二是社区、医院等中小型机构的IT人员稍作修改即可用于实际工作场景。我在开发过程中踩过不少坑特别是在物资库存并发控制和权限管理方面这些实战经验都会在后续章节详细分享。2. 技术架构解析与核心设计思路2.1 为什么选择SpringBootVueMySQL组合SpringBoot的后端优势在于其自动配置和起步依赖特性让我能快速搭建RESTful API。实测用spring-boot-starter-web和spring-boot-starter-data-jpa两个依赖不到30分钟就能完成基础框架搭建。Vue的响应式特性则完美适配物资管理中的实时数据展示需求比如库存预警看板。MySQL作为关系型数据库在事务处理方面表现稳定。我特意使用了8.0版本利用其窗口函数简化了物资消耗的月度统计报表生成。以下是核心依赖的pom.xml片段dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdcom.auth0/groupId artifactIdjava-jwt/artifactId version3.18.2/version /dependency /dependencies2.2 系统模块划分与领域模型设计系统分为六大核心模块权限管理模块RBAC模型物资基础信息管理入库/出库流水管理库存预警模块统计报表模块系统监控模块物资实体采用聚合根设计模式核心字段包括Entity public class Material { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String materialNo; // 物资编码 private String name; // 物资名称 private String spec; // 规格型号 Enumerated(EnumType.STRING) private MaterialType type; // 物资类型枚举 private String unit; // 计量单位 private Double safeStock; // 安全库存量 // 省略getter/setter }3. 关键功能实现细节与避坑指南3.1 高并发场景下的库存控制方案物资调拨时的库存扣减是个典型的高并发问题。我最初使用JPA的Version乐观锁但在压力测试时发现性能不佳。最终方案是采用MySQL行锁重试机制Transactional public boolean reduceStock(Long materialId, Double amount) { int retry 0; while (retry MAX_RETRY) { Material material materialRepository.findByIdWithLock(materialId); if (material.getCurrentStock() amount) { material.setCurrentStock(material.getCurrentStock() - amount); materialRepository.save(material); return true; } retry; Thread.sleep(100); } return false; }重要提示测试时务必模拟至少50并发请求否则发现不了库存超卖问题3.2 基于Vue的动态表单实现物资类型多达20余种每种类型的字段要求不同。通过JSON Schema配置动态表单// 口罩类物资表单配置 const maskSchema { fields: [ { model: standard, label: 执行标准, type: select, options: [YY0469-2011, GB19083-2010] }, { model: level, label: 防护等级, type: radio, options: [一级, 二级, 三级] } ] }3.3 权限系统的深度定制标准RBAC模型无法满足实际需求我扩展了数据权限控制角色权限菜单按钮级控制部门权限只能查看本部门物资特殊时期权限如封控期间开放更高权限权限验证采用AOP切面实现Around(annotation(requiresPermission)) public Object checkPermission(ProceedingJoinPoint joinPoint, RequiresPermission requiresPermission) throws Throwable { String permission requiresPermission.value(); if (!currentUser.hasPermission(permission)) { throw new AccessDeniedException(权限不足); } return joinPoint.proceed(); }4. 典型问题排查与性能优化记录4.1 N1查询问题优化物资列表关联供应商信息时最初出现严重性能问题。通过以下方案解决使用EntityGraph注解定义抓取策略对分页查询添加QueryHints缓存复杂报表改用原生SQL查询优化前后对比查询类型优化前耗时优化后耗时物资分页1200ms200ms库存汇总2500ms500ms4.2 前端内存泄漏排查发现页面切换后内存持续增长经排查是以下原因未销毁的ECharts实例全局事件监听未移除KeepAlive缓存策略不当解决方案beforeDestroy() { this.chart.dispose() window.removeEventListener(resize, this.handleResize) }4.3 部署时的跨域问题开发环境用proxy没问题但生产环境出现跨域。最终方案Nginx配置统一处理SpringBoot添加CorsFilter对OPTIONS请求特殊处理location /api { add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE; add_header Access-Control-Allow-Headers Content-Type,Authorization; }5. 论文写作与毕业答辩要点5.1 论文核心章节安排建议绪论研究背景要结合最新数据关键技术综述别只讲理论要结合系统需求系统分析用例图流程图要规范系统实现重点展示创新点测试方案性能测试数据要详实5.2 答辩常见问题准备为什么不用Redis解决库存并发回答要点考虑到中小机构部署成本MySQL方案更轻量系统的扩展性如何体现回答要点模块化设计已预留API对接健康码系统安全措施有哪些回答要点JWT盐值加密敏感操作日志审计5.3 部署文档编写技巧好的部署文档应该包含环境要求JDK/MySQL版本初始化步骤数据库脚本位置配置文件修改项标注必填项常见启动问题排查示例启动报错Port 8080 in use的解决方案netstat -ano | findstr 8080taskkill /PID [进程ID] /F 或修改application.yml的server.port6. 项目扩展方向与实用建议这套系统在实际使用中还可以进一步扩展增加物资二维码管理功能使用ZXing库生成对接短信平台实现库存预警自动通知添加物资效期管理模块对于想直接使用的同学建议先精简功能从核心模块入手数据库字段根据实际需求调整前端主题可按需更换ElementUI皮肤我在开发过程中最大的体会是不要过度设计初期应该先用最简单的方式实现核心流程等跑通后再逐步优化。比如库存并发问题就是后来才引入的优化第一版先确保功能完整更重要。