- 在 scanner.js 中为用户操作添加了 toast 通知。 - 更新 box.html 以包含额外的导航选项和改进的布局。 - 增强 edit.html,提供更清晰的说明和改进表单的可访问性。 - 修改了 error.html,以提供有关输入错误的用户指导。 - 改进了 index.html,以优化导航并添加了关键指标显示。 - 增强了 scan.html,优化了搜索输入和操作按钮。 - 引入了 stats.html,用于详细的库存统计和趋势。 - 创建了 types.html,用于分类概述库存类型。
300 lines
8.4 KiB
Markdown
300 lines
8.4 KiB
Markdown
# 电子元件库存管理系统 v1.0
|
||
|
||
一个基于 `Flask + SQLite` 的轻量库存系统,适合先本地开发,后续部署到宝塔服务器。
|
||
|
||
当前支持三类容器:
|
||
|
||
- `28格小盒大盒`:常见 4 连排小盒(竖向 7 排)。
|
||
- `14格中盒大盒`:中等盒子,无固定摆放图。
|
||
- `袋装清单`:防静电袋列表模式(每行一个袋位,支持批量新增)。
|
||
- `袋装清单` 为固定容器(系统内置一个大盒),不需要新增/删除盒子。
|
||
|
||
v1.1 新增能力:
|
||
|
||
- 支持盒子改名和删除。
|
||
- 新增盒子时可设置 `前缀 + 起始序号`,内部编号自动递增。
|
||
- 盒子名称自动生成:`基础名称 + 编号范围`,重名自动加 `#2/#3`。
|
||
- 首页可直接看到每个盒子的编号范围(如 `A1-A28`)。
|
||
- 首页新增概览按钮:快速查看已启用的编号与名称。
|
||
- 编辑页支持 `启用/停用`。
|
||
|
||
## 1. 项目结构
|
||
|
||
```text
|
||
inventory/
|
||
├── app.py
|
||
├── requirements.txt
|
||
├── init_db.py
|
||
├── data/
|
||
│ └── inventory.db # 首次初始化后生成
|
||
├── templates/
|
||
│ ├── index.html
|
||
│ ├── box.html
|
||
│ ├── edit.html
|
||
│ ├── scan.html
|
||
│ └── stats.html
|
||
└── static/
|
||
├── css/
|
||
│ └── style.css
|
||
└── js/
|
||
└── scanner.js
|
||
```
|
||
|
||
## 2. 本地运行
|
||
|
||
### 2.1 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 2.2 初始化数据库
|
||
|
||
```bash
|
||
python init_db.py
|
||
```
|
||
|
||
初始化后会生成:`data/inventory.db`
|
||
|
||
### 2.3 启动服务
|
||
|
||
```bash
|
||
python app.py
|
||
```
|
||
|
||
默认访问:`http://127.0.0.1:5000`
|
||
|
||
## 3. 页面说明
|
||
|
||
### 3.1 首页 `/`
|
||
|
||
- 首页已改为入口跳转到 `分类总览` 页面。
|
||
|
||
### 3.1.1 分类总览 `/types`
|
||
|
||
- 展示三类独立界面入口:`28格小盒大盒`、`14格中盒大盒`、`袋装清单`。
|
||
- 每类入口显示当前容器数量,点击进入单独分类页面。
|
||
|
||
### 3.1.2 分类独立页 `/type/<box_type>`
|
||
|
||
- 每个分类使用独立页面,避免容器变多后的长页翻找。
|
||
- 页面内支持新增、设置、删除,并在操作后停留在当前分类页。
|
||
|
||
### 3.2 盒子详情 `/box/<box_id>`
|
||
|
||
- `28格/14格`:格子视图,点格子进入编辑。
|
||
- `袋装清单`:表格视图,支持单条新增和批量新增。
|
||
- `袋装清单` 仅使用编号前缀(如 `BAG`),不设置编号范围。
|
||
- `28格/14格` 支持快速入库:多行粘贴后自动分配空位。
|
||
- 支持按当前盒子导出打标 CSV(仅导出启用记录),可用于热敏打标机导入。
|
||
- 打标 CSV 列名为中英双语格式(如 `料号(part_no)`、`打标文本(label_text)`),便于直接识别。
|
||
|
||
### 3.3 编辑页 `/edit/<box_id>/<slot>`
|
||
|
||
- 编辑料号、名称、规格、数量、位置备注、备注。
|
||
- 支持勾选启用,或通过按钮启用/停用。
|
||
- 可删除当前格子记录。
|
||
|
||
### 3.4 扫码/搜索 `/scan`
|
||
|
||
- 可按料号或名称搜索。
|
||
- 支持扫码枪输入后回车触发搜索。
|
||
|
||
### 3.5 统计页 `/stats`
|
||
|
||
- 独立统计页,仅展示核心指标:`库存总量 / 分类占比 / 变动趋势`。
|
||
- 支持 `7天` 与 `30天` 视图切换:`/stats?days=7`、`/stats?days=30`。
|
||
- 支持分类筛选:`/stats?days=30&box_type=small_28`(可选值:`small_28`、`medium_14`、`bag`、`all`)。
|
||
- 趋势图基于库存变动日志实时计算,来源包括:新增、快速入库、启用/停用、删除。
|
||
- 说明:升级前的历史操作不会自动回溯写入日志,趋势从启用该版本后开始逐步真实化。
|
||
- 新增最近操作时间线(最新 20 条),便于追踪库存变化来源。
|
||
- 筛选到单一分类后,指标会切换为更有意义的数据:`分类库存占比 / 周期操作次数 / 活跃天数 / 分类内元件Top`。
|
||
- 支持趋势数据导出 CSV:`/stats/export?days=7&box_type=all`(包含 `daily_delta` 日增减列)。
|
||
- 支持清除统计日志(当前筛选或全部),仅影响统计与趋势,不影响库存数据本体。
|
||
|
||
## 4. 袋装批量新增格式
|
||
|
||
在袋装清单页面的批量输入框里,每行一条,可用英文逗号或 Tab 分隔:
|
||
|
||
```text
|
||
料号, 名称, 数量, 规格, 位置备注, 备注
|
||
```
|
||
|
||
示例:
|
||
|
||
```text
|
||
10K-0603, 贴片电阻10K, 500, 0603, A袋, 常用
|
||
100nF-0603, 电容100nF, 300, 0603, B袋, X7R
|
||
```
|
||
|
||
说明:
|
||
|
||
- `料号`、`名称` 必填。
|
||
- `数量` 需为大于等于 0 的整数(留空按 0)。
|
||
- 无效行会跳过并提示。
|
||
|
||
## 5. 快速入库(28格/14格)
|
||
|
||
在盒子页面使用“快速入库”,每行一条:
|
||
|
||
```text
|
||
料号, 名称, 数量, 规格, 位置备注, 备注
|
||
```
|
||
|
||
规则:
|
||
|
||
- 自动放入当前盒子的空位。
|
||
- 同料号已存在时自动累加数量(不重复占位)。
|
||
- 格子满了会跳过并提示具体行号。
|
||
|
||
## 6. 自动编号规则(新增)
|
||
|
||
新增盒子时只需填写:
|
||
|
||
- `前缀`:如 `A`、`B`、`C`、`BAG`
|
||
- `起始序号`:如 `1`
|
||
|
||
系统自动生成内部编号:
|
||
|
||
- 第 1 位:`前缀 + 起始序号`
|
||
- 第 N 位:`前缀 + (起始序号 + N - 1)`
|
||
|
||
示例:
|
||
|
||
- 前缀 `A`、起始 `1`、容量 28 -> `A1-A28`
|
||
- 前缀 `B`、起始 `100`、容量 14 -> `B100-B113`
|
||
|
||
盒子名生成示例:
|
||
|
||
- 基础名称 `电阻盒` + 范围 `A1-A28` -> `电阻盒 A1-A28`
|
||
- 若发生重名会自动变为:`电阻盒 A1-A28 #2`
|
||
|
||
## 7. 元器件命名建议(简洁版)
|
||
|
||
为避免命名过长又保证可检索,建议:
|
||
|
||
- `料号(part_no)`:优先写厂家/采购料号,保持唯一。
|
||
- `名称(name)`:`品类 + 关键值 + 封装`,如 `电阻10K 0603`、`电容100nF 0603`。
|
||
- `规格(specification)`:补充精度/耐压/温漂等必要信息,如 `1%`、`50V X7R`。
|
||
|
||
推荐格式:
|
||
|
||
```text
|
||
名称: 电阻10K 0603
|
||
规格: 1%
|
||
```
|
||
|
||
```text
|
||
名称: 电容100nF 0603
|
||
规格: 50V X7R
|
||
```
|
||
|
||
### 7.1 轻量入库规范(推荐)
|
||
|
||
目标:字段尽量少,但保证后续能搜索、能区分、能补货。
|
||
|
||
最少必填(3项):
|
||
|
||
- `料号(part_no)`:优先填厂家型号(如 `STM32F103C8T6`)。
|
||
- `名称(name)`:`品类 + 型号/关键值`(如 `MCU STM32F103C8T6`)。
|
||
- `数量(quantity)`:当前实际库存数量。
|
||
|
||
建议选填(2-3项):
|
||
|
||
- `规格(specification)`:只写 2-4 个关键参数(如 `Cortex-M3 / 64KB Flash / LQFP-48`)。
|
||
- `位置备注(location)`:盒位或袋位(如 `A12`、`BAG4`)。
|
||
- `备注(note)`:来源或追溯信息(如 `LCSC item 9243` 或商品链接)。
|
||
|
||
不建议录入(避免复杂且易过期):
|
||
|
||
- 实时单价、促销价、交期、商城库存等动态信息。
|
||
|
||
推荐录入模板:
|
||
|
||
```text
|
||
料号: <厂家型号>
|
||
名称: <品类 + 型号/关键值>
|
||
规格: <封装 + 关键参数>
|
||
数量: <整数>
|
||
位置备注: <盒位/袋位>
|
||
备注: <来源编号或链接>
|
||
```
|
||
|
||
示例:
|
||
|
||
```text
|
||
料号: STM32F103C8T6
|
||
名称: MCU STM32F103C8T6
|
||
规格: Cortex-M3 / 64KB Flash / LQFP-48
|
||
数量: 10
|
||
位置备注: BAG4
|
||
备注: LCSC item 9243
|
||
```
|
||
|
||
## 8. 数据库说明
|
||
|
||
- 使用 SQLite,文件路径:`data/inventory.db`
|
||
- 库存变动日志表:`inventory_events`(用于统计页趋势计算)
|
||
- `inventory_events` 主要字段:`box_type`、`part_no`、`event_type`、`delta`、`created_at`
|
||
- 首次发布执行一次 `python init_db.py`
|
||
- 后续通常不需要重复初始化
|
||
|
||
## 9. 服务器部署(宝塔)
|
||
|
||
建议流程:
|
||
|
||
1. 上传代码或 `git clone` 到服务器。
|
||
2. 创建并启用虚拟环境。
|
||
3. `pip install -r requirements.txt`
|
||
4. `python init_db.py`
|
||
5. 用 Gunicorn 启动:`app:app`
|
||
6. 宝塔/Nginx 反向代理到 Gunicorn 端口
|
||
7. 域名解析 + SSL
|
||
|
||
建议 Gunicorn 仅监听内网:`127.0.0.1:5000`
|
||
|
||
## 10. 日常发布流程
|
||
|
||
本地开发后:
|
||
|
||
```bash
|
||
git add .
|
||
git commit -m "feat: xxx"
|
||
git push origin main
|
||
```
|
||
|
||
服务器更新:
|
||
|
||
```bash
|
||
cd /www/wwwroot/inventory
|
||
git pull origin main
|
||
source venv/bin/activate
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
最后在宝塔里重启 Python 项目。
|
||
|
||
## 11. 备份建议
|
||
|
||
重点备份:`data/inventory.db`
|
||
|
||
可按天备份,例如:
|
||
|
||
```bash
|
||
cp /www/wwwroot/inventory/data/inventory.db /www/backup/inventory_$(date +%F).db
|
||
```
|
||
|
||
## 12. 常见问题
|
||
|
||
### Q1: VS Code 提示无法解析 `flask` 导入
|
||
|
||
通常是编辑器没选到正确虚拟环境,不代表代码不能运行。切换解释器到项目 venv 即可。
|
||
|
||
### Q2: 为什么线上不能用 `python app.py` 长期跑
|
||
|
||
`python app.py` 是开发模式。生产请使用 Gunicorn(或其他 WSGI)并由宝塔托管。
|
||
|
||
### Q3: 本地和服务器数据库要实时同步吗
|
||
|
||
不建议 SQLite 双向实时同步。建议以服务器库为主,本地用于测试。
|