Spider 当前已具备完整的商户采集、清洗、分级、跟进核心流程。本设计覆盖 11 个功能点,分三个阶段实现,目标是将 Spider 从工具升级为成熟的运营平台。
数据模型: merchants_clean 新增 assigned_to VARCHAR(50) INDEX 字段。
后端 API:
PUT /api/v1/merchants/clean/:id/assign — body: {assigned_to: "username"},admin/operator 可用PUT /api/v1/merchants/clean/batch-assign — body: {ids: [1,2,3], assigned_to: "username"}GET /api/v1/merchants/clean 增加 assigned_to query 参数筛选前端:
后端 API:
PUT /api/v1/merchants/clean/batch-follow-status — body: {ids: [], follow_status: "contacted"}PUT /api/v1/merchants/clean/batch-level — body: {ids: [], level: "Hot"}batch-assign 和 batch-delete前端:
后端 API:
POST /api/v1/merchants/clean/import — multipart/form-data 上传 CSVtg_username 列,可选列:merchant_name, website, email, phone, industry_tag, level{imported: 10, skipped: 3, failed: 1, errors: ["row 5: invalid level"]}前端:
路由: /merchants/:id,独立页面
布局:
列表页联动: 商户名列和查看按钮都链接到详情页
数据模型:
audit_logs:
id BIGINT PK AUTO_INCREMENT
username VARCHAR(50) INDEX -- 操作人
action VARCHAR(50) INDEX -- create/update/delete/assign/import/login/export
target_type VARCHAR(50) INDEX -- merchant/user/keyword/schedule/setting/task
target_id VARCHAR(100) -- 目标 ID 或标识
detail JSON -- 变更前后的字段差异 {field: {old: x, new: y}}
ip VARCHAR(45)
created_at DATETIME INDEX
后端:
GET /api/v1/audit-logs — 分页查询,支持 username/action/target_type/date_range 筛选(admin only)logAudit(c *gin.Context, action, targetType, targetID string, detail interface{}) 供各 handler 调用前端:
数据模型:
notification_configs:
id INT PK AUTO_INCREMENT
name VARCHAR(100)
event_type VARCHAR(50) -- task_completed/task_failed/new_hot_merchant/schedule_run
channel VARCHAR(20) -- webhook/tg_bot
config JSON -- {url: "..."} 或 {bot_token: "...", chat_id: "..."}
enabled BOOL DEFAULT true
created_at DATETIME
updated_at DATETIME
后端:
internal/notification/ 包:Notifier 接口 + WebhookNotifier + TgBotNotifier 实现GET/POST/PUT/DELETE /api/v1/notification-configs — CRUD 通知配置(admin)POST /api/v1/notification-configs/:id/test — 发送测试通知前端:
后端 API:
GET /api/v1/system/health — 返回各组件状态
前端:
后端:
POST /api/v1/merchants/archive — 将满足条件的商户移入归档表 merchants_archived
GET /api/v1/merchants/archived — 查看归档数据(只读,分页)POST /api/v1/merchants/archived/:id/restore — 恢复单条数据数据模型: merchants_archived 与 merchants_clean 结构一致,增加 archived_at DATETIME 和 archive_reason VARCHAR(100)
前端:
后端 API:
GET /api/v1/analytics/funnel — 返回各阶段数量
{
"raw_total": 5000,
"clean_total": 1200,
"valid_total": 980,
"contacted": 320,
"cooperating": 85,
"rejected": 45,
"conversion_rates": {
"raw_to_clean": 0.24,
"clean_to_valid": 0.817,
"valid_to_contacted": 0.327,
"contacted_to_cooperating": 0.266
}
}
前端:
后端 API:
GET /api/v1/analytics/source-efficiency — 按来源类型和关键词统计
{
"by_source_type": [
{"source_type": "tg_channel", "raw_count": 3000, "clean_count": 800, "hot_count": 120, "efficiency": 0.04},
{"source_type": "web", "raw_count": 1500, "clean_count": 300, "hot_count": 50, "efficiency": 0.033}
],
"top_keywords": [
{"keyword": "担保", "merchants_found": 230, "hot_count": 45},
{"keyword": "支付", "merchants_found": 180, "hot_count": 30}
],
"top_groups": [
{"group_username": "xxx", "members_found": 150, "valid_count": 80}
]
}
前端:
后端 API:
GET /api/v1/analytics/trends — query: period=week|month, range=30|90|180
{
"period": "week",
"data": [
{"period_label": "2026-W14", "raw_added": 500, "clean_added": 120, "contacted": 30, "cooperating": 5},
{"period_label": "2026-W15", "raw_added": 600, "clean_added": 150, "contacted": 45, "cooperating": 8}
]
}
前端: