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调用已发送');
+}
|