资讯动态

开源WMS实战:基于GreaterWMS的Docker部署与二次开发指南

发布时间:2026/9/26 12:28:12 来源:尧图企业网站定制
简介GreaterWMS仓库管理系统是一套面向企业仓储物流场景的开源软件源码全面开放既适合中小型仓库实现库存控制、订单管理、拣货出库等全流程优化也可作为计算机、信息管理专业学生的毕业设计案例或课程实践项目。资源包内共含2000个文件压缩包大小约85.15MB其中JavaScript、Python与Vue文件占比最高JavaScript和Vue共同构建了响应式前端界面与交互逻辑Python承担后端接口、业务处理及数据分析另有CSS样式、JSON配置、Markdown文档等辅助文件完整覆盖了从数据库设计到前端展示的现代Web开发技术栈。内容预览中可见JSON解析、日志处理、插件机制等核心模块同时系统内置简洁易用的界面模板及库存预警、报表生成等配套工具便于学习者从源码层面深入理解系统架构与业务流程。研究该源码可掌握模块化编程、面向对象设计、数据库操作等关键技能并可根据实际需求对功能模块进行二次开发定制。目前已有202人学习使用适合希望系统学习仓储管理系统构建的开发者和相关专业学生。1. 仓库管理系统不只是台账GreaterWMS 是一套能跑的完整业务闭环GreaterWMS 这套开源的仓库管理系统我拿到 v2.1.48 的压缩包时最先确认的是它到底算“能跑的软件”还是“只能看的源码”。实际看下来它是前者Django 后端 Quasar 前端自带用户、权限、库位、流程单和报表覆盖从扫码入库到库存预警的完整链路。对中小企业来说它能直接换掉 Excel 台账变成正经的仓储作业系统对学生而言源码里可拆的东西足够撑起一篇毕业设计论文或计算机案例模块边界、数据表关系、权限设计和接口封装都有得写。简单说这份资源做系统软件工具、做学习素材、做二次开发底座三个方向都成立适合想省下从零造轮子时间的开发者也需要真实业务系统做分析案例的从业者。2. 从 zip 包到容器Docker Compose 部署与四个关键参数拿到压缩包先别急着找安装包双击这个项目不是桌面软件而是标准的 Web 应用。解开 zip 后优先找两样东西docker-compose.yml和.env.example。前者决定怎么把系统跑起来后者决定跑起来后的配置比如数据库密码、时区、密钥。我建议首选 Docker 方式部署因为 GreaterWMS 依赖 PostgreSQL、Redis、Django 三个组件手动装极易遇到版本冲突尤其是 Redis 版本过低直接导致 session 失效这类问题排查起来非常耗时。2.1 解压后的目录拓扑源码包里每一块是干什么的解压以后用tree看一眼根目录大致结构如下GreaterWMS-V2.1.48/ ├── apps/ # Django 业务应用库存、出入库、报表都在这里 │ ├── appfront/ # 前端入口页面路由与登录态 │ ├── stock/ # 库存核心库存记录与变动流水 │ ├── cargo/ # 商品档案与分类 │ ├── inbound/ # 入库流程 │ ├── outbound/ # 出库流程 │ └── ... ├── docker-compose.yml # 容器编排入口 ├── .env.example # 环境变量样例 ├── requirements.txt # Python 依赖清单 ├── 说明.htm # 首次启动前建议先翻这里 └── 原生组件源码/ ├── Logger.cpp # 日志组件 ├── plugin.cpp # 插件加载器 ├── json_value.cpp # 自研 JSON 解析 ├── json_reader.cpp ├── json_writer.cpp ├── tokenizer.cpp # 词法分析配合 JSON 解析 ├── keyboard_ndk.cpp # PDA 键盘输入通道 └── keyboard_js.cpp # 浏览器端键盘事件桥接apps/目录下的 Django 应用是业务核心所有仓库作业逻辑都在这里。而那个“原生组件源码”文件夹容易被人忽略它实际是给 PDA 扫码终端和性能敏感场景准备的配套实现Logger.cpp负责日志落盘plugin.cpp是插件机制入口keyboard_ndk.cpp和keyboard_js.cpp负责扫码枪按键事件与前端交互。想深入理解系统架构的人这几个文件值得读一遍。2.2 用 Docker Compose 搭建环境从空目录到登录页部署前先确认本机有 Docker 和 Docker Compose 插件。然后按下面步骤操作cd GreaterWMS-V2.1.48 cp .env.example .env vim .env # 修改数据库密码、SECRET_KEY、时区 docker compose up -d docker compose ps # 等待 db、redis、web 全部 healthy docker compose exec web python manage.py createsuperuser第一步是把样例配置复制成实际配置避免直接改模板文件第二步必须改的是数据库密码、DJANGO_SECRET_KEY和TIME_ZONE。docker compose up -d会在后台启动全部容器第一次启动要拉镜像耗时取决于网络。看到 db、redis、web 状态都是 healthy 后执行最后一步创建管理员账号然后浏览器访问http://localhost:8088即可登录。.env里最关键的四个参数按下面的表设置参数作用建议值DJANGO_SECRET_KEYDjango 签名与 session 加密密钥随机 64 位字符串不要用默认值DB_PASSWORDPostgreSQL 密码至少 16 位含大小写和数字TIME_ZONE业务时区影响报表统计国内业务填Asia/ShanghaiDJANGO_DEBUG是否开启调试模式生产环境必须置为False这里的TIME_ZONE最容易忽略。默认是 UTC仓储报表按天汇总时会出现“凌晨 8 点前入库的货算到前一天”的错觉表面看是 Bug实际是时区没改。务必在初始化前就设好。2.3 手动部署的替代路径不想用 Docker 的话手动跑也不算复杂前提是本机装好了 Python 3.10、PostgreSQL 和 Redispython -m venv venv source venv/bin/activate pip install -r requirements.txt python manage.py migrate python manage.py runserver 0.0.0.0:8088这里python manage.py migrate是把 Django 的模型映射到数据库表初次执行会创建几十张表耗时在十几秒到一分钟之间。手动部署的风险点在于 PostgreSQL 版本和psycopg2的兼容性遇到过不少人在装psycopg2时报编译错误。我的建议是能 Docker 就 Docker省下的时间拿去看源码更划算。3. 核心流程落库入库、出库、预警是怎么串起来的仓库管理系统能不能用不看界面好不好看看业务流程是否闭环。GreaterWMS 把这套流程拆得很清楚基础资料先行然后是入库与出库两条主线最后通过预警和报表兜底。我按这个顺序讲也是实际操作时的配置顺序。3.1 基础资料先行仓库、库位、商品档案登录后台后第一件事不是建入库单而是把基础资料铺好。顺序是先建仓库再建库区与库位最后建商品档案。这个顺序不能乱因为后面所有单据都要引用库位和商品编码。基础资料路径仓库设置 - 库区/库位管理 - 商品管理 - 商品条码库位编码建议按“区域-通道-货架-层-位”规则编码例如A-03-02-01含义是 A 区 3 号通道 2 号货架第 1 层。系统里的库位是库存记录的维度之一库位编码设计得好后续盘点、拣货路径规划都会顺很多。商品档案里至少要录入商品编码、名称、单位、默认库位和安全库存阈值安全库存这个字段直接影响第 3.4 节的预警功能别留空。3.2 入库流程从入库单到库位绑定入库的完整链路在系统里是这样走的建入库单选择来源类型采购退货、生产入库、调拨入库添加入库明细指定商品编码与数量扫码收货系统校验商品是否存在上架时系统推荐库位操作员确认或手动改过账库存数量与库位绑定关系正式生效这里有个关键设计入库单在“收货”和“上架”之间是分开的。收货只是确认货到了上架才真正改变库存记录。很多新手以为收货就等于入库结果盘点时发现账实不符。上架动作执行后库存数据表里会新增一条“商品 库位 数量”的记录同时生成一条库存变动流水这条流水就是以后追溯的凭据。3.3 出库流程波次拣货与状态流转出库流程比入库多一些状态核心路径是创建出库单分配发货优先级分配库存系统按先进先出策略圈定库存生成波次把多张出库单合并成一次拣货任务扫码校验每拣一件货扫一次条码复核打包确认数量无误出库过账扣减库存并归档波次策略是出库模块的重点系统会把同一库区、同一优先级的多张出库单合并减少拣货人员来回跑动。如果你在测试时发现拣货任务里看不到单据通常是因为出库单的优先级没设置或者库存分配步骤没有执行。整套状态流转都会记录在系统日志里排查问题时按时间线翻日志比猜原因靠谱得多。3.4 库存预警安全库存参数与推送逻辑预警功能依赖 3.1 节里说的安全库存字段逻辑很直白系统定期扫描库存表当某个商品的在库数量低于安全库存时生成预警记录。具体设置路径一般在“商品管理 - 预警设置”里参数只有三个最小库存、最大库存、检查周期。参数含义建议值最小库存低于此值触发补货预警按 7 天平均出货量估算最大库存高于此值提示库存积压按供应商补货周期估算检查周期定时扫描频率每日凌晨执行避开业务高峰期这里要提醒一个概念区分系统里的库存状态有“在库”“锁定”“在途”之分。出库单占用的库存属于“锁定”不能算作可用库存。预警判断用的是可用库存而非账面总库存否则会把已经被出库单锁定的货算成可用的导致超卖。4. 二次开发入口改模板、加接口、跑通毕业设计案例源码开放是这个项目的最大价值也是很多人下载它的核心诉求。这一章我拆成两部分讲先讲源码结构和加接口的完整路径再讲怎么把它变成毕业设计论文或建站模板的素材。4.1 源码结构把 Django 项目按业务边界切分进入apps/目录后你会发现业务是按领域拆分的这种结构在软件工程里叫“模块化单体”。每个目录下都有models.py、views.py、urls.py三个核心文件分别负责数据模型、业务逻辑和路由映射。apps/ ├── stock/models.py # 库存记录与变动流水 ├── inbound/ # 入库单、收货、上架 ├── outbound/ # 出库单、波次、拣货 ├── cargo/ # 商品档案 └── wms/ # 仓库、库区、库位配置读懂这个结构对二次开发非常重要。比如你要给商品加一个“批次号”字段只需要改cargo/models.py里对应的模型类然后执行python manage.py makemigrations生成迁移文件再migrate同步数据库。全套流程走完后后台管理界面和 API 都会自动带上这个字段不用手工改前端。这也是我推荐拿它当毕设案例的原因一个字段的改动就能讲清楚“模型—迁移—API—界面”的完整链路。至于压缩包里的plugin.cpp它是原生组件层的插件加载器。二次开发走插件通道可以在不改动主程序的情况下挂载新功能但需要写 C 并重新编译门槛较高。大多数业务扩展直接用 Django 的 app 机制就够了那个原生插件层留给真正需要性能扩展的场景比如高频扫码数据预处理。4.2 加一个盘点差异接口从 View 到 URL 映射假设业务方要求增加一个“盘点差异上报”接口盘点人员扫码后直接把实盘数与系统数对比把差异数写回库存。这个功能用 DRFDjango REST Framework实现比较快。先在新文件里写视图逻辑# apps/api/views/inventory_audit.py from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from stock.models import Stock class InventoryAuditAPI(APIView): def post(self, request): goods_code request.data.get(goods_code) bin_code request.data.get(bin_code) actual_qty request.data.get(actual_qty) if not all([goods_code, bin_code, actual_qty is not None]): return Response({detail: 参数不完整}, statusstatus.HTTP_400_BAD_REQUEST) try: stock Stock.objects.get(goods_codegoods_code, bin_codebin_code) except Stock.DoesNotExist: return Response({detail: 库存记录不存在}, statusstatus.HTTP_404_NOT_FOUND) diff int(actual_qty) - stock.qty stock.qty int(actual_qty) stock.save() return Response({diff: diff, new_qty: stock.qty}, statusstatus.HTTP_200_OK)这段代码的关键逻辑是先从请求体里取三个参数缺一不可接着按商品编码和库位编码定位库存记录这个二元组是库存表的唯一维度查不到就返回 404计算差异后直接更新数量并返回差异值。还需要把路由挂上去# apps/api/urls.py from django.urls import path from .views.inventory_audit import InventoryAuditAPI urlpatterns [ path(stock/audit/, InventoryAuditAPI.as_view(), nameinventory-audit), ]挂好路由后重启服务用curl -X POST http://localhost:8088/api/stock/audit/传 JSON 就能验证。这里有个容易踩的细节DRF 的request.data只能解析 JSON 和表单格式如果你 POST 的是纯文本它会返回 400 而不是帮你解析。4.3 建站模板定制Quasar 前端的修改边界摘要里提到的“建站模板”对应的是项目基于 Quasar 框架做的前端界面。想改登录页、侧边栏菜单、标题这些改的不是编译后的 CSS 文件而是源码里的 Vue 组件和布局文件。cd apps/appfront npm install npm run buildnpm run build会把前端代码打包成静态资源生成的文件交给 nginx 托管。整个定制链路是改 Vue 模板或 Quasar 布局配置 → 重新构建 → 替换静态目录。要注意vendor.2ac1ba6a.css这类文件名带哈希值的是构建产物直接改它没有任何意义重启后就会被覆盖。想改样式一定去源码里找对应的.vue文件或全局样式表。有个取巧的做法是只改系统标题和 Logo这两个通常集中在quasar.config.js和布局组件的常量里改动最小效果却最直观适合拿来做毕业设计界面演示。4.4 毕业论文设计拆解把系统变成可答辩的案例素材如果目的是写毕业论文直接分析整个系统会显得太散建议按下面这个映射关系拆章节论文章节对应源码素材需求分析从单据状态机提炼功能需求与非功能需求数据库设计stock/models.py里的模型字段与关系核心模块实现入库与出库的 View 逻辑、事务处理系统测试接口测试用例 库存数据一致性验证举例来说“库存状态字段采用整数枚举而非字符串”这个设计决策就可以展开写“为什么用 1、2、3 表示状态而不是直接存字符串”——因为数据库检索和索引大小对性能有影响这个切入点很能体现对源码的理解深度也是答辩时容易被追问的点。5. 部署与使用避坑五个高频翻车现场这个项目我前后部署和二次开发过三轮踩过不少坑下面按“现象 → 原因 → 解决”记录五条最高频的问题按顺序排查能省大半天时间。5.1 zip 解压异常伪加密和不靠谱的压缩工具现象下载的GreaterWMS仓库管理系统 v2.1.48.zip解压到一半提示“文件头损坏”或要求输入密码。原因压缩包可能启用了 ZipCrypto 伪加密——这是一种只改加密标记、不真正加密数据的手段部分压缩工具会误判。另外Windows 右键自带的压缩功能在路径过长时会静默截断文件名导致解压失败。解决不要用带广告的桌面压缩工具直接用 7-Zip 打开伪加密的包会自动识别并正常列出文件路径过长的问题就把解压目标放到盘符根目录比如D:\wms\而不是嵌在多层用户目录里。另外右键压缩整个源码目录这个习惯要改掉超过 260 字符的路径在 Windows 下就是灾难。5.2 容器启动后 web 连不上数据库现象docker compose up -d后web容器一直重启日志里报connection refused连不上 PostgreSQL。原因数据库容器初始化需要时间web 容器启动太快数据库还没就绪。也可能是.env里的数据库密码和 docker-compose 里配置的POSTGRES_PASSWORD不一致。解决在 docker-compose 的 web 服务里加启动依赖web: depends_on: db: condition: service_healthy同时给 db 服务加healthcheck用pg_isready做探活。密码不一致的问题直接检查两个配置文件里引用的是不是同一个变量。5.3 migrate 卡死或字段冲突现象执行python manage.py migrate时卡在某一处不动或者报relation already exists。原因多半是迁移记录表django_migrations与数据库表结构不一致。之前跑过部分迁移后手动改过数据库或者恢复过旧备份。解决如果数据不重要直接删库重建最省事如果数据要保把django_migrations表里对应 app 的迁移记录删掉再重新执行migrate。操作前先备份整库这个动作不要省。5.4 时区配置错误导致每天报表少 8 小时数据现象凌晨 0 点到 8 点之间的入库记录在日报里算到了前一天。原因容器默认时区是 UTC而业务用的是北京时间相差 8 小时。如果初始化之后才改时区已经按 UTC 写入的时间戳不会自动纠正。解决在.env里把TIME_ZONE设为Asia/Shanghai再重建容器。已经产生的错误数据按created_at interval 8 hour做一次批量修正别指望改配置后旧数据自己变对。5.5 扫码枪在 PDA 上输入中文乱码现象用 PDA 扫商品名称或备注时中文变成乱码英文和数字正常。原因项目里keyboard_ndk.cpp和keyboard_js.cpp分别处理 NDK 底层按键事件和浏览器键盘事件它们之间的编码协商如果走默认字符集中文就容易被错误解码。解决先把 PDA 的输入法切到 ASCII 模式商品编码尽量用纯字母数字如果业务必须中文检查终端默认字符集是否为 UTF-8。测试时扫中文备注乱码但不影响商品编码匹配就说明是显示层问题而不是库存数据错误。6. 用数据校验脚本验证库存一致性进阶用法系统部署好后最怕库存数据和实际仓库对不上。我习惯写一个 Python 脚本调系统的 REST API 拉取实时库存再跟导出的人工盘点表对比差异项直接输出成清单。这个脚本等于给仓库加了一道自动复核。import requests BASE_URL http://127.0.0.1:8088 LOGIN_URL f{BASE_URL}/api/login/ STOCK_URL f{BASE_URL}/api/stock/current/ session requests.Session() def login(username: str, password: str): resp session.post(LOGIN_URL, json{ username: username, password: password, }) resp.raise_for_status() print(登录成功session 已建立) def fetch_stock(): resp session.get(STOCK_URL) resp.raise_for_status() items resp.json().get(results, []) return {(item[goods_code], item[bin_code]): item[qty] for item in items} def compare(api_stock: dict, excel_stock: dict): diffs [] for key in set(api_stock) | set(excel_stock): api_qty api_stock.get(key, 0) excel_qty excel_stock.get(key, 0) if api_qty ! excel_qty: diffs.append((key, api_qty, excel_qty)) return diffs if __name__ __main__: login(admin, your-password) api_data fetch_stock() # excel_data 由盘点表转换而来 # 格式为 {A001: 120, A002: 45} excel_data {} for key, api_qty, excel_qty in compare(api_data, excel_data): print(f差异 | 商品库位: {key} | 系统: {api_qty} | 盘点: {excel_qty})脚本的核心逻辑分三步先登录拿 session再用同一个 session 拉库存接口避免二次鉴权最后以“商品编码 库位编码”作为联合主键逐条比对。set(api_stock) | set(excel_stock)这行代码的意义是取两个数据集的并集保证一方缺失也能被查出。实际使用时把 excel_data 替换成 pandas 读盘点表即可。这个脚本跑一遍只需要几秒比人工抽查高效得多。做完这套验证之后我养成了一个习惯凡是拿到一个 WMS 源码包先不急着写业务代码第一件事就是跑通登录接口和库存查询接口确认数据能读出来再碰业务流程。这个习惯帮我省了不少冤枉时间希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑