ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring Boot + Vue 仓库管理系统(WMS)从零跑通与避坑指南

Spring Boot + Vue 仓库管理系统(WMS)从零跑通与避坑指南 简介一份基于Java、SpringBoot与Vue的WMS仓库管理系统完整毕业设计项目同时配套微信小程序端面向计算机、通信、人工智能等专业需要完成课程设计或毕业设计的学生。系统涵盖后端Java/SpringBoot业务逻辑、Vue管理后台页面、小程序移动端以及数据库脚本和说明文档代码经调试可运行项目整体结构清晰便于学习与二次开发。压缩包共1923个文件大小14.51MB以java源码、vue页面、js脚本、xml配置及小程序wxml/wxss文件为主各类文件按模块组织可快速定位前后端及移动端代码。目前已有1164人学习使用。项目在毕业答辩中获98分具备较高参考价值既适合新手入门理解仓库管理业务流程也适合在此基础上修改调整实现更多扩展功能。1. 一套基于 Java Spring Boot Vue 的 WMS 仓库管理系统值得花时间跑通吗一个非常常见的画面仓库货架堆得满满当当管理员手里捏着一沓纸质单据电脑上开着好几个 Excel 表格每次月底盘点都要全仓停摆两天。这套基于 Java Spring Boot Vue 的 WMS 仓库管理系统做的事情就是把入库、出库、库存查询、盘点这些核心动作全部搬到系统里——后端用 Spring Boot 处理业务逻辑和数据库读写管理端用 Vue 写操作界面仓库现场的操作员通过微信小程序扫码报单和查库存。它能解决的核心问题很直接每一笔出入库都有记录库存数字不再依赖某个人脑子里的印象。适合三类人正在找毕设选题的学生、接中小型外包项目的开发者、想给自家仓库上一套内部系统的团队。下面按落地顺序把技术选型、跑通步骤、数据库设计和踩坑细节一次讲清楚。2. 技术选型拆解Spring Boot Vue 微信小程序为什么是仓库管理的最优组合三个端不是各自为政而是通过一套 RESTful API 串联。后端的接口设计必须考虑到两种前端消费方的差异Vue 管理端有浏览器跨域问题小程序端没有Vue 需要处理 token 过期的页面跳转小程序需要处理静默登录和手机号授权。这些差异在接口设计阶段就要想清楚否则联调时改来改去浪费的时间比写业务代码还多。下面把每个端放在 WMS 的真实使用场景里说清楚这套组合为什么是当前最稳妥的默认方案。2.1 Spring Boot 后端WMS 不需要微服务单体能扛住就把复杂度留给自己仓库管理系统的并发量通常不会很高内部使用的系统同时在线可能就是几十个人高峰期的出入库操作也就每分钟几次到几十次。这个业务特征直接决定了后端选型的方向单体应用足够没必要为了技术亮点引入 Spring Cloud 那套注册中心、网关、配置中心的组合。Spring Boot 在这个场景里几乎是标准答案——内置 Tomcat靠自动配置把数据源、事务、Web MVC 这些基础设施准备好开发者只需要写业务代码。搭配 MyBatis-Plus 做持久层的话增删改查和分页查询不需要手写大量 XML单表操作几乎零成本这对快速交付非常关键。我在这类系统中一般遵循一个约定业务逻辑写在 Service 层Controller 只做参数接收和结果包装统一返回一个 Result 结构里面带 code、message、data 三个字段。这样前端无论是 Vue 还是小程序处理接口返回值都只认同一套协议。后端项目的目录结构也建议按模块分包controller、service、mapper、entity、common不要把全部类堆在一个包下面不然项目一扩业务就乱。Spring Boot 的版本选择值得多说一句。现在 Spring Boot 3.x 已经普及但它强制要求 JDK 17而且很多旧版第三方依赖还停留在 javax.* 命名空间迁移到 jakarta.* 之后兼容性问题很多。仓库管理这类项目追求稳定我一般建议落在 Spring Boot 2.7.x 搭配 JDK 8 或 11这套组合的生态最成熟踩坑的人少网上能查到的解决方案也全。等系统稳定运行之后再去考虑升级版本而不是一上来就追新。2.2 Vue 管理端中后台场景的组件生态目前没有比 Vue 更顺手的管理端要做的事情基本可以概括为表格、表单、弹窗、筛选、权限控制这几类。Vue 在这个领域有别的框架难以替代的积累——Element UIVue 2和 Element PlusVue 3把表格、分页、日期选择器、级联选择这些高频组件都做好了写一个带条件查询和数据分页的库存列表页核心代码可能就几十行。对比 React 那套需要自己搭组件体系的方案Vue 的学习曲线更平缓招人也好招很多后端工程师都能直接上手改前端代码。这套系统里管理端通常包含这些页面登录页、仪表盘今日入库量和出库量、库存总量、低库存预警、商品管理、库位管理、入库单管理、出库单管理、库存查询、盘点管理、系统设置。页面之间通过 Vue Router 做路由跳转状态管理用 PiniaVue 3或者 VuexVue 2存登录信息和角色标识。接口请求用 axios 做统一封装拦截器里自动附带 token响应拦截器统一处理 401 跳转登录页避免每个页面都写一遍错误处理。管理端的权限控制建议用简单的角色-菜单表设计管理员和普通操作员看到的菜单不一样。这个在 Vue Router 里通过路由守卫实现后端在登录接口返回角色标识前端根据角色动态注册路由。权限不需要做得很重能挡住误操作就行。另外一个实际交付中的经验管理端跑通的前提是做好环境配置尤其是 Node.js 版本和 Vue CLI / Vite 的匹配关系。用 Vite 构建 Vue 3 项目时Node 版本低于 16 会直接启动失败用 Vue CLI 创建 Vue 2 项目时Node 版本太高反而会报 OpenSSL 相关的错误这个细节第一次跑项目的人大概率会卡住。2.3 微信小程序仓库现场扫码操作比装 App 轻得多仓库现场的人员流动性大让每个人都在手机上装一个内部 App 并不现实微信小程序天然解决了这个问题扫码即用不用安装用完即走。小程序端的定位是轻量操作——仓库员工拿着手机扫描商品条码或库位码完成入库确认、出库拣货、库存查询、盘点扫码这些动作不需要承担复杂的数据分析和报表功能。对于仓储业务来说这个划分非常合理重操作留在电脑端的管理界面现场动作交给手机。小程序的技术要点集中在几个地方。登录流程一般是 wx.login 拿到 code传给后端换取 token如果需要绑定手机号做实名操作用 button 组件上的 open-typegetPhoneNumber通过用户授权拿到加密的手机号数据再交给后端解密。扫码功能直接封装 wx.scanCode扫描结果的解析规则是商品条码还是库位码由后端接口决定。仓库现场容易出现网络不稳定的情况小程序端请求接口时最好加超时处理并且把关键操作如提交出库单做成防重复提交的按钮状态。小程序和 Vue 管理端共用同一套后端接口但请求方式和页面形态不一样。小程序没有浏览器的跨域限制但真机预览时后端地址要写成局域网 IP 或域名不能用 localhost。列表页注意做触底加载更多用 onReachBottom 生命周期把页码加一请求下一页数据后 concat 追加而不是覆盖这个模式几乎是小程序列表页的标配。总体来看三端各自承担职责后端接口设计成一套前端两种形态复用这是这套组合性价比最高的地方。3. 从零跑通整套系统环境准备、后端启动、双端联调的最小步骤这类源码交付包一般包含四块内容Spring Boot 后端工程、Vue 管理端工程、微信小程序工程、数据库 SQL 脚本外加一份文档说明。文档里通常写明环境要求、初始化账号和接口列表。跑通整套系统的顺序建议是先准备环境再启动后端最后分别跑 Vue 管理端和小程序端。任何一步报错都先处理环境问题再往下走避免问题堆积到最后分不清是哪一层出的错。3.1 环境准备版本搭配照抄这份清单能少踩一半坑先把这套系统跑起来需要的软件列清楚。后端依赖 JDK 和 Maven数据库用 MySQL前端管理端需要 Node.js小程序端需要微信开发者工具。以下是我常用的版本组合组件推荐版本说明JDK1.8 / 11Spring Boot 2.7.x 的最佳搭配Maven3.6依赖管理和打包MySQL5.7 / 8.05.7 更稳8.0 要注意认证插件Node.js16.20过低过高都会引发前端构建问题Redis5.0用于缓存登录 token 和库存数据微信开发者工具最新稳定版调试小程序必需这套组合的核心原则是向后兼容。JDK 别选 17MySQL 别选 8.0 还配老版本驱动Node 版本按前端构建工具的要求来。很多第一次跑这套系统的人翻车都翻在版本搭配上——不是代码有问题是环境本身就不对。准备环境的顺序建议是先装 JDK 和 Maven 并配置好环境变量接着装 MySQL 并启动服务再装 Node.js最后安装微信开发者工具。装完以后用命令行验证环境变量是否生效避免后面报找不到命令再回头排查。验证命令如下。# 逐条执行确认每条都有正常版本号输出 java -version mvn -version node -v npm -v mysql --version每一条命令能正常输出版本号环境就算准备好了。如果哪一步输出 command not found 或者版本号与预期不符先去检查环境变量配置不要急着往下走。这里多说一句Maven 首次构建项目会从中央仓库下载大量依赖国内网络环境下建议配置阿里云镜像否则后端启动可能等上十几分钟第一次跑的人会以为卡死了。配置文件路径在 Maven 安装目录的 conf/settings.xml 里把 mirrors 节点替换成阿里云仓库地址即可。3.2 后端启动导入工程、修改数据源、创建数据库并导入脚本后端工程拿到手之后用 IDEA 以 Maven 项目的方式导入等待依赖下载完成。启动前需要做的第一件事是检查配置文件里的数据源参数。Spring Boot 的配置集中在 src/main/resources/application.yml 中最常见的修改项是数据库连接信息和 Redis 连接信息。# application.yml 关键配置 server: port: 8081 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/wms_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 123456 redis: host: localhost port: 6379 password: database: 0 mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml configuration: map-underscore-to-camel-case: true global-config: db-config: id-type: auto这里几个参数需要重点解释。url 里的 characterEncodingutf8 保证中文不会乱码serverTimezone 必须设置否则连接 MySQL 8.0 时会因为时区问题直接报错useSSLfalse 是本地调试的常规设置避免证书校验带来的干扰。driver-class-name 用 com.mysql.cj.jdbc.Driver 是 MySQL 8.0 的驱动类名如果项目跑在 5.7 上换成 com.mysql.jdbc.Driver 也没问题。mybatis-plus 里的 map-underscore-to-camel-case 把数据库下划线字段自动映射成 Java 驼峰属性这个开关一定要保持开启不然查询结果里会有一堆字段值为 null。配置改完后需要先创建数据库再导入初始化 SQL。交付包里通常会带 database 目录里面放着建库建表的 sql 脚本和初始化数据。命令行导入方式如下。mysql -u root -p -e CREATE DATABASE wms_db DEFAULT CHARACTER SET utf8mb4; mysql -u root -p wms_db database/wms_db.sql第一条命令创建数据库第二条命令把 SQL 脚本导入刚创建的数据库中。导入完成后登录 MySQL 检查表是否建全执行 SHOW TABLES; 看到用户表、商品表、库存表这些核心表都在就可以启动后端了。在 IDEA 里直接运行主类或者在项目根目录执行 mvn spring-boot:run日志里出现 Started Application 并且端口是 8081说明后端启动成功。如果发现端口被占用可以在配置里换一个端口或者找到占用进程杀掉。3.3 管理端与小程序联调从页面到数据的完整链路后端跑通以后先启动 Vue 管理端。把前端工程导入 IDE 或直接命令行操作先安装依赖再启动开发服务器。Vue 3 项目通常基于 Vite执行 npm install 安装依赖然后 npm run dev 启动默认端口一般是 5173。这里有个关键配置开发环境下前端和后端的端口不同需要配置代理解决跨域问题。// vite.config.js 或 vue.config.js 中的开发代理配置 module.exports { devServer: { port: 5173, proxy: { /api: { target: http://localhost:8081, // 后端服务地址 changeOrigin: true, pathRewrite: { ^/api: } } } } }代理的含义是把前端发出的 /api 开头的请求转发到后端 8081 端口同时去掉路径里的 /api 前缀。这样前端代码里请求 /api/goods/list实际打到后端的是 /goods/list。这种做法的好处是前端代码里不需要写死后端地址后续部署时只要改代理配置不用动业务代码。启动成功后浏览器打开前端地址能看到登录页面用初始化账号登录进去菜单和数据能正常加载管理端就联调通了。接着打开微信开发者工具导入小程序工程。小程序端需要改的是接口请求地址。开发调试阶段把 request 请求的基础路径指向本机或局域网地址。我在封装小程序请求时一般这样写。// utils/request.js 微信小程序请求封装 const BASE_URL http://localhost:8081 const request (url, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL url, method, data, header: { Content-Type: application/json }, success: (res) { if (res.data.code 200) { resolve(res.data.data) } else { wx.showToast({ title: res.data.message, icon: none }) reject(res.data) } }, fail: (err) reject(err) }) }) } module.exports request这段封装做了两件事统一加 Base URL统一处理返回的 code 判断。业务页面里调用 request(/inbound/list, GET, { page: 1 }) 就能拿到数据。真实项目中这里还要加上 token 携带逻辑从 storage 里读出来放到 header 的 Authorization 字段后端用拦截器校验。微信开发者工具里点击详情-本地设置勾选不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书本地 http 接口才能正常请求。真机调试时把 BASE_URL 改成电脑在局域网里的 IP比如 http://192.168.1.100:8081手机和电脑连同一个 Wi-Fi 就能访问。小程序页面如果用了自定义导航栏还要注意顶部导航栏高度适配。不同机型的系统状态栏高度不一样常见做法是调用 wx.getSystemInfo 获取 statusBarHeight动态设置占位元素的高度否则在刘海屏设备上内容会被摄像头区域遮住。这个细节看起来很碎但在真实仓库里用手机现场操作时非常影响体验。4. 数据库设计是 WMS 的核心核心表结构、库存设计思路与初始化数据数据库设计决定这个系统的上限。前端页面做得再漂亮库存算不清楚系统就没有交付价值。这一章把 WMS 的核心表结构和两个关键设计原则讲透最后给出数据库脚本导入时常见的三个坑。读懂这一章你不仅能跑通系统还能在答辩或汇报时说清楚每张表为什么这么设计。4.1 核心表设计入库、出库、库存三张主表的关系WMS 的业务模型可以压缩成一条主线商品从供应商进来入库放到库位库存按订单出去出库。数据库设计围绕这条主线展开就行不要一开始就追求几十张表的完整体系。一套典型的 WMS 数据库里核心表至少包括这些用户表 sys_user、商品表 goods、库位表 storage_location、库存表 stock、入库单表 inbound_order、入库单明细表 inbound_order_item、出库单表 outbound_order、出库单明细表 outbound_order_item、库存流水表 stock_record。主表通过订单号和商品 ID 关联明细表记录每一笔订单里具体的商品和数量。库存表是整个数据库里最需要仔细设计的一张表。它通常由仓库和库位两个维度定位一条库存记录字段包括商品 ID、库位 ID、当前数量、锁定数量、预警阈值。下面是一个参考建表语句实际项目按自己的命名风格调整。CREATE TABLE stock ( id BIGINT NOT NULL AUTO_INCREMENT, goods_id BIGINT NOT NULL COMMENT 商品ID, location_id BIGINT NOT NULL COMMENT 库位ID, quantity INT NOT NULL DEFAULT 0 COMMENT 当前可用库存, locked_quantity INT NOT NULL DEFAULT 0 COMMENT 锁定库存, warning_threshold INT NOT NULL DEFAULT 10 COMMENT 低库存预警阈值, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_goods_location (goods_id, location_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT库存表;建表语句里的核心设计有两点。第一goods_id 和 location_id 加了联合唯一索引保证同一商品在同一个库位只有一条库存记录避免数据重复。第二locked_quantity 字段的存在是为了处理订单锁库存的场景——用户提交一个出库单后先把可用库存转入锁定数量等出库确认完成再把锁定数量清掉这样可以防止两个订单同时抢同一批货。很多新手设计的系统没有这个字段导致超卖或库存对不上账。表单设计之外还需要注意时间字段和金额字段的类型选择。业务单据的创建时间用 datetime 就够别用 timestamp避免 2038 年的问题金额用 decimal不用 float 或 double浮点计算在涉及账目时有精度损失。这些都是数据库设计里容易被忽略但后面很难改的细节。4.2 库存扣减设计为什么不能先查再减你的 SQL 必须这样写库存扣减是 WMS 并发问题的高发区。常见错误写法是先 SELECT 查当前库存判断数量足够再 UPDATE 扣减。这个流程在两个请求同时进来时会出现问题——两个请求都查到库存是 10都认为足够然后各自扣减最后库存变负数。解决并发问题的手段是在 SQL 层面做原子操作把判断和扣减合并成一条 UPDATE 语句。-- 原子扣减受影响行数为 1 表示扣减成功为 0 表示库存不足 UPDATE stock SET quantity quantity - #{quantity} WHERE goods_id #{goodsId} AND location_id #{locationId} AND quantity #{quantity}这条 UPDATE 的本质是让数据库自己判断库存是否充足受影响行数为 1 表示扣减成功为 0 表示库存不足。Java 侧只需检查 update 的返回值不用再单独做一次 SELECT。我在实际项目中还会在事务里先扣减库存再插入出库单记录保证两条操作要么同时成功要么同时失败避免出现订单创建了库存却没扣的脏数据。Service 方法上必须加 Transactional 注解这一点放到避坑章节再细说。同样的思路也适用于入库。入库操作对库存做递增不存在超卖问题但要注意写流水记录每一次入库、出库、盘点调整都要写一条库存流水记录操作类型、变动前后的数量、操作人。流水表的价值在月底对账和追溯异常时才能体现出来——库存对不上时翻流水比翻 Excel 快得多也更容易定位是哪一笔操作出了问题。4.3 数据库初始化脚本导入时最常见的三个问题交付包里的数据库脚本一般分成两类建表脚本和初始化数据脚本。初始化数据通常包含一个管理员账号、基础的商品分类、测试用的商品和库位数据。账号默认密码常见做法是 admin/123456登录后第一件事应该是改密码尤其是部署到正式环境之前。导入脚本时有三个问题出现频率最高。第一个问题是 MySQL 8.0 和 5.7 的语法差异。脚本里如果用了新特性在 5.7 上可能不兼容反过来 5.7 的脚本在 8.0 上一般没大问题。导入前先确认目标数据库版本然后用对应版本的客户端执行。第二个问题是外键约束导致导入失败。建表顺序不对时子表先于主表创建会直接报错。解决方式是先建主表再建子表或者干脆不建物理外键只保留逻辑外键——业务里通过程序保证关联完整性。很多生产系统都选择后者因为物理外键在数据量变大后会拖慢写入性能。第三个问题是乱码。脚本文件如果是 GBK 编码而 MySQL 默认字符集是 utf8mb4导入后中文会变成问号。执行导入前先确认文件编码或者在 mysql 命令里加 --default-character-setutf8mb4。这个坑很小但一旦踩了库里全是乱码回滚重导很浪费时间。还有一点上线之后如果业务有调整需要用 ALTER TABLE 修改表结构建议修改前先备份尤其是库存表这类核心数据表结构变更和代码变更要同步发布否则代码已经引用新字段而数据库还没加上运行期会直接报错。5. 避坑指南这套系统最容易翻车的 5 个现场与排查方法源码能跑通只是第一步真正考验人的是各种环境和并发细节。这一章把我在交付这类 WMS 项目时遇到最多的 5 个现场写出来每条按现象、原因、解决的顺序展开希望帮你少走弯路。5.1 现象npm run dev 启动即崩溃报错指向 OpenSSL第一次跑 Vue 前端时很多人会遇到终端报错Error: error:0308010C:digital envelope routines::unsupported。这个现象在 Node 17 版本的机器上非常典型原因不是代码的问题而是 Node 版本过高与项目使用的 webpack 老版本存在 OpenSSL 兼容性冲突。常见解决方法是降 Node 版本到 16.x或者用 NODE_OPTIONS--openssl-legacy-provider 启动。我的建议是前者降版本最干净后者只是绕过了报错后续构建可能还会出现别的问题。装 Node 的时候建议用 nvm 管理多版本切版本只需要一条命令比反复卸载安装省事得多。5.2 现象Spring Boot 启动报错 NoClassDefFoundError 或方法不存在这类报错通常出现在使用了高版本 Spring Boot 3.x 的项目里。Spring Boot 3 要求 JDK 17同时把 javax 包迁移到 jakarta 包如果项目里引用的第三方工具包还停留在旧版编译可能通过但运行时报类或方法找不到排查起来非常费时间。如果你手里的源码是基于 Spring Boot 2.x 写的就不要轻易升级到 3.x。我在交付时一般固定 JDK 8 Spring Boot 2.7.x 的组合从源头避开这个坑。遇到启动报错先看完整堆栈别只看第一行真正的根因通常藏在 Caused by 那一段。5.3 现象小程序真机预览时请求全部失败提示网络错误开发工具里接口正常但真机预览后所有请求都失败。原因几乎都是 BASE_URL 写成了 localhost手机访问的是自己当然连不上电脑。解决方法是把 BASE_URL 改成电脑的局域网 IP并确认后端启动时监听的不是 127.0.0.1。另外还要检查电脑防火墙是否拦截了 8081 端口的入站请求这是经常被忽略的一步。改完之后在手机浏览器里直接访问 http://局域网IP:8081能打开就说明网络通了。如果后端配了 Token 拦截还要确认小程序请求的 header 里带上了 Authorization否则会一直 401。5.4 现象库存偶尔变成负数或者订单和库存对不上账库存为负是 WMS 系统的经典并发问题。前面数据库设计章节里讲的原子 UPDATE 就是标准解法。还要检查 Service 方法上有没有加 Transactional 注解库存扣减和订单创建必须在同一个事务里。如果这两个操作分散在不同事务中就会出现中间状态被其他线程读到的问题。排查这类问题不要只在单机测试用两个账号同时提交出库单多试几次能更快复现。另外一个隐蔽点是异步任务里的事务不回滚——同一个类内部调用带事务的方法事务会失效因为 Spring 的事务是基于代理实现的自调用不走代理。5.5 现象前端打包后放进 Spring Boot 静态目录刷新页面 404管理端写完后期的部署阶段很多人会把 Vue 构建出的 dist 文件直接放到 Spring Boot 的 src/main/resources/static 目录里这样一个 jar 包就能启动整套系统。但 Vue 默认用 history 路由模式刷新某个子页面时后端没有对应的路由映射就会返回 404。解决方法是把 Vue 路由改成 hash 模式地址栏用 # 分隔比如 http://localhost:8081/#/goods这样就不依赖后端路由支持代价是 URL 不好看。如果一定要用 history 模式则需要在后端写一个转发规则把所有非 /api 的请求都转发到 index.html。两种方案各有取舍我一般建议用 hash 模式部署最省事稳定性也最高。6. 把这个系统部署到真实仓库前值得追加的三个进阶技巧这套系统跑通、验收、上线中间还有几步值得做。下面三个技巧按投入产出比排序分别解决环境一致性、并发余量和验收信心的问题。6.1 用 Docker 固定后端运行环境换机器不再玄学部署时最怕的是在我电脑上明明好好的。用 Docker 把后端环境和应用一起打包可以彻底解决这个问题。FROM openjdk:8-jre WORKDIR /app COPY target/wms-server.jar app.jar EXPOSE 8081 ENTRYPOINT [java, -jar, app.jar]构建命令是 docker build -t wms-server .运行命令是 docker run -p 8081:8081 wms-server。数据库仍然跑在宿主机上容器里通过 application.yml 里的地址连接宿主机 IP这个方式在单机部署场景里够用不需要引入 docker-compose。6.2 引入 Redis 缓存热点库存为高峰期留余量原生的方案每次都查 MySQL其实对 WMS 这类内部系统没问题。但如果你把库存开放给外部渠道想让用户实时看到可售数量可以在 Redis 里缓存热门商品的可用库存。查库存时先读缓存写库存时先更新数据库再删除缓存下一次查询回填。缓存和数据库的一致性用先更新库再删缓存的策略就能应付绝大多数场景不必要引入复杂消息队列。注意给缓存的 key 设计好前缀比如 wms:stock:goodsId:locationId后续排查问题方便得多。6.3 上线前按这套冒烟清单走一遍验收时心里有底上线前验证不能只登录一下就算完。我一般按下面的顺序走一遍管理员登录 → 新增一个测试商品 → 手工录入一张入库单并确认库存增加 → 库存查询页面能搜到该商品 → 创建一张出库单并确认库存减少 → 库存流水里看到两笔对应记录 → 用小程序扫码查该商品返回正确库存 → 退出登录后访问页面被拦截回登录页。这条链路覆盖了登录权限、入库、出库、库存、流水和小程序接口任何一个环节有问题都能当场发现。有一次交付项目客户在验收前夜自己测了一把并发出库结果库存变成负数场面非常难堪。从那以后我接的所有系统都默认用原子扣减 SQL并且上线前一定把冒烟清单完整走一遍不再心存侥幸。这套基于 Spring Boot Vue 的 WMS 方案并不炫技但它足够稳也足够好交付。希望帮到你。本文还有配套的精品资源点击获取
返回列表