# DDI 管理系统
**Repository Path**: leichuanxing/DDI
## Basic Information
- **Project Name**: DDI 管理系统
- **Description**: 合力数据 DDI 管理系统是一个基于 Python + Django 开发的轻量级网络资源管理平台,统一管理企业内部的 IP 地址(IPAM)、DHCP 地址分配 和 DNS 解析记录。系统采用中文本土化设计,内置服务模拟引擎与网络探测功能,适合中小型企业的网络运维场景。
- **Primary Language**: Python
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 3
- **Created**: 2026-04-19
- **Last Updated**: 2026-04-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 合力数据 DDI 管理系统 v1.0
DDI (DNS + DHCP + IPAM) 网络资源统一管理平台
---
## 一、项目简介
**合力数据 DDI 管理系统** 是一套基于 **Python / Django** 开发的轻量级 Web 网络基础设施管理平台,统一管理企业内部的 **IP 地址(IPAM)**、**DHCP 地址分配** 和 **DNS 域名解析记录**。系统采用中文本土化设计,内置 DNS/DHCP 服务模拟引擎与网络探测功能,适合中小型企业的网络运维场景。
### 核心亮点
| 特性 | 说明 |
|------|------|
| **DDI 三合一** | IPAM + DNS + DHCP 统一管理,告别分散维护 |
| **网络探测子系统** | 内置 Ping / 端口扫描 / 拓扑发现引擎,后台异步执行 |
| **服务模拟引擎** | DNS 服务端模拟 (~36KB) + DHCP 服务模拟 (~19KB) |
| **服务健康探测** | DNS 记录级别端口可达性探测 + 持久化定时任务 |
| **全链路审计** | 操作日志 + 登录日志双轨记录,支持多维度筛选 |
| **多接口设备** | 支持一台设备多个网卡 (DeviceInterface),IP 可搜索关联绑定 |
| **轻量依赖** | 仅需 `Django` + `gunicorn` 两个包即可运行 |
---
## 二、功能模块总览
### 界面预览

### 各模块详细说明
| 模块 | 路由前缀 | 核心功能 |
|------|----------|----------|
| **仪表盘** | `/` | 全局统计卡片(10项指标)、IP使用率饼图、子网柱状图、DNS类型分布饼图、VLAN分布图、告警面板、最近15条操作日志 |
| **IPAM** | `/ipam/` | 区域/VLAN/子网/IP四级层级管理、CIDR自动计算、单IP分配/批量分配/释放保留、Ping探测、端口扫描、实时拓扑图、CSV导出、自动发现规则 |
| **DNS 管理** | `/dns/` | 正向/反向区域管理、7种记录类型(A/AAAA/CNAME/PTR/MX/TXT/NS)、PTR自动建议/FQDN生成、DNS解析在线测试、服务启停控制(转发器/缓存)、健康探测任务、查询日志 |
| **DHCP 管理** | `/dhcp/` | 地址池CRUD(起止地址/网关/DNS/租期)、排除地址范围、租约记录与释放、过期租约检查、DHCP服务启停控制 |
| **设备管理** | `/devices/` | 11种设备类型登记、多网卡接口支持、IP关联绑定(带Select2搜索选择)、设备删除确认、DNS记录联动查询 |
| **用户认证** | `/accounts/` | 登录/登出、用户CRUD(含密码修改)、4种角色(admin/network_admin/operator/auditor)、账号启用禁用、登录成功/失败日志 |
| **审计日志** | `/logs/` | 全量操作记录追溯、按模块/时间/用户筛选、变更前后值对比展示 |
---
## 三、技术栈
| 层面 | 技术 | 版本 |
|------|------|------|
| **后端框架** | Python / Django | >=4.2, <5.0 |
| **前端 UI** | Django Template / Bootstrap 5 / Chart.js / Bootstrap Icons | 5.3 / 4.x / 1.x |
| **前端增强** | Select2 (jQuery插件) | — (CDN引入) |
| **数据库** | SQLite 3 | 可迁移至 MySQL/PostgreSQL |
| **WSGI 服务器** | Gunicorn (生产) / Django Dev Server (开发) | >=21.0 |
| **语言/时区** | 简体中文 (zh-hans) / Asia/Shanghai | — |
| **认证方式** | Django Session Auth (扩展 User 模型) | — |
---
## 四、快速开始
### 前置要求
- Python 3.11+
- pip 包管理器
### 安装步骤
```bash
# 1. 安装依赖
pip install -r requirements.txt
# 2. 数据库迁移
python manage.py makemigrations
python manage.py migrate
# 3. 初始化示例数据(推荐首次运行)
python init_data.py
# 4. 启动开发服务器
python manage.py runserver 0.0.0.0:8000
```
### 访问系统
打开浏览器访问:`http://127.0.0.1:8000/`
| 项目 | 值 |
|------|-----|
| 默认账号 | `admin` |
| 默认密码 | `Admin@123` |
### 快捷脚本启动/停止
```bash
# 开发模式启动
./start.sh dev # Django runserver, http://0.0.0.0:8000
# 生产模式启动(Gunicorn 后台守护进程)
./start.sh prod # Gunicorn 4 workers, http://0.0.0.0:8000
# 停止服务(优雅停止 / 强制停止)
./stop.sh # 优雅停止
./stop.sh -k # 强制停止 (SIGKILL)
```
### 生产环境部署
```bash
# 收集静态文件
python manage.py collectstatic
# 使用 Gunicorn 启动
gunicorn ddi_system.wsgi --bind 0.0.0.0:8000 --workers 4
```
---
## 五、项目结构
```
ddi_system/
├── manage.py # Django 入口文件
├── init_data.py # 初始化数据脚本 (角色/管理员/示例数据)
├── requirements.txt # 依赖: Django + gunicorn
├── start.sh # 启动脚本 (dev/prod 模式)
├── stop.sh # 停止脚本 (优雅/强制)
├── README.md # 本文档
│
├── ddi_system/ # Django 项目配置包
│ ├── settings.py # 全局配置 (INSTALLED_APPS/数据库/中间件)
│ ├── urls.py # 主路由分发 (7 个模块)
│ ├── wsgi.py # WSGI 部署入口
│ └── asgi.py # ASGI 异步入口
│
├── accounts/ # 用户认证与角色管理
│ ├── models.py # Role, User(AbstractUser), LoginLog
│ ├── views.py # 登录/登出/CRUD/重置密码
│ ├── forms.py # 登录/用户创建/编辑表单
│ └── urls.py # 路由定义
│
├── dashboard/ # 首页仪表盘
│ ├── views.py # index() 统计聚合视图
│ └── templates/index.html # 仪表盘页面 (卡片+图表)
│
├── ipam/ # IP 地址管理 (最复杂模块)
│ ├── models.py # Region, VLAN, Subnet, IPAddress
│ ├── views.py # CRUD + 分配/释放/批量操作
│ ├── forms.py # CIDR/MAC 校验表单
│ ├── scan_models.py # ScanTask/DiscoveryRule/ProbeResult/TopologyNode
│ ├── scan_views.py # 探测视图
│ ├── scanner.py # Ping/端口扫描/TCP引擎
│ └── urls.py # 含探测 API 共 28 条路由
│
├── dnsmgr/ # DNS 管理 (最大模块)
│ ├── models.py # DNSSettings/DNSZone/DNSRecord/ProbeTask/DNSQueryLog
│ ├── views.py # 区域/记录/探测/解析测试/服务配置
│ ├── forms.py # DNS 记录表单 (7种类型智能字段)
│ ├── dns_server.py # DNS 服务核心实现 (~36KB)
│ └── urls.py # 共 20 条路由
│
├── dhcpmgr/ # DHCP 管理
│ ├── models.py # DHCPPool/DHCPExclusion/DHCPLease
│ ├── views.py # 地址池/排除/租约/DHCP 服务
│ ├── dhcp_server.py # DHCP 服务模拟 (~19KB)
│ └── urls.py # 共 14 条路由
│
├── devices/ # 设备/主机管理
│ ├── models.py # Device, DeviceInterface (多网卡)
│ ├── views.py # 设备 CRUD + IP 关联
│ ├── forms.py # 设备表单 (含 IP 地址 Select2 搜索)
│ └── urls.py # 共 6 条路由
│
├── logs/ # 日志审计
│ ├── models.py # OperationLog
│ ├── views.py # 操作日志列表与筛选
│ └── urls.py # 操作日志路由
│
├── common/ # 公共工具包
│ ├── ip_utils.py # IP 工具 (CIDR验证/PTR生成/网段计算)
│ └── logger.py # 操作日志统一记录器
│
└── templates/ # HTML 模板 (47 个文件)
├── base.html # 布局基座 (固定侧边栏 + 顶栏 + 响应式)
├── accounts/ # 登录页/用户列表/表单/登录日志
├── dashboard/ # 仪表盘 (统计卡片 + 4 组 Chart.js 图表)
├── ipam/ # 区域/VLAN/子网/IP 列表详情表单 + 探测全套页面
├── dnsmgr/ # DNS 服务页(缓存按钮组)/区域详情/记录表单/探测/解析日志
├── dhcpmgr/ # 地址池详情/租约列表/排除/服务状态
├── devices/ # 设备列表/详情/表单/删除确认
└── logs/ # 操作日志
```
---
## 六、URL 路由一览
| 前缀 | 模块 | 主要路径 | 数量 |
|------|------|----------|------|
| `/admin/` | Django Admin | 后台管理 | — |
| `/accounts/` | 用户认证 | `login`, `logout`, `users/*`, `roles/*`, `login-log/*` | 9 |
| `/dashboard/` | 仪表盘 | `index` (首页) | 1 |
| `/ipam/` | IPAM | `regions/*`, `vlans/*`, `subnets/*`, `ips/*`, `scan/*`, `api/*` | 28 |
| `/dns/` | DNS | `service/*`, `zones/*`, `records/*`, `probe/*`, `query-log/*` | 20 |
| `/dhcp/` | DHCP | `pools/*`, `exclusions/*`, `leases/*`, `service/*` | 14 |
| `/devices/` | 设备 | `(list)`, `create`, `/edit`, `/delete`, `/link-ip/` | 6 |
| `/logs/` | 日志 | `operation_log` | 1 |
**总计**: 79+ 条 URL 路由
---
## 七、数据模型概览
```
accounts
├── Role (id, name, code, description)
├── User (username, password, email, real_name, phone,
│ department, role→FK[Role], is_active, last_login_ip)
└── LoginLog (user→FK[User], username, ip_address, user_agent, status)
ipam
├── Region (id, name, code, description) [subnet_count, vlan_count]
├── VLAN (id, vlan_id, name, region→FK[Region], purpose, gateway)
├── Subnet (id, name, cidr, gateway, prefix_len,
│ region→FK, vlan→FK, purpose)
│ [total_ips, allocated_ips, available_ips, usage_percent]
└── IPAddress (id, ip_address, subnet→FK[Subnet], status, hostname,
mac_address, device_name, owner, department, device_type,
binding_type, dns_linked, notes, created_by→FK)
dnsmgr
├── DNSSettings (id, enable_forward, forwarders, listen_port,
│ default_ttl, listen_address, enable_cache, cache_ttl)
├── DNSZone (id, name, zone_type, primary_dns)
│ [record_count, enabled_record_count]
├── DNSRecord (id, name, record_type, value, ttl, zone→FK,
│ linked_ip, status, probe_port, priority)
├── ProbeTask (id, name, target, port, interval, status,
│ total_probes, reachable_count, history(JSON))
└── DNSQueryLog (id, query_name, query_type, client_ip,
result_source, answer_data, rcode, response_time_ms)
dhcpmgr
├── DHCPPool (id, name, subnet→FK[Subnet], start_address, end_address,
│ gateway, dns_servers, lease_time, status)
│ [total_addresses, allocated_count, available_count]
├── DHCPExclusion (id, pool→FK, start_ip, end_ip, reason)
└── DHCPLease (id, ip_address, mac_address, hostname,
start_time, end_time, status, pool→FK)
devices
├── Device (id, hostname, device_name, device_type, manager,
│ department, mac_address, os, region→FK, ip_address→FK)
│ [linked_dns_records]
└── DeviceInterface (id, device→FK, name, mac_address, ip_address→FK, is_primary)
logs
└── OperationLog (id, user→FK, module, action, object_type,
old_value, new_value, ip_address, operation_time)
```
**总计**: 18 个业务数据模型
---
## 八、初始化数据说明
执行 `python init_data.py` 将按顺序创建以下数据:
| 步骤 | 函数 | 创建内容 |
|------|------|----------|
| **1/6** | `create_roles()` | 4 种系统角色: 系统管理员 / 网络管理员 / 运维人员 / 审计用户 |
| **2/6** | `create_admin_user()` | 管理员账户: `admin` / `Admin@123` (邮箱 admin@example.com) |
| **3/6** | `create_sample_regions()` | 4 个区域: 总部机房(HQ)、研发中心(R&D)、办公区A/B栋 |
| **4/6** | `sample_vlans()` + `sample_subnets()` | 5 个 VLAN + 4 个子网 (办公/服务器/DMZ/访客),自动生成完整 IP 池 |
| **5/6** | `sample_dns()` + `sample_dhcp()` | example.com 正向区域 (8 条记录) + 反向区域; DHCP 地址池 + 排除范围 + 3 条模拟租约 |
| **6/6** | `sample_devices()` | 5 台示例设备 (Web/DB 服务器、交换机、防火墙、PC),自动关联 IP |
> **注意**: 必须先完成 `migrate` 再运行此脚本。
---
## 九、用户角色体系
| 角色 | 编码 | 权限范围 |
|------|------|----------|
| **系统管理员** | `admin` | 全部权限:用户管理、系统配置、所有模块读写 |
| **网络管理员** | `network_admin` | IPAM / DNS / DHCP 全部资源管理 |
| **运维人员** | `operator` | 资源查询、IP 申请/释放/保留、主机信息维护 |
| **审计用户** | `auditor` | 只读访问:可查看所有资源和变更记录日志 |
---
## 十、核心业务规则
1. **CIDR 校验**: 子网必须符合标准 CIDR 格式 (`192.168.1.0/24`),创建时自动计算掩码位数
2. **IP 唯一性**: 同一子网内每个 IP 只能有一条记录 (`unique_together`)
3. **状态约束**: 同一 IP 同一时刻只能有一个有效占用状态 (available/allocated/reserved/conflict/disabled)
4. **DHCP 边界**: 地址池起止地址不能超出所属子网范围
5. **DNS 关联**: A 记录绑定的 IP 必须为合法且已存在的 IPAddress
6. **保留保护**: 已标记为 reserved 的 IP 地址不可重复分配
7. **网关保留**: 子网创建时网关地址自动标记为 reserved 状态
8. **删除确认**: 所有删除操作均需要二次确认弹窗
9. **密码强度**: 编辑用户修改密码时需 >=8 位且包含字母和数字
10. **日志上限**: DNS 解析日志最多存储 10000 条,超出自动清理最旧记录
---
## 十一、系统截图预览
### 登录页
- 渐变背景 + 居中卡片布局
- 显示默认账号提示
### 首页仪表盘
- 4 个统计卡片 (运行状态/累计查询/缓存条目/区域数)
- 4 组 Chart.js 图表: IP使用率环形图、子网堆叠柱状图、DNS记录类型分布饼图、VLAN横向柱状图
- 告警面板 (高使用率/冲突IP检测)
- 最近操作记录
### 左侧导航栏
- 固定侧边栏,展开态 / 收起态
- 6 个一级菜单分组 + 折叠二级菜单
- 当前页面精确高亮
- 底部显示当前用户信息
### DNS 服务管理页
- 外部转发器地址输入框 + 启用开关一体化布局
- 查询缓存开关 (按钮组 [开启][关闭])
- 配置摘要面板 + 公共DNS快捷添加
- 解析流程可视化步骤
### 设备管理
- 设备列表 (含删除按钮)
- 编辑时可搜索关联 IP 地址 (Select2 下拉框)
- 删除二次确认页面
---
## 十二、扩展建议
本系统为第一阶段基础版本,后续可扩展的方向:
- [ ] RESTful API 接口层 (Django REST Framework)
- [ ] Excel / CSV 批量导入导出
- [ ] BIND / ISC-DHCP 配置文件自动生成与下发
- [ ] 对接真实 DNS (BIND9/PowerDNS) / DHCP (ISC-DHCP/Kea) 服务
- [ ] IPv6 地址全链路管理
- [ ] IP 地址审批工作流与告警通知 (邮件/钉钉/企微)
- [ ] 多租户 / 多组织隔离
- [ ] RBAC 细粒度权限 (对象级别权限控制)
- [ ] 前后端分离 (Vue.js / React 前端)
- [ ] Docker 容器化部署与 Compose 编排
---
## 联系作者(请备注软件名称)

---
## 许可证
Apache License 2.0
Copyright (c) 2026 合力数据 (HeliData). All rights reserved.