基于 Flask + Flask-SQLAlchemy 的物资管理系统,支持用户注册登录、物资目录检索、批量申领、审批流转、归还审核、库存导入导出和 Docker 部署。
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python app.py访问地址:http://127.0.0.1:5000
开发环境默认会加载演示数据(SEED_DEMO_DATA=1),演示账号:
- 管理员:
admin / 123456 - 普通用户:
user1 / 123456、user2 / 123456
生产环境不会创建上述演示账号。
python -m unittest discover测试默认使用内存 SQLite,不会改动 instance/storage.db。
.
├── app.py # 本地开发兼容入口,支持 python app.py
├── wsgi.py # Gunicorn/生产部署入口
├── src/things_manager/ # Flask 应用源码包
├── src/things_manager/app.py # 应用、模型、路由和初始化逻辑
├── src/things_manager/templates/
├── instance/ # SQLite 数据库与运行时数据
├── Dockerfile
├── docker-entrypoint.sh # 生产容器单次初始化入口
├── requirements.txt
├── tests/
├── .env.example
└── README.md
构建镜像:
docker build -t things-system:v1.1.1 .创建持久化数据库目录:
mkdir -p /data/things_system/instance启动容器:
docker run -d \
-p 5000:5000 \
-e SECRET_KEY="$(openssl rand -hex 32)" \
-e BOOTSTRAP_ADMIN_PASSWORD='请替换为至少12位的强密码' \
-v /data/things_system/instance:/app/instance \
--name things_manage_prod \
--restart always \
things-system:v1.1.1健康检查地址:http://服务器IP:5000/healthz。生产登录流量应通过 HTTPS 反向代理接入。
SECRET_KEY:生产环境必须设置随机强密钥。APP_ENV:运行环境;生产镜像固定为production,会强制校验密钥。DATABASE_URL:可选,默认使用sqlite:///storage.db,数据库文件位于 Flask instance 目录。当前镜像仅内置 SQLite 驱动;切换外部数据库前需安装对应驱动并引入正式迁移流程。PORT:可选,本地python app.py启动端口,默认5000。生产容器使用wsgi:app。AUTO_INIT_DB:本地默认1。生产镜像固定为0,由入口脚本在 Gunicorn worker 启动前统一初始化一次。QUIET_INIT_DB:可选,设为1时隐藏初始化种子数据提示。SEED_DEMO_DATA:是否创建演示账号和物资;开发默认1,生产镜像默认0。BOOTSTRAP_ADMIN_PASSWORD:空生产数据库首次启动时必填,长度须为 12–128 位;也可配置管理员用户名和显示名。SESSION_COOKIE_SECURE:生产默认1,仅通过 HTTPS 发送会话 Cookie;本地开发默认0。.env.example:环境变量示例文件,部署时可按需复制为.env或写入服务器环境。
- SQLite 部署只运行单个应用容器;多副本部署应先迁移到服务型数据库,并将初始化改为独立部署任务。
- 在 HTTPS 反向代理或 API 网关上对登录和注册接口设置按 IP/账号限速,降低撞库、批量注册和密码哈希 CPU 滥用风险。
- 定期备份挂载的
instance/目录,并在恢复演练后再升级应用镜像。
- 管理端:库存入库、分类维护、CSV 导入导出、借用审批、归还核销、低库存和维修状态看板。
- 用户端:物资目录检索、暂存箱批量申领、额度校验、申请撤回、归还申请、个人借用记录。
- 安全基础:密码哈希存储、登录态校验、管理员视图隔离、API 会话失效 JSON 响应。