docs: 同步更新项目上下文和规则文档

- project.md:补充 AppConfig、FilterableColumnHeader、license/update/connectivity
  provider、批次追踪页面、GET /version 接口、并发安全规则、dev.sh stop 命令、
  scripts/.logs gitignore、表格 UI 规范(hover + 列头筛选 + 客户端筛选模式)
- CLAUDE.md:新增前端 URL 配置、平台判断、表格列头筛选、权限中间件、
  并发安全(FOR UPDATE)等强制规则

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-04-18 19:13:25 +08:00
parent 5a3907e3f9
commit f5b28dd09a
2 changed files with 144 additions and 6 deletions
+26
View File
@@ -186,3 +186,29 @@ security: 修复入库单多租户隔离漏洞
### Go 命令
- 所有 Go 命令前须确保 PATH`export PATH="/opt/homebrew/bin:$PATH"`
- 或直接使用 `sh scripts/dev.sh` 脚本(已内置 PATH
### 前端 URL 配置
- 所有后端 URL 必须通过 `AppConfig` 读取(`client/lib/core/config/app_config.dart`
- **禁止**在任何 provider / repository / widget 中硬编码 `localhost:8080` 或任何 IP/域名
- 使用:`AppConfig.apiBaseUrl``AppConfig.healthUrl``AppConfig.versionUrl`
### 前端平台判断
- 使用 `dart:io``Platform` 类前,必须先检查 `kIsWeb``import 'package:flutter/foundation.dart'`
- Web 平台不支持 `dart:io`,直接使用会在 Web 构建时崩溃
### 表格列头筛选
- 可筛选列使用 `FilterableColumnHeader`(来自 `widgets/multi_select_dropdown.dart`
- 不要在 toolbar 放独立的筛选按钮,筛选入口应内嵌在列头
- 列定义使用 `ColDef`,可隐藏列用 `ColumnToggleButton` 控制
### 权限中间件(已全局挂载)
- `middleware.ReadOnly()`:已挂载到主 `api` 路由组,只读用户(role=readonly)所有写操作自动返回 403
- `middleware.AdminOnly()`:挂载在 `/users` 路由组,仅管理员可管理用户
- **新增写操作路由**时,默认受 `ReadOnly()` 保护;若仅管理员可用,需加入 `AdminOnly()` 子组
### 并发安全(数据库操作)
- 在同一事务内读后写的操作,必须用 `FOR UPDATE` 锁行:
```go
tx.Set("gorm:query_option", "FOR UPDATE").Where(...).First(&model)
```
- 适用场景:单号生成(`number_rules`)、库存扣减(`inventories`)、任何 check-then-act 模式