Files
makemd/docs/06_Reports/Code_Review_Report_2026-03-20.md
wurenzhi 15ee1758f5 refactor: 重构项目结构并优化类型定义
- 移除extension模块,将功能迁移至node-agent
- 修复类型导出问题,使用export type明确类型导出
- 统一数据库连接方式,从直接导入改为使用config/database
- 更新文档中的项目结构描述
- 添加多个服务的实用方法,如getForecast、getBalances等
- 修复类型错误和TS1205警告
- 优化RedisService调用方式
- 添加新的实体类型定义
- 更新审计日志格式,统一字段命名
2026-03-21 15:04:06 +08:00

8.8 KiB
Raw Blame History

代码审查报告

项目名称: Crawlful Hub - 全球电商增长中台
审查日期: 2026-03-20
审查范围: 全项目源代码Server / Dashboard / Extension / Client / Node-Agent
审查标准: 项目编码规范、TypeScript 最佳实践、安全标准、性能优化


执行摘要

本次审查覆盖了项目的 5 个主要模块,共审查了约 200+ 个源代码文件。发现以下关键问题:

类别 问题数量 严重程度
TypeScript 编译错误 400+ 🔴 严重
数据类型违规float/double 51 🔴 严重
使用 any 类型 43 🟡 中等
TODO/FIXME 遗留 30 🟡 中等
混合使用 console.log 86 🟢 轻微
安全密钥硬编码 1 🔴 严重

1. 严重问题(需立即修复)

1.1 TypeScript 编译错误

问题描述: Server 模块存在 400+ 个 TypeScript 编译错误,导致项目无法正常构建。

影响文件:

  • src/services/*.ts (100+ 文件)
  • src/domains/**/*.ts (50+ 文件)
  • src/core/**/*.ts (30+ 文件)

错误类型分布:

- 类型不匹配错误: ~40%
- 缺少类型声明: ~30%
- 导入/导出错误: ~20%
- 其他语法错误: ~10%

整改建议:

  1. 运行 npm run check 获取完整错误列表
  2. 按模块分批修复优先修复核心服务Trade/Billing/Arbitrage
  3. 添加缺失的类型声明文件
  4. 统一模块导入规范

1.2 金额字段使用 float/double违反项目规范

问题描述: 根据项目规则 1.1,金额字段必须使用 decimal(10,2),但发现多处使用 float/double

违规文件列表:

文件路径 行号 违规代码
src/services/ProductService.ts 53 table.double('rating')
src/core/runtime/LegacyTableInitializer.ts 321-322 table.float('daily_budget')
src/domains/Arbitrage/ArbitrageService.ts 98-99 table.float('initial_profit_rate')
src/domains/Billing/SLAGovernanceService.ts 108 table.float('p95_latency_ms')
src/services/FXHedgingService.ts 40 table.float('volatility')

整改建议:

// ❌ 错误
 table.float('price')
 table.double('amount')

// ✅ 正确
 table.decimal('price', 10, 2)
 table.decimal('amount', 10, 2)

1.3 安全密钥硬编码

问题描述: VaultCrypto.ts 中存在默认主密钥硬编码。

文件: server/src/utils/VaultCrypto.ts 行号: 9

private static MASTER_KEY = process.env.VAULT_MASTER_KEY || 'crawlful_default_master_key_32chars_';

风险: 如果环境变量未设置,将使用可预测的默认密钥,严重危及凭证安全。

整改建议:

// ❌ 错误
private static MASTER_KEY = process.env.VAULT_MASTER_KEY || 'default_key';

// ✅ 正确
private static getMasterKey(): string {
  const key = process.env.VAULT_MASTER_KEY;
  if (!key) {
    throw new Error('VAULT_MASTER_KEY environment variable is required');
  }
  return key.padEnd(32).substring(0, 32);
}

2. 中等问题(建议修复)

2.1 过度使用 any 类型

问题描述: Dashboard 模块中存在 43 处 any 类型使用,削弱了 TypeScript 的类型安全。

典型违规模式:

// ❌ 错误
const [dateRange, setDateRange] = useState(null as any);
status: status as any,
const response = await fetch(`${url}?${new URLSearchParams(params as any)}`);

整改建议:

// ✅ 正确
import type { Dayjs } from 'dayjs';
const [dateRange, setDateRange] = useState<[Dayjs, Dayjs] | null>(null);

// 定义明确的类型
interface QueryParams {
  page: number;
  pageSize: number;
  status?: string;
}
const response = await fetch(`${url}?${new URLSearchParams(params as unknown as Record<string, string>)}`);

2.2 TODO/FIXME 遗留项

问题描述: 发现 30 个 TODO/FIXME 注释,部分涉及核心功能缺失。

关键遗留项:

文件 行号 描述 优先级
OperationAgentService.ts 118 商品同步到数据库 P0
OperationAgentService.ts 167 订单同步到数据库 P0
PlatformApiService.ts 204-214 Amazon SP-API 同步 P1
dynamicPricing.ts 261 analyzeCompetitorPrices 方法 P1
SummaryAggregationService.ts 125-126 真实成本/利润接入 P1

2.3 混合使用 console.log

问题描述: 86 个文件混合使用 console.log/warn/error,与统一的 logger 服务并存。

整改建议: 统一使用项目提供的 logger 服务:

// ❌ 错误
console.log('[INFO] Message', data);
console.error('[ERROR] Message', error);

// ✅ 正确
import { logger } from '../utils/logger';
logger.info('Message', data);
logger.error('Message', error);

3. 代码风格问题

3.1 命名规范

总体情况: 命名规范执行良好,符合项目规则。

亮点:

  • 服务类统一使用 Service 后缀
  • 表名统一使用 cf_ 前缀
  • 数据库字段使用下划线命名

改进空间:

  • 部分接口命名不一致(如 PurchaseOrder vs SalesOrder
  • 建议统一使用 PascalCase 命名接口

3.2 注释规范

亮点:

  • 核心业务服务包含 JSDoc 注释
  • 任务 ID 标记清晰(如 [BIZ_TRADE_01]

改进空间:

  • 部分工具函数缺少注释
  • 建议复杂算法添加实现说明

3.3 文件组织

亮点:

  • Mock 数据隔离在 /mock 目录
  • 类型定义集中在 types/ 目录
  • 领域驱动设计分层清晰

4. 架构合规性审查

4.1 逻辑集中化原则

审查结果: 整体符合逻辑集中化原则

符合项:

  • 业务逻辑集中在 Service 层
  • Controller 只负责请求/响应
  • 通过 Service 暴露接口

建议:

  • 部分 Controller 中仍有少量业务逻辑,建议迁移到 Service

4.2 数据完整性

审查结果: 基本符合规范

符合项:

  • 使用 hasTable 前置校验
  • JSON 字段序列化处理

违规项:

  • 金额字段使用 float/double见 1.2

4.3 RBAC 权限控制

审查结果: 符合规范

符合项:

  • 使用 requirePermission 中间件
  • 路由层权限控制
  • 无硬编码 role === 'ADMIN'

5. 安全审查

5.1 认证与授权

审查结果: 符合规范

  • JWT Token 验证
  • MFA 双因素认证
  • OAuth2 支持

5.2 数据加密

审查结果: 存在风险

  • VaultCrypto 实现正确
  • 默认密钥硬编码 (见 1.3

5.3 输入验证

审查结果: 需要加强

  • 部分 API 缺少输入参数校验
  • 建议统一使用 Zod 进行参数验证

6. 性能审查

6.1 数据库查询

审查结果: 需要优化

建议:

  • 复杂查询需通过 EXPLAIN 校验索引
  • 批量操作建议分批处理(见 TODO 项)

6.2 缓存使用

审查结果: 符合规范

  • Redis 缓存使用正确
  • 本地缓存策略合理

6.3 并发控制

审查结果: 符合规范

  • Worker 并发数 ≤ 10
  • API 速率限制

7. 整改建议优先级

P0立即修复

  1. 修复 TypeScript 编译错误400+
  2. 修复金额字段类型51 处 float/double → decimal
  3. 移除 VaultCrypto 默认密钥硬编码

P1本周修复

  1. 完成核心 TODO 项(商品/订单同步)
  2. 减少 any 类型使用43 处)
  3. 统一 logger 使用86 处 console.log

P2本月修复

  1. 完善输入参数验证
  2. 优化数据库查询索引
  3. 补充单元测试覆盖率

8. 附录

8.1 项目结构统计

server/src/
├── api/routes/        40+ 路由文件
├── domains/           8+ 领域模块
├── services/          100+ 服务文件
├── core/              30+ 核心模块
├── utils/             20+ 工具文件
└── tests/             15+ 测试文件

dashboard/src/
├── pages/             40+ 页面组件
├── services/          20+ 数据源服务
├── components/        15+ UI组件
└── types/             类型定义

node-agent/src/
├── main.ts            入口文件
├── index.ts           NodeAgent 类
└── (待扩展)           任务处理器、平台适配器

8.2 合规检查清单

检查项 状态 备注
表前缀 cf_ 全部符合
金额字段 decimal(10,2) 51 处违规
服务类 Service 后缀 全部符合
权限 authorize() 中间件 全部符合
五元组追踪 核心服务已实施
状态机 FSM 核心流程已实施
逻辑集中化 整体符合

报告生成时间: 2026-03-20
审查工具: TypeScript Compiler, ESLint, 人工审查
下次审查建议: 修复 P0 问题后进行复查