可信代码库V2版-安全智库页面原型开发、安全检测中心页面原型开发、关于我们页面原型开发

This commit is contained in:
fmk1023
2025-11-06 10:54:58 +08:00
parent 533e20b2f3
commit f5b59fadd9
29 changed files with 8077 additions and 650 deletions

View File

@@ -63,3 +63,10 @@ export function queryTaskSoftwareDetail(params: {taskId: number}) {
});
}
export function uvdV1Chat(params) {
return request({
url: `/uvd/v1/chat`,
method: 'post',
data: params,
});
}

310
src/api/jyh/home.ts Normal file
View File

@@ -0,0 +1,310 @@
import request from '@/utils/request';
export function getStatistics (): Promise<any> {
return request({
url: `/trust/data/homeStatistics`,
method: 'post',
data: {
current: 1,
size: 10
}
});
}
export function alertsPage(): Promise<any> {
return request({
url: `/api/v1/alerts/page`,
method: 'get'
});
}
// 1. 定义排行类型(与父组件对应)
export type RankType = 'usageCount' | 'falseNegativeCount' | 'falsePositiveCount';
// 2. 定义机构类型(原有)
export type InstitutionKey = '全部' | '华中科技大学' | '武汉大学' | '信息支援部队工程大学';
/**
* 获取工具排行数据
* @param institutionKey - 机构标识(全部/华中科技大学/武汉大学/信息支援部队工程大学)
* @returns 对应机构的工具数据
*/
/**
* 获取工具排行数据
* @param institutionKey - 机构标识
* @param rankType - 排行类型(使用次数/漏报次数/误报次数)
* @returns 对应机构+对应类型的工具数据
*/
export function getToolRankData(
institutionKey: InstitutionKey = '全部',
rankType: RankType = 'usageCount' // 新增:排行类型参数
): Promise<any> {
// 1. 定义完整数据:为每个工具补充“使用次数/漏报次数/误报次数”模拟值
const allInstitutionData = [
{
institution: '华中科技大学',
score: 92,
tools: [
{
name: '代码扫描工具V2.1',
score: 95,
falsePositiveRate: 2.3,
falseNegativeRate: 3.1,
usageRate: 89,
usageCount: 1280, // 模拟:使用次数
falseNegativeCount: 15, // 模拟:漏报次数(按漏报率*使用次数估算)
falsePositiveCount: 28 // 模拟:误报次数(按误报率*使用次数估算)
},
{
name: '漏洞检测系统V3.0',
score: 89,
falsePositiveRate: 3.5,
falseNegativeRate: 4.2,
usageRate: 76,
usageCount: 950,
falseNegativeCount: 40,
falsePositiveCount: 33
},
{
name: '合规性校验工具',
score: 86,
falsePositiveRate: 1.8,
falseNegativeRate: 2.5,
usageRate: 68,
usageCount: 720,
falseNegativeCount: 18,
falsePositiveCount: 13
}
]
},
{
institution: '武汉大学',
score: 88,
tools: [
{
name: '开源风险评估工具',
score: 91,
falsePositiveRate: 2.8,
falseNegativeRate: 3.3,
usageRate: 82,
usageCount: 1120,
falseNegativeCount: 37,
falsePositiveCount: 31
},
{
name: '依赖检查器V2.5',
score: 85,
falsePositiveRate: 3.9,
falseNegativeRate: 2.9,
usageRate: 73,
usageCount: 880,
falseNegativeCount: 25,
falsePositiveCount: 34
},
{
name: '协议解析工具',
score: 87,
falsePositiveRate: 1.5,
falseNegativeRate: 2.1,
usageRate: 91,
usageCount: 1350,
falseNegativeCount: 28,
falsePositiveCount: 20
}
]
},
{
institution: '信息支援部队工程大学',
score: 94,
tools: [
{
name: '军密级检测工具',
score: 96,
falsePositiveRate: 1.2,
falseNegativeRate: 1.8,
usageRate: 95,
usageCount: 1560,
falseNegativeCount: 28,
falsePositiveCount: 19
},
{
name: '供应链审计系统',
score: 93,
falsePositiveRate: 2.1,
falseNegativeRate: 2.4,
usageRate: 88,
usageCount: 1080,
falseNegativeCount: 26,
falsePositiveCount: 23
},
{
name: '涉密代码识别工具',
score: 90,
falsePositiveRate: 1.7,
falseNegativeRate: 1.5,
usageRate: 79,
usageCount: 920,
falseNegativeCount: 14,
falsePositiveCount: 16
}
]
}
];
// 2. 根据“机构key”筛选数据逻辑不变
let filteredData: any[];
switch (institutionKey) {
case '全部':
// 全部机构:聚合所有工具,保留“所属机构”字段
filteredData = allInstitutionData.reduce((acc, curr) => {
const toolWithInstitution = curr.tools.map(tool => ({
...tool,
belongInstitution: curr.institution
}));
return [...acc, ...toolWithInstitution];
}, [] as any[]);
break;
case '华中科技大学':
case '武汉大学':
case '信息支援部队工程大学':
// 单个机构:返回该机构完整数据
filteredData = allInstitutionData.filter(item => item.institution === institutionKey);
break;
default:
filteredData = [];
}
// 3. 模拟接口返回(直接返回筛选后的数据,父组件按需取对应类型的次数)
return new Promise(resolve => {
setTimeout(() => {
resolve({
code: 200,
message: 'success',
data: filteredData // 数据中包含所有次数字段父组件按rankType取对应值
});
}, 300);
});
// 实际接口调用携带“机构key”和“排行类型”参数
// return request({
// url: `/trust/data/toolRank`,
// method: 'get',
// params: {
// institutionKey,
// rankType // 传排行类型给后端
// }
// });
}
// 工具精度数据接口
export function getToolAccuracyData(institutionKey: string): Promise<any> {
// 直接返回模拟数据
return new Promise(resolve => {
setTimeout(() => {
// 不同机构的精度数据
const accuracyMap = {
'华中科技大学': {
falsePositiveRate: 2.5,
falseNegativeRate: 3.2,
bestTool: '代码扫描工具V2.1',
coverageRate: 92
},
'武汉大学': {
falsePositiveRate: 3.1,
falseNegativeRate: 2.8,
bestTool: '协议解析工具',
coverageRate: 88
},
'信息支援部队工程大学': {
falsePositiveRate: 1.5,
falseNegativeRate: 1.7,
bestTool: '军密级检测工具',
coverageRate: 96
}
};
resolve({
code: 200,
message: 'success',
data: accuracyMap[institutionKey] || {
falsePositiveRate: 0,
falseNegativeRate: 0,
bestTool: '暂无数据',
coverageRate: 0
}
});
}, 300);
});
// 实际接口调用(注释掉,使用模拟数据)
// return request({
// url: `/trust/data/toolAccuracy`,
// method: 'get',
// params: { institutionKey }
// });
}
/**
* 获取功能卡片数值数据
* @param institutionKey - 机构标识(全部/华中科技大学/武汉大学/信息支援部队工程大学)
* @returns 对应机构的功能卡片统计数据(申请数/入库数/任务数等)
*/
export function getFunctionCardData(institutionKey: InstitutionKey = '全部'): Promise<any> {
// 1. 定义各机构的功能卡片原始数据(模拟不同机构的数值差异)
const allInstitutionCardData = {
'全部': {
statistics: {
softwareGovernanceApply: '1286', // 软件治理申请数(全部机构总和)
softwareSmartStorage: '856', // 软件智能入库数
governanceTaskList: '498', // 治理任务列表数
trustedSelectionSet: '18', // 可信选型设置数
trustedSoftwareList: '1624' // 可信软件列表数
}
},
'华中科技大学': {
statistics: {
softwareGovernanceApply: '428', // 华科申请数占比约33%
softwareSmartStorage: '296', // 华科入库数
governanceTaskList: '168', // 华科任务数
trustedSelectionSet: '124', // 华科选型数
trustedSoftwareList: '542' // 华科可信软件数
}
},
'武汉大学': {
statistics: {
softwareGovernanceApply: '386', // 武大申请数
storageCount: '258', // 武大入库数
governanceTaskList: '152', // 武大任务数
trustedSelectionSet: '112', // 武大选型数
trustedSoftwareList: '486' // 武大可信软件数
}
},
'信息支援部队工程大学': {
statistics: {
softwareGovernanceApply: '472', // 国防科大申请数(军工相关需求多,数值偏高)
softwareSmartStorage: '302', // 国防科大入库数
governanceTaskList: '178', // 国防科大任务数
trustedSelectionSet: '140', // 国防科大选型数
trustedSoftwareList: '596' // 国防科大可信软件数
}
}
};
// 2. 根据传入的机构key匹配对应数据直接从原始数据中取值
const responseData = allInstitutionCardData[institutionKey] || allInstitutionCardData['全部'];
// 3. 模拟接口返回(统一格式:与工具排行接口保持一致的 code/message 结构)
return new Promise(resolve => {
setTimeout(() => {
resolve({
code: 200,
message: 'success',
data: responseData // 返回对应机构的统计数据(包含 statistics 字段)
});
}, 200); // 延迟200ms模拟网络请求
});
// 实际接口调用(后续替换为真实请求,携带机构参数)
// return request({
// url: `/trust/data/functionCard`,
// method: 'get',
// params: { institutionKey } // 传机构参数给后端
// });
}

View File

@@ -498,3 +498,12 @@ export function fetchCheckAuthenticate(data) {
data: data,
});
}
export const getNoticeAdd = (data): Promise<any> => {
return request({
url: `/notice/add`,
method: 'POST',
data
});
};

213
src/api/jyh/scanCenter.ts Normal file
View File

@@ -0,0 +1,213 @@
import request from '@/utils/request';
// @/api/scanCenter.ts
/**
* 获取历史检测记录
* @param params 分页和筛选参数 { page, size, status }
* @returns 历史记录列表
*/
export function getScanHistory(params: { page: number; size: number; status?: string }): Promise<any> {
return new Promise(resolve => {
setTimeout(() => {
// 模拟历史记录数据
const mockRecords = [
{
taskId: 'scan_1689234567890',
target: 'https://example.com',
type: 'url',
status: 'completed',
riskLevel: '高危',
startTime: '2024-07-13T09:23:45',
completeTime: '2024-07-13T09:25:12',
duration: 87000,
riskStats: { critical: 1, high: 3, medium: 2, low: 5 }
},
{
taskId: 'scan_1689231234567',
target: 'app-release.apk',
type: 'file',
status: 'completed',
riskLevel: '中危',
startTime: '2024-07-12T15:42:18',
completeTime: '2024-07-12T15:47:33',
duration: 315000,
riskStats: { critical: 0, high: 0, medium: 2, low: 1 }
},
{
taskId: 'scan_1689228901234',
target: 'SBOM内容',
type: 'sbom',
status: 'failed',
riskLevel: '-',
startTime: '2024-07-12T14:15:30',
completeTime: '2024-07-12T14:16:05',
duration: 35000,
errorMsg: '格式解析错误:缺少必填字段"version"'
},
{
taskId: 'scan_1689225678901',
target: 'https://test-api.com/v1',
type: 'url',
status: 'completed',
riskLevel: '低危',
startTime: '2024-07-12T10:08:22',
completeTime: '2024-07-12T10:09:45',
duration: 83000,
riskStats: { critical: 0, high: 0, medium: 0, low: 2 }
}
];
// 筛选逻辑
let filtered = mockRecords;
if (params.status && params.status !== 'all') {
filtered = filtered.filter(item => item.status === params.status);
}
// 分页逻辑
const total = filtered.length;
const start = (params.page - 1) * params.size;
const records = filtered.slice(start, start + params.size);
resolve({
code: 200,
message: 'success',
data: {
total,
records,
page: params.page,
size: params.size,
pages: Math.ceil(total / params.size)
}
});
}, 300);
});
// 实际接口调用(注释掉,使用模拟数据)
// return request({
// url: `/scan/history`,
// method: 'get',
// params
// });
}
/**
* 提交检测任务
* @param data 任务数据 { type, target, file?, content? }
* @returns 任务信息
*/
export function submitScanTask(data: {
type: 'file' | 'url' | 'sbom';
target: string;
file?: FormData;
content?: string;
}): Promise<any> {
return new Promise(resolve => {
setTimeout(() => {
// 生成唯一任务ID
const taskId = `scan_${Date.now()}`;
const now = new Date().toISOString();
resolve({
code: 200,
message: '任务提交成功',
data: {
taskId,
type: data.type,
target: data.target,
status: 'pending', // 初始状态:等待中
progress: 0,
startTime: now,
estimatedCompleteTime: new Date(Date.now() + 300000).toISOString(), // 预计5分钟后完成
currentStep: '等待调度'
}
});
}, 500);
});
// 实际接口调用(注释掉,使用模拟数据)
// return request({
// url: `/scan/submit`,
// method: 'post',
// data
// });
}
/**
* 获取检测任务状态
* @param taskId 任务ID
* @returns 任务当前状态信息
*/
export function getScanStatus(taskId: string): Promise<any> {
return new Promise(resolve => {
setTimeout(() => {
// 解析任务ID中的时间戳模拟任务创建时间
const createTime = parseInt(taskId.split('_')[1] || Date.now().toString());
const now = Date.now();
const elapsed = now - createTime;
// 模拟状态流转
let status: string, progress: number, currentStep: string, completeTime: string | null = null;
if (elapsed < 3000) { // 前3秒等待中
status = 'pending';
progress = 0;
currentStep = '等待调度';
} else if (elapsed < 15000) { // 3-15秒检测中进度递增
status = 'scanning';
progress = Math.min(Math.floor((elapsed - 3000) / 12000 * 100), 90);
currentStep = progress < 30 ? '初始化检测环境' :
progress < 60 ? '执行漏洞扫描' : '生成初步报告';
} else { // 15秒后完成80%概率或失败20%概率)
const isSuccess = Math.random() > 0.2;
status = isSuccess ? 'completed' : 'failed';
progress = 100;
completeTime = new Date().toISOString();
if (isSuccess) {
currentStep = '检测完成';
} else {
currentStep = '检测失败';
}
}
// 模拟风险统计(仅当任务完成时)
const riskStats = status === 'completed'
? {
critical: Math.floor(Math.random() * 2),
high: Math.floor(Math.random() * 3),
medium: Math.floor(Math.random() * 5),
low: Math.floor(Math.random() * 8)
}
: null;
// 模拟错误信息(仅当任务失败时)
const errorMsg = status === 'failed'
? ['网络连接超时', '目标资源不可访问', '检测引擎异常'][Math.floor(Math.random() * 3)]
: null;
resolve({
code: 200,
message: 'success',
data: {
taskId,
status,
progress,
currentStep,
startTime: new Date(createTime).toISOString(),
estimatedCompleteTime: new Date(createTime + 300000).toISOString(),
completeTime,
riskStats,
errorMsg,
totalChecks: status === 'completed' ? 20 + Math.floor(Math.random() * 30) : null,
completedChecks: status === 'scanning' ? Math.floor(progress / 100 * 40) : null
}
});
}, 300);
});
// 实际接口调用(注释掉,使用模拟数据)
// return request({
// url: `/scan/status/${taskId}`,
// method: 'get'
// });
}

View File

@@ -1543,3 +1543,176 @@ export const getOriginalComment = (params: types.DiscussionCommentProps): Promis
);
}
// 获取漏洞数据
export const getVulnDetail = (alertId: types.VulnDetailProps): Promise<any> => {
return reqCatch(() =>
request({
url: `/api/v1/alerts/${alertId}`,
method: 'get'
})
);
};
// 获取漏洞数据
export const getVulnAffected = (params: types.VulnDetailProps): Promise<any> => {
return reqCatch(() =>
request({
url: `/api/v1/alerts/component`,
method: 'get',
params
})
);
};
// 获取漏洞数据
export const getVulnPatch = (params: types.VulnDetailProps): Promise<any> => {
return reqCatch(() =>
request({
url: `/api/v1/alerts/patch`,
method: 'get',
params
})
);
};
// 获取漏洞数据
export const getVulnerabilitiespage = (data: any): Promise<any> => {
return reqCatch(() =>
request({
url: `/org/api/v1/vulnerabilities/page`,
method: 'post',
data
})
);
};
export const getVulnerabilitiesDetails = (id: any): Promise<any> => {
return reqCatch(() =>
request({
url: `/org/api/v1/vulnerabilities/${id}`,
method: 'get'
})
);
};
export const getVulnerabilitiesComponents = (data: any): Promise<any> => {
return reqCatch(() =>
request({
url: `/org/api/v1/vulnerabilities/components/page`,
method: 'post',
data
})
);
};
export const getVulnerabilitiesAlertsPatch = (params: any): Promise<any> => {
return reqCatch(() =>
request({
url: `/api/v1/alerts/patch`,
method: 'get',
params
})
);
};
export const getVulnerabilitiesAlertsUsers = (id: any): Promise<any> => {
return reqCatch(() =>
request({
url: `/org/api/v1/vulnerabilities/${id}/alerts`,
method: 'get'
})
);
};
export const storageStartTask = (data: any): Promise<any> => {
return reqCatch(() =>
request({
url: `/task/storage/startTask`,
method: 'post',
data
})
);
};
// 出库申请
export const storageStartOutTask = (data: any): Promise<any> => {
return reqCatch(() =>
request({
url: `/task/storage/startOutTask`,
method: 'post',
data
})
);
};
// 发送预警
export const sendWarning = (data: any): Promise<any> => {
return reqCatch(() =>
request({
url: `/org/api/v1/send/alert/alertPublish`,
method: 'post',
data
})
);
};
// 获取预警详情
export const getEarlyWarningInfo = (data: any): Promise<any> => {
return reqCatchV2(() =>
request({
url: '/org/api/v1/send/alert/alertInfo',
method: 'POST',
data
})
);
};
// 获取预警列表
export const getGetAlertListPage = (data: any): Promise<any> => {
return reqCatchV2(() =>
request({
url: '/org/api/v1/send/alert/getAlertListPage',
method: 'post',
data
})
);
};
// 获取预警处理人员列表
export const getGetAlertUserListPage = (data: any): Promise<any> => {
return reqCatchV2(() =>
request({
url: '/org/api/v1/send/alert/getNoticeDealList',
method: 'post',
data
})
);
};
// 获取预警列表详情
export const getGetAlertDetails = (id: any): Promise<any> => {
return reqCatchV2(() =>
request({
url: `/org/api/v1/send/alert/getVulnerabilityDetail?vulnId=${id}`,
method: 'get'
})
);
};
// 获取预警列表详情
export const getNoticeDealCount = (id: any): Promise<any> => {
return reqCatchV2(() =>
request({
url: `/org/api/v1/send/alert/getNoticeDealCount?vulnId=${id}`,
method: 'get'
})
);
};
// 分页查询订阅预警信息接口
export const getAlertSubscribesPage = (data: any): Promise<any> => {
return reqCatchV2(() =>
request({
url: `/org/api/v1/send/alert/getAlertSubscribesPage`,
method: 'post',
data
})
);
};