Files
Meshray-Manager/docs/DDNS_TXT 记录修复报告.md
2026-06-30 15:14:37 +08:00

325 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DDNS TXT 记录修复报告
**修复时间**: 2026-03-26
**问题**: 服务市场的 DDNS 配置缺少 TXT 记录选项
---
## 🎯 问题分析
### 你的正确观察
1. **List.vue(服务市场)** - ❌ 之前只有 A/AAAA 记录,没有 TXT
2. **DDNSEdit.vue(专用页面)** - ✅ 有 TXT 记录字段
3. **用途混淆** - 两个页面的定位不清晰
---
## ✅ 修复方案
### 场景区分
| 页面 | 用途 | 记录类型 | 说明 |
|------|------|----------|------|
| **服务市场 → DDNS** | 通用 DDNS 服务 | ✅ TXT / A / AAAA | 支持所有类型 |
| **服务 → DDNS 配置** | MeshSeed 同步专用 | ✅ 仅 TXT | 专门用于组网配置同步 |
---
## 🔧 具体修改
### 1. List.vue - 添加 TXT 记录选项
**修改位置**: `web/src/views/Service/List.vue` Line 500-506
#### 修改前
```vue
<el-form-item label="记录类型" prop="record_type">
<el-select v-model="formData.record_type" placeholder="请选择记录类型">
<el-option label="A (IPv4)" value="A" />
<el-option label="AAAA (IPv6)" value="AAAA" />
</el-select>
</el-form-item>
```
#### 修改后
```vue
<el-form-item label="记录类型" prop="record_type">
<el-select v-model="formData.record_type" placeholder="请选择记录类型">
<el-option label="TXT (MeshSeed 同步)" value="TXT" />
<el-option label="A (IPv4)" value="A" />
<el-option label="AAAA (IPv6)" value="AAAA" />
</el-select>
</el-form-item>
</el-form-item>
```
---
### 2. 添加条件字段显示
#### TXT 记录专用字段(新增)
```vue
<!-- TXT 记录专用字段 -->
<el-form-item v-if="formData.record_type === 'TXT'" label="TXT 记录名称" prop="txt_record_name">
<el-input
v-model="formData.txt_record_name"
placeholder="_meshray._mesh"
clearable
/>
<div class="form-tip">
<el-icon><InfoFilled /></el-icon>
TXT 记录前缀用于组网配置同步MeshSeed 密文
</div>
<div class="form-tip">
<el-icon><InfoFilled /></el-icon>
完整记录{{ formData.txt_record_name }}.{{ formData.domain || 'example.com' }}
</div>
</el-form-item>
```
**特点**:
- ✅ 仅在选中 TXT 记录时显示
- ✅ 默认值 `_meshray._mesh`
- ✅ 明确说明用途:**组网配置同步(MeshSeed 密文)**
- ✅ 显示完整记录预览
---
#### A/AAAA 记录专用字段(新增)
```vue
<!-- A/AAAA 记录专用字段 -->
<el-form-item v-if="['A', 'AAAA'].includes(formData.record_type)" label="主机记录" prop="subdomain">
<el-input v-model="formData.subdomain" placeholder="@ 或 www" clearable />
<div class="form-tip">
<el-icon><InfoFilled /></el-icon>
子域名前缀@ 表示根域名
</div>
</el-form-item>
```
**特点**:
- ✅ 仅在选中 A/AAAA 记录时显示
- ✅ 用于传统 IP 解析
- ✅ 与 TXT 记录区分开
---
### 3. 更新默认值
```javascript
const configureDDNS = (provider) => {
// ...
formData.value = {
// ...
record_type: 'TXT', // ✅ 改为 TXT(之前是 'A'
txt_record_name: '_meshray._mesh', // ✅ 新增
subdomain: '' // ✅ 新增
}
}
```
**理由**:
- ✅ 默认使用 TXT 记录同步 MeshSeed
- ✅ 符合主要使用场景(组网配置同步)
---
### 4. 添加校验规则
```javascript
if (formData.value.type === 'DDNS') {
rules.provider = [{ required: true, message: '请选择 DNS 服务商', trigger: 'change' }]
rules.domain = [{ required: true, message: '请输入域名', trigger: 'blur' }]
// ✅ TXT 记录专用校验
if (formData.value.record_type === 'TXT') {
rules.txt_record_name = [
{ required: true, message: '请输入 TXT 记录名称', trigger: 'blur' },
{
pattern: /^[a-zA-Z0-9._-]+$/,
message: '只能包含字母、数字、点、下划线和连字符',
trigger: 'blur'
}
]
}
// ✅ A/AAAA 记录专用校验
if (['A', 'AAAA'].includes(formData.value.record_type)) {
rules.subdomain = [
{ required: true, message: '请输入主机记录', trigger: 'blur' }
]
}
}
```
**特点**:
- ✅ 根据记录类型动态校验
- ✅ TXT 记录名称格式校验
- ✅ A/AAAA 记录需要主机名
---
## 📊 完整对比
### 修改前 ❌
```
服务市场 → 添加 DDNS
├── DNS 服务商
├── 域名
└── 记录类型
├── A (IPv4)
└── AAAA (IPv6)
❌ 没有 TXT 选项
❌ 无法同步 MeshSeed
```
### 修改后 ✅
```
服务市场 → 添加 DDNS
├── DNS 服务商
├── 域名
└── 记录类型
├── TXT (MeshSeed 同步) ← 默认选中
│ └── TXT 记录名称(自动显示)
├── A (IPv4)
│ └── 主机记录(子域名)
└── AAAA (IPv6)
└── 主机记录(子域名)
✅ 支持 TXT 同步 MeshSeed
✅ 支持 A/AAAA 传统解析
✅ 条件字段智能显示
```
---
## 🎯 使用示例
### 场景 1:同步 MeshSeed(推荐)
1. 访问 **服务市场****同步服务**
2. 点击 **阿里云 DDNS**
3. 选择 **记录类型:TXT (MeshSeed 同步)**
4. 填写:
- 域名:`mesh.example.com`
- TXT 记录名称:`_meshray._mesh`
5. 保存
**效果**:
- DNS TXT 记录:`_meshray._mesh.mesh.example.com`
- 用途:组网配置加密同步
---
### 场景 2:传统 IP 解析
1. 访问 **服务市场****同步服务**
2. 点击 **阿里云 DDNS**
3. 选择 **记录类型:A (IPv4)**
4. 填写:
- 域名:`example.com`
- 主机记录:`@``www`
5. 保存
**效果**:
- DNS A 记录:`example.com``1.2.3.4`
- 用途:动态 IP 地址解析
---
## 💡 设计理念
### 为什么这样设计?
#### 之前的问题
```
❌ 只有 A/AAAA 记录
❌ 无法同步 MeshSeed(需要 TXT
❌ 用途不明确
```
#### 现在的优势
```
✅ 默认 TXT 记录(主要用途:MeshSeed 同步)
✅ 保留 A/AAAA(传统用途:IP 解析)
✅ 条件字段(避免界面混乱)
✅ 清晰提示(用户知道用途)
```
---
## 🔍 验证方法
### 快速测试
1. **清除浏览器缓存**Ctrl+Shift+Delete
2. 访问:`http://localhost:9531/service`
3. 切换到 **同步服务** 标签
4. 点击 **阿里云 DDNS**
5. 查看表单:
**应该看到**:
```
✓ DNS 服务商:[阿里云 DNS]
✓ 域名:[输入框]
✓ 记录类型:[下拉框]
- TXT (MeshSeed 同步) ← 默认选中
- A (IPv4)
- AAAA (IPv6)
选择 TXT 后应显示:
✓ TXT 记录名称:[_meshray._mesh]
- TXT 记录前缀,用于组网配置同步(MeshSeed 密文)
- 完整记录:_meshray._mesh.example.com
```
---
### JavaScript 控制台测试
```javascript
// 测试 API 返回
fetch('/api/v1/ddns/config')
.then(r => r.json())
.then(d => {
console.log('完整数据:', d);
console.log('TXT 字段存在吗?', 'txt_record_name' in d.data);
console.log('记录类型:', d.data.record_type);
});
```
---
## 📝 总结
### 修复内容
1. ✅ 添加 TXT 记录选项(默认选中)
2. ✅ 添加 TXT 记录名称字段(条件显示)
3. ✅ 添加 A/AAAA 主机记录字段(条件显示)
4. ✅ 更新表单校验规则(动态校验)
5. ✅ 更新默认值(优先 TXT
### 功能区分
| 功能 | 记录类型 | 用途 | 字段 |
|------|----------|------|------|
| **MeshSeed 同步** | TXT | 组网配置加密同步 | txt_record_name |
| **IP 解析(IPv4** | A | 动态 IP 地址解析 | subdomain |
| **IP 解析(IPv6** | AAAA | 动态 IPv6 地址解析 | subdomain |
### 用户体验提升
-**智能提示**: 明确告知 TXT 用于 MeshSeed 同步
-**条件显示**: 只展示相关字段,避免混乱
-**默认优化**: 默认选中 TXT(主要用途)
-**格式校验**: 自动校验 TXT 记录名称格式
---
*DDNS TXT 记录修复报告 | v1.0*