轻量、可离线部署的库存查询与录入系统,可登记设备、物品或其他资产。V2 采用 Vue 3 前端与 PHP 8.2 / MySQL 8 API,前端构建产物随服务一起部署,运行时不依赖第三方 CDN。
- 公开库存查询与登录后受限信息查看;移动端可调用相机扫描新旧库存二维码。
- 登录后通过库存管理列表搜索、录入、修改和删除库存,自动生成不可预测的库存编号。
- 每位用户拥有个人仓库;管理员可创建组织仓库并授予查看、录入或管理权限,库存可在有权限的仓库之间移动。
- 普通用户只能查看自己的个人仓库及获授权的组织仓库;管理员默认查看自己的范围,也可切换到全部用户并筛选。
- 首位初始化用户为不可降级、不可删除的超级管理员;管理员可修改用户名、调整其他用户角色、重设密码和删除用户。个人仓库未清空时禁止删除。
- 首次通过网页完成管理员初始化;初始化完成后接口自动锁定。
- Argon2id 密码哈希、服务端会话、CSRF 校验、会话超时与登录限流。
- 可选 GitHub OAuth 登录:用户先在帐号页绑定现有帐号,系统不自动注册,也不保存 GitHub access token。
- 同一 IP / 账号在默认 15 分钟内连续失败 10 次会被临时封禁;记录使用升级后的
Error_login表。 - 兼容 V1 数据库和已打印二维码,例如
Read.php?key=m72W5F。 - 支持根目录
/与二级目录/I_sys/。
二维码识别功能随前端一起构建,不请求第三方 CDN,也不会上传照片。HTTPS 或 localhost 下支持实时相机扫码;普通 HTTP 局域网访问可使用“拍照识别”。生产部署仍建议配置 HTTPS。
Docker 镜像内已包含 PHP-FPM、Nginx 与构建后的 Vue 前端。首次访问页面时输入 SETUP_KEY,在网页中创建首位管理员;新管理员密码必须为 12–128 个字符。服务端登录会话保存在 inventory_php_sessions 命名卷中,普通的容器重启或重建不会要求重新登录。
cp .env.example .env
# 编辑 .env:填写 MySQL 连接信息和至少 32 位的 SETUP_KEY
docker compose --env-file .env up -d --build默认访问地址为 http://服务器地址:8080/,可在 .env 中通过 APP_PORT 修改映射端口。若使用已发布镜像而不是服务器本地构建,请在 .env 中设置 IMAGE_NAME 和 IMAGE_TAG,然后执行:
docker compose --env-file .env pull
docker compose --env-file .env up -d生产环境应在反向代理处终止 HTTPS,并保留 SESSION_COOKIE_SECURE=true。数据库首次升级需要 CREATE、ALTER、DROP 权限;完成升级后可收紧为日常运行权限。
cp .env.local.example .env.local
# 将所有 CHANGE_ME 替换为本地强密码
docker compose -f docker-compose.yml -f docker-compose.local.yml --env-file .env.local up -d --build该方式使用命名数据卷保存 MySQL 数据,适合体验与开发,不应替代生产备份或高可用方案。完整配置说明见 Docker 部署文档。
从源码构建的生产部署更新后,继续使用原 .env:
docker compose --env-file .env up -d --build
docker compose --env-file .env ps内置 MySQL 环境继续同时指定两个 Compose 文件:
docker compose -f docker-compose.yml -f docker-compose.local.yml --env-file .env.local up -d --build
docker compose -f docker-compose.yml -f docker-compose.local.yml --env-file .env.local ps无需先执行 down。普通 docker compose down 会保留命名卷;不要在正常更新时使用 down -v,该命令会删除 Compose 管理的 MySQL 数据卷和 PHP Session 卷。首次部署 Session 持久化改动后需要重新登录一次,此后的应用容器重启或重建会保留服务端登录会话;主动退出以及配置的空闲/绝对会话超时仍会使登录失效。
保留原数据库并部署 V2 代码即可;首次 API 请求会在迁移锁保护下创建所需结构。V1 用户成功登录后会将旧哈希原子升级为 Argon2id。若 Error_login 不为空,迁移会安全停止,避免覆盖已有记录;请先人工确认其用途。
旧二维码不需要重印:普通访问会跳转至新前端详情页;Read.php?key=...&type=json 仍返回兼容的 JSON。
- 复制
Config.new/.Config.php为根目录.Config.php,填写数据库、APP_BASE_PATH和SETUP_KEY。 - 在
frontend/执行npm ci && npm run build。 - 使用 PHP 8.2-FPM 和 Nginx 部署,参考 Nginx 配置说明。
- 确保 PHP 的
session.save_path指向 PHP-FPM 可写、且服务重启或版本更新时不会被替换的持久目录;否则服务端登录会话仍可能丢失。
本地构建与检查:
cd frontend && npm ci && npm run build
find . -name '*.php' -not -path './.git/*' -exec php -l {} \;创建 GitHub OAuth App,将回调地址设为:
https://你的域名/部署目录/api/v2.php?route=auth/github/callback
完成系统初始化后,由超级管理员登录前端,进入“GitHub 设置”,填写 Client ID、Client Secret 和不含部署目录的公开访问地址,再启用 GitHub 登录。配置不再从环境变量或 .Config.php 读取;Client Secret 存放于数据库 App_settings,查询接口不会回显原值,普通管理员和普通用户也无权读取或修改。请限制数据库和备份文件的访问权限。
除 localhost 和本机回环开发外,公开访问地址必须使用 HTTPS;部署目录仍由 APP_BASE_PATH 单独指定。现有本地用户需先在帐号页绑定 GitHub,系统不会通过 GitHub 自动注册新用户,也不会保存 GitHub access token。
推送完整语义化标签会由 GitHub Actions 发布多架构 GHCR 镜像:
git tag v2.0.0
git push origin v2.0.0镜像发布为 ghcr.io/<owner>/<repository> 的 2.0.0、2.0 和 latest 标签,支持 amd64 与 arm64。详见 镜像发布说明。


