去中心化的高校实验室闲置化学有机试剂共享/搜索平台。
graph TB
subgraph frontend["Flutter 移动端"]
PublishForm["发布表单<br/>手动输入"]
Search["搜索页"]
Profile["个人页"]
Nav["底部导航"]
Nav --> Search & PublishForm & Profile
PublishForm -->|"POST /api/v1/items"| Gin
end
subgraph backend["Go API 服务"]
Gin["Gin Router<br/>:8080"]
SearchH["搜索处理<br/>GET /api/v1/search"]
PubChem["PubChem 别名展开"]
Models["数据模型<br/>SPU / SKU / Item"]
Gin --> SearchH
Gin --> PubChem
SearchH --> Models
PubChem --> Models
end
subgraph storage["持久化"]
SQLite[("SQLite<br/>reagentx.db<br/>+ FTS5 全文索引")]
end
Search -->|"GET /api/v1/search?q="| Gin
Models --> SQLite
SQLite -->|"FTS5 MATCH"| SearchH
style frontend fill:#e3f2fd,stroke:#1565c0
style backend fill:#fff3e0,stroke:#e65100
style storage fill:#e8f5e9,stroke:#2e7d32
| 层 | 技术 |
|---|---|
| 后端 | Go 1.21+ / Gin / SQLite(modernc.org/sqlite,纯 Go 无 cgo) |
| 前端 | Flutter 3.44+ / Dart 3.12+ / Provider / GoRouter |
| 搜索 | SQLite FTS5 + PubChem API 别名展开 + CAS 自动归并 |
| 输入方式 | 手动表单(语音识别 TODO) |
- 发布时调 PubChem API 自动展开化学品别名(如
EDTA→ 30+ 个中英文别名) - 用户填写 CAS 号时,相同 CAS 自动归并到同一 SPU,跨中英文名互通
- 全文索引使用 SQLite FTS5,带触发器自动同步
- 支持语义标签推断(醇类、酸类、有机溶剂等)
docker compose up -d
# Go 后端 + Caddy HTTPS → :8080# Windows:一键启动 Go + Caddy HTTPS
.\backend\start-backend.ps1
# 或手动:
cd backend
go run . & # HTTP :8081
caddy reverse-proxy --from localhost:8080 --to localhost:8081 --disable-redirects # HTTPS :8080# 搜索示例(使用 Caddy HTTPS)
curl -k "https://localhost:8080/api/v1/search?q=EDTA"
curl "https://localhost:8080/api/v1/search?q=乙二胺四乙酸"cd frontend
flutter runcurl -X POST http://localhost:8080/api/v1/register \
-H "Content-Type: application/json" \
-d '{"teacher_name":"李伟","password":"111","members":["张三"]}'- 用户体系:课题负责人在「我的」页面注册/登录,成员加入课题组登录
- 搜索试剂:FTS5 全文检索 + PubChem 别名展开 + CAS 归并,按相关度排序
- 发布试剂:表单发布(名称、CAS、品牌、规格、存放位置、剩余量、照片)
- 个人中心:成员管理、密码修改、物品管理(删除/修改剩余量)
- 留言(我想要):对试剂留言,课题负责人可在留言箱查看并回复
- 检查更新:个人页「关于」区手动检查更新,通过 jsDelivr CDN 拉取版本信息
- 编译期配置:
--dart-define-from-file=config.json灵活切换后端地址(本地/内网/VPN) - 统一时间戳:试剂发布和修改时自动记录
updated_at,搜索卡片显示"上次更新:"
- 语音识别辅助输入(Flutter 端)
- 用户为已有 SPU 补充别名
- 消息推送 / 通知
- Flutter Web 支持(需条件导入 camera + 后端 CORS)
# 安装依赖
pkg install golang git
git clone https://github.com/Qxy0happy/ReagentX
# 一键启动(Go + Caddy)
cd ReagentX
bash termux-start.sh脚本会自动安装 Go 和 Caddy,启动 Go :8081 + Caddy HTTPS :8080。同 WiFi 下其他人用 https://<手机IP>:8080 即可访问。
手机装 Flutter APK 后设 config.json:
{"BASE_URL": "http://localhost:8081"}详细设计约束请参阅
AGENT.md。项目变更记录见MEMORY.md。