Merge pull request '合并dev-zw' (#129) from dev-zw into dev

This commit is contained in:
cp3hnu 2024-09-14 13:56:55 +08:00
commit f890b75f80
10 changed files with 242 additions and 137 deletions

View File

@ -22,6 +22,7 @@ export { requestConfig as request } from './requestConfig';
// const isDev = process.env.NODE_ENV === 'development';
import { type GlobalInitialState } from '@/types';
import { menuItemRender } from '@/utils/menuRender';
import ErrorBoundary from './components/ErrorBoundary';
import { gotoLoginPage } from './utils/ui';
/**
@ -65,6 +66,7 @@ export async function getInitialState(): Promise<GlobalInitialState> {
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RuntimeConfig['layout'] = ({ initialState }) => {
return {
ErrorBoundary: ErrorBoundary,
rightContentRender: false,
waterMarkProps: {
// content: initialState?.currentUser?.nickName,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 KiB

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 KiB

After

Width:  |  Height:  |  Size: 335 KiB

View File

@ -0,0 +1,78 @@
import KFEmpty, { EmptyType } from '@/components/KFEmpty';
import { Button } from 'antd';
import { Component, ReactNode } from 'react';
interface ErrorBoundaryProps {
children: ReactNode;
fallback?: ReactNode; // Optional fallback UI to show in case of error
}
interface ErrorBoundaryState {
hasError: boolean;
error: Error | null;
}
class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
constructor(props: ErrorBoundaryProps) {
super(props);
this.state = {
hasError: false,
error: null,
};
}
static getDerivedStateFromError(error: Error): ErrorBoundaryState {
// Update state so the next render shows the fallback UI
return { hasError: true, error };
}
// componentDidCatch(error: Error, errorInfo: ErrorInfo) {
// // You can log the error to an error reporting service here
// console.error('Error caught by ErrorBoundary:', error.message, errorInfo.componentStack);
// }
render() {
if (this.state.hasError) {
return this.props.fallback || <ErrorBoundaryFallback error={this.state.error} />;
}
return this.props.children;
}
}
function ErrorBoundaryFallback({ error }: { error: Error | null }) {
const message = error && error instanceof Error ? error.message : 'Unknown error';
const errorMsg =
process.env.NODE_ENV === 'development' ? message : '非常抱歉,程序运行错误,\n我们会尽快修复。';
return (
<KFEmpty
style={{ height: '100vh' }}
type={EmptyType.NotFound}
title="出错了"
content={errorMsg}
footer={() => {
return (
<>
<Button
type="default"
onClick={() => {
window.history.pushState({}, '', '/');
window.location.reload();
}}
>
</Button>
<Button
type="primary"
style={{ marginLeft: 20 }}
onClick={() => window.location.reload()}
>
</Button>
</>
);
}}
></KFEmpty>
);
}
export default ErrorBoundary;

View File

@ -18,6 +18,7 @@
}
&__content {
max-width: 50%;
margin-top: 15px;
color: @text-color-secondary;
font-size: 15px;

View File

@ -37,7 +37,7 @@ function KFEmpty({
type,
title,
content,
hasFooter = false,
hasFooter = true,
footer,
buttonTitle = '刷新',
onRefresh,

View File

@ -1,146 +1,159 @@
import BasicInfo, { BasicInfoData } from '@/components/BasicInfo';
import SubAreaTitle from '@/components/SubAreaTitle';
import { ResourceData, ResourceType } from '@/pages/Dataset/config';
import { DatasetData, ModelData, ResourceType } from '@/pages/Dataset/config';
import styles from './index.less';
type ResourceIntroProps = {
resourceType: ResourceType;
info: ResourceData;
info: DatasetData | ModelData;
};
const formatArray = (arr?: string[]) => {
// const formatArray = (arr?: ResourceData[]) => {
// if (!arr || arr.length === 0) {
// return '--';
// }
// return arr.map((item) => item.name).join('\n');
// };
const formatDataset = (arr?: DatasetData[]) => {
if (!arr || arr.length === 0) {
return '--';
return undefined;
}
return arr.join('\n');
return arr.map((item) => item.name).join('\n');
};
const formatMap = (map?: Record<string, string>) => {
if (!map || Object.keys(map).length === 0) {
return '--';
return undefined;
}
return Object.entries(map)
.map(([key, value]) => `${key} = ${value}`)
.join('\n');
};
const getDatasetDatas = (data: DatasetData): BasicInfoData[] => [
{
label: '数据集名称',
value: data.name,
},
{
label: '版本',
value: data.version,
},
{
label: '创建人',
value: data.create_by,
},
{
label: '更新时间',
value: data.update_time,
},
{
label: '数据来源',
value: data.dataset_source,
},
{
label: '处理代码',
value: data.processing_code,
},
{
label: '数据集分类',
value: data.data_type,
},
{
label: '研究方向',
value: data.data_tag,
},
{
label: '数据集描述',
value: data.description,
},
{
label: '版本描述',
value: data.version_desc,
},
];
const getModelDatas = (data: ModelData): BasicInfoData[] => [
{
label: '模型名称',
value: data.name,
},
{
label: '版本',
value: data.version,
},
{
label: '创建人',
value: data.create_by,
},
{
label: '更新时间',
value: data.update_time,
},
{
label: '训练镜像',
value: data.image,
},
{
label: '训练代码',
value: data.code,
},
{
label: '训练数据集',
value: data.train_datasets,
format: formatDataset,
},
{
label: '测试数据集',
value: data.test_datasets,
format: formatDataset,
},
{
label: '参数',
value: data.params,
format: formatMap,
},
{
label: '指标',
value: data.metrics,
format: formatMap,
},
{
label: '训练任务',
value: data.train_task,
format: (value?: any) => value?.name,
externalLink: data.train_task
? `${location.origin}/pipeline/experiment/instance/${data.train_task.task_id}/${data.train_task.ins_id}`
: '',
},
{
label: '模型来源',
value: data.model_source,
},
{
label: '模型框架',
value: data.model_type,
},
{
label: '模型能力',
value: data.model_tag,
},
{
label: '模型描述',
value: data.description,
},
{
label: '版本描述',
value: data.version_desc,
},
];
function ResourceIntro({ resourceType, info }: ResourceIntroProps) {
const datasetDatas: BasicInfoData[] = [
{
label: '数据集名称',
value: info.name,
},
{
label: '版本',
value: info.version,
},
{
label: '创建人',
value: info.create_by,
},
{
label: '更新时间',
value: info.update_time,
},
{
label: '数据来源',
value: info.dataset_source,
},
{
label: '处理代码',
value: info.processing_code,
},
{
label: '数据集分类',
value: info.data_type,
},
{
label: '研究方向',
value: info.data_tag,
},
{
label: '数据集描述',
value: info.description,
},
{
label: '版本描述',
value: info.version_desc,
},
];
const modelDatas: BasicInfoData[] = [
{
label: '模型名称',
value: info.name,
},
{
label: '版本',
value: info.version,
},
{
label: '创建人',
value: info.create_by,
},
{
label: '更新时间',
value: info.update_time,
},
{
label: '训练镜像',
value: info.image,
},
{
label: '训练代码',
value: info.code,
},
{
label: '训练数据集',
value: info.train_datasets,
format: formatArray,
},
{
label: '测试数据集',
value: info.test_datasets,
format: formatArray,
},
{
label: '参数',
value: info.params,
format: formatMap,
},
{
label: '指标',
value: info.metrics,
format: formatMap,
},
{
label: '训练任务',
value: info.train_task,
},
{
label: '模型来源',
value: info.model_source,
},
{
label: '模型框架',
value: info.model_type,
},
{
label: '模型能力',
value: info.model_tag,
},
{
label: '模型描述',
value: info.description,
},
{
label: '版本描述',
value: info.version_desc,
},
];
const basicDatas: BasicInfoData[] =
resourceType === ResourceType.Dataset ? datasetDatas : modelDatas;
resourceType === ResourceType.Dataset
? getDatasetDatas(info as DatasetData)
: getModelDatas(info as ModelData);
return (
<div className={styles['resource-intro']}>

View File

@ -128,7 +128,7 @@ export type CategoryData = {
};
// 数据集、模型列表数据
export type ResourceData = {
export interface ResourceData {
id: number;
name: string;
identifier: string;
@ -142,25 +142,34 @@ export type ResourceData = {
version_desc?: string;
usage?: string;
relative_paths?: string;
// 数据集
resourceType: ResourceType.Dataset | ResourceType.Model;
}
// 数据集数据
export interface DatasetData extends ResourceData {
resourceType: ResourceType.Dataset; // 用于区别类型
data_type?: string; // 数据集分类
data_tag?: string; // 研究方向
processing_code?: string; // 处理代码
dataset_source?: string; // 数据来源
dataset_version_vos: ResourceFileData[];
// 模型
dataset_version_vos?: ResourceFileData[];
}
// 模型数据
export interface ModelData extends ResourceData {
resourceType: ResourceType.Model; // 用于区别类型
model_type?: string; // 模型框架
model_tag?: string; // 模型能力
image?: string; // 训练镜像
code?: string; // 训练镜像
train_datasets?: string[]; // 训练数据集
test_datasets?: string[]; // 测试数据集
train_datasets?: DatasetData[]; // 训练数据集
test_datasets?: DatasetData[]; // 测试数据集
params?: Record<string, string>; // 参数
metrics?: Record<string, string>; // 指标
train_task?: string; // 训练任务
train_task?: TrainTask; // 训练任务
model_source?: string; // 模型来源
model_version_vos: ResourceFileData[];
};
model_version_vos?: ResourceFileData[];
}
// 版本数据
export type ResourceVersionData = {
@ -177,3 +186,10 @@ export type ResourceFileData = {
url: string;
update_time?: string;
};
// 训练任务
export type TrainTask = {
ins_id: number;
name: string;
task_id: string;
};

View File

@ -1,3 +1,4 @@
import { TrainTask } from '@/pages/Dataset/config';
import { changePropertyName, fittingString } from '@/utils';
import { EdgeConfig, GraphData, LayoutConfig, NodeConfig, TreeGraphData, Util } from '@antv/g6';
// @ts-ignore
@ -31,12 +32,6 @@ export type Rect = {
height: number;
};
export type TrainTask = {
ins_id: number;
name: string;
task_id: string;
};
export interface TrainDataset extends NodeConfig {
repo_id: number;
name: string;