diff --git a/dashboard/src2/components/DomainOwner.vue b/dashboard/src2/components/DomainOwner.vue index 39c4070..372fac1 100644 --- a/dashboard/src2/components/DomainOwner.vue +++ b/dashboard/src2/components/DomainOwner.vue @@ -110,8 +110,13 @@ @click="deleteOwner(owner)" variant="ghost" size="sm" - class="text-red-600 hover:text-red-700" - title="删除" + :disabled="isTemplateUsed(owner)" + :class="[ + isTemplateUsed(owner) + ? 'text-gray-400 cursor-not-allowed' + : 'text-red-600 hover:text-red-700' + ]" + :title="isTemplateUsed(owner) ? '该模板已关联域名,无法删除' : '删除'" > @@ -511,7 +516,8 @@ export default { c_ct_m: '', c_adr_m: '', c_pc: '' - } + }, + templateUsageMap: {} // 新增:存储模板使用状态 }; }, computed: { @@ -614,6 +620,39 @@ export default { return typeMap[type] || type || '-'; }, + // 检查模板是否被域名使用 + isTemplateUsed(owner) { + // 从缓存中获取使用状态 + return this.templateUsageMap[owner.name] || false; + }, + + // 检查所有模板的使用状态 + async checkAllTemplateUsage() { + if (this.owners.length === 0) return; + + try { + for (const owner of this.owners) { + const checkRequest = createResource({ + url: 'jcloud.api.domain_west.check_template_usage', + params: { template_name: owner.name }, + onSuccess: (response) => { + if (response && response.status === 'Success') { + this.templateUsageMap[owner.name] = response.data.is_used; + } else { + this.templateUsageMap[owner.name] = false; + } + }, + onError: (error) => { + this.templateUsageMap[owner.name] = false; + } + }); + checkRequest.submit(); + } + } catch (error) { + // 静默处理错误 + } + }, + // 获取域名所有者列表 async fetchOwners() { this.isLoading = true; @@ -637,6 +676,7 @@ export default { total: response.data.total || 0, pagecount: response.data.pagecount || 0 }; + this.checkAllTemplateUsage(); // 检查所有模板的使用状态 } else { this.error = response.message || '获取域名所有者列表失败'; } @@ -768,21 +808,13 @@ export default { this.fetchOwners(); // 刷新列表 this.closeEditDialog(); // 关闭编辑弹窗 } else { - console.error('更新失败 - response:', response); toast.error(response.message || '更新失败'); } // 确保在所有情况下都重置 loading 状态 this.editLoading = false; }, onError: (error) => { - console.error('=== onError 回调 ==='); - console.error('error:', error); - console.error('error.message:', error.message); - console.error('error.response:', error.response); - const errorMessage = getToastErrorMessage(error); - console.error('errorMessage:', errorMessage); - toast.error(errorMessage); this.editLoading = false; } @@ -791,11 +823,6 @@ export default { editRequest.submit(); } catch (error) { - console.error('=== catch 错误 ==='); - console.error('catch error:', error); - console.error('catch error.message:', error.message); - console.error('catch error.stack:', error.stack); - toast.error('更新失败,请稍后重试'); this.editLoading = false; } diff --git a/jcloud/api/domain_west.py b/jcloud/api/domain_west.py index d761f56..49c3f1b 100644 --- a/jcloud/api/domain_west.py +++ b/jcloud/api/domain_west.py @@ -3376,6 +3376,44 @@ def update_domain_owner(name, **data): setattr(domain_owner, key, value) updated_fields.append(f"{key}: {old_value} -> {value}") + # 重新生成完整姓名和标题 + if 'c_ln_m' in data or 'c_fn_m' in data or 'c_org_m' in data or 'c_regtype' in data: + # 获取最新的姓名信息 + c_ln_m = data.get('c_ln_m', getattr(domain_owner, 'c_ln_m', '')) + c_fn_m = data.get('c_fn_m', getattr(domain_owner, 'c_fn_m', '')) + c_org_m = data.get('c_org_m', getattr(domain_owner, 'c_org_m', '')) + c_regtype = data.get('c_regtype', getattr(domain_owner, 'c_regtype', 'I')) + + # 重新生成完整姓名 + domain_owner.fullname = c_ln_m + c_fn_m + + # 重新生成标题 + if c_regtype == 'I': # 个人 + domain_owner.title = f"{c_ln_m}{c_fn_m}" + else: # 企业 + domain_owner.title = f"{c_org_m}" + + # 重新生成英文姓名(如果中文姓名有变化) + if 'c_ln_m' in data or 'c_fn_m' in data: + if c_ln_m: + last_name_pinyin = ' '.join(lazy_pinyin(c_ln_m)) + domain_owner.c_ln = last_name_pinyin.title() + if c_fn_m: + first_name_pinyin = ' '.join(lazy_pinyin(c_fn_m)) + domain_owner.c_fn = first_name_pinyin.title() + + # 重新生成英文单位名称(如果中文单位名称有变化) + if 'c_org_m' in data and c_org_m: + org_pinyin = ' '.join(lazy_pinyin(c_org_m)) + domain_owner.c_org = org_pinyin.title() + + updated_fields.append(f"fullname: 已更新") + updated_fields.append(f"title: 已更新") + if 'c_ln_m' in data or 'c_fn_m' in data: + updated_fields.append(f"英文姓名: 已更新") + if 'c_org_m' in data: + updated_fields.append(f"英文单位名称: 已更新") + # 保存更新,使用 ignore_permissions=True 忽略权限检查 domain_owner.save(ignore_permissions=True) jingrow.db.commit() @@ -3445,3 +3483,28 @@ def delete_domain_owner(name): return {"status": "Error", "message": f"删除失败: {str(e)}"} +@jingrow.whitelist() +def check_template_usage(template_name): + """检查模板是否被域名使用""" + try: + if not template_name: + return {"status": "Error", "message": "模板名称不能为空"} + + # 检查是否有域名使用了这个模板 + used_domains = jingrow.get_all( + "Jsite Domain", + {"domain_owner": template_name}, + ["name", "domain"] + ) + + return { + "status": "Success", + "data": { + "is_used": len(used_domains) > 0, + "used_domains": used_domains + } + } + except Exception as e: + return {"status": "Error", "message": f"检查模板使用情况失败: {str(e)}"} + +