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:
@@ -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 模式
|
||||
|
||||
Reference in New Issue
Block a user