# 域名模型详细设计

## 1. 域名模型概述

域名模型（Domain Model）是该应用程序的核心数据模型，用于表示和管理域名的基本信息和管理信息。模型设计遵循面向对象原则，确保数据结构清晰、关系明确，并提供必要的数据验证和操作方法。

## 2. 域名模型属性设计

### 2.1 基本属性

| 属性名 | 数据类型 | 描述 | 约束条件 | 默认值 |
|--------|----------|------|----------|--------|
| `id` | String | 域名唯一标识符 | 必填，唯一 | 自动生成UUID |
| `name` | String | 域名名称（如example.com） | 必填，唯一，格式有效 | 无 |
| `description` | String | 域名描述信息 | 可选 | 空字符串 |
| `targetAddress` | String | 域名指向的地址（IP或域名） | 必填 | 无 |
| `recordType` | String | DNS记录类型（A、AAAA、CNAME等） | 必填，预定义枚举值之一 | 无 |
| `ttl` | Number | 生存时间（以秒为单位） | 可选，大于0 | 3600 |
| `priority` | Number | MX记录优先级（仅对MX记录有效） | 可选，大于等于0 | null |

### 2.2 管理属性

| 属性名 | 数据类型 | 描述 | 约束条件 | 默认值 |
|--------|----------|------|----------|--------|
| `admin` | String | 管理员信息（可存储姓名、ID等） | 可选 | 空字符串 |
| `enabled` | Boolean | 域名是否启用 | 必填 | true |
| `createdAt` | Date | 创建时间 | 必填 | 当前时间 |
| `updatedAt` | Date | 最后更新时间 | 必填 | 当前时间 |
| `creator` | String | 创建者信息 | 可选 | 空字符串 |
| `updater` | String | 最后更新者信息 | 可选 | 空字符串 |

### 2.3 扩展属性

| 属性名 | 数据类型 | 描述 | 约束条件 | 默认值 |
|--------|----------|------|----------|--------|
| `tags` | Array<String> | 标签列表，用于分类和搜索 | 可选 | 空数组 |
| `metadata` | Object | 自定义元数据（JSON格式） | 可选 | 空对象 |

## 3. DNS记录类型定义

为确保DNS记录类型的一致性，系统预定义以下记录类型：

| 记录类型 | 描述 | 有效目标地址格式 |
|----------|------|------------------|
| A | IPv4地址记录 | IPv4地址（如192.168.1.1） |
| AAAA | IPv6地址记录 | IPv6地址 |
| CNAME | 别名记录 | 域名（如sub.example.com） |
| MX | 邮件交换记录 | 域名（如mail.example.com） |
| TXT | 文本记录 | 文本字符串 |
| NS | 名称服务器记录 | 域名（如ns1.example.com） |
| SOA | 起始授权记录 | 包含多个字段的特殊记录 |
| PTR | 指针记录 | 域名或反向DNS记录 |
| SRV | 服务定位记录 | 包含优先级、权重、端口和目标的记录 |
| CAA | 证书颁发机构授权记录 | 控制哪些CA可以为域名颁发证书 |

## 4. 数据模型接口定义

使用TypeScript接口定义域名数据模型结构：

```typescript
// 域名数据接口
export interface DomainData {
  // 基本属性
  id: string;
  name: string;
  description: string;
  targetAddress: string;
  recordType: DnsRecordType;
  ttl?: number;
  priority?: number | null;
  
  // 管理属性
  admin: string;
  enabled: boolean;
  createdAt: Date;
  updatedAt: Date;
  creator?: string;
  updater?: string;
  
  // 扩展属性
  tags?: string[];
  metadata?: Record<string, any>;
}

// DNS记录类型枚举
export enum DnsRecordType {
  A = 'A',
  AAAA = 'AAAA',
  CNAME = 'CNAME',
  MX = 'MX',
  TXT = 'TXT',
  NS = 'NS',
  SOA = 'SOA',
  PTR = 'PTR',
  SRV = 'SRV',
  CAA = 'CAA'
}

// 创建域名数据时的接口（不包含自动生成的字段）
export interface CreateDomainData {
  name: string;
  description?: string;
  targetAddress: string;
  recordType: DnsRecordType;
  ttl?: number;
  priority?: number | null;
  admin?: string;
  enabled?: boolean;
  creator?: string;
  tags?: string[];
  metadata?: Record<string, any>;
}

// 更新域名数据时的接口（所有字段可选）
export interface UpdateDomainData {
  name?: string;
  description?: string;
  targetAddress?: string;
  recordType?: DnsRecordType;
  ttl?: number;
  priority?: number | null;
  admin?: string;
  enabled?: boolean;
  updater?: string;
  tags?: string[];
  metadata?: Record<string, any>;
}
```

## 5. 数据验证规则

为确保数据一致性和完整性，域名模型实现以下验证规则：

### 5.1 域名名称验证

- 必须是有效的域名格式（遵循RFC 1035标准）
- 不能包含空格或非法字符
- 长度必须在有效范围内（通常为1-255个字符）

### 5.2 目标地址验证

- 根据`recordType`字段验证目标地址格式：
  - 对于A记录，必须是有效的IPv4地址
  - 对于AAAA记录，必须是有效的IPv6地址
  - 对于CNAME、MX、NS记录，必须是有效的域名格式
  - 对于TXT记录，可以是任意文本字符串（但有长度限制）

### 5.3 TTL验证

- 必须是正整数（> 0）
- 推荐值范围：60秒 - 86400秒（1天）

### 5.4 优先级验证

- 只对MX和SRV记录有效
- 必须是大于等于0的整数

## 6. 模型关系设计

域名模型在系统中可以与其他模型建立以下关系：

### 6.1 单模型关系

在当前阶段，域名模型作为核心模型独立存在，不与其他模型建立外键关系。这种设计简化了模型实现，使模型层更加专注于域名数据的管理。

### 6.2 未来可能的关系扩展

- **用户模型**：与域名模型的admin、creator、updater字段关联
- **域名组模型**：允许将域名分类到不同组中进行管理
- **操作日志模型**：记录对域名的所有操作历史

## 7. 模型扩展机制

为支持不同用户的定制需求，域名模型设计包含灵活的扩展机制：

1. **metadata字段**：允许存储任意JSON格式的自定义数据
2. **tags字段**：支持对域名进行分类和标记
3. **可继承设计**：模型实现采用类继承方式，允许用户扩展基础模型