refactor: 优化代码结构并修复类型问题
- 移除未使用的TabPane组件 - 修复类型定义和导入方式 - 优化mock数据源的环境变量判断逻辑 - 更新文档结构并归档旧文件 - 添加新的UI组件和Memo组件 - 调整API路径和响应处理
This commit is contained in:
419
docs/RULES/TERMINOLOGY.md
Normal file
419
docs/RULES/TERMINOLOGY.md
Normal file
@@ -0,0 +1,419 @@
|
||||
# 术语标准
|
||||
|
||||
> **定位**:本文档定义 Crawlful Hub 项目全文档体系的标准术语,确保跨文档语义一致性。
|
||||
> **更新日期**: 2026-03-23
|
||||
> **适用范围**: 所有项目文档、代码注释、API 接口
|
||||
|
||||
---
|
||||
|
||||
## 1. 业务类型术语 (Business Type)
|
||||
|
||||
### 1.1 标准定义
|
||||
|
||||
| 标准术语 | 英文全称 | 使用场景 | 禁止使用 |
|
||||
|---------|---------|---------|---------|
|
||||
| **TOC** | To Consumer | 零售业务、B2C电商 | B2C(仅技术文档可用)、零售 |
|
||||
| **TOB** | To Business | 企业业务、B2B贸易 | B2B(仅技术文档可用)、企业 |
|
||||
|
||||
### 1.2 使用规范
|
||||
|
||||
```typescript
|
||||
// ✅ 正确用法
|
||||
businessType: 'TOC' | 'TOB'
|
||||
|
||||
// ❌ 错误用法
|
||||
businessType: 'B2C' | 'B2B'
|
||||
businessType: '零售' | '企业'
|
||||
```
|
||||
|
||||
### 1.3 例外情况
|
||||
- 对外商务文档中可使用 `B2B/B2C` 以便理解
|
||||
- 代码内部枚举值使用 `TOC/TOB`
|
||||
|
||||
---
|
||||
|
||||
## 2. 业务模块术语 (Business Modules)
|
||||
|
||||
### 2.1 标准模块命名
|
||||
|
||||
| 标准术语 | 英文缩写 | 中文全称 | 使用场景 | 禁止使用 |
|
||||
|---------|---------|---------|---------|---------|
|
||||
| **商品管理** | PIM | Product Information Management | 商品主数据、SKU管理 | 产品管理、货品管理 |
|
||||
| **订单管理** | OMS | Order Management System | 订单履约、售后处理 | 订单系统、交易管理 |
|
||||
| **库存管理** | WMS | Warehouse Management System | 仓储、库存、补货 | 仓储管理、存货管理 |
|
||||
| **财务管理** | FIN | Financial Management | 对账、结算、利润 | 财务系统、资金系统 |
|
||||
| **营销管理** | MKT | Marketing Management | 广告、投放、推广 | 推广管理、市场管理 |
|
||||
| **供应链管理** | SCM | Supply Chain Management | 供应商、采购、补货 | 供应管理、采购管理 |
|
||||
| **客户管理** | CRM | Customer Relationship Management | 客户、用户、资产 | 用户管理、会员管理 |
|
||||
|
||||
### 2.2 模块引用规范
|
||||
|
||||
```markdown
|
||||
<!-- ✅ 正确用法 -->
|
||||
## 商品管理 (PIM)
|
||||
订单管理 (OMS) 模块负责...
|
||||
|
||||
<!-- ❌ 错误用法 -->
|
||||
## 产品管理
|
||||
OMS系统负责...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 系统组件术语 (System Components)
|
||||
|
||||
### 3.1 核心组件命名
|
||||
|
||||
| 标准术语 | 英文名称 | 定义 | 禁止使用 |
|
||||
|---------|---------|------|---------|
|
||||
| **前端控制台** | Frontend Console | 用户操作界面,基于 UmiJS + Ant Design | Console、前端、dashboard、中控台 |
|
||||
| **后端服务** | Backend Service | 业务逻辑处理层,Node.js + TypeScript | Hub、服务端、API服务 |
|
||||
| **浏览器插件** | Browser Extension | 数据采集与自动化执行插件 | Plugin、插件、扩展程序 |
|
||||
| **运营代理** | Operation Agent | 轻量化守护进程,执行采集和自动化任务 | Agent、运营端、执行器 |
|
||||
| **系统编排器** | System Orchestrator | 全局决策与资源分配中心 | 系统大脑、调度中心 |
|
||||
|
||||
### 3.2 组件引用规范
|
||||
|
||||
```markdown
|
||||
<!-- ✅ 正确用法 -->
|
||||
前端控制台通过 API 与后端服务通信
|
||||
浏览器插件负责数据采集
|
||||
|
||||
<!-- ❌ 错误用法 -->
|
||||
Console 通过 API 与 Hub 通信
|
||||
Plugin 负责数据采集
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 状态机术语 (State Machine)
|
||||
|
||||
### 4.1 状态命名规范
|
||||
|
||||
所有状态值必须使用 **大写蛇形命名法 (UPPER_SNAKE_CASE)**
|
||||
|
||||
| 状态类型 | 标准值 | 说明 |
|
||||
|---------|-------|------|
|
||||
| **初始状态** | `PENDING` | 待处理 |
|
||||
| **审核状态** | `PENDING_REVIEW` | 待审核 |
|
||||
| **执行状态** | `IN_PROGRESS` | 执行中 |
|
||||
| **成功状态** | `COMPLETED` / `SUCCESS` | 已完成 |
|
||||
| **失败状态** | `FAILED` / `REJECTED` | 失败/拒绝 |
|
||||
| **活跃状态** | `ACTIVE` | 活跃/启用 |
|
||||
| **非活跃状态** | `INACTIVE` | 非活跃/停用 |
|
||||
|
||||
### 4.2 标准状态流转
|
||||
|
||||
```
|
||||
// 订单状态机
|
||||
PENDING → CONFIRMED → PROCESSING → SHIPPED → DELIVERED → COMPLETED
|
||||
|
||||
// 审核状态机
|
||||
SUBMITTED → PENDING_REVIEW → APPROVED/REJECTED
|
||||
|
||||
// 任务状态机
|
||||
PENDING → RUNNING → SUCCESS/FAILED
|
||||
```
|
||||
|
||||
### 4.3 状态使用规范
|
||||
|
||||
```typescript
|
||||
// ✅ 正确用法
|
||||
status: 'PENDING_REVIEW' | 'EXECUTED' | 'REJECTED'
|
||||
|
||||
// ❌ 错误用法
|
||||
status: 'pending_review' | 'executed' | 'rejected'
|
||||
status: '待审核' | '已执行' | '已拒绝'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 角色与权限术语 (Roles & Permissions)
|
||||
|
||||
### 5.1 标准角色定义
|
||||
|
||||
| 标准术语 | 英文全称 | 职责描述 | 禁止使用 |
|
||||
|---------|---------|---------|---------|
|
||||
| **ADMIN** | Administrator | 系统管理员,全权 | Admin、管理员 |
|
||||
| **MANAGER** | Manager | 运营主管,审核中低风险操作 | Manager、主管 |
|
||||
| **OPERATOR** | Operator | 运营专员,执行日常操作 | Operator、操作员 |
|
||||
| **FINANCE** | Finance Manager | 财务主管,审核财务操作 | Finance、财务 |
|
||||
| **SOURCING** | Sourcing Specialist | 采购专家,管理供应商 | Sourcing、采购 |
|
||||
| **LOGISTICS** | Logistics Specialist | 物流专家,管理仓储物流 | Logistics、物流 |
|
||||
| **ANALYST** | Data Analyst | 数据分析师,查看报表 | Analyst、分析师 |
|
||||
|
||||
### 5.2 角色使用规范
|
||||
|
||||
```typescript
|
||||
// ✅ 正确用法
|
||||
role: 'ADMIN' | 'MANAGER' | 'OPERATOR'
|
||||
minReviewerRole: 'OPERATOR' | 'MANAGER' | 'FINANCE'
|
||||
|
||||
// ❌ 错误用法
|
||||
role: 'admin' | 'manager' | 'operator'
|
||||
role: '管理员' | '主管' | '操作员'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 追踪字段术语 (Tracking Fields)
|
||||
|
||||
### 6.1 五元组标准命名
|
||||
|
||||
| 标准字段名 | 数据类型 | 说明 | 禁止使用 |
|
||||
|-----------|---------|------|---------|
|
||||
| **tenantId** | string | 租户 ID,业务隔离 | tenant_id, tenantID, 租户ID |
|
||||
| **shopId** | string | 店铺 ID,平台/店铺隔离 | shop_id, shopID, 店铺ID |
|
||||
| **taskId** | string | 任务 ID,任务/规则触发归档 | task_id, taskID, 任务ID |
|
||||
| **traceId** | string | 链路追踪 ID,全链路唯一 | trace_id, traceID, 追踪ID |
|
||||
| **businessType** | 'TOC' \| 'TOB' | 业务类型 | business_type, type |
|
||||
|
||||
### 6.2 字段使用规范
|
||||
|
||||
```typescript
|
||||
// ✅ 正确用法
|
||||
interface TrackingContext {
|
||||
tenantId: string;
|
||||
shopId: string;
|
||||
taskId: string;
|
||||
traceId: string;
|
||||
businessType: 'TOC' | 'TOB';
|
||||
}
|
||||
|
||||
// ❌ 错误用法
|
||||
interface TrackingContext {
|
||||
tenant_id: string;
|
||||
shop_id: string;
|
||||
task_id: string;
|
||||
trace_id: string;
|
||||
business_type: string;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 任务标识术语 (Task Identification)
|
||||
|
||||
### 7.1 任务 ID 格式
|
||||
|
||||
标准格式:`[模块]-[子模块][序号]`
|
||||
|
||||
| 模块代码 | 含义 | 子模块代码 | 含义 |
|
||||
|---------|------|-----------|------|
|
||||
| **FE** | Frontend (前端) | P | Product (商品) |
|
||||
| **BE** | Backend (后端) | O | Order (订单) |
|
||||
| **PL** | Plugin (插件) | F | Finance (财务) |
|
||||
| **AI** | AI (人工智能) | I | Inventory (库存) |
|
||||
| **DT** | Data (数据) | C | Collection (采集) |
|
||||
| **OP** | Operation (运维) | A | Advertisement (广告) |
|
||||
|
||||
### 7.2 任务 ID 示例
|
||||
|
||||
```
|
||||
FE-P001 → 前端商品模块任务001
|
||||
BE-O005 → 后端订单模块任务005
|
||||
PL-C002 → 插件采集模块任务002
|
||||
AI-A001 → AI广告模块任务001
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 技术术语 (Technical Terms)
|
||||
|
||||
### 8.1 架构术语
|
||||
|
||||
| 标准术语 | 说明 | 禁止使用 |
|
||||
|---------|------|---------|
|
||||
| **Service** | 服务层,业务逻辑集中地 | 服务、Manager、Helper |
|
||||
| **Repository** | 数据访问层 | DAO、Mapper、存储层 |
|
||||
| **Controller** | 控制器层,处理HTTP请求 | 控制层、接口层 |
|
||||
| **Domain** | 领域层,核心业务实体 | 领域模型、实体层 |
|
||||
| **Event Bus** | 事件总线,异步通信机制 | 消息总线、事件中心 |
|
||||
|
||||
### 8.2 数据库术语
|
||||
|
||||
| 标准术语 | 说明 | 禁止使用 |
|
||||
|---------|------|---------|
|
||||
| **表前缀** | `cf_` (Crawlful) | 无前缀、其他前缀 |
|
||||
| **金额字段** | `decimal(10,2)` | float、double |
|
||||
| **JSON 字段** | 序列化存储,出库解析 | text、varchar |
|
||||
|
||||
---
|
||||
|
||||
## 9. 财务与利润术语 (Financial Terms)
|
||||
|
||||
### 9.1 利润计算术语
|
||||
|
||||
| 标准术语 | 定义 | 计算公式 |
|
||||
|---------|------|---------|
|
||||
| **净利润** | 扣除所有成本后的利润 | 售价 - 采购 - 平台费 - 物流 - 税费 - 汇率对冲 - 售后损耗 - 广告摊销 |
|
||||
| **利润率** | 净利润占售价的比例 | 净利润 / 售价 × 100% |
|
||||
| **ROI** | 投资回报率 | (收益 - 成本) / 成本 × 100% |
|
||||
| **ROAS** | 广告支出回报率 | 广告带来的收入 / 广告支出 |
|
||||
|
||||
### 9.2 利润红线
|
||||
|
||||
| 业务类型 | 利润率阈值 | 处理方式 |
|
||||
|---------|-----------|---------|
|
||||
| **TOC** | < 20% | 触发风控预警 |
|
||||
| **TOB** | < 15% | 禁止报价 |
|
||||
|
||||
---
|
||||
|
||||
## 10. 文档格式术语 (Documentation Format)
|
||||
|
||||
### 10.1 文档状态标记
|
||||
|
||||
| 标记 | 含义 | 使用场景 |
|
||||
|-----|------|---------|
|
||||
| ⏳ | pending | 待办 |
|
||||
| 🔒 | claimed | 已认领 |
|
||||
| 🚧 | in_progress | 进行中 |
|
||||
| ✅ | completed | 已完成 |
|
||||
| ❌ | blocked | 阻塞 |
|
||||
|
||||
### 10.2 优先级标记
|
||||
|
||||
| 标记 | 含义 | 说明 |
|
||||
|-----|------|------|
|
||||
| **P0** | Critical | 阻塞性任务,必须立即处理 |
|
||||
| **P1** | High | 高优先级,影响核心功能 |
|
||||
| **P2** | Medium | 中优先级,优化类任务 |
|
||||
| **P3** | Low | 低优先级,可延后处理 |
|
||||
|
||||
---
|
||||
|
||||
## 11. 术语替换速查表 (Quick Reference)
|
||||
|
||||
### 11.1 必须替换的旧术语
|
||||
|
||||
| 旧术语 | 新术语 | 替换范围 |
|
||||
|-------|-------|---------|
|
||||
| B2C | TOC | 所有代码、配置、数据库 |
|
||||
| B2B | TOB | 所有代码、配置、数据库 |
|
||||
| 产品管理 | 商品管理 | 所有文档、代码 |
|
||||
| Console | 前端控制台 | 所有文档 |
|
||||
| Hub | 后端服务 | 所有文档 |
|
||||
| Plugin | 浏览器插件 | 所有文档 |
|
||||
| pending (状态) | PENDING | 状态机定义 |
|
||||
| active (状态) | ACTIVE | 状态机定义 |
|
||||
| tenant_id | tenantId | 所有代码 |
|
||||
| shop_id | shopId | 所有代码 |
|
||||
| Admin | ADMIN | 角色定义 |
|
||||
| Manager | MANAGER | 角色定义 |
|
||||
|
||||
---
|
||||
|
||||
## 12. 术语审核清单 (Review Checklist)
|
||||
|
||||
在提交文档或代码前,请检查以下项目:
|
||||
|
||||
- [ ] 业务类型使用 `TOC/TOB` 而非 `B2B/B2C`
|
||||
- [ ] 模块名称使用标准术语(商品管理、订单管理等)
|
||||
- [ ] 系统组件使用标准术语(前端控制台、后端服务等)
|
||||
- [ ] 状态值使用大写蛇形命名(`PENDING_REVIEW`)
|
||||
- [ ] 角色使用大写(`ADMIN`, `MANAGER`)
|
||||
- [ ] 追踪字段使用驼峰命名(`tenantId`, `shopId`)
|
||||
- [ ] 任务 ID 符合标准格式(`FE-P001`)
|
||||
- [ ] 表名使用 `cf_` 前缀
|
||||
- [ ] 金额字段使用 `decimal(10,2)`
|
||||
|
||||
---
|
||||
|
||||
## 13. 商品管理术语 (Product Management Terms)
|
||||
|
||||
### 13.1 商品层级术语
|
||||
|
||||
| 标准术语 | 英文 | 定义 | 禁止使用 |
|
||||
|---------|------|------|---------|
|
||||
| **SPU** | Standard Product Unit | 标准产品单元,商品的最小聚合单位 | 产品、商品主数据 |
|
||||
| **SKU** | Stock Keeping Unit | 库存单元,SPU的变体 | 变体、规格 |
|
||||
| **Listing** | Platform Listing | 平台商品,SKU在平台的刊登实例 | 平台商品、刊登商品 |
|
||||
|
||||
### 13.2 商品操作术语
|
||||
|
||||
| 标准术语 | 英文 | 定义 | 禁止使用 |
|
||||
|---------|------|------|---------|
|
||||
| **商品映射** | Product Mapping | 绑定系统SKU与平台商品的关系 | 商品绑定、关联 |
|
||||
| **商品刊登** | Product Listing | 创建新商品并发布到平台 | 商品发布、上架 |
|
||||
|
||||
**核心判断公式**:
|
||||
> 这个动作有没有在平台创建新商品?
|
||||
> - 有 → 刊登
|
||||
> - 没有 → 映射
|
||||
|
||||
**业务场景对比**:
|
||||
|
||||
| 场景 | 操作 | 用途 |
|
||||
|------|------|------|
|
||||
| 平台已有商品需要统一管理 | 映射 | 统一库存、利润分析、AI调价 |
|
||||
| 新品上架、批量铺货 | 刊登 | 上新、自动铺货、跨平台分发 |
|
||||
|
||||
### 13.3 价格体系术语
|
||||
|
||||
| 标准术语 | 英文 | 定义 | 禁止使用 |
|
||||
|---------|------|------|---------|
|
||||
| **基准价** | Base Price | SKU层的参考价格锚点 | 成本价、原价 |
|
||||
| **策略价** | Strategy Price | 价格规则计算后的价格 | 规则价、计算价 |
|
||||
| **最终价** | Final Price | Listing层的实际销售价格 | 售价、成交价 |
|
||||
|
||||
**三层价格体系**:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 1️⃣ 基准价层(Base Price Layer) │
|
||||
│ SKU.base_price │
|
||||
│ 用途:统一锚点、人工理解 │
|
||||
└──────────────┬──────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 2️⃣ 策略层(Strategy Layer) │
|
||||
│ PriceStrategy: │
|
||||
│ - scope: 平台/店铺/Listing │
|
||||
│ - type: multiplier/fixed/dynamic │
|
||||
│ 用途:规则定义、批量控制 │
|
||||
└──────────────┬──────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 3️⃣ Listing层(Final Price Layer) │
|
||||
│ PlatformListing.price │
|
||||
│ 用途:真正赚钱的地方 │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**最终价格计算公式**:
|
||||
```
|
||||
最终价格 = override_price || strategy计算结果 || AI计算结果
|
||||
```
|
||||
|
||||
### 13.4 组织权限术语
|
||||
|
||||
| 标准术语 | 英文 | 定义 | 禁止使用 |
|
||||
|---------|------|------|---------|
|
||||
| **组织层级** | Organization Hierarchy | 公司/部门/团队的树形结构 | 组织架构、部门结构 |
|
||||
| **数据范围** | Data Scope | 用户可访问的数据边界 | 数据权限、可见范围 |
|
||||
| **店铺授权** | Shop Authorization | 用户对店铺的操作权限 | 店铺权限、店铺绑定 |
|
||||
|
||||
**数据范围类型**:
|
||||
|
||||
| 范围类型 | 英文 | 说明 |
|
||||
|---------|------|------|
|
||||
| **SELF** | Self | 只看自己 |
|
||||
| **TEAM** | Team | 看自己组 |
|
||||
| **DEPT** | Department | 看自己部门 |
|
||||
| **ORG** | Organization | 看整个公司 |
|
||||
| **ALL** | All | 全平台(超管) |
|
||||
|
||||
### 13.5 授权类型术语
|
||||
|
||||
| 标准术语 | 适用平台 | 存储内容 |
|
||||
|---------|----------|----------|
|
||||
| **API授权** | Shopify、Amazon | access_token, refresh_token, expire_time |
|
||||
| **Agent授权** | TikTok、Shopee | cookies, proxy, device_id, user_agent |
|
||||
|
||||
---
|
||||
|
||||
*本文档为 Crawlful Hub 术语标准,所有项目成员必须遵守。*
|
||||
*最后更新: 2026-03-23*
|
||||
53
docs/RULES/_index.md
Normal file
53
docs/RULES/_index.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# 规则索引
|
||||
|
||||
> **入口**: [../README.md](../README.md) | **术语**: [TERMINOLOGY.md](TERMINOLOGY.md)
|
||||
|
||||
---
|
||||
|
||||
## 规则文件
|
||||
|
||||
| 文件 | 内容 | 大小 |
|
||||
|------|------|------|
|
||||
| [database.md](database.md) | 数据库规则、表命名、字段类型 | ~200行 |
|
||||
| [api.md](api.md) | API规则、路由、权限、响应格式 | ~200行 |
|
||||
| [security.md](security.md) | 安全规则、RBAC、数据隔离 | ~200行 |
|
||||
| [typescript.md](typescript.md) | TypeScript规则、类型定义、编译 | ~300行 |
|
||||
| [business.md](business.md) | 业务规则、利润红线、决策流程 | ~200行 |
|
||||
| [collaboration.md](collaboration.md) | AI协作、任务领取、防撞车 | ~250行 |
|
||||
| [TERMINOLOGY.md](TERMINOLOGY.md) | 术语标准、命名规范 | ~420行 |
|
||||
|
||||
---
|
||||
|
||||
## ⚡ 硬性约束速查
|
||||
|
||||
```typescript
|
||||
// 数据库
|
||||
表前缀: 'cf_' // cf_product, cf_order
|
||||
金额类型: decimal(10,2) // 禁止 float/double
|
||||
|
||||
// 业务类型
|
||||
TOC: 零售/C端
|
||||
TOB: 企业/B端
|
||||
// 禁止使用 B2C/B2B
|
||||
|
||||
// 架构
|
||||
禁止: Controller 写业务逻辑
|
||||
必须: Service 层处理所有业务逻辑
|
||||
必须: authorize() 中间件校验权限
|
||||
|
||||
// 利润红线
|
||||
TOB利润率 < 15%: 禁止报价
|
||||
TOC利润率 < 20%: 触发风控预警
|
||||
|
||||
// 任务领取
|
||||
最小粒度: 2个相关任务
|
||||
必须: 声明占用模块和文件
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔗 相关文档
|
||||
|
||||
- [任务中心](../TASKS/_index.md)
|
||||
- [架构设计](../ARCH/_index.md)
|
||||
- [服务地图](../SERVICES/_index.md)
|
||||
213
docs/RULES/api.md
Normal file
213
docs/RULES/api.md
Normal file
@@ -0,0 +1,213 @@
|
||||
# API规则
|
||||
|
||||
> **入口**: [_index.md](_index.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. 路由规范
|
||||
|
||||
### 1.1 路由格式
|
||||
|
||||
```
|
||||
/api/{版本}/{模块}/{资源}/{动作}
|
||||
|
||||
示例:
|
||||
/api/v1/products # 商品列表
|
||||
/api/v1/products/:id # 商品详情
|
||||
/api/v1/products/:id/publish # 商品刊登
|
||||
/api/v1/orders # 订单列表
|
||||
/api/v1/orders/:id/fulfill # 订单履约
|
||||
```
|
||||
|
||||
### 1.2 HTTP方法映射
|
||||
|
||||
| 方法 | 用途 | 示例 |
|
||||
|------|------|------|
|
||||
| GET | 查询 | `GET /api/v1/products` |
|
||||
| POST | 创建 | `POST /api/v1/products` |
|
||||
| PUT | 全量更新 | `PUT /api/v1/products/:id` |
|
||||
| PATCH | 部分更新 | `PATCH /api/v1/products/:id` |
|
||||
| DELETE | 删除 | `DELETE /api/v1/products/:id` |
|
||||
|
||||
---
|
||||
|
||||
## 2. 权限校验
|
||||
|
||||
### 2.1 中间件使用
|
||||
|
||||
```typescript
|
||||
// ✅ 正确:路由层使用 authorize() 中间件
|
||||
router.get('/api/v1/products', authorize('product:read'), ProductController.list);
|
||||
router.post('/api/v1/products', authorize('product:create'), ProductController.create);
|
||||
router.put('/api/v1/products/:id', authorize('product:update'), ProductController.update);
|
||||
|
||||
// ❌ 错误:Controller 中硬编码角色
|
||||
async create(ctx: Context) {
|
||||
if (ctx.state.user.role === 'ADMIN') { // 禁止
|
||||
// ...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 权限格式
|
||||
|
||||
```
|
||||
{模块}:{动作}
|
||||
|
||||
示例:
|
||||
product:read # 查看商品
|
||||
product:create # 创建商品
|
||||
product:update # 更新商品
|
||||
product:delete # 删除商品
|
||||
order:fulfill # 订单履约
|
||||
finance:approve # 财务审批
|
||||
```
|
||||
|
||||
### 2.3 数据隔离
|
||||
|
||||
非 ADMIN 用户查询必须根据 `parentId` 层级过滤:
|
||||
|
||||
```typescript
|
||||
// ✅ 正确:Service层处理数据隔离
|
||||
async listProducts(ctx: Context) {
|
||||
const { tenantId, role, parentId } = ctx.state.user;
|
||||
|
||||
const query = db('cf_product').where('tenant_id', tenantId);
|
||||
|
||||
if (role !== 'ADMIN') {
|
||||
query.where('parent_id', parentId);
|
||||
}
|
||||
|
||||
return query;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 响应格式
|
||||
|
||||
### 3.1 成功响应
|
||||
|
||||
```typescript
|
||||
// 单条数据
|
||||
{
|
||||
"success": true,
|
||||
"data": { ... }
|
||||
}
|
||||
|
||||
// 列表数据
|
||||
{
|
||||
"success": true,
|
||||
"data": [...],
|
||||
"pagination": {
|
||||
"total": 100,
|
||||
"page": 1,
|
||||
"pageSize": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 错误响应
|
||||
|
||||
```typescript
|
||||
{
|
||||
"success": false,
|
||||
"error": {
|
||||
"code": "PRODUCT_NOT_FOUND",
|
||||
"message": "商品不存在",
|
||||
"details": {}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 错误码规范
|
||||
|
||||
| 前缀 | 类别 | 示例 |
|
||||
|------|------|------|
|
||||
| `VAL_` | 参数校验 | `VAL_INVALID_PARAM` |
|
||||
| `AUTH_` | 认证授权 | `AUTH_UNAUTHORIZED` |
|
||||
| `BIZ_` | 业务逻辑 | `BIZ_PRODUCT_NOT_FOUND` |
|
||||
| `SYS_` | 系统错误 | `SYS_DATABASE_ERROR` |
|
||||
|
||||
---
|
||||
|
||||
## 4. 请求参数
|
||||
|
||||
### 4.1 分页参数
|
||||
|
||||
```typescript
|
||||
// 请求
|
||||
GET /api/v1/products?page=1&pageSize=20
|
||||
|
||||
// 响应
|
||||
{
|
||||
"data": [...],
|
||||
"pagination": {
|
||||
"total": 100,
|
||||
"page": 1,
|
||||
"pageSize": 20,
|
||||
"totalPages": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 排序参数
|
||||
|
||||
```typescript
|
||||
// 请求
|
||||
GET /api/v1/products?sortBy=created_at&sortOrder=desc
|
||||
|
||||
// 默认排序
|
||||
sortBy: 'created_at'
|
||||
sortOrder: 'desc'
|
||||
```
|
||||
|
||||
### 4.3 过滤参数
|
||||
|
||||
```typescript
|
||||
// 请求
|
||||
GET /api/v1/products?platform=SHOPIFY&status=ACTIVE
|
||||
|
||||
// 多值过滤
|
||||
GET /api/v1/products?platform=SHOPIFY,AMAZON
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 追踪字段
|
||||
|
||||
所有API请求必须携带五元组:
|
||||
|
||||
```typescript
|
||||
// 请求头
|
||||
{
|
||||
'X-Tenant-Id': 'xxx',
|
||||
'X-Shop-Id': 'xxx',
|
||||
'X-Task-Id': 'xxx', // 可选
|
||||
'X-Trace-Id': 'xxx',
|
||||
'X-Business-Type': 'TOC'
|
||||
}
|
||||
|
||||
// 或请求体
|
||||
{
|
||||
"tenantId": "xxx",
|
||||
"shopId": "xxx",
|
||||
"taskId": "xxx",
|
||||
"traceId": "xxx",
|
||||
"businessType": "TOC"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 速率限制
|
||||
|
||||
| 端点类型 | 限制 | 窗口 |
|
||||
|---------|------|------|
|
||||
| 查询接口 | 100次 | 1分钟 |
|
||||
| 写入接口 | 30次 | 1分钟 |
|
||||
| 批量接口 | 10次 | 1分钟 |
|
||||
|
||||
---
|
||||
|
||||
*最后更新: 2026-03-22*
|
||||
160
docs/RULES/business.md
Normal file
160
docs/RULES/business.md
Normal file
@@ -0,0 +1,160 @@
|
||||
# 业务规则
|
||||
|
||||
> **入口**: [_index.md](_index.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. 业务类型
|
||||
|
||||
### 1.1 标准定义
|
||||
|
||||
| 术语 | 英文 | 说明 |
|
||||
|------|------|------|
|
||||
| **TOC** | To Consumer | 零售业务、C端 |
|
||||
| **TOB** | To Business | 企业业务、B端 |
|
||||
|
||||
```typescript
|
||||
// ✅ 正确
|
||||
businessType: 'TOC' | 'TOB'
|
||||
|
||||
// ❌ 错误
|
||||
businessType: 'B2C' | 'B2B'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 利润红线
|
||||
|
||||
### 2.1 利润率阈值
|
||||
|
||||
| 业务类型 | 阈值 | 处理方式 |
|
||||
|---------|------|---------|
|
||||
| **TOC** | < 20% | 触发风控预警 |
|
||||
| **TOB** | < 15% | 禁止报价 |
|
||||
|
||||
### 2.2 利润计算公式
|
||||
|
||||
```
|
||||
净利润 = 售价 - 采购成本 - 平台费用 - 物流费用 - 税费 - 汇率对冲 - 售后损耗 - 广告摊销
|
||||
|
||||
利润率 = 净利润 / 售价 × 100%
|
||||
```
|
||||
|
||||
### 2.3 计价收敛
|
||||
|
||||
```typescript
|
||||
// ✅ 正确:所有价格计算走 PricingService
|
||||
const finalPrice = await PricingService.calculate({
|
||||
basePrice: sku.basePrice,
|
||||
strategy: priceStrategy,
|
||||
platform: listing.platform,
|
||||
});
|
||||
|
||||
// ❌ 错误:Controller 或前端硬编码价格公式
|
||||
const finalPrice = basePrice * 1.2 + 5; // 禁止
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 决策流程门禁
|
||||
|
||||
### 3.1 状态流转
|
||||
|
||||
```
|
||||
SUGGESTED → PENDING_REVIEW → EXECUTED/REJECTED
|
||||
```
|
||||
|
||||
### 3.2 强制规则
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| **禁止** | Agent 直接修改核心业务数据 |
|
||||
| **必须** | 人工在 Console 端确认后方可执行 |
|
||||
|
||||
### 3.3 核心业务数据
|
||||
|
||||
- 价格调整
|
||||
- 退款审批
|
||||
- 订单创建
|
||||
- 合同签订
|
||||
|
||||
---
|
||||
|
||||
## 4. 商品管理
|
||||
|
||||
### 4.1 商品层级
|
||||
|
||||
| 层级 | 英文 | 说明 |
|
||||
|------|------|------|
|
||||
| **SPU** | Standard Product Unit | 标准产品单元 |
|
||||
| **SKU** | Stock Keeping Unit | 库存单元/变体 |
|
||||
| **Listing** | Platform Listing | 平台刊登实例 |
|
||||
|
||||
### 4.2 操作区分
|
||||
|
||||
| 操作 | 定义 | 判断标准 |
|
||||
|------|------|---------|
|
||||
| **映射** | 绑定系统SKU与平台商品 | 平台已有商品 |
|
||||
| **刊登** | 创建新商品发布到平台 | 平台无此商品 |
|
||||
|
||||
### 4.3 价格体系
|
||||
|
||||
```
|
||||
基准价(SKU层) → 策略价(规则计算) → 最终价(Listing层)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 订单限制
|
||||
|
||||
### 5.1 设备标记
|
||||
|
||||
所有设备必须标记:
|
||||
- `Commercial Use Only`
|
||||
- `Non-Returnable`
|
||||
|
||||
### 5.2 地址限制
|
||||
|
||||
- **禁止**:处理住宅地址订单(轻B模式)
|
||||
- **必须**:验证地址类型
|
||||
|
||||
---
|
||||
|
||||
## 6. 无API平台约束
|
||||
|
||||
### 6.1 处理流程
|
||||
|
||||
```
|
||||
No-API Bridge → PENDING_REVIEW → 人工确认 → 执行
|
||||
```
|
||||
|
||||
### 6.2 禁止行为
|
||||
|
||||
- **禁止**:全自动直发
|
||||
- **必须**:人工审核确认
|
||||
|
||||
---
|
||||
|
||||
## 7. Win节点隔离
|
||||
|
||||
### 7.1 隔离规则
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| 一店一上下文 | profileDir/proxy/fingerprintPolicy 独立 |
|
||||
| 同店任务 | 严格串行执行 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 企业交付底线
|
||||
|
||||
上线前必须具备:
|
||||
|
||||
- ✅ 租户隔离
|
||||
- ✅ 审计追责
|
||||
- ✅ 配额治理
|
||||
- ✅ SLA 指标可观测
|
||||
|
||||
---
|
||||
|
||||
*最后更新: 2026-03-22*
|
||||
152
docs/RULES/collaboration.md
Normal file
152
docs/RULES/collaboration.md
Normal file
@@ -0,0 +1,152 @@
|
||||
# AI协作规则
|
||||
|
||||
> **入口**: [_index.md](_index.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. 角色定位
|
||||
|
||||
| 角色 | 职责 |
|
||||
|------|------|
|
||||
| **Brain** | 全局调度与决策 |
|
||||
| **Agent** | 原子任务包闭环开发 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 任务包领取
|
||||
|
||||
### 2.1 核心原则
|
||||
|
||||
```
|
||||
任务包 = 同一闭环的连续任务 + 依赖链完整 + 文件归属明确
|
||||
```
|
||||
|
||||
### 2.2 领取规则
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| **优先领取任务包** | 必须优先领取同一闭环的完整任务链 |
|
||||
| **最小粒度** | 单次领取不少于 2 个相关任务 |
|
||||
| **依赖自包含** | 领取的任务包内依赖必须闭环 |
|
||||
|
||||
### 2.3 任务包类型
|
||||
|
||||
| 类型 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| 🔗 闭环包 | 同一业务闭环的全部任务 | BE-P001 + BE-P002 + BE-P003 |
|
||||
| 📦 模块包 | 同一模块的连续任务 | FE-P001 + FE-P002 + FE-P003 |
|
||||
| 🔗 依赖链包 | 有依赖关系的任务链 | BE-P001 → BE-P002 → BE-P003 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 协作防撞车
|
||||
|
||||
### 3.1 占用声明
|
||||
|
||||
领取任务时,必须同时声明:
|
||||
|
||||
1. 占用的模块/闭环名称
|
||||
2. 涉及的主要文件路径
|
||||
3. 预计完成时间
|
||||
|
||||
### 3.2 占用状态模板
|
||||
|
||||
```markdown
|
||||
## 🔒 当前任务占用状态
|
||||
|
||||
| Agent | 占用模块 | 涉及任务 | 主要文件 | 开始时间 | 状态 |
|
||||
|-------|----------|----------|----------|----------|------|
|
||||
| AI-Backend-1 | 商品闭环 | BE-P001~003 | ProductService.ts | 2026-03-22 10:00 | 🔒 进行中 |
|
||||
```
|
||||
|
||||
### 3.3 冲突处理
|
||||
|
||||
| 优先级 | 规则 |
|
||||
|--------|------|
|
||||
| 1 | 先声明者优先 |
|
||||
| 2 | 后到者避让 |
|
||||
| 3 | 争议由 Brain 协调 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 执行原则
|
||||
|
||||
### 4.1 一次性分发
|
||||
|
||||
每轮下发完整任务包(P0/P1/P2)
|
||||
|
||||
### 4.2 连续执行
|
||||
|
||||
任务包内连续执行到"完成或明确阻塞"
|
||||
|
||||
### 4.3 文件占用锁
|
||||
|
||||
- 同目录协作先声明归属
|
||||
- "谁领取谁编辑"
|
||||
- 后写入方必须先 Read 最新内容,增量合并
|
||||
|
||||
---
|
||||
|
||||
## 5. 自省要求
|
||||
|
||||
Agent 必须在以下阶段上报"自我问题":
|
||||
|
||||
1. 对话开始时
|
||||
2. 执行过程中
|
||||
3. 交付前
|
||||
|
||||
---
|
||||
|
||||
## 6. 禁止行为
|
||||
|
||||
| 行为 | 说明 |
|
||||
|------|------|
|
||||
| ❌ 单独领取任务包内的部分任务 | 必须领取完整任务包 |
|
||||
| ❌ 不声明占用直接开始开发 | 必须先声明 |
|
||||
| ❌ 跨模块同时占用多个任务包 | 一次只占一个模块 |
|
||||
| ❌ 占用超过 24 小时未释放 | 及时释放占用 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 任务ID格式
|
||||
|
||||
### 7.1 格式定义
|
||||
|
||||
```
|
||||
[模块]-[子模块][序号]
|
||||
```
|
||||
|
||||
### 7.2 模块代码
|
||||
|
||||
| 代码 | 含义 |
|
||||
|------|------|
|
||||
| **FE** | Frontend (前端) |
|
||||
| **BE** | Backend (后端) |
|
||||
| **PL** | Plugin (插件) |
|
||||
| **AI** | AI (人工智能) |
|
||||
| **DT** | Data (数据) |
|
||||
| **OP** | Operation (运维) |
|
||||
|
||||
### 7.3 子模块代码
|
||||
|
||||
| 代码 | 含义 |
|
||||
|------|------|
|
||||
| **P** | Product (商品) |
|
||||
| **O** | Order (订单) |
|
||||
| **F** | Finance (财务) |
|
||||
| **I** | Inventory (库存) |
|
||||
| **C** | Collection (采集) |
|
||||
| **A** | Advertisement (广告) |
|
||||
|
||||
### 7.4 示例
|
||||
|
||||
```
|
||||
FE-P001 → 前端商品模块任务001
|
||||
BE-O005 → 后端订单模块任务005
|
||||
PL-C002 → 插件采集模块任务002
|
||||
AI-A001 → AI广告模块任务001
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*最后更新: 2026-03-22*
|
||||
209
docs/RULES/database.md
Normal file
209
docs/RULES/database.md
Normal file
@@ -0,0 +1,209 @@
|
||||
# 数据库规则
|
||||
|
||||
> **入口**: [_index.md](_index.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. 表命名规范
|
||||
|
||||
### 1.1 基本规则
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| **表前缀** | 所有表必须以 `cf_` 开头 |
|
||||
| **命名格式** | `cf_{模块}_{实体}` 如 `cf_product`, `cf_order_item` |
|
||||
| **禁止** | 无前缀、其他前缀 |
|
||||
|
||||
### 1.2 示例
|
||||
|
||||
```sql
|
||||
-- ✅ 正确
|
||||
CREATE TABLE cf_product (...);
|
||||
CREATE TABLE cf_order_item (...);
|
||||
CREATE TABLE cf_inventory_log (...);
|
||||
|
||||
-- ❌ 错误
|
||||
CREATE TABLE product (...);
|
||||
CREATE TABLE order_items (...);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 字段类型规范
|
||||
|
||||
### 2.1 金额字段
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| **类型** | `decimal(10,2)` |
|
||||
| **禁止** | `float`, `double` |
|
||||
| **原因** | 精度问题会导致金额计算错误 |
|
||||
|
||||
```sql
|
||||
-- ✅ 正确
|
||||
price DECIMAL(10,2) NOT NULL,
|
||||
total_amount DECIMAL(10,2) NOT NULL,
|
||||
|
||||
-- ❌ 错误
|
||||
price FLOAT,
|
||||
total_amount DOUBLE,
|
||||
```
|
||||
|
||||
### 2.2 物理属性单位
|
||||
|
||||
| 属性 | 单位 | 字段类型 |
|
||||
|------|------|---------|
|
||||
| 长度 | cm | `decimal(10,2)` |
|
||||
| 重量 | kg | `decimal(10,2)` |
|
||||
| 体积 | m³ | `decimal(10,4)` |
|
||||
|
||||
### 2.3 JSON 字段
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| **存储** | JSON 字段入库前序列化 |
|
||||
| **读取** | 出库后解析 |
|
||||
| **适用** | images, skus, attributes, params 等 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 数据完整性
|
||||
|
||||
### 3.1 唯一约束
|
||||
|
||||
```sql
|
||||
-- 商品表:平台+商品ID唯一
|
||||
ALTER TABLE cf_product
|
||||
ADD UNIQUE KEY uk_platform_product (platform, product_id);
|
||||
|
||||
-- 店铺表:租户+店铺ID唯一
|
||||
ALTER TABLE cf_shop
|
||||
ADD UNIQUE KEY uk_tenant_shop (tenant_id, shop_id);
|
||||
```
|
||||
|
||||
### 3.2 幂等性保证
|
||||
|
||||
所有建表语句必须使用 `db.schema.hasTable` 前置校验:
|
||||
|
||||
```typescript
|
||||
// ✅ 正确
|
||||
if (!(await db.schema.hasTable('cf_product'))) {
|
||||
await db.schema.createTable('cf_product', (table) => {
|
||||
table.increments('id').primary();
|
||||
// ...
|
||||
});
|
||||
}
|
||||
|
||||
// ❌ 错误
|
||||
await db.schema.createTable('cf_product', (table) => {
|
||||
// 可能重复创建导致错误
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 索引规范
|
||||
|
||||
### 4.1 必须索引
|
||||
|
||||
| 字段类型 | 索引要求 |
|
||||
|---------|---------|
|
||||
| `tenant_id` | 必须索引 |
|
||||
| `shop_id` | 必须索引 |
|
||||
| `created_at` | 必须索引 |
|
||||
| 状态字段 | 按查询频率决定 |
|
||||
| 外键 | 必须索引 |
|
||||
|
||||
### 4.2 复合索引顺序
|
||||
|
||||
```sql
|
||||
-- 按查询频率和选择性排序
|
||||
-- 高选择性在前,常用查询条件在前
|
||||
CREATE INDEX idx_tenant_shop_status ON cf_order (tenant_id, shop_id, status);
|
||||
```
|
||||
|
||||
### 4.3 索引验证
|
||||
|
||||
复杂查询必须通过 `EXPLAIN` 校验:
|
||||
|
||||
```sql
|
||||
EXPLAIN SELECT * FROM cf_order WHERE tenant_id = 'xxx' AND status = 'PENDING';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 禁止操作
|
||||
|
||||
| 操作 | 说明 |
|
||||
|------|------|
|
||||
| `DROP TABLE` | 禁止在代码中执行 |
|
||||
| `TRUNCATE` | 禁止在代码中执行 |
|
||||
| `DELETE` 全表 | 必须带 WHERE 条件 |
|
||||
| 直接修改生产数据 | 必须通过迁移脚本 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 迁移规范
|
||||
|
||||
### 6.1 迁移文件命名
|
||||
|
||||
```
|
||||
{timestamp}_{action}_{table}.ts
|
||||
|
||||
示例:
|
||||
20260322000001_create_cf_product.ts
|
||||
20260322000002_add_price_index_to_cf_product.ts
|
||||
```
|
||||
|
||||
### 6.2 迁移模板
|
||||
|
||||
```typescript
|
||||
import { Knex } from 'knex';
|
||||
|
||||
export async function up(knex: Knex): Promise<void> {
|
||||
if (!(await knex.schema.hasTable('cf_product'))) {
|
||||
await knex.schema.createTable('cf_product', (table) => {
|
||||
table.increments('id').primary();
|
||||
table.string('tenant_id', 50).notNullable();
|
||||
table.string('shop_id', 50).notNullable();
|
||||
table.string('product_id', 100).notNullable();
|
||||
table.string('platform', 20).notNullable();
|
||||
table.decimal('price', 10, 2).notNullable();
|
||||
table.timestamps(true, true);
|
||||
|
||||
table.index(['tenant_id', 'shop_id']);
|
||||
table.unique(['platform', 'product_id']);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export async function down(knex: Knex): Promise<void> {
|
||||
await knex.schema.dropTableIfExists('cf_product');
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 五元组字段
|
||||
|
||||
所有业务表必须包含以下追踪字段:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `tenant_id` | VARCHAR(50) | 租户ID |
|
||||
| `shop_id` | VARCHAR(50) | 店铺ID |
|
||||
| `task_id` | VARCHAR(50) | 任务ID(可选) |
|
||||
| `trace_id` | VARCHAR(50) | 链路追踪ID |
|
||||
| `business_type` | VARCHAR(10) | TOC/TOB |
|
||||
|
||||
```sql
|
||||
tenant_id VARCHAR(50) NOT NULL,
|
||||
shop_id VARCHAR(50) NOT NULL,
|
||||
task_id VARCHAR(50),
|
||||
trace_id VARCHAR(50) NOT NULL,
|
||||
business_type VARCHAR(10) NOT NULL,
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*最后更新: 2026-03-22*
|
||||
196
docs/RULES/security.md
Normal file
196
docs/RULES/security.md
Normal file
@@ -0,0 +1,196 @@
|
||||
# 安全规则
|
||||
|
||||
> **入口**: [_index.md](_index.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. RBAC模型
|
||||
|
||||
### 1.1 预设角色
|
||||
|
||||
| 角色 | 权限范围 | 说明 |
|
||||
|------|---------|------|
|
||||
| **ADMIN** | 全部 | 系统管理员 |
|
||||
| **MANAGER** | 部门级 | 运营主管 |
|
||||
| **OPERATOR** | 个人级 | 运营专员 |
|
||||
| **FINANCE** | 财务级 | 财务主管 |
|
||||
| **SOURCING** | 采购级 | 采购专家 |
|
||||
| **LOGISTICS** | 物流级 | 物流专家 |
|
||||
| **ANALYST** | 只读 | 数据分析师 |
|
||||
|
||||
### 1.2 角色权限矩阵
|
||||
|
||||
| 操作类型 | OPERATOR | MANAGER | FINANCE | ADMIN |
|
||||
|---------|----------|---------|---------|-------|
|
||||
| 查看数据 | ✅ 自己 | ✅ 部门 | ✅ 财务 | ✅ 全部 |
|
||||
| 创建数据 | ✅ | ✅ | ✅ | ✅ |
|
||||
| 修改数据 | ✅ 自己 | ✅ 部门 | ✅ 财务 | ✅ 全部 |
|
||||
| 删除数据 | ❌ | ✅ 部门 | ✅ 财务 | ✅ 全部 |
|
||||
| 审批操作 | ❌ | ✅ 低风险 | ✅ 中风险 | ✅ 全部 |
|
||||
| 系统配置 | ❌ | ❌ | ❌ | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据隔离
|
||||
|
||||
### 2.1 隔离层级
|
||||
|
||||
```
|
||||
租户隔离 (Tenant)
|
||||
└── 组织隔离 (Organization)
|
||||
└── 部门隔离 (Department)
|
||||
└── 团队隔离 (Team)
|
||||
└── 个人隔离 (Self)
|
||||
```
|
||||
|
||||
### 2.2 数据范围类型
|
||||
|
||||
| 范围 | 英文 | 说明 |
|
||||
|------|------|------|
|
||||
| 仅自己 | SELF | 只看自己创建的数据 |
|
||||
| 本团队 | TEAM | 看自己团队的数据 |
|
||||
| 本部门 | DEPT | 看自己部门的数据 |
|
||||
| 本组织 | ORG | 看整个公司的数据 |
|
||||
| 全平台 | ALL | 超管,看所有租户数据 |
|
||||
|
||||
### 2.3 查询过滤实现
|
||||
|
||||
```typescript
|
||||
// Service层实现数据隔离
|
||||
async listOrders(ctx: Context, params: ListParams) {
|
||||
const { tenantId, dataScope, parentId } = ctx.state.user;
|
||||
|
||||
const query = db('cf_order').where('tenant_id', tenantId);
|
||||
|
||||
switch (dataScope) {
|
||||
case 'SELF':
|
||||
query.where('created_by', ctx.state.user.id);
|
||||
break;
|
||||
case 'TEAM':
|
||||
query.where('team_id', parentId);
|
||||
break;
|
||||
case 'DEPT':
|
||||
query.where('dept_id', parentId);
|
||||
break;
|
||||
case 'ORG':
|
||||
// 已通过 tenant_id 过滤
|
||||
break;
|
||||
case 'ALL':
|
||||
// 超管,不过滤
|
||||
break;
|
||||
}
|
||||
|
||||
return query;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 操作风险等级
|
||||
|
||||
### 3.1 风险分级
|
||||
|
||||
| 等级 | 操作类型 | 最低审核权限 | 自动执行 |
|
||||
|------|---------|-------------|---------|
|
||||
| **低风险** | 库存预警、数据同步 | OPERATOR | ✅ 允许 |
|
||||
| **中风险** | 定价调整、广告投放 | MANAGER | ✅ 高置信度允许 |
|
||||
| **高风险** | 退款审批、合同签订 | FINANCE | ❌ 禁止 |
|
||||
| **极高风险** | 大额转账、系统配置 | ADMIN | ❌ 禁止 |
|
||||
|
||||
### 3.2 AI决策权限
|
||||
|
||||
```typescript
|
||||
interface AIDecisionPermission {
|
||||
module: string;
|
||||
action: string;
|
||||
riskLevel: 'low' | 'medium' | 'high' | 'critical';
|
||||
minReviewerRole: 'OPERATOR' | 'MANAGER' | 'FINANCE' | 'ADMIN';
|
||||
autoExecute: boolean;
|
||||
autoExecuteConfidence: number; // 0.0 - 1.0
|
||||
requireDualApproval: boolean;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 决策流程门禁
|
||||
|
||||
### 4.1 状态流转
|
||||
|
||||
```
|
||||
SUGGESTED → PENDING_REVIEW → EXECUTED/REJECTED
|
||||
```
|
||||
|
||||
### 4.2 强制规则
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| **禁止** | Agent 直接修改核心业务数据 |
|
||||
| **必须** | 人工在 Console 端确认后方可执行 |
|
||||
| **必须** | 所有决策记录审计日志 |
|
||||
|
||||
### 4.3 核心业务数据
|
||||
|
||||
- 价格调整
|
||||
- 退款审批
|
||||
- 订单创建
|
||||
- 合同签订
|
||||
- 大额转账
|
||||
|
||||
---
|
||||
|
||||
## 5. 审计日志
|
||||
|
||||
### 5.1 必须记录
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `operator_id` | 操作人ID |
|
||||
| `operator_role` | 操作人角色 |
|
||||
| `action` | 操作类型 |
|
||||
| `target_type` | 目标类型 |
|
||||
| `target_id` | 目标ID |
|
||||
| `before_value` | 操作前值 |
|
||||
| `after_value` | 操作后值 |
|
||||
| `trace_id` | 链路追踪ID |
|
||||
| `created_at` | 操作时间 |
|
||||
|
||||
### 5.2 日志保留
|
||||
|
||||
| 日志类型 | 保留期限 |
|
||||
|---------|---------|
|
||||
| 登录日志 | 90天 |
|
||||
| 操作日志 | 180天 |
|
||||
| 审计日志 | 365天 |
|
||||
| 异常日志 | 30天 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 敏感数据处理
|
||||
|
||||
### 6.1 敏感字段
|
||||
|
||||
| 字段类型 | 处理方式 |
|
||||
|---------|---------|
|
||||
| 密码 | 加密存储,禁止明文 |
|
||||
| 手机号 | 脱敏显示 `138****1234` |
|
||||
| 银行卡 | 脱敏显示 `**** **** **** 1234` |
|
||||
| 身份证 | 脱敏显示 `110***********1234` |
|
||||
| API密钥 | 加密存储,禁止日志输出 |
|
||||
|
||||
### 6.2 禁止行为
|
||||
|
||||
```typescript
|
||||
// ❌ 禁止
|
||||
console.log('API Key:', apiKey);
|
||||
logger.info('User password:', password);
|
||||
ctx.body = { password: user.password };
|
||||
|
||||
// ✅ 正确
|
||||
logger.info('API Key: ***');
|
||||
ctx.body = { password: '***' };
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*最后更新: 2026-03-22*
|
||||
256
docs/RULES/typescript.md
Normal file
256
docs/RULES/typescript.md
Normal file
@@ -0,0 +1,256 @@
|
||||
# TypeScript规则
|
||||
|
||||
> **入口**: [_index.md](_index.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. 核心原则
|
||||
|
||||
### 1.1 禁止any
|
||||
|
||||
```typescript
|
||||
// ❌ 禁止
|
||||
function process(data: any) { ... }
|
||||
const result: any = fetchData();
|
||||
|
||||
// ✅ 正确
|
||||
function process(data: unknown) {
|
||||
if (typeof data === 'string') {
|
||||
// 类型收窄后使用
|
||||
}
|
||||
}
|
||||
|
||||
interface FetchResult {
|
||||
id: string;
|
||||
name: string;
|
||||
}
|
||||
const result: FetchResult = fetchData();
|
||||
```
|
||||
|
||||
### 1.2 函数必须声明返回类型
|
||||
|
||||
```typescript
|
||||
// ❌ 禁止
|
||||
function getProduct(id: string) {
|
||||
return db('cf_product').where({ id }).first();
|
||||
}
|
||||
|
||||
// ✅ 正确
|
||||
interface Product {
|
||||
id: string;
|
||||
name: string;
|
||||
price: number;
|
||||
}
|
||||
|
||||
async function getProduct(id: string): Promise<Product | null> {
|
||||
return db('cf_product').where({ id }).first();
|
||||
}
|
||||
```
|
||||
|
||||
### 1.3 API必须定义类型
|
||||
|
||||
```typescript
|
||||
// ❌ 禁止
|
||||
router.post('/api/v1/products', async (ctx) => {
|
||||
const body = ctx.request.body; // any
|
||||
// ...
|
||||
});
|
||||
|
||||
// ✅ 正确
|
||||
interface CreateProductRequest {
|
||||
name: string;
|
||||
price: number;
|
||||
platform: string;
|
||||
}
|
||||
|
||||
interface CreateProductResponse {
|
||||
success: boolean;
|
||||
data: Product;
|
||||
}
|
||||
|
||||
router.post('/api/v1/products', async (ctx) => {
|
||||
const body = ctx.request.body as CreateProductRequest;
|
||||
// ...
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 类型定义规范
|
||||
|
||||
### 2.1 Schema驱动
|
||||
|
||||
类型必须从 Schema(zod)推导,禁止手动定义:
|
||||
|
||||
```typescript
|
||||
// ❌ 禁止:手动定义类型
|
||||
interface Product {
|
||||
id: string;
|
||||
name: string;
|
||||
price: number;
|
||||
}
|
||||
|
||||
// ✅ 正确:从Schema推导
|
||||
import { z } from 'zod';
|
||||
|
||||
const ProductSchema = z.object({
|
||||
id: z.string(),
|
||||
name: z.string(),
|
||||
price: z.number(),
|
||||
});
|
||||
|
||||
type Product = z.infer<typeof ProductSchema>;
|
||||
```
|
||||
|
||||
### 2.2 统一类型中心
|
||||
|
||||
所有类型只从 `/types` 目录导入:
|
||||
|
||||
```typescript
|
||||
// ❌ 禁止:各模块重复定义
|
||||
// services/ProductService.ts
|
||||
interface Product { ... }
|
||||
|
||||
// ✅ 正确:从类型中心导入
|
||||
import { Product, CreateProductRequest } from '@/types';
|
||||
```
|
||||
|
||||
### 2.3 类型边界分层
|
||||
|
||||
```
|
||||
API 返回数据 → Schema 验证 → DTO 转换 → Domain 模型
|
||||
```
|
||||
|
||||
```typescript
|
||||
// 1. API返回(不可信)
|
||||
const apiData = await fetchProduct();
|
||||
|
||||
// 2. Schema验证
|
||||
const validated = ProductSchema.parse(apiData);
|
||||
|
||||
// 3. DTO转换
|
||||
const dto: ProductDTO = {
|
||||
id: validated.id,
|
||||
name: validated.name,
|
||||
price: validated.price,
|
||||
};
|
||||
|
||||
// 4. Domain模型
|
||||
const domain: Product = Product.fromDTO(dto);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 编译检查
|
||||
|
||||
### 3.1 强制规则
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| 编译错误 = 构建失败 | TypeScript 编译错误必须阻断 CI/CD |
|
||||
| 提交前检查 | 必须通过 `tsc --noEmit` 检查 |
|
||||
| ESLint 强制 | 必须通过 `@typescript-eslint` 规则检查 |
|
||||
|
||||
### 3.2 禁止行为
|
||||
|
||||
```typescript
|
||||
// ❌ 禁止:忽略错误
|
||||
// @ts-ignore
|
||||
const result = someFunction();
|
||||
|
||||
// ❌ 禁止:禁用检查
|
||||
// @ts-nocheck
|
||||
function process() { ... }
|
||||
|
||||
// ❌ 禁止:将类型改为any来"解决"错误
|
||||
const data: any = fetchData();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 类型转换
|
||||
|
||||
### 4.1 类型守卫
|
||||
|
||||
```typescript
|
||||
// ✅ 正确:使用类型守卫
|
||||
function isProduct(data: unknown): data is Product {
|
||||
return (
|
||||
typeof data === 'object' &&
|
||||
data !== null &&
|
||||
'id' in data &&
|
||||
'name' in data &&
|
||||
'price' in data
|
||||
);
|
||||
}
|
||||
|
||||
function process(data: unknown) {
|
||||
if (isProduct(data)) {
|
||||
// data 类型为 Product
|
||||
console.log(data.name);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 类型断言
|
||||
|
||||
```typescript
|
||||
// ❌ 禁止:过度使用断言
|
||||
const product = data as Product;
|
||||
|
||||
// ✅ 正确:先用Schema验证
|
||||
const product = ProductSchema.parse(data);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 文件规模限制
|
||||
|
||||
| 类型 | 限制 |
|
||||
|------|------|
|
||||
| 单文件 | ≤ 1500 行 |
|
||||
| 单函数 | ≤ 120 行 |
|
||||
| UI组件 | ≤ 300 行 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 命名规范
|
||||
|
||||
### 6.1 文件命名
|
||||
|
||||
| 类型 | 格式 | 示例 |
|
||||
|------|------|------|
|
||||
| 组件 | PascalCase | `ProductList.tsx` |
|
||||
| 服务 | PascalCase | `ProductService.ts` |
|
||||
| 工具 | camelCase | `formatPrice.ts` |
|
||||
| 类型 | camelCase | `productTypes.ts` |
|
||||
|
||||
### 6.2 类型命名
|
||||
|
||||
```typescript
|
||||
// 接口:不加 I 前缀
|
||||
interface Product { ... }
|
||||
|
||||
// 类型别名:描述性名称
|
||||
type ProductStatus = 'ACTIVE' | 'INACTIVE';
|
||||
|
||||
// 泛型:单字母或描述性名称
|
||||
function getItems<T>(): T[] { ... }
|
||||
function transform<Input, Output>(data: Input): Output { ... }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 检查命令
|
||||
|
||||
```bash
|
||||
# 类型检查
|
||||
npx tsc --noEmit
|
||||
|
||||
# 检查错误数量
|
||||
npx tsc --noEmit 2>&1 | Select-String -Pattern "^src/" | Measure-Object
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*最后更新: 2026-03-22*
|
||||
Reference in New Issue
Block a user