From 84c150295c1a4c6176be22b26fbb102e2ce7dfa7 Mon Sep 17 00:00:00 2001 From: fanshuai <1141904845@qq.com> Date: Mon, 8 Apr 2024 16:39:46 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/platform/utils/K8sClientUtil.java | 2 +- .../com/ruoyi/platform/utils/MinioUtil.java | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java index e412cdde..e6386b0e 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java @@ -50,7 +50,7 @@ public class K8sClientUtil { * 3. service-account namespace * 4. master endpoints(ip, port) from pre-set environment variables */ -// @Autowired + @Autowired public K8sClientUtil(@Value("${k8s.http}") String http, @Value("${k8s.token}") String token) { this.http = http; this.token = token; 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 363f1508..ccfc1712 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 @@ -4,10 +4,11 @@ package com.ruoyi.platform.utils; import io.minio.*; import io.minio.errors.MinioException; import io.minio.messages.Item; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Path; @@ -18,27 +19,20 @@ import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; - +@Slf4j @Component public class MinioUtil { - @Value("${minio.endpoint}") - private String minioEndpoint; - - @Value("${minio.accessKey}") - private String minioAccessKey; - - @Value("${minio.secretKey}") - private String minioSecretKey; private MinioClient minioClient; - @PostConstruct - public void init() { + @Autowired + public MinioUtil(@Value("${minio.endpoint}")String minioEndpoint,@Value("${minio.accessKey}")String minioAccessKey,@Value("${minio.secretKey}") String minioSecretKey) { this.minioClient = MinioClient.builder() .endpoint(minioEndpoint) .credentials(minioAccessKey, minioSecretKey) .build(); } + public void createBucket(String bucketName) throws Exception { if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); From d210287cc3db85c12896af2c21d1ce7e1418ae1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Tue, 9 Apr 2024 10:24:00 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=9F=A5=E8=AF=A2=E8=BF=94=E5=9B=9Epath,?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E4=BC=A0=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/DatasetVersionController.java | 2 +- .../model/ModelsVersionController.java | 2 +- .../service/DatasetVersionService.java | 2 +- .../service/ModelsVersionService.java | 2 +- .../service/impl/DatasetServiceImpl.java | 5 +++-- .../impl/DatasetVersionServiceImpl.java | 19 ++++++++++++++++-- .../service/impl/ModelsServiceImpl.java | 5 +++-- .../impl/ModelsVersionServiceImpl.java | 20 +++++++++++++++++-- 8 files changed, 45 insertions(+), 12 deletions(-) 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 302859cc..b0c42144 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 @@ -66,7 +66,7 @@ public class DatasetVersionController extends BaseController { */ @GetMapping("/versions") @ApiOperation("通过数据集id和version查询版本文件列表") - public GenericsAjaxResult> queryByDatasetIdAndVersion(@RequestParam("dataset_id") Integer datasetId, + public GenericsAjaxResult> queryByDatasetIdAndVersion(@RequestParam("dataset_id") Integer datasetId, @RequestParam("version") String version) { return genericsSuccess(this.datasetVersionService.queryByDatasetIdAndVersion(datasetId, version)); } 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 0ce21801..c966e92c 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 @@ -64,7 +64,7 @@ public class ModelsVersionController extends BaseController { * @return 匹配的模型版本记录列表 */ @GetMapping("/versions") - public GenericsAjaxResult> queryByModelsIdAndVersion(@RequestParam("models_id") Integer modelsId, + public GenericsAjaxResult> queryByModelsIdAndVersion(@RequestParam("models_id") Integer modelsId, @RequestParam("version") String version) { return genericsSuccess(this.modelsVersionService.queryByModelsIdAndVersion(modelsId, version)); } 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 e4747d90..5a184925 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 @@ -66,7 +66,7 @@ public interface DatasetVersionService { DatasetVersion queryByDatasetVersion(DatasetVersion datasetVersion); - List queryByDatasetIdAndVersion(Integer datasetId, String version); + Map queryByDatasetIdAndVersion(Integer datasetId, String version); Map deleteDatasetVersion(Integer datasetId, String version); 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 3051e460..6938da95 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 @@ -66,7 +66,7 @@ public interface ModelsVersionService { ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion); - List queryByModelsIdAndVersion(Integer modelsId, String version); + Map queryByModelsIdAndVersion(Integer modelsId, String version); Map deleteModelsVersion(Integer modelsId, String version); 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 ac86a3f4..9512d0e9 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 @@ -210,6 +210,9 @@ public class DatasetServiceImpl implements DatasetService { @Override public List> uploadDataset(MultipartFile[] files) throws Exception { List> results = new ArrayList<>(); + //时间戳统一定在外面,一次上传就定好 + Date createTime = new Date(); + String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); for (MultipartFile file:files){ if (file.isEmpty()) { @@ -222,8 +225,6 @@ public class DatasetServiceImpl implements DatasetService { // 其余操作基于 modelsVersionToUse String username = SecurityUtils.getLoginUser().getUsername(); String fileName = file.getOriginalFilename(); - Date createTime = new Date(); - String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); String objectName = "datasets/" + username + "/" + timestamp + "/" + fileName; // 上传文件到MinIO并将记录新增到数据库中 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 da1e65ba..621262ad 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 @@ -33,6 +33,9 @@ public class DatasetVersionServiceImpl implements DatasetVersionService { @Resource private DatasetVersionDao datasetVersionDao; + // 固定存储桶名 + private final String bucketName = "platform-data"; + /** * 通过ID查询单条数据 * @@ -131,9 +134,21 @@ public class DatasetVersionServiceImpl implements DatasetVersionService { } @Override + public Map queryByDatasetIdAndVersion(Integer datasetId, String version) { + Map response = new HashMap<>(); + + List datasetVersionList = this.datasetVersionDao.queryAllByDatasetVersion(datasetId, version); + datasetVersionList.stream(). + findFirst(). + ifPresent(datasetVersion -> { + String url = datasetVersion.getUrl(); + String path = bucketName + '/' + url.substring(0, url.lastIndexOf('/')); + response.put("path", path); + + }); - public List queryByDatasetIdAndVersion(Integer datasetId, String version) { - return this.datasetVersionDao.queryAllByDatasetVersion(datasetId, version); + response.put("content", datasetVersionList); + return response; } @Override 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 b84c43d4..58d3e1ee 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 @@ -205,6 +205,9 @@ public class ModelsServiceImpl implements ModelsService { public List> uploadModels(MultipartFile[] files) throws Exception { List> results = new ArrayList<>(); + //时间戳统一定在外面,一次上传就定好 + Date createTime = new Date(); + String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); for (MultipartFile file:files){ if (file.isEmpty()) { @@ -217,8 +220,6 @@ public class ModelsServiceImpl implements ModelsService { // 其余操作基于 modelsVersionToUse String username = SecurityUtils.getLoginUser().getUsername(); String fileName = file.getOriginalFilename(); - Date createTime = new Date(); - String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); String objectName = "models/" + username + "/" + timestamp + "/" + fileName; // 上传文件到MinIO并将记录新增到数据库中 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 f1848a86..b060f467 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 @@ -34,6 +34,9 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { @Resource private ModelsDao modelsDao; + // 固定存储桶名 + private final String bucketName = "platform-data"; + /** * 通过ID查询单条数据 * @@ -159,8 +162,21 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { * @return 新的模型版本记录列表 */ @Override - public List queryByModelsIdAndVersion(Integer modelsId, String version) { - return this.modelsVersionDao.queryAllByModelsVersion(modelsId, version) ; + public Map queryByModelsIdAndVersion(Integer modelsId, String version) { + Map response = new HashMap<>(); + + List modelsVersionList = this.modelsVersionDao.queryAllByModelsVersion(modelsId, version); + modelsVersionList.stream(). + findFirst(). + ifPresent(modelsVersion -> { + String url = modelsVersion.getUrl(); + String path = bucketName + '/' + url.substring(0, url.lastIndexOf('/')); + response.put("path", path); + + }); + + response.put("content", modelsVersionList); + return response; } From a00d861ab1f4adc701a188f53f2603ef759775db Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Tue, 9 Apr 2024 11:01:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E5=AE=9E?= =?UTF-8?q?=E9=AA=8C=E5=85=A8=E5=B1=80=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../experimentText/addExperimentModal.less | 8 ++ .../experimentText/addExperimentModal.tsx | 110 +++++++++++++++--- react-ui/src/pages/Experiment/index.jsx | 40 +++---- .../editPipeline/globalParamsDrawer.less | 8 +- .../editPipeline/globalParamsDrawer.tsx | 43 +++++-- .../src/pages/Pipeline/editPipeline/index.jsx | 3 +- react-ui/src/types.ts | 1 - react-ui/src/utils/index.js | 1 + 8 files changed, 159 insertions(+), 55 deletions(-) diff --git a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.less b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.less index a7bb2af8..a92ff9de 100644 --- a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.less +++ b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.less @@ -48,4 +48,12 @@ margin-right: 10px; } } + + .global_param_item { + max-height: 230px; + padding: 20px 12px; + overflow-y: auto; + border: 1px solid #e6e6e6; + border-radius: 6px; + } } diff --git a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx index 89148473..b236566c 100644 --- a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx +++ b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx @@ -1,4 +1,5 @@ -import { Form, Input, Modal, Select } from 'antd'; +import { type PipelineGlobalParam } from '@/types'; +import { Form, Input, Modal, Radio, Select, type FormRule } from 'antd'; import { useState } from 'react'; import styles from './addExperimentModal.less'; @@ -6,6 +7,7 @@ type FormData = { name?: string; description?: string; workflow_id?: string | number; + global_param?: PipelineGlobalParam[]; }; type AddExperimentModalProps = { @@ -17,17 +19,55 @@ type AddExperimentModalProps = { initialValues: FormData; }; -interface GlobalParam { - param_name: string; - param_value: string; -} - interface Workflow { id: string | number; name: string; - global_param?: GlobalParam[] | null; + global_param?: PipelineGlobalParam[] | null; } +// 根据参数设置输入组件 +export const getParamComponent = (paramType: number, isSensitive?: number): JSX.Element => { + // 防止后台返回不是 number 类型 + if (Number(paramType) === 3) { + return ( + + + + + ); + } + if (isSensitive && Number(isSensitive) === 1) { + return ; + } + return ; +}; + +// 根据参数设置校验规则 +export const getParamRules = (paramType: number, required: boolean = false): FormRule[] => { + const rules = []; + // 防止后台返回不是 number 类型 + if (Number(paramType) === 2) { + rules.push({ + pattern: /^-?\d+(\.\d+)?$/, + message: '整型必须是数字', + }); + } + if (required) { + rules.push({ required: true, message: '请输入值' }); + } + return rules; +}; + +// 根据参数设置 label +const getParamType = (param: PipelineGlobalParam): string => { + const paramTypes: Readonly> = { + 1: '字符串', + 2: '整型', + 3: '布尔类型', + }; + return param.param_name + `(${paramTypes[param.param_type]})`; +}; + function AddExperimentModal({ isAdd, open, @@ -38,20 +78,30 @@ function AddExperimentModal({ }: AddExperimentModalProps) { const dialogTitle = isAdd ? '新建实验' : '编辑实验'; const workflowDisabled = isAdd ? false : true; - const [globalParam, setGlobalParam] = useState([]); + const [globalParam, setGlobalParam] = useState( + initialValues.global_param || [], + ); const [form] = Form.useForm(); + + const layout = { + labelCol: { span: 24 }, + wrapperCol: { span: 24 }, + }; + + const tailLayout = { + labelCol: { span: 8 }, + wrapperCol: { span: 16 }, + }; + // 除了流水线选择发生变化 - const handleWorkflowChange = (id: string) => { + const handleWorkflowChange = (id: string | number) => { const pipeline: Workflow | undefined = workflowList.find((v) => v.id === id); if (pipeline && pipeline.global_param) { setGlobalParam(pipeline.global_param); - const fields = pipeline.global_param.reduce((acc, item) => { - acc[item.param_name] = item.param_value; - return acc; - }, {} as Record); - form.setFieldsValue(fields); + form.setFieldValue('global_param', pipeline.global_param); } else { setGlobalParam([]); + form.setFieldValue('global_param', []); } }; return ( @@ -73,11 +123,12 @@ function AddExperimentModal({ >
- {globalParam.map((item) => ( - - + {globalParam.length > 0 && ( + +
+ + {(fields) => + fields.map(({ key, name, ...restField }) => ( + + {getParamComponent( + globalParam[name]['param_type'], + globalParam[name]['is_sensitive'], + )} + + )) + } + +
- ))} + )} ); diff --git a/react-ui/src/pages/Experiment/index.jsx b/react-ui/src/pages/Experiment/index.jsx index ad9703c1..a93eccbc 100644 --- a/react-ui/src/pages/Experiment/index.jsx +++ b/react-ui/src/pages/Experiment/index.jsx @@ -119,22 +119,12 @@ function Experiment() { }; // 创建或者编辑实验接口请求 const handleAddExperiment = async (values) => { - const workflow_id = values['workflow_id']; - let global_param = undefined; - const pipeline = workflowList.find((v) => v.id === workflow_id); - if (pipeline && pipeline.global_param) { - const globalParamList = [...pipeline.global_param]; - for (const item of globalParamList) { - item.param_value = values[item.param_name]; - values[item.param_name] = undefined; - } - global_param = JSON.stringify(globalParamList); - } - const params = { - ...values, - global_param, - }; + const global_param = JSON.stringify(values.global_param); if (!experimentId) { + const params = { + ...values, + global_param, + }; const [res, _] = await to(postExperiment(params)); if (res) { message.success('新建实验成功'); @@ -142,7 +132,7 @@ function Experiment() { getList(); } } else { - const params = { ...values, id: experimentId }; + const params = { ...values, global_param, id: experimentId }; const [res, _] = await to(putExperiment(params)); if (res) { message.success('编辑实验成功'); @@ -431,14 +421,16 @@ function Experiment() { rowExpandable: (record) => true, }} /> - + {isModalOpen && ( + + )} ); } diff --git a/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.less b/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.less index da9461c4..913419c0 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.less +++ b/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.less @@ -8,7 +8,13 @@ top: 5px; right: 0; } -.add_button { +.add_button_form_item { margin-top: 15px; + + &:first-child { + margin-top: 0; + } +} +.add_button_form_item .add_button { padding: 0; } diff --git a/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx b/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx index 513f5e05..fad63da3 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx +++ b/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx @@ -1,7 +1,12 @@ +import { + getParamComponent, + getParamRules, +} from '@/pages/Experiment/experimentText/addExperimentModal'; import { type PipelineGlobalParam } from '@/types'; import { to } from '@/utils/promise'; import { DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import { Button, Drawer, Form, Input, Radio } from 'antd'; +import { NamePath } from 'antd/es/form/interface'; import { forwardRef, useImperativeHandle } from 'react'; import styles from './globalParamsDrawer.less'; @@ -26,6 +31,11 @@ const GlobalParamsDrawer = forwardRef( } }, })); + + const handleTypeChange = (name: NamePath) => { + form.setFieldValue(name, null); + }; + return ( - + handleTypeChange(['global_param', name, 'param_value'])} + > 字符串 整型 布尔类型
+ prev.global_param?.[name]?.param_type !== + cur.global_param?.[name]?.param_type + } > - + {({ getFieldValue }) => ( + + {getParamComponent(getFieldValue(['global_param', name, 'param_type']))} + + )} @@ -111,11 +136,11 @@ const GlobalParamsDrawer = forwardRef( > ))} - +