diff --git a/dashboard/src2/components/DomainOwner.vue b/dashboard/src2/components/DomainOwner.vue
index bf0788f..4b9f464 100644
--- a/dashboard/src2/components/DomainOwner.vue
+++ b/dashboard/src2/components/DomainOwner.vue
@@ -106,6 +106,15 @@
>
+
@@ -452,6 +461,7 @@ import DomainOwnerDialog from './DomainOwnerDialog.vue';
import SearchIcon from '~icons/lucide/search';
import EyeIcon from '~icons/lucide/eye';
import EditIcon from '~icons/lucide/edit';
+import Trash2Icon from '~icons/lucide/trash-2';
import Loader2Icon from '~icons/lucide/loader-2';
import AlertCircleIcon from '~icons/lucide/alert-circle';
import UsersIcon from '~icons/lucide/users';
@@ -465,6 +475,7 @@ export default {
SearchIcon,
EyeIcon,
EditIcon,
+ Trash2Icon,
Loader2Icon,
AlertCircleIcon,
UsersIcon,
@@ -790,6 +801,43 @@ export default {
}
},
+ // 删除域名所有者
+ async deleteOwner(owner) {
+ confirmDialog({
+ title: '确认删除',
+ message: `确定要删除域名所有者模板 "${this.getDisplayName(owner)}" 吗?
此操作将同时删除西部数码平台和本地的模板记录,且不可逆。`,
+ primaryAction: {
+ label: '删除',
+ variant: 'solid',
+ onClick: async ({ hide }) => {
+ try {
+ const deleteRequest = createResource({
+ url: 'jcloud.api.domain_west.delete_domain_owner',
+ params: { name: owner.name },
+ onSuccess: (response) => {
+ if (response.status === 'Success') {
+ toast.success('域名所有者模板删除成功!');
+ this.fetchOwners(); // 刷新列表
+ hide();
+ } else {
+ throw new Error(response.message || '删除失败');
+ }
+ },
+ onError: (error) => {
+ throw new Error(getToastErrorMessage(error));
+ }
+ });
+
+ await deleteRequest.submit();
+ } catch (error) {
+ toast.error(error.message || '删除失败,请稍后重试');
+ throw error;
+ }
+ }
+ }
+ });
+ },
+
// 上一页
previousPage() {
if (this.pagination.pageno > 1) {
diff --git a/jcloud/api/domain_west.py b/jcloud/api/domain_west.py
index f0b4f2a..104358d 100644
--- a/jcloud/api/domain_west.py
+++ b/jcloud/api/domain_west.py
@@ -504,6 +504,23 @@ class WestDomain:
return self._make_request('/audit/', 'POST', body_params=encoded_data)
+ def delete_contact_template(self, template_id: str) -> Dict[str, Any]:
+ """
+ 删除指定模板
+
+ Args:
+ template_id: 模板标识(c_sysid)
+ """
+ if not template_id:
+ return {"status": "error", "message": "缺少必要参数:template_id"}
+
+ body_params = {
+ 'act': 'auditdel',
+ 'c_sysid': template_id,
+ }
+
+ return self._make_request('/audit/', 'POST', body_params=body_params)
+
def get_domain_real_info(self, domain: str) -> Dict[str, Any]:
"""
获取域名实名信息
@@ -3375,3 +3392,56 @@ def update_domain_owner(name, **data):
return {"status": "Error", "message": f"更新域名所有者信息失败: {str(e)}"}
+@jingrow.whitelist()
+def delete_domain_owner(name):
+ """删除域名所有者模板"""
+ try:
+ if not name:
+ return {"status": "Error", "message": "域名所有者名称不能为空"}
+
+ # 获取指定的域名所有者
+ domain_owner = jingrow.get_pg("Domain Owner", name)
+ if not domain_owner:
+ return {"status": "Error", "message": "未找到指定的域名所有者"}
+
+ # 检查权限(只能删除当前团队的所有者)
+ team = get_current_team()
+ if not team:
+ return {"status": "Error", "message": "未找到当前团队"}
+
+ if domain_owner.team != team:
+ return {"status": "Error", "message": "无权删除该域名所有者信息"}
+
+ # 检查是否有 c_sysid(西部数码模板标识)
+ c_sysid = getattr(domain_owner, 'c_sysid', None)
+ if not c_sysid:
+ return {"status": "Error", "message": "域名所有者没有模板标识,无法删除"}
+
+ # 先删除西部数码的模板
+ try:
+ client = get_west_client()
+ if not client:
+ return {"status": "Error", "message": "API客户端初始化失败"}
+
+ # 调用西部数码删除模板接口
+ west_result = client.delete_contact_template(c_sysid)
+
+ if west_result.get('result') != 200:
+ error_msg = west_result.get('msg', west_result.get('message', '西部数码模板删除失败'))
+ return {"status": "Error", "message": f"西部数码模板删除失败: {error_msg}"}
+
+ except Exception as e:
+ return {"status": "Error", "message": f"西部数码模板删除失败: {str(e)}"}
+
+ # 西部数码模板删除成功后,删除本地记录
+ try:
+ domain_owner.delete(ignore_permissions=True)
+ return {"status": "Success", "message": "域名所有者模板删除成功"}
+
+ except Exception as e:
+ return {"status": "Error", "message": f"本地记录删除失败: {str(e)}"}
+
+ except Exception as e:
+ return {"status": "Error", "message": f"删除失败: {str(e)}"}
+
+