CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Overview
DataNexus 后端服务。FastAPI + SQLAlchemy 2.0 async,提供 HTTP REST API 和 MCP 协议双出口,共享业务逻辑层。
Tech Stack
- Python 3.12+
- FastAPI (异步 Web 框架)
- SQLAlchemy 2.0 (async ORM, Mapped 类型注解)
- PostgreSQL (平台数据库,asyncpg 驱动)
- Pydantic v2 + pydantic-settings (配置 & 校验)
- python-jose (JWT)
- cryptography (Fernet 加密)
- httpx (异步 HTTP 客户端,用于自定义 API 调用)
- sqlglot (SQL AST 解析,风控)
- slowapi (限流)
- mcp (MCP 协议 SDK)
Commands
cd backend
.venv/Scripts/python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
.venv/Scripts/python -c "from app.main import app; print('OK')" # 验证导入
虚拟环境位于 backend/.venv/,使用 .venv/Scripts/python.exe 执行。
Architecture
目录结构
app/
├── main.py # FastAPI 入口,lifespan 初始化默认管理员
├── core/
│ ├── config.py # Pydantic Settings (DATANEXUS_ 前缀环境变量)
│ ├── database.py # async_session_factory, engine
│ ├── security.py # JWT, hash_password, verify_password, API key hash/encrypt/decrypt
│ └── permissions.py # RBAC 权限矩阵 + require_permission() 依赖
├── models/ # SQLAlchemy ORM 模型
├── services/ # 业务逻辑层(HTTP 和 MCP 共用)
├── api/ # HTTP REST 路由
│ ├── router.py # 聚合所有子路由,前缀 /api/v1
│ ├── deps.py # get_db, get_current_user 依赖
│ └── *.py # 各资源路由模块
├── mcp/ # MCP 协议
│ ├── server.py # 工具定义 + 调用分发
│ ├── transport.py # SSE 传输层
│ └── auth.py # MCP 认证
├── datasource/
│ └── pool_manager.py # 多数据源连接池管理
└── middleware/
└── rate_limit.py # 限流配置
请求流程
HTTP: Client → FastAPI route → require_permission() → Service → DB/外部API → Response MCP: Client → SSE → mcp_server.call_tool() → _dispatch_tool() → Service → Response
关键设计
双出口共享: services/ 层被 api/ 路由和 mcp/server.py 共同调用,确保行为一致。
认证双通道:
- JWT: Authorization: Bearer ,sub="user:"
- API Key: X-API-Key header,PBKDF2 hash 验证 + Fernet 加密存储(可解密回显)
RBAC: 三角色 admin/analyst/viewer,权限格式 "resource:action",通配符 "*"。
- admin: 全部权限
- analyst: query:execute, metadata:read, audit:read, datasource:read, desensitize:read, custom_api:read
- viewer: metadata:read
SQL 风控: SqlRiskControl 使用 sqlglot 解析 AST,阻止 DML/DDL,自动注入 LIMIT。
数据源连接: pool_manager 按 datasource_id 缓存 async engine,支持 MySQL/PostgreSQL/MSSQL/Oracle。密码 Fernet 加密存储。
自定义 API 执行引擎:
- custom 模式: 简单 httpx 转发
- low_code 模式: _execute_low_code() 处理参数路由(path/query/body/header)、认证注入(bearer/basic/api_key)、body 模板、响应提取(JSONPath)
SSRF 防护: _is_ssrf_target() 阻止内网/本地地址访问。
Configuration
环境变量前缀 DATANEXUS_,或 backend/.env 文件:
| 变量 | 说明 | 默认值 |
|---|---|---|
| DATABASE_URL | 平台 PostgreSQL 连接串 | postgresql+asyncpg://postgres:postgres@localhost:5432/datanexus |
| SECRET_KEY | JWT 签名 + Fernet 密钥派生 | change-me-in-production |
| AES_KEY | 数据源密码加密 | change-me-16bytes |
| MAX_QUERY_ROWS | SQL 查询最大返回行数 | 1000 |
| DEBUG | 调试模式 | false |
API Routes
所有路由前缀 /api/v1:
| 前缀 | 模块 | 说明 |
|---|---|---|
| /auth | user.py | 登录、/me、API Key 管理 |
| /users | user_mgmt.py | 用户 CRUD(admin) |
| /datasources | datasource.py | 数据源 CRUD + 连接测试 |
| /metadata | metadata.py | 元数据浏览(表/列) |
| /query | query.py | SQL 执行 + 历史 + CSV 导出 |
| /audit | audit.py | 审计日志查询 |
| /desensitize | desensitize.py | 脱敏规则 CRUD |
| /custom-apis | custom_api.py | 自定义 API CRUD + 测试 |
| /dashboard | dashboard.py | 仪表盘统计 |
MCP 端点: /mcp/sse (SSE stream), /mcp/messages/ (tool calls)
Adding New Features
新增 HTTP 接口:
- 在 models/ 添加 ORM 模型(如需)
- 在 services/ 添加业务方法
- 在 api/ 创建路由文件,使用 require_permission()
- 在 api/router.py 注册子路由
新增 MCP 工具:
- 在 mcp/server.py list_tools() 添加 Tool 定义
- 实现 _handle_xxx() 函数(复用 services 层)
- 在 _dispatch_tool() 添加分发 case
修改权限: 编辑 core/permissions.py 的 PERMISSION_MATRIX
Conventions
- 异步优先:所有 DB 操作使用 async/await
- Service 层不直接抛 HTTPException,用 ValueError 或返回 None,由路由层转换
- 审计日志:所有写操作和敏感读操作记录到 AuditService
- 代码注释使用中文