Files
Situation-Awareness-Platfor…/src/views/Jyh/AI/Home/components/OssDetail/VersionInfo.vue

519 lines
21 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="version-info">
<Card simple class="jyh-card mb-4">
<div class="card-title">基本信息
<i @click="toggleCard('basic')" :class="isExpanded.basic ? 'icon icon-chevron-up-2 float-right': 'icon icon-chevron-down-2 float-right'"></i>
</div>
<div v-if="isExpanded.basic">
<d-row class="mb-3">
<d-col :span="8">
<span class="card-key width-90">软件名称</span>
<span class="card-val">{{ ReleaseInfo.basicInfo.softwareName || '--' }}</span>
</d-col>
<d-col :span="8">
<span class="card-key width-90">软件版本</span>
<span class="card-val">{{ ReleaseInfo.basicInfo.softwareVersion || '--' }}</span>
</d-col>
<d-col :span="8">
<span class="card-key width-90">主语言类型</span>
<span class="card-val">{{ ReleaseInfo.basicInfo.mainLanguageType || '--' }}</span>
</d-col>
</d-row>
<d-row>
<d-col :span="8">
<span class="card-key width-90">开发商</span>
<span class="card-val">{{ ReleaseInfo.basicInfo.developer || '--' }}</span>
</d-col>
<d-col :span="8">
<span class="card-key width-90">发布时间</span>
<span class="card-val">
{{ ReleaseInfo.basicInfo.releaseDate?dayjs(ReleaseInfo.basicInfo.releaseDate).format('YYYY-MM-DD') :'--' }}</span>
</d-col>
<!-- <d-col :span="8">-->
<!-- <span class="card-key width-90">版本描述</span>-->
<!-- <span class="card-val">{{ ReleaseInfo.basicInfo.versionDescription || '&#45;&#45;' }}</span>-->
<!-- </d-col>-->
</d-row>
</div>
</Card>
<Card simple class="jyh-card mb-4">
<div class="card-title">参考信息
<i @click="toggleCard('reference')" :class="isExpanded.reference ? 'icon icon-chevron-up-2 float-right': 'icon icon-chevron-down-2 float-right'"></i>
</div>
<div v-if="isExpanded.reference">
<d-row class="mb-3">
<d-col :span="8">
<span class="card-key width-110">集成风险</span>
<d-tag color="#F6933B">{{ ReleaseInfo.referenceInfo.integrationRisk || jcfxList[ReleaseInfo.basicInfo.integrationRiskLevel] || '--' }}</d-tag>
<!-- <span class="card-val">{{ ReleaseInfo.referenceInfo.integrationRisk || ReleaseInfo.basicInfo.integrationRisk || '&#45;&#45;' }}</span>-->
</d-col>
<d-col :span="8">
<span class="card-key width-110">代码量(L)</span>
<span class="card-val">{{ ReleaseInfo.referenceInfo.codeQuantity || '--' }}</span>
</d-col>
<d-col :span="8">
<span class="card-key width-110">漏洞数量</span>
<a style="cursor: pointer" @click="handleTabChange('ldxx')" class="card-url">
{{ ReleaseInfo.referenceInfo.vulnerabilityCount || '--' }}
</a>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="8">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
<span class="card-key width-110">社区EOL日期</span>
<span class="card-val">
{{ ReleaseInfo.criticalSoftwareAIGenerateInfo.communityEolDate?dayjs(ReleaseInfo.criticalSoftwareAIGenerateInfo.communityEolDate).format('YYYY-MM-DD') :'--' }}</span>
</d-col>
<d-col :span="8">
<span class="card-key width-110">所属领域/产业</span>
<span class="card-val">{{ getIndustryName(ReleaseInfo.referenceInfo.industry) || '--' }}</span>
</d-col>
<!-- <d-col :span="8">-->
<!-- <span class="card-key width-110">版本火车名称</span>-->
<!-- <span class="card-val">CleanSource V8.0</span>-->
<!-- </d-col>-->
</d-row>
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-140">源码下载包地址</span>
<a class="card-url" :href="ReleaseInfo.referenceInfo.sourceCodeDownloadUrl || '--'">{{ ReleaseInfo.referenceInfo.sourceCodeDownloadUrl || ReleaseInfo.basicInfo.sourceDownloadUrl || '--' }}</a>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-140">源码社区托管地址</span>
<a class="card-url" :href="ReleaseInfo.referenceInfo.sourceCodeCommunityUrl || '--'">{{ ReleaseInfo.referenceInfo.sourceCodeCommunityUrl || ReleaseInfo.basicInfo.communityWebsite || '--' }}</a>
</d-col>
</d-row>
<!-- <d-row>-->
<!-- <d-col :span="24">-->
<!-- <span class="card-key width-140">社区EOL披露地址</span>-->
<!-- <a class="card-url" :href="ReleaseInfo.referenceInfo.communityEolDisclosureUrl || '&#45;&#45;'">{{ ReleaseInfo.referenceInfo.communityEolDisclosureUrl || ReleaseInfo.basicInfo.eolNoticeUrl || '&#45;&#45;' }}</a>-->
<!-- </d-col>-->
<!-- </d-row>-->
</div>
</Card>
<Card simple class="jyh-card mb-4">
<div class="card-title">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
开源主License信息
<i @click="toggleCard('license')" :class="isExpanded.license ? 'icon icon-chevron-up-2 float-right': 'icon icon-chevron-down-2 float-right'"></i>
</div>
<div v-if="isExpanded.license" class="mb-3">
<d-table class="jyh-table jyh-table-2" :header-bg="true"
:data="[
{ name: ReleaseInfo.basicInfo.mainLicenseName || ReleaseInfo.criticalSoftwareAIGenerateInfo.mainLicenseName,
description: ReleaseInfo.basicInfo.mainLicenseDescription || ReleaseInfo.criticalSoftwareAIGenerateInfo.mainLicenseDescription}
]">
<d-column type="index" header="序号" width="80"></d-column>
<!-- <d-column field="id" header="编号"></d-column>-->
<d-column field="name" header="名称"></d-column>
<d-column field="description" header="描述"></d-column>
<!-- <d-column field="applicationScenario" header="应用场景"></d-column>-->
</d-table>
</div>
<!-- <d-row>-->
<!-- <d-col :span="24">-->
<!-- <span class="card-key width-140">主License分析报告</span>-->
<!-- <a class="card-url" href="https://designcloud.uiplus.huawei.com/developer/main/index.html">https://designcloud.uiplus.huawei.com/developer/main/index.html</a>-->
<!-- </d-col>-->
<!-- </d-row>-->
</Card>
<Card simple class="jyh-card mb-4">
<div class="card-title">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
Copyright报告
<i @click="toggleCard('copyright')" :class="isExpanded.copyright ? 'icon icon-chevron-up-2 float-right': 'icon icon-chevron-down-2 float-right'"></i>
</div>
<div v-if="isExpanded.copyright" class="mb-3">
<d-table
class="jyh-table jyh-table-2"
:header-bg="true"
:data="[
{
reportName: ReleaseInfo.basicInfo.copyrightReportName || ReleaseInfo.criticalSoftwareAIGenerateInfo.copyrightReportName,
reportUrl: ReleaseInfo.basicInfo.copyrightReportUrl || ReleaseInfo.criticalSoftwareAIGenerateInfo.copyrightReportUrl,
entryTime: ReleaseInfo.basicInfo.copyrightEntryTime || ReleaseInfo.criticalSoftwareAIGenerateInfo.copyrightEntryTime
}
]"
>
<d-column field="reportName" header="Copyright报告">
<template #default="scope">
<a :href="scope.row.reportUrl">{{ scope.row.reportName }}</a>
</template>
</d-column>
<d-column field="entryTime" header="录入时间"></d-column>
</d-table>
</div>
<!-- <d-row>-->
<!-- <d-col :span="24">-->
<!-- <span class="card-key width-140">主License分析报告</span>-->
<!-- <a class="card-url" href="https://designcloud.uiplus.huawei.com/developer/main/index.html">https://designcloud.uiplus.huawei.com/developer/main/index.html</a>-->
<!-- </d-col>-->
<!-- </d-row>-->
</Card>
<Card simple class="jyh-card mb-4">
<div class="card-title">实体
<i @click="toggleCard('entity')" :class="isExpanded.entity ? 'icon icon-chevron-up-2 float-right': 'icon icon-chevron-down-2 float-right'"></i>
</div>
<div v-if="isExpanded.entity">
<d-table
class="jyh-table jyh-table-2"
:header-bg="true"
:data="ReleaseInfo.entityInfoList"
>
<d-column field="entityType" header="类型"></d-column>
<d-column field="entityDownloadUrl" header="实体包下载地址">
<template #default="scope">
<a :href="scope.row.entityDownloadUrl" target="_blank">{{ scope.row.entityDownloadUrl }}</a>
</template>
</d-column>
<d-column field="entityFilename" header="文件名称"></d-column>
<d-column field="entryTime" header="录入时间"></d-column>
<d-column field="integrityCheckResult" header="完整性结果">
<template #default="scope">
<a @click="visible = true">{{ scope.row.integrityCheckResult }}</a>
</template>
</d-column>
</d-table>
</div>
</Card>
<Card simple class="jyh-card mb-4">
<div class="card-title">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
网络安全
<i @click="toggleCard('intSafe')" :class="isExpanded.intSafe ? 'icon icon-chevron-up-2 float-right': 'icon icon-chevron-down-2 float-right'"></i>
<!-- <span style="color: #3b82f6;font-size: 12px;font-weight: normal">(该数据由AI生成)</span>-->
</div>
<div v-if="isExpanded.intSafe">
<!-- <d-row class="mb-3">-->
<!-- <d-col :span="24">-->
<!-- <span class="card-key width-160">软件评分</span>-->
<!-- <span class="card-val">{{ ReleaseInfo.networkSecurity.softwareRating || '&#45;&#45;' }}</span>-->
<!-- </d-col>-->
<!-- </d-row>-->
<d-row class="mb-3">
<d-col :span="24">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
<span class="card-key width-160">社区安全问题求助</span>
<a class="card-url" :href="ReleaseInfo.basicInfo.securityHelpChannel || ReleaseInfo.criticalSoftwareAIGenerateInfo.securityHelpChannel || ''" target="_blank">{{
ReleaseInfo.basicInfo.securityHelpChannel || ReleaseInfo.criticalSoftwareAIGenerateInfo.securityHelpChannel || '--'
}}</a>
</d-col>
</d-row>
<div class="mb-3 flex">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
<span class="card-key width-160">官网漏洞披露地址</span>
<d-table style="display: contents" class="jyh-table jyh-table-2" :header-bg="true" :data="vulnDisclosureUrl">
<!-- <d-column field="id" header="编号"></d-column> -->
<d-column field="厂商" header="厂商"></d-column>
<d-column field="软件名称" header="软件名称"></d-column>
<!-- <d-column field="source" header="来源"></d-column> -->
<d-column field="软件地址" header="来源url"> </d-column>
</d-table>
</div>
<div class="mb-3 flex">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
<span class="card-key width-160">外部漏洞源的软件名称</span>
<d-table
style="display: contents"
class="jyh-table jyh-table-2"
:header-bg="true"
:data="externalVulnSourceInfo"
>
<!-- <d-column field="id" header="编号"></d-column> -->
<d-column field="厂商" header="厂商"></d-column>
<d-column field="软件名称" header="软件名称"></d-column>
<!-- <d-column field="source" header="来源"></d-column> -->
<d-column field="软件地址" header="来源url"> </d-column>
</d-table>
</div>
<d-row class="mb-3">
<d-col :span="24">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
<span class="card-key width-160">是否涉及用户登录</span>
<span class="card-val">{{ securityInfoList.involvesUserLogin ? '是' : '否' }}</span>
</d-col>
</d-row>
<d-row>
<d-col :span="24">
<d-tooltip position="left" content="此内容由AI辅助生成">
<img
style="width: 14px; height: 14px;display: inline-block"
src="@/assets/imgs/jyh/aiLogo.png"
/>
</d-tooltip>
<span class="card-key width-160">是否安卓类APP组件</span>
<span class="card-val">{{ securityInfoList.isAndroidComponent ? '是' : '否' }}</span>
</d-col>
</d-row>
</div>
</Card>
<d-modal
title="完整性结果详情"
v-model="visible"
class="file-search-modal"
:style="{ width: '800px', height: '400px' }"
@close="handleClose"
>
<Card simple class="jyh-card mb-4" style="box-shadow: none; padding: 0">
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-160">社区哈希类型</span>
<span class="card-val">sha512</span>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-160">社区哈希值</span>
<span class="card-val">sha5123b831bee9d575a2729065f830a65f830a65f83a65f852...</span>
<d-tooltip content="复制" :mouse-enter-delay="800">
<Icon name="icon-copy" class="ml-10 w-4 flex-shrink-0" color="#9FA7B3" @click="handleCopy" />
</d-tooltip>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-160">社区签名校验结果</span>
<span class="card-val card-success">通过</span>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-160">社区签名</span>
<span class="card-val">确认无社区签名</span>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-160">社区签名下载地址</span>
<span class="card-val">确认无社区签名</span>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-160">社区公钥</span>
<span class="card-val">确认无社区签名</span>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="24">
<span class="card-key width-160">社区公钥下载地址</span>
<span class="card-val">确认无社区签名</span>
</d-col>
</d-row>
</Card>
<template #footer>
<d-modal-footer style="text-align: center">
<d-button variant="solid" color="primary" @click="handleClose">确认</d-button>
<d-button @click="handleClose">取消</d-button>
</d-modal-footer>
</template>
</d-modal>
</div>
</template>
<script setup lang="ts">
import { ref, defineEmits, onMounted, reactive,computed,defineProps,toRef } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { discussDetailType, userInfoType } from '@/api/discussion/types';
import { Message } from 'vue-devui/message';
import { useClipboard } from '@vueuse/core/index';
import { releaseInfo } from '@/api/jyh';
import { useGlobalInfoStore } from '@/stores/Global';
import dayjs from 'dayjs';
const route = useRoute();
const emits = defineEmits(['changeTabs']);
const props = defineProps(['ReleaseInfo']);
// 触发事件的方法
const handleTabChange = (tabName) => {
emits('changeTabs', tabName); // 触发 changeTabs 事件,并传递参数
};
const jcfxList = ['','低','中','高'];
const visible = ref(false);
// 将 props.ReleaseInfo 转换为响应式引用
const ReleaseInfo = toRef(props, 'ReleaseInfo');
const globalInfo = useGlobalInfoStore();
const industryList = ref(globalInfo.industryList);
const getIndustryName = (value) => {
const industry = industryList.value.find((item) => item.value === value);
return industry ? industry.name : '未知行业'; // 如果找不到,返回默认值
};
// 定义每个 Card 的展开状态
const isExpanded = ref({
basic: false,
reference: false,
license: false,
copyright: false,
entity: false,
intSafe: false
});
// 切换 Card 展开状态
const toggleCard = (cardType) => {
isExpanded.value[cardType] = !isExpanded.value[cardType];
};
const securityInfoList = computed(() => {
if(ReleaseInfo.value.securityInfoList&&ReleaseInfo.value.securityInfoList.length>0) {
return ReleaseInfo.value.securityInfoList[0]
} else if(ReleaseInfo.value.softwareSecurityAIGenerateInfo&&ReleaseInfo.value.softwareSecurityAIGenerateInfo.length>0) {
return ReleaseInfo.value.softwareSecurityAIGenerateInfo[0]
} else {
return {}
}
});
const vulnDisclosureUrl = computed(() => {
if(ReleaseInfo.value.softwareSecurityAIGenerateInfo) {
const _vulnDisclosureUrl: any = JSON.parse(ReleaseInfo?.value.softwareSecurityAIGenerateInfo[0]?.vulnDisclosureUrl || '[]');
return _vulnDisclosureUrl || [];
} else {
return []
}
});
const externalVulnSourceInfo = computed(() => {
if(props.ReleaseInfo) {
const _vulnDisclosureUrl: any = JSON.parse(props.ReleaseInfo?.softwareSecurityAIGenerateInfo[0]?.externalVulnSourceInfo || '[]');
return _vulnDisclosureUrl || [];
} else {
return []
}
});
const router = useRouter();
// 跳转
const gotoDetail = (row) => {
// 后续请换成params暂时params传参没传过去
router.push({
path: 'repoDetail/' + row.version,
params: { tab: 'ldxx' } // 指定需要激活的 Tab
});
};
// 跳转
const handleClose = (row) => {
visible.value = false;
};
const { copy } = useClipboard();
const handleCopy = (event) => {
event.stopPropagation();
copy('');
Message.success('复制成功');
};
const getReleaseInfo = async (versionId) => {
const { data, error } = await releaseInfo({ softwareId: versionId });
if (!error && data) {
ReleaseInfo.value = data.data;
}
};
onMounted(() => {
// const versionId = route.params.versionId; // 获取路由参数 versionId
// if (versionId) {
// getReleaseInfo(versionId); // 调用接口获取数据
// }
});
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.jyh-card {
background: #F3F3F3 !important;
.card-title {
margin-bottom: 0 !important;
}
}
.card-key {
color: #777777;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
width: 112px;
margin-right: 20px;
}
.card-val {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
.card-success {
display: inline-block;
border-radius: 4px;
background: #81c054;
color: #ffffff;
font-family: HarmonyOS Sans SC;
font-weight: medium;
font-size: 12px;
line-height: 20px;
height: 20px;
letter-spacing: 0px;
text-align: left;
padding: 0 8px;
}
</style>