diff --git a/react-ui/src/iconfont/iconfont.js b/react-ui/src/iconfont/iconfont.js index 7097beaf..d7576e9c 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,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 diff --git a/react-ui/src/pages/AutoML/Instance/index.tsx b/react-ui/src/pages/AutoML/Instance/index.tsx index fd64d079..947ac63d 100644 --- a/react-ui/src/pages/AutoML/Instance/index.tsx +++ b/react-ui/src/pages/AutoML/Instance/index.tsx @@ -55,7 +55,10 @@ function AutoMLInstance() { // 这个接口返回的状态有延时,SSE 返回的状态是最新的 // SSE 调用时,不需要解析 node_status, 也不要重新建立 SSE if (isStatusDetermined) { - setInstanceInfo(info); + setInstanceInfo((prev) => ({ + ...info, + nodeStatus: prev!.nodeStatus, + })); return; } @@ -101,7 +104,7 @@ function AutoMLInstance() { ) as NodeStatus; if (statusData) { setInstanceInfo((prev) => ({ - ...(prev as AutoMLInstanceData), + ...prev!, nodeStatus: statusData, })); @@ -172,7 +175,11 @@ function AutoMLInstance() { label: '实验结果', icon: , children: ( - + ), }, { diff --git a/react-ui/src/pages/AutoML/components/ExperimentResult/index.less b/react-ui/src/pages/AutoML/components/ExperimentResult/index.less index 0257451b..c36da152 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentResult/index.less +++ b/react-ui/src/pages/AutoML/components/ExperimentResult/index.less @@ -6,9 +6,25 @@ background-color: white; border-radius: 10px; + &__download { + display: flex; + align-items: center; + height: 34px; + margin-bottom: 16px; + padding-left: @content-padding; + color: @text-color; + font-size: 13px; + background-color: #f8f8f9; + border-radius: 4px; + + &__btn { + margin-left: 22px; + } + } + &__text { width: 100%; - height: 460px; + height: 420px; padding: 20px @content-padding; overflow: auto; white-space: pre-wrap; @@ -20,14 +36,19 @@ width: 100%; overflow-x: auto; + :global { + .ant-image { + margin-right: 20px; + + &:last-child { + margin-right: 0; + } + } + } + &__item { height: 248px; - margin-right: 20px; border: 1px solid rgba(96, 107, 122, 0.3); - - &:last-child { - margin-right: 0; - } } } } diff --git a/react-ui/src/pages/AutoML/components/ExperimentResult/index.tsx b/react-ui/src/pages/AutoML/components/ExperimentResult/index.tsx index fce2e5fb..c5522834 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentResult/index.tsx +++ b/react-ui/src/pages/AutoML/components/ExperimentResult/index.tsx @@ -1,15 +1,18 @@ import InfoGroup from '@/components/InfoGroup'; +import KFIcon from '@/components/KFIcon'; import { getFileReq } from '@/services/file'; import { to } from '@/utils/promise'; +import { Button, Image } from 'antd'; import { useEffect, useMemo, useState } from 'react'; import styles from './index.less'; type ExperimentResultProps = { fileUrl?: string; imageUrl?: string; + modelPath?: string; }; -function ExperimentResult({ fileUrl, imageUrl }: ExperimentResultProps) { +function ExperimentResult({ fileUrl, imageUrl, modelPath }: ExperimentResultProps) { const [result, setResult] = useState(''); const images = useMemo(() => { @@ -35,20 +38,46 @@ function ExperimentResult({ fileUrl, imageUrl }: ExperimentResultProps) { return (
+ {modelPath && ( +
+ 文件名 + save_model.joblib + +
+ )}
{result}
- {images.map((item, index) => ( - - ))} + + console.log(`current index: ${current}, prev index: ${prev}`), + }} + > + {images.map((item) => ( + + ))} +
diff --git a/react-ui/src/pages/Experiment/components/LogGroup/index.tsx b/react-ui/src/pages/Experiment/components/LogGroup/index.tsx index 75d914f5..1b448930 100644 --- a/react-ui/src/pages/Experiment/components/LogGroup/index.tsx +++ b/react-ui/src/pages/Experiment/components/LogGroup/index.tsx @@ -52,7 +52,7 @@ function LogGroup({ const [_isMouseDown, setIsMouseDown, isMouseDownRef] = useStateRef(false); const preStatusRef = useRef(undefined); const socketRef = useRef(undefined); - const retryRef = useRef(2); // 等待 2 秒,重试 2 次 + const retryRef = useRef(2); // 等待 2 秒,重试 3 次 useEffect(() => { scrollToBottom(false); @@ -147,7 +147,7 @@ function LogGroup({ socket.addEventListener('close', (event) => { console.log('WebSocket is closed:', event); - // 有时候会出现连接失败,重试 2 次 + // 有时候会出现连接失败,重试 3 次 if (event.code !== 1000 && retryRef.current > 0) { retryRef.current -= 1; setTimeout(() => {