diff --git a/react-ui/public/assets/images/backup/component-icon-7-Failed.png b/react-ui/public/assets/images/backup/component-icon-7-Failed.png deleted file mode 100644 index 2427996b..00000000 Binary files a/react-ui/public/assets/images/backup/component-icon-7-Failed.png and /dev/null differ diff --git a/react-ui/public/assets/images/backup/component-icon-7-Omitted.png b/react-ui/public/assets/images/backup/component-icon-7-Omitted.png deleted file mode 100644 index 33a4445e..00000000 Binary files a/react-ui/public/assets/images/backup/component-icon-7-Omitted.png and /dev/null differ diff --git a/react-ui/public/assets/images/backup/component-icon-7-Pending.png b/react-ui/public/assets/images/backup/component-icon-7-Pending.png deleted file mode 100644 index 12a5aa4e..00000000 Binary files a/react-ui/public/assets/images/backup/component-icon-7-Pending.png and /dev/null differ diff --git a/react-ui/public/assets/images/backup/component-icon-7-Running.png b/react-ui/public/assets/images/backup/component-icon-7-Running.png deleted file mode 100644 index 0328188f..00000000 Binary files a/react-ui/public/assets/images/backup/component-icon-7-Running.png and /dev/null differ diff --git a/react-ui/public/assets/images/backup/component-icon-7-Skipped.png b/react-ui/public/assets/images/backup/component-icon-7-Skipped.png deleted file mode 100644 index 33a4445e..00000000 Binary files a/react-ui/public/assets/images/backup/component-icon-7-Skipped.png and /dev/null differ diff --git a/react-ui/public/assets/images/backup/component-icon-7-Succeeded.png b/react-ui/public/assets/images/backup/component-icon-7-Succeeded.png deleted file mode 100644 index 30676934..00000000 Binary files a/react-ui/public/assets/images/backup/component-icon-7-Succeeded.png and /dev/null differ diff --git a/react-ui/public/assets/images/backup/component-icon-7.png b/react-ui/public/assets/images/backup/component-icon-7.png deleted file mode 100644 index c0c1087c..00000000 Binary files a/react-ui/public/assets/images/backup/component-icon-7.png and /dev/null differ diff --git a/react-ui/src/app.tsx b/react-ui/src/app.tsx index 10ab35bb..db9ce231 100644 --- a/react-ui/src/app.tsx +++ b/react-ui/src/app.tsx @@ -29,6 +29,8 @@ export async function getInitialState(): Promise<{ loading?: boolean; fetchUserInfo?: () => Promise; }> { + console.log('getInitialState'); + const fetchUserInfo = async () => { try { const response = await getUserInfo({ @@ -133,22 +135,7 @@ export const layout: RunTimeLayoutConfig = ({ initialState }) => { // 增加一个 loading 的状态 childrenRender: (children) => { // if (initialState?.loading) return ; - return ( - <> - {children} - {/* { - setInitialState((preInitialState) => ({ - ...preInitialState, - settings, - })); - }} - /> */} - - ); + return <>{children}; }, ...initialState?.settings, }; diff --git a/react-ui/src/components/HeaderDropdown/index.tsx b/react-ui/src/components/HeaderDropdown/index.tsx index ae560fd2..36153a73 100644 --- a/react-ui/src/components/HeaderDropdown/index.tsx +++ b/react-ui/src/components/HeaderDropdown/index.tsx @@ -17,13 +17,8 @@ const HeaderDropdown: React.FC = ({ overlayClassName: cls, }, }; }); - return ( - target.parentElement || document.body} - {...restProps} - /> - ); + + return ; }; export default HeaderDropdown; diff --git a/react-ui/src/components/RightContent/AvatarDropdown.tsx b/react-ui/src/components/RightContent/AvatarDropdown.tsx index c6c52a92..fca317ef 100644 --- a/react-ui/src/components/RightContent/AvatarDropdown.tsx +++ b/react-ui/src/components/RightContent/AvatarDropdown.tsx @@ -1,13 +1,12 @@ import { clearSessionToken } from '@/access'; -import { PageEnum } from '@/enums/pagesEnums'; import { setRemoteMenu } from '@/services/session'; import { logout } from '@/services/system/auth'; +import { gotoLoginPage } from '@/utils/ui'; import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons'; import { setAlpha } from '@ant-design/pro-components'; import { useEmotionCss } from '@ant-design/use-emotion-css'; import { history, useModel } from '@umijs/max'; import { Avatar, Spin } from 'antd'; -import { stringify } from 'querystring'; import type { MenuInfo } from 'rc-menu/lib/interface'; import React, { useCallback } from 'react'; import { flushSync } from 'react-dom'; @@ -23,7 +22,7 @@ const Name = () => { const nameClassName = useEmotionCss(({ token }) => { return { - width: '70px', + // width: '70px', height: '48px', overflow: 'hidden', lineHeight: '48px', @@ -64,19 +63,7 @@ const AvatarDropdown: React.FC = ({ menu }) => { await logout(); clearSessionToken(); setRemoteMenu(null); - const { search, pathname } = window.location; - const urlParams = new URL(window.location.href).searchParams; - /** 此方法会跳转到 redirect 参数所在的位置 */ - const redirect = urlParams.get('redirect'); - // Note: There may be security issues, please note - if (window.location.pathname !== PageEnum.LOGIN && !redirect) { - history.replace({ - pathname: PageEnum.LOGIN, - search: stringify({ - redirect: pathname + search, - }), - }); - } + gotoLoginPage(); }; const actionClassName = useEmotionCss(({ token }) => { return { diff --git a/react-ui/src/components/RightContent/index.tsx b/react-ui/src/components/RightContent/index.tsx index c2a4a7bf..6fbfa37c 100644 --- a/react-ui/src/components/RightContent/index.tsx +++ b/react-ui/src/components/RightContent/index.tsx @@ -1,6 +1,5 @@ -import { QuestionCircleOutlined } from '@ant-design/icons'; import { useEmotionCss } from '@ant-design/use-emotion-css'; -import { SelectLang, useModel } from '@umijs/max'; +import { useModel } from '@umijs/max'; import React from 'react'; import Avatar from './AvatarDropdown'; @@ -17,21 +16,21 @@ const GlobalHeaderRight: React.FC = () => { }; }); - const actionClassName = useEmotionCss(({ token }) => { - return { - display: 'flex', - float: 'right', - height: '48px', - marginLeft: 'auto', - overflow: 'hidden', - cursor: 'pointer', - padding: '0 12px', - borderRadius: token.borderRadius, - '&:hover': { - backgroundColor: token.colorBgTextHover, - }, - }; - }); + // const actionClassName = useEmotionCss(({ token }) => { + // return { + // display: 'flex', + // float: 'right', + // height: '48px', + // marginLeft: 'auto', + // overflow: 'hidden', + // cursor: 'pointer', + // padding: '0 12px', + // borderRadius: token.borderRadius, + // '&:hover': { + // backgroundColor: token.colorBgTextHover, + // }, + // }; + // }); const { initialState } = useModel('@@initialState'); @@ -41,15 +40,15 @@ const GlobalHeaderRight: React.FC = () => { return (
- { window.open('https://pro.ant.design/docs/getting-started'); }} > - - + */} + {/* */}
); diff --git a/react-ui/src/overrides.less b/react-ui/src/overrides.less index 1b766517..c65420fb 100644 --- a/react-ui/src/overrides.less +++ b/react-ui/src/overrides.less @@ -1,3 +1,9 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-28 08:47:43 + * @Description: 覆盖 antd 样式 + */ + // 设置 Table 可以滑动 .vertical-scroll-table { .ant-table-wrapper { @@ -9,7 +15,7 @@ height: 100%; .ant-table { - height: calc(100% - 74px); + height: calc(100% - 74px); // 分页控件的高度 .ant-table-container { height: 100%; diff --git a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx index 3e58ee26..f5b2bfc4 100644 --- a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx +++ b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx @@ -144,8 +144,15 @@ function AddExperimentModal({ label="实验描述" name="description" rules={[{ required: true, message: '请输入实验描述' }]} + style={{ marginBottom: '48px' }} > - + { return ( cfg.anchorPoints || [ // 四个 - // [0.5, 0], - // [0.5, 1], - [0, 0.5], - [1, 0.5], + [0.5, 0], + [0.5, 1], + // [0, 0.5], + // [1, 0.5], ] ); }, diff --git a/react-ui/src/requestConfig.ts b/react-ui/src/requestConfig.ts index a742d3cd..501e78c5 100644 --- a/react-ui/src/requestConfig.ts +++ b/react-ui/src/requestConfig.ts @@ -1,13 +1,13 @@ /* * @Author: 赵伟 * @Date: 2024-03-25 13:52:54 - * @Description: + * @Description: 网络请求配置,详情请参考 https://umijs.org/docs/max/request */ import type { RequestConfig } from '@umijs/max'; import { message } from 'antd'; -import { clearSessionToken, getAccessToken, getRefreshToken, getTokenExpireTime } from './access'; - -const checkRegion = 5 * 60 * 1000; +import { clearSessionToken, getAccessToken } from './access'; +import { setRemoteMenu } from './services/session'; +import { gotoLoginPage } from './utils/ui'; /** * Umi Max 网络请求配置 @@ -21,23 +21,25 @@ export const requestConfig: RequestConfig = { const authHeader = headers['Authorization']; const isToken = headers['isToken']; if (!authHeader && isToken !== false) { - const expireTime = getTokenExpireTime(); - if (expireTime) { - const left = Number(expireTime) - new Date().getTime(); - const refreshToken = getRefreshToken(); - if (left < checkRegion && refreshToken) { - if (left < 0) { - clearSessionToken(); - } - } else { - const accessToken = getAccessToken(); - if (accessToken) { - headers['Authorization'] = `Bearer ${accessToken}`; - } - } - } else { - clearSessionToken(); + const accessToken = getAccessToken(); + if (accessToken) { + headers['Authorization'] = `Bearer ${accessToken}`; } + // const expireTime = getTokenExpireTime(); + // if (expireTime) { + // const left = Number(expireTime) - new Date().getTime(); + // const refreshToken = getRefreshToken(); + // if (left < 0 && refreshToken) { + // clearSessionToken(); + // } else { + // const accessToken = getAccessToken(); + // if (accessToken) { + // headers['Authorization'] = `Bearer ${accessToken}`; + // } + // } + // } else { + // clearSessionToken(); + // } } return { url, options }; }, @@ -45,15 +47,19 @@ export const requestConfig: RequestConfig = { responseInterceptors: [ (response: any) => { const { status, data } = response; - // console.log('response', response); - if (status >= 200 && status < 300 && data && (data instanceof Blob || data.code === 200)) { - return response; - } else { - if (data && data.msg) { - message.error(data.msg); + if (status >= 200 && status < 300) { + if (data && (data instanceof Blob || data.code === 200)) { + return response; + } else if (data && data.code === 401) { + clearSessionToken(); + setRemoteMenu(null); + gotoLoginPage(false); } else { - message.error('请求失败'); + message.error(data?.msg ?? '请求失败'); + return Promise.reject(response); } + } else { + message.error('请求失败'); return Promise.reject(response); } }, diff --git a/react-ui/src/services/session.ts b/react-ui/src/services/session.ts index 1d50df99..8430b21b 100644 --- a/react-ui/src/services/session.ts +++ b/react-ui/src/services/session.ts @@ -1,8 +1,7 @@ -import { createIcon } from '@/utils/IconUtil'; import { MenuDataItem } from '@ant-design/pro-components'; import { request } from '@umijs/max'; import React, { lazy } from 'react'; -import { createFromIconfontCN } from '@ant-design/icons'; + let remoteMenu: any = null; export function getRemoteMenu() { @@ -107,7 +106,7 @@ export function convertCompatRouters(childrens: API.RoutersMenuItem[]): any[] { return { path: item.path, // icon:'icon-a-057_fenlei', - icon: 'icon-'+item.meta.icon, + icon: 'icon-' + item.meta.icon, // icon: item.meta.icon, name: item.meta.title, routes: item.children ? convertCompatRouters(item.children) : undefined, diff --git a/react-ui/src/services/system/auth.ts b/react-ui/src/services/system/auth.ts index 031b2ef3..e69e571e 100644 --- a/react-ui/src/services/system/auth.ts +++ b/react-ui/src/services/system/auth.ts @@ -28,8 +28,8 @@ export async function login(body: API.LoginParams, options?: Record /** 退出登录接口 POST /api/login/outLogin */ export async function logout() { - return request>('/api/logout', { - method: 'delete', + return request>('/api/auth/logout', { + method: 'DELETE', }); } diff --git a/react-ui/src/styles/theme.less b/react-ui/src/styles/theme.less index 64b78619..0f93891e 100644 --- a/react-ui/src/styles/theme.less +++ b/react-ui/src/styles/theme.less @@ -1,4 +1,10 @@ -// 全局颜色变量 +/* + * @Author: 赵伟 + * @Date: 2024-04-28 08:47:43 + * @Description: 全局变量,可以直接在 less 文件里使用,无需引入;也可以导入到 js 里使用;为 antd 主题修改提供常量值 + */ + +// 颜色 @primary-color: #1664ff; // 主色调 @primary-color-hover: #69b1ff; @background-color: #f9fafb; // 页面背景颜色 diff --git a/react-ui/src/types.ts b/react-ui/src/types.ts index dcf74581..8e49075e 100644 --- a/react-ui/src/types.ts +++ b/react-ui/src/types.ts @@ -1,3 +1,9 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-08 09:54:39 + * @Description: 定义全局类型,比如无关联的页面都需要要的类型 + */ + // 流水线全局参数 export type PipelineGlobalParam = { param_name: string; diff --git a/react-ui/src/utils/ui.tsx b/react-ui/src/utils/ui.tsx index 51a74143..ddf83f6f 100644 --- a/react-ui/src/utils/ui.tsx +++ b/react-ui/src/utils/ui.tsx @@ -3,7 +3,9 @@ * @Date: 2024-04-19 14:42:51 * @Description: UI 公共方法 */ +import { PageEnum } from '@/enums/pagesEnums'; import themes from '@/styles/theme.less'; +import { history } from '@umijs/max'; import { Modal, type ModalFuncProps, type UploadFile } from 'antd'; // 自定义 Confirm 弹框 @@ -43,3 +45,17 @@ export const getFileListFromEvent = (e: any) => { return item; }); }; + +// 去登录页面 +export const gotoLoginPage = (toHome: boolean = true) => { + const { pathname, search } = window.location; + const urlParams = new URLSearchParams(); + urlParams.append('redirect', pathname + search); + const newSearch = toHome ? '' : urlParams.toString(); + if (window.location.pathname !== PageEnum.LOGIN) { + history.replace({ + pathname: PageEnum.LOGIN, + search: newSearch, + }); + } +}; diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/RuoYiManagementPlatformApplication.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/RuoYiManagementPlatformApplication.java index 9689cda6..b3b22ac9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/RuoYiManagementPlatformApplication.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/RuoYiManagementPlatformApplication.java @@ -17,9 +17,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableRyFeignClients @SpringBootApplication @EnableScheduling -public class - -RuoYiManagementPlatformApplication { +public class RuoYiManagementPlatformApplication { public static void main(String[] args) { SpringApplication.run(RuoYiManagementPlatformApplication.class, args); System.out.println("(♥◠‿◠)ノ゙ 复杂智能软件管理平台启动成功 ლ(´ڡ`ლ)゙ \n" + 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 71be192e..87715d5d 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 @@ -4,7 +4,7 @@ import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.domain.GenericsAjaxResult; import com.ruoyi.platform.domain.DatasetVersion; import com.ruoyi.platform.service.DatasetVersionService; -import com.ruoyi.platform.vo.LabelDatasetVersion; +import com.ruoyi.platform.vo.LabelDatasetVersionVo; import io.swagger.annotations.ApiOperation; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -138,8 +138,10 @@ public class DatasetVersionController extends BaseController { @PostMapping("/addDatasetVersionsFromLabel") @ApiOperation("从数据标注添加数据集版本") - public GenericsAjaxResult addDatasetVersionsFromLabel(@RequestBody LabelDatasetVersion labelDatasetVersion) throws Exception { - return genericsSuccess(true); + public GenericsAjaxResult addDatasetVersionsFromLabel(@RequestBody LabelDatasetVersionVo labelDatasetVersionVo) throws Exception { + datasetVersionService.addDatasetVersionsFromLabel(labelDatasetVersionVo); + + return GenericsAjaxResult.success(); } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java index c754c673..210aefc4 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java @@ -123,7 +123,7 @@ public class ModelsController extends BaseController { */ @PostMapping @ApiOperation("添加模型") - public GenericsAjaxResult add(@RequestBody Models models) { + public GenericsAjaxResult add(@RequestBody Models models) throws Exception { return genericsSuccess(this.modelsService.insert(models)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Models.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Models.java index 87eadc37..f00f189d 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Models.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Models.java @@ -2,6 +2,7 @@ package com.ruoyi.platform.domain; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.ruoyi.platform.annotations.CheckDuplicate; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -22,6 +23,7 @@ public class Models implements Serializable { private Integer id; @ApiModelProperty(value = "模型名称") + @CheckDuplicate private String name; @ApiModelProperty(value = "模型描述") diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/DatasetVersionDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/DatasetVersionDao.java index 19e21651..841f671b 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/DatasetVersionDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/DatasetVersionDao.java @@ -84,7 +84,8 @@ public interface DatasetVersionDao { List queryByDatasetId(Integer datasetId); - DatasetVersion queryByDatasetVersion(@Param("datasetVersion") DatasetVersion datasetVersion); + DatasetVersion + queryByDatasetVersion(@Param("datasetVersion") DatasetVersion datasetVersion); List queryAllByDatasetVersion(@Param("datasetId") Integer datasetId, @Param("version") String version); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java index 44fcd8c9..d1db8828 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java @@ -62,7 +62,7 @@ public interface ExperimentDao { * @return 影响行数 * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参 */ - int insertOrUpdateBatch(@Param("entities") List entities); + int insertOrUpdateBatch(List entities); /** * 修改数据 diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentInsDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentInsDao.java index a24475a7..c5f13883 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentInsDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentInsDao.java @@ -62,7 +62,7 @@ public interface ExperimentInsDao { * @return 影响行数 * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参 */ - int insertOrUpdateBatch(@Param("entities") List entities); + int insertOrUpdateBatch(List entities); /** * 修改数据 @@ -92,5 +92,7 @@ public interface ExperimentInsDao { List queryByExperiment(@Param("experimentIns") ExperimentIns experimentIns); List queryByExperimentId(Integer id); + + List queryByExperimentIsNotTerminated(); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelsDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelsDao.java index 8919b77a..c787e71a 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelsDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelsDao.java @@ -1,10 +1,12 @@ package com.ruoyi.platform.mapper; +import com.ruoyi.platform.domain.Dataset; import com.ruoyi.platform.domain.Models; import org.apache.ibatis.annotations.Param; import org.springframework.data.domain.Pageable; import java.util.List; +import java.util.Map; /** * (Models)表数据库访问层 @@ -22,6 +24,8 @@ public interface ModelsDao { */ Models queryById(Integer id); + Models findByName(@Param("name") String name); + /** * 查询指定行数据 * 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 new file mode 100644 index 00000000..6ab8bd58 --- /dev/null +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java @@ -0,0 +1,88 @@ +package com.ruoyi.platform.scheduling; + +import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.platform.domain.Experiment; +import com.ruoyi.platform.domain.ExperimentIns; +import com.ruoyi.platform.mapper.ExperimentDao; +import com.ruoyi.platform.mapper.ExperimentInsDao; +import com.ruoyi.platform.service.ExperimentInsService; +import com.ruoyi.platform.service.ExperimentService; +import com.ruoyi.platform.utils.JsonUtils; +import com.ruoyi.system.api.model.LoginUser; +import io.swagger.models.auth.In; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +@Component() +public class ExperimentInstanceStatusTask { + @Autowired + private ExperimentInsService experimentInsService; + @Resource + private ExperimentDao experimentDao; + @Resource + private ExperimentInsDao experimentInsDao; + + private List experimentIds = new ArrayList<>(); + @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 + public void executeExperimentInsStatus() throws IOException { + // 查到所有非终止态的实例 + List experimentInsList = experimentInsService.queryByExperimentIsNotTerminated(); + // 去argo查询状态 + List updateList = new ArrayList<>(); + if (experimentInsList != null && experimentInsList.size() > 0) { + for (ExperimentIns experimentIns : experimentInsList) { + //当原本状态为null或非终止态时才调用argo接口 + String oldStatus = experimentIns.getStatus(); + try { + experimentIns = experimentInsService.queryStatusFromArgo(experimentIns); + }catch (Exception e){ + experimentIns.setStatus("Failed"); + } + if (!StringUtils.equals(oldStatus,experimentIns.getStatus())){ + experimentIns.setUpdateTime(new Date()); + experimentIds.add(experimentIns.getExperimentId()); + updateList.add(experimentIns); + } + experimentInsDao.update(experimentIns); + } + } + if (updateList.size() > 0){ + experimentInsDao.insertOrUpdateBatch(updateList); + } + + } + @Scheduled(cron = "0/30 * * * * ?") // / 每30S执行一次 + public void executeExperimentStatus() throws IOException { + if (experimentIds.size()==0){ + return; + } + List updateexperiments = new ArrayList<>(); + for (Integer experimentId : experimentIds){ + List insList = experimentInsService.getByExperimentId(experimentId); + List statusList = new ArrayList(); + // 更新实验状态列表 + for (int i=0;i 0) { + experimentDao.insertOrUpdateBatch(updateexperiments); + for (int index = 0; index < updateexperiments.size(); index++) { + experimentIds.remove(index); + } + } + } +} 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 59032c6b..3ae08ca3 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 @@ -1,11 +1,8 @@ package com.ruoyi.platform.service; - - -import com.ruoyi.platform.domain.Dataset; import com.ruoyi.platform.domain.DatasetVersion; -import com.ruoyi.platform.vo.LabelDatasetVersion; +import com.ruoyi.platform.vo.LabelDatasetVersionVo; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -75,5 +72,6 @@ public interface DatasetVersionService { String addDatasetVersions(List datasetVersions) throws Exception; - void addDatasetVersionsFromLabel(LabelDatasetVersion labelDatasetVersion) throws Exception; + void + addDatasetVersionsFromLabel(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentInsService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentInsService.java index 56f5303d..1940fd2d 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentInsService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentInsService.java @@ -98,4 +98,9 @@ public interface ExperimentInsService { String getRealtimePodLogFromPod(PodLogVo podLogVo); + /** + * 查询非终止态的实例 + * @return + */ + List queryByExperimentIsNotTerminated(); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/MinioService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/MinioService.java index 28cb0a79..3b990a86 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/MinioService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/MinioService.java @@ -4,6 +4,7 @@ import org.springframework.core.io.InputStreamResource; import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; +import java.io.InputStream; import java.util.List; import java.util.Map; @@ -11,5 +12,5 @@ public interface MinioService { ResponseEntity downloadZipFile(String bucketName , String path); Map uploadFile(String bucketName, String objectName, MultipartFile file ) throws Exception; - + void uploaInputStream(String bucketName, String objectName, InputStream inputStream ) throws Exception; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java index c2522728..c4e5b920 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java @@ -2,6 +2,7 @@ package com.ruoyi.platform.service; +import com.ruoyi.platform.domain.Dataset; import com.ruoyi.platform.domain.Models; import com.ruoyi.platform.domain.ModelsVersion; import com.ruoyi.platform.vo.ModelsVo; @@ -45,7 +46,7 @@ public interface ModelsService { * @param models 实例对象 * @return 实例对象 */ - Models insert(Models models); + Models insert(Models models) throws Exception; /** * 修改数据 @@ -81,5 +82,7 @@ public interface ModelsService { String readFileContent(Integer modelsId, String version) throws Exception; + public void checkDeclaredName(Models insert) throws Exception; + List> exportModels(String path, String uuid) throws Exception; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java index 0120caea..04fd3dcc 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java @@ -20,6 +20,7 @@ import com.ruoyi.platform.vo.DatasetVo; import com.ruoyi.system.api.model.LoginUser; import io.minio.messages.Item; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.InputStreamResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -67,7 +68,8 @@ public class DatasetServiceImpl implements DatasetService { private MinioService minioService; // 固定存储桶名 - private final String bucketName = "platform-data"; + @Value("${minio.dataReleaseBucketName}") + private String bucketName; @Resource private MinioUtil minioUtil; @@ -240,6 +242,7 @@ public class DatasetServiceImpl implements DatasetService { @Override public List> uploadDataset(MultipartFile[] files, String uuid) throws Exception { List> results = new ArrayList<>(); + for (MultipartFile file:files){ // 构建objectName String username = SecurityUtils.getLoginUser().getUsername(); @@ -259,7 +262,6 @@ public class DatasetServiceImpl implements DatasetService { if (dataset == null) { throw new Exception("数据集不存在,请检查数据集id"); } - DatasetVersion version = datasetVersionService.queryByDatasetVersion(datasetVersion); String url = ""; if (version == null) { 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 0fa1d0be..68d85837 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 @@ -1,17 +1,20 @@ package com.ruoyi.platform.service.impl; +import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.platform.annotations.CheckDuplicate; import com.ruoyi.platform.domain.Dataset; import com.ruoyi.platform.domain.DatasetVersion; -import com.ruoyi.platform.domain.ModelsVersion; -import com.ruoyi.platform.domain.Workflow; +import com.ruoyi.platform.mapper.DatasetDao; import com.ruoyi.platform.mapper.DatasetVersionDao; import com.ruoyi.platform.service.DatasetVersionService; +import com.ruoyi.platform.service.MinioService; +import com.ruoyi.platform.utils.FileUtil; import com.ruoyi.platform.utils.HttpUtils; -import com.ruoyi.platform.vo.LabelDatasetVersion; +import com.ruoyi.platform.vo.LabelDatasetVersionVo; import com.ruoyi.system.api.model.LoginUser; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; @@ -35,9 +38,13 @@ import java.util.Map; public class DatasetVersionServiceImpl implements DatasetVersionService { @Resource private DatasetVersionDao datasetVersionDao; + @Resource + private DatasetDao datasetDao; // 固定存储桶名 - private final String bucketName = "platform-data"; - + @Value("${minio.dataReleaseBucketName}") + private String bucketName; + @Resource + private MinioService minioService; /** * 通过ID查询单条数据 * @@ -198,12 +205,31 @@ public class DatasetVersionServiceImpl implements DatasetVersionService { } @Override - public void addDatasetVersionsFromLabel(LabelDatasetVersion labelDatasetVersion) throws Exception{ + public void addDatasetVersionsFromLabel(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception{ + Dataset dataset = datasetDao.queryById(labelDatasetVersionVo.getDataset_id()); + if (dataset == null){ + throw new Exception("数据集不存在"); + } // 获取label-studio数据流 - InputStream inputStream = HttpUtils.getInputStream("http://127.0.0.1:8080/api/projects/"+labelDatasetVersion.getProject_id()+"/export?exportType="+labelDatasetVersion.getExportType(), labelDatasetVersion.getToken()); - // 上传镜像至minio - + Map headers = new HashMap(); + headers.put("Authorization","Token "+labelDatasetVersionVo.getToken()); + InputStream inputStream = HttpUtils.getIntputStream("http://127.0.0.1:8080/api/projects/"+labelDatasetVersionVo.getProject_id()+"/export?exportType="+labelDatasetVersionVo.getExportType(), headers); + // 构建objectName + String username = SecurityUtils.getLoginUser().getUsername(); + String url = username + "/" + DateUtils.dateTimeNow() + "/" + dataset.getName()+"_"+labelDatasetVersionVo.getVersion()+"."+labelDatasetVersionVo.getExportType(); + String objectName = "datasets/" + url; + String formattedSize = FileUtil.formatFileSize(inputStream.available()); + minioService.uploaInputStream(bucketName,objectName,inputStream); //保存DatasetVersion + DatasetVersion datasetVersion = new DatasetVersion(); + datasetVersion.setVersion(labelDatasetVersionVo.getVersion()); + datasetVersion.setDatasetId(labelDatasetVersionVo.getDataset_id()); + datasetVersion.setFileName(dataset.getName()+"_"+labelDatasetVersionVo.getVersion()+"."+labelDatasetVersionVo.getExportType()); + + datasetVersion.setFileSize(formattedSize); + datasetVersion.setUrl(url); + datasetVersion.setDescription(labelDatasetVersionVo.getDesc()); + this.insert(datasetVersion); } private void insertPrepare(DatasetVersion datasetVersion) throws Exception { 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 4f8bd042..14c2997d 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 @@ -71,14 +71,16 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { @Override public ExperimentIns queryById(Integer id) throws IOException { ExperimentIns experimentIns = this.experimentInsDao.queryById(id); - if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { - experimentIns = this.queryStatusFromArgo(experimentIns); - //只有当新状态是终止态时才更新数据库 - if (isTerminatedState(experimentIns)) { - //同时更新各个节点 - this.update(experimentIns); - } - } + + //已经迁移至定时任务进行更新操作 +// if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { +// experimentIns = this.queryStatusFromArgo(experimentIns); +// //只有当新状态是终止态时才更新数据库 +// if (isTerminatedState(experimentIns)) { +// //同时更新各个节点 +// this.update(experimentIns); +// } +// } return experimentIns; } @@ -93,40 +95,42 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { @Override public List getByExperimentId(Integer experimentId) throws IOException { List experimentInsList = experimentInsDao.getByExperimentId(experimentId); - //搞个标记,当状态改变才去改表 - boolean flag = false; - List result = new ArrayList(); - if (experimentInsList!=null && experimentInsList.size()>0) { - for (ExperimentIns experimentIns : experimentInsList) { - //当原本状态为null或非终止态时才调用argo接口 - if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { - experimentIns = this.queryStatusFromArgo(experimentIns); - if (!flag){ - flag = true; - } - //只有当新状态是终止态时才更新数据库 - if (isTerminatedState(experimentIns)) { - //同时更新各个节点 - this.update(experimentIns); - } - } - //新增查询tensorBoard容器状态 - result.add(experimentIns); - } - } - if (flag) { - List statusList = new ArrayList(); - // 更新实验状态列表 - for (int i=0;i result = new ArrayList(); +// if (experimentInsList!=null && experimentInsList.size()>0) { +// for (ExperimentIns experimentIns : experimentInsList) { +// //当原本状态为null或非终止态时才调用argo接口 +// if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { +// experimentIns = this.queryStatusFromArgo(experimentIns); +// if (!flag){ +// flag = true; +// } +// //只有当新状态是终止态时才更新数据库 +// if (isTerminatedState(experimentIns)) { +// //同时更新各个节点 +// this.update(experimentIns); +// } +// } +// +// //新增查询tensorBoard容器状态 +// result.add(experimentIns); +// } +// } +// if (flag) { +// List statusList = new ArrayList(); +// // 更新实验状态列表 +// for (int i=0;i queryByPage(ExperimentIns experimentIns, PageRequest pageRequest) throws IOException { long total = this.experimentInsDao.count(experimentIns); List experimentInsList = this.experimentInsDao.queryAllByLimit(experimentIns, pageRequest); - if (experimentInsList!=null && experimentInsList.size()>0) { - for (ExperimentIns ins : experimentInsList) { - //如果实验实例不为空或者 - if (ins != null && StringUtils.isEmpty(ins.getStatus())) { - ins = this.queryStatusFromArgo(ins); - this.update(ins); - } - } - } +// if (experimentInsList!=null && experimentInsList.size()>0) { +// for (ExperimentIns ins : experimentInsList) { +// //如果实验实例不为空或者 +// if (ins != null && StringUtils.isEmpty(ins.getStatus())) { +// ins = this.queryStatusFromArgo(ins); +// this.update(ins); +// } +// } +// } return new PageImpl<>(experimentInsList, pageRequest, total); } @@ -524,6 +528,11 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { return k8sClientUtil.getPodLogs(podLogVo.getPodName(), podLogVo.getNamespace(),podLogVo.getContainerName(), logsLines); } + @Override + public List queryByExperimentIsNotTerminated() { + return experimentInsDao.queryByExperimentIsNotTerminated(); + } + private boolean isTerminatedState(ExperimentIns ins) throws IOException { // 定义终止态的列表,例如 "Succeeded", "Failed" 等 String status = ins.getStatus(); 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 9ba773c2..3cef14d1 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 @@ -256,8 +256,9 @@ public class ExperimentServiceImpl implements ExperimentService { experimentIns.setExperimentId(experiment.getId()); experimentIns.setArgoInsNs((String) metadata.get("namespace")); experimentIns.setArgoInsName((String) metadata.get("name")); - //传入实验全局参数 + experimentIns.setStatus("Pending"); + //传入实验全局参数 experimentIns.setGlobalParam(experiment.getGlobalParam()); 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 76d510f5..336776ea 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 @@ -221,7 +221,7 @@ public class ImageServiceImpl implements ImageService { if (imageVersionInsert == null) { throw new Exception("新增镜像版本失败"); } - // 使用CompletableFuture异步执行不同的镜像构建逻辑 + // 使用CompletableFuture异步执行不同的镜像构建逻辑,在构建镜像的同时,更新数据库中的镜像版本状态 CompletableFuture.supplyAsync(() -> { Map resultMap = new HashMap<>(); try { @@ -281,6 +281,7 @@ public class ImageServiceImpl implements ImageService { String pushCmd = "docker push " + imageUrl; String sizeCmd = "docker inspect --format='{{.Size}}' " + imageUrl; String s = k8sClientUtil.executeCommand(pod, tagCmd); + if (StringUtils.isNotEmpty(k8sClientUtil.executeCommand(pod, pushCmd))){ resultMap.put("url", imageUrl); //得到镜像文件大小 diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MinioServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MinioServiceImpl.java index f6e0c0b5..e03183dd 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MinioServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MinioServiceImpl.java @@ -69,4 +69,9 @@ public class MinioServiceImpl implements MinioService { } return result; } + + @Override + public void uploaInputStream(String bucketName, String objectName, InputStream inputStream ) throws Exception { + minioUtil.uploadObject(bucketName, objectName, inputStream); + } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java index 14b1e470..d0a504ee 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java @@ -1,7 +1,9 @@ package com.ruoyi.platform.service.impl; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.platform.annotations.CheckDuplicate; import com.ruoyi.platform.domain.AssetIcon; +import com.ruoyi.platform.domain.Dataset; import com.ruoyi.platform.domain.Models; import com.ruoyi.platform.domain.ModelsVersion; import com.ruoyi.platform.mapper.ModelsDao; @@ -19,6 +21,7 @@ import com.ruoyi.system.api.model.LoginUser; import io.minio.messages.Item; import io.netty.util.Version; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.InputStreamResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -34,6 +37,7 @@ import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; +import java.lang.reflect.Field; import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; @@ -64,7 +68,8 @@ public class ModelsServiceImpl implements ModelsService { // 固定存储桶名 - private final String bucketName = "platform-data"; + @Value("${minio.dataReleaseBucketName}") + private String bucketName; @Resource private MinioUtil minioUtil; @@ -116,8 +121,9 @@ public class ModelsServiceImpl implements ModelsService { * @return 实例对象 */ @Override - public Models insert(Models models) { + public Models insert(Models models) throws Exception { LoginUser loginUser = SecurityUtils.getLoginUser(); + checkDeclaredName(models); models.setCreateBy(loginUser.getUsername()); models.setUpdateBy(loginUser.getUsername()); models.setUpdateTime(new Date()); @@ -173,8 +179,9 @@ public class ModelsServiceImpl implements ModelsService { if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ throw new Exception("无权限删除该模型"); } - if (modelsVersionService.queryByModelsId(id).size()>0){ - throw new Exception("请先删除该镜像下的版本文件"); + //判断是否有版本文件 + if (!modelsVersionService.queryByModelsId(id).isEmpty()){ + throw new Exception("请先删除该模型下的版本文件"); } models.setState(0); return this.modelsDao.update(models)>0?"删除成功":"删除失败"; @@ -427,6 +434,31 @@ public class ModelsServiceImpl implements ModelsService { } + @Override + public void checkDeclaredName(Models insert) throws Exception { + Models existingModel = modelsDao.findByName(insert.getName()); + if (existingModel != null) { + // Check if the found models is not the same as the one being inserted + // This is important if you are using this method for both insert and update operations + // You may need an identifier check here, e.g., if 'insert' has an ID and it's the same as 'existingDataset' + if (insert.getId() != null && insert.getId().equals(existingModel.getId())) { + // This is the same dataset, no duplicate name issue for update operation + return; + } + + // Now we know there's another dataset with the same name + Field[] fields = Models.class.getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); // Make private fields accessible + if ("name".equals(field.getName()) && field.isAnnotationPresent(CheckDuplicate.class)) { + // If the field is 'name' and is marked with CheckDuplicate annotation + CheckDuplicate annotation = field.getAnnotation(CheckDuplicate.class); + throw new Exception("重复的模型名称: " + insert.getName() + ". " + annotation.message()); + } + } + } + } + @Override public List> exportModels(String path, String uuid) throws Exception { List> results = new ArrayList<>(); 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 f7a64ebd..5f289458 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 @@ -8,6 +8,7 @@ import com.ruoyi.platform.mapper.ModelsVersionDao; import com.ruoyi.platform.service.ModelsVersionService; import com.ruoyi.system.api.model.LoginUser; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; @@ -35,7 +36,8 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { private ModelsDao modelsDao; // 固定存储桶名 - private final String bucketName = "platform-data"; + @Value("${minio.dataReleaseBucketName}") + private String bucketName; /** * 通过ID查询单条数据 diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/HttpUtils.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/HttpUtils.java index 2102b376..b382eda9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/HttpUtils.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/HttpUtils.java @@ -375,25 +375,54 @@ public class HttpUtils { } + /** - * 发送 HTTP 请求并返回二进制数据流(InputStream)。 + * 发送 HTTP 请求并返回二进制数据流(OutputStream)。 * * @param url 请求的 URL 地址。 - * @param token 要携带的 Token。 - * @return 服务器响应的二进制数据流(InputStream)。 + * @param headers 头节点。 + * @return 服务器响应的二进制数据流(OutputStream)。 * @throws IOException 如果请求失败或发生其他 I/O 错误。 */ - public static InputStream getInputStream(String url, String token) throws IOException { + public static InputStream getIntputStream(String url, Map headers) throws IOException { URL requestUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection(); + + // Set request headers + for (Map.Entry entry : headers.entrySet()) { + connection.setRequestProperty(entry.getKey(), entry.getValue()); + } + + // Set other connection properties (e.g., timeouts, request method, etc.) connection.setRequestMethod("GET"); - connection.setRequestProperty("Authorization", "Bearer " + token); // 添加 Authorization 头部,携带 Token + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + // Connect and get the response code + connection.connect(); int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { - return connection.getInputStream(); // 获取响应的输入流 + // Get the response InputStream + InputStream inputStream = connection.getInputStream(); + +// // Create a ByteArrayOutputStream to store the response data +// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); +// +// // Read data from the InputStream and write it to the ByteArrayOutputStream +// byte[] buffer = new byte[1024]; +// int bytesRead; +// while ((bytesRead = inputStream.read(buffer)) != -1) { +// outputStream.write(buffer, 0, bytesRead); +// } +// +// // Close the InputStream +// inputStream.close(); + + // Return the ByteArrayOutputStream as an OutputStream + return inputStream; } else { - throw new IOException("HTTP 请求失败,状态码:" + responseCode); + throw new IOException("HTTP request failed with response code: " + responseCode); } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/LabelDatasetVersion.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/LabelDatasetVersionVo.java similarity index 86% rename from ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/LabelDatasetVersion.java rename to ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/LabelDatasetVersionVo.java index bf223e73..11a2e718 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/LabelDatasetVersion.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/LabelDatasetVersionVo.java @@ -6,10 +6,10 @@ import com.fasterxml.jackson.databind.annotation.JsonNaming; import java.io.Serializable; @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) -public class LabelDatasetVersion implements Serializable { +public class LabelDatasetVersionVo implements Serializable { private String token; private String project_id; - private String dataset_id; + private Integer dataset_id; private String version; private String desc; private String exportType; @@ -29,11 +29,11 @@ public class LabelDatasetVersion implements Serializable { this.project_id = project_id; } - public String getDataset_id() { + public Integer getDataset_id() { return dataset_id; } - public void setDataset_id(String dataset_id) { + public void setDataset_id(Integer dataset_id) { this.dataset_id = dataset_id; } diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/DatasetDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/DatasetDaoMapper.xml index d4bae103..d97f1a3d 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/DatasetDaoMapper.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/DatasetDaoMapper.xml @@ -31,6 +31,7 @@ from dataset where name = #{name} and state = 1 limit 1 + + select id, experiment_id, argo_ins_name, argo_ins_ns, status, nodes_status,nodes_result, nodes_logs,global_param, start_time, finish_time, create_by, create_time, update_by, update_time, state + from experiment_ins + where (status NOT IN ('Terminated', 'Succeeded', 'Failed') + OR status IS NULL) and state = 1 + + + +