# 神射手 - API清单与核心逻辑 > 📅 从 app/api/ 提取 | 2026-01-31 --- ## 一、API清单 (25个) | 路由 | 方法 | 功能 | 核心逻辑 | |:-----|:-----|:-----|:---------| | /api/ai-chat | GET/POST | AI对话 | parseIntent → queryFullProfile | | /api/data-sources | GET | 数据源列表 | listDatabases + 统计 | | /api/tags | GET | 标签统计 | $sample 采样 | | /api/portrait | GET | 用户画像 | queryFullProfile | | /api/traffic-packages | GET/POST | 流量池/导出 | user_evaluation_score 分桶 | | /api/crowd-pools | GET | 人群圈选 | 按项目 getProjectPools | | /api/database-structure | GET | 血缘节点 | listDatabases + 生成节点 | | /api/channels | GET/POST | 渠道对接 | 转发到 Gateway | | /api/monitoring | GET | 系统监控 | serverStatus + 健康检查 | | /api/ai-tagging | GET/POST | AI打标 | - | | /api/cleaning-rules | GET/POST | 清洗规则 | - | | /api/users | GET | 用户列表 | - | | /api/search | POST | 智能搜索 | intelligentSearch | --- ## 二、AI对话意图解析 (核心逻辑) ```typescript // app/api/ai-chat/route.ts function parseIntent(message: string): { type: string; query?: string } { // 手机号: 1[3-9]\d{9} const phoneMatch = message.match(/(\+?86)?1[3-9]\d{9}/g) if (phoneMatch) return { type: "query_phone", query: phoneMatch[0] } // QQ号 const qqMatch = message.match(/(?:qq)?[::\s]*(\d{5,11})/i) if (qqMatch) return { type: "query_qq", query: qqMatch[1] } // 系统状态 if (msg.includes("状态") || msg.includes("统计")) return { type: "system_status" } // RFM分析 if (msg.includes("rfm") || msg.includes("估值")) return { type: "rfm_analysis" } // 高价值用户 if (msg.includes("高价值") || msg.includes("top")) return { type: "high_value_users" } return { type: "search", query: message } } ``` --- ## 三、流量池分桶逻辑 ```typescript // app/api/traffic-packages/route.ts const scoreRange = { diamond: { $gte: 3000 }, gold: { $gte: 2000, $lt: 3000 }, silver: { $gte: 1000, $lt: 2000 }, bronze: { $gte: 500, $lt: 1000 }, potential: { $lt: 500 } } // 使用 $sample 采样 const stats = await collection.aggregate([ { $sample: { size: 100000 } }, { $match: { user_evaluation_score: { $exists: true, $gt: 0 } } }, { $bucket: { groupBy: '$user_evaluation_score', boundaries: [0, 500, 1000, 2000, 3000, 10000] } } ], { maxTimeMS: 15000 }) ``` --- ## 四、人群圈选逻辑 ```typescript // app/api/crowd-pools/route.ts // 项目定义 const PROJECTS = { ckb: { db: 'KR_存客宝', coll: '用户资产统一视图', by: 'traffic_pool.pool_name' }, dlm: { db: 'KR_点了码', coll: '用户资产统一视图', by: '角色标签' }, weibo: { db: 'KR_微博', coll: '微博uid+手机' }, qq: { db: 'KR_腾讯', coll: 'QQ+手机', by: '省份' } } // 获取池内用户 const users = await collection.find({ [field]: poolId }) .skip((page - 1) * limit) .limit(limit) .project({ phone: 1, name: 1, ... }) .toArray() ``` --- ## 五、关联文档 - [接口定义规范.md](./接口定义规范.md) - [../6、后端/MongoDB连接器核心.md](../6、后端/MongoDB连接器核心.md)