# 益选便利店商品查询

## 概述
- 基于 FastAPI + SQLite 的轻量查询系统，适配手机和桌面
- 支持导入 Excel，条码为主键自动插入/更新（Upsert）
- 支持条码部分匹配（前缀/后缀/任意包含）与名称关键词搜索
- 内置扫码入口：支持浏览器原生条码识别与拍照识别兜底

## 本地运行
- 安装依赖：`python -m pip install fastapi "uvicorn[standard]" pandas openpyxl python-multipart`
- 启动服务：`python -m uvicorn app.main:app --host 0.0.0.0 --port 57777`
- 访问页面：`http://localhost:57777/`

## 导入
- 页面“导入Excel”选择文件并提交
- 后端解析`Sheet1`并映射列：`名称（必填）`、`进货价（必填）`、`销售价（必填）`、`条码`、可选`分类（必填）`

## 接口
- `POST /import` 表单上传`file`
- `GET /products/{barcode}` 精确条码查询
- `GET /products?q=关键词&limit=20&page=1&sort=name&order=asc` 列表查询
  - 当 `q` 为数字时：支持条码前缀、后缀与任意包含匹配；同时匹配名称包含
  - 当 `q` 为文本时：按名称包含匹配
- `GET /health` 健康检查

## 数据库
- SQLite 文件：`data/products.db`
- 表：`products(barcode primary key, name, purchase_price, sale_price, category, created_at, source_file)`
- 索引：`idx_products_name(name)`
 - 性能：启用 WAL 与适度同步，提升并发读取

## Docker（推荐部署）
- 构建并启动：`docker compose up --build -d`
- 端口映射：`57777:57777`（保持不变）
- 卷挂载：
  - `./data:/app/data`（SQLite 持久化）
  - `./static:/app/static:ro`（前端文件可直接更新，无需重建）
- 宝塔/Nginx（可选）：反代到 `http://127.0.0.1:57777` 并启用 HTTPS
- 详见《部署文档.md》

## 前端扫码
- 优先使用浏览器原生 `BarcodeDetector` 实时识别
- 非安全上下文或不支持时，自动切换为“拍照识别”方式
- 识别成功自动填充并触发查询

## 项目结构
- `app/` 后端 FastAPI
- `static/` 前端页面与脚本、样式
- `data/` 运行时生成的 SQLite 数据库
- `Dockerfile`、`docker-compose.yml` 部署配置
- `部署文档.md` 服务器部署说明

## 常见问题
- 无法唤起相机：请通过 HTTPS 域名访问或使用支持的浏览器；HTTP 下自动切换为拍照识别
- 构建缓存问题：使用 `docker compose build --no-cache && docker compose up -d`
- 中文命令行乱码：页面显示正常；确保浏览器为 UTF-8 编码
