Jsite Domain详情页增加同步域名信息的按钮及实现功能
This commit is contained in:
parent
d9dd92d231
commit
7e7976942a
@ -117,7 +117,7 @@
|
|||||||
<!-- 主机名编辑 -->
|
<!-- 主机名编辑 -->
|
||||||
<div v-if="record.editing" class="flex items-center space-x-2">
|
<div v-if="record.editing" class="flex items-center space-x-2">
|
||||||
<input
|
<input
|
||||||
v-model="record.item"
|
v-model="record.host"
|
||||||
type="text"
|
type="text"
|
||||||
class="w-24 px-2 py-1 text-sm border border-gray-300 rounded focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
class="w-24 px-2 py-1 text-sm border border-gray-300 rounded focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
||||||
:class="{ 'bg-gray-100 text-gray-500 cursor-not-allowed': !record.isNew }"
|
:class="{ 'bg-gray-100 text-gray-500 cursor-not-allowed': !record.isNew }"
|
||||||
@ -126,7 +126,7 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="text-sm text-gray-900">
|
<div v-else class="text-sm text-gray-900">
|
||||||
{{ record.item || '-' }}
|
{{ record.host || '-' }}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="px-4 py-4 whitespace-nowrap">
|
<td class="px-4 py-4 whitespace-nowrap">
|
||||||
@ -466,7 +466,7 @@ export default {
|
|||||||
addNewRow() {
|
addNewRow() {
|
||||||
const newRecord = {
|
const newRecord = {
|
||||||
id: null, // 新增记录没有ID
|
id: null, // 新增记录没有ID
|
||||||
item: '',
|
host: '',
|
||||||
type: 'A',
|
type: 'A',
|
||||||
line: '',
|
line: '',
|
||||||
value: '',
|
value: '',
|
||||||
@ -506,7 +506,7 @@ export default {
|
|||||||
|
|
||||||
// 保存记录
|
// 保存记录
|
||||||
async saveRecord(record) {
|
async saveRecord(record) {
|
||||||
if (!record.item || !record.type || !record.value) {
|
if (!record.host || !record.type || !record.value) {
|
||||||
toast.error('主机名、类型和记录值不能为空');
|
toast.error('主机名、类型和记录值不能为空');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -532,7 +532,7 @@ export default {
|
|||||||
params = {
|
params = {
|
||||||
domain: this.$domain.pg.domain,
|
domain: this.$domain.pg.domain,
|
||||||
record_type: record.type,
|
record_type: record.type,
|
||||||
host: record.item,
|
host: record.host,
|
||||||
value: record.value,
|
value: record.value,
|
||||||
ttl: record.ttl,
|
ttl: record.ttl,
|
||||||
line: record.line
|
line: record.line
|
||||||
@ -604,7 +604,7 @@ export default {
|
|||||||
deleteRecord(record) {
|
deleteRecord(record) {
|
||||||
confirmDialog({
|
confirmDialog({
|
||||||
title: '删除DNS记录',
|
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: {
|
primaryAction: {
|
||||||
label: '确定',
|
label: '确定',
|
||||||
variant: 'solid',
|
variant: 'solid',
|
||||||
|
|||||||
@ -2613,3 +2613,119 @@ def west_domain_modify_dns_server(**data):
|
|||||||
return {"status": "error", "message": "修改DNS服务器响应解析失败"}
|
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)}"}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "类型",
|
"label": "类型",
|
||||||
"options": "\nA\nCNAME\nMX\nTXT\nAAAA\nSRV",
|
"options": "\nA\nAAAA\nCNAME\nMX\nNS\nTXT\nSRV",
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -50,7 +50,6 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"columns": 1,
|
"columns": 1,
|
||||||
"default": "10",
|
|
||||||
"fieldname": "level",
|
"fieldname": "level",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
@ -83,7 +82,7 @@
|
|||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2025-08-05 01:00:02.459889",
|
"modified": "2025-08-05 03:04:50.722407",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Jcloud",
|
"module": "Jcloud",
|
||||||
"name": "Dns Resolution",
|
"name": "Dns Resolution",
|
||||||
|
|||||||
@ -23,7 +23,7 @@ class DnsResolution(Document):
|
|||||||
record_id: DF.Data | None
|
record_id: DF.Data | None
|
||||||
record_status: DF.Data | None
|
record_status: DF.Data | None
|
||||||
ttl: 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
|
value: DF.Data
|
||||||
# end: auto-generated types
|
# end: auto-generated types
|
||||||
pass
|
pass
|
||||||
|
|||||||
@ -1,8 +1,80 @@
|
|||||||
// Copyright (c) 2025, Jingrow and contributors
|
// Copyright (c) 2025, Jingrow and contributors
|
||||||
// For license information, please see license.txt
|
// For license information, please see license.txt
|
||||||
|
|
||||||
// jingrow.ui.form.on("Jsite Domain", {
|
jingrow.ui.form.on("Jsite Domain", {
|
||||||
// refresh(frm) {
|
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调用已发送');
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user