fix(ipam): 修复IP管理页面网段筛选不生效及下拉框过窄

- Ips.vue: el-select 添加 width: 280px,修复网段下拉框过窄
- Ips.vue: query 参数 networkId → network_id(与 FastAPI snake_case 一致)
- Scan.vue: el-select 用 network.id 代替整个 network 对象作为 value,修复切换网段不生效
- enhanced_scan_service.py: 替换失效的 scapy ARP 扫描为 arp-scan 命令;扫描结果自动创建缺失 IP 记录
This commit is contained in:
Your Name
2026-07-18 09:45:09 +08:00
commit 1e1e5957e8
103 changed files with 13196 additions and 0 deletions
+260
View File
@@ -0,0 +1,260 @@
# IPAM 管理系统 - 开发文档
## 项目概述
IPAM (IP Address Management) 是一个企业级IP地址管理系统,用于自动化扫描、发现和管理网络IP资产。
## 需求优先级划分
### P0 - 核心功能(必须优先实现)
#### 1. 项目基础架构
- [ ] FastAPI 后端框架搭建
- [ ] MySQL 数据库模型设计
- [ ] Redis 缓存配置
- [ ] Celery 异步任务框架
- [ ] Docker & Docker Compose 容器化部署
#### 2. 网络与子网管理
- [ ] 网段CRUD(支持CIDR格式)
- [ ] 网段分组管理
- [ ] 网段统计视图(总IP、已用、空闲、使用率)
#### 3. IP资产台账
- [ ] IP地址实体模型
- [ ] 基础字段:IP、MAC、主机名
- [ ] IP状态管理(在线、离线、空闲、保留)
- [ ] 自定义字段扩展框架
#### 4. 基础扫描引擎
- [ ] ICMP Ping扫描
- [ ] 手动触发扫描
### P1 - 重要功能(核心功能完成后实现)
#### 1. 高级扫描功能
- [ ] ARP扫描获取MAC地址
- [ ] 反向DNS解析主机名
- [ ] 定时扫描任务调度
#### 2. SNMP设备集成
- [ ] SNMP凭据池(v2c + v3
- [ ] 网络设备台账
- [ ] SNMP连通性测试
- [ ] ARP表拉取(IP-MAC映射)
- [ ] MAC地址表拉取(MAC-端口映射)
#### 3. 告警与异常检测
- [ ] IP冲突告警
- [ ] 非授权接入告警
- [ ] 网段耗尽预警
### P2 - 增强功能
#### 1. 厂商深度发现
- [ ] Cisco/H3C私有MIB支持
- [ ] LLDP/CDP邻居发现
- [ ] 物理拓扑解析
- [ ] OUI厂商识别
#### 2. 系统管理
- [ ] 操作审计日志
- [ ] IP历史轨迹
- [ ] 角色权限控制
#### 3. 前端界面
- [ ] Vue 3 + Element Plus
- [ ] 网段大盘视图
- [ ] IP台账表格
- [ ] 网络拓扑展示
## 技术栈
### 后端
- **Web框架**: FastAPI 0.110+
- **数据库**: MySQL 8.0
- **ORM**: SQLAlchemy 2.0
- **缓存**: Redis 7.0
- **异步任务**: Celery 5.3+
- **SNMP**: pysnmp
- **网络探测**: Scapy
- **数据验证**: Pydantic 2.0
### 前端
- **框架**: Vue 3
- **UI组件**: Element Plus
- **状态管理**: Pinia
- **路由**: Vue Router 4
### 部署
- **容器化**: Docker + Docker Compose
- **反向代理**: Nginx
## 项目结构
```
ipam/
├── backend/ # 后端代码
│ ├── app/
│ │ ├── api/ # API路由
│ │ │ ├── v1/
│ │ │ │ ├── networks.py
│ │ │ │ ├── ips.py
│ │ │ │ ├── scan.py
│ │ │ │ └── devices.py
│ │ │ └── dependencies.py
│ │ ├── core/ # 核心配置
│ │ │ ├── config.py
│ │ │ ├── database.py
│ │ │ └── security.py
│ │ ├── models/ # 数据库模型
│ │ │ ├── network.py
│ │ │ ├── ip.py
│ │ │ ├── device.py
│ │ │ └── alert.py
│ │ ├── schemas/ # Pydantic模型
│ │ │ ├── network.py
│ │ │ ├── ip.py
│ │ │ └── scan.py
│ │ ├── services/ # 业务逻辑
│ │ │ ├── network_service.py
│ │ │ ├── scan_service.py
│ │ │ └── snmp_service.py
│ │ ├── tasks/ # Celery任务
│ │ │ ├── celery_app.py
│ │ │ ├── scan_tasks.py
│ │ │ └── snmp_tasks.py
│ │ └── main.py
│ ├── requirements.txt
│ ├── Dockerfile
│ └── .env.example
├── frontend/ # 前端代码
│ ├── src/
│ ├── package.json
│ └── Dockerfile
├── docker-compose.yml
├── docs/ # 文档
│ └── DEVELOPMENT.md
└── README.md
```
## 数据库设计
### 核心表结构
#### networks(网段表)
```sql
id INT PRIMARY KEY
cidr VARCHAR(50) UNIQUE -- 如: 192.168.1.0/24
name VARCHAR(100)
description TEXT
group_name VARCHAR(100) -- 分组名称
gateway VARCHAR(50)
vlan_id INT
total_ips INT
used_ips INT DEFAULT 0
reserved_ips INT DEFAULT 0
created_at DATETIME
updated_at DATETIME
```
#### ip_addressesIP地址表)
```sql
id INT PRIMARY KEY
network_id INT FOREIGN KEY
ip_address VARCHAR(50) UNIQUE
mac_address VARCHAR(50) NULL
hostname VARCHAR(255) NULL
status ENUM('available', 'online', 'offline', 'reserved')
owner VARCHAR(100) NULL
business_type VARCHAR(50) NULL
notes TEXT NULL
custom_fields JSON -- 自定义字段
last_seen DATETIME NULL
created_at DATETIME
updated_at DATETIME
```
#### scan_tasks(扫描任务表)
```sql
id INT PRIMARY KEY
network_id INT NULL
task_type ENUM('ping', 'arp', 'snmp')
status ENUM('pending', 'running', 'completed', 'failed')
progress INT DEFAULT 0
started_at DATETIME NULL
completed_at DATETIME NULL
result TEXT NULL
created_at DATETIME
```
#### snmp_credentialsSNMP凭据表)
```sql
id INT PRIMARY KEY
name VARCHAR(100)
version ENUM('v2c', 'v3')
community_string VARCHAR(255) NULL -- v2c
username VARCHAR(100) NULL -- v3
auth_password VARCHAR(255) NULL -- v3
auth_protocol VARCHAR(50) NULL -- MD5, SHA
priv_password VARCHAR(255) NULL -- v3
priv_protocol VARCHAR(50) NULL -- DES, AES
created_at DATETIME
```
#### network_devices(网络设备表)
```sql
id INT PRIMARY KEY
name VARCHAR(100)
ip_address VARCHAR(50)
device_type VARCHAR(50) -- core, distribution, access
vendor VARCHAR(100) NULL
model VARCHAR(100) NULL
snmp_credential_id INT FOREIGN KEY
last_polled_at DATETIME NULL
created_at DATETIME
```
#### alerts(告警表)
```sql
id INT PRIMARY KEY
alert_type ENUM('ip_conflict', 'unauthorized', 'subnet_full')
severity ENUM('warning', 'error', 'critical')
message TEXT
resolved BOOLEAN DEFAULT FALSE
resolved_at DATETIME NULL
created_at DATETIME
```
## API 接口设计
### 网段管理
- `GET /api/v1/networks` - 获取网段列表
- `POST /api/v1/networks` - 创建网段
- `GET /api/v1/networks/{id}` - 获取网段详情
- `PUT /api/v1/networks/{id}` - 更新网段
- `DELETE /api/v1/networks/{id}` - 删除网段
- `GET /api/v1/networks/{id}/stats` - 获取网段统计数据
### IP地址管理
- `GET /api/v1/ips` - 获取IP列表
- `GET /api/v1/ips/{id}` - 获取IP详情
- `PUT /api/v1/ips/{id}` - 更新IP信息
- `GET /api/v1/ips/export` - 导出IP台账
### 扫描管理
- `POST /api/v1/scan/ping/{network_id}` - 触发Ping扫描
- `GET /api/v1/scan/tasks/{task_id}` - 获取扫描任务状态
## 开发规范
1. **代码风格**: 遵循 PEP 8,使用 black 格式化
2. **类型注解**: 使用 Python 类型注解
3. **数据库迁移**: 使用 Alembic 管理数据库迁移
4. **API文档**: FastAPI 自动生成 Swagger 文档
5. **日志**: 使用 logging 模块记录关键操作
6. **测试**: 每个模块完成后编写单元测试
## 部署说明
详见 `docker-compose.yml` 配置文件。