{
  "generated_at": "2026-03-20T00:00:00+08:00",
  "project": "JobData - 招聘数据采集与统计分析平台",
  "scan_coverage": {
    "estimated_total_files": 220,
    "scanned_files": 35,
    "coverage_percent": 16,
    "note": "node_modules 已排除；覆盖全部核心业务文件，node_modules 约占总文件数 90% 以上"
  },
  "ignored_directories": [
    { "path": "web/node_modules", "reason": ".gitignore 规则" },
    { "path": "__pycache__", "reason": ".gitignore 规则" },
    { "path": ".venv / venv", "reason": ".gitignore 规则" },
    { "path": "migrations", "reason": ".gitignore 规则" },
    { "path": "clickhouse_data / data", "reason": ".gitignore 规则" }
  ],
  "modules": [
    {
      "path": "app",
      "language": "Python 3.13",
      "framework": "FastAPI 0.111 + Tortoise-ORM 0.23",
      "entry": "app/__init__.py",
      "startup_script": "run.py",
      "config": "app/settings/config.py",
      "api_prefix": "/api/v1",
      "routes": [
        "/base", "/user", "/role", "/menu", "/api", "/dept", "/auditlog",
        "/job", "/universal", "/token", "/proxy", "/stats", "/pipeline",
        "/keyword", "/cleaning", "/analytics", "/company"
      ],
      "databases": {
        "mysql": "Tortoise-ORM, 表: user/role/api/menu/dept/auditlog/boss_token/cleaning_*/metrics_*",
        "clickhouse": "直接连接, 表: boss_job/boss_company/qcwy_job/qcwy_company/zhilian_job/zhilian_company/pending_company, 视图: job_analytics"
      },
      "scheduler_tasks": [
        "stats_job (每6h)", "ecs_full_pipeline (每6h)",
        "ip_alert_job (每10min)", "company_cleaning_job (每5min)",
        "daily_cleanup_job (每天00:05)"
      ],
      "test_exists": false,
      "gaps": ["缺少单元测试", "缺少集成测试", "config.py 中有硬编码凭据"]
    },
    {
      "path": "web",
      "language": "JavaScript (Vue 3)",
      "framework": "Vue 3.3 + Vite 4 + Naive UI + Pinia",
      "entry": "web/src/main.js",
      "build_cmd": "pnpm build",
      "dev_cmd": "pnpm dev",
      "key_views": [
        "views/analytics/index.vue",
        "views/cleaning/index.vue",
        "views/recruitment/boss|qcwy|zhilian/index.vue",
        "views/system/*"
      ],
      "api_layer": "web/src/api/",
      "state_management": "Pinia (user, permission, app, tags)",
      "test_exists": false,
      "gaps": ["缺少 Vitest 单元测试", "缺少 Playwright E2E 测试"]
    },
    {
      "path": "jobs_spider",
      "language": "Python",
      "sub_modules": ["boss", "qcwy", "zhilian"],
      "entry": {
        "boss": "jobs_spider/boss/boos_api.py (死循环主入口)",
        "qcwy": "jobs_spider/qcwy/run_company_search.py",
        "zhilian": "jobs_spider/zhilian/company_spider.py"
      },
      "push_api": "POST /api/v1/universal/data/batch-store-async",
      "anti_crawl": ["SmartIPManager (代理池轮换)", "随机延迟>=10s", "Session 重建", "Cookie 更新"],
      "test_exists": false,
      "gaps": ["缺少 IPAnomalyDetector 单元测试", "缺少数据解析函数测试"]
    },
    {
      "path": "ecs_full_pipeline.py",
      "language": "Python",
      "description": "阿里云 ECS 实例批量创建/销毁/命令下发全流程脚本",
      "entry": "ecs_full_pipeline.py",
      "cloud": "Alibaba Cloud ECS (cn-qingdao-b, ecs.n1.tiny, 抢占实例)",
      "gaps": ["AK/SK 在代码中硬编码（安全风险）"]
    }
  ],
  "security_issues": [
    {
      "severity": "HIGH",
      "file": "app/settings/config.py",
      "issue": "MySQL 连接串（含密码）、ClickHouse 密码、SMTP 密码硬编码"
    },
    {
      "severity": "HIGH",
      "file": "ecs_full_pipeline.py",
      "issue": "阿里云 AK/SK 硬编码在 main() 函数中"
    },
    {
      "severity": "MEDIUM",
      "file": "app/settings/config.py",
      "issue": "SECRET_KEY = 'CHANGE_ME_DEV_ONLY'，生产环境需替换"
    }
  ],
  "coverage_gaps": [
    "所有模块均无自动化测试（单元/集成/E2E）",
    "jobs_spider/qcwy 和 jobs_spider/zhilian 未深度扫描",
    "app/services/company_cleaner.py 未扫描",
    "web/src/views/system/* 子目录未逐一扫描"
  ],
  "next_scan_recommendations": [
    "补扫: app/services/company_cleaner.py",
    "补扫: jobs_spider/qcwy/qcwy.py",
    "补扫: jobs_spider/zhilian/zhilian_single.py",
    "补扫: web/src/views/system/ 各子目录",
    "补扫: app/core/algorithms/ 反爬虫算法",
    "补扫: app/api/v1/cleaning/ 清洗接口实现"
  ],
  "truncated": false
}
