From 850a63b37c7be3d44d8c3abd51c083a7675c477d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wei=5F=E4=BD=B3?= Date: Fri, 14 Nov 2025 16:19:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=AF=81=E4=B9=A6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=BC=B9=E7=AA=97=E7=BB=84=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8A=A5=E5=91=8A=E5=92=8C=E8=AF=81=E4=B9=A6?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现CertificateModal.vue组件,包含上传和查看两种模式 - 支持缩略图文件列表上传,最多支持5个文件 - 报告文件支持下载原版报告功能 - 证书文件支持图片预览和删除功能 - 文件类型支持:图片、PDF、Word、视频,最大50MB - 使用Naive UI组件库,界面美观且交互友好 - 修复组件导入和类型检查问题,确保代码质量 --- .../audit/components/AuditDetail.vue | 86 +++- .../audit/components/CertificateModal.vue | 485 ++++++++++++++++++ 2 files changed, 558 insertions(+), 13 deletions(-) create mode 100644 web/src/views/valuation/audit/components/CertificateModal.vue diff --git a/web/src/views/valuation/audit/components/AuditDetail.vue b/web/src/views/valuation/audit/components/AuditDetail.vue index f8fd2e4..2bd6d5b 100644 --- a/web/src/views/valuation/audit/components/AuditDetail.vue +++ b/web/src/views/valuation/audit/components/AuditDetail.vue @@ -13,6 +13,7 @@ import { import { formatDate } from '@/utils' import TheIcon from '@/components/icon/TheIcon.vue' +import CertificateModal from './CertificateModal.vue' import { getStatusConfig } from '../constants' import { @@ -36,6 +37,11 @@ const emit = defineEmits(['back', 'approve', 'reject']) const activeDetailTab = ref('audit') +// 证书弹窗相关状态 +const certificateModalVisible = ref(false) +const certificateModalMode = ref('upload') // 'upload' 或 'view' +const certificateData = ref({}) + watch( () => props.detailData?.id, () => { @@ -55,6 +61,8 @@ const detailSections = computed(() => { { label: '资产名称', type: 'text', value: detail.asset_name || '-' }, { label: '所属机构', type: 'text', value: detail.institution || '-' }, { label: '所属行业', type: 'text', value: detail.industry || '-' }, + { label: '企业简介', type: 'text', value: detail.company_profile || '-' }, + { label: '业务简介', type: 'text', value: detail.business_profile || '-' }, ], }, { @@ -178,6 +186,31 @@ const detailSections = computed(() => { }) const calcFlow = computed(() => props.detailData?.calculation_result?.flow || []) + +// 证书相关功能 +const handleUploadCertificate = () => { + certificateModalMode.value = 'upload' + certificateData.value = {} + certificateModalVisible.value = true +} + +const handleViewCertificate = () => { + certificateModalMode.value = 'view' + // 这里可以从 props.detailData 中获取已上传的证书数据 + certificateData.value = { + title: '非遗传承人等级证书', + description: '非遗传承人等级证书相关文件', + files: props.detailData?.certificates || [] + } + certificateModalVisible.value = true +} + +const handleCertificateConfirm = (data) => { + console.log('证书数据:', data) + // 这里可以调用 API 保存证书数据 + $message?.success('证书上传成功') + certificateModalVisible.value = false +} @@ -277,13 +328,20 @@ const calcFlow = computed(() => props.detailData?.calculation_result?.flow || [] background: #fff; border-radius: 12px; padding: 24px; + .certificate-actions { + margin-top: 20px; + width: 100%; + display: flex; + justify-content: flex-end; + z-index: 100; + } } .detail-header { display: flex; justify-content: space-between; gap: 16px; - margin-bottom: 16px; + margin: -16px 0px 10px ; } .back-btn { @@ -446,4 +504,6 @@ const calcFlow = computed(() => props.detailData?.calculation_result?.flow || [] color: #999; padding: 40px 0; } + + diff --git a/web/src/views/valuation/audit/components/CertificateModal.vue b/web/src/views/valuation/audit/components/CertificateModal.vue new file mode 100644 index 0000000..fa61132 --- /dev/null +++ b/web/src/views/valuation/audit/components/CertificateModal.vue @@ -0,0 +1,485 @@ + + + + +