diff --git a/dns.md b/dns.md
new file mode 100644
index 0000000..fedf70b
--- /dev/null
+++ b/dns.md
@@ -0,0 +1,873 @@
+# DNS 管理 API 文档
+
+## 概述
+
+本文档描述了 DNS 管理系统的 API 接口,包括 DNS 服务器、DNS 区域和 DNS 记录的增删改查操作。
+
+## 基础信息
+
+- 基础路径: `/dns`
+- 请求方法: POST
+- 认证: 需要在请求头中携带认证 token
+
+## 常量定义
+
+### DNS 服务器状态
+
+| 值 | 说明 |
+|----|------|
+| 0 | 已停止 |
+| 1 | 运行中 |
+| 2 | 错误 |
+
+### DNS 记录类型
+
+| 值 | 类型 | 说明 |
+|----|------|------|
+| 1 | A | IPv4 地址记录 |
+| 28 | AAAA | IPv6 地址记录 |
+| 5 | CNAME | 别名记录 |
+| 15 | MX | 邮件交换记录 |
+| 2 | NS | 名称服务器记录 |
+| 6 | SOA | 起始授权记录 |
+| 16 | TXT | 文本记录 |
+| 33 | SRV | 服务位置记录 |
+
+## DNS 服务器接口
+
+### 1. 创建 DNS 服务器
+
+**接口路径**: `/dns/server/create`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| name | string | 是 | DNS 服务器名称 |
+| port | uint | 否 | 监听端口,默认 53 |
+| listen_ip | string | 否 | 监听 IP,默认 0.0.0.0 |
+| upstream_dns | string | 否 | 上游 DNS 服务器,多个用逗号分隔 |
+| enable_recursion | bool | 否 | 是否启用递归查询 |
+| description | string | 否 | 描述 |
+
+**请求示例**:
+
+```json
+{
+ "name": "我的 DNS 服务器",
+ "port": 53,
+ "listen_ip": "0.0.0.0",
+ "upstream_dns": "8.8.8.8,8.8.4.4",
+ "enable_recursion": true,
+ "description": "个人 DNS 服务器"
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "创建DNS服务器成功",
+ "data": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "user_id": 1,
+ "name": "我的 DNS 服务器",
+ "port": 53,
+ "listen_ip": "0.0.0.0",
+ "upstream_dns": "8.8.8.8,8.8.4.4",
+ "enable_recursion": true,
+ "status": 0,
+ "description": "个人 DNS 服务器"
+ }
+}
+```
+
+### 2. 获取 DNS 服务器
+
+**接口路径**: `/dns/server/get`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| server_id | uint | 否 | DNS 服务器 ID,0 表示获取全部 |
+| get_type | int | 否 | 获取类型:0 获取自己的,1 获取全部(管理员) |
+
+**请求示例**:
+
+```json
+{
+ "server_id": 1,
+ "get_type": 0
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "获取DNS服务器成功",
+ "data": [
+ {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "user_id": 1,
+ "name": "我的 DNS 服务器",
+ "port": 53,
+ "listen_ip": "0.0.0.0",
+ "upstream_dns": "8.8.8.8,8.8.4.4",
+ "enable_recursion": true,
+ "status": 0,
+ "description": "个人 DNS 服务器"
+ }
+ ]
+}
+```
+
+### 3. 更新 DNS 服务器
+
+**接口路径**: `/dns/server/update`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| server_id | uint | 是 | DNS 服务器 ID |
+| name | string | 否 | DNS 服务器名称 |
+| port | uint | 否 | 监听端口 |
+| listen_ip | string | 否 | 监听 IP |
+| upstream_dns | string | 否 | 上游 DNS 服务器 |
+| enable_recursion | bool | 否 | 是否启用递归查询 |
+| status | uint | 否 | 状态:0 停止,1 运行中,2 错误 |
+| description | string | 否 | 描述 |
+
+**请求示例**:
+
+```json
+{
+ "server_id": 1,
+ "name": "更新后的 DNS 服务器",
+ "status": 1
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "更新DNS服务器成功",
+ "data": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T01:00:00Z",
+ "DeletedAt": null,
+ "user_id": 1,
+ "name": "更新后的 DNS 服务器",
+ "port": 53,
+ "listen_ip": "0.0.0.0",
+ "upstream_dns": "8.8.8.8,8.8.4.4",
+ "enable_recursion": true,
+ "status": 1,
+ "description": "个人 DNS 服务器"
+ }
+}
+```
+
+### 4. 删除 DNS 服务器
+
+**接口路径**: `/dns/server/delete`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| server_id | uint | 否 | DNS 服务器 ID |
+| del_type | uint | 是 | 删除类型:0 删除单条,1 删除所有 |
+
+**请求示例**:
+
+```json
+{
+ "server_id": 1,
+ "del_type": 0
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "删除DNS服务器成功"
+}
+```
+
+## DNS 区域接口
+
+### 5. 创建 DNS 区域
+
+**接口路径**: `/dns/zone/create`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| server_id | uint | 是 | 所属 DNS 服务器 ID |
+| domain | string | 是 | 域名,如 example.com |
+| soa_mname | string | 否 | SOA 记录的主域名服务器 |
+| soa_rname | string | 否 | SOA 记录的管理员邮箱 |
+| soa_serial | uint | 否 | SOA 记录的序列号,默认 1 |
+| soa_refresh | uint | 否 | SOA 记录的刷新时间(秒),默认 86400 |
+| soa_retry | uint | 否 | SOA 记录的重试时间(秒),默认 7200 |
+| soa_expire | uint | 否 | SOA 记录的过期时间(秒),默认 3600000 |
+| soa_minimum | uint | 否 | SOA 记录的最小 TTL(秒),默认 3600 |
+| ttl | uint | 否 | 默认 TTL(秒),默认 3600 |
+| description | string | 否 | 描述 |
+
+**请求示例**:
+
+```json
+{
+ "server_id": 1,
+ "domain": "example.com",
+ "soa_mname": "ns1.example.com",
+ "soa_rname": "admin.example.com",
+ "description": "示例域名"
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "创建DNS区域成功",
+ "data": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "server_id": 1,
+ "domain": "example.com",
+ "soa_mname": "ns1.example.com",
+ "soa_rname": "admin.example.com",
+ "soa_serial": 1,
+ "soa_refresh": 86400,
+ "soa_retry": 7200,
+ "soa_expire": 3600000,
+ "soa_minimum": 3600,
+ "ttl": 3600,
+ "description": "示例域名"
+ }
+}
+```
+
+### 6. 获取 DNS 区域
+
+**接口路径**: `/dns/zone/get`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| zone_id | uint | 否 | Zone ID,0 表示获取全部 |
+| server_id | uint | 否 | DNS 服务器 ID,用于过滤 |
+| get_type | int | 否 | 获取类型:0 获取自己的,1 获取全部(管理员) |
+
+**请求示例**:
+
+```json
+{
+ "zone_id": 1,
+ "get_type": 0
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "获取DNS区域成功",
+ "data": [
+ {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "server_id": 1,
+ "domain": "example.com",
+ "soa_mname": "ns1.example.com",
+ "soa_rname": "admin.example.com",
+ "soa_serial": 1,
+ "soa_refresh": 86400,
+ "soa_retry": 7200,
+ "soa_expire": 3600000,
+ "soa_minimum": 3600,
+ "ttl": 3600,
+ "description": "示例域名"
+ }
+ ]
+}
+```
+
+### 7. 更新 DNS 区域
+
+**接口路径**: `/dns/zone/update`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| zone_id | uint | 是 | Zone ID |
+| domain | string | 否 | 域名 |
+| soa_mname | string | 否 | SOA 记录的主域名服务器 |
+| soa_rname | string | 否 | SOA 记录的管理员邮箱 |
+| soa_serial | uint | 否 | SOA 记录的序列号 |
+| soa_refresh | uint | 否 | SOA 记录的刷新时间(秒) |
+| soa_retry | uint | 否 | SOA 记录的重试时间(秒) |
+| soa_expire | uint | 否 | SOA 记录的过期时间(秒) |
+| soa_minimum | uint | 否 | SOA 记录的最小 TTL(秒) |
+| ttl | uint | 否 | 默认 TTL(秒) |
+| description | string | 否 | 描述 |
+
+**请求示例**:
+
+```json
+{
+ "zone_id": 1,
+ "description": "更新后的描述"
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "更新DNS区域成功",
+ "data": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T01:00:00Z",
+ "DeletedAt": null,
+ "server_id": 1,
+ "domain": "example.com",
+ "soa_mname": "ns1.example.com",
+ "soa_rname": "admin.example.com",
+ "soa_serial": 1,
+ "soa_refresh": 86400,
+ "soa_retry": 7200,
+ "soa_expire": 3600000,
+ "soa_minimum": 3600,
+ "ttl": 3600,
+ "description": "更新后的描述"
+ }
+}
+```
+
+### 8. 删除 DNS 区域
+
+**接口路径**: `/dns/zone/delete`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| zone_id | uint | 否 | Zone ID |
+| del_type | uint | 是 | 删除类型:0 删除单条,1 删除所有 |
+
+**请求示例**:
+
+```json
+{
+ "zone_id": 1,
+ "del_type": 0
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "删除DNS区域成功"
+}
+```
+
+## DNS 记录接口
+
+### 9. 创建 DNS 记录
+
+**接口路径**: `/dns/record/create`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| zone_id | uint | 是 | 所属 Zone ID |
+| name | string | 是 | 记录名称,如 www 或 @ |
+| type | uint | 是 | 记录类型:1=A, 28=AAAA, 5=CNAME, 15=MX 等 |
+| value | string | 否 | 记录值 |
+| ttl | uint | 否 | TTL(秒),如果为 0 则使用 Zone 的默认 TTL |
+| priority | uint | 否 | 优先级(用于 MX、SRV 等记录) |
+| weight | uint | 否 | 权重(用于 SRV 记录) |
+| port | uint | 否 | 端口(用于 SRV 记录) |
+| target | string | 否 | 目标(用于 SRV 记录) |
+
+**请求示例 - A 记录**:
+
+```json
+{
+ "zone_id": 1,
+ "name": "www",
+ "type": 1,
+ "value": "192.168.1.1",
+ "ttl": 3600
+}
+```
+
+**请求示例 - CNAME 记录**:
+
+```json
+{
+ "zone_id": 1,
+ "name": "mail",
+ "type": 5,
+ "value": "mailserver.example.com",
+ "ttl": 3600
+}
+```
+
+**请求示例 - MX 记录**:
+
+```json
+{
+ "zone_id": 1,
+ "name": "@",
+ "type": 15,
+ "value": "mx1.example.com",
+ "ttl": 3600,
+ "priority": 10
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "创建DNS记录成功",
+ "data": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "zone_id": 1,
+ "name": "www",
+ "type": 1,
+ "value": "192.168.1.1",
+ "ttl": 3600,
+ "priority": 0,
+ "weight": 0,
+ "port": 0,
+ "target": ""
+ }
+}
+```
+
+### 10. 获取 DNS 记录
+
+**接口路径**: `/dns/record/get`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| record_id | uint | 否 | 记录 ID,0 表示获取全部 |
+| zone_id | uint | 否 | Zone ID,用于过滤 |
+| get_type | int | 否 | 获取类型:0 获取自己的,1 获取全部(管理员) |
+
+**请求示例**:
+
+```json
+{
+ "record_id": 1,
+ "get_type": 0
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "获取DNS记录成功",
+ "data": [
+ {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "zone_id": 1,
+ "name": "www",
+ "type": 1,
+ "value": "192.168.1.1",
+ "ttl": 3600,
+ "priority": 0,
+ "weight": 0,
+ "port": 0,
+ "target": ""
+ }
+ ]
+}
+```
+
+### 11. 更新 DNS 记录
+
+**接口路径**: `/dns/record/update`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| record_id | uint | 是 | 记录 ID |
+| name | string | 否 | 记录名称 |
+| type | uint | 否 | 记录类型 |
+| value | string | 否 | 记录值 |
+| ttl | uint | 否 | TTL(秒) |
+| priority | uint | 否 | 优先级 |
+| weight | uint | 否 | 权重 |
+| port | uint | 否 | 端口 |
+| target | string | 否 | 目标 |
+
+**请求示例**:
+
+```json
+{
+ "record_id": 1,
+ "value": "192.168.1.2"
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "更新DNS记录成功",
+ "data": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T01:00:00Z",
+ "DeletedAt": null,
+ "zone_id": 1,
+ "name": "www",
+ "type": 1,
+ "value": "192.168.1.2",
+ "ttl": 3600,
+ "priority": 0,
+ "weight": 0,
+ "port": 0,
+ "target": ""
+ }
+}
+```
+
+### 12. 删除 DNS 记录
+
+**接口路径**: `/dns/record/delete`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| record_id | uint | 否 | 记录 ID |
+| del_type | uint | 是 | 删除类型:0 删除单条,1 删除所有 |
+
+**请求示例**:
+
+```json
+{
+ "record_id": 1,
+ "del_type": 0
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "删除DNS记录成功"
+}
+```
+
+## DNS 服务运行管理接口
+
+### 13. 启动 DNS 服务器
+
+**接口路径**: `/dns/server/start`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| server_id | uint | 是 | DNS 服务器 ID |
+
+**请求示例**:
+
+```json
+{
+ "server_id": 1
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "启动DNS服务器成功",
+ "data": {
+ "server_id": 1,
+ "config": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "user_id": 1,
+ "name": "我的 DNS 服务器",
+ "port": 53,
+ "listen_ip": "0.0.0.0",
+ "upstream_dns": "8.8.8.8,8.8.4.4",
+ "enable_recursion": true,
+ "status": 1,
+ "description": "个人 DNS 服务器"
+ },
+ "running": true
+ }
+}
+```
+
+### 14. 停止 DNS 服务器
+
+**接口路径**: `/dns/server/stop`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| server_id | uint | 是 | DNS 服务器 ID |
+
+**请求示例**:
+
+```json
+{
+ "server_id": 1
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "停止DNS服务器成功"
+}
+```
+
+### 15. 重启 DNS 服务器
+
+**接口路径**: `/dns/server/restart`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| server_id | uint | 是 | DNS 服务器 ID |
+
+**请求示例**:
+
+```json
+{
+ "server_id": 1
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "重启DNS服务器成功",
+ "data": {
+ "server_id": 1,
+ "config": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "user_id": 1,
+ "name": "我的 DNS 服务器",
+ "port": 53,
+ "listen_ip": "0.0.0.0",
+ "upstream_dns": "8.8.8.8,8.8.4.4",
+ "enable_recursion": true,
+ "status": 1,
+ "description": "个人 DNS 服务器"
+ },
+ "running": true
+ }
+}
+```
+
+### 16. 获取 DNS 服务器运行状态
+
+**接口路径**: `/dns/server/status`
+
+**请求参数**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| server_id | uint | 是 | DNS 服务器 ID |
+
+**请求示例**:
+
+```json
+{
+ "server_id": 1
+}
+```
+
+**响应示例**:
+
+```json
+{
+ "code": 0,
+ "message": "获取DNS服务器状态成功",
+ "data": {
+ "server_id": 1,
+ "config": {
+ "ID": 1,
+ "CreatedAt": "2024-01-01T00:00:00Z",
+ "UpdatedAt": "2024-01-01T00:00:00Z",
+ "DeletedAt": null,
+ "user_id": 1,
+ "name": "我的 DNS 服务器",
+ "port": 53,
+ "listen_ip": "0.0.0.0",
+ "upstream_dns": "8.8.8.8,8.8.4.4",
+ "enable_recursion": true,
+ "status": 1,
+ "description": "个人 DNS 服务器"
+ },
+ "running": true
+ }
+}
+```
+
+## 数据模型
+
+### DNSServer
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| ID | uint | 主键 ID |
+| CreatedAt | time.Time | 创建时间 |
+| UpdatedAt | time.Time | 更新时间 |
+| DeletedAt | *time.Time | 删除时间 |
+| user_id | uint | 用户 ID |
+| name | string | DNS 服务器名称 |
+| port | uint | 监听端口 |
+| listen_ip | string | 监听 IP |
+| upstream_dns | string | 上游 DNS 服务器 |
+| enable_recursion | bool | 是否启用递归查询 |
+| status | uint | 状态:0 停止,1 运行中,2 错误 |
+| description | string | 描述 |
+
+### DNSZone
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| ID | uint | 主键 ID |
+| CreatedAt | time.Time | 创建时间 |
+| UpdatedAt | time.Time | 更新时间 |
+| DeletedAt | *time.Time | 删除时间 |
+| server_id | uint | 所属 DNS 服务器 ID |
+| domain | string | 域名 |
+| soa_mname | string | SOA 记录的主域名服务器 |
+| soa_rname | string | SOA 记录的管理员邮箱 |
+| soa_serial | uint | SOA 记录的序列号 |
+| soa_refresh | uint | SOA 记录的刷新时间(秒) |
+| soa_retry | uint | SOA 记录的重试时间(秒) |
+| soa_expire | uint | SOA 记录的过期时间(秒) |
+| soa_minimum | uint | SOA 记录的最小 TTL(秒) |
+| ttl | uint | 默认 TTL(秒) |
+| description | string | 描述 |
+
+### DNSRecord
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| ID | uint | 主键 ID |
+| CreatedAt | time.Time | 创建时间 |
+| UpdatedAt | time.Time | 更新时间 |
+| DeletedAt | *time.Time | 删除时间 |
+| zone_id | uint | 所属 Zone ID |
+| name | string | 记录名称 |
+| type | uint | 记录类型 |
+| value | string | 记录值 |
+| ttl | uint | TTL(秒) |
+| priority | uint | 优先级 |
+| weight | uint | 权重 |
+| port | uint | 端口 |
+| target | string | 目标 |
+
+### DNSServiceInstance
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| server_id | uint | DNS 服务器 ID |
+| config | DNSServer | DNS 服务器配置 |
+| running | bool | 是否正在运行 |
+
+## 错误码说明
+
+| 错误码 | 说明 |
+|--------|------|
+| 0 | 成功 |
+| 1 | 参数错误 |
+| 2 | 系统错误 |
+
+## 功能特性
+
+### 基础功能
+- 支持多 DNS 服务器实例管理
+- 每个 DNS 服务器可以管理多个域名区域(Zone)
+- 每个域名区域可以添加多条 DNS 记录
+- 支持常见 DNS 记录类型:A、AAAA、CNAME、MX、NS、TXT、SRV、SOA
+- 完整的 SOA 记录配置
+
+### 运行时管理
+- 支持 DNS 服务的启动、停止、重启操作
+- 同时支持 UDP 和 TCP 协议
+- 配置修改后自动重启运行中的服务
+- 实时获取服务运行状态
+- 支持递归查询,可配置上游 DNS 服务器
+
+### 权限说明
+- 普通用户只能操作自己创建的 DNS 服务器、区域和记录
+- 管理员可以操作所有 DNS 服务器、区域和记录
+- 删除操作会级联删除相关的子资源(删除服务器会删除其下的区域,删除区域会删除其下的记录)
+
+### 自动重启特性
+当 DNS 服务器的配置(端口、监听IP、上游DNS等)被修改时,如果服务正在运行,系统会自动重启服务以应用新的配置。
diff --git a/src/api/dns.js b/src/api/dns.js
new file mode 100644
index 0000000..bb14551
--- /dev/null
+++ b/src/api/dns.js
@@ -0,0 +1,79 @@
+import request from '@/utils/request.js'
+
+// 转换数据为 URLSearchParams 格式
+const toFormData = (data) => {
+ const params = new URLSearchParams();
+ for (let key in data) {
+ if (data[key] !== null && data[key] !== undefined && data[key] !== '') {
+ params.append(key, data[key]);
+ }
+ }
+ return params;
+}
+
+// DNS 服务器接口
+export const createDNSServer = (data) => {
+ return request.post('/dns/server/create', toFormData(data))
+}
+
+export const getDNSServerList = (data) => {
+ return request.post('/dns/server/get', toFormData(data))
+}
+
+export const updateDNSServer = (data) => {
+ return request.post('/dns/server/update', toFormData(data))
+}
+
+export const deleteDNSServer = (data) => {
+ return request.post('/dns/server/delete', toFormData(data))
+}
+
+export const startDNSServer = (data) => {
+ return request.post('/dns/server/start', toFormData(data))
+}
+
+export const stopDNSServer = (data) => {
+ return request.post('/dns/server/stop', toFormData(data))
+}
+
+export const restartDNSServer = (data) => {
+ return request.post('/dns/server/restart', toFormData(data))
+}
+
+export const getDNSServerStatus = (data) => {
+ return request.post('/dns/server/status', toFormData(data))
+}
+
+// DNS 区域接口
+export const createDNSZone = (data) => {
+ return request.post('/dns/zone/create', toFormData(data))
+}
+
+export const getDNSZoneList = (data) => {
+ return request.post('/dns/zone/get', toFormData(data))
+}
+
+export const updateDNSZone = (data) => {
+ return request.post('/dns/zone/update', toFormData(data))
+}
+
+export const deleteDNSZone = (data) => {
+ return request.post('/dns/zone/delete', toFormData(data))
+}
+
+// DNS 记录接口
+export const createDNSRecord = (data) => {
+ return request.post('/dns/record/create', toFormData(data))
+}
+
+export const getDNSRecordList = (data) => {
+ return request.post('/dns/record/get', toFormData(data))
+}
+
+export const updateDNSRecord = (data) => {
+ return request.post('/dns/record/update', toFormData(data))
+}
+
+export const deleteDNSRecord = (data) => {
+ return request.post('/dns/record/delete', toFormData(data))
+}
diff --git a/src/layout/Layout.vue b/src/layout/Layout.vue
index 6905bc8..952e707 100644
--- a/src/layout/Layout.vue
+++ b/src/layout/Layout.vue
@@ -69,6 +69,9 @@ import {
UserFilled,
OfficeBuilding,
Connection,
+ Setting as ServerIcon,
+ Link as ZoneIcon,
+ DocumentCopy as RecordIcon,
} from "@element-plus/icons-vue";
const router = useRouter();
@@ -139,6 +142,24 @@ const menuList = ref([
icon: Connection,
show: true,
},
+ {
+ path: "/dnsServer",
+ title: "DNS服务器配置",
+ icon: ServerIcon,
+ show: true,
+ },
+ {
+ path: "/dnsZone",
+ title: "DNS区域管理",
+ icon: ZoneIcon,
+ show: true,
+ },
+ {
+ path: "/dnsRecord",
+ title: "DNS记录管理",
+ icon: RecordIcon,
+ show: true,
+ },
]);
const toggleCollapse = () => {
diff --git a/src/router/index.js b/src/router/index.js
index 9db9eff..d540a9e 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -14,6 +14,9 @@ import Chat from "@/views/Chat.vue"
import Group from "@/views/Group.vue"
import File from "@/views/FileList.vue"
import Shell from "@/views/ShellList.vue"
+import DNSServer from "@/views/DNSServer.vue"
+import DNSZone from "@/views/DNSZone.vue"
+import DNSRecord from "@/views/DNSRecord.vue"
import callback from "@/views/callback.vue";
import projectSelect from "@/views/project-select.vue";
@@ -94,6 +97,21 @@ const routes = [
path: 'projectSelect',
name: 'projectSelect',
component: projectSelect
+ },
+ {
+ path: 'dnsServer',
+ name: 'DNSServer',
+ component: DNSServer
+ },
+ {
+ path: 'dnsZone',
+ name: 'DNSZone',
+ component: DNSZone
+ },
+ {
+ path: 'dnsRecord',
+ name: 'DNSRecord',
+ component: DNSRecord
}
]
},
diff --git a/src/views/DNSRecord.vue b/src/views/DNSRecord.vue
new file mode 100644
index 0000000..f6f6a47
--- /dev/null
+++ b/src/views/DNSRecord.vue
@@ -0,0 +1,472 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+
+
+ {{ getRecordTypeName(row.type) }}
+
+
+
+
+
+
+ {{ row.ttl }} 秒
+
+
+
+
+ {{ row.priority || '-' }}
+
+
+
+
+ {{ row.weight || '-' }}
+
+
+
+
+ {{ row.port || '-' }}
+
+
+
+
+ {{ row.target || '-' }}
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/DNSServer.vue b/src/views/DNSServer.vue
new file mode 100644
index 0000000..989f732
--- /dev/null
+++ b/src/views/DNSServer.vue
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.enable_recursion ? '开启' : '关闭' }}
+
+
+
+
+
+
+ {{ getStatusText(row.status) }}
+
+
+
+
+
+
+
+ 编辑
+
+
+ 启动
+
+
+ 停止
+
+
+ 重启
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/DNSZone.vue b/src/views/DNSZone.vue
new file mode 100644
index 0000000..b4b0954
--- /dev/null
+++ b/src/views/DNSZone.vue
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.ttl }} 秒
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Menu.vue b/src/views/Menu.vue
index 09c3892..b3dff7a 100644
--- a/src/views/Menu.vue
+++ b/src/views/Menu.vue
@@ -58,6 +58,24 @@
@click.prevent="handleMenuSelect('/projectSelect')"
>项目选择
+ DNS服务器配置
+ DNS区域管理
+ DNS记录管理