From 371d754dbc275f3720b6dc7628399d51cbd7b276 Mon Sep 17 00:00:00 2001 From: zhaowei Date: Thu, 8 May 2025 15:16:15 +0800 Subject: [PATCH 01/25] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E6=89=A7=E8=A1=8C=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/ActiveLearn/Instance/index.tsx | 17 +++++++++++++++++ .../components/ActiveLearnBasic/index.tsx | 7 ++++--- react-ui/src/pages/AutoML/Instance/index.tsx | 17 +++++++++++++++++ .../AutoML/components/AutoMLBasic/index.tsx | 13 ++++++++++--- react-ui/src/pages/Experiment/Info/index.jsx | 15 ++++++++------- .../components/ExperimentDrawer/index.tsx | 10 ++++++---- .../src/pages/HyperParameter/Instance/index.tsx | 17 +++++++++++++++++ .../components/HyperParameterBasic/index.tsx | 6 ++++-- react-ui/src/utils/index.ts | 11 +++++++++++ 9 files changed, 94 insertions(+), 19 deletions(-) diff --git a/react-ui/src/pages/ActiveLearn/Instance/index.tsx b/react-ui/src/pages/ActiveLearn/Instance/index.tsx index 680f935c..756acfd4 100644 --- a/react-ui/src/pages/ActiveLearn/Instance/index.tsx +++ b/react-ui/src/pages/ActiveLearn/Instance/index.tsx @@ -35,6 +35,8 @@ function ActiveLearnInstance() { const params = useParams(); const instanceId = safeInvoke(Number)(params.id); const evtSourceRef = useRef(null); + const [currentTime, setCurrentTime] = useState(); + const finish_time = workflowStatus?.finishedAt; useEffect(() => { if (instanceId) { @@ -46,6 +48,20 @@ function ActiveLearnInstance() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [instanceId]); + // 定时刷新耗时 + useEffect(() => { + if (finish_time) { + setCurrentTime(new Date(finish_time)); + } else { + const timer = setInterval(() => { + setCurrentTime(new Date()); + }, 1000); + return () => { + clearInterval(timer); + }; + } + }, [finish_time]); + // 获取实验实例详情 const getExperimentInsInfo = async (isStatusDetermined: boolean) => { const [res] = await to(getActiveLearnInsReq(instanceId)); @@ -153,6 +169,7 @@ function ActiveLearnInstance() { className={styles['active-learn-instance__basic']} info={experimentInfo} runStatus={workflowStatus} + finishTime={currentTime} isInstance /> ), diff --git a/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx b/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx index 892e6725..e76fe67b 100644 --- a/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx +++ b/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx @@ -31,9 +31,10 @@ type BasicInfoProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; + finishTime?: Date; }; -function BasicInfo({ info, className, runStatus, isInstance = false }: BasicInfoProps) { +function BasicInfo({ info, className, runStatus, finishTime, isInstance = false }: BasicInfoProps) { const getResourceDescription = useComputingResource()[1]; const basicDatas: BasicInfoData[] = useMemo(() => { if (!info) { @@ -218,7 +219,7 @@ function BasicInfo({ info, className, runStatus, isInstance = false }: BasicInfo }, { label: '执行时长', - value: elapsedTime(info.create_time, runStatus.finishedAt), + value: elapsedTime(info.create_time, finishTime), ellipsis: true, }, { @@ -245,7 +246,7 @@ function BasicInfo({ info, className, runStatus, isInstance = false }: BasicInfo ellipsis: true, }, ]; - }, [runStatus, info]); + }, [runStatus, info, finishTime]); return (
diff --git a/react-ui/src/pages/AutoML/Instance/index.tsx b/react-ui/src/pages/AutoML/Instance/index.tsx index 44489ea7..4ffb085a 100644 --- a/react-ui/src/pages/AutoML/Instance/index.tsx +++ b/react-ui/src/pages/AutoML/Instance/index.tsx @@ -35,6 +35,8 @@ function AutoMLInstance() { const params = useParams(); const instanceId = safeInvoke(Number)(params.id); const evtSourceRef = useRef(null); + const [currentTime, setCurrentTime] = useState(); + const finish_time = workflowStatus?.finishedAt; useEffect(() => { if (instanceId) { @@ -46,6 +48,20 @@ function AutoMLInstance() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [instanceId]); + // 定时刷新耗时 + useEffect(() => { + if (finish_time) { + setCurrentTime(new Date(finish_time)); + } else { + const timer = setInterval(() => { + setCurrentTime(new Date()); + }, 1000); + return () => { + clearInterval(timer); + }; + } + }, [finish_time]); + // 获取实验实例详情 const getExperimentInsInfo = async (isStatusDetermined: boolean) => { const [res] = await to(getExperimentInsReq(instanceId)); @@ -156,6 +172,7 @@ function AutoMLInstance() { className={styles['auto-ml-instance__basic']} info={autoMLInfo} runStatus={workflowStatus} + finishTime={currentTime} isInstance /> ), diff --git a/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx b/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx index 98a1f4ba..e31c7ecb 100644 --- a/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx +++ b/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx @@ -40,9 +40,16 @@ type AutoMLBasicProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; + finishTime?: Date; }; -function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLBasicProps) { +function AutoMLBasic({ + info, + className, + runStatus, + finishTime, + isInstance = false, +}: AutoMLBasicProps) { const getResourceDescription = useComputingResource()[1]; const basicDatas: BasicInfoData[] = useMemo(() => { if (!info) { @@ -296,7 +303,7 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB }, { label: '执行时长', - value: elapsedTime(info.create_time, runStatus.finishedAt), + value: elapsedTime(info.create_time, finishTime), }, { label: '状态', @@ -321,7 +328,7 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB ), }, ]; - }, [runStatus, info]); + }, [runStatus, info, finishTime]); return (
diff --git a/react-ui/src/pages/Experiment/Info/index.jsx b/react-ui/src/pages/Experiment/Info/index.jsx index 7ecaf4ee..d7d7b16b 100644 --- a/react-ui/src/pages/Experiment/Info/index.jsx +++ b/react-ui/src/pages/Experiment/Info/index.jsx @@ -27,11 +27,12 @@ function ExperimentText() { const [paramsModalOpen, openParamsModal, closeParamsModal] = useVisible(false); const [propsDrawerOpen, openPropsDrawer, closePropsDrawer, propsDrawerOpenRef] = useVisible(false); - const [currentDate, setCurrentDate] = useState(); + const [currentTime, setCurrentTime] = useState(); const navigate = useNavigate(); const evtSourceRef = useRef(); const width = 110; const height = 36; + const finish_time = experimentIns?.finish_time useEffect(() => { initGraph(); @@ -62,16 +63,17 @@ function ExperimentText() { // 定时刷新耗时 useEffect(() => { - if (experimentIns && !experimentIns.finish_time) { + if (finish_time) { + setCurrentTime(new Date(finish_time)); + } else { const timer = setInterval(() => { - setCurrentDate(new Date()); - console.log('定时刷新'); + setCurrentTime(new Date()); }, 1000); return () => { clearInterval(timer); }; } - }, [experimentIns]); + }, [finish_time]); // 获取流水线模版 const getWorkflow = async () => { @@ -100,7 +102,6 @@ function ExperimentText() { if (res && res.data && workflowRef.current) { setExperimentIns(res.data); const { status, nodes_status, argo_ins_ns, argo_ins_name, finish_time } = res.data; - setCurrentDate(new Date(finish_time)); const workflowData = workflowRef.current; const experimentStatusObjs = parseJsonText(nodes_status); workflowData.nodes.forEach((item) => { @@ -489,7 +490,7 @@ function ExperimentText() {
执行时长: - {elapsedTime(experimentIns?.create_time, experimentIns?.finish_time)} + {elapsedTime(experimentIns?.create_time, currentTime)}
状态: diff --git a/react-ui/src/pages/Experiment/components/ExperimentDrawer/index.tsx b/react-ui/src/pages/Experiment/components/ExperimentDrawer/index.tsx index bcb3af1e..a74690ac 100644 --- a/react-ui/src/pages/Experiment/components/ExperimentDrawer/index.tsx +++ b/react-ui/src/pages/Experiment/components/ExperimentDrawer/index.tsx @@ -41,15 +41,17 @@ const ExperimentDrawer = ({ instanceNodeStartTime, instanceNodeEndTime, }: ExperimentDrawerProps) => { - const [currentDate, setCurrentDate] = useState( + const [currentTime, setCurrentTime] = useState( instanceNodeEndTime ? new Date(instanceNodeEndTime) : new Date(), ); // 定时刷新耗时 useEffect(() => { - if (!instanceNodeEndTime) { + if (instanceNodeEndTime) { + setCurrentTime(new Date(instanceNodeEndTime)); + } else { const timer = setInterval(() => { - setCurrentDate(new Date()); + setCurrentTime(new Date()); }, 1000); return () => { clearInterval(timer); @@ -158,7 +160,7 @@ const ExperimentDrawer = ({
耗时: - {elapsedTime(instanceNodeStartTime, currentDate)} + {elapsedTime(instanceNodeStartTime, currentTime)}
(null); + const [currentTime, setCurrentTime] = useState(); + const finish_time = workflowStatus?.finishedAt; useEffect(() => { if (instanceId) { @@ -46,6 +48,20 @@ function HyperParameterInstance() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [instanceId]); + // 定时刷新耗时 + useEffect(() => { + if (finish_time) { + setCurrentTime(new Date(finish_time)); + } else { + const timer = setInterval(() => { + setCurrentTime(new Date()); + }, 1000); + return () => { + clearInterval(timer); + }; + } + }, [finish_time]); + // 获取实验实例详情 const getExperimentInsInfo = async (isStatusDetermined: boolean) => { const [res] = await to(getRayInsReq(instanceId)); @@ -168,6 +184,7 @@ function HyperParameterInstance() { className={styles['hyper-parameter-instance__basic']} info={experimentInfo} runStatus={workflowStatus} + finishTime={currentTime} isInstance /> ), diff --git a/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx b/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx index 89487cb6..e62bc6ff 100644 --- a/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx +++ b/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx @@ -33,12 +33,14 @@ type HyperParameterBasicProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; + finishTime?: Date; }; function HyperParameterBasic({ info, className, runStatus, + finishTime, isInstance = false, }: HyperParameterBasicProps) { const getResourceDescription = useComputingResource()[1]; @@ -155,7 +157,7 @@ function HyperParameterBasic({ }, { label: '执行时长', - value: elapsedTime(info.create_time, runStatus.finishedAt), + value: elapsedTime(info.create_time, finishTime), ellipsis: true, }, { @@ -182,7 +184,7 @@ function HyperParameterBasic({ ellipsis: true, }, ]; - }, [runStatus, info]); + }, [runStatus, info, finishTime]); return (
diff --git a/react-ui/src/utils/index.ts b/react-ui/src/utils/index.ts index 3113c8ea..995f3501 100644 --- a/react-ui/src/utils/index.ts +++ b/react-ui/src/utils/index.ts @@ -6,6 +6,7 @@ import { PageEnum } from '@/enums/pagesEnums'; import G6 from '@antv/g6'; +import { number } from 'echarts'; /** * 生成 8 位随机数 @@ -346,3 +347,13 @@ export const trimCharacter = (str: string, ch: string): string => { export const convertEmptyStringToUndefined = (value?: string): string | undefined => { return value === '' ? undefined : value; }; + + +export const formatNumber = (value?: number | null, toFixed?: number) : number | string => { + if (typeof value !== "number") { + return '--' + } + + return toFixed ? Number(value).toFixed(toFixed) : value +} + From bef5bf649ef7e61cb460145bdc870d545fbb4a52 Mon Sep 17 00:00:00 2001 From: zhaowei Date: Fri, 9 May 2025 11:43:25 +0800 Subject: [PATCH 02/25] =?UTF-8?q?fix:=20=E5=AE=9E=E9=AA=8C=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E9=95=BF=E5=AE=9A=E6=97=B6=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/src/app.tsx | 2 + react-ui/src/hooks/useSSE.ts | 39 +++--- react-ui/src/hooks/useServerTime.ts | 54 ++++++++ .../src/pages/ActiveLearn/Instance/index.tsx | 14 +- react-ui/src/pages/AutoML/Instance/index.tsx | 14 +- .../index.less | 0 .../index.tsx | 43 ++----- .../ExperimentInstanceList/instance.tsx | 83 ++++++++++++ .../components/ExperimentList/index.tsx | 121 ++++++++++++------ react-ui/src/pages/Experiment/Info/index.jsx | 8 +- .../components/ExperimentDrawer/index.tsx | 10 +- .../index.less | 0 .../index.tsx | 45 +++---- .../ExperimentInstanceList/instance.tsx | 85 ++++++++++++ react-ui/src/pages/Experiment/index.jsx | 117 +++++++++++------ .../pages/HyperParameter/Instance/index.tsx | 14 +- .../Points/components/Statistics/index.less | 1 + .../Points/components/Statistics/index.tsx | 13 +- .../Workspace/components/UserPoints/index.tsx | 7 +- react-ui/src/services/experiment/index.js | 8 ++ react-ui/src/utils/constant.ts | 3 + react-ui/src/utils/format.ts | 16 +++ react-ui/src/utils/index.ts | 9 -- 23 files changed, 503 insertions(+), 203 deletions(-) create mode 100644 react-ui/src/hooks/useServerTime.ts rename react-ui/src/pages/AutoML/components/{ExperimentInstance => ExperimentInstanceList}/index.less (100%) rename react-ui/src/pages/AutoML/components/{ExperimentInstance => ExperimentInstanceList}/index.tsx (83%) create mode 100644 react-ui/src/pages/AutoML/components/ExperimentInstanceList/instance.tsx rename react-ui/src/pages/Experiment/components/{ExperimentInstance => ExperimentInstanceList}/index.less (100%) rename react-ui/src/pages/Experiment/components/{ExperimentInstance => ExperimentInstanceList}/index.tsx (84%) create mode 100644 react-ui/src/pages/Experiment/components/ExperimentInstanceList/instance.tsx diff --git a/react-ui/src/app.tsx b/react-ui/src/app.tsx index ac8b8652..686c495d 100644 --- a/react-ui/src/app.tsx +++ b/react-ui/src/app.tsx @@ -11,6 +11,7 @@ import { getAccessToken } from './access'; import ErrorBoundary from './components/ErrorBoundary'; import './dayjsConfig'; import { removeAllPageCacheState } from './hooks/useCacheState'; +import { globalGetSeverTime } from './hooks/useServerTime'; import { getRemoteMenu, getRoutersInfo, @@ -29,6 +30,7 @@ export { requestConfig as request } from './requestConfig'; export async function getInitialState(): Promise { const fetchUserInfo = async () => { try { + globalGetSeverTime(); const response = await getUserInfo(); return { ...response.user, diff --git a/react-ui/src/hooks/useSSE.ts b/react-ui/src/hooks/useSSE.ts index 5e278675..9f364f68 100644 --- a/react-ui/src/hooks/useSSE.ts +++ b/react-ui/src/hooks/useSSE.ts @@ -1,11 +1,12 @@ import { parseJsonText } from '@/utils'; -import { useCallback, useRef } from 'react'; +import { useEffect } from 'react'; +import { ExperimentStatus } from '@/enums'; +import { NodeStatus } from '@/types'; -export const useSSE = (onMessage: (data: any) => void) => { - const evtSourceRef = useRef(null); - - const setupSSE = useCallback( - (name: string, namespace: string) => { +export type MessageHandler = (experimentInsId: number, status: string, finishedAt: string, nodes: Record) => void +export const useSSE = (experimentInsId: number, status: ExperimentStatus, name: string, namespace: string, onMessage: MessageHandler) => { + useEffect(() => { + if (status === ExperimentStatus.Pending || status === ExperimentStatus.Running) { const { origin } = location; const params = encodeURIComponent(`metadata.namespace=${namespace},metadata.name=${name}`); const evtSource = new EventSource( @@ -18,11 +19,10 @@ export const useSSE = (onMessage: (data: any) => void) => { return; } const dataJson = parseJsonText(data); - if (dataJson) { - const nodes = dataJson?.result?.object?.status?.nodes; - if (nodes) { - onMessage(nodes); - } + const statusData = dataJson?.result?.object?.status; + if (statusData) { + const { finishedAt, phase, nodes } = statusData; + onMessage(experimentInsId, phase, finishedAt, nodes); } }; @@ -30,17 +30,10 @@ export const useSSE = (onMessage: (data: any) => void) => { console.error('SSE error: ', error); }; - evtSourceRef.current = evtSource; - }, - [onMessage], - ); - - const closeSSE = useCallback(() => { - if (evtSourceRef.current) { - evtSourceRef.current.close(); - evtSourceRef.current = null; + return () => { + evtSource.close(); + } } - }, []); - - return [setupSSE, closeSSE]; + + }, [experimentInsId, status, name, namespace, onMessage]); }; diff --git a/react-ui/src/hooks/useServerTime.ts b/react-ui/src/hooks/useServerTime.ts new file mode 100644 index 00000000..89b39775 --- /dev/null +++ b/react-ui/src/hooks/useServerTime.ts @@ -0,0 +1,54 @@ +/* + * @Author: 赵伟 + * @Date: 2024-10-10 08:51:41 + * @Description: 服务器时间 hook + */ + +import { getSeverTimeReq } from '@/services/experiment'; +import { to } from '@/utils/promise'; +import { useCallback, useEffect, useState } from 'react'; + +let globalTimeOffset: number | undefined = undefined; + +export const globalGetSeverTime = async () => { + const requestStartTime = Date.now() + const [res] = await to(getSeverTimeReq()); + const requestEndTime = Date.now() + const requestDuration = (requestEndTime - requestStartTime) / 2; + if (res && res.data) { + const serverDate = new Date(res.data); + const timeOffset = serverDate.getTime() + requestDuration - requestEndTime ; + globalTimeOffset = timeOffset; + return timeOffset + } +}; + +export const now = () => { + return new Date(Date.now() + (globalTimeOffset ?? 0)) +} + +/** 获取服务器时间 */ +export function useServerTime() { + const [timeOffset, setTimeOffset] = useState(globalTimeOffset ?? 0); + + useEffect(() => { + // 获取服务器时间 + const getSeverTime = async () => { + const [res] = await to(globalGetSeverTime()); + if (res) { + setTimeOffset(res) + } + }; + + if (!globalTimeOffset) { + getSeverTime(); + } + }, []); + + const now = useCallback(() => { + return new Date(Date.now() + timeOffset) + }, [timeOffset]) + + + return [now, timeOffset] as const; +} diff --git a/react-ui/src/pages/ActiveLearn/Instance/index.tsx b/react-ui/src/pages/ActiveLearn/Instance/index.tsx index 756acfd4..ba62fae7 100644 --- a/react-ui/src/pages/ActiveLearn/Instance/index.tsx +++ b/react-ui/src/pages/ActiveLearn/Instance/index.tsx @@ -1,5 +1,6 @@ import KFIcon from '@/components/KFIcon'; import { AutoMLTaskType, ExperimentStatus } from '@/enums'; +import { useServerTime } from '@/hooks/useServerTime'; import { getActiveLearnInsReq } from '@/services/activeLearn'; import { NodeStatus } from '@/types'; import { parseJsonText } from '@/utils'; @@ -35,7 +36,8 @@ function ActiveLearnInstance() { const params = useParams(); const instanceId = safeInvoke(Number)(params.id); const evtSourceRef = useRef(null); - const [currentTime, setCurrentTime] = useState(); + const [now] = useServerTime(); + const [currentTime, setCurrentTime] = useState(now()); const finish_time = workflowStatus?.finishedAt; useEffect(() => { @@ -54,13 +56,13 @@ function ActiveLearnInstance() { setCurrentTime(new Date(finish_time)); } else { const timer = setInterval(() => { - setCurrentTime(new Date()); + setCurrentTime(now()); }, 1000); return () => { clearInterval(timer); }; } - }, [finish_time]); + }, [finish_time, now]); // 获取实验实例详情 const getExperimentInsInfo = async (isStatusDetermined: boolean) => { @@ -122,13 +124,13 @@ function ActiveLearnInstance() { if (dataJson) { const nodes = dataJson?.result?.object?.status?.nodes; if (nodes) { + // 节点 + setNodes(nodes); + const workflowStatus = Object.values(nodes).find((node: any) => node.displayName.startsWith(NodePrefix), ) as NodeStatus; - // 节点 - setNodes(nodes); - // 设置工作流状态 if (workflowStatus) { setWorkflowStatus(workflowStatus); diff --git a/react-ui/src/pages/AutoML/Instance/index.tsx b/react-ui/src/pages/AutoML/Instance/index.tsx index 4ffb085a..675b02d4 100644 --- a/react-ui/src/pages/AutoML/Instance/index.tsx +++ b/react-ui/src/pages/AutoML/Instance/index.tsx @@ -1,5 +1,6 @@ import KFIcon from '@/components/KFIcon'; import { AutoMLTaskType, AutoMLType, ExperimentStatus } from '@/enums'; +import { useServerTime } from '@/hooks/useServerTime'; import { getExperimentInsReq } from '@/services/autoML'; import { NodeStatus } from '@/types'; import { parseJsonText } from '@/utils'; @@ -35,7 +36,8 @@ function AutoMLInstance() { const params = useParams(); const instanceId = safeInvoke(Number)(params.id); const evtSourceRef = useRef(null); - const [currentTime, setCurrentTime] = useState(); + const [now] = useServerTime(); + const [currentTime, setCurrentTime] = useState(now()); const finish_time = workflowStatus?.finishedAt; useEffect(() => { @@ -54,13 +56,13 @@ function AutoMLInstance() { setCurrentTime(new Date(finish_time)); } else { const timer = setInterval(() => { - setCurrentTime(new Date()); + setCurrentTime(now()); }, 1000); return () => { clearInterval(timer); }; } - }, [finish_time]); + }, [finish_time, now]); // 获取实验实例详情 const getExperimentInsInfo = async (isStatusDetermined: boolean) => { @@ -126,13 +128,13 @@ function AutoMLInstance() { if (dataJson) { const nodes = dataJson?.result?.object?.status?.nodes; if (nodes) { + // 节点 + setNodes(nodes); + const workflowStatus = Object.values(nodes).find((node: any) => node.displayName.startsWith(NodePrefix), ) as NodeStatus; - // 节点 - setNodes(nodes); - if (workflowStatus) { setWorkflowStatus(workflowStatus); diff --git a/react-ui/src/pages/AutoML/components/ExperimentInstance/index.less b/react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.less similarity index 100% rename from react-ui/src/pages/AutoML/components/ExperimentInstance/index.less rename to react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.less diff --git a/react-ui/src/pages/AutoML/components/ExperimentInstance/index.tsx b/react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.tsx similarity index 83% rename from react-ui/src/pages/AutoML/components/ExperimentInstance/index.tsx rename to react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.tsx index 74cf1115..05d6d786 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentInstance/index.tsx +++ b/react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.tsx @@ -1,20 +1,19 @@ import KFIcon from '@/components/KFIcon'; import { ExperimentStatus } from '@/enums'; import { useCheck } from '@/hooks/useCheck'; -import { experimentStatusInfo } from '@/pages/Experiment/status'; import themes from '@/styles/theme.less'; import { type ExperimentInstance } from '@/types'; -import { elapsedTime, formatDate } from '@/utils/date'; import { to } from '@/utils/promise'; import { modalConfirm } from '@/utils/ui'; import { DoubleRightOutlined } from '@ant-design/icons'; -import { App, Button, Checkbox, ConfigProvider, Typography } from 'antd'; +import { App, Button, Checkbox, ConfigProvider } from 'antd'; import classNames from 'classnames'; import { useEffect, useMemo } from 'react'; import { ExperimentListType, experimentListConfig } from '../ExperimentList/config'; import styles from './index.less'; +import ExperimentInstanceComponent from './instance'; -type ExperimentInstanceProps = { +type ExperimentInstanceListProps = { type: ExperimentListType; experimentInsList?: ExperimentInstance[]; experimentInsTotal: number; @@ -24,7 +23,7 @@ type ExperimentInstanceProps = { onLoadMore?: () => void; }; -function ExperimentInstanceComponent({ +function ExperimentInstanceList({ type, experimentInsList, experimentInsTotal, @@ -32,7 +31,7 @@ function ExperimentInstanceComponent({ onRemove, onTerminate, onLoadMore, -}: ExperimentInstanceProps) { +}: ExperimentInstanceListProps) { const { message } = App.useApp(); const allIntanceIds = useMemo(() => { return experimentInsList?.map((item) => item.id) || []; @@ -171,28 +170,14 @@ function ExperimentInstanceComponent({ > {index + 1} -
- {elapsedTime(item.create_time, item.finish_time)} -
-
- - {formatDate(item.create_time)} - -
-
- - - {experimentStatusInfo[item.status as ExperimentStatus]?.label} - -
+
-
-
{elapsedTime(item.create_time, item.finish_time)}
-
- - {formatDate(item.create_time)} - -
-
-
- - - {experimentStatusInfo[item.status as ExperimentStatus]?.label} - -
+ + +
))} diff --git a/react-ui/src/pages/Workspace/components/UserPoints/index.tsx b/react-ui/src/pages/Workspace/components/UserPoints/index.tsx index 98e63cbf..a6eb3ece 100644 --- a/react-ui/src/pages/Workspace/components/UserPoints/index.tsx +++ b/react-ui/src/pages/Workspace/components/UserPoints/index.tsx @@ -1,5 +1,6 @@ import { PointsStatistics } from '@/pages/Points/index'; import { getPointsStatisticsReq } from '@/services/points'; +import { formatNumber } from '@/utils/format'; import { to } from '@/utils/promise'; import { useNavigate } from '@umijs/max'; import { Typography } from 'antd'; @@ -22,14 +23,16 @@ function UserPoints() { getPointsStatistics(); }, []); + const userCredit = formatNumber(statistics?.userCredit); + return (
当前可用算力积分
- {statistics?.userCredit ?? '--'} + {userCredit}
{ return option && option.label ? option.label : '--'; }; }; + + +/** + * 格式化数字 + * + * @param value - 值、 + * @param toFixed - 保留几位小数 + * @return 格式化的数字,如果不是数字,返回 '--' + */ +export const formatNumber = (value?: number | null, toFixed?: number) : number | string => { + if (typeof value !== "number") { + return '--' + } + + return toFixed ? Number(value).toFixed(toFixed) : value +} diff --git a/react-ui/src/utils/index.ts b/react-ui/src/utils/index.ts index 995f3501..a6fba453 100644 --- a/react-ui/src/utils/index.ts +++ b/react-ui/src/utils/index.ts @@ -348,12 +348,3 @@ export const convertEmptyStringToUndefined = (value?: string): string | undefine return value === '' ? undefined : value; }; - -export const formatNumber = (value?: number | null, toFixed?: number) : number | string => { - if (typeof value !== "number") { - return '--' - } - - return toFixed ? Number(value).toFixed(toFixed) : value -} - From 08fce258b642388e74ce8c428a2273cfcbd94a7d Mon Sep 17 00:00:00 2001 From: zhaowei Date: Fri, 9 May 2025 14:56:41 +0800 Subject: [PATCH 03/25] =?UTF-8?q?refactor:=20=E8=BF=90=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E9=95=BF=E6=8F=90=E5=8F=96=E6=88=90=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/src/components/RunDuration/index.tsx | 35 +++++++++++++++++++ .../src/pages/ActiveLearn/Instance/index.tsx | 19 ---------- .../components/ActiveLearnBasic/index.tsx | 12 +++---- react-ui/src/pages/AutoML/Instance/index.tsx | 19 ---------- .../AutoML/components/AutoMLBasic/index.tsx | 15 +++----- .../ExperimentInstanceList/instance.tsx | 27 ++++---------- .../components/ExperimentList/index.tsx | 15 ++++++-- react-ui/src/pages/Experiment/Info/index.jsx | 20 ++--------- .../components/ExperimentDrawer/index.tsx | 25 +++---------- .../ExperimentInstanceList/instance.tsx | 27 ++++---------- react-ui/src/pages/Experiment/index.jsx | 15 ++++++-- .../pages/HyperParameter/Instance/index.tsx | 21 +---------- .../components/HyperParameterBasic/index.tsx | 8 ++--- 13 files changed, 91 insertions(+), 167 deletions(-) create mode 100644 react-ui/src/components/RunDuration/index.tsx diff --git a/react-ui/src/components/RunDuration/index.tsx b/react-ui/src/components/RunDuration/index.tsx new file mode 100644 index 00000000..f430d058 --- /dev/null +++ b/react-ui/src/components/RunDuration/index.tsx @@ -0,0 +1,35 @@ +import { useServerTime } from '@/hooks/useServerTime'; +import { elapsedTime } from '@/utils/date'; +import React, { useEffect, useState } from 'react'; + +type RunDurationProps = { + createTime?: string; + finishTime?: string; + className?: string; + style?: React.CSSProperties; +}; +function RunDuration({ createTime, finishTime, className, style }: RunDurationProps) { + const [now] = useServerTime(); + const [currentTime, setCurrentTime] = useState(now()); + + // 定时刷新耗时 + useEffect(() => { + if (finishTime) { + setCurrentTime(new Date(finishTime)); + } else { + const timer = setInterval(() => { + setCurrentTime(now()); + }, 1000); + return () => { + clearInterval(timer); + }; + } + }, [finishTime, now]); + return ( + + {elapsedTime(createTime, currentTime)} + + ); +} + +export default RunDuration; diff --git a/react-ui/src/pages/ActiveLearn/Instance/index.tsx b/react-ui/src/pages/ActiveLearn/Instance/index.tsx index ba62fae7..d16d5428 100644 --- a/react-ui/src/pages/ActiveLearn/Instance/index.tsx +++ b/react-ui/src/pages/ActiveLearn/Instance/index.tsx @@ -1,6 +1,5 @@ import KFIcon from '@/components/KFIcon'; import { AutoMLTaskType, ExperimentStatus } from '@/enums'; -import { useServerTime } from '@/hooks/useServerTime'; import { getActiveLearnInsReq } from '@/services/activeLearn'; import { NodeStatus } from '@/types'; import { parseJsonText } from '@/utils'; @@ -36,9 +35,6 @@ function ActiveLearnInstance() { const params = useParams(); const instanceId = safeInvoke(Number)(params.id); const evtSourceRef = useRef(null); - const [now] = useServerTime(); - const [currentTime, setCurrentTime] = useState(now()); - const finish_time = workflowStatus?.finishedAt; useEffect(() => { if (instanceId) { @@ -50,20 +46,6 @@ function ActiveLearnInstance() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [instanceId]); - // 定时刷新耗时 - useEffect(() => { - if (finish_time) { - setCurrentTime(new Date(finish_time)); - } else { - const timer = setInterval(() => { - setCurrentTime(now()); - }, 1000); - return () => { - clearInterval(timer); - }; - } - }, [finish_time, now]); - // 获取实验实例详情 const getExperimentInsInfo = async (isStatusDetermined: boolean) => { const [res] = await to(getActiveLearnInsReq(instanceId)); @@ -171,7 +153,6 @@ function ActiveLearnInstance() { className={styles['active-learn-instance__basic']} info={experimentInfo} runStatus={workflowStatus} - finishTime={currentTime} isInstance /> ), diff --git a/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx b/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx index e76fe67b..5c0d4e3e 100644 --- a/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx +++ b/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx @@ -1,4 +1,5 @@ import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; +import RunDuration from '@/components/RunDuration'; import { AutoMLTaskType, autoMLTaskTypeOptions } from '@/enums'; import { useComputingResource } from '@/hooks/useComputingResource'; import { @@ -11,7 +12,6 @@ import { import { ActiveLearnData } from '@/pages/ActiveLearn/types'; import { experimentStatusInfo } from '@/pages/Experiment/status'; import { type NodeStatus } from '@/types'; -import { elapsedTime } from '@/utils/date'; import { formatBoolean, formatCodeConfig, @@ -31,10 +31,9 @@ type BasicInfoProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; - finishTime?: Date; }; -function BasicInfo({ info, className, runStatus, finishTime, isInstance = false }: BasicInfoProps) { +function BasicInfo({ info, className, runStatus, isInstance = false }: BasicInfoProps) { const getResourceDescription = useComputingResource()[1]; const basicDatas: BasicInfoData[] = useMemo(() => { if (!info) { @@ -215,12 +214,10 @@ function BasicInfo({ info, className, runStatus, finishTime, isInstance = false { label: '启动时间', value: formatDate(info.create_time), - ellipsis: true, }, { label: '执行时长', - value: elapsedTime(info.create_time, finishTime), - ellipsis: true, + value: , }, { label: '状态', @@ -243,10 +240,9 @@ function BasicInfo({ info, className, runStatus, finishTime, isInstance = false
), - ellipsis: true, }, ]; - }, [runStatus, info, finishTime]); + }, [runStatus, info]); return (
diff --git a/react-ui/src/pages/AutoML/Instance/index.tsx b/react-ui/src/pages/AutoML/Instance/index.tsx index 675b02d4..5f1b5e34 100644 --- a/react-ui/src/pages/AutoML/Instance/index.tsx +++ b/react-ui/src/pages/AutoML/Instance/index.tsx @@ -1,6 +1,5 @@ import KFIcon from '@/components/KFIcon'; import { AutoMLTaskType, AutoMLType, ExperimentStatus } from '@/enums'; -import { useServerTime } from '@/hooks/useServerTime'; import { getExperimentInsReq } from '@/services/autoML'; import { NodeStatus } from '@/types'; import { parseJsonText } from '@/utils'; @@ -36,9 +35,6 @@ function AutoMLInstance() { const params = useParams(); const instanceId = safeInvoke(Number)(params.id); const evtSourceRef = useRef(null); - const [now] = useServerTime(); - const [currentTime, setCurrentTime] = useState(now()); - const finish_time = workflowStatus?.finishedAt; useEffect(() => { if (instanceId) { @@ -50,20 +46,6 @@ function AutoMLInstance() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [instanceId]); - // 定时刷新耗时 - useEffect(() => { - if (finish_time) { - setCurrentTime(new Date(finish_time)); - } else { - const timer = setInterval(() => { - setCurrentTime(now()); - }, 1000); - return () => { - clearInterval(timer); - }; - } - }, [finish_time, now]); - // 获取实验实例详情 const getExperimentInsInfo = async (isStatusDetermined: boolean) => { const [res] = await to(getExperimentInsReq(instanceId)); @@ -174,7 +156,6 @@ function AutoMLInstance() { className={styles['auto-ml-instance__basic']} info={autoMLInfo} runStatus={workflowStatus} - finishTime={currentTime} isInstance /> ), diff --git a/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx b/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx index e31c7ecb..c421c59e 100644 --- a/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx +++ b/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx @@ -1,4 +1,5 @@ import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; +import RunDuration from '@/components/RunDuration'; import { AutoMLTaskType, AutoMLType, @@ -10,7 +11,6 @@ import { AutoMLData } from '@/pages/AutoML/types'; import { experimentStatusInfo } from '@/pages/Experiment/status'; import { type NodeStatus } from '@/types'; import { parseJsonText } from '@/utils'; -import { elapsedTime } from '@/utils/date'; import { formatBoolean, formatDataset, formatDate, formatEnum } from '@/utils/format'; import { Flex } from 'antd'; import classNames from 'classnames'; @@ -40,16 +40,9 @@ type AutoMLBasicProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; - finishTime?: Date; }; -function AutoMLBasic({ - info, - className, - runStatus, - finishTime, - isInstance = false, -}: AutoMLBasicProps) { +function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLBasicProps) { const getResourceDescription = useComputingResource()[1]; const basicDatas: BasicInfoData[] = useMemo(() => { if (!info) { @@ -303,7 +296,7 @@ function AutoMLBasic({ }, { label: '执行时长', - value: elapsedTime(info.create_time, finishTime), + value: , }, { label: '状态', @@ -328,7 +321,7 @@ function AutoMLBasic({ ), }, ]; - }, [runStatus, info, finishTime]); + }, [runStatus, info]); return (
diff --git a/react-ui/src/pages/AutoML/components/ExperimentInstanceList/instance.tsx b/react-ui/src/pages/AutoML/components/ExperimentInstanceList/instance.tsx index 831879f2..402d27dd 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentInstanceList/instance.tsx +++ b/react-ui/src/pages/AutoML/components/ExperimentInstanceList/instance.tsx @@ -1,11 +1,11 @@ +import RunDuration from '@/components/RunDuration'; import { ExperimentStatus } from '@/enums'; -import { useServerTime } from '@/hooks/useServerTime'; import { useSSE, type MessageHandler } from '@/hooks/useSSE'; import { experimentStatusInfo } from '@/pages/Experiment/status'; import { ExperimentCompleted } from '@/utils/constant'; -import { elapsedTime, formatDate } from '@/utils/date'; +import { formatDate } from '@/utils/date'; import { Typography } from 'antd'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback } from 'react'; import styles from './index.less'; type ExperimentInstanceProps = { @@ -25,9 +25,6 @@ function ExperimentInstance({ argo_ins_ns, experimentInsId, }: ExperimentInstanceProps) { - const [now] = useServerTime(); - const [currentTime, setCurrentTime] = useState(now()); - const handleSSEMessage: MessageHandler = useCallback( (experimentInsId: number, status: string, finish_time: string) => { window.postMessage({ @@ -43,23 +40,11 @@ function ExperimentInstance({ ); useSSE(experimentInsId, status, argo_ins_name, argo_ins_ns, handleSSEMessage); - // 定时刷新耗时 - useEffect(() => { - if (finish_time) { - setCurrentTime(new Date(finish_time)); - } else { - const timer = setInterval(() => { - setCurrentTime(now()); - }, 1000); - return () => { - clearInterval(timer); - }; - } - }, [finish_time, now]); - return ( -
{elapsedTime(create_time, currentTime)}
+
+ +
{formatDate(create_time)} diff --git a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx index b4eeb199..442f38f5 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx +++ b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx @@ -29,7 +29,7 @@ import { } from 'antd'; import { type SearchProps } from 'antd/es/input'; import classNames from 'classnames'; -import { useCallback, useEffect, useState } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import ExperimentInstanceList from '../ExperimentInstanceList'; import { ExperimentListType, experimentListConfig } from './config'; import styles from './index.less'; @@ -58,6 +58,7 @@ function ExperimentList({ type }: ExperimentListProps) { }, ); const config = experimentListConfig[type]; + const timerRef = useRef | undefined>(); // 获取自主机器学习或超参数自动优化列表 const getAutoMLList = useCallback(async () => { @@ -140,7 +141,13 @@ function ExperimentList({ type }: ExperimentListProps) { : v, ), ); - setTimeout(() => { + + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = undefined; + } + + timerRef.current = setTimeout(() => { refreshExperimentList(); }, 10000); } @@ -149,6 +156,10 @@ function ExperimentList({ type }: ExperimentListProps) { window.addEventListener('message', handleMessage); return () => { window.removeEventListener('message', handleMessage); + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = undefined; + } }; }, [refreshExperimentList]); diff --git a/react-ui/src/pages/Experiment/Info/index.jsx b/react-ui/src/pages/Experiment/Info/index.jsx index 39526410..60424e52 100644 --- a/react-ui/src/pages/Experiment/Info/index.jsx +++ b/react-ui/src/pages/Experiment/Info/index.jsx @@ -16,6 +16,7 @@ import ParamsModal from '../components/ViewParamsModal'; import { experimentStatusInfo } from '../status'; import styles from './index.less'; import { useServerTime } from '@/hooks/useServerTime'; +import RunDuration from '@/components/RunDuration'; let graph = null; @@ -28,13 +29,10 @@ function ExperimentText() { const [paramsModalOpen, openParamsModal, closeParamsModal] = useVisible(false); const [propsDrawerOpen, openPropsDrawer, closePropsDrawer, propsDrawerOpenRef] = useVisible(false); - const [now] = useServerTime(); - const [currentTime, setCurrentTime] = useState(now()); const navigate = useNavigate(); const evtSourceRef = useRef(); const width = 110; const height = 36; - const finish_time = experimentIns?.finish_time useEffect(() => { initGraph(); @@ -63,20 +61,6 @@ function ExperimentText() { }; }, []); - // 定时刷新耗时 - useEffect(() => { - if (finish_time) { - setCurrentTime(new Date(finish_time)); - } else { - const timer = setInterval(() => { - setCurrentTime(now()); - }, 1000); - return () => { - clearInterval(timer); - }; - } - }, [finish_time, now]); - // 获取流水线模版 const getWorkflow = async () => { const [res] = await to(getWorkflowById(locationParams.workflowId)); @@ -492,7 +476,7 @@ function ExperimentText() {
执行时长: - {elapsedTime(experimentIns?.create_time, currentTime)} +
状态: diff --git a/react-ui/src/pages/Experiment/components/ExperimentDrawer/index.tsx b/react-ui/src/pages/Experiment/components/ExperimentDrawer/index.tsx index 766b8f9a..11d0ff2e 100644 --- a/react-ui/src/pages/Experiment/components/ExperimentDrawer/index.tsx +++ b/react-ui/src/pages/Experiment/components/ExperimentDrawer/index.tsx @@ -1,11 +1,11 @@ +import RunDuration from '@/components/RunDuration'; import { ExperimentStatus } from '@/enums'; -import { useServerTime } from '@/hooks/useServerTime'; import { experimentStatusInfo } from '@/pages/Experiment/status'; import { PipelineNodeModelSerialize } from '@/types'; -import { elapsedTime, formatDate } from '@/utils/date'; +import { formatDate } from '@/utils/date'; import { CloseOutlined, DatabaseOutlined, ProfileOutlined } from '@ant-design/icons'; import { Drawer, Tabs, Typography } from 'antd'; -import { useEffect, useMemo, useState } from 'react'; +import { useMemo } from 'react'; import ExperimentParameter from '../ExperimentParameter'; import ExperimentResult from '../ExperimentResult'; import LogList from '../LogList'; @@ -42,23 +42,6 @@ const ExperimentDrawer = ({ instanceNodeStartTime, instanceNodeEndTime, }: ExperimentDrawerProps) => { - const [now] = useServerTime(); - const [currentTime, setCurrentTime] = useState(now()); - - // 定时刷新耗时 - useEffect(() => { - if (instanceNodeEndTime) { - setCurrentTime(new Date(instanceNodeEndTime)); - } else { - const timer = setInterval(() => { - setCurrentTime(now()); - }, 1000); - return () => { - clearInterval(timer); - }; - } - }, [instanceNodeEndTime, now]); - // 如果性能有问题,可以进一步拆解 const items = useMemo( () => [ @@ -160,7 +143,7 @@ const ExperimentDrawer = ({
耗时: - {elapsedTime(instanceNodeStartTime, currentTime)} +
(now()); - const handleSSEMessage: MessageHandler = useCallback( (experimentInsId: number, status: string, finish_time: string) => { window.postMessage({ @@ -43,24 +40,12 @@ function ExperimentInstance({ ); useSSE(experimentInsId, status, argo_ins_name, argo_ins_ns, handleSSEMessage); - // 定时刷新耗时 - useEffect(() => { - if (finish_time) { - setCurrentTime(new Date(finish_time)); - } else { - const timer = setInterval(() => { - setCurrentTime(now()); - }, 1000); - return () => { - clearInterval(timer); - }; - } - }, [finish_time, now]); - return (
-
{elapsedTime(create_time, currentTime)}
+
+ +
{formatDate(create_time)} diff --git a/react-ui/src/pages/Experiment/index.jsx b/react-ui/src/pages/Experiment/index.jsx index e424de20..e94c625c 100644 --- a/react-ui/src/pages/Experiment/index.jsx +++ b/react-ui/src/pages/Experiment/index.jsx @@ -21,7 +21,7 @@ import tableCellRender, { TableCellValueType } from '@/utils/table'; import { modalConfirm } from '@/utils/ui'; import { App, Button, ConfigProvider, Dropdown, Input, Space, Table, Tooltip } from 'antd'; import classNames from 'classnames'; -import { useCallback, useEffect, useState } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { ComparisonType } from './Comparison/config'; import AddExperimentModal from './components/AddExperimentModal'; @@ -54,6 +54,7 @@ function Experiment() { }, ); const { message } = App.useApp(); + const timerRef = useRef(); // 获取实验列表 const getExperimentList = useCallback(async () => { @@ -126,7 +127,13 @@ function Experiment() { : v, ), ); - setTimeout(() => { + + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = undefined; + } + + timerRef.current = setTimeout(() => { refreshExperimentList(); }, 10000); } @@ -135,6 +142,10 @@ function Experiment() { window.addEventListener('message', handleMessage); return () => { window.removeEventListener('message', handleMessage); + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = undefined; + } }; }, [refreshExperimentList]); diff --git a/react-ui/src/pages/HyperParameter/Instance/index.tsx b/react-ui/src/pages/HyperParameter/Instance/index.tsx index 148a38e7..a0ebae5b 100644 --- a/react-ui/src/pages/HyperParameter/Instance/index.tsx +++ b/react-ui/src/pages/HyperParameter/Instance/index.tsx @@ -1,6 +1,5 @@ import KFIcon from '@/components/KFIcon'; import { ExperimentStatus } from '@/enums'; -import { useServerTime } from '@/hooks/useServerTime'; import { getRayInsReq } from '@/services/hyperParameter'; import { NodeStatus } from '@/types'; import { parseJsonText } from '@/utils'; @@ -36,9 +35,6 @@ function HyperParameterInstance() { const params = useParams(); const instanceId = safeInvoke(Number)(params.id); const evtSourceRef = useRef(null); - const [now] = useServerTime(); - const [currentTime, setCurrentTime] = useState(now()); - const finish_time = workflowStatus?.finishedAt; useEffect(() => { if (instanceId) { @@ -50,20 +46,6 @@ function HyperParameterInstance() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [instanceId]); - // 定时刷新耗时 - useEffect(() => { - if (finish_time) { - setCurrentTime(new Date(finish_time)); - } else { - const timer = setInterval(() => { - setCurrentTime(now()); - }, 1000); - return () => { - clearInterval(timer); - }; - } - }, [finish_time, now]); - // 获取实验实例详情 const getExperimentInsInfo = async (isStatusDetermined: boolean) => { const [res] = await to(getRayInsReq(instanceId)); @@ -71,7 +53,7 @@ function HyperParameterInstance() { const info = res.data as HyperParameterInstanceData; const { param, node_status, argo_ins_name, argo_ins_ns, status, create_time } = info; // 解析配置参数 - const paramJson = parseJsonText(param); + const paramJson = parseJsonText(param).data; if (paramJson) { // 实例详情返回的参数是字符串,需要转换 if (typeof paramJson.parameters === 'string') { @@ -186,7 +168,6 @@ function HyperParameterInstance() { className={styles['hyper-parameter-instance__basic']} info={experimentInfo} runStatus={workflowStatus} - finishTime={currentTime} isInstance /> ), diff --git a/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx b/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx index e62bc6ff..3e526848 100644 --- a/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx +++ b/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx @@ -1,4 +1,5 @@ import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; +import RunDuration from '@/components/RunDuration'; import { hyperParameterOptimizedMode } from '@/enums'; import { useComputingResource } from '@/hooks/useComputingResource'; import { experimentStatusInfo } from '@/pages/Experiment/status'; @@ -8,7 +9,6 @@ import { } from '@/pages/HyperParameter/components/CreateForm/utils'; import { HyperParameterData } from '@/pages/HyperParameter/types'; import { type NodeStatus } from '@/types'; -import { elapsedTime } from '@/utils/date'; import { formatCodeConfig, formatDataset, @@ -33,14 +33,12 @@ type HyperParameterBasicProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; - finishTime?: Date; }; function HyperParameterBasic({ info, className, runStatus, - finishTime, isInstance = false, }: HyperParameterBasicProps) { const getResourceDescription = useComputingResource()[1]; @@ -157,7 +155,7 @@ function HyperParameterBasic({ }, { label: '执行时长', - value: elapsedTime(info.create_time, finishTime), + value: , ellipsis: true, }, { @@ -184,7 +182,7 @@ function HyperParameterBasic({ ellipsis: true, }, ]; - }, [runStatus, info, finishTime]); + }, [runStatus, info]); return (
From 1c301a778cdb08aacc016facc37920f7563121eb Mon Sep 17 00:00:00 2001 From: zhaowei Date: Fri, 9 May 2025 16:19:36 +0800 Subject: [PATCH 04/25] =?UTF-8?q?fix:=20=E7=BB=88=E6=AD=A2=E5=AE=9E?= =?UTF-8?q?=E9=AA=8C=E6=97=B6=EF=BC=8C=E8=AF=A6=E6=83=85=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/ActiveLearn/Instance/index.tsx | 1 + .../components/ActiveLearnBasic/index.tsx | 63 ++++------------- react-ui/src/pages/AutoML/Instance/index.tsx | 1 + .../AutoML/components/AutoMLBasic/index.tsx | 62 ++++------------ .../components/ExperimentList/index.tsx | 3 + .../components/ExperimentRunBasic/index.tsx | 70 +++++++++++++++++++ .../components/ResourceItem/index.less | 2 - react-ui/src/pages/Experiment/index.jsx | 3 + .../pages/HyperParameter/Instance/index.tsx | 1 + .../components/HyperParameterBasic/index.tsx | 14 ++-- 10 files changed, 115 insertions(+), 105 deletions(-) create mode 100644 react-ui/src/pages/AutoML/components/ExperimentRunBasic/index.tsx diff --git a/react-ui/src/pages/ActiveLearn/Instance/index.tsx b/react-ui/src/pages/ActiveLearn/Instance/index.tsx index d16d5428..5655e60d 100644 --- a/react-ui/src/pages/ActiveLearn/Instance/index.tsx +++ b/react-ui/src/pages/ActiveLearn/Instance/index.tsx @@ -153,6 +153,7 @@ function ActiveLearnInstance() { className={styles['active-learn-instance__basic']} info={experimentInfo} runStatus={workflowStatus} + instanceStatus={instanceInfo?.status} isInstance /> ), diff --git a/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx b/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx index 5c0d4e3e..3c75eb61 100644 --- a/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx +++ b/react-ui/src/pages/ActiveLearn/components/ActiveLearnBasic/index.tsx @@ -1,6 +1,5 @@ import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; -import RunDuration from '@/components/RunDuration'; -import { AutoMLTaskType, autoMLTaskTypeOptions } from '@/enums'; +import { AutoMLTaskType, autoMLTaskTypeOptions, ExperimentStatus } from '@/enums'; import { useComputingResource } from '@/hooks/useComputingResource'; import { classifierAlgorithms, @@ -10,7 +9,7 @@ import { regressorAlgorithms, } from '@/pages/ActiveLearn/components/CreateForm/utils'; import { ActiveLearnData } from '@/pages/ActiveLearn/types'; -import { experimentStatusInfo } from '@/pages/Experiment/status'; +import ExperimentRunBasic from '@/pages/AutoML/components/ExperimentRunBasic'; import { type NodeStatus } from '@/types'; import { formatBoolean, @@ -21,7 +20,6 @@ import { formatMirror, formatModel, } from '@/utils/format'; -import { Flex } from 'antd'; import classNames from 'classnames'; import { useMemo } from 'react'; import styles from './index.less'; @@ -31,9 +29,16 @@ type BasicInfoProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; + instanceStatus?: ExperimentStatus; }; -function BasicInfo({ info, className, runStatus, isInstance = false }: BasicInfoProps) { +function BasicInfo({ + info, + className, + runStatus, + instanceStatus, + isInstance = false, +}: BasicInfoProps) { const getResourceDescription = useComputingResource()[1]; const basicDatas: BasicInfoData[] = useMemo(() => { if (!info) { @@ -205,53 +210,13 @@ function BasicInfo({ info, className, runStatus, isInstance = false }: BasicInfo ]; }, [info, getResourceDescription]); - const instanceDatas = useMemo(() => { - if (!info || !runStatus) { - return []; - } - - return [ - { - label: '启动时间', - value: formatDate(info.create_time), - }, - { - label: '执行时长', - value: , - }, - { - label: '状态', - value: ( - - -
- {experimentStatusInfo[runStatus?.phase]?.label} -
-
- ), - }, - ]; - }, [runStatus, info]); - return (
{isInstance && runStatus && ( - )} {!isInstance && ( diff --git a/react-ui/src/pages/AutoML/Instance/index.tsx b/react-ui/src/pages/AutoML/Instance/index.tsx index 5f1b5e34..e0fb5e4d 100644 --- a/react-ui/src/pages/AutoML/Instance/index.tsx +++ b/react-ui/src/pages/AutoML/Instance/index.tsx @@ -156,6 +156,7 @@ function AutoMLInstance() { className={styles['auto-ml-instance__basic']} info={autoMLInfo} runStatus={workflowStatus} + instanceStatus={instanceInfo?.status} isInstance /> ), diff --git a/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx b/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx index c421c59e..08c95ed9 100644 --- a/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx +++ b/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx @@ -1,20 +1,19 @@ import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; -import RunDuration from '@/components/RunDuration'; import { AutoMLTaskType, AutoMLType, + ExperimentStatus, autoMLEnsembleClassOptions, autoMLTaskTypeOptions, } from '@/enums'; import { useComputingResource } from '@/hooks/useComputingResource'; import { AutoMLData } from '@/pages/AutoML/types'; -import { experimentStatusInfo } from '@/pages/Experiment/status'; import { type NodeStatus } from '@/types'; import { parseJsonText } from '@/utils'; import { formatBoolean, formatDataset, formatDate, formatEnum } from '@/utils/format'; -import { Flex } from 'antd'; import classNames from 'classnames'; import { useMemo } from 'react'; +import ExperimentRunBasic from '../ExperimentRunBasic'; import styles from './index.less'; // 格式化优化方向 @@ -40,9 +39,16 @@ type AutoMLBasicProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; + instanceStatus?: ExperimentStatus; }; -function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLBasicProps) { +function AutoMLBasic({ + info, + className, + runStatus, + instanceStatus, + isInstance = false, +}: AutoMLBasicProps) { const getResourceDescription = useComputingResource()[1]; const basicDatas: BasicInfoData[] = useMemo(() => { if (!info) { @@ -284,53 +290,13 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB ]; }, [info]); - const instanceDatas = useMemo(() => { - if (!info || !runStatus) { - return []; - } - - return [ - { - label: '启动时间', - value: formatDate(info.create_time), - }, - { - label: '执行时长', - value: , - }, - { - label: '状态', - value: ( - - -
- {experimentStatusInfo[runStatus?.phase]?.label} -
-
- ), - }, - ]; - }, [runStatus, info]); - return (
{isInstance && runStatus && ( - )} {!isInstance && ( diff --git a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx index 442f38f5..b71952b2 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx +++ b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx @@ -8,6 +8,7 @@ import KFIcon from '@/components/KFIcon'; import PageTitle from '@/components/PageTitle'; import { ExperimentStatus, autoMLTypeOptions } from '@/enums'; import { useCacheState } from '@/hooks/useCacheState'; +import { useServerTime } from '@/hooks/useServerTime'; import { AutoMLData } from '@/pages/AutoML/types'; import { experimentStatusInfo } from '@/pages/Experiment/status'; import themes from '@/styles/theme.less'; @@ -51,6 +52,7 @@ function ExperimentList({ type }: ExperimentListProps) { const [experimentInsList, setExperimentInsList] = useState([]); const [expandedRowKeys, setExpandedRowKeys] = useState([]); const [experimentInsTotal, setExperimentInsTotal] = useState(0); + const [now] = useServerTime(); const [pagination, setPagination] = useState( cacheState?.pagination ?? { current: 1, @@ -275,6 +277,7 @@ function ExperimentList({ type }: ExperimentListProps) { return { ...item, status: ExperimentStatus.Terminated, + finish_time: now().toISOString(), }; } return item; diff --git a/react-ui/src/pages/AutoML/components/ExperimentRunBasic/index.tsx b/react-ui/src/pages/AutoML/components/ExperimentRunBasic/index.tsx new file mode 100644 index 00000000..e088c7e8 --- /dev/null +++ b/react-ui/src/pages/AutoML/components/ExperimentRunBasic/index.tsx @@ -0,0 +1,70 @@ +import ConfigInfo from '@/components/ConfigInfo'; +import RunDuration from '@/components/RunDuration'; +import { ExperimentStatus } from '@/enums'; +import { experimentStatusInfo } from '@/pages/Experiment/status'; +import { type NodeStatus } from '@/types'; +import { formatDate } from '@/utils/format'; +import { Flex } from 'antd'; +import { useMemo } from 'react'; + +type ExperimentRunBasicProps = { + create_time?: string; + runStatus?: NodeStatus; + instanceStatus?: ExperimentStatus; +}; + +function ExperimentRunBasic({ create_time, runStatus, instanceStatus }: ExperimentRunBasicProps) { + const instanceDatas = useMemo(() => { + if (!runStatus) { + return []; + } + + const status = + instanceStatus === ExperimentStatus.Terminated ? instanceStatus : runStatus.phase; + const statusInfo = experimentStatusInfo[status]; + + return [ + { + label: '启动时间', + value: formatDate(create_time), + }, + { + label: '执行时长', + value: , + }, + { + label: '状态', + value: ( + + +
+ {statusInfo?.label} +
+
+ ), + }, + ]; + }, [runStatus, create_time, instanceStatus]); + + return ( + + ); +} + +export default ExperimentRunBasic; diff --git a/react-ui/src/pages/Dataset/components/ResourceItem/index.less b/react-ui/src/pages/Dataset/components/ResourceItem/index.less index 01be647c..58b5be62 100644 --- a/react-ui/src/pages/Dataset/components/ResourceItem/index.less +++ b/react-ui/src/pages/Dataset/components/ResourceItem/index.less @@ -55,9 +55,7 @@ } &__time { display: flex; - flex: 0 1 content; align-items: center; - width: 100%; color: #808080; font-size: 13px; } diff --git a/react-ui/src/pages/Experiment/index.jsx b/react-ui/src/pages/Experiment/index.jsx index e94c625c..1ecc7df1 100644 --- a/react-ui/src/pages/Experiment/index.jsx +++ b/react-ui/src/pages/Experiment/index.jsx @@ -28,6 +28,7 @@ import AddExperimentModal from './components/AddExperimentModal'; import ExperimentInstanceList from './components/ExperimentInstanceList'; import styles from './index.less'; import { experimentStatusInfo } from './status'; +import { useServerTime } from '@/hooks/useServerTime'; // 定时器 const timerIds = new Map(); @@ -47,6 +48,7 @@ function Experiment() { const [cacheState, setCacheState] = useCacheState(); const [searchText, setSearchText] = useState(cacheState?.searchText); const [inputText, setInputText] = useState(cacheState?.searchText); + const [now] = useServerTime(); const [pagination, setPagination] = useState( cacheState?.pagination ?? { current: 1, @@ -384,6 +386,7 @@ function Experiment() { return { ...item, status: ExperimentStatus.Terminated, + finish_time: now().toISOString(), }; } return item; diff --git a/react-ui/src/pages/HyperParameter/Instance/index.tsx b/react-ui/src/pages/HyperParameter/Instance/index.tsx index a0ebae5b..79905c36 100644 --- a/react-ui/src/pages/HyperParameter/Instance/index.tsx +++ b/react-ui/src/pages/HyperParameter/Instance/index.tsx @@ -168,6 +168,7 @@ function HyperParameterInstance() { className={styles['hyper-parameter-instance__basic']} info={experimentInfo} runStatus={workflowStatus} + instanceStatus={instanceInfo?.status} isInstance /> ), diff --git a/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx b/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx index 3e526848..f4b9852b 100644 --- a/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx +++ b/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx @@ -1,7 +1,8 @@ import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; import RunDuration from '@/components/RunDuration'; -import { hyperParameterOptimizedMode } from '@/enums'; +import { ExperimentStatus, hyperParameterOptimizedMode } from '@/enums'; import { useComputingResource } from '@/hooks/useComputingResource'; +import ExperimentRunBasic from '@/pages/AutoML/components/ExperimentRunBasic'; import { experimentStatusInfo } from '@/pages/Experiment/status'; import { schedulerAlgorithms, @@ -33,12 +34,14 @@ type HyperParameterBasicProps = { className?: string; isInstance?: boolean; runStatus?: NodeStatus; + instanceStatus?: ExperimentStatus; }; function HyperParameterBasic({ info, className, runStatus, + instanceStatus, isInstance = false, }: HyperParameterBasicProps) { const getResourceDescription = useComputingResource()[1]; @@ -187,11 +190,10 @@ function HyperParameterBasic({ return (
{isInstance && runStatus && ( - )} {!isInstance && ( From 4a6e0347b216ff730481f1372bc4c9dd6904edc7 Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Fri, 9 May 2025 16:44:30 +0800 Subject: [PATCH 05/25] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activeLearn/ActiveLearnInsController.java | 4 +- .../experiment/ExperimentInsController.java | 43 ++++++------ .../labelStudio/labelStudioController.java | 10 +-- .../platform/domain/MachineLearnIns.java | 4 ++ .../scheduling/ActiveLearnInsStatusTask.java | 2 +- .../scheduling/AutoMlInsStatusTask.java | 2 +- .../ExperimentInstanceStatusTask.java | 2 +- .../platform/scheduling/MLStatusTask.java | 2 +- .../platform/scheduling/RayInsStatusTask.java | 2 +- .../service/impl/ActiveLearnServiceImpl.java | 2 +- .../service/impl/AutoMlServiceImpl.java | 2 +- .../impl/ExperimentInsServiceImpl.java | 70 +++++++++++-------- .../impl/MachineLearnInsServiceImpl.java | 30 ++++++++ .../service/impl/MachineLearnServiceImpl.java | 17 +++-- .../platform/service/impl/RayServiceImpl.java | 2 +- .../impl/ResourceOccupyServiceImpl.java | 9 ++- .../service/impl/WorkflowServiceImpl.java | 2 +- .../com/ruoyi/platform/utils/MinioUtil.java | 2 +- .../managementPlatform/ResourceOccupy.xml | 8 ++- 19 files changed, 132 insertions(+), 83 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/activeLearn/ActiveLearnInsController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/activeLearn/ActiveLearnInsController.java index 282506b1..cd2c953e 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/activeLearn/ActiveLearnInsController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/activeLearn/ActiveLearnInsController.java @@ -59,10 +59,10 @@ public class ActiveLearnInsController extends BaseController { return genericsSuccess(this.activeLearnInsService.getDetailById(id)); } - @GetMapping("/getExpMetrics") + @PostMapping("/getExpMetrics") @ApiOperation("获取当前实验的指标对比地址") @ApiResponse - public GenericsAjaxResult getExpMetrics(@RequestParam(value = "experiment_ins_id") String experimentInsId) throws Exception { + public GenericsAjaxResult getExpMetrics(@RequestBody String experimentInsId) throws Exception { return genericsSuccess(activeLearnInsService.getExpMetrics(experimentInsId)); } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/experiment/ExperimentInsController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/experiment/ExperimentInsController.java index 32ad25ce..e95aa2fe 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/experiment/ExperimentInsController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/experiment/ExperimentInsController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.io.IOException; +import java.util.Date; import java.util.List; import java.util.Map; @@ -42,8 +43,8 @@ public class ExperimentInsController extends BaseController { @GetMapping @ApiOperation("分页查询") public GenericsAjaxResult> queryByPage(ExperimentIns experimentIns, int page, int size) throws IOException { - PageRequest pageRequest = PageRequest.of(page,size); - return genericsSuccess(this.experimentInsService.queryByPage(experimentIns, pageRequest)); + PageRequest pageRequest = PageRequest.of(page, size); + return genericsSuccess(this.experimentInsService.queryByPage(experimentIns, pageRequest)); } /** @@ -55,7 +56,7 @@ public class ExperimentInsController extends BaseController { @GetMapping("{id}") @ApiOperation("通过id查询实验实例") public GenericsAjaxResult queryById(@PathVariable("id") Integer id) throws IOException { - return genericsSuccess(this.experimentInsService.queryById(id)); + return genericsSuccess(this.experimentInsService.queryById(id)); } /** @@ -67,7 +68,7 @@ public class ExperimentInsController extends BaseController { @GetMapping("/queryByExperimentId/{Experiment_id}") @ApiOperation("通过实验id查询查询实验实例列表") public GenericsAjaxResult> queryByExperimentId(@PathVariable("Experiment_id") Integer experimentId) throws IOException { - return genericsSuccess(this.experimentInsService.getByExperimentId(experimentId)); + return genericsSuccess(this.experimentInsService.getByExperimentId(experimentId)); } /** @@ -79,7 +80,7 @@ public class ExperimentInsController extends BaseController { @PostMapping @ApiOperation("新增实验实例") public GenericsAjaxResult add(@RequestBody ExperimentIns experimentIns) { - return genericsSuccess(this.experimentInsService.insert(experimentIns)); + return genericsSuccess(this.experimentInsService.insert(experimentIns)); } /** @@ -91,7 +92,7 @@ public class ExperimentInsController extends BaseController { @PutMapping @ApiOperation("编辑实验实例") public GenericsAjaxResult edit(@RequestBody ExperimentIns experimentIns) throws IOException { - return genericsSuccess(this.experimentInsService.update(experimentIns)); + return genericsSuccess(this.experimentInsService.update(experimentIns)); } /** @@ -102,14 +103,14 @@ public class ExperimentInsController extends BaseController { */ @DeleteMapping("{id}") @ApiOperation("删除实验实例") - public GenericsAjaxResult deleteById( @PathVariable("id") Integer id) { - return genericsSuccess(this.experimentInsService.removeById(id)); + public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) { + return genericsSuccess(this.experimentInsService.removeById(id)); } @DeleteMapping("batchDelete") @ApiOperation("批量删除实验实例") - public GenericsAjaxResult batchDelete(@RequestBody List ids) throws Exception{ - return genericsSuccess(this.experimentInsService.batchDelete(ids)); + public GenericsAjaxResult batchDelete(@RequestBody List ids) throws Exception { + return genericsSuccess(this.experimentInsService.batchDelete(ids)); } /** @@ -133,8 +134,8 @@ public class ExperimentInsController extends BaseController { @GetMapping("/log") @ApiOperation("查询实例日志") public GenericsAjaxResult showExperimentInsLog(@RequestParam("id") Integer id, - @RequestParam("component_id") String componentId){ - return genericsSuccess(this.experimentInsService.showExperimentInsLog(id,componentId)); + @RequestParam("component_id") String componentId) { + return genericsSuccess(this.experimentInsService.showExperimentInsLog(id, componentId)); } /** @@ -146,14 +147,14 @@ public class ExperimentInsController extends BaseController { @GetMapping("/pods/log") @ApiOperation("获取pod实时日志请求") public GenericsAjaxResult> getRealtimePodLog(@RequestParam("pod_name") String podName, - @RequestParam("start_time") String startTime){ - return genericsSuccess(this.experimentInsService.getRealtimePodLog(podName,startTime)); + @RequestParam("start_time") String startTime) { + return genericsSuccess(this.experimentInsService.getRealtimePodLog(podName, startTime)); } @PostMapping("/pods/realTimeLog") @ApiOperation("获取pod实时日志请求") - public GenericsAjaxResult getRealtimePodLogFromPod(@RequestBody PodLogVo podLogVo){ + public GenericsAjaxResult getRealtimePodLogFromPod(@RequestBody PodLogVo podLogVo) { return genericsSuccess(this.experimentInsService.getRealtimePodLogFromPod(podLogVo)); } @@ -166,14 +167,11 @@ public class ExperimentInsController extends BaseController { @PostMapping("/realTimeLog") @ApiOperation("查询实验实例实时日志") - public GenericsAjaxResult> getRealtimeWorkflowLog(@RequestBody LogRequestVo logRequest){ + public GenericsAjaxResult> getRealtimeWorkflowLog(@RequestBody LogRequestVo logRequest) { return genericsSuccess(this.experimentInsService.getRealtimeWorkflowLog(logRequest)); } - - - /** * 查询实验节点结果 * @@ -184,8 +182,13 @@ public class ExperimentInsController extends BaseController { public GenericsAjaxResult getNodeResult(@RequestBody Map map) throws Exception { Integer id = Integer.parseInt((String) map.get("id")); String nodeId = (String) map.get("node_id"); - return genericsSuccess(this.experimentInsService.getNodeResult(id,nodeId)); + return genericsSuccess(this.experimentInsService.getNodeResult(id, nodeId)); } + @GetMapping("/time") + @ApiOperation("获取当前时间") + public GenericsAjaxResult getTime() { + return genericsSuccess(new Date()); + } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/labelStudio/labelStudioController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/labelStudio/labelStudioController.java index deda8542..290b6bc1 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/labelStudio/labelStudioController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/labelStudio/labelStudioController.java @@ -1,9 +1,7 @@ package com.ruoyi.platform.controller.labelStudio; import com.ruoyi.common.core.web.controller.BaseController; -import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.domain.GenericsAjaxResult; -import com.ruoyi.platform.service.JupyterService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Value; @@ -11,12 +9,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - @RestController @RequestMapping("/labelStudio") @Api("labelStudio service") @@ -25,7 +17,7 @@ public class labelStudioController extends BaseController { private String url; @GetMapping(value = "/getURL") @ApiOperation("得到访问地址") - public GenericsAjaxResult getURL() throws IOException { + public GenericsAjaxResult getURL() { return genericsSuccess(url); } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/MachineLearnIns.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/MachineLearnIns.java index 120cf68d..c53d2d7b 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/MachineLearnIns.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/MachineLearnIns.java @@ -7,6 +7,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; +import java.util.List; +import java.util.Map; @Data @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) @@ -48,4 +50,6 @@ public class MachineLearnIns { private Date updateTime; private Date finishTime; + + private Map fileMap; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ActiveLearnInsStatusTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ActiveLearnInsStatusTask.java index c08d6512..0bd1150e 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ActiveLearnInsStatusTask.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ActiveLearnInsStatusTask.java @@ -33,7 +33,7 @@ public class ActiveLearnInsStatusTask { private List activeLearnIds = new ArrayList<>(); - @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 + @Scheduled(cron = "0/10 * * * * ?") // 每10S执行一次 public void executeActiveLearnInsStatus() { List activeLearnInsList = activeLearnInsService.queryActiveLearnInsIsNotTerminated(); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/AutoMlInsStatusTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/AutoMlInsStatusTask.java index c59d67fc..44822fa8 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/AutoMlInsStatusTask.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/AutoMlInsStatusTask.java @@ -29,7 +29,7 @@ public class AutoMlInsStatusTask { private List autoMlIds = new ArrayList<>(); - @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 + @Scheduled(cron = "0/10 * * * * ?") // 每10S执行一次 public void executeAutoMlInsStatus() { // 首先查到所有非终止态的实验实例 List autoMlInsList = autoMlInsService.queryByAutoMlInsIsNotTerminated(); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java index f1cf303a..3b97cd22 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java @@ -36,7 +36,7 @@ public class ExperimentInstanceStatusTask { private List experimentIds = new ArrayList<>(); - @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 + @Scheduled(cron = "0/10 * * * * ?") // 每10S执行一次 public void executeExperimentInsStatus() throws Exception { // 首先查到所有非终止态的实验实例 List experimentInsList = experimentInsService.queryByExperimentIsNotTerminated(); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/MLStatusTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/MLStatusTask.java index 905f6d2a..88980ba6 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/MLStatusTask.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/MLStatusTask.java @@ -31,7 +31,7 @@ public class MLStatusTask { private List machineLearnIds = new ArrayList<>(); - @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 + @Scheduled(cron = "0/10 * * * * ?") // 每10S执行一次 public void executeMachineLearnInsStatus() { // 首先查到所有非终止态的实验实例 List insList = machineLearnInsService.queryNotTerminated(); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/RayInsStatusTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/RayInsStatusTask.java index f5b0b759..cbf65ed4 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/RayInsStatusTask.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/RayInsStatusTask.java @@ -33,7 +33,7 @@ public class RayInsStatusTask { private List rayIds = new ArrayList<>(); - @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 + @Scheduled(cron = "0/10 * * * * ?") // 每10S执行一次 public void executeRayInsStatus() { List rayInsList = rayInsService.queryByRayInsIsNotTerminated(); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java index bf3d607d..1a00356a 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java @@ -57,7 +57,7 @@ public class ActiveLearnServiceImpl implements ActiveLearnService { @Override public ActiveLearn save(ActiveLearnVo activeLearnVo) throws Exception { - if (activeLearnVo.getName().length() >= 64) { + if (activeLearnVo.getName().length() > 64) { throw new RuntimeException("实验名称大于最大长度"); } ActiveLearn activeLearnByName = activeLearnDao.getActiveLearnByName(activeLearnVo.getName()); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AutoMlServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AutoMlServiceImpl.java index 99354424..07887883 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AutoMlServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AutoMlServiceImpl.java @@ -66,7 +66,7 @@ public class AutoMlServiceImpl implements AutoMlService { @Override public AutoMl save(AutoMlVo autoMlVo) throws Exception { - if (autoMlVo.getMlName().length() >= 64) { + if (autoMlVo.getMlName().length() > 64) { throw new RuntimeException("实验名称大于最大长度"); } AutoMl autoMlByName = autoMlDao.getAutoMlByName(autoMlVo.getMlName()); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java index b58e449b..9a6ab793 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java @@ -18,6 +18,8 @@ import com.ruoyi.platform.vo.PodLogVo; import com.ruoyi.system.api.constant.Constant; import com.ruoyi.system.api.model.LoginUser; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -37,6 +39,8 @@ import java.util.*; */ @Service("experimentInsService") public class ExperimentInsServiceImpl implements ExperimentInsService { + private static final Logger logger = LoggerFactory.getLogger(ExperimentInsServiceImpl.class); + @Resource private ExperimentInsDao experimentInsDao; @Resource @@ -362,7 +366,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { } // 只有状态是"Running"时才能终止实例 - if (!currentStatus.equalsIgnoreCase("Running")) { + if (!currentStatus.equalsIgnoreCase(Constant.Running)) { throw new Exception("终止错误,只有运行状态的实例才能终止"); // 如果不是"Running"状态,则不执行终止操作 } @@ -430,40 +434,44 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { } - void deleteExportVersion(ExperimentIns experimentIns) throws Exception { - LoginUser loginUser = SecurityUtils.getLoginUser(); - String ci4sUsername = loginUser.getUsername(); - - String nodesResult = experimentIns.getNodesResult(); - - if (StringUtils.isNotEmpty(nodesResult)) { - Map nodesResultMap = JsonUtils.jsonToMap(nodesResult); - Map paramOutput = (Map) nodesResultMap.get("param_output"); - - for (String key : paramOutput.keySet()) { - //删除导出模型版本 - if (key.contains("model-export")) { - HashMap queryMap = new HashMap(); - queryMap.put("insId", experimentIns.getId()); - ModelDependency1 modelDependency1 = modelDependency1Dao.queryByInsId(JSON.toJSONString(queryMap)); - if (modelDependency1 != null) { - if (StringUtils.isNotEmpty(modelDependency1.getVersion())) { - String relativePath = ci4sUsername + "/model/" + modelDependency1.getRepoId() + "/" + modelDependency1.getIdentifier() + "/" + modelDependency1.getVersion() + "/model"; - modelsService.deleteVersion(modelDependency1.getRepoId(), modelDependency1.getIdentifier(), modelDependency1.getOwner(), modelDependency1.getVersion(), relativePath); - } else { - modelDependency1Dao.deleteModelById(modelDependency1.getId()); + void deleteExportVersion(ExperimentIns experimentIns) { + try { + LoginUser loginUser = SecurityUtils.getLoginUser(); + String ci4sUsername = loginUser.getUsername(); + + String nodesResult = experimentIns.getNodesResult(); + + if (StringUtils.isNotEmpty(nodesResult)) { + Map nodesResultMap = JsonUtils.jsonToMap(nodesResult); + Map paramOutput = (Map) nodesResultMap.get("param_output"); + + for (String key : paramOutput.keySet()) { + //删除导出模型版本 + if (key.contains("model-export")) { + HashMap queryMap = new HashMap(); + queryMap.put("insId", experimentIns.getId()); + ModelDependency1 modelDependency1 = modelDependency1Dao.queryByInsId(JSON.toJSONString(queryMap)); + if (modelDependency1 != null) { + if (StringUtils.isNotEmpty(modelDependency1.getVersion())) { + String relativePath = ci4sUsername + "/model/" + modelDependency1.getRepoId() + "/" + modelDependency1.getIdentifier() + "/" + modelDependency1.getVersion() + "/model"; + modelsService.deleteVersion(modelDependency1.getRepoId(), modelDependency1.getIdentifier(), modelDependency1.getOwner(), modelDependency1.getVersion(), relativePath); + } else { + modelDependency1Dao.deleteModelById(modelDependency1.getId()); + } } } - } - //删除导出数据集版本 - if (key.contains("dataset-export")) { - HashMap queryMap = new HashMap(); - queryMap.put("ins_id", experimentIns.getId()); - DatasetTempStorage datasetTempStorage = datasetTempStorageDao.queryByInsId(JSON.toJSONString(queryMap)); - String relativePath = ci4sUsername + "/datasets/" + datasetTempStorage.getRepoId() + "/" + datasetTempStorage.getName() + "/" + datasetTempStorage.getVersion() + "/dataset"; - newDatasetService.deleteDatasetVersionNew(datasetTempStorage.getRepoId(), datasetTempStorage.getName(), datasetTempStorage.getCreateBy(), datasetTempStorage.getVersion(), relativePath); + //删除导出数据集版本 + if (key.contains("dataset-export")) { + HashMap queryMap = new HashMap(); + queryMap.put("ins_id", experimentIns.getId()); + DatasetTempStorage datasetTempStorage = datasetTempStorageDao.queryByInsId(JSON.toJSONString(queryMap)); + String relativePath = ci4sUsername + "/datasets/" + datasetTempStorage.getRepoId() + "/" + datasetTempStorage.getName() + "/" + datasetTempStorage.getVersion() + "/dataset"; + newDatasetService.deleteDatasetVersionNew(datasetTempStorage.getRepoId(), datasetTempStorage.getName(), datasetTempStorage.getCreateBy(), datasetTempStorage.getVersion(), relativePath); + } } } + } catch (Exception e) { + logger.error(e.getMessage()); } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnInsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnInsServiceImpl.java index 2e353807..6311fc74 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnInsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnInsServiceImpl.java @@ -9,8 +9,11 @@ import com.ruoyi.platform.service.ResourceOccupyService; import com.ruoyi.platform.utils.DateUtils; import com.ruoyi.platform.utils.HttpUtils; import com.ruoyi.platform.utils.JsonUtils; +import com.ruoyi.platform.utils.MinioUtil; import com.ruoyi.system.api.constant.Constant; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.data.domain.Page; @@ -23,6 +26,8 @@ import java.util.*; @Service public class MachineLearnInsServiceImpl implements MachineLearnInsService { + private static final Logger logger = LoggerFactory.getLogger(MachineLearnInsServiceImpl.class); + @Value("${argo.url}") private String argoUrl; @Value("${argo.workflowStatus}") @@ -36,6 +41,8 @@ public class MachineLearnInsServiceImpl implements MachineLearnInsService { private MachineLearnDao machineLearnDao; @Resource private ResourceOccupyService resourceOccupyService; + @Resource + private MinioUtil minioUtil; @Override public Page queryByPage(Long machineLearnId, PageRequest pageRequest) { @@ -237,6 +244,9 @@ public class MachineLearnInsServiceImpl implements MachineLearnInsService { if (Constant.Running.equals(machineLearnIns.getStatus()) || Constant.Pending.equals(machineLearnIns.getStatus())) { machineLearnIns = queryStatusFromArgo(machineLearnIns); } + if (Constant.ML_VideoClassification.equals(machineLearnIns.getType())) { + getFileList(machineLearnIns); + } return machineLearnIns; } @@ -256,4 +266,24 @@ public class MachineLearnInsServiceImpl implements MachineLearnInsService { machineLearnDao.edit(machineLearn); } } + + public void getFileList(MachineLearnIns ins) { + String directoryPath = ins.getResultPath(); + + try { + String bucketName = directoryPath.substring(0, directoryPath.indexOf("/")); + String prefix = directoryPath.substring(directoryPath.indexOf("/") + 1, directoryPath.length()) + "/"; + List fileMaps = minioUtil.listRayFilesInDirectory(bucketName, prefix); + Map fileMap = new HashMap<>(); + fileMap.put("children", fileMaps); + fileMap.put("url", directoryPath); + fileMap.put("isDirectory", true); + fileMap.put("size", "0 B"); + fileMap.put("name", "result file"); + ins.setFileMap(fileMap); + } catch (Exception e) { + logger.error("未找到结果文件"); + } + + } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java index f61847ef..dc803c63 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java @@ -63,7 +63,7 @@ public class MachineLearnServiceImpl implements MachineLearnService { @Override public MachineLearn add(MachineLearn machineLearn) { - if (machineLearn.getName().length() >= 64) { + if (machineLearn.getName().length() > 64) { throw new RuntimeException("实验名称大于最大长度"); } MachineLearn machineLearnByName = machineLearnDao.getMachineLearnByName(machineLearn.getName()); @@ -105,6 +105,12 @@ public class MachineLearnServiceImpl implements MachineLearnService { if (!(StringUtils.equals(username, "admin") || StringUtils.equals(username, createBy))) { throw new RuntimeException("无权限删除该实验"); } + + List insList = machineLearnInsDao.getByMachineLearnId(machineLearn.getId()); + if (!insList.isEmpty()) { + throw new RuntimeException("该实验存在实例,无法删除"); + } + machineLearn.setUpdateBy(SecurityUtils.getLoginUser().getUsername()); machineLearn.setState(Constant.State_invalid); resourceOccupyService.deleteTaskState(Constant.TaskType_ML, id, null); @@ -191,7 +197,8 @@ public class MachineLearnServiceImpl implements MachineLearnService { Map param_output = (Map) output.get("param_output"); List output1 = (ArrayList) param_output.values().toArray()[0]; Map output2 = (Map) output1.get(0); - String outputPath = minioEndpoint + "/" + output2.get("path").replace("{{workflow.name}}", (String) metadata.get("name")) + "/"; + String outputStr = output2.get("path").replace("{{workflow.name}}", (String) metadata.get("name")); + String outputPath = minioEndpoint + "/" + outputStr + "/"; switch (machineLearn.getType()) { case Constant.ML_CSV: { @@ -208,13 +215,13 @@ public class MachineLearnServiceImpl implements MachineLearnService { } case Constant.ML_TextClassification: { machineLearnIns.setModelPath(outputPath + "saved_dict/" + modelType + ".ckpt"); - machineLearnIns.setRunHistoryPath(output2.get("path").replace("{{workflow.name}}", (String) metadata.get("name")).substring("data/".length()) + "/log/" + modelType); + machineLearnIns.setRunHistoryPath(outputStr.substring("data/".length()) + "/log/" + modelType); machineLearnIns.setResultPath(outputPath + "log/" + modelType + "/result.txt"); break; } case Constant.ML_VideoClassification: { - machineLearnIns.setResultPath(outputPath); - machineLearnIns.setRunHistoryPath(output2.get("path").replace("{{workflow.name}}", (String) metadata.get("name")).substring("data/".length()) + "/log"); + machineLearnIns.setResultPath(outputStr); + machineLearnIns.setRunHistoryPath(outputStr.substring("data/".length()) + "/log"); break; } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java index 1a9c9770..e40acbe0 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java @@ -63,7 +63,7 @@ public class RayServiceImpl implements RayService { @Override public Ray save(RayVo rayVo) throws Exception { - if (rayVo.getName().length() >= 64) { + if (rayVo.getName().length() > 64) { throw new RuntimeException("实验名称大于最大长度"); } Ray rayByName = rayDao.getRayByName(rayVo.getName()); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ResourceOccupyServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ResourceOccupyServiceImpl.java index 3b63eb43..a3ee78e9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ResourceOccupyServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ResourceOccupyServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -113,9 +114,11 @@ public class ResourceOccupyServiceImpl implements ResourceOccupyService { } Double hours = (double) timeDifferenceMillis / (1000 * 60 * 60); Double deduceCredit = resourceOccupy.getCreditPerHour() * hours; - resourceOccupyDao.deduceCredit(deduceCredit, resourceOccupy.getUserId()); + double deduceCreditTrun = new BigDecimal(deduceCredit).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + deduceCreditTrun = deduceCreditTrun > 0 ? deduceCreditTrun : 0.01; + resourceOccupyDao.deduceCredit(deduceCreditTrun, resourceOccupy.getUserId()); - resourceOccupy.setDeduceCredit(resourceOccupy.getDeduceCredit() + deduceCredit); + resourceOccupy.setDeduceCredit(resourceOccupy.getDeduceCredit() + deduceCreditTrun); resourceOccupy.setDeduceLastTime(now); resourceOccupy.setState(Constant.State_valid); resourceOccupyDao.edit(resourceOccupy); @@ -171,6 +174,6 @@ public class ResourceOccupyServiceImpl implements ResourceOccupyService { @Override public void deleteTaskState(String taskType, Long taskId, Long taskInsId) { - resourceOccupyDao.deleteTaskState(taskType,taskId,taskInsId); + resourceOccupyDao.deleteTaskState(taskType, taskId, taskInsId); } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java index fbeb54a5..ccefc30f 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java @@ -180,7 +180,7 @@ public class WorkflowServiceImpl implements WorkflowService { Workflow workflow = this.queryById(id); if (workflow != null) { try { - if (workflow.getName().length() >= 64) { + if (workflow.getName().length() > 64) { throw new RuntimeException("流水线名称大于最大长度"); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java index 606fcb46..103aedf4 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java @@ -350,7 +350,7 @@ public class MinioUtil { map.put("name", fileName); map.put("size", formattedSize); - if ((fileName.startsWith("run") || fileName.startsWith("checkpoint")) && fileSize == 0) { + if ((fileName.startsWith("run") || fileName.startsWith("checkpoint") || fileName.equals("log")) && fileSize == 0) { map.put("isDirectory", true); map.put("children", listRayFilesInDirectory(bucketName, fullPath)); } else { diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ResourceOccupy.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ResourceOccupy.xml index 3587a9cb..c4916ea2 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ResourceOccupy.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ResourceOccupy.xml @@ -104,7 +104,7 @@ user_id, description, credit_per_hour, - TRUNCATE(deduce_credit, 1) as deduce_credit, + deduce_credit, start_time, task_type, task_id, @@ -119,13 +119,15 @@ From 119a8556c8f0dd9889b6a753b52356f9027d1ba0 Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Sat, 10 May 2025 08:27:40 +0800 Subject: [PATCH 06/25] =?UTF-8?q?chore:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/src/hooks/useServerTime.ts | 23 ++++++++++---------- react-ui/src/pages/Experiment/Info/index.jsx | 10 +++++---- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/react-ui/src/hooks/useServerTime.ts b/react-ui/src/hooks/useServerTime.ts index 89b39775..a5c6f229 100644 --- a/react-ui/src/hooks/useServerTime.ts +++ b/react-ui/src/hooks/useServerTime.ts @@ -11,44 +11,43 @@ import { useCallback, useEffect, useState } from 'react'; let globalTimeOffset: number | undefined = undefined; export const globalGetSeverTime = async () => { - const requestStartTime = Date.now() + const requestStartTime = Date.now(); const [res] = await to(getSeverTimeReq()); - const requestEndTime = Date.now() + const requestEndTime = Date.now(); const requestDuration = (requestEndTime - requestStartTime) / 2; if (res && res.data) { const serverDate = new Date(res.data); - const timeOffset = serverDate.getTime() + requestDuration - requestEndTime ; + const timeOffset = serverDate.getTime() + requestDuration - requestEndTime; globalTimeOffset = timeOffset; - return timeOffset + return timeOffset; } }; export const now = () => { - return new Date(Date.now() + (globalTimeOffset ?? 0)) -} + return new Date(Date.now() + (globalTimeOffset ?? 0)); +}; /** 获取服务器时间 */ export function useServerTime() { const [timeOffset, setTimeOffset] = useState(globalTimeOffset ?? 0); useEffect(() => { - // 获取服务器时间 const getSeverTime = async () => { const [res] = await to(globalGetSeverTime()); if (res) { - setTimeOffset(res) + setTimeOffset(res); } }; + // 获取服务器时间,防止第一次加载时,请求失败 if (!globalTimeOffset) { getSeverTime(); } }, []); const now = useCallback(() => { - return new Date(Date.now() + timeOffset) - }, [timeOffset]) - + return new Date(Date.now() + timeOffset); + }, [timeOffset]); - return [now, timeOffset] as const; + return [now] as const; } diff --git a/react-ui/src/pages/Experiment/Info/index.jsx b/react-ui/src/pages/Experiment/Info/index.jsx index 60424e52..29c21151 100644 --- a/react-ui/src/pages/Experiment/Info/index.jsx +++ b/react-ui/src/pages/Experiment/Info/index.jsx @@ -1,3 +1,4 @@ +import RunDuration from '@/components/RunDuration'; import { ExperimentStatus } from '@/enums'; import { useStateRef } from '@/hooks/useStateRef'; import { useVisible } from '@/hooks/useVisible'; @@ -5,7 +6,7 @@ import { getExperimentIns } from '@/services/experiment/index.js'; import { getWorkflowById } from '@/services/pipeline/index.js'; import themes from '@/styles/theme.less'; import { fittingString, parseJsonText } from '@/utils'; -import { elapsedTime, formatDate } from '@/utils/date'; +import { formatDate } from '@/utils/date'; import { to } from '@/utils/promise'; import G6, { Util } from '@antv/g6'; import { Button } from 'antd'; @@ -15,8 +16,6 @@ import ExperimentDrawer from '../components/ExperimentDrawer'; import ParamsModal from '../components/ViewParamsModal'; import { experimentStatusInfo } from '../status'; import styles from './index.less'; -import { useServerTime } from '@/hooks/useServerTime'; -import RunDuration from '@/components/RunDuration'; let graph = null; @@ -476,7 +475,10 @@ function ExperimentText() {
执行时长: - +
状态: From 411dee0ebf51808a9650a90cf8fca2b98265061b Mon Sep 17 00:00:00 2001 From: zhaowei Date: Sat, 10 May 2025 10:29:32 +0800 Subject: [PATCH 07/25] =?UTF-8?q?style=EF=BC=9A=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=9C=BA=E5=99=A8=E5=AD=A6=E4=B9=A0=E5=88=97=E8=A1=A8=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/src/hooks/useSSE.ts | 5 +++-- react-ui/src/hooks/useServerTime.ts | 2 +- .../components/ExperimentInstanceList/index.less | 10 ++++++---- .../AutoML/components/ExperimentList/index.tsx | 7 ++++--- .../Dataset/components/ResourceItem/index.less | 1 + .../pages/Dataset/components/ResourceItem/index.tsx | 13 +++++++------ .../pages/ModelDeployment/CreateVersion/index.less | 7 +++++++ .../pages/ModelDeployment/CreateVersion/index.tsx | 6 +++++- 8 files changed, 34 insertions(+), 17 deletions(-) diff --git a/react-ui/src/hooks/useSSE.ts b/react-ui/src/hooks/useSSE.ts index 9f364f68..4ed9d7f2 100644 --- a/react-ui/src/hooks/useSSE.ts +++ b/react-ui/src/hooks/useSSE.ts @@ -5,8 +5,9 @@ import { NodeStatus } from '@/types'; export type MessageHandler = (experimentInsId: number, status: string, finishedAt: string, nodes: Record) => void export const useSSE = (experimentInsId: number, status: ExperimentStatus, name: string, namespace: string, onMessage: MessageHandler) => { + const isRunning = status === ExperimentStatus.Pending || status === ExperimentStatus.Running useEffect(() => { - if (status === ExperimentStatus.Pending || status === ExperimentStatus.Running) { + if (isRunning) { const { origin } = location; const params = encodeURIComponent(`metadata.namespace=${namespace},metadata.name=${name}`); const evtSource = new EventSource( @@ -35,5 +36,5 @@ export const useSSE = (experimentInsId: number, status: ExperimentStatus, name: } } - }, [experimentInsId, status, name, namespace, onMessage]); + }, [experimentInsId, isRunning, name, namespace, onMessage]); }; diff --git a/react-ui/src/hooks/useServerTime.ts b/react-ui/src/hooks/useServerTime.ts index 89b39775..45eeea06 100644 --- a/react-ui/src/hooks/useServerTime.ts +++ b/react-ui/src/hooks/useServerTime.ts @@ -17,7 +17,7 @@ export const globalGetSeverTime = async () => { const requestDuration = (requestEndTime - requestStartTime) / 2; if (res && res.data) { const serverDate = new Date(res.data); - const timeOffset = serverDate.getTime() + requestDuration - requestEndTime ; + const timeOffset = serverDate.getTime() + requestDuration - requestEndTime; globalTimeOffset = timeOffset; return timeOffset } diff --git a/react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.less b/react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.less index 833ced06..94258c7f 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.less +++ b/react-ui/src/pages/AutoML/components/ExperimentInstanceList/index.less @@ -1,3 +1,5 @@ +@cellWidth: calc(100% + 32px + 33px - 48px - 200px - 344px); + .tableExpandBox { display: flex; align-items: center; @@ -11,22 +13,22 @@ } .check { - width: calc((100% + 32px + 33px) / 5 / 2); + width: calc(@cellWidth * 3 / 20); // 15% } .index { - width: calc((100% + 32px + 33px) / 5 / 2); + width: calc(@cellWidth * 3 / 20); // 15% } .description { display: flex; - flex: 1; align-items: center; + width: calc(@cellWidth / 2); // 50% } .startTime { .singleLine(); - width: 200px; + width: calc(@cellWidth / 5); // 20% } .status { diff --git a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx index b71952b2..15846f9c 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx +++ b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx @@ -302,7 +302,7 @@ function ExperimentList({ type }: ExperimentListProps) { title: '类型', dataIndex: 'type', key: 'type', - width: '10%', + width: '15%', render: tableCellRender(false, TableCellValueType.Enum, { options: autoMLTypeOptions, }), @@ -316,7 +316,7 @@ function ExperimentList({ type }: ExperimentListProps) { title: '实验名称', dataIndex: config.nameProperty, key: 'name', - width: '20%', + width: '30%', render: tableCellRender(false, TableCellValueType.Link, { onClick: gotoDetail, }), @@ -326,13 +326,14 @@ function ExperimentList({ type }: ExperimentListProps) { dataIndex: config.descProperty, key: 'description', render: tableCellRender(true), + width: type === ExperimentListType.AutoML ? '35%' : '50%', }, ...diffColumns, { title: '创建时间', dataIndex: 'update_time', key: 'update_time', - width: 200, + width: '20%', render: tableCellRender(false, TableCellValueType.Date), }, { diff --git a/react-ui/src/pages/Dataset/components/ResourceItem/index.less b/react-ui/src/pages/Dataset/components/ResourceItem/index.less index 58b5be62..618423e1 100644 --- a/react-ui/src/pages/Dataset/components/ResourceItem/index.less +++ b/react-ui/src/pages/Dataset/components/ResourceItem/index.less @@ -58,5 +58,6 @@ align-items: center; color: #808080; font-size: 13px; + min-width: 0; } } diff --git a/react-ui/src/pages/Dataset/components/ResourceItem/index.tsx b/react-ui/src/pages/Dataset/components/ResourceItem/index.tsx index a8cabfe9..22078902 100644 --- a/react-ui/src/pages/Dataset/components/ResourceItem/index.tsx +++ b/react-ui/src/pages/Dataset/components/ResourceItem/index.tsx @@ -14,6 +14,10 @@ type ResourceItemProps = { }; function ResourceItem({ item, isPublic, onClick, onRemove }: ResourceItemProps) { + const timeAgo = + '最近更新: ' + + (item.update_time ? formatDate(item.update_time, 'YYYY-MM-DD') : item.time_ago ?? ''); + const create_by = item.create_by ?? ''; return (
onClick(item)}> @@ -37,7 +41,7 @@ function ResourceItem({ item, isPublic, onClick, onRemove }: ResourceItemProps) )}
{item.description}
- +
- {item.create_by ?? ''} + {create_by}
- - {'最近更新: '} - {item.update_time ? formatDate(item.update_time, 'YYYY-MM-DD') : item.time_ago ?? ''} - + {timeAgo}
diff --git a/react-ui/src/pages/ModelDeployment/CreateVersion/index.less b/react-ui/src/pages/ModelDeployment/CreateVersion/index.less index bf7f7f9d..9186a023 100644 --- a/react-ui/src/pages/ModelDeployment/CreateVersion/index.less +++ b/react-ui/src/pages/ModelDeployment/CreateVersion/index.less @@ -36,6 +36,13 @@ .ant-btn-variant-text { color: #565658; } + + .anticon-question-circle { + margin-top: -12px; + margin-left: 1px !important; + color: @text-color-tertiary !important; + font-size: 12px !important; + } } } } diff --git a/react-ui/src/pages/ModelDeployment/CreateVersion/index.tsx b/react-ui/src/pages/ModelDeployment/CreateVersion/index.tsx index 6a6ecc0b..324b77a8 100644 --- a/react-ui/src/pages/ModelDeployment/CreateVersion/index.tsx +++ b/react-ui/src/pages/ModelDeployment/CreateVersion/index.tsx @@ -337,7 +337,11 @@ function CreateServiceVersion() { - + Date: Mon, 12 May 2025 09:45:14 +0800 Subject: [PATCH 08/25] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=B5=81=E6=B0=B4=E7=BA=BF=E5=A4=B1=E8=B4=A5=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/service/impl/ActiveLearnServiceImpl.java | 5 +++++ .../ruoyi/platform/service/impl/ExperimentServiceImpl.java | 4 ++++ .../platform/service/impl/MachineLearnServiceImpl.java | 7 +++++++ .../com/ruoyi/platform/service/impl/RayServiceImpl.java | 6 ++++++ 4 files changed, 22 insertions(+) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java index 1a00356a..044df3b0 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java @@ -157,6 +157,11 @@ public class ActiveLearnServiceImpl implements ActiveLearnService { throw new RuntimeException("转换流水线失败"); } Map converMap = JsonUtils.jsonToMap(convertRes); + String convertResData = (String) converMap.get("data"); + if (StringUtils.isEmpty(convertResData)) { + throw new RuntimeException("转换流水线失败"); + } + // 组装运行接口json Map output = (Map) converMap.get("output"); Map runReqMap = new HashMap<>(); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java index 96193527..01227f7d 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java @@ -237,6 +237,10 @@ public class ExperimentServiceImpl implements ExperimentService { throw new Exception("转换流水线失败"); } Map converMap = JsonUtils.jsonToMap(convertRes); + String convertResData = (String) converMap.get("data"); + if (StringUtils.isEmpty(convertResData)) { + throw new RuntimeException("转换流水线失败"); + } // 判断积分和资源是否足够 Map> resourceInfo = (Map>) converMap.get("resource_info"); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java index dc803c63..55759a9f 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java @@ -165,6 +165,13 @@ public class MachineLearnServiceImpl implements MachineLearnService { if (convertRes == null || StringUtils.isEmpty(convertRes)) { throw new RuntimeException("转换流水线失败"); } + + Map convertResMap = JsonUtils.jsonToMap(convertRes); + String convertResData = (String) convertResMap.get("data"); + if (StringUtils.isEmpty(convertResData)) { + throw new RuntimeException("转换流水线失败"); + } + Map converMap = JsonUtils.jsonToMap(convertRes); // 组装运行接口json Map output = (Map) converMap.get("output"); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java index e40acbe0..cbdb53c7 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java @@ -175,7 +175,13 @@ public class RayServiceImpl implements RayService { if (convertRes == null || StringUtils.isEmpty(convertRes)) { throw new RuntimeException("转换流水线失败"); } + Map converMap = JsonUtils.jsonToMap(convertRes); + String convertResData = (String) converMap.get("data"); + if (StringUtils.isEmpty(convertResData)) { + throw new RuntimeException("转换流水线失败"); + } + // 组装运行接口json Map output = (Map) converMap.get("output"); Map runReqMap = new HashMap<>(); From baaa507de6bc4c9a0a681c7ab78871b5d65fde73 Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Mon, 12 May 2025 14:27:26 +0800 Subject: [PATCH 09/25] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../KnowledgeGraphController.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/knowledgeGraph/KnowledgeGraphController.java diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/knowledgeGraph/KnowledgeGraphController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/knowledgeGraph/KnowledgeGraphController.java new file mode 100644 index 00000000..24f83dfa --- /dev/null +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/knowledgeGraph/KnowledgeGraphController.java @@ -0,0 +1,25 @@ +package com.ruoyi.platform.controller.knowledgeGraph; + +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.core.web.domain.GenericsAjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping("/knowledgeGraph") +@Api("knowledgeGraph service") +public class KnowledgeGraphController extends BaseController { + @Value("${knowledgeGraphUrl}") + private String url; + + @GetMapping(value = "/getURL") + @ApiOperation("得到访问地址") + public GenericsAjaxResult getURL() { + return genericsSuccess(url); + } +} From 6d7a5e0fcf6fe7fc011e5b84101665b5bb504497 Mon Sep 17 00:00:00 2001 From: zhaowei Date: Mon, 12 May 2025 14:44:08 +0800 Subject: [PATCH 10/25] =?UTF-8?q?feat:=20=E6=9C=8D=E5=8A=A1=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=BB=A3=E7=A0=81=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ModelDeployment/CreateVersion/index.tsx | 28 ++++++------------- .../ModelDeployment/ServiceInfo/index.tsx | 16 +++++------ .../components/VersionBasicInfo/index.tsx | 12 ++++---- react-ui/src/utils/date.ts | 3 +- 4 files changed, 24 insertions(+), 35 deletions(-) diff --git a/react-ui/src/pages/ModelDeployment/CreateVersion/index.tsx b/react-ui/src/pages/ModelDeployment/CreateVersion/index.tsx index 324b77a8..46d50b21 100644 --- a/react-ui/src/pages/ModelDeployment/CreateVersion/index.tsx +++ b/react-ui/src/pages/ModelDeployment/CreateVersion/index.tsx @@ -3,7 +3,6 @@ * @Date: 2024-04-16 13:58:08 * @Description: 创建服务版本 */ -import CodeSelect from '@/components/CodeSelect'; import PageTitle from '@/components/PageTitle'; import ParameterSelect from '@/components/ParameterSelect'; import ResourceSelect, { @@ -36,7 +35,7 @@ export type FormData = { description: string; // 描述 model: ParameterInputObject; // 模型 image: ParameterInputObject; // 镜像 - code_config: ParameterInputObject; // 代码 + // code_config: ParameterInputObject; // 代码 resource: string; // 资源规格 replicas: string; // 副本数量 mount_path: string; // 模型路径 @@ -75,28 +74,23 @@ function CreateServiceVersion() { setOperationType(res.operationType); setLastPage(res.lastPage); setVersionInfo(res); - let model, codeConfig, envVariables; + let model, envVariables; + // 模型 if (res.model && typeof res.model === 'object') { model = changePropertyName(res.model, { show_value: 'showValue' }); // 接口返回是数据没有 value 值,但是 form 需要 value model.value = model.showValue; } - if (res.code_config && typeof res.code_config === 'object') { - codeConfig = changePropertyName(res.code_config, { show_value: 'showValue' }); - // 接口返回是数据没有 value 值,但是 form 需要 value - codeConfig.value = codeConfig.showValue; - } + // 环境变量 if (res.env_variables && typeof res.env_variables === 'object') { envVariables = Object.entries(res.env_variables).map(([key, value]) => ({ key, value, })); } - const formData = { - ...omit(res, 'model', 'code_config', 'env_variables'), + ...omit(res, 'model', 'env_variables'), model: model, - code_config: codeConfig, env_variables: envVariables, }; form.setFieldsValue(formData); @@ -124,7 +118,6 @@ function CreateServiceVersion() { const createServiceVersion = async (formData: FormData) => { const envList = formData['env_variables']; const model = formData['model']; - const codeConfig = formData['code_config']; const envVariables = envList?.reduce((acc, cur) => { acc[cur.key] = cur.value; return acc; @@ -132,18 +125,13 @@ function CreateServiceVersion() { // 根据后台要求,修改表单数据 const object = { - ...omit(formData, ['replicas', 'env_variables', 'model', 'code_config']), + ...omit(formData, ['replicas', 'env_variables', 'model']), replicas: Number(formData.replicas), env_variables: envVariables, model: changePropertyName( pick(model, ['id', 'name', 'version', 'path', 'identifier', 'owner', 'showValue']), { showValue: 'show_value' }, ), - code_config: codeConfig - ? changePropertyName(pick(codeConfig, ['code_path', 'branch', 'showValue']), { - showValue: 'show_value', - }) - : undefined, service_id: serviceId, }; @@ -335,7 +323,7 @@ function CreateServiceVersion() { - + {/* - + */} Date: Mon, 12 May 2025 15:08:22 +0800 Subject: [PATCH 11/25] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=B5=81=E6=B0=B4=E7=BA=BF=E5=A4=B1=E8=B4=A5=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/platform/service/impl/ActiveLearnServiceImpl.java | 3 +-- .../com/ruoyi/platform/service/impl/ExperimentServiceImpl.java | 3 +-- .../ruoyi/platform/service/impl/MachineLearnServiceImpl.java | 3 +-- .../java/com/ruoyi/platform/service/impl/RayServiceImpl.java | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java index 044df3b0..da00f095 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ActiveLearnServiceImpl.java @@ -157,8 +157,7 @@ public class ActiveLearnServiceImpl implements ActiveLearnService { throw new RuntimeException("转换流水线失败"); } Map converMap = JsonUtils.jsonToMap(convertRes); - String convertResData = (String) converMap.get("data"); - if (StringUtils.isEmpty(convertResData)) { + if (converMap.get("data") == null) { throw new RuntimeException("转换流水线失败"); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java index 01227f7d..bd2d8cad 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java @@ -237,8 +237,7 @@ public class ExperimentServiceImpl implements ExperimentService { throw new Exception("转换流水线失败"); } Map converMap = JsonUtils.jsonToMap(convertRes); - String convertResData = (String) converMap.get("data"); - if (StringUtils.isEmpty(convertResData)) { + if (converMap.get("data") == null) { throw new RuntimeException("转换流水线失败"); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java index 55759a9f..a9961456 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MachineLearnServiceImpl.java @@ -167,8 +167,7 @@ public class MachineLearnServiceImpl implements MachineLearnService { } Map convertResMap = JsonUtils.jsonToMap(convertRes); - String convertResData = (String) convertResMap.get("data"); - if (StringUtils.isEmpty(convertResData)) { + if (convertResMap.get("data")== null) { throw new RuntimeException("转换流水线失败"); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java index cbdb53c7..efdebc1b 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/RayServiceImpl.java @@ -177,8 +177,7 @@ public class RayServiceImpl implements RayService { } Map converMap = JsonUtils.jsonToMap(convertRes); - String convertResData = (String) converMap.get("data"); - if (StringUtils.isEmpty(convertResData)) { + if (converMap.get("data") == null) { throw new RuntimeException("转换流水线失败"); } From 9630e2c60cdb911aa8b66274f456d9e89a81ce2c Mon Sep 17 00:00:00 2001 From: zhaowei Date: Mon, 12 May 2025 15:59:02 +0800 Subject: [PATCH 12/25] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E5=9B=BE=E8=B0=B1=E7=9A=84=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/src/iconfont/iconfont-menu.js | 2 +- react-ui/src/iconfont/iconfont-menu.json | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/react-ui/src/iconfont/iconfont-menu.js b/react-ui/src/iconfont/iconfont-menu.js index 2b0bcaa9..f527568a 100644 --- a/react-ui/src/iconfont/iconfont-menu.js +++ b/react-ui/src/iconfont/iconfont-menu.js @@ -1 +1 @@ -window._iconfont_svg_string_4511326='',(t=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var i,h,o,c,e,m=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}i=function(){var a,l=document.createElement("div");l.innerHTML=t._iconfont_svg_string_4511326,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?m(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(i,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),i()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(o=i,c=t.document,e=!1,n(),c.onreadystatechange=function(){"complete"==c.readyState&&(c.onreadystatechange=null,p())})}function p(){e||(e=!0,o())}function n(){try{c.documentElement.doScroll("left")}catch(a){return void setTimeout(n,50)}p()}})(window); \ No newline at end of file +window._iconfont_svg_string_4511326='',(t=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var i,h,o,c,e,m=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}i=function(){var a,l=document.createElement("div");l.innerHTML=t._iconfont_svg_string_4511326,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?m(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(i,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),i()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(o=i,c=t.document,e=!1,n(),c.onreadystatechange=function(){"complete"==c.readyState&&(c.onreadystatechange=null,p())})}function p(){e||(e=!0,o())}function n(){try{c.documentElement.doScroll("left")}catch(a){return void setTimeout(n,50)}p()}})(window); \ No newline at end of file diff --git a/react-ui/src/iconfont/iconfont-menu.json b/react-ui/src/iconfont/iconfont-menu.json index 15215226..cb25a583 100644 --- a/react-ui/src/iconfont/iconfont-menu.json +++ b/react-ui/src/iconfont/iconfont-menu.json @@ -1,10 +1,24 @@ { "id": "4511326", - "name": "智能材料科研平台-导航", + "name": "复杂智能软件-导航", "font_family": "iconfont", "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "42495274", + "name": "知识图谱-active", + "font_class": "zhishitupu-icon-active", + "unicode": "e63e", + "unicode_decimal": 58942 + }, + { + "icon_id": "42495275", + "name": "知识图谱", + "font_class": "zhishitupu-icon", + "unicode": "e63f", + "unicode_decimal": 58943 + }, { "icon_id": "41643218", "name": "模型开发", From 8050fbe811a2cf9822a0d27ee6ed57712d43144e Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Tue, 13 May 2025 09:14:07 +0800 Subject: [PATCH 13/25] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/ComponentController.java | 2 +- .../dataset/DatasetVersionController.java | 4 +- .../controller/icon/AssetIconController.java | 2 +- .../model/ModelDependencyController.java | 2 +- .../model/ModelsVersionController.java | 2 +- .../ComputingResourceController.java | 2 +- .../workflow/WorkflowParamController.java | 2 +- .../platform/service/AssetIconService.java | 2 +- .../platform/service/ComponentService.java | 2 +- .../service/ComputingResourceService.java | 2 +- .../service/DatasetVersionService.java | 4 +- .../service/ModelDependencyService.java | 2 +- .../service/ModelsVersionService.java | 2 +- .../service/WorkflowParamService.java | 2 +- .../service/impl/AssetIconServiceImpl.java | 6 +-- .../service/impl/CodeConfigServiceImpl.java | 2 +- .../service/impl/ComponentServiceImpl.java | 38 +++++++++---------- .../impl/ComputingResourceServiceImpl.java | 6 +-- .../impl/DatasetVersionServiceImpl.java | 8 ++-- .../impl/DevEnvironmentServiceImpl.java | 4 +- .../impl/ExperimentInsServiceImpl.java | 8 ++-- .../impl/ModelDependencyServiceImpl.java | 4 +- .../impl/ModelsVersionServiceImpl.java | 2 +- .../impl/WorkflowParamServiceImpl.java | 6 +-- 24 files changed, 58 insertions(+), 58 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/component/ComponentController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/component/ComponentController.java index a7fb7ec9..937bd7c9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/component/ComponentController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/component/ComponentController.java @@ -100,7 +100,7 @@ public class ComponentController { */ @DeleteMapping("{id}") @ApiOperation("根据id删除组件") - public AjaxResult deleteById(@PathVariable("id") Integer id) { + public AjaxResult deleteById(@PathVariable("id") Integer id) throws Exception { return AjaxResult.success(this.componentService.removeById(id)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetVersionController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetVersionController.java index f6e7c6e5..beda603a 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetVersionController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetVersionController.java @@ -118,7 +118,7 @@ public class DatasetVersionController extends BaseController { */ @DeleteMapping({"{id}"}) @ApiOperation("删除数据集版本") - public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) { + public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) throws Exception { return genericsSuccess(this.datasetVersionService.removeById(id)); } @@ -132,7 +132,7 @@ public class DatasetVersionController extends BaseController { @DeleteMapping("/deleteVersion") @ApiOperation(value = "逻辑删除模型版本", notes = "根据数据集ID和版本逻辑删除模型版本记录。") public GenericsAjaxResult> deleteDatasetVersion(@RequestParam("dataset_id") Integer datasetId, - @RequestParam("version") String version) { + @RequestParam("version") String version) throws Exception { return genericsSuccess(this.datasetVersionService.deleteDatasetVersion(datasetId, version)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/icon/AssetIconController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/icon/AssetIconController.java index 0351dafc..c5b449a4 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/icon/AssetIconController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/icon/AssetIconController.java @@ -114,7 +114,7 @@ public class AssetIconController extends BaseController { */ @DeleteMapping("{id}") @ApiOperation("删除图标") - public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) { + public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) throws Exception { return genericsSuccess(this.assetIconService.removeById(id)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelDependencyController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelDependencyController.java index a62e8c61..f49e7df7 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelDependencyController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelDependencyController.java @@ -101,7 +101,7 @@ public class ModelDependencyController extends BaseController { */ @DeleteMapping("{id}") @ApiOperation("删除模型依赖") - public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) { + public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) throws Exception { return genericsSuccess(this.modelDependencyService.removeById(id)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsVersionController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsVersionController.java index 74a4ebf0..21104f05 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsVersionController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsVersionController.java @@ -130,7 +130,7 @@ public class ModelsVersionController extends BaseController { @DeleteMapping("/deleteVersion") @ApiOperation(value = "逻辑删除模型版本", notes = "根据模型ID和版本逻辑删除模型版本记录。") public GenericsAjaxResult> deleteModelsVersion(@RequestParam("models_id") Integer modelsId, - @RequestParam("version") String version) throws IOException { + @RequestParam("version") String version) throws Exception { return genericsSuccess(this.modelsVersionService.deleteModelsVersion(modelsId, version)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/resources/ComputingResourceController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/resources/ComputingResourceController.java index d7fd42ca..7753924e 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/resources/ComputingResourceController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/resources/ComputingResourceController.java @@ -94,7 +94,7 @@ public class ComputingResourceController extends BaseController { */ @DeleteMapping("{id}") @ApiOperation("删除计算资源") - public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) { + public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) throws Exception { return genericsSuccess(this.computingResourceService.removeById(id)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/workflow/WorkflowParamController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/workflow/WorkflowParamController.java index 8725334c..5c7c3831 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/workflow/WorkflowParamController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/workflow/WorkflowParamController.java @@ -84,7 +84,7 @@ public class WorkflowParamController extends BaseController { */ @DeleteMapping @ApiOperation("删除流水线参数") - public GenericsAjaxResult deleteById(Integer id) { + public GenericsAjaxResult deleteById(Integer id) throws Exception { return genericsSuccess(this.workflowParamService.removeById(id)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AssetIconService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AssetIconService.java index 7aa8a4ac..4fc1dbec 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AssetIconService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AssetIconService.java @@ -64,7 +64,7 @@ public interface AssetIconService { */ boolean deleteById(Integer id); - String removeById(Integer id); + String removeById(Integer id) throws Exception; List queryByName(String name); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ComponentService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ComponentService.java index 1f29c543..255c3475 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ComponentService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ComponentService.java @@ -57,7 +57,7 @@ public interface ComponentService { */ boolean deleteById(Integer id); - String removeById(Integer id); + String removeById(Integer id) throws Exception; List queryAllGroupedByCategory() throws Exception; diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ComputingResourceService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ComputingResourceService.java index 781b304f..51f3bb0c 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ComputingResourceService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ComputingResourceService.java @@ -54,6 +54,6 @@ public interface ComputingResourceService { */ boolean deleteById(Integer id); - String removeById(Integer id); + String removeById(Integer id) throws Exception; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetVersionService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetVersionService.java index 31ec8ba2..a3db0779 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetVersionService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetVersionService.java @@ -58,7 +58,7 @@ public interface DatasetVersionService { */ boolean deleteById(Integer id); - String removeById(Integer id); + String removeById(Integer id) throws Exception; List queryByDatasetId(Integer datasetId); @@ -66,7 +66,7 @@ public interface DatasetVersionService { Map queryByDatasetIdAndVersion(Integer datasetId, String version); - Map deleteDatasetVersion(Integer datasetId, String version); + Map deleteDatasetVersion(Integer datasetId, String version) throws Exception; void checkDeclaredVersion(DatasetVersion insert) throws Exception; diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelDependencyService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelDependencyService.java index 049d87d1..c90bae79 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelDependencyService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelDependencyService.java @@ -57,7 +57,7 @@ public interface ModelDependencyService { */ boolean deleteById(Integer id); - String removeById(Integer id); + String removeById(Integer id) throws Exception; List queryByModelDependency(ModelDependency modelDependency) throws IOException; diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsVersionService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsVersionService.java index 723bc745..f3626349 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsVersionService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsVersionService.java @@ -69,7 +69,7 @@ public interface ModelsVersionService { Map queryByModelsIdAndVersion(Integer modelsId, String version); - Map deleteModelsVersion(Integer modelsId, String version) throws IOException; + Map deleteModelsVersion(Integer modelsId, String version) throws Exception; String addModelVersions(List modelsVersions) throws Exception; diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowParamService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowParamService.java index e20a7411..cf28c997 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowParamService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowParamService.java @@ -45,7 +45,7 @@ public interface WorkflowParamService { */ WorkflowParam update(WorkflowParam workflowParam); - String removeById(Integer id); + String removeById(Integer id) throws Exception; /** * 通过主键删除数据 diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AssetIconServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AssetIconServiceImpl.java index 09610ce8..ed4be518 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AssetIconServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AssetIconServiceImpl.java @@ -101,10 +101,10 @@ public class AssetIconServiceImpl implements AssetIconService { } @Override - public String removeById(Integer id) { + public String removeById(Integer id) throws Exception { AssetIcon assetIcon = this.assetIconDao.queryById(id); if (assetIcon == null){ - return "图标不存在"; + throw new Exception("图标不存在"); } //判断权限,只有admin和创建者本身可以删除 @@ -114,7 +114,7 @@ public class AssetIconServiceImpl implements AssetIconService { String createdBy = assetIcon.getCreateBy(); if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ - return "无权限删除该图标"; + throw new Exception("无权限删除该图标"); } assetIcon.setState(0); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/CodeConfigServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/CodeConfigServiceImpl.java index 872b34b9..63cda212 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/CodeConfigServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/CodeConfigServiceImpl.java @@ -121,7 +121,7 @@ public class CodeConfigServiceImpl implements CodeConfigService { String username = loginUser.getUsername(); String createBy = codeConfig.getCreateBy(); if (!(StringUtils.equals(username, "admin") || StringUtils.equals(username, createBy))) { - return "无权限删除该代码配置"; + throw new Exception("无权限删除该代码配置"); } codeConfig.setState(Constant.State_invalid); return this.codeConfigDao.update(codeConfig) > 0 ? "删除成功" : "删除失败"; diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ComponentServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ComponentServiceImpl.java index a93628e3..d58694eb 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ComponentServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ComponentServiceImpl.java @@ -47,7 +47,7 @@ public class ComponentServiceImpl implements ComponentService { @Override public Component queryById(Integer id) { Component component = this.componentDao.queryById(id); - if (component == null){ + if (component == null) { throw new RuntimeException("组件不存在"); } @@ -58,14 +58,14 @@ public class ComponentServiceImpl implements ComponentService { public List queryAllGroupedByCategory() throws Exception { List componentList = this.componentDao.queryAll(); List result = new ArrayList<>(); - if (componentList.isEmpty()){ + if (componentList.isEmpty()) { return result; } List categoryTypeList = DictUtils.getDictCache("category_type"); - Map> groupedComponent = componentList.stream().collect(Collectors.groupingBy(Component::getCategoryId)); - for (Map.Entry > entry : groupedComponent.entrySet()) { + Map> groupedComponent = componentList.stream().collect(Collectors.groupingBy(Component::getCategoryId)); + for (Map.Entry> entry : groupedComponent.entrySet()) { List categorys = categoryTypeList.stream().filter(sysDictData -> StringUtils.equals(sysDictData.getDictValue(), String.valueOf(entry.getKey()))).collect(Collectors.toList()); - if (categorys.size() ==0){ + if (categorys.size() == 0) { throw new Exception("组件类型不存在"); } Map map = new HashMap(); @@ -80,8 +80,8 @@ public class ComponentServiceImpl implements ComponentService { /** * 分页查询 * - * @param component 筛选条件 - * @param pageRequest 分页对象 + * @param component 筛选条件 + * @param pageRequest 分页对象 * @return 查询结果 */ @Override @@ -104,7 +104,7 @@ public class ComponentServiceImpl implements ComponentService { component.setControlStrategy(controlStrategy); //json转换,存数据库 - String inParameters= gson.toJson(componentVo.getInParameters(), LinkedHashMap.class); + String inParameters = gson.toJson(componentVo.getInParameters(), LinkedHashMap.class); String outParameters = gson.toJson(componentVo.getOutParameters(), LinkedHashMap.class); String envVariable = gson.toJson(componentVo.getEnvVirables(), LinkedHashMap.class); component.setEnvVirables(envVariable); @@ -118,9 +118,9 @@ public class ComponentServiceImpl implements ComponentService { component.setState(1); // 检查相同category_id下的component_name是否已存在 - Integer existingCount = this.componentDao.countByNameAndCategoryId(component.getComponentName(),component.getCategoryId()); + Integer existingCount = this.componentDao.countByNameAndCategoryId(component.getComponentName(), component.getCategoryId()); - if(existingCount != null && existingCount > 0) { + if (existingCount != null && existingCount > 0) { throw new RuntimeException("该类别下已有同名组件"); } @@ -139,15 +139,15 @@ public class ComponentServiceImpl implements ComponentService { Component component = this.queryById(componentVo.getId()); //只能更新当前存在的组件 - if (component == null){ + if (component == null) { throw new RuntimeException("组件不存在,无法更新"); } //将object转成string类型 - component = ConvertUtil.entityToVo(componentVo,Component.class); + component = ConvertUtil.entityToVo(componentVo, Component.class); Gson gson = new Gson(); - String inParameters= gson.toJson(componentVo.getInParameters(), LinkedHashMap.class); + String inParameters = gson.toJson(componentVo.getInParameters(), LinkedHashMap.class); String outParameters = gson.toJson(componentVo.getOutParameters(), LinkedHashMap.class); String envVariable = gson.toJson(componentVo.getEnvVirables(), LinkedHashMap.class); @@ -174,24 +174,24 @@ public class ComponentServiceImpl implements ComponentService { } @Override - public String removeById(Integer id) { + public String removeById(Integer id) throws Exception { Component component = this.componentDao.queryById(id); //先进行判断 组件是否存在 - if (component == null ){ - return "组件不存在"; + if (component == null) { + throw new Exception("组件不存在"); } //判断权限,只有admin和创建者本身可以删除该组件 LoginUser loginUser = SecurityUtils.getLoginUser(); String username = loginUser.getUsername(); String createdBy = component.getCreateBy(); - if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ - return "无权限删除该组件"; + if (!(StringUtils.equals(username, "admin") || StringUtils.equals(username, createdBy))) { + throw new Exception("无权限删除该组件"); } component.setState(0); - return this.componentDao.update(component)>0?"删除成功":"删除失败"; + return this.componentDao.update(component) > 0 ? "删除成功" : "删除失败"; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ComputingResourceServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ComputingResourceServiceImpl.java index bf96b842..995460b9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ComputingResourceServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ComputingResourceServiceImpl.java @@ -92,10 +92,10 @@ public class ComputingResourceServiceImpl implements ComputingResourceService { } @Override - public String removeById(Integer id) { + public String removeById(Integer id) throws Exception { ComputingResource computingResource = this.computingResourceDao.queryById(id); if (computingResource == null){ - return "计算资源不存在"; + throw new Exception("计算资源不存在"); } //判断权限,只有admin和创建者本身可以删除该数据集 @@ -103,7 +103,7 @@ public class ComputingResourceServiceImpl implements ComputingResourceService { String username = loginUser.getUsername(); String createdBy = computingResource.getCreateBy(); if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ - return "无权限删除该计算资源"; + throw new Exception("无权限删除该计算资源"); } computingResource.setState(0); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetVersionServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetVersionServiceImpl.java index d4e99abc..d0a4a01a 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetVersionServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetVersionServiceImpl.java @@ -128,17 +128,17 @@ public class DatasetVersionServiceImpl implements DatasetVersionService { @Override - public String removeById(Integer id) { + public String removeById(Integer id) throws Exception { DatasetVersion datasetVersion = this.datasetVersionDao.queryById(id); if (datasetVersion == null){ - return "数据集版本信息不存在"; + throw new Exception("数据集版本信息不存在"); } //判断权限,只有admin和创建者本身可以删除该数据集版本信息 LoginUser loginUser = SecurityUtils.getLoginUser(); String username = loginUser.getUsername(); String createdBy = datasetVersion.getCreateBy(); if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ - return "无权限删除该数据集版本"; + throw new Exception("无权限删除该数据集版本"); } datasetVersion.setState(0); @@ -175,7 +175,7 @@ public class DatasetVersionServiceImpl implements DatasetVersionService { } @Override - public Map deleteDatasetVersion(Integer datasetId, String version) { + public Map deleteDatasetVersion(Integer datasetId, String version) throws Exception { Map results = new HashMap(); // 根据模型ID和版本查询所有模型版本 List versions = this.datasetVersionDao.queryAllByDatasetVersion(datasetId, version); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java index 82825cbe..f1cf1751 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java @@ -154,7 +154,7 @@ public class DevEnvironmentServiceImpl implements DevEnvironmentService { public String removeById(Integer id) throws Exception { DevEnvironment devEnvironment = this.devEnvironmentDao.queryById(id); if (devEnvironment == null) { - return "开发环境信息不存在"; + throw new RuntimeException("开发环境信息不存在"); } //判断权限,只有admin和创建者本身可以删除该数据集 @@ -162,7 +162,7 @@ public class DevEnvironmentServiceImpl implements DevEnvironmentService { String username = loginUser.getUsername(); String createdBy = devEnvironment.getCreateBy(); if (!(StringUtils.equals(username, "admin") || StringUtils.equals(username, createdBy))) { - return "无权限删除该开发环境"; + throw new RuntimeException("无权限删除该开发环境"); } jupyterService.stopJupyterService(id); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java index 9a6ab793..f77dc0b6 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java @@ -213,7 +213,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { public String removeById(Integer id) { ExperimentIns experimentIns = experimentInsDao.queryById(id); if (experimentIns == null) { - return "实验实例不存在"; + throw new RuntimeException("实验实例不存在"); } //判断权限,只有admin和创建者本身可以删除该实验实例 @@ -221,14 +221,14 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { String username = loginUser.getUsername(); String createdBy = experimentIns.getCreateBy(); if (!(StringUtils.equals(username, "admin") || StringUtils.equals(username, createdBy))) { - return "无权限删除该流水线"; + throw new RuntimeException("无权限删除该流水线"); } if (StringUtils.isEmpty(experimentIns.getStatus())) { experimentIns = queryStatusFromArgo(experimentIns); } - if (StringUtils.equals(experimentIns.getStatus(), "Running")) { - return "实验实例正在运行,不可删除"; + if (StringUtils.equals(experimentIns.getStatus(), Constant.Running)) { + throw new RuntimeException("实验实例正在运行,不可删除"); } experimentIns.setState(0); int update = this.experimentInsDao.update(experimentIns); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelDependencyServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelDependencyServiceImpl.java index 572a66a5..56e97245 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelDependencyServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelDependencyServiceImpl.java @@ -245,7 +245,7 @@ public class ModelDependencyServiceImpl implements ModelDependencyService { } @Override - public String removeById(Integer id) { + public String removeById(Integer id) throws Exception { ModelDependency modelDependency = this.modelDependencyDao.queryById(id); if (modelDependency == null){ return "模型依赖信息不存在"; @@ -256,7 +256,7 @@ public class ModelDependencyServiceImpl implements ModelDependencyService { String username = loginUser.getUsername(); String createdBy = modelDependency.getCreateBy(); if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ - return "无权限删除"; + throw new Exception("无权限删除"); } modelDependency.setState(0); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java index 24a6b636..ad81f1f5 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java @@ -194,7 +194,7 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { } @Override - public Map deleteModelsVersion(Integer modelsId, String version) throws IOException { + public Map deleteModelsVersion(Integer modelsId, String version) throws Exception { Map results = new HashMap(); // 根据模型ID和版本查询所有模型版本 List versions = this.modelsVersionDao.queryAllByModelsVersion(modelsId, version); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowParamServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowParamServiceImpl.java index 69043477..21a178a9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowParamServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowParamServiceImpl.java @@ -80,10 +80,10 @@ public class WorkflowParamServiceImpl implements WorkflowParamService { } @Override - public String removeById(Integer id) { + public String removeById(Integer id) throws Exception { WorkflowParam workflowParam = this.workflowParamDao.queryById(id); if (workflowParam == null){ - return "流水线参数不存在"; + throw new Exception("流水线参数不存在"); } //判断权限,只有admin和创建者本身可以删除 @@ -93,7 +93,7 @@ public class WorkflowParamServiceImpl implements WorkflowParamService { String createdBy = workflowParam.getCreateBy(); if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ - return "无权限删除该流水线参数"; + throw new Exception("无权限删除该流水线参数"); } workflowParam.setState(0); From 39c6de32909db5a7c7f198c8fcdeb896e87aaafb Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Tue, 13 May 2025 09:29:11 +0800 Subject: [PATCH 14/25] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/service/impl/DevEnvironmentServiceImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java index f1cf1751..4ecef87b 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java @@ -109,8 +109,12 @@ public class DevEnvironmentServiceImpl implements DevEnvironmentService { devEnvironment.setStandard(devEnvironmentVo.getStandard()); devEnvironment.setEnvVariable(devEnvironmentVo.getEnvVariable()); devEnvironment.setImage(JacksonUtil.toJSONString(devEnvironmentVo.getImage())); - devEnvironment.setDataset(JacksonUtil.toJSONString(devEnvironmentVo.getDataset())); - devEnvironment.setModel(JacksonUtil.toJSONString(devEnvironmentVo.getModel())); + if (devEnvironmentVo.getDataset() != null) { + devEnvironment.setDataset(JacksonUtil.toJSONString(devEnvironmentVo.getDataset())); + } + if (devEnvironmentVo.getModel() != null) { + devEnvironment.setModel(JacksonUtil.toJSONString(devEnvironmentVo.getModel())); + } devEnvironment.setCreateBy(loginUser.getUsername()); devEnvironment.setUpdateBy(loginUser.getUsername()); devEnvironment.setUpdateTime(new Date()); From ec65a70e6eeb8e934c4d022b1e1707844af45f6a Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Tue, 13 May 2025 10:53:23 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/platform/domain/CodeConfig.java | 3 +++ .../mapper/managementPlatform/CodeConfigDaoMapper.xml | 11 ++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java index e5a0c680..b61835ef 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java @@ -21,6 +21,9 @@ public class CodeConfig implements Serializable { @ApiModelProperty(name = "code_repo_vis", value = "代码仓库可见性(1-公开,0-私有)") private Integer codeRepoVis; + @ApiModelProperty(name = "is_public", value = "1-公开,0-私有)") + private Integer isPublic; + @ApiModelProperty(name = "git_url", value = "Git地址") private String gitUrl; diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml index 9ae12b5b..90a1b993 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml @@ -3,9 +3,9 @@ - insert into code_config(code_repo_name, code_repo_vis, git_url, git_branch, verify_mode, git_user_name, + insert into code_config(code_repo_name, is_public, git_url, git_branch, verify_mode, git_user_name, git_password, ssh_key, create_by, create_time, update_by, update_time) - values (#{codeConfig.codeRepoName}, #{codeConfig.codeRepoVis}, #{codeConfig.gitUrl}, #{codeConfig.gitBranch}, + values (#{codeConfig.codeRepoName}, #{codeConfig.isPublic}, #{codeConfig.gitUrl}, #{codeConfig.gitBranch}, #{codeConfig.verifyMode}, #{codeConfig.gitUserName}, #{codeConfig.gitPassword}, #{codeConfig.sshKey}, #{codeConfig.createBy}, #{codeConfig.createTime}, #{codeConfig.updateBy}, #{codeConfig.updateTime}) @@ -17,8 +17,8 @@ code_repo_name = #{codeConfig.codeRepoName}, - - code_repo_vis = #{codeConfig.codeRepoVis}, + + is_public = #{codeConfig.isPublic}, git_url = #{codeConfig.gitUrl}, @@ -78,6 +78,7 @@ state = 1 + and code_repo_vis = 1 and id = #{codeConfig.id} @@ -85,7 +86,7 @@ and code_repo_name LIKE CONCAT('%', #{codeConfig.codeRepoName}, '%') - and code_repo_vis = #{codeConfig.codeRepoVis} + and is_public = #{codeConfig.isPublic} and git_url = #{codeConfig.gitUrl} From 7998332b6c58f29c5071990042991e2ca97dbb1a Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Tue, 13 May 2025 11:00:42 +0800 Subject: [PATCH 16/25] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=B6=E4=BD=9C?= =?UTF-8?q?=E9=95=9C=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/platform/service/impl/ImageServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ImageServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ImageServiceImpl.java index 0c52a9bb..30944e04 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ImageServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ImageServiceImpl.java @@ -466,7 +466,7 @@ public class ImageServiceImpl implements ImageService { imageVo.setValue(resultMap.get("imageName")); imageVo.setVersion(String.valueOf(imageVersion.getId())); - resultMap.put("id", String.valueOf(oldImage.getId())); + resultMap.put("id", String.valueOf(image.getId())); resultMap.put("version", String.valueOf(imageVersion.getId())); resultMap.put("value",resultMap.get("imageName")); From abe852bee8022fe83b08f7d0adbe484c0b669461 Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Tue, 13 May 2025 11:28:50 +0800 Subject: [PATCH 17/25] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/system/api/constant/Constant.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/Constant.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/Constant.java index 0c6be51e..8af1124b 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/Constant.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/Constant.java @@ -30,7 +30,7 @@ public class Constant { public final static String Source_Hand_Export = "hand_export"; public final static String Source_Add = "add"; - public final static String Building = "building"; + public final static String Building = "Building"; public final static String Running = "Running"; public final static String Failed = "Failed"; @@ -42,7 +42,7 @@ public class Constant { public final static String Error = "Error"; public final static String Unknown = "Unknown"; - public final static String Available = "available"; + public final static String Available = "Available"; public final static String Type_Train = "train"; public final static String Type_Evaluate = "evaluate"; @@ -62,7 +62,6 @@ public class Constant { public final static String TaskType_ActiveLearn = "active_learn"; public final static String TaskType_Service = "service"; public final static String TaskType_ML = "machine_learn"; - public final static String TaskType_TextClassification = "text_classification"; public final static String ML_CSV = "auto_ml"; public final static String ML_TextClassification = "text_classification"; From 2884bf102f2159f9b011f0eca9c1917c6d41200f Mon Sep 17 00:00:00 2001 From: zhaowei Date: Tue, 13 May 2025 14:22:15 +0800 Subject: [PATCH 18/25] =?UTF-8?q?feat:=20=E7=82=B9=E8=B5=9E=E5=88=9D?= =?UTF-8?q?=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dataset/components/ResourceInfo/index.tsx | 18 ++++++++++++++++++ .../Dataset/components/ResourceItem/index.tsx | 1 + react-ui/src/pages/Dataset/config.tsx | 2 ++ react-ui/src/services/dataset/index.js | 15 +++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/react-ui/src/pages/Dataset/components/ResourceInfo/index.tsx b/react-ui/src/pages/Dataset/components/ResourceInfo/index.tsx index 2eeb09b8..8566bcf2 100644 --- a/react-ui/src/pages/Dataset/components/ResourceInfo/index.tsx +++ b/react-ui/src/pages/Dataset/components/ResourceInfo/index.tsx @@ -13,6 +13,7 @@ import { } from '@/pages/Dataset/config'; import GraphLegend from '@/pages/Model/components/GraphLegend'; import ModelEvolution from '@/pages/Model/components/ModelEvolution'; +import { praiseResourceReq, unpraiseResourceReq } from '@/services/dataset'; import { VersionChangedMessage } from '@/utils/constant'; import { openAntdModal } from '@/utils/modal'; import { to } from '@/utils/promise'; @@ -189,6 +190,20 @@ const ResourceInfo = ({ resourceType }: ResourceInfoProps) => { }); }; + // 处理点赞 + const handlePraise = async () => { + const request = info.praised === true ? unpraiseResourceReq : praiseResourceReq; + const [res] = await to(request(info.id)); + if (res) { + message.success('操作成功'); + setInfo({ + ...info, + praised: !info.praised, + praises_count: info.praised ? info.praises_count - 1 : info.praises_count + 1, + }); + } + }; + const items = [ { key: ResourceInfoTabKeys.Introduction, @@ -248,6 +263,9 @@ const ResourceInfo = ({ resourceType }: ResourceInfoProps) => { {(info[tagPropertyName] as string) || '--'}
)} + 版本号: diff --git a/react-ui/src/pages/Dataset/components/ResourceItem/index.tsx b/react-ui/src/pages/Dataset/components/ResourceItem/index.tsx index 22078902..b23a9166 100644 --- a/react-ui/src/pages/Dataset/components/ResourceItem/index.tsx +++ b/react-ui/src/pages/Dataset/components/ResourceItem/index.tsx @@ -41,6 +41,7 @@ function ResourceItem({ item, isPublic, onClick, onRemove }: ResourceItemProps) )}
{item.description}
+
点赞数量:{item.praises_count}
Date: Tue, 13 May 2025 15:53:10 +0800 Subject: [PATCH 19/25] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E7=82=B9=E8=B5=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/src/iconfont/iconfont.js | 2 +- .../components/ResourceInfo/index.less | 22 +++++++++++++++- .../Dataset/components/ResourceInfo/index.tsx | 26 +++++++++++++++---- .../components/ResourceItem/index.less | 23 +++++++++++++--- .../Dataset/components/ResourceItem/index.tsx | 10 ++++--- 5 files changed, 69 insertions(+), 14 deletions(-) diff --git a/react-ui/src/iconfont/iconfont.js b/react-ui/src/iconfont/iconfont.js index 75c1b755..38c8ec18 100644 --- a/react-ui/src/iconfont/iconfont.js +++ b/react-ui/src/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4511447='',(t=>{var a=(h=(h=document.getElementsByTagName("script"))[h.length-1]).getAttribute("data-injectcss"),h=h.getAttribute("data-disable-injectsvg");if(!h){var l,z,v,i,o,m=function(a,h){h.parentNode.insertBefore(a,h)};if(a&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}l=function(){var a,h=document.createElement("div");h.innerHTML=t._iconfont_svg_string_4511447,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(a=document.body).firstChild?m(h,a.firstChild):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(z=function(){document.removeEventListener("DOMContentLoaded",z,!1),l()},document.addEventListener("DOMContentLoaded",z,!1)):document.attachEvent&&(v=l,i=t.document,o=!1,d(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,p())})}function p(){o||(o=!0,v())}function d(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(d,50)}p()}})(window); \ No newline at end of file +window._iconfont_svg_string_4511447='',(t=>{var a=(h=(h=document.getElementsByTagName("script"))[h.length-1]).getAttribute("data-injectcss"),h=h.getAttribute("data-disable-injectsvg");if(!h){var l,v,z,i,o,p=function(a,h){h.parentNode.insertBefore(a,h)};if(a&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}l=function(){var a,h=document.createElement("div");h.innerHTML=t._iconfont_svg_string_4511447,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(a=document.body).firstChild?p(h,a.firstChild):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(v=function(){document.removeEventListener("DOMContentLoaded",v,!1),l()},document.addEventListener("DOMContentLoaded",v,!1)):document.attachEvent&&(z=l,i=t.document,o=!1,d(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,m())})}function m(){o||(o=!0,z())}function d(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(d,50)}m()}})(window); \ No newline at end of file diff --git a/react-ui/src/pages/Dataset/components/ResourceInfo/index.less b/react-ui/src/pages/Dataset/components/ResourceInfo/index.less index 91eec995..288b498d 100644 --- a/react-ui/src/pages/Dataset/components/ResourceInfo/index.less +++ b/react-ui/src/pages/Dataset/components/ResourceInfo/index.less @@ -28,9 +28,29 @@ border-radius: 4px; } + &__praise { + display: flex; + align-items: center; + justify-content: center; + width: 70px; + height: 28px; + margin-left: auto; + color: @text-color-tertiary; + font-size: 13px; + background: #ffffff; + border: 1px solid rgba(22, 100, 255, 0.11); + border-radius: 4px; + cursor: pointer; + + &--praised { + color: @primary-color; + } + } + :global { .ant-btn-dangerous { - background-color: transparent !important; + background-color: .addAlpha(@error-color, 0.06) [] !important; + border-color: .addAlpha(@error-color, 0.11) [] !important; } } } diff --git a/react-ui/src/pages/Dataset/components/ResourceInfo/index.tsx b/react-ui/src/pages/Dataset/components/ResourceInfo/index.tsx index 8566bcf2..2f162f9b 100644 --- a/react-ui/src/pages/Dataset/components/ResourceInfo/index.tsx +++ b/react-ui/src/pages/Dataset/components/ResourceInfo/index.tsx @@ -20,6 +20,7 @@ import { to } from '@/utils/promise'; import { modalConfirm } from '@/utils/ui'; import { useParams, useSearchParams } from '@umijs/max'; import { App, Button, Flex, Select, Tabs } from 'antd'; +import classNames from 'classnames'; import { useCallback, useEffect, useState } from 'react'; import AddVersionModal from '../AddVersionModal'; import ResourceIntro from '../ResourceIntro'; @@ -263,9 +264,19 @@ const ResourceInfo = ({ resourceType }: ResourceInfoProps) => { {(info[tagPropertyName] as string) || '--'}
)} - +
+ + {info.praises_count} +
版本号: @@ -280,12 +291,17 @@ const ResourceInfo = ({ resourceType }: ResourceInfoProps) => { -
Date: Tue, 13 May 2025 16:50:14 +0800 Subject: [PATCH 23/25] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E7=8E=AF=E5=A2=83=E8=A1=A8=E6=A0=BC=E5=88=97=E5=AE=BD?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/src/enums/index.ts | 6 ++--- .../components/ExperimentList/index.tsx | 2 +- .../DevelopmentEnvironment/List/index.tsx | 22 +++++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/react-ui/src/enums/index.ts b/react-ui/src/enums/index.ts index b043a2d3..a9dd4a0f 100644 --- a/react-ui/src/enums/index.ts +++ b/react-ui/src/enums/index.ts @@ -39,9 +39,9 @@ export enum TensorBoardStatus { // 镜像版本状态 export enum MirrorVersionStatus { - Available = 'available', // 可用 - Building = 'building', // 构建中 - Failed = 'failed', // 构建中 + Available = 'Available', // 可用 + Building = 'Building', // 构建中 + Failed = 'Failed', // 失败 } // 服务运行状态 diff --git a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx index 15846f9c..6f944ac7 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx +++ b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx @@ -334,7 +334,7 @@ function ExperimentList({ type }: ExperimentListProps) { dataIndex: 'update_time', key: 'update_time', width: '20%', - render: tableCellRender(false, TableCellValueType.Date), + render: tableCellRender(true, TableCellValueType.Date), }, { title: '最近五次运行状态', diff --git a/react-ui/src/pages/DevelopmentEnvironment/List/index.tsx b/react-ui/src/pages/DevelopmentEnvironment/List/index.tsx index 0eaf361e..f8717a90 100644 --- a/react-ui/src/pages/DevelopmentEnvironment/List/index.tsx +++ b/react-ui/src/pages/DevelopmentEnvironment/List/index.tsx @@ -185,7 +185,7 @@ function EditorList() { title: '编辑器名称', dataIndex: 'name', key: 'name', - width: '20%', + width: '16%', render: (text, record, index) => record.url && record.status === DevEditorStatus.Running ? tableCellRender(true, TableCellValueType.Link, { @@ -197,14 +197,14 @@ function EditorList() { title: '计算资源', dataIndex: 'computing_resource', key: 'computing_resource', - width: 100, + width: '12%', render: tableCellRender(), }, { title: '资源规格', dataIndex: 'computing_resource_id', key: 'computing_resource_id', - width: '20%', + width: '12%', render: tableCellRender(true, TableCellValueType.Custom, { format: getResourceDescription, }), @@ -213,36 +213,36 @@ function EditorList() { title: '数据集', dataIndex: ['dataset', 'showValue'], key: 'dataset', - width: '15%', + width: '12%', render: tableCellRender(true), }, { title: '模型', dataIndex: ['model', 'showValue'], key: 'model', - width: '15%', + width: '12%', render: tableCellRender(true), }, { title: '镜像', dataIndex: ['image', 'showValue'], key: 'image', - width: '15%', + width: '12%', render: tableCellRender(true), }, { title: '创建者', dataIndex: 'update_by', key: 'update_by', - width: '15%', + width: '12%', render: tableCellRender(true), }, { title: '创建时间', dataIndex: 'create_time', key: 'create_time', - width: 180, - render: tableCellRender(false, TableCellValueType.Date), + width: '12%', + render: tableCellRender(true, TableCellValueType.Date), }, { title: '状态', @@ -254,7 +254,7 @@ function EditorList() { { title: '操作', dataIndex: 'operation', - width: 300, + width: 270, key: 'operation', render: (_: any, record: EditorData) => (
@@ -280,7 +280,7 @@ function EditorList() { 启动 )} - {record.status === DevEditorStatus.Running ? ( + {record.status !== DevEditorStatus.Running ? (