系统总览
一句话理解
当前系统以 FastAPI + SQLite 作为事实源,前端负责业务操作和实时刷新,浏览器插件只负责把外部购物车批次桥接到 /cart-import,Agent skill、CLI、MCP、企业微信智能机器人和微信客服都通过后端 API 收口。
架构分层
- 展示层:frontend/src/pages 和
components负责表格、导入、设备和公告等交互,browser-extension 负责浏览器插件页面与桥接逻辑。 - 接口层:frontend/src/api/client.ts 封装全部
/api调用,app/api 提供路由、依赖注入和事件输出。 - 自动化入口层:Agent skill 和脚本通过
lsm_cli/访问系统,lsm_mcp/通过 CLI 子进程暴露受控工具,robot/处理企业微信智能机器人和微信客服消息。 - 领域层:app/models 定义业务对象,app/services 负责清洗、拼音、内码、匹配、缓存、实验步骤解析和 SSE 广播,app/api/reagent_orders_workflow.py 负责试剂工作流。
- 基础设施层:app/database.py 与 app/db_bootstrap 初始化 SQLite,app/core/auth.py 和
redis.py处理认证与会话,docker与nginx处理部署边界。
请求与事件路径
三个子系统协作细节
frontend/:App.tsx负责路由守卫和页面加载,useSSE.ts连接/api/events?rooms=...,useListSSE.ts为列表页维护房间切换和 stale 标记。app/:app/main.py 负责中间件、生命周期和路由注入;inventory.py、reagent_orders.py、reagent_orders_workflow.py、consumable_orders.py、procedure_inventory_search.py、cart_sync.py和events.py分别覆盖库存、订单、实验步骤查库存、导入和事件;app/services 提供清洗、缓存、外部化学信息解析和 SSE 支撑。browser-extension/:构建期 manifest 声明权限,content/script.js抓取购物车,content/import-bridge.js把数据同步到页面缓存;CartImport页面逐条调用标准试剂或耗材订单创建接口。lsm_cli/、Agent skill、lsm_mcp/和robot/:按受控命令面处理脚本、MCP、企业微信智能机器人和微信客服入口,写操作仍由后端权限控制。
关键边界与安全
- 所有写操作都通过
/api,并保留CurrentUser、require_admin和UserRole校验。 - app/main.py 负责安全头和
/static/缓存策略。 - app/services/api_utils.py 提供列表缓存,列表写操作需要配合失效逻辑使用。
- Redis 主要用于 SSE、登录限流和会话黑名单,不可用时系统仍保留 SQLite 读取能力。
- SSE 的
seq由 app/services/sse_manager.py 维护,前端用序号检查重复和缺失事件。 - Agent skill 和 MCP 不直接访问数据库,也不开放 CLI 未显式暴露的 API。
- LLM 与 PubChem 连接参数由后端运行环境提供,Sentry 前端配置在构建时注入;服务端 API Key 不进入前端产物。
设计重点
- 试剂和耗材是两条不同工作流,试剂会继续流转到库存,耗材在完成后结束。
- SQLite 的连接行为在 app/database.py 中初始化,索引、FTS 和 schema 校验在 app/db_bootstrap 中维护。
- SSE 承担增量通知职责;前端仍需通过 HTTP 查询获取权威数据。
- 浏览器插件只做采集和桥接,数据清洗和订单创建仍由后端完成。
- 企业微信入口只作为受控消息入口,查询和写入最终仍走 MCP、CLI 和后端 API。
预期感知
- 页面切换与筛选应保持顺畅,列表页主要依赖分页、拼音和 FTS。
- 审计链路应能追踪审批、入库、借用和完成等关键动作。
- SSE 应只承担实时刷新,不替代主查询接口。
- 插件导入的最终数据链路应回到标准订单创建接口;app/api/cart_sync.py 提供匹配分析接口。
面向开发者的关键校验点
- 生产模式下确认
/docs、/redoc和/openapi.json的开放策略符合预期。 - 试剂必须走完整的审批、到货和入库链路,耗材完成后不应写入库存。
- 修改库存或订单后,应能看到对应 SSE 房间事件。
- 列表写操作后要检查缓存失效和前端 stale 提示。
- 浏览器插件只能采集和桥接,导入页主链路应逐条调用标准订单创建接口。
实现边界说明
- 本地联调由前端
VITE_API_URL指向后端 API,不依赖 Vite dev proxy。 - 常用货架前端路径是
/common-shelf,接口路径是/api/common-shelf*。 - 数据库 FTS 覆盖
inventory、reagent_order、consumable_order、users、chemical_name_map和log_timeline。 - 结构检索默认开启,可关闭;启用后由
chemAPI、结构缓存表和 RDKit 索引共同工作。 - Redis 承担增强层职责;不可用时系统仍保持 SQLite 可用。
参考代码
- app/api/cart_sync.py
- app/api/chem.py
- app/api/reagent_orders_workflow.py
- app/core/auth.py
- app/core/redis.py
- app/database.py
- app/db_bootstrap
- app/main.py
- app/services
- app/services/api_utils.py
- app/services/rate_limit.py
- app/services/sse_manager.py
- app/services/sse_redis.py
- browser-extension/content/import-bridge.js
- docker/nginx/default.conf
- frontend/src/api/client.ts
- frontend/src/App.tsx
- lsm_cli
- lsm_mcp
- robot