diff --git a/dashboard/src2/components/DomainOwner.vue b/dashboard/src2/components/DomainOwner.vue index 960bdf0..437a059 100644 --- a/dashboard/src2/components/DomainOwner.vue +++ b/dashboard/src2/components/DomainOwner.vue @@ -28,14 +28,6 @@
- + 个人 + + +
+ + + +
+ +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ + + + +
+
+ + +
+
+ + @@ -326,7 +469,6 @@ export default { isLoading: false, error: null, searchQuery: '', - selectedType: '', selectedStatus: '', pagination: { pageno: 1, @@ -337,7 +479,21 @@ export default { showCreateDialog: false, createLoading: false, showDetailDialog: false, - selectedOwner: null + selectedOwner: null, + showEditDialog: false, + editLoading: false, + editFormData: { // 新增:编辑弹窗的数据 + c_regtype: 'I', // 默认个人 + c_org_m: '', + c_ln_m: '', + c_fn_m: '', + c_em: '', + c_ph: '', + c_st_m: '', + c_ct_m: '', + c_adr_m: '', + c_pc: '' + } }; }, computed: { @@ -355,14 +511,15 @@ export default { }); } - // 类型过滤 - if (this.selectedType) { - filtered = filtered.filter(owner => owner.c_regtype === this.selectedType); - } - // 状态过滤 if (this.selectedStatus) { - filtered = filtered.filter(owner => String(owner.r_status) === this.selectedStatus); + filtered = filtered.filter(owner => { + // 根据r_status字段判断实名认证状态 + // 0: 未实名, 1: 实名成功, 2: 实名中, 3: 实名失败, 4: 认证过期, 5: 待审核 + const rStatus = owner.r_status; + const isVerified = rStatus === '1'; // 只有状态为'1'才是已实名认证 + return String(isVerified ? '1' : '0') === this.selectedStatus; + }); } return filtered; @@ -388,28 +545,67 @@ export default { // 获取实名认证状态文本 getRealNameStatusText(status) { + if (!status || status === '') { + return '未实名认证'; + } + // 根据r_status字段判断实名认证状态 + // 0: 未实名, 1: 实名成功, 2: 实名中, 3: 实名失败, 4: 认证过期, 5: 待审核 const statusMap = { - '1': '已认证', - '0': '未认证', - '2': '认证中', - '3': '认证失败', - '4': '认证过期', + '0': '未实名认证', + '1': '已实名认证', + '2': '实名认证中', + '3': '实名认证失败', + '4': '实名认证过期', '5': '待审核' }; - return statusMap[String(status)] || '未知'; + return statusMap[status] || '未实名认证'; }, - // 获取实名认证状态样式 - getRealNameStatusVariant(status) { - const variantMap = { - '1': 'success', // 已认证 - 绿色 - '0': 'warning', // 未认证 - 橙色 - '2': 'blue', // 认证中 - 蓝色 - '3': 'danger', // 认证失败 - 红色 - '4': 'danger', // 认证过期 - 红色 - '5': 'blue' // 待审核 - 蓝色 + // 获取所有者类型文本 + getOwnerTypeText(type) { + if (!type || type === '') return '未知'; + const typeMap = { + 'I': '个人', + 'E': '企业/组织' }; - return variantMap[String(status)] || 'default'; + return typeMap[type] || '未知'; + }, + + // 获取地址信息 + getAddressInfo(owner) { + const addressParts = []; + if (owner.c_st_m) addressParts.push(owner.c_st_m); + if (owner.c_ct_m) addressParts.push(owner.c_ct_m); + if (owner.c_adr_m) addressParts.push(owner.c_adr_m); + if (owner.c_pc) addressParts.push(owner.c_pc); + return addressParts.join(' '); + }, + + // 获取证件类型名称 + getCertificateTypeName(type) { + const typeMap = { + // 字符串格式映射 + 'SFZ': '身份证', + 'HZ': '护照', + 'GAJMTX': '港澳居民来往内地通行证', + 'TWJMTX': '台湾居民来往大陆通行证', + 'WJLSFZ': '外国人永久居留身份证', + 'GAJZZ': '港澳台居民居住证', + 'ORG': '组织机构代码证', + 'YYZZ': '工商营业执照', + 'TYDM': '统一社会信用代码', + // 数字格式映射 + '1': '身份证', + '5': '护照', + '6': '港澳居民来往内地通行证', + '11': '台湾居民来往大陆通行证', + '12': '外国人永久居留身份证', + '30': '港澳台居民居住证', + '2': '组织机构代码证', + '3': '工商营业执照', + '4': '统一社会信用代码' + }; + return typeMap[type] || type || '-'; }, // 获取域名所有者列表 @@ -499,27 +695,95 @@ export default { // 编辑域名所有者 editOwner(owner) { - // TODO: 实现编辑功能 - console.log('编辑所有者:', owner); - // 关闭详情弹窗(如果是从详情弹窗点击编辑) - if (this.showDetailDialog) { - this.closeDetailDialog(); + this.selectedOwner = owner; + this.editFormData = { // 填充编辑表单数据 + c_regtype: owner.c_regtype, + c_org_m: owner.c_org_m || '', + c_ln_m: owner.c_ln_m || '', + c_fn_m: owner.c_fn_m || '', + c_em: owner.c_em || '', + c_ph: owner.c_ph || '', + c_st_m: owner.c_st_m || '', + c_ct_m: owner.c_ct_m || '', + c_adr_m: owner.c_adr_m || '', + c_pc: owner.c_pc || '' + }; + this.showDetailDialog = false; // 关闭详情弹窗 + this.showEditDialog = true; // 打开编辑弹窗 + }, + + // 关闭编辑弹窗 + closeEditDialog() { + this.showEditDialog = false; + this.selectedOwner = null; + this.editFormData = { // 清空编辑表单数据 + c_regtype: 'I', + c_org_m: '', + c_ln_m: '', + c_fn_m: '', + c_em: '', + c_ph: '', + c_st_m: '', + c_ct_m: '', + c_adr_m: '', + c_pc: '' + }; + }, + + // 处理编辑提交 + async handleEditSubmit() { + + this.editLoading = true; + + try { + // 构建请求参数 + const requestParams = { + name: this.selectedOwner.name, + ...this.editFormData + }; + + const editRequest = createResource({ + url: 'jcloud.api.domain_west.update_domain_owner', + params: requestParams, + onSuccess: (response) => { + + if (response.status === 'Success') { + toast.success('域名所有者模板更新成功!'); + this.fetchOwners(); // 刷新列表 + this.closeEditDialog(); // 关闭编辑弹窗 + } else { + console.error('更新失败 - response:', response); + toast.error(response.message || '更新失败'); + 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; + } + }); + + 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; } }, - // 获取证件类型名称 - getCertificateTypeName(type) { - const typeMap = { - 'SFZ': '身份证', - 'HZ': '护照', - 'YYZZ': '营业执照', - 'ORG': '组织机构代码证' - }; - return typeMap[type] || type || '-'; - }, - - - // 上一页 previousPage() { if (this.pagination.pageno > 1) { diff --git a/jcloud/api/domain_west.py b/jcloud/api/domain_west.py index 5111ea9..3c4dfa0 100644 --- a/jcloud/api/domain_west.py +++ b/jcloud/api/domain_west.py @@ -1803,7 +1803,9 @@ def get_domain_owners(): domain_owners = jingrow.get_all( "Domain Owner", {"team": team}, - ["name", "title", "fullname", "c_regtype", "c_org_m", "c_ln_m", "c_fn_m"] + ["name", "title", "fullname", "c_regtype", "c_org_m", "c_ln_m", "c_fn_m", + "c_em", "c_ph", "c_st_m", "c_ct_m", "c_adr_m", "c_pc", "r_status", + "c_idtype_gswl", "c_idnum_gswl", "c_sysid"] ) return { @@ -3205,3 +3207,133 @@ def modify_west_contact_template(**data): return {"status": "error", "message": f"修改实名模板资料失败: {str(e)}"} +@jingrow.whitelist() +def update_domain_owner(name, **data): + """更新域名所有者信息""" + try: + jingrow.log_error("update_domain_owner", f"开始更新域名所有者 - name: {name}, data: {data}") + + if not name: + jingrow.log_error("update_domain_owner", "域名所有者名称不能为空") + return {"status": "Error", "message": "域名所有者名称不能为空"} + + # 获取指定的域名所有者 + jingrow.log_error("update_domain_owner", f"正在获取域名所有者: {name}") + domain_owner = jingrow.get_pg("Domain Owner", name) + if not domain_owner: + jingrow.log_error("update_domain_owner", f"未找到指定的域名所有者: {name}") + return {"status": "Error", "message": "未找到指定的域名所有者"} + + jingrow.log_error("update_domain_owner", f"找到域名所有者: {domain_owner.name}, team: {getattr(domain_owner, 'team', 'None')}") + + # 检查权限(只能更新当前团队的所有者) + jingrow.log_error("update_domain_owner", "正在检查权限...") + team = get_current_team() + jingrow.log_error("update_domain_owner", f"当前团队: {team}") + + if not team: + jingrow.log_error("update_domain_owner", "未找到当前团队") + return {"status": "Error", "message": "未找到当前团队"} + + if domain_owner.team != team: + jingrow.log_error("update_domain_owner", f"权限检查失败 - 所有者团队: {domain_owner.team}, 当前团队: {team}") + return {"status": "Error", "message": "无权更新该域名所有者信息"} + + jingrow.log_error("update_domain_owner", "权限检查通过,开始更新西部数码模板...") + + # 检查是否有 c_sysid(西部数码模板标识) + c_sysid = getattr(domain_owner, 'c_sysid', None) + if not c_sysid: + jingrow.log_error("update_domain_owner", "域名所有者没有 c_sysid,无法更新西部数码模板") + return {"status": "Error", "message": "域名所有者没有模板标识,无法更新"} + + # 构建西部数码模板更新数据 + template_data = { + 'c_sysid': c_sysid + } + + # 添加需要更新的字段 + field_mapping = { + 'c_regtype': 'c_regtype', + 'c_org_m': 'c_org_m', + 'c_ln_m': 'c_ln_m', + 'c_fn_m': 'c_fn_m', + 'c_em': 'c_em', + 'c_ph': 'c_ph', + 'c_st_m': 'c_st_m', + 'c_ct_m': 'c_ct_m', + 'c_adr_m': 'c_adr_m', + 'c_pc': 'c_pc', + 'c_ph_type': 'c_ph_type', + 'c_ph_code': 'c_ph_code', + 'c_ph_num': 'c_ph_num', + 'c_ph_fj': 'c_ph_fj', + 'reg_contact_type': 'reg_contact_type', + 'c_idtype_gswl': 'c_idtype_gswl', + 'c_idnum_gswl': 'c_idnum_gswl' + } + + for local_field, template_field in field_mapping.items(): + if local_field in data: + template_data[template_field] = data[local_field] + + # 添加现有字段(如果新数据中没有提供) + for local_field, template_field in field_mapping.items(): + if template_field not in template_data and hasattr(domain_owner, local_field): + current_value = getattr(domain_owner, local_field, None) + if current_value: + template_data[template_field] = current_value + + jingrow.log_error("update_domain_owner", f"准备调用 modify_west_contact_template,参数: {template_data}") + + # 调用西部数码模板更新接口 + try: + west_result = modify_west_contact_template(**template_data) + + jingrow.log_error("update_domain_owner", f"西部数码模板更新结果: {west_result}") + + if west_result.get('status') != 'success': + error_msg = west_result.get('message', '西部数码模板更新失败') + jingrow.log_error("update_domain_owner", f"西部数码模板更新失败: {error_msg}") + return {"status": "Error", "message": f"西部数码模板更新失败: {error_msg}"} + + jingrow.log_error("update_domain_owner", "西部数码模板更新成功,开始更新本地记录...") + + except Exception as e: + jingrow.log_error("update_domain_owner", f"调用 modify_west_contact_template 失败: {str(e)}") + return {"status": "Error", "message": f"西部数码模板更新失败: {str(e)}"} + + # 西部数码模板更新成功后,更新本地记录 + updated_fields = [] + for key, value in data.items(): + if hasattr(domain_owner, key): + old_value = getattr(domain_owner, key, None) + setattr(domain_owner, key, value) + updated_fields.append(f"{key}: {old_value} -> {value}") + jingrow.log_error("update_domain_owner", f"更新字段 {key}: {old_value} -> {value}") + else: + jingrow.log_error("update_domain_owner", f"字段 {key} 不存在于 Domain Owner 中") + + jingrow.log_error("update_domain_owner", f"更新的字段: {updated_fields}") + + # 保存更新 + jingrow.log_error("update_domain_owner", "正在保存本地更新...") + domain_owner.save() + jingrow.log_error("update_domain_owner", "本地记录保存成功") + + return { + "status": "Success", + "message": "域名所有者信息更新成功", + "data": { + "name": domain_owner.name, + "title": domain_owner.title + } + } + except Exception as e: + jingrow.log_error("update_domain_owner", f"更新域名所有者信息失败: {str(e)}") + jingrow.log_error("update_domain_owner", f"异常详情: {type(e).__name__}: {str(e)}") + import traceback + jingrow.log_error("update_domain_owner", f"堆栈跟踪: {traceback.format_exc()}") + return {"status": "Error", "message": f"更新域名所有者信息失败: {str(e)}"} + +