From 7e7976942ad7defa5905e81e7120188d44a1d8fe Mon Sep 17 00:00:00 2001 From: jingrow Date: Tue, 5 Aug 2025 03:14:42 +0800 Subject: [PATCH] =?UTF-8?q?Jsite=20Domain=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=8C=E6=AD=A5=E5=9F=9F=E5=90=8D=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E6=8C=89=E9=92=AE=E5=8F=8A=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src2/components/JsiteDomainDNSRecords.vue | 12 +- jcloud/api/domain_west.py | 116 ++++++++++++++++++ .../dns_resolution/dns_resolution.json | 5 +- .../pagetype/dns_resolution/dns_resolution.py | 2 +- .../pagetype/jsite_domain/jsite_domain.js | 80 +++++++++++- 5 files changed, 201 insertions(+), 14 deletions(-) diff --git a/dashboard/src2/components/JsiteDomainDNSRecords.vue b/dashboard/src2/components/JsiteDomainDNSRecords.vue index 9a67360..a7de16f 100644 --- a/dashboard/src2/components/JsiteDomainDNSRecords.vue +++ b/dashboard/src2/components/JsiteDomainDNSRecords.vue @@ -117,7 +117,7 @@
- {{ record.item || '-' }} + {{ record.host || '-' }}
@@ -466,7 +466,7 @@ export default { addNewRow() { const newRecord = { id: null, // 新增记录没有ID - item: '', + host: '', type: 'A', line: '', value: '', @@ -506,7 +506,7 @@ export default { // 保存记录 async saveRecord(record) { - if (!record.item || !record.type || !record.value) { + if (!record.host || !record.type || !record.value) { toast.error('主机名、类型和记录值不能为空'); return; } @@ -532,7 +532,7 @@ export default { params = { domain: this.$domain.pg.domain, record_type: record.type, - host: record.item, + host: record.host, value: record.value, ttl: record.ttl, line: record.line @@ -604,7 +604,7 @@ export default { deleteRecord(record) { confirmDialog({ title: '删除DNS记录', - message: `确定要删除这条DNS记录吗?\n类型: ${record.type}\n主机记录: ${record.item}\n记录值: ${record.value}`, + message: `确定要删除这条DNS记录吗?\n类型: ${record.type}\n主机记录: ${record.host}\n记录值: ${record.value}`, primaryAction: { label: '确定', variant: 'solid', diff --git a/jcloud/api/domain_west.py b/jcloud/api/domain_west.py index 9aab0cd..22bd98b 100644 --- a/jcloud/api/domain_west.py +++ b/jcloud/api/domain_west.py @@ -2613,3 +2613,119 @@ def west_domain_modify_dns_server(**data): return {"status": "error", "message": "修改DNS服务器响应解析失败"} +@jingrow.whitelist() +def sync_domain_info_from_west(**data): + """从西部数据同步域名信息""" + jingrow.log_error("域名同步", f"开始同步域名信息,参数: {data}") + + try: + client = get_west_client() + if not client: + jingrow.log_error("域名同步", "API客户端初始化失败") + return {"status": "error", "message": "API客户端初始化失败"} + + domain = data.get('domain') + if not domain: + jingrow.log_error("域名同步", "缺少域名参数") + return {"status": "error", "message": "缺少域名参数"} + + jingrow.log_error("域名同步", f"开始同步域名: {domain}") + + # 获取域名DNS记录 - 参考get_west_domain_dns_records使用分页API + dns_response = client.get_dns_records_paginated(domain, 1000, 1) # 获取足够多的记录 + jingrow.log_error("域名同步", f"域名DNS记录响应: {dns_response}") + + # 获取域名实名信息 + real_info_response = client.get_domain_real_info(domain) + jingrow.log_error("域名同步", f"域名实名信息响应: {real_info_response}") + + # 处理DNS记录 - 参考get_west_domain_dns_records的处理方式 + dns_data = {} + if dns_response.get("result") == 200: + data = dns_response.get("data", {}) + all_items = data.get("items", []) + # 对所有记录按类型排序 + sorted_items = sorted(all_items, key=lambda x: x.get('type', '')) + dns_data = { + "items": sorted_items, + "total": len(sorted_items) + } + + real_data = real_info_response.get("data", {}) if real_info_response.get("result") == 200 else {} + + # 更新本地域名记录 + try: + domain_doc = jingrow.get_pg("Jsite Domain", {"domain": domain}) + if not domain_doc: + return {"status": "error", "message": "本地未找到该域名记录"} + + # 更新基本信息 - 从实名信息中获取 + if real_data: + domain_doc.registration_date = real_data.get("regdate") + domain_doc.end_date = real_data.get("rexpiredate") + domain_doc.status = "Active" if real_data.get("status") == "ok" else "Expired" + + # 更新DNS服务器信息 + domain_doc.dns_host1 = real_data.get("dns_host1", "") + domain_doc.dns_host2 = real_data.get("dns_host2", "") + domain_doc.dns_host3 = real_data.get("dns_host3", "") + domain_doc.dns_host4 = real_data.get("dns_host4", "") + domain_doc.dns_host5 = real_data.get("dns_host5", "") + domain_doc.dns_host6 = real_data.get("dns_host6", "") + + jingrow.log_error("域名同步", f"更新基本信息: 注册日期={real_data.get('regdate')}, 到期日期={real_data.get('rexpiredate')}") + + # 更新DNS解析记录 + if dns_data and "items" in dns_data: + jingrow.log_error("域名同步", f"正在更新DNS解析记录,共{len(dns_data.get('items', []))}条记录") + # 清空现有DNS解析记录 + domain_doc.dns_resolution = [] + + # 添加新的DNS解析记录 + for record in dns_data.get("items", []): + # 确保必需字段有值 - 注意字段名是item不是host + host = record.get("item", "") # 修正字段名 + record_type = record.get("type", "") + value = record.get("value", "") + + # 只有当必需字段都有值时才添加记录 + if host and record_type and value: + domain_doc.append("dns_resolution", { + "type": record_type, + "host": host, + "value": value, + "ttl": record.get("ttl", 600), + "level": record.get("level", 10), + "line": record.get("line", ""), + "record_id": record.get("id", ""), + "record_status": record.get("status", "") + }) + jingrow.log_error("域名同步", f"添加DNS记录: {host} {record_type} {value}") + else: + jingrow.log_error("域名同步", f"跳过无效DNS记录: {record}") + + jingrow.log_error("域名同步", f"DNS解析记录更新完成") + + # 保存更新 + domain_doc.save() + + jingrow.log_error("域名同步", f"域名 {domain} 同步成功") + + return { + "status": "success", + "message": "域名信息同步成功", + "data": { + "dns_records": dns_data, + "real_info": real_data + } + } + + except Exception as e: + jingrow.log_error("域名信息同步失败", f"域名: {domain}, 错误: {str(e)}") + return {"status": "error", "message": f"更新本地记录失败: {str(e)}"} + + except Exception as e: + jingrow.log_error("域名信息同步失败", f"域名: {domain}, 错误: {str(e)}") + return {"status": "error", "message": f"同步失败: {str(e)}"} + + diff --git a/jcloud/jcloud/pagetype/dns_resolution/dns_resolution.json b/jcloud/jcloud/pagetype/dns_resolution/dns_resolution.json index 975ff90..7914e6f 100644 --- a/jcloud/jcloud/pagetype/dns_resolution/dns_resolution.json +++ b/jcloud/jcloud/pagetype/dns_resolution/dns_resolution.json @@ -29,7 +29,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "类型", - "options": "\nA\nCNAME\nMX\nTXT\nAAAA\nSRV", + "options": "\nA\nAAAA\nCNAME\nMX\nNS\nTXT\nSRV", "reqd": 1 }, { @@ -50,7 +50,6 @@ }, { "columns": 1, - "default": "10", "fieldname": "level", "fieldtype": "Data", "in_list_view": 1, @@ -83,7 +82,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2025-08-05 01:00:02.459889", + "modified": "2025-08-05 03:04:50.722407", "modified_by": "Administrator", "module": "Jcloud", "name": "Dns Resolution", diff --git a/jcloud/jcloud/pagetype/dns_resolution/dns_resolution.py b/jcloud/jcloud/pagetype/dns_resolution/dns_resolution.py index a04a6af..00ba8cc 100644 --- a/jcloud/jcloud/pagetype/dns_resolution/dns_resolution.py +++ b/jcloud/jcloud/pagetype/dns_resolution/dns_resolution.py @@ -23,7 +23,7 @@ class DnsResolution(Document): record_id: DF.Data | None record_status: DF.Data | None ttl: DF.Data | None - type: DF.Literal["", "A", "CNAME", "MX", "TXT", "AAAA", "SRV"] + type: DF.Literal["", "A", "AAAA", "CNAME", "MX", "NS", "TXT", "SRV"] value: DF.Data # end: auto-generated types pass diff --git a/jcloud/jcloud/pagetype/jsite_domain/jsite_domain.js b/jcloud/jcloud/pagetype/jsite_domain/jsite_domain.js index e721d71..196744c 100644 --- a/jcloud/jcloud/pagetype/jsite_domain/jsite_domain.js +++ b/jcloud/jcloud/pagetype/jsite_domain/jsite_domain.js @@ -1,8 +1,80 @@ // Copyright (c) 2025, Jingrow and contributors // For license information, please see license.txt -// jingrow.ui.form.on("Jsite Domain", { -// refresh(frm) { +jingrow.ui.form.on("Jsite Domain", { + refresh(frm) { + // 添加同步按钮到右上角 + frm.add_custom_button(__('同步域名信息'), function() { + sync_domain_info(frm); + }, __('操作')); + }, +}); -// }, -// }); +// 同步域名信息函数 +function sync_domain_info(frm) { + console.log('=== 开始同步域名信息 ==='); + console.log('当前记录:', frm.pg); + console.log('域名字段:', frm.pg.domain); + + if (!frm.pg.domain) { + console.log('❌ 域名字段为空'); + jingrow.msgprint(__('当前记录没有域名信息')); + return; + } + + console.log('✅ 域名字段存在:', frm.pg.domain); + + // 显示加载状态 + frm.dashboard.clear_headline(); + frm.dashboard.set_headline(__('正在同步域名信息...')); + + console.log('准备调用API,参数:', { + method: 'jcloud.api.domain_west.sync_domain_info_from_west', + args: { + domain: frm.pg.domain + } + }); + + // 调用API同步域名信息 + jingrow.call({ + method: 'jcloud.api.domain_west.sync_domain_info_from_west', + args: { + domain: frm.pg.domain + }, + callback: function(r) { + console.log('API调用成功,响应:', r); + frm.dashboard.clear_headline(); + + // 检查响应结构 + if (r && r.message && r.message.status === 'success') { + console.log('✅ 同步成功'); + jingrow.msgprint({ + title: __('同步成功'), + message: __('域名信息已成功从西部数据同步'), + indicator: 'green' + }); + + // 刷新页面以显示更新后的数据 + frm.refresh(); + } else { + console.log('❌ 同步失败:', r); + jingrow.msgprint({ + title: __('同步失败'), + message: (r && r.message && r.message.message) || __('同步域名信息时发生错误'), + indicator: 'red' + }); + } + }, + error: function(err) { + console.log('❌ API调用失败:', err); + frm.dashboard.clear_headline(); + jingrow.msgprint({ + title: __('同步失败'), + message: __('网络错误或服务器异常'), + indicator: 'red' + }); + } + }); + + console.log('API调用已发送'); +}