refactor: 优化代码结构并修复类型问题

- 移除未使用的TabPane组件
- 修复类型定义和导入方式
- 优化mock数据源的环境变量判断逻辑
- 更新文档结构并归档旧文件
- 添加新的UI组件和Memo组件
- 调整API路径和响应处理
This commit is contained in:
2026-03-23 12:41:35 +08:00
parent a037843851
commit 2b86715c09
363 changed files with 39305 additions and 40622 deletions

419
docs/RULES/TERMINOLOGY.md Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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驱动
类型必须从 Schemazod推导禁止手动定义
```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*