feat: 初始化项目结构并添加核心功能模块

- 新增文档模板和导航结构
- 实现服务器基础API路由和控制器
- 添加扩展插件配置和前端框架
- 引入多租户和权限管理模块
- 集成日志和数据库配置
- 添加核心业务模型和类型定义
This commit is contained in:
2026-03-17 22:07:19 +08:00
parent c0870dce50
commit 136c2fa579
728 changed files with 107690 additions and 5614 deletions

View File

@@ -0,0 +1,106 @@
import { AIService } from './AIService';
import { logger } from '../utils/logger';
import db from '../config/database';
export interface SelectorRepairResult {
success: boolean;
newSelector?: string;
confidence: number;
}
/**
* [CORE_AI_09] 自愈式采集选择器 (Self-Healing Crawler Selectors)
* @description 当爬虫选择器失效时,自动利用 AI 重新定位目标元素
*/
export class SelfHealingService {
private static readonly TABLE_NAME = 'cf_selector_repairs';
/**
* 修复失效的选择器
*/
static async repairSelector(params: {
platform: string;
targetField: string;
oldSelector: string;
htmlContext: string;
}): Promise<SelectorRepairResult> {
logger.warn(`[SelfHealing] Repairing selector for ${params.platform}.${params.targetField}: ${params.oldSelector}`);
try {
// 1. 调用 AI 获取新选择器
const repairResult = await AIService.suggestNewSelector({
field: params.targetField,
oldSelector: params.oldSelector,
html: params.htmlContext
});
if (repairResult && repairResult.newSelector) {
// 2. 记录修复记录
await this.recordRepair({
platform: params.platform,
field: params.targetField,
old_selector: params.oldSelector,
new_selector: repairResult.newSelector,
confidence: repairResult.confidence,
status: 'pending_verification'
});
return {
success: true,
newSelector: repairResult.newSelector,
confidence: repairResult.confidence
};
}
return { success: false, confidence: 0 };
} catch (err: any) {
logger.error(`[SelfHealing] Repair failed: ${err.message}`);
return { success: false, confidence: 0 };
}
}
/**
* 记录修复动作
*/
private static async recordRepair(data: any) {
await db(this.TABLE_NAME).insert({
...data,
created_at: new Date(),
updated_at: new Date()
});
}
/**
* 获取缓存的已修复选择器
*/
static async getHealedSelector(platform: string, field: string): Promise<string | null> {
const record = await db(this.TABLE_NAME)
.where({ platform, field, status: 'verified' })
.orderBy('created_at', 'desc')
.first();
return record ? record.new_selector : null;
}
/**
* 初始化数据库表
*/
static async initTable() {
const exists = await db.schema.hasTable(this.TABLE_NAME);
if (!exists) {
logger.info(`📦 Creating ${this.TABLE_NAME} table...`);
await db.schema.createTable(this.TABLE_NAME, (table) => {
table.increments('id').primary();
table.string('platform', 32).notNullable();
table.string('field', 64).notNullable();
table.string('old_selector', 255).notNullable();
table.string('new_selector', 255).notNullable();
table.float('confidence').defaultTo(0);
table.string('status', 32).defaultTo('pending_verification'); // pending_verification, verified, failed
table.timestamps(true, true);
table.index(['platform', 'field']);
});
logger.info(`✅ Table ${this.TABLE_NAME} created`);
}
}
}