Files
Situation-Awareness-Platfor…/src/views/Jyh/Version/Detail/SBOM.vue

152 lines
3.9 KiB
Vue
Raw Normal View History

2025-03-15 12:37:16 +08:00
<template>
<div class="flex align-center justify-start">
<d-search icon-position="left" style="width: 380px" placeholder="请输入搜索软件名称"></d-search>
<d-checkbox class="ml-10" label="只显示有漏洞的软件" :isShowTitle="false" v-model="checked" />
2025-03-15 12:37:16 +08:00
</div>
<Card simple class="jyh-card mt-3">
<div class="clear-padding">
2025-03-19 21:47:34 +08:00
<d-table class="jyh-table" v-if="tableData.length>0" :indent="32" @check-change="treeCheckChange" :data="tableData" row-key="id">
<d-column field="licenseName" header="组织名称" show-overflow-tooltip>
2025-03-15 17:33:05 +08:00
<template #default="scope">
2025-03-19 21:47:34 +08:00
<a class="devui-link" @click="showDetail = true">{{ scope.row.licenseName }}</a>
2025-03-15 17:33:05 +08:00
</template>
</d-column>
2025-03-19 21:47:34 +08:00
<d-column field="latestVersion" header="版本"></d-column>
2025-03-15 12:37:16 +08:00
</d-table>
2025-03-19 19:07:42 +08:00
<NoData v-else :small="false"></NoData>
2025-03-15 12:37:16 +08:00
</div>
</Card>
2025-03-15 17:33:05 +08:00
<d-drawer v-model="showDetail" style="width: 800px; padding: 20px">
2025-03-19 21:47:34 +08:00
<SBOMDetail :selectRow="selectRow" @close="showDetail = false" />
2025-03-15 17:33:05 +08:00
</d-drawer>
2025-03-15 12:37:16 +08:00
</template>
<script setup lang="ts">
2025-03-19 21:47:34 +08:00
import { ref, reactive, onMounted, defineProps } from 'vue';
2025-03-15 17:33:05 +08:00
import SBOMDetail from './SBOMDetail.vue';
2025-03-19 19:07:42 +08:00
import NoData from '@/components/NoData/NoData.vue';
2025-03-19 21:47:34 +08:00
import { dependencyTree, getVulnList } from '@/api/jyh';
2025-03-19 13:04:13 +08:00
import { useRoute } from 'vue-router';
2025-03-19 21:47:34 +08:00
const propsData = defineProps(['versionId']);
2025-03-15 12:37:16 +08:00
const checked = ref(false);
2025-03-19 13:04:13 +08:00
const route = useRoute(); // 获取路由对象
2025-03-15 17:33:05 +08:00
const showDetail = ref(false);
2025-03-15 12:37:16 +08:00
const baseTreeTableData1 = ref([
{
id: '1',
2025-03-19 21:47:34 +08:00
licenseName: 'openssl',
latestVersion: 'N.A.',
components: [
2025-03-15 12:37:16 +08:00
{
id: '2',
2025-03-19 21:47:34 +08:00
licenseName: 'ssl',
latestVersion: 'N.A.',
components: [
2025-03-15 12:37:16 +08:00
{
id: '3',
2025-03-19 21:47:34 +08:00
licenseName: 'ssl',
latestVersion: 'N.A.'
2025-03-15 12:37:16 +08:00
},
{
id: '4',
2025-03-19 21:47:34 +08:00
licenseName: 'crypto',
latestVersion: 'N.A.'
2025-03-15 12:37:16 +08:00
}
]
}
]
},
{
id: '5',
2025-03-19 21:47:34 +08:00
licenseName: 'Text-Template-1.56',
latestVersion: 'N.A.',
2025-03-15 12:37:16 +08:00
children: [
{
id: '6',
2025-03-19 21:47:34 +08:00
licenseName: 'ssl',
latestVersion: 'N.A.',
2025-03-15 12:37:16 +08:00
children: [
{
id: '7',
2025-03-19 21:47:34 +08:00
licenseName: 'ssl',
latestVersion: 'N.A.'
2025-03-15 12:37:16 +08:00
},
{
id: '8',
2025-03-19 21:47:34 +08:00
licenseName: 'crypto',
latestVersion: 'N.A.'
2025-03-15 12:37:16 +08:00
}
]
}
]
},
{
id: '9',
2025-03-19 21:47:34 +08:00
licenseName: 'Text-Template-1.56',
latestVersion: 'N.A.'
2025-03-15 12:37:16 +08:00
}
]);
2025-03-19 21:47:34 +08:00
const tableData = ref([]);
const renameComponentsToChildren = (obj) => {
// 如果传入的不是对象,直接返回
if (typeof obj !== 'object' || obj === null) {
return obj;
}
// 如果对象有 `components` 属性,将其改为 `children`
if (obj.hasOwnProperty('components')) {
obj.children = obj.components; // 将 components 改为 children
delete obj.components; // 删除原来的 components 属性
}
// 递归处理对象的子元素
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
obj[key] = renameComponentsToChildren(obj[key]); // 递归处理子对象
}
}
return obj;
}
2025-03-15 12:37:16 +08:00
const treeCheckChange = (val, row, selection) => {
console.log('treeCheckChange', selection);
};
2025-03-19 13:04:13 +08:00
2025-03-19 21:47:34 +08:00
const fetchDependencyTree = async () => {
const { data } = await dependencyTree({
// softwareId: 47,
softwareId: propsData.versionId,
componentId: '',
current: 1,
size: 10
});
if(data.data.code===200 &&data?.data?.data &&data?.data?.data.total>0) {
tableData.value = [renameComponentsToChildren(data?.data?.data)] || [];
// pager.value.total = data?.data?.data?.total || [];
} else {
// tableData.value = baseTreeTableData1.value
}
}
onMounted( () => {
fetchDependencyTree()
2025-03-19 13:04:13 +08:00
});
2025-03-15 12:37:16 +08:00
</script>
<style scoped lang="scss">
.clear-padding {
margin: -16px -20px;
}
:deep(.devui-table__cell) {
display: flex;
align-items: center;
.devui-table__tree-operate {
transform: translateY(-3px);
}
}
</style>