可信代码库-软件详情数据修改
This commit is contained in:
BIN
src/assets/imgs/jyh/aiLogo.png
Normal file
BIN
src/assets/imgs/jyh/aiLogo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 689 B |
102
src/components/ChartBar/index.vue
Normal file
102
src/components/ChartBar/index.vue
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<template>
|
||||||
|
<d-row class="mt-3" v-if="inited">
|
||||||
|
<d-col :span="12">
|
||||||
|
<d-chart :option="optionConChart" style="width: 100%; height: 400px"></d-chart>
|
||||||
|
<p class="text-center mt-translate-y">国家/地球分布</p>
|
||||||
|
</d-col>
|
||||||
|
<d-col :span="12">
|
||||||
|
<d-chart :option="optionOrgChart" style="width: 100%; height: 400px"></d-chart>
|
||||||
|
<p class="text-center mt-translate-y">组织/公司分布</p>
|
||||||
|
</d-col>
|
||||||
|
</d-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, reactive, computed } from 'vue';
|
||||||
|
import { DChart } from 'vue-devui/echarts';
|
||||||
|
|
||||||
|
const inited = ref(false);
|
||||||
|
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
companyGraph: Array<any>;
|
||||||
|
countryGraph: Array<any>;
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
companyGraph: () => [],
|
||||||
|
countryGraph: () => []
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const options = (x: any, y: any, color = '#2070F3') => {
|
||||||
|
return {
|
||||||
|
tooltip: {
|
||||||
|
show: true,
|
||||||
|
trigger: 'item'
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: x,
|
||||||
|
axisLabel: {
|
||||||
|
interval: 0, // 强制显示所有标签
|
||||||
|
// rotate: 45, // 如果标签过长,可以旋转标签
|
||||||
|
fontSize: 12 // 调整字体大小
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
// 给y轴添加单位后缀
|
||||||
|
axisLabel: {
|
||||||
|
formatter: '{value}%'
|
||||||
|
},
|
||||||
|
name: '单位',
|
||||||
|
type: 'value'
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
data: y,
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: '30',
|
||||||
|
// 给label添加单位后缀
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: 'top',
|
||||||
|
formatter: '{c}%'
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
color,
|
||||||
|
borderRadius: [5, 5, 0, 0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const optionConChart = computed(() => {
|
||||||
|
return options(
|
||||||
|
props.countryGraph.map((d) => d.name),
|
||||||
|
props.countryGraph.map((d) => d.value),
|
||||||
|
'#2070F3'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
const optionOrgChart = computed(() => {
|
||||||
|
return options(
|
||||||
|
props.companyGraph.map((d) => d.name),
|
||||||
|
props.companyGraph.map((d) => d.value),
|
||||||
|
'#2CB8C9'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const onInited = () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
inited.value = true;
|
||||||
|
}, 100);
|
||||||
|
};
|
||||||
|
// 向外暴露onInited方法
|
||||||
|
defineExpose({ onInited });
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.mt-translate-y {
|
||||||
|
transform: translateY(-30px);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -156,7 +156,7 @@ const fetchVulnList = async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (data.data.code === 200) {
|
if (data.data.code === 200) {
|
||||||
tableData.value = data?.data?.data?.components || [];
|
tableData.value = data?.data?.data?.records || [];
|
||||||
pager.value.total = data?.data?.data?.total || 0;
|
pager.value.total = data?.data?.data?.total || 0;
|
||||||
// pager.value.total = data?.data?.data?.total || [];
|
// pager.value.total = data?.data?.data?.total || [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,6 +134,9 @@
|
|||||||
<template v-else-if="column.key === 'programmingLanguage'">
|
<template v-else-if="column.key === 'programmingLanguage'">
|
||||||
<d-tag type="success">{{ scope.row.programmingLanguage }}</d-tag>
|
<d-tag type="success">{{ scope.row.programmingLanguage }}</d-tag>
|
||||||
</template>
|
</template>
|
||||||
|
<template v-else-if="column.key === 'primaryLanguage'">
|
||||||
|
<d-tag type="primary">{{ scope.row.primaryLanguage }}</d-tag>
|
||||||
|
</template>
|
||||||
<template v-else-if="column.key === 'contributorCountries'">
|
<template v-else-if="column.key === 'contributorCountries'">
|
||||||
<!-- <div style="cursor: pointer" @click="openCountryModal(column)">-->
|
<!-- <div style="cursor: pointer" @click="openCountryModal(column)">-->
|
||||||
<!-- <span class="mr-2">美国 3.57%</span>-->
|
<!-- <span class="mr-2">美国 3.57%</span>-->
|
||||||
@@ -282,7 +285,7 @@ const defultColumns = ref([
|
|||||||
{ key: 'softwareName', label: '软件名称', visible: true, filterable: true, sortable: false },
|
{ key: 'softwareName', label: '软件名称', visible: true, filterable: true, sortable: false },
|
||||||
{ key: 'softwareVersion', label: '软件版本', visible: true, filterable: true, sortable: false },
|
{ key: 'softwareVersion', label: '软件版本', visible: true, filterable: true, sortable: false },
|
||||||
{ key: 'securityScore', label: '软件评分', visible: true, filterable: false, sortable: true },
|
{ key: 'securityScore', label: '软件评分', visible: true, filterable: false, sortable: true },
|
||||||
{ key: 'licenseNum', label: 'License数量', visible: true, filterable: false, sortable: false,width: 140 },
|
// { key: 'licenseNum', label: 'License数量', visible: true, filterable: false, sortable: false,width: 140 },
|
||||||
{ key: 'industryCategory', label: '行业类型', visible: true, filterable: true, sortable: false },
|
{ key: 'industryCategory', label: '行业类型', visible: true, filterable: true, sortable: false },
|
||||||
{ key: 'primaryLanguage', label: '编程语言', visible: true, filterable: true, sortable: false },
|
{ key: 'primaryLanguage', label: '编程语言', visible: true, filterable: true, sortable: false },
|
||||||
{ key: 'codeLines', label: '代码量', visible: true, filterable: false, sortable: false },
|
{ key: 'codeLines', label: '代码量', visible: true, filterable: false, sortable: false },
|
||||||
@@ -312,7 +315,7 @@ const columns = ref([
|
|||||||
{ key: 'softwareName', label: '软件名称', visible: true, filterable: true, sortable: false },
|
{ key: 'softwareName', label: '软件名称', visible: true, filterable: true, sortable: false },
|
||||||
{ key: 'softwareVersion', label: '软件版本', visible: true, filterable: true, sortable: false },
|
{ key: 'softwareVersion', label: '软件版本', visible: true, filterable: true, sortable: false },
|
||||||
{ key: 'securityScore', label: '软件评分', visible: true, filterable: false, sortable: true },
|
{ key: 'securityScore', label: '软件评分', visible: true, filterable: false, sortable: true },
|
||||||
{ key: 'licenseNum', label: 'License数量', visible: true, filterable: false, sortable: false,width: 140 },
|
// { key: 'licenseNum', label: 'License数量', visible: true, filterable: false, sortable: false,width: 140 },
|
||||||
{ key: 'industryCategory', label: '行业类型', visible: true, filterable: true, sortable: false },
|
{ key: 'industryCategory', label: '行业类型', visible: true, filterable: true, sortable: false },
|
||||||
{ key: 'primaryLanguage', label: '编程语言', visible: true, filterable: true, sortable: false },
|
{ key: 'primaryLanguage', label: '编程语言', visible: true, filterable: true, sortable: false },
|
||||||
{ key: 'codeLines', label: '代码量', visible: true, filterable: false, sortable: false },
|
{ key: 'codeLines', label: '代码量', visible: true, filterable: false, sortable: false },
|
||||||
|
|||||||
@@ -1,55 +1,118 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="version-info">
|
<div class="version-info">
|
||||||
<Card simple class="jyh-card mb-4">
|
<Card simple class="jyh-card mb-4">
|
||||||
<div class="card-title">基本信息</div>
|
<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>
|
||||||
|
基本信息
|
||||||
|
<!-- <span style="color: #3b82f6;font-size: 12px;font-weight: normal">(该数据由AI生成)</span>-->
|
||||||
|
</div>
|
||||||
<d-row class="mb-3">
|
<d-row class="mb-3">
|
||||||
<d-col :span="8">
|
<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-90">社区名称</span>
|
<span class="card-key width-90">社区名称</span>
|
||||||
<span class="card-val">{{ infos.communityName }}</span>
|
<span class="card-val">{{propsData.ReleaseInfo?.basicInfo?.communityName || propsData.ReleaseInfo?.criticalSoftwareAIGenerateInfo?.communityName || '--'}}</span>
|
||||||
</d-col>
|
</d-col>
|
||||||
<d-col :span="8">
|
<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-90">官网地址</span>
|
<span class="card-key width-90">官网地址</span>
|
||||||
<a :href="infos.communityWebsite" class="card-url">{{ infos.communityWebsite }}</a>
|
<a :href="propsData.ReleaseInfo?.basicInfo?.communityWebsite || propsData.ReleaseInfo?.criticalSoftwareAIGenerateInfo?.communityName" class="card-url">{{
|
||||||
|
propsData.ReleaseInfo?.basicInfo?.communityWebsite || propsData.ReleaseInfo?.criticalSoftwareAIGenerateInfo?.communityName ||'--' }}</a>
|
||||||
</d-col>
|
</d-col>
|
||||||
<d-col :span="8">
|
<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-90">联系方式</span>
|
<span class="card-key width-90">联系方式</span>
|
||||||
<span class="card-val">{{ infos.communityContact }}</span>
|
<span class="card-val">{{
|
||||||
|
propsData.ReleaseInfo?.basicInfo?.communityContact || propsData.ReleaseInfo?.criticalSoftwareAIGenerateInfo?.communityContact ||'--' }}</span>
|
||||||
</d-col>
|
</d-col>
|
||||||
</d-row>
|
</d-row>
|
||||||
<d-row class="mb-3">
|
<d-row class="mb-3">
|
||||||
<d-col :span="24">
|
<d-col :span="24">
|
||||||
<div class="flex">
|
<div class="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-90 flex-shrink-0">社区描述</span>
|
<span class="card-key width-90 flex-shrink-0">社区描述</span>
|
||||||
<span class="card-val flex-grow-1">{{ infos.communityDescription }}</span>
|
<span class="card-val flex-grow-1">{{
|
||||||
|
propsData.ReleaseInfo?.basicInfo?.communityDescription || propsData.ReleaseInfo?.criticalSoftwareAIGenerateInfo?.communityDescription ||'--' }}</span>
|
||||||
</div>
|
</div>
|
||||||
</d-col>
|
</d-col>
|
||||||
</d-row>
|
</d-row>
|
||||||
</Card>
|
</Card>
|
||||||
<Card simple class="jyh-card mb-4">
|
<Card simple class="jyh-card mb-4">
|
||||||
<div class="card-title">贡献者分布</div>
|
<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>
|
||||||
|
贡献者分布
|
||||||
|
</div>
|
||||||
<p class="card-desc">有关Pull Request创建者的公司信息和地区分布(使用公共GitHub信息进行分析)</p>
|
<p class="card-desc">有关Pull Request创建者的公司信息和地区分布(使用公共GitHub信息进行分析)</p>
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<chart-line ref="chartLine" :companyGraph="infos.companyGraph" :countryGraph="infos.countryGraph" />
|
<chart-bar ref="chartBarRef" :companyGraph="companyGraph" :countryGraph="countryGraph" />
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import { ref, reactive, onMounted } from 'vue';
|
import ChartBar from '@/components/ChartBar/index.vue';
|
||||||
import SBOMDetail from './SBOMDetail.vue';
|
import { computed, defineProps, onMounted, ref } from 'vue';
|
||||||
import { communityInfo } from '@/api/jyh';
|
|
||||||
import { useRoute } from 'vue-router';
|
|
||||||
import ChartLine from '@/components/ChartLine/index.vue';
|
|
||||||
|
|
||||||
const route = useRoute(); // 获取路由对象
|
const propsData = defineProps(['versionId','ReleaseInfo']);
|
||||||
|
|
||||||
const chartLine = ref();
|
const chartBarRef = ref();
|
||||||
const infos = ref({});
|
|
||||||
onMounted(async () => {
|
const countryGraph = computed(() => {
|
||||||
const { data } = await communityInfo(Number(route.params.versionId));
|
if(propsData.ReleaseInfo.criticalSoftwareAIGenerateInfo&&propsData.ReleaseInfo.criticalSoftwareAIGenerateInfo.contributorCountries) {
|
||||||
infos.value = data?.data?.data || {};
|
let countriesObj = JSON.parse(propsData.ReleaseInfo.criticalSoftwareAIGenerateInfo.contributorCountries);
|
||||||
chartLine.value.onInited();
|
return Object.entries(countriesObj).map(([name, value]) => ({
|
||||||
|
name,
|
||||||
|
value
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const companyGraph = computed(() => {
|
||||||
|
if(propsData.ReleaseInfo.criticalSoftwareAIGenerateInfo&&propsData.ReleaseInfo.criticalSoftwareAIGenerateInfo.organizationDistribution) {
|
||||||
|
let countriesObj = JSON.parse(propsData.ReleaseInfo.criticalSoftwareAIGenerateInfo.organizationDistribution);
|
||||||
|
return Object.entries(countriesObj).map(([name, value]) => ({
|
||||||
|
name,
|
||||||
|
value
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
chartBarRef.value.onInited();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -54,9 +54,15 @@
|
|||||||
</d-row>
|
</d-row>
|
||||||
<d-row class="mb-3">
|
<d-row class="mb-3">
|
||||||
<d-col :span="8">
|
<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-key width-110">社区EOL日期</span>
|
||||||
<span class="card-val">
|
<span class="card-val">
|
||||||
{{ ReleaseInfo.referenceInfo.communityEolDate?dayjs(ReleaseInfo.referenceInfo.communityEolDate).format('YYYY-MM-DD') :'--' }}</span>
|
{{ ReleaseInfo.criticalSoftwareAIGenerateInfo.communityEolDate?dayjs(ReleaseInfo.criticalSoftwareAIGenerateInfo.communityEolDate).format('YYYY-MM-DD') :'--' }}</span>
|
||||||
</d-col>
|
</d-col>
|
||||||
<d-col :span="8">
|
<d-col :span="8">
|
||||||
<span class="card-key width-110">所属领域/产业</span>
|
<span class="card-key width-110">所属领域/产业</span>
|
||||||
@@ -79,18 +85,29 @@
|
|||||||
<a class="card-url" :href="ReleaseInfo.referenceInfo.sourceCodeCommunityUrl || '--'">{{ ReleaseInfo.referenceInfo.sourceCodeCommunityUrl || ReleaseInfo.basicInfo.communityWebsite || '--' }}</a>
|
<a class="card-url" :href="ReleaseInfo.referenceInfo.sourceCodeCommunityUrl || '--'">{{ ReleaseInfo.referenceInfo.sourceCodeCommunityUrl || ReleaseInfo.basicInfo.communityWebsite || '--' }}</a>
|
||||||
</d-col>
|
</d-col>
|
||||||
</d-row>
|
</d-row>
|
||||||
<d-row>
|
<!-- <d-row>-->
|
||||||
<d-col :span="24">
|
<!-- <d-col :span="24">-->
|
||||||
<span class="card-key width-140">社区EOL披露地址</span>
|
<!-- <span class="card-key width-140">社区EOL披露地址</span>-->
|
||||||
<a class="card-url" :href="ReleaseInfo.referenceInfo.communityEolDisclosureUrl || '--'">{{ ReleaseInfo.referenceInfo.communityEolDisclosureUrl || ReleaseInfo.basicInfo.eolNoticeUrl || '--' }}</a>
|
<!-- <a class="card-url" :href="ReleaseInfo.referenceInfo.communityEolDisclosureUrl || '--'">{{ ReleaseInfo.referenceInfo.communityEolDisclosureUrl || ReleaseInfo.basicInfo.eolNoticeUrl || '--' }}</a>-->
|
||||||
</d-col>
|
<!-- </d-col>-->
|
||||||
</d-row>
|
<!-- </d-row>-->
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card simple class="jyh-card mb-4">
|
<Card simple class="jyh-card mb-4">
|
||||||
<div class="card-title">开源主License信息</div>
|
<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信息</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<d-table class="jyh-table jyh-table-2" :header-bg="true" :data="ReleaseInfo.openSourceLicenseList">
|
<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 type="index" header="序号" width="80"></d-column>
|
||||||
<!-- <d-column field="id" header="编号"></d-column>-->
|
<!-- <d-column field="id" header="编号"></d-column>-->
|
||||||
<d-column field="name" header="名称"></d-column>
|
<d-column field="name" header="名称"></d-column>
|
||||||
@@ -106,21 +123,29 @@
|
|||||||
<!-- </d-row>-->
|
<!-- </d-row>-->
|
||||||
</Card>
|
</Card>
|
||||||
<Card simple class="jyh-card mb-4">
|
<Card simple class="jyh-card mb-4">
|
||||||
<div class="card-title">Copyright报告</div>
|
<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报告</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<d-table
|
<d-table
|
||||||
class="jyh-table jyh-table-2"
|
class="jyh-table jyh-table-2"
|
||||||
:header-bg="true"
|
:header-bg="true"
|
||||||
:data="[
|
:data="[
|
||||||
{
|
{
|
||||||
reportName: 'Copyright (c) Isaac Z. Schlueter and Contributors',
|
reportName: ReleaseInfo.basicInfo.copyrightReportName || ReleaseInfo.criticalSoftwareAIGenerateInfo.copyrightReportName,
|
||||||
entryTime: '2025-03-20'
|
reportUrl: ReleaseInfo.basicInfo.copyrightReportUrl || ReleaseInfo.criticalSoftwareAIGenerateInfo.copyrightReportUrl,
|
||||||
|
entryTime: ReleaseInfo.basicInfo.copyrightEntryTime || ReleaseInfo.criticalSoftwareAIGenerateInfo.copyrightEntryTime
|
||||||
}
|
}
|
||||||
]"
|
]"
|
||||||
>
|
>
|
||||||
<d-column field="reportName" header="Copyright报告">
|
<d-column field="reportName" header="Copyright报告">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.reportName }}
|
<a :href="scope.row.reportUrl">{{ scope.row.reportName }}</a>
|
||||||
</template>
|
</template>
|
||||||
</d-column>
|
</d-column>
|
||||||
<d-column field="entryTime" header="录入时间"></d-column>
|
<d-column field="entryTime" header="录入时间"></d-column>
|
||||||
@@ -140,27 +165,119 @@
|
|||||||
<d-table
|
<d-table
|
||||||
class="jyh-table jyh-table-2"
|
class="jyh-table jyh-table-2"
|
||||||
:header-bg="true"
|
:header-bg="true"
|
||||||
:data="[
|
:data="ReleaseInfo.entityInfoList"
|
||||||
{
|
|
||||||
type: '二进制包',
|
|
||||||
entityPackageDownloadUrl: 'https://raw.gitcode.com/file/inherits/inherits.tar',
|
|
||||||
fileName: 'inherits.tar',
|
|
||||||
entryTime: '2025-03-20'
|
|
||||||
}
|
|
||||||
]"
|
|
||||||
>
|
>
|
||||||
<d-column field="type" header="类型"></d-column>
|
<d-column field="entityType" header="类型"></d-column>
|
||||||
<d-column field="entityPackageDownloadUrl" header="实体包下载地址">
|
<d-column field="entityDownloadUrl" header="实体包下载地址">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<a class="card-url" :href="scope.row.entityPackageDownloadUrl || '--'">{{ scope.row.entityPackageDownloadUrl || '--' }}</a>
|
<a :href="scope.row.entityDownloadUrl" target="_blank">{{ scope.row.entityDownloadUrl }}</a>
|
||||||
</template>
|
</template>
|
||||||
</d-column>
|
</d-column>
|
||||||
<d-column field="fileName" header="文件名称"></d-column>
|
<d-column field="entityFilename" header="文件名称"></d-column>
|
||||||
<d-column field="entryTime" 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>
|
</d-table>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</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>
|
||||||
|
网络安全
|
||||||
|
<!-- <span style="color: #3b82f6;font-size: 12px;font-weight: normal">(该数据由AI生成)</span>-->
|
||||||
|
</div>
|
||||||
|
<!-- <d-row class="mb-3">-->
|
||||||
|
<!-- <d-col :span="24">-->
|
||||||
|
<!-- <span class="card-key width-160">软件评分</span>-->
|
||||||
|
<!-- <span class="card-val">{{ ReleaseInfo.networkSecurity.softwareRating || '--' }}</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>
|
||||||
|
</Card>
|
||||||
|
|
||||||
<d-modal
|
<d-modal
|
||||||
title="完整性结果详情"
|
title="完整性结果详情"
|
||||||
v-model="visible"
|
v-model="visible"
|
||||||
@@ -226,7 +343,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, defineEmits, onMounted, reactive } from 'vue';
|
import { ref, defineEmits, onMounted, reactive,computed,defineProps,toRef } from 'vue';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
import { discussDetailType, userInfoType } from '@/api/discussion/types';
|
import { discussDetailType, userInfoType } from '@/api/discussion/types';
|
||||||
import { Message } from 'vue-devui/message';
|
import { Message } from 'vue-devui/message';
|
||||||
@@ -236,23 +353,15 @@ import { useGlobalInfoStore } from '@/stores/Global';
|
|||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const emits = defineEmits(['changeTabs']);
|
const emits = defineEmits(['changeTabs']);
|
||||||
|
const props = defineProps(['ReleaseInfo']);
|
||||||
// 触发事件的方法
|
// 触发事件的方法
|
||||||
const handleTabChange = (tabName) => {
|
const handleTabChange = (tabName) => {
|
||||||
emits('changeTabs', tabName); // 触发 changeTabs 事件,并传递参数
|
emits('changeTabs', tabName); // 触发 changeTabs 事件,并传递参数
|
||||||
};
|
};
|
||||||
const jcfxList = ['','低','中','高'];
|
const jcfxList = ['','低','中','高'];
|
||||||
const licenseTableData = ref([{ code: '05822156', name: 'MIT License', detail: 'integer' }]);
|
|
||||||
const CopyrightTableData = ref([{ code: '05822156', detail: 'integer' }]);
|
|
||||||
const visible = ref(false);
|
const visible = ref(false);
|
||||||
const ReleaseInfo = ref({
|
// 将 props.ReleaseInfo 转换为响应式引用
|
||||||
basicInfo: {},
|
const ReleaseInfo = toRef(props, 'ReleaseInfo');
|
||||||
copyRightReportList: [],
|
|
||||||
entityList: [],
|
|
||||||
networkSecurity: {},
|
|
||||||
openSourceLicenseList: [],
|
|
||||||
referenceInfo: {}
|
|
||||||
});
|
|
||||||
const globalInfo = useGlobalInfoStore();
|
const globalInfo = useGlobalInfoStore();
|
||||||
const industryList = ref(globalInfo.industryList);
|
const industryList = ref(globalInfo.industryList);
|
||||||
const getIndustryName = (value) => {
|
const getIndustryName = (value) => {
|
||||||
@@ -260,6 +369,34 @@ const getIndustryName = (value) => {
|
|||||||
return industry ? industry.name : '未知行业'; // 如果找不到,返回默认值
|
return industry ? industry.name : '未知行业'; // 如果找不到,返回默认值
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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) {
|
||||||
|
debugger
|
||||||
|
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 router = useRouter();
|
||||||
|
|
||||||
// 跳转
|
// 跳转
|
||||||
@@ -292,10 +429,10 @@ const getReleaseInfo = async (versionId) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const versionId = route.params.versionId; // 获取路由参数 versionId
|
// const versionId = route.params.versionId; // 获取路由参数 versionId
|
||||||
if (versionId) {
|
// if (versionId) {
|
||||||
getReleaseInfo(versionId); // 调用接口获取数据
|
// getReleaseInfo(versionId); // 调用接口获取数据
|
||||||
}
|
// }
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -55,9 +55,9 @@
|
|||||||
</d-tabs>
|
</d-tabs>
|
||||||
</div>
|
</div>
|
||||||
<div class="version-detail-content">
|
<div class="version-detail-content">
|
||||||
<version-info :versionId="versionId" v-if="selectTab === 'bbxx'" @changeTabs="changeTabs"></version-info>
|
<version-info :ReleaseInfo="ReleaseInfo" v-if="selectTab === 'bbxx'" @changeTabs="changeTabs"></version-info>
|
||||||
<vulnerabilities-list :versionId="versionId" v-else-if="selectTab === 'ldxx'"></vulnerabilities-list>
|
<vulnerabilities-list :versionId="versionId" v-else-if="selectTab === 'ldxx'"></vulnerabilities-list>
|
||||||
<community-info :versionId="versionId" v-else-if="selectTab === 'communityInfo'"></community-info>
|
<community-info :versionId="versionId" :ReleaseInfo="ReleaseInfo" v-else-if="selectTab === 'communityInfo'"></community-info>
|
||||||
<Dependence :versionId="versionId" v-else-if="selectTab === 'ylgx'"></Dependence>
|
<Dependence :versionId="versionId" v-else-if="selectTab === 'ylgx'"></Dependence>
|
||||||
<SBOM :versionId="versionId" v-else-if="selectTab === 'SBOM'" />
|
<SBOM :versionId="versionId" v-else-if="selectTab === 'SBOM'" />
|
||||||
<AIRepair :versionId="versionId" v-else-if="selectTab === 'ai'"></AIRepair>
|
<AIRepair :versionId="versionId" v-else-if="selectTab === 'ai'"></AIRepair>
|
||||||
|
|||||||
Reference in New Issue
Block a user