DNS 记录管理流程
获取记录列表
sequenceDiagram
participant User as 用户
participant Frontend as 前端
participant API as API 客户端
participant AuthMW as 认证中间件
participant Routes as API 路由
participant Adapter as 业务适配器层
participant DnsHelper as DNS 助手
participant Provider as DNS 服务商
participant DB as 数据库
User->>Frontend: 1. 访问域名记录页面
Frontend->>API: 2. 调用 recordsApi.list()
API->>AuthMW: 3. GET /api/domains/:id/records
AuthMW->>AuthMW: 验证 Token
alt Token 无效
AuthMW-->>API: 返回 401
API-->>Frontend: 跳转到登录页
else Token 有效
AuthMW->>Routes: 进入记录路由
Routes->>Adapter: get() 查询域名权限
Adapter->>DB: SELECT * FROM domain_permissions
DB-->>Adapter: 返回权限信息
Adapter-->>Routes: 返回权限信息
alt 无权限
Routes-->>API: 返回 403
else 有权限
Routes->>Adapter: get() 查询域名信息
Adapter->>DB: SELECT * FROM domains
DB-->>Adapter: 返回域名数据
Adapter-->>Routes: 返回域名数据
Routes->>Adapter: get() 查询所属账号
Adapter->>DB: SELECT * FROM dns_accounts
DB-->>Adapter: 返回账号配置
Adapter-->>Routes: 返回账号配置
Routes->>DnsHelper: createAdapter()
DnsHelper->>Provider: 实例化服务商适配器
Routes->>Provider: getDomainRecords()
Provider->>Provider: 调用服务商 API
Provider-->>Routes: 返回记录列表
Routes->>Routes: 数据格式化
Routes-->>API: 返回 {total, list}
API-->>Frontend: 返回记录数据
Frontend-->>User: 渲染记录表格
end
end
更新记录
sequenceDiagram
participant User as 用户
participant Frontend as 前端
participant API as API 客户端
participant AuthMW as 认证中间件
participant Routes as API 路由
participant Adapter as 业务适配器层
participant DnsHelper as DNS 助手
participant Provider as DNS 服务商
participant DB as 数据库
participant Audit as 审计服务
User->>Frontend: 1. 编辑记录并提交
Frontend->>API: 2. 调用 recordsApi.update()
API->>AuthMW: 3. PUT /api/domains/:id/records/:recordId
AuthMW->>Routes: 进入更新路由
Routes->>Adapter: get() 查询权限
Adapter->>DB: 验证写权限
DB-->>Adapter: 返回权限结果
Adapter-->>Routes: 返回权限结果
alt 无写权限
Routes-->>API: 返回 403
API-->>Frontend: 显示无权限
else 有写权限
Routes->>Adapter: get() 获取域名和账号
Adapter->>DB: 查询配置
DB-->>Adapter: 返回配置
Adapter-->>Routes: 返回配置
Routes->>DnsHelper: createAdapter()
DnsHelper->>Provider: 实例化适配器
Routes->>Provider: updateDomainRecord()
Provider->>Provider: 调用服务商 API
Provider-->>Routes: 返回更新结果
alt 更新失败
Routes-->>API: 返回 500
API-->>Frontend: 显示错误
else 更新成功
Routes->>Adapter: execute() 更新本地缓存
Adapter->>DB: UPDATE domain_records
Routes->>Audit: logAuditOperation()
Audit->>Adapter: execute() 记录操作日志
Adapter->>DB: INSERT INTO operation_logs
Routes-->>API: 返回成功
API-->>Frontend: 刷新列表
Frontend-->>User: 显示成功提示
end
end
关键代码路径
获取记录列表
前端:
Records.tsx
→ useQuery(['records', domainId], () => recordsApi.list(domainId))
→ recordsApi.list(domainId, params)
→ api.get(`/domains/${domainId}/records`)
后端:
GET /api/domains/:domainId/records (routes/records.ts)
→ authMiddleware (认证)
→ 检查域名权限
→ get() 查询域名信息 (通过业务适配器层)
→ get() 查询账号配置 (通过业务适配器层)
→ createAdapter() 创建 DNS 适配器
→ adapter.getDomainRecords() 调用服务商 API
→ 格式化返回数据
→ 返回 {total, list}
更新记录
前端:
RecordForm.tsx
→ recordsApi.update(domainId, recordId, data)
→ api.put(`/domains/${domainId}/records/${recordId}`)
后端:
PUT /api/domains/:domainId/records/:recordId (routes/records.ts)
→ authMiddleware (认证)
→ 检查写权限
→ get() 查询域名和账号 (通过业务适配器层)
→ createAdapter() 创建 DNS 适配器
→ adapter.updateDomainRecord() 调用服务商 API
→ execute() 更新本地数据库 (通过业务适配器层)
→ logAuditOperation() 记录审计
→ 返回成功
数据流
DNS 记录创建
用户填写记录表单
↓
前端表单验证
↓
recordsApi.create(domainId, recordData)
↓
POST /api/domains/:domainId/records
↓
[后端] authMiddleware - JWT 验证
↓
[后端] 检查域名权限
↓
[后端] get() - 查询域名信息 (通过业务适配器层)
↓
[后端] get() - 查询账号配置 (通过业务适配器层)
↓
[后端] createAdapter() - 创建 DNS 适配器
↓
[后端] adapter.addDomainRecord() - 调用服务商 API
↓
[后端] insert() - 更新本地数据库 (通过业务适配器层)
↓
[后端] logAuditOperation() - 记录审计日志
↓
返回 {id}
↓
前端刷新记录列表
↓
显示成功提示