From c0ae1b1744843c8ce117b25f3448202919bc266d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Wed, 24 Apr 2024 17:30:00 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=B1=BB=E5=88=AB=E4=BB=A5=E5=8F=8ATag?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/platform/domain/Models.java | 26 +++++++++++++++++++ .../service/impl/DatasetServiceImpl.java | 1 - .../service/impl/ModelsServiceImpl.java | 15 ++++++++++- 3 files changed, 40 insertions(+), 2 deletions(-) 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 b79caea6..87eadc37 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 @@ -52,6 +52,16 @@ public class Models implements Serializable { private Integer state; + @ApiModelProperty(value = "模型类型名") + private String modelTypeName; + + + + @ApiModelProperty(value = "模型tag名") + private String modelTagName; + + + public Integer getId() { return id; } @@ -158,5 +168,21 @@ public class Models implements Serializable { this.state = state; } + public String getModelTagName() { + return modelTagName; + } + + public void setModelTagName(String modelTagName) { + this.modelTagName = modelTagName; + } + + public String getModelTypeName() { + return modelTypeName; + } + + public void setModelTypeName(String modelTypeName) { + this.modelTypeName = modelTypeName; + } + } 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 1f27995c..1268fa27 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 @@ -82,7 +82,6 @@ public class DatasetServiceImpl implements DatasetService { */ @Override public Dataset queryById(Integer id) { - Dataset dataset = this.datasetDao.queryById(id); String dataType = dataset.getDataType(); String dataTag = dataset.getDataTag(); 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 653e9b76..e3b65b1f 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,10 +1,12 @@ package com.ruoyi.platform.service.impl; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.platform.domain.AssetIcon; import com.ruoyi.platform.domain.Models; import com.ruoyi.platform.domain.ModelsVersion; import com.ruoyi.platform.mapper.ModelsDao; import com.ruoyi.platform.mapper.ModelsVersionDao; +import com.ruoyi.platform.service.AssetIconService; import com.ruoyi.platform.service.MinioService; import com.ruoyi.platform.service.ModelsService; import com.ruoyi.platform.service.ModelsVersionService; @@ -57,6 +59,9 @@ public class ModelsServiceImpl implements ModelsService { @Resource private MinioService minioService; + @Resource + private AssetIconService assetIconService; + // 固定存储桶名 private final String bucketName = "platform-data"; @@ -72,7 +77,15 @@ public class ModelsServiceImpl implements ModelsService { */ @Override public Models queryById(Integer id) { - return this.modelsDao.queryById(id); + Models models = this.modelsDao.queryById(id); + String dataType = models.getModelType(); + String dataTag = models.getModelTag(); + //去资产管理表中查询对应的图标名 + AssetIcon dataTypeAssetIcon = assetIconService.queryByPath(dataType); + AssetIcon dataTagAssetIcon = assetIconService.queryByPath(dataTag); + models.setModelTypeName(dataTypeAssetIcon.getName()); + models.setModelTagName(dataTagAssetIcon.getName()); + return models; } /** From 7938792424ba6936a44cb2ff5ae5c8dd3105b29a Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Wed, 24 Apr 2024 17:30:10 +0800 Subject: [PATCH 02/13] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dglobal=5Fparam?= =?UTF-8?q?=E4=B8=BAnull=E6=97=B6=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Experiment/experimentText/paramsModal.tsx | 4 +- .../editPipeline/globalParamsDrawer.tsx | 2 +- .../src/pages/Pipeline/editPipeline/index.jsx | 64 ++++++++++++++++--- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/react-ui/src/pages/Experiment/experimentText/paramsModal.tsx b/react-ui/src/pages/Experiment/experimentText/paramsModal.tsx index 9a75c2e8..1bdb0cec 100644 --- a/react-ui/src/pages/Experiment/experimentText/paramsModal.tsx +++ b/react-ui/src/pages/Experiment/experimentText/paramsModal.tsx @@ -12,7 +12,7 @@ import styles from './paramsModal.less'; type ParamsModalProps = { open: boolean; onCancel: () => void; - globalParam?: PipelineGlobalParam[]; + globalParam?: PipelineGlobalParam[] | null; }; function ParamsModal({ open, onCancel, globalParam = [] }: ParamsModalProps) { @@ -26,7 +26,7 @@ function ParamsModal({ open, onCancel, globalParam = [] }: ParamsModalProps) { cancelButtonProps={{ style: { display: 'none' } }} >
- {globalParam.map((item) => ( + {globalParam?.map((item) => (
{getParamType(item)} {item.param_value} diff --git a/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx b/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx index 82532a06..7ab95f5d 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx +++ b/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx @@ -14,7 +14,7 @@ import styles from './globalParamsDrawer.less'; type GlobalParamsDrawerProps = { open: boolean; onClose: () => void; - globalParam: PipelineGlobalParam[]; + globalParam: PipelineGlobalParam[] | null; }; const GlobalParamsDrawer = forwardRef( diff --git a/react-ui/src/pages/Pipeline/editPipeline/index.jsx b/react-ui/src/pages/Pipeline/editPipeline/index.jsx index 948cd364..af9e604c 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/index.jsx +++ b/react-ui/src/pages/Pipeline/editPipeline/index.jsx @@ -281,7 +281,7 @@ const EditPipeline = () => { const getFirstWorkflow = (val) => { getWorkflowById(val).then((ret) => { if (ret && ret.data) { - setGlobalParam(ret.data.global_param); + setGlobalParam(ret.data.global_param || []); } if (graph && ret.data && ret.data.dag) { getGraphData(JSON.parse(ret.data.dag)); @@ -393,6 +393,8 @@ const EditPipeline = () => { // 上下各3,左右各1 [0.5, 0], [0.5, 1], + [0, 0.5], + [1, 0.5], ] ); }, @@ -456,6 +458,7 @@ const EditPipeline = () => { anchorPointIdx: i, // flag the idx of the anchor-point circle links: 0, // cache the number of edges connected to this shape visible: false, // invisible by default, shows up when links > 1 or the node is in showAnchors state + draggable: true, }); }); return image; @@ -503,7 +506,7 @@ const EditPipeline = () => { // config the shouldBegin and shouldEnd to make sure the create-edge is began and ended at anchor-point circles { type: 'create-edge', - // trigger: 'drag', + trigger: 'drag', shouldBegin: (e) => { // avoid beginning at other shapes on the node if (e.target && e.target.get('name') !== 'anchor-point') return false; @@ -619,16 +622,24 @@ const EditPipeline = () => { fitView: true, fitViewPadding: [320, 320, 220, 320], }); - graph.on('dblclick', (e) => { - console.log(e.item); - if (e.item) { - graph.setItemState(e.item, 'nodeClicked', true); - handlerClick(e); + // graph.on('dblclick', (e) => { + // console.log(e.item); + // if (e.item) { + // graph.setItemState(e.item, 'nodeClicked', true); + // handlerClick(e); + // } + // }); + graph.on('node:click', (e) => { + console.log(e.target.get('name')); + if (e.target.get('name') === 'anchor-point') { + // create edge + } else { + if (e.item) { + graph.setItemState(e.item, 'nodeClicked', true); + handlerClick(e); + } } }); - graph.on('click', (e) => { - console.log(e.item); - }); graph.on('aftercreateedge', (e) => { // update the sourceAnchor and targetAnchor for the newly added edge graph.updateItem(e.edge, { @@ -666,6 +677,39 @@ const EditPipeline = () => { }, }); }); + graph.on('node:dragenter', (e) => { + console.log(e.target.get('name')); + console.log('node:dragenter'); + graph.setItemState(e.item, 'nodeSelected', true); + graph.updateItem(e.item, { + // 节点的样式 + style: { + stroke: '#1664ff', + }, + }); + }); + graph.on('node:dragleave', (e) => { + console.log(e.target.get('name')); + console.log('node:dragleave'); + graph.setItemState(e.item, 'nodeSelected', false); + graph.updateItem(e.item, { + // 节点的样式 + style: { + stroke: 'transparent', + }, + }); + }); + graph.on('node:dragstart', (e) => { + console.log('node:dragstart'); + graph.setItemState(e.item, 'nodeSelected', true); + graph.updateItem(e.item, { + // 节点的样式 + style: { + stroke: '#1664ff', + }, + }); + }); + graph.on('afterremoveitem', (e) => { if (e.item && e.item.source && e.item.target) { const sourceNode = graph.findById(e.item.source); From 3eadc4611df28be4496690a56f5d64e719382e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Wed, 24 Apr 2024 17:35:14 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/platform/service/DatasetService.java | 2 +- .../java/com/ruoyi/platform/service/ModelsService.java | 2 +- .../platform/service/impl/DatasetServiceImpl.java | 8 ++++---- .../ruoyi/platform/service/impl/ModelsServiceImpl.java | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java index 1ab61c27..0f8cc707 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java @@ -68,7 +68,7 @@ DatasetService { */ boolean deleteById(Integer id); - String removeById(Integer id); + String removeById(Integer id) throws Exception; ResponseEntity downloadDataset(Integer id) 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 71f94cb1..c2522728 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 @@ -64,7 +64,7 @@ public interface ModelsService { */ boolean deleteById(Integer id); - String removeById(Integer id); + String removeById(Integer id) throws Exception; ResponseEntity downloadModels(Integer id) 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 1268fa27..c919b583 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 @@ -160,10 +160,10 @@ public class DatasetServiceImpl implements DatasetService { } @Override - public String removeById(Integer id) { + public String removeById(Integer id) throws Exception { Dataset dataset = this.datasetDao.queryById(id); if (dataset == null){ - return "数据集不存在"; + throw new Exception("数据集不存在"); } //判断权限,只有admin和创建者本身可以删除该数据集 @@ -171,10 +171,10 @@ public class DatasetServiceImpl implements DatasetService { String username = loginUser.getUsername(); String createdBy = dataset.getCreateBy(); if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ - return "无权限删除该数据集版本"; + throw new Exception("无权限删除该数据集"); } if (datasetVersionService.queryByDatasetId(id).size()>0){ - return "请先删除该数据集的版本文件"; + throw new Exception("请先删除该数据集下的版本文件"); } dataset.setState(0); 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 e3b65b1f..39ca7f31 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 @@ -150,23 +150,23 @@ public class ModelsServiceImpl implements ModelsService { } @Override - public String removeById(Integer id) { + public String removeById(Integer id) throws Exception { Models models = this.modelsDao.queryById(id); if (models == null){ - return "模型不存在"; + throw new Exception("模型不存在"); } - //判断权限,只有admin和创建者本身可以删除该数据集 + //判断权限,只有admin和创建者本身可以删除该模型 LoginUser loginUser = SecurityUtils.getLoginUser(); String username = loginUser.getUsername(); String createdBy = models.getCreateBy(); if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ - return "无权限删除该模型"; + throw new Exception("无权限删除该模型"); } if (modelsVersionService.queryByModelsId(id).size()>0){ - return "请先删除该模型的版本文件"; + throw new Exception("请先删除该镜像下的版本文件"); } models.setState(0); return this.modelsDao.update(models)>0?"删除成功":"删除失败"; From 3ca9b491cef2ca2616229df0611819ce8a227da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Thu, 25 Apr 2024 08:51:24 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/platform/controller/dataset/DatasetController.java | 2 +- .../com/ruoyi/platform/controller/model/ModelsController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java index 0f8c6700..cbd87f41 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java @@ -158,7 +158,7 @@ public class DatasetController { */ @DeleteMapping({"{id}"}) @ApiOperation("根据id删除数据集") - public AjaxResult deleteById(@PathVariable("id") Integer id) { + public AjaxResult deleteById(@PathVariable("id") Integer id) throws Exception { return AjaxResult.success(this.datasetService.removeById(id)); } 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 7d372bf4..c754c673 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 @@ -161,7 +161,7 @@ public class ModelsController extends BaseController { */ @DeleteMapping("{id}") @ApiOperation("删除模型") - public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) { + public GenericsAjaxResult deleteById(@PathVariable("id") Integer id) throws Exception { return genericsSuccess(this.modelsService.removeById(id)); } From 4065c42374905b323a937377ae9ab5f05d6ee297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Fri, 26 Apr 2024 09:33:57 +0800 Subject: [PATCH 05/13] =?UTF-8?q?type=E3=80=81tag=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DatasetServiceImpl.java | 27 +++++++++++++------ .../service/impl/ModelsServiceImpl.java | 24 ++++++++++------- 2 files changed, 34 insertions(+), 17 deletions(-) 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 c919b583..0120caea 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 @@ -83,15 +83,26 @@ public class DatasetServiceImpl implements DatasetService { @Override public Dataset queryById(Integer id) { Dataset dataset = this.datasetDao.queryById(id); - String dataType = dataset.getDataType(); - String dataTag = dataset.getDataTag(); - //去资产管理表中查询对应的图标名 - AssetIcon dataTypeAssetIcon = assetIconService.queryByPath(dataType); - AssetIcon dataTagAssetIcon = assetIconService.queryByPath(dataTag); - dataset.setDatasetTypeName(dataTypeAssetIcon.getName()); - dataset.setDatasetTagName(dataTagAssetIcon.getName()); - return dataset; + if (dataset != null) { + String dataType = dataset.getDataType(); + String dataTag = dataset.getDataTag(); + + // 判空逻辑,只有当dataType和dataTag不为空时,才进行查询 + if (dataType != null && !dataType.isEmpty()) { + AssetIcon dataTypeAssetIcon = assetIconService.queryById(Integer.valueOf(dataType)); + if (dataTypeAssetIcon != null) { + dataset.setDatasetTypeName(dataTypeAssetIcon.getName()); + } + } + if (dataTag != null && !dataTag.isEmpty()) { + AssetIcon dataTagAssetIcon = assetIconService.queryById(Integer.valueOf(dataTag)); + if (dataTagAssetIcon != null) { + dataset.setDatasetTagName(dataTagAssetIcon.getName()); + } + } + } + return dataset; } /** 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 39ca7f31..14b1e470 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 @@ -78,13 +78,21 @@ public class ModelsServiceImpl implements ModelsService { @Override public Models queryById(Integer id) { Models models = this.modelsDao.queryById(id); - String dataType = models.getModelType(); - String dataTag = models.getModelTag(); - //去资产管理表中查询对应的图标名 - AssetIcon dataTypeAssetIcon = assetIconService.queryByPath(dataType); - AssetIcon dataTagAssetIcon = assetIconService.queryByPath(dataTag); - models.setModelTypeName(dataTypeAssetIcon.getName()); - models.setModelTagName(dataTagAssetIcon.getName()); + String modelType = models.getModelType(); + String modelTag = models.getModelTag(); + //去资产管理表中查询对应的图标名,注意判空逻辑,只有当dataType和dataTag不为空时,才进行查询 + if(modelType != null && !modelType.isEmpty()){ + AssetIcon modelTypeAssetIcon = assetIconService.queryById(Integer.valueOf(modelType)); + if (modelTypeAssetIcon != null){ + models.setModelTypeName(modelTypeAssetIcon.getName()); + } + } + if(modelTag != null && !modelTag.isEmpty()){ + AssetIcon modelTagAssetIcon = assetIconService.queryById(Integer.valueOf(modelTag)); + if (modelTagAssetIcon != null){ + models.setModelTagName(modelTagAssetIcon.getName()); + } + } return models; } @@ -220,7 +228,6 @@ public class ModelsServiceImpl implements ModelsService { */ @Override public List> uploadModels(MultipartFile[] files, String uuid) throws Exception { - List> results = new ArrayList<>(); for (MultipartFile file:files) { // 构建objectName @@ -245,7 +252,6 @@ public class ModelsServiceImpl implements ModelsService { ModelsVersion version = modelsVersionService.queryByModelsVersion(modelsVersion); - String url = ""; if (version == null) { //插表,因为这里是一次直接插表所以这里定掉date,然后用DAO插入 From 21007ce0389d259a710029e63811fd99b4d08dfe Mon Sep 17 00:00:00 2001 From: liu2592603532 <2592603532@qq.com> Date: Fri, 26 Apr 2024 13:50:01 +0800 Subject: [PATCH 06/13] merge --- react-ui/src/assets/img/delete-icon.png | Bin 0 -> 3295 bytes react-ui/src/assets/img/more-back.png | Bin 0 -> 12881 bytes react-ui/src/pages/Dataset/datasetIntro.jsx | 4 +- react-ui/src/pages/Dataset/index.less | 5 + react-ui/src/pages/Dataset/personalData.jsx | 33 ++++- react-ui/src/pages/Dataset/publicData.jsx | 26 +++- .../Experiment/experimentText/index.less | 25 ++++ .../pages/Experiment/experimentText/props.jsx | 9 +- react-ui/src/pages/Model/index.less | 5 + react-ui/src/pages/Model/modelIntro.jsx | 4 +- react-ui/src/pages/Model/personalData.jsx | 117 +++++++++++++++--- react-ui/src/pages/Model/publicData.jsx | 35 +++++- react-ui/src/services/dataset/index.js | 12 ++ 13 files changed, 247 insertions(+), 28 deletions(-) create mode 100644 react-ui/src/assets/img/delete-icon.png create mode 100644 react-ui/src/assets/img/more-back.png diff --git a/react-ui/src/assets/img/delete-icon.png b/react-ui/src/assets/img/delete-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..335b2c7f3a0eec61056073e598fcf2ecf1884a30 GIT binary patch literal 3295 zcmeHKX*Ane8%NWif?yDPA_*-Gp=xP0#F{@fDy3DK+O>AIyj4<)w3g{2GS(6;^Pjd_ zOBq_k)=KSb7_EI@Qc9}^#qeg{^M06*^X2{Uo--freeSvEd4Bgfzx$l~{BFv*@2y3T z$RFY3;}Zo)7G$1n`*R3Ed2@+#X+F>Jhm)<%_)2>exqN)E9KeF;c*FG*Gw7L*k6hx~ zHwna*?_6$GHud#azU8QPAk!)e?@6LTP+Swe(o86ZJ6=;&)zv5j(Ab~xhaFJTZ@!@= zVv;>iH6OKP!1r@tnjft{MUL%u`LTM91IBwMV^-h_ z5adg2ywb}et0^pF!tmhhkN!@h($Qx*&5TXk+InVs{|g~^`l*;Nmw@+!$DB$!N*EL8 zOGYe2Jm`CGvmOnp&vizSr{h4`>*Od^OC3^h!CG3x^-_z)kLwQ0V?A3Hc9C(!y*u?J zPE|wQ#d$3tYpb?3sNw`{MtjbV(X%yQuhH4Qd(H&9d8F`D51vHvOlmQ~a*w)Au-4x( z@>gQY(32?W7n#r9jMd-4fb&eOU+>5!furOF51D=-H*7!q6nmyO_hY3Kg6(z?!??b) z?wau$h>k3yj;Wn)M(&$sYC}6^Z+m?p7@h_iLt%oaD!tgq8tEE0j$e%=^F^a3cYwL( zle@}Co0GlXHVK;O?3ONk*!%7&g`YNfX}93=U8j2v4eYv#o{cAz!?Z!l?s{&?PYbtP zUCIJq*v!icQn4A02mLnfQyCDv(0%^+W_S~_QjoVk!^fY>Cp;5seo{gJ;jJptt#?KM z!JbX@SB2o)EMy+~MMLn(t)jnK@EA@xt~anD0iW*PP z$JtttBk@YhUGQI^GUnF_Mk&|+_Jw(6lH8$qTbH{80h`z*j9ylY2gN5aR ztwadFP$1mUmGejjdQ99yOWf-UjSrHK`s@L`*M?P4IIXBde|l6mWP5wim#?Ul6OJef znYz=O>@kbj9c#iiMUn{j*HOpj&mj2O!)*9Ag-4hOvm;DCUUV%L8OqW=_Ebk z()7z=q;=Q+mq$(UO>E(GTl*eoyz{==AL-x9sP;@l%o7tkf%%8U>;3*-qaQur*1ZH~&`HB2g%(6wg7g zQZIC{WXDT>pgNb<@AO_ctV*js?Yg9^&8qXiaJzNu>P2_OoprN8j%Lr0pLnFpO@iN6 z&`Si{FDuj^pIjb{V8`i`g`qk!Vl+gbmBt%n%Ucilp%D@m!FD!;d73H|L1+k(BqGcg zo#77mn#L#d2Z53>&*O?voyYeb6NvZjG$WyvX*N8tYkv>Sz?)Y0uh_D)HRUUo3}t$y z8;8b-4e6>1XkVB;6CHbxiXA`3HGO|N*?6duQXJPct zoDrimbK@7>j|UE%Uw)KSN*q}W*qT= z)jA&>j3enRN6@2HUS`vJopcv2+mZ=p%)!DBIgHf+orZr@v@2OAAm&K$L-N8i zL^LsMj6_##B-tfc+`h19BJ633=DA}?4-|wMv$911JsB?S33tIwQ|bOk4-Q1nOLqpR z%g=h2%$O!b^eZL#GmucX9^Mt_(Qfn^3bu#x5cgD13QJ1ND6)}kBND2Qn>EgqQSloK z7bADSxG$21yzihS-)8h@F_@(PCC5B)u{xBI|KC&9xlq*i93!A?NWaF6mya8$MpQM! zBomV%DB|-fyHfaH6I3OV=>9=JX<8)AZCm5VuKiNzi3_eHcp0iG&g8??FS6SXv>Y&Z^9XWbfP;Wu~eiz z6%)fgx(5Iz_=rpGJY`|~K#>ZRt(PAg>98IS>slVcClh0j+P%8Dw3Z%mAC$V##eL6cs9TtGCKQWcF5|e{ z(yde$*lRlyQfzO>YbL&8zaf1ztZg(@fDZdbuPf^8TiFJ~Kerg~(gO(-KVLnz{TQrg zD6e@fif+aeGQ{?1H=3qNx^Q2N&wS&ZsyC6%-`X&=h#cmW-iqpo9bL&2n#7w3ZvoXN68|xQs zPZ>lxXLYSE?YUO8c+AHj=H3qf(Pt20B)1-9t;%SFd>jh}^NP7(F@UN7o%bfsL^y*Q~^e3Uop`UaWOcYC9$ahKGXax?J=^ z>eN93C|i6-;Ixu_JVR!F9aMN9<8F>`OL)_X&A6DvL~*MY{@`C;Xy1L1=TS*j~;xKbYsI@zYQK0dR7Yk a+2j>+U~|&e`z!Cq!UtG>Z&7OIp73un2dnM? literal 0 HcmV?d00001 diff --git a/react-ui/src/assets/img/more-back.png b/react-ui/src/assets/img/more-back.png new file mode 100644 index 0000000000000000000000000000000000000000..b9956ef55fced431b477ffbbf589c244e6d31fdb GIT binary patch literal 12881 zcmYj&c|26@`#;AV%P5o?>amv8*tJ=*O(7++FWIAPS;j8gI8RR~F-6H1gNm#pVk~hg zQnFT}EX_k9vW4v9cTb1Tv?ZZXq478b@_GU^X?WU*3D^zzPd-4n<&KU;n5*qa~S z?FkvoZmW&A8i*pm7yGJ&f=H{M%YG|)siFWSynDdyOi1 zL(2V&ysO*)%I1~;y?njla@yH}S_n&^5+@)sZ>jxOYjfLXz}(fKH=Enhkx6w@)(535{{g(HF*3H7S5O4ee3NEab^rkFF+{hoHHkXelr|T%fO?;bAM#}y0 zkkI72T&@7=sMINcH;-&N@A9!P!=tN&>r<2Vh^G|yh`v)n0b0bd&q?~mY{H<(0j;Y{;GfL*h)3Aiw zxu_O${{;D?Hmx$>A2*#VI$X1s^d+(`5A1k5m*^lyS(m~tCjB~Bv3$$*c`D(P4&Ua( zx!zvY&x3OBv+oRc)9-wqxc~0APrutz+wMQHv6e{Ab~aOf zDEMo1>Sn|c(~pHsbNm1`Q)BezRZXGGS!dPT{&B($t>|ZfRRy#i`Bo)9u;X# zZi8yAbbh_wT<9FK4V3F~=4<4$)u`pTcSgIC`s&}l{J-YKET{IrcE%k3XivTL5w5tU-uej1L%+|$JqsC%3&s+xWKAmzX^q$M=sY9m=nSb$AJ1xwc4vb;_Ne9ho?;AkwUUyeS=G4O=-?0W2C z8!r6l$nuakGl6_?&|I-+rM$_Z>`rOSUL@Cf_;<|ty+1M^fs1sI9KW@CQFUBkkOq&| zEz$F1UeI10I|1Vedgz+e0}e5p_ioGtx#_phaJ)USb1bR?gLahH^dyRz&0$CR^vdM*4!$`fBBqhxsODM6$^Ir-%RS z3@u0bV^!Ij(mEGUvBUMags`61V=4=cR0U&%j(w^`ipcy|- zRor6n`q=anmxt!mw#bgLSCx*kwAXbHiJO`D>+89}=0Jz;@-!I|j<#^Ct#ZQ;!v~GL z?=(%$kA<%D`dsLfpvVsGi(evhH11MUxqiu<&{II5jB4Htw%3M)t@YP!ew}@5^v5I` ztZlmHj?(BmJWe3pmNp+M9+Zo$ScC5i;S<{O@|m>n(j-?a@{aX;KDtUh&mU=3@V9RI z_?2lNScuB|17{0KYxb{&oqRJ_OrZtMh@oH1g_HW1m4PAG$JSOC#$fJKwu_6IYFE~b zH$J--!S%J(D?!>z$EOU6`P<3A@v&pFRH6zrZCzXKf6w^z!KZi8e^KUc7C9<#ho6h& zP2dSx@Yi)5^hsc?JrwL-yT^N|cu#j+cCTx0=%ZNZGLMfleu7^?Zf3M9sXzSnOi_SU z%VU6kqx}qpnbe|3&D|5RTd{KSciVfgOSTtPb9U11$k^E&K%qh~!uQ#>eA}3E{jo!EhPgi&qHjC zTl{M;u1H2;I-_N<^@M*kezG+`EZ8$S-_Aa#ra!t8%EEsO2F$TvCSDL0yPL`l1?v#D|&%?h#64xp5dpP=n)Im zX&KmwFN)NzJ>&@7G|slLzD%ogGO6Al>B>DjS5MqNNIUtpJvp~Jw!-Dy`uyHTNRZb- z$1Y=I?$F4f7(Uj6Jy#GI=FQ!8NJvjR@v>3e!O|W(2^x5I30t0`k$t4;Y?T6VXD7fU5!?LC(XyUcy z?4e>Yq?Ti&=0o4j=N-jF%H>J7N4{B*BabNG&#!$h$ps*Q+GQ)Yx}U~0im0`Kg#fDN zJ4_{`k!P{1FBF(w7F0RJ_RxfzFTYA6v~?Uk?91g%#(or7o#=HGk*KJAkOd+fWjJcA zO__3z$4s4kmvp!Dum=)es!~oJ#7&wr+R!vKY*4g%2HINa>!Vl=?s(q>z)iAP-gjdH z>kDWu4V8;sd4zx3>wbW-d8hZqv3sMKsM$uku6EHs-Q_}Jz6wPuyh{x>t!t_FiCxJ! zPsRDY&LzE~om#lb3oZrTOggzcKrQMsh_fzBkgH5A(21@OntpZq(cJToYf`+ch!n2x z&i&RdzY94IYTNcNH1B>2 zlod(n$%tJv@c790kSN8vGVzLMGRk^LNl7CAw*Py^W0{^g4u@m)S_`=c#fG+UlSJyW zjYP0Ol`i3S11eQgB2oS&XXDO!4V?)}H6^!qLWU+q3e0(uVRag^P*6KzjKu7rIiJ4$ zIHdx87dy6S+}(jYbDnX)rSMz63S&2%tz)P;HLhuiY*^{cmaBebOFD-bGFDJ`6rY-4 zWJlG(tNEv}4;vujnDQsu2b!lY`ovoj5j;G4{6MaNKB5OqWVgC$+=YK){kI6C${wlT z+G2%GQaT^P5x5Dnhl98?`i!p#hdIwDHT)Y(h7-VF+ojB0ukSJdXcGa)OR6y{PsS+? zkMK3ULW;`04ZVkCdd6yg)1MDNCK`fZ59rK9#?#G8@+eZv#^s)t`s14tSh{^!<<-Bu zEz>1A8k@>VrU)L>WY;IL{h{TN7b4F4vh^jYl9+9be8jl+bqhZds$P)2eFNoWq5tUH zwqxzPNle0Yc-9OJ6B?k9cTr5B!0Uj3f0=sYTXAFFCAZlAV|!6w{GN2Q3bD=T2fR3p zZ4?f_T&sH`6Dq^1k*nLiJg^^y=no@&t!BiAOc8dTP0WD6s@HIOCT^0Sy=kW=)o;SD z5M_f$g`UiC?YX~C=5`fYkE$9pOID-=rHrRN2lxIvegMNopox*z*~X3>fHS!pc@p&b zt~@&kuZv^_J6s7?HK$4-3I^TRqVjU{#H^70a59^d^QG~F53;~=KZB1^af$-1S8+d7 zU~?h*t^v>BL+eV@2h3`T%@dv%|K&&Em21zf#>aGq9P>09@;Lw zchS^^3RSwFbv zHe6m@p8vJR@^%PziL%i+dz(^KX}pgF2~hk8aHiB~#J1r;d5+H0t@0T&WCR#Mgbs%D zb|ul_IOSQzsBFD4GKBffmi*u`k-TGmdC0QE08xhmlF7QeK;Gl%62_o^ihQOE$4N0Z z4`;hwJaCn#C1_${v(6Y1g-1vAODCH=?Psy;c_>r8Jv|k=hh9WQK7v^66WqlQ$=F~5?J(&={FwS(D4H9@TbgGPrY0jbTJL8%Hdvm< zL9%OeJCO~k^R_&&3E)Zthl59DzupftdB2I9G?kq78LD`-AZmzcV@9p6Y^&MvPCvfR z={$vvXgvL`^}k=4H*;xAZVOg}1BK{&2IMC&oyLG8JY6J?1AXF=2KKM;C%;Fk8fGp7 zP$V?xZBE^G42j$*e%1AE66dMU_%x-mBJu2f)&qiR4SKMtiS|>FO8Z$+Ar3Dce)5v9 z@kf`Q_wSwvjPjN*LV7khU`ovllh7R-wO8P{ zgMhq$z=ne1 z5b3Pf*{ljk0o(HTg@p*wEJ&JX$YFS#Ihc~7VguU=C1~uWc-NUUSh!3=s+NhZ!z!vh z*UPERuV9n782Kds)6n6=jiG;nBWdmyxBZoqH;j?@n9-V{ZGwW=q7@ZXB2pJ_DE#)Y z!9LtSpWka|TPSZsZELtPCRW1|f&L|^xmwq+NrAV;gWx3MYC%1Q2qKP#=e|VYJc*6($%Nn1lH4AW)CqF-)Xe4ZJ($X)hb&a2&P+LBaS8%D zJ~Iy0v2X7y&YzHMGWZOzlY#cr7r7L(phwu2mBNPE{Ta?wXHFl7;#*hc*c=W=cU>Gs#)*iYY#0KxDtxvvuW1_M5?Md98a*B&z``su0tYMulTQX_3n5qv?@JsW3l4Og}p0HJ5I8`Ad^)F$?-(FEvbihoPyWW zQ1!oMsBDAD<@sbgE*Mv&Kocef&y)?DB2jP-n?s6!g!^OSG!)O~@AKS7!%|WU+2Clt zL7Q+osly#^5mC3N5-Q^rW&hb9Q4v~1Y=S&Ey4zK?j#^M_&@ANI75|wyEMfk#WX!-* z8Pj^=knyk2Yw-GYG}Z9_VKQ7?B5__Q2aEkEOy5a2*yt zbHMNZ@5jWaP=M-NG2wS$+h(oL!8;s~-|)B+b%4qJyND&x5@Y(CmyyDxCjYiE89b#)xY`7-^ih^?U5qtz%KJY#s|3J$aKQ?hE ze~VgkDmU@~No|AITTyrYhrTJ`&tQ8CQCeWxr!b5S;IbKcv)rV)W1lr%I6}oOlZ7Z7z zNNfPFTH_MzhsLb+fkNfwY0{)*HSkgjYt?nIN|a4hJ_W*-O3oWFa=@xlQstTK|E$s< zb*+^6vx=eNqjeN#YYTGkqq@i=IEo{|BLU*&Eycs@Cl{3KPqDs8+?g*qbW1rwR z;rm~L;o`;qm2GryKKc@}*F%`+T}-Znccg(mKMyt|BKp8HYO4Q#-)@36?GAuM|Ex;` zp(mQF-Xjidw5n*|y#r2Tr7SzlfD}PQ4|g~#xG2Bf+ZJ`X$f zkR()Xs0V=CPD!q*Q`tpgdggzxk;ZOz^nXqZALy)$L&d=wzHs-Xq+vZkklOq{R(9{l zOaABT?e2o8$1HyE(jkFWt$Fgnfo@0K8%LLIpnm+7h2rBtE2RX13fn}R@4(r+Tm&Zu z^8GiZatS~p*=l(n#zMSU(cSQREn>j>1z3L@Y@{iNvjv5KSAu%Tb=J{=S{)b&s)PXu zh2asPQ2yBX|Gd5_5KdPFnk{18RXorFuorg%jgIOfBJiKrwQ=xzH`2#idk^Cmz%JO0 z{ZlZU$C&+}Ov1MObaP3dP*X-Vp=Vo!exJy?EmXn*ZK*m1zz2jl`G5Lvg~jJ!jkusB?+be53}4cp_+o%lBXMGv*dWqH>5 z-T*L`77qz32a$`J!CPNL{JhYLIi>Mx|1SENP?+%A6W#AB(pdT%lN$!Z*;#-Ej`ao( zrU2_SJn?1xizTW*nt8J>`YaSCzkA|Jpy7YM-T#gC*8dU-hd))Ml)<~Qj4PiEwSJ8| z8ZeUkOC5LkSbJQlHKQsc=VA}x(yD&Q_JE3I!Hu-RG>~wbz3)}&e+;d#`CX|`9h5Uo zK==Iz1^ali9z(_~6!cx09R!EJ?=Vob42w!F5;VUq&l)yK-|X6 zZ+@>?YL+vlqEAp>Y{%eTe32a3z@~l15Rf2YCLzn;0?B3P_x`g{EDLTdmLWcUTtu`$ z1Y;euX21Q$;#flUyin;o4Rn@7AEFZxk=S_Q^jaA?S~d&T&4L3#bqZT^SR8@0gJy$V z&3X!jfE$}KtaJ1NYaWROEc(jMD=>PE!vZ5=tiXUGcIjHID*kqUA$wTED85+E%Zgo?C$;?RhAt;`n|s*z!2tOeNU zJr;Ay;B4(cK6mKOAM1UVPo&tCww45fG8S0V=&Im!&kc~=b+`u8waWmo4%l)2A&Y)F zV(A}PB}TH)suZc4&|||9Q+^BB&jEpw#F6|&05w^f3h9A1mcZEjSDi}KMJCvDedv@d zIgok&p)!L+NDCYC#~}z@udCRe_hEe(*w_u0S^dY2&>C4$>pTB(AuLXs^cU?Fok(HP zUf6$@)z-8r+*AQpV8^29{lI5Avewb z`gBweiGa#m?7QEVwF4F*OxR}q2!@(?qfh9pbeXt#FunyKO-iKj81>9Mpj!5mOZ4!< z$ZQc&owcZ|QsqMg*abKnL!=7vcngY^VLU#X>qb$)>G*SG%OnFICk-M@FD;@(3c?%PIUzhL44Jf_@J+R#<^W&#DJW15ehn=YKeN5l|Csm# zT5#*LIA@?thP|;vVykYQzQaZ!=AX5F5gmiX^sH{DNB$l!M2|p~Y7X+hSjdQg6qhW3 z9)AgkA0?5PUYU8I2Dp0g_9wy&Apj{uy1SHmYB61BH4neCq3&cCUiH%L)i&Hcz^hjO z@SjdAL?4sG*5YUj?y%^PfX&XYwk&Tfc?Ed>ge+&Oj=-w^C$Fq*;Hg14X3ly>WOtEb z1WMxw4vhP#Gv3c-9eWI)P!i{HeE97Q{*4hsq@eqS+iUesXYT1Ek|WLT7F0__?sSFC zAnoI~PJ2WK6Qk)A9eh)J$O^d&kA^(!HdbeMv!QY!eMs(a<#JtFkg?&Db+s-e1~PM5Ei#B{>$~NyMA|W*`I&!= z8+6)S%6j#aCFHHCZRAa+i>|6N?5;#pBn|(J55T}r1#Kl(&xc;fxDC|7ioQP%ek=nB z%R!TaD#VKmh!-Inh?1GL2tw$w=GN2Gcuu!^>_2E<&PEP5)<{|)H;1c=zXI$bF2eKv$CIC)B%aXSZC@8)&I>r#z@?1nJB_8$TI1{)1_$cL(|V-{yTi=In9+dB>h9=D$EDw4t#yUhU!d$q zu`Pc1J^AQ9G%IdT`eB*d>A?70xjIONLIXmpOCO&PAP_bRmoOOpCrM;%R@x#>JoER= zFLhY3GZxUxAay`L0^6|={BrUX)NfN;`!&b3Bd!=Vg+tlSi+Ph?KLSFpUkN!z$+Ew#W?&|4kW|VvQoKajvcVYr<=O; zuDO9kf8@IOoL;RApwo5Ks_u|i3`pl0o4xyLbe9hb@b35P8Jy%R1@&-|jW-u_xIUFy z3)luSZ9xs$sf)b^XNlZ`yTr#w;E_U*<4dkhG3qS>722t zd}G7`PRrIwlj{lNN`7bcx)I0b#J=e)4N|cGRxe2|5CvA0ur-P+0QRvk{4-kpfGZzX zen0KoW~Bono_IX!Rakyx;AL6T@?@Wy2vmC+)bM0_3PBUxKiT?Q^rhUBYBdn(dMeMS z>|OS)#okpU`Ahn-JCy`;FLs-|d|q>_gS0H2;6{ye;;FKZj1W}AkVRAOgn2v0o4vpN z`>{*XfcIWDafUenhZzofkI=7Ut-mm74|Jw*lO>imy%J_QxqCh2Np2y_n>KqVJiW0? z3iGj3vg?`AT%)VlY69tt=f&P|=PD2p%X}%yT(7y<)}ny(A>Q7 z7xvPA(@18KJvIIvKuHE$#_7+HKi6*smN`sXGPoJb50WQcupOrv*U>}nAD%szrJ@j2 z$T28WK;(p;O;A87@EX`T;CRbpVlmWQQJ&+RBt>Hv05!}n-Sf%C zs3ic)p>clT%!8E#T00kp`KJ@G)%$zGnVxo3gS$#xBVP^aq4~sGsC;OothPW#*%@u1 zX&wR{f6i5-;uj*d&|dEB!x1xIf{wmFC%x@jXoME>RZ$uD}Mk#_40$dp~n9t5#c z(-%D1P)k9g3LGb^+_!ny7ZE22TXlQv#J{1pPgAjx=gJVBtcqf$vRbxYc5l-@Cp3^;eLE8t9vq_ zK`1xnB!cj4vJHr?_M)RlL}A=&6*?Fj9$jvXfUdHs)?df_HhWJ431ZH~1$*y#x0a-@i7JP!VKQ%55$1Bp?^N$)Wil9JA0B&Sg@*{k2}lCAg$4P-6J!-r0p8a z=(SxEtn$LceWY2>-rmB(UBzbZimc{uN6;}XIB=J3iQS?7tcI9BLU$Q%Z+)S{8?196 zI#(!J0t&eD_GmF#7IgExxP6Y6v1EVTrh)`+nldzXSVv+RLQPK_hB1a^--lx zH_Zwya~Ab!AoBa_9Jufx=&ZD0?Y)*Y4-iQmgOeo`I-Z@&%o7P2WmQ5AHMu~{bctQ! znZnxSN>=2wFqelJmFtc~N{q?f-3I>4pHg#C-&}++Qk%o?=aFtOVNGV3cE{|LgZ#}XR!$GnIt>tH+-V!A=P+WA& zIP?=(StV3MhU50lTQLG&akmnV>`EB?;?Z>eybT;7np#yd$bLj!`*Cjp+KXyyCC~MM zI(r#<8GSv>_ro&-v~Dg%xEP;9U<`9NJs>!5e%}-*OQAX(68?F)mm4OZ5-BcCJU%oZ zOFt?)3N4gaZAM%Mm-`e`&c$phz1vxH8E7l*lgR$m_frg|I+noV)D3ZM`81K{% zM|{Ieq%{AKJ=ylwkP(TVxN!N>5g>vdLm1`A`pKxlT7n~h8sA+xfv;j?_dxP;#NYjlAP$?1A0Miw66-+LiGjN*Y7Xd3>xL z9+#WfXZ&z1?4S52M2r^N&!gd#0;zIbIk30xq#PBM2l=6UUZzK`4kVuG;q4CQOm@Pb z;L)u<6?lp}3Oi8V73b^!!2=Pmi*jG$tMjORaChsnGzq3%wBDNma>43-ARLKv9f@YS zmpNSLd3N|OEWqk4Gd6Cc?&<|rS?>3}z^~xY(KuR|Gh4ETCldbr{ikcmJq!?Cm;hC2 zFUM>B20cN34ZQ-O#~h3`+_i%D(fYwp9*{!%SN4tzV3*#I$&4QDeWH;h=s7d+xY|w* zP&#R4rMIf%yrP^f4P77yrlRK1Ar1}0ho~sB70a3^F+{}q08WQh6UO*YF$5UK*AiMJ z!QkP4dhq6|hnseXJOAlTVJ}I}=akz_cA@fZIHt&en3@;&TQCa4Pq}|fC`dhkTlsZQ z7FvR=lG8x2Y)ZWWf=$7)&6=cEM!uSkM)SvxGpu^}L5V z)sU8h>$ApMjw?Iiw`wPL(eolk#%`TI9V7tb-k7;;csmN(%ycbGD&~B++GnR?lXkD> zGcdwLsG?+wBGgb_g28mbqXYcj%ssA%c-xVii-h-)7rtmCsWPe6YhQ!r@#rlV2CoQCEmugbm77T@eKorvfwUW#5N+S6OWQ zbr&@$;k{OQh9NoF12}RqZRKRn2@9_83Ns*{29dYCl)#*_)?ajr`2`*av#r&@lhzkl zklAq-wI7KOKK3P1+Ruy95Ze5~>Hf^hT`>D|A@W`1Mq5+2`1424O`_YZsq%<%iT#MG zqTGy6RnkgUo5GCFI~83)0FpfJ@OK-g$$AAho0a8-yDuuqzAc?D*BL^+1Uu;QQEzxGd*B}Xw*(vI@HLN|PoMglfV|UpW$i5#_@d8tMG3NO3%H&uOfZ`_Y zL9#O^WlG)*f2}!13740xOZ%cQyNF0!!2c+(R_m}(vNpKI-`4kPM|Tl`oC|Wu`ue&G zEV4s=c?Ec#BwfDutd8XwAkDwxzr(+eufAmX$BT@=zw^k6N~wyB2^rjQGuINxXpO!a zqOtKL^-X{M1NFeCI;*Z^f~`G;yDxQ>z~NINh{WIWv=R7b)-Cwzp0+qy-_`+O{j%7DYPJ4N?Oprz$;7q6ni( z4P%Y&DnkqOkE=K96W z|IC{4K>WEDMHNn`ULJjOSZHTbLr7}Wg#mtZ(4;~oQ)F_X?9UN%9CNgfP;`{-{_WL#{Pl>xdDjUXewM6SXiGNFJES-C z_a6A_W^0f*%N~iycUUE3@$z)CW&5?e^L+Wf!*B|*6k{SZ6BW)G$Zk|%S3OrU5I zAncEuI!tcC|F(U2tp9g2YJ+rJEw|MM8VA1zQ|9;YCwhDwn>w@Us~N$!eZSiM-*-#+d!75B|X4mmIc07l~c&|AftDj%H*Gmz&Z?oLi zy}Qd}JkOr0dMG(;)Xz>UXpha8c;?TGQIex`@A~3L?{`{+^8Y!t5O801#A;raJ0XG? zA;uxBMaNC-ZeC5e>KdI%uaF4jvo+)b|RdA0g=EO+5@X<{fZX*j$2 z%EV@*@E8cQSh~Li9roAE&(s&8TsB6B zGNrultbSb}*BbA0L9}6~B*y}x1UX!svqiZ4J2QVU{23ZZ*2%W`r%hP?&utU6A+koH zCxuL@8yi_1zrD7tVU0Ta%_eNmZr>UxkRKok-l6CKq{N|N@bY;>*plZ({J9SU#! g@5QJ<+Y$#&AdNYdvT5*tMA**ipVuot { {datasetDetailObj.name}
数据集 id:{datasetDetailObj.id}
-
{datasetDetailObj.data_tag || '...'}
-
{datasetDetailObj.data_type}
+
{datasetDetailObj.dataset_type_name || '...'}
+
{datasetDetailObj.dataset_tag_name || '...'}
diff --git a/react-ui/src/pages/Dataset/index.less b/react-ui/src/pages/Dataset/index.less index 8bd424d8..c1d7a116 100644 --- a/react-ui/src/pages/Dataset/index.less +++ b/react-ui/src/pages/Dataset/index.less @@ -229,6 +229,11 @@ border-color: #eaeaea; border-radius: 4px; cursor: pointer; + .dropdown{ + position: absolute; + right: 20px; + top: 15px; + } .itemText { position: absolute; top: 20px; diff --git a/react-ui/src/pages/Dataset/personalData.jsx b/react-ui/src/pages/Dataset/personalData.jsx index 2df373dd..87f1c2c8 100644 --- a/react-ui/src/pages/Dataset/personalData.jsx +++ b/react-ui/src/pages/Dataset/personalData.jsx @@ -1,14 +1,22 @@ import { getAccessToken } from '@/access'; import clock from '@/assets/img/clock.png'; import creatByImg from '@/assets/img/creatBy.png'; +import deleteIcon from '@/assets/img/delete-icon.png'; import KFIcon from '@/components/KFIcon'; -import { addDatesetAndVesion, getAssetIcon, getDatasetList } from '@/services/dataset/index.js'; +import { + addDatesetAndVesion, + deleteDataset, + getAssetIcon, + getDatasetList, +} from '@/services/dataset/index.js'; import { getDictSelectOption } from '@/services/system/dict'; +import { modalConfirm } from '@/utils/ui'; import { UploadOutlined } from '@ant-design/icons'; import { Button, Form, Input, Modal, Pagination, Radio, Select, Upload } from 'antd'; import moment from 'moment'; import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; + import './index.less'; import Styles from './index.less'; const { Search } = Input; @@ -277,7 +285,30 @@ const PublicData = (React.FC = () => { return (
routeToIntro(e, item)}> {item.name} + { + e.stopPropagation(); + modalConfirm({ + title: '确定删除该条数据集实例吗?', + onOk: () => { + deleteDataset(item.id).then((ret) => { + if (ret.code === 200) { + message.success('删除成功'); + getModelLists(queryFlow); + } else { + message.error(ret.msg); + } + }); + }, + }); + }} + className={Styles.dropdown} + style={{ width: '17px', marginRight: '6px' }} + src={deleteIcon} + alt="" + />
{item.description}
+
{ return (
routeToIntro(e, item)}> {item.name} + { + e.stopPropagation(); + modalConfirm({ + title: '确定删除该条数据集实例吗?', + onOk: () => { + deleteDataset(item.id).then((ret) => { + if (ret.code === 200) { + message.success('删除成功'); + getModelLists(queryFlow); + } else { + message.error(ret.msg); + } + }); + }, + }); + }} + className={Styles.dropdown} + style={{ width: '17px', marginRight: '6px' }} + src={deleteIcon} + alt="" + />
{item.description}
.ant-tabs-nav .ant-tabs-nav-list{ + margin-left: 24px; + } + .ant-drawer .ant-drawer-body{ + overflow-y: hidden; + } + .ant-tabs { + height: calc(100% - 160px); + overflow-y: auto; + } + } + +} .detailBox { display: flex; align-items: center; margin-bottom: 15px; color: #1d1d20; font-size: 15px; + padding-left: 24px; + } .allMessageItem { display: flex; diff --git a/react-ui/src/pages/Experiment/experimentText/props.jsx b/react-ui/src/pages/Experiment/experimentText/props.jsx index 32e660e2..d5ac7999 100644 --- a/react-ui/src/pages/Experiment/experimentText/props.jsx +++ b/react-ui/src/pages/Experiment/experimentText/props.jsx @@ -386,7 +386,7 @@ const Props = forwardRef(({ onParentChange }, ref) => { }, })); return ( - <> +
{ afterOpenChange={afterOpenChange} open={open} width={420} + className={Styles.experimentDrawer} destroyOnClose={true} > -
任务名称:{stagingItem.label}
+
+ 任务名称:{stagingItem.label} +
执行状态:
{
- +
); }); diff --git a/react-ui/src/pages/Model/index.less b/react-ui/src/pages/Model/index.less index 382c5bd0..db39e6b0 100644 --- a/react-ui/src/pages/Model/index.less +++ b/react-ui/src/pages/Model/index.less @@ -219,6 +219,11 @@ border-color: #eaeaea; border-radius: 4px; cursor: pointer; + .dropdown{ + position: absolute; + right: 20px; + top: 15px; + } .itemText { position: absolute; top: 20px; diff --git a/react-ui/src/pages/Model/modelIntro.jsx b/react-ui/src/pages/Model/modelIntro.jsx index 8a66ad17..b9f4f87d 100644 --- a/react-ui/src/pages/Model/modelIntro.jsx +++ b/react-ui/src/pages/Model/modelIntro.jsx @@ -222,8 +222,8 @@ const Dataset = () => { {datasetDetailObj.name}
模型 id:{datasetDetailObj.id}
-
{datasetDetailObj.data_tag || '...'}
-
{datasetDetailObj.data_type}
+
{datasetDetailObj.model_type_name || '...'}
+
{datasetDetailObj.model_tag_name || '...'}
diff --git a/react-ui/src/pages/Model/personalData.jsx b/react-ui/src/pages/Model/personalData.jsx index 2f08f149..cda03a9f 100644 --- a/react-ui/src/pages/Model/personalData.jsx +++ b/react-ui/src/pages/Model/personalData.jsx @@ -1,10 +1,12 @@ import { getAccessToken } from '@/access'; import clock from '@/assets/img/clock.png'; import creatByImg from '@/assets/img/creatBy.png'; +import deleteIcon from '@/assets/img/delete-icon.png'; import KFIcon from '@/components/KFIcon'; -import { addModel, getAssetIcon, getModelList } from '@/services/dataset/index.js'; +import { addModel, deleteModel, getAssetIcon, getModelList } from '@/services/dataset/index.js'; +import { modalConfirm } from '@/utils/ui'; import { UploadOutlined } from '@ant-design/icons'; -import { Button, Form, Input, Modal, Pagination, Radio, Select, Upload } from 'antd'; +import { Button, Form, Input, Modal, Pagination, Radio, Select, Upload, message } from 'antd'; import moment from 'moment'; import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -54,8 +56,8 @@ const PublicData = () => { }); const [activeType, setActiveType] = useState(null); const [activeTag, setActiveTag] = useState(null); - const [datasetTypeList, setDatasetTypeList] = useState([]); - const [datasetDirectionList, setDatasetDirectionList] = useState([]); + const [modelTypeList, setmodelTypeList] = useState([]); + const [modelDirectionList, setmodelDirectionList] = useState([]); const [isModalOpen, setIsModalOpen] = useState(false); const [datasetList, setDatasetList] = useState([]); const [total, setTotal] = useState(0); @@ -82,11 +84,11 @@ const PublicData = () => { getAssetIcon(params).then((ret) => { console.log(ret); if (ret.code == 200 && ret.data.content && ret.data.content.length > 0) { - setDatasetTypeList(ret.data.content.filter((item) => item.category_id == 3)); - setDatasetDirectionList(ret.data.content.filter((item) => item.category_id == 4)); + setmodelTypeList(ret.data.content.filter((item) => item.category_id == 3)); + setmodelDirectionList(ret.data.content.filter((item) => item.category_id == 4)); } else { - setDatasetTypeList([]); - setDatasetDirectionList([]); + setmodelTypeList([]); + setmodelDirectionList([]); } }); }; @@ -177,8 +179,8 @@ const PublicData = () => { />
模型框架
- {datasetTypeList && datasetTypeList.length > 0 - ? datasetTypeList.map((item) => { + {modelTypeList && modelTypeList.length > 0 + ? modelTypeList.map((item) => { return (
{
模型能力
- {datasetDirectionList && datasetDirectionList.length > 0 - ? datasetDirectionList.map((item) => { + {modelDirectionList && modelDirectionList.length > 0 + ? modelDirectionList.map((item) => { return (
{ {datasetList && datasetList.length > 0 ? datasetList.map((item) => { return ( -
routeToIntro(e, item)}> +
{ + routeToIntro(e, item); + }} + > {item.name} -
{item.description}
+ { + e.stopPropagation(); + modalConfirm({ + title: '确定删除该条模型实例吗?', + onOk: () => { + deleteModel(item.id).then((ret) => { + if (ret.code === 200) { + message.success('删除成功'); + getModelLists(queryFlow); + } else { + message.error(ret.msg); + } + }); + }, + }); + }} + className={Styles.dropdown} + style={{ width: '17px', marginRight: '6px' }} + src={deleteIcon} + alt="" + /> + {/* { + console.log(e); + if (e.key === 'detail') { + routeToIntro(e, item); + } else if (e.key === 'delete') { + modalConfirm({ + title: '确定删除该条模型实例吗?', + onOk: () => { + deleteModel(item.id).then((ret) => { + if (ret.code === 200) { + message.success('删除成功'); + getModelLists(queryFlow); + } else { + message.error(ret.msg); + } + }); + }, + }); + } + }, + }} + > +
+ +
+
*/} + ,
{item.description}
{ ] } > - { + return { value: item.id, label: item.name }; + })} + /> { ] } > - { + return { value: item.id, label: item.name }; + })} + /> diff --git a/react-ui/src/pages/Model/publicData.jsx b/react-ui/src/pages/Model/publicData.jsx index 17313f54..36261368 100644 --- a/react-ui/src/pages/Model/publicData.jsx +++ b/react-ui/src/pages/Model/publicData.jsx @@ -1,7 +1,9 @@ import clock from '@/assets/img/clock.png'; import creatByImg from '@/assets/img/creatBy.png'; -import { getAssetIcon, getModelList } from '@/services/dataset/index.js'; -import { Form, Input, Modal, Pagination, Radio } from 'antd'; +import deleteIcon from '@/assets/img/delete-icon.png'; +import { deleteModel, getAssetIcon, getModelList } from '@/services/dataset/index.js'; +import { modalConfirm } from '@/utils/ui'; +import { Form, Input, Modal, Pagination, Radio, message } from 'antd'; import moment from 'moment'; import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -224,8 +226,35 @@ const PublicData = () => { {datasetList && datasetList.length > 0 ? datasetList.map((item) => { return ( -
routeToIntro(e, item)}> +
{ + routeToIntro(e, item); + }} + > {item.name} + { + e.stopPropagation(); + modalConfirm({ + title: '确定删除该条模型实例吗?', + onOk: () => { + deleteModel(item.id).then((ret) => { + if (ret.code === 200) { + message.success('删除成功'); + getModelLists(queryFlow); + } else { + message.error(ret.msg); + } + }); + }, + }); + }} + className={Styles.dropdown} + style={{ width: '17px', marginRight: '6px' }} + src={deleteIcon} + alt="" + />
{item.description}
Date: Fri, 26 Apr 2024 14:09:38 +0800 Subject: [PATCH 07/13] =?UTF-8?q?fix:=20g6=20=E5=8F=8C=E5=87=BB=E6=94=B9?= =?UTF-8?q?=E5=8D=95=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/Experiment/experimentText/index.jsx | 19 ++----- .../src/pages/Pipeline/editPipeline/index.jsx | 51 ++++--------------- 2 files changed, 13 insertions(+), 57 deletions(-) diff --git a/react-ui/src/pages/Experiment/experimentText/index.jsx b/react-ui/src/pages/Experiment/experimentText/index.jsx index baa5bd04..a5ed2ffc 100644 --- a/react-ui/src/pages/Experiment/experimentText/index.jsx +++ b/react-ui/src/pages/Experiment/experimentText/index.jsx @@ -68,19 +68,9 @@ function ExperimentText() { }; const formChange = (val) => {}; const handlerClick = (e) => { - console.log(propsRef, graph, messageRef.current); - // let cache = []; - // let json_str = JSON.stringify(graph, function(key, value) { - // if (typeof value === 'object' && value !== null) { - // if (cache.indexOf(value) !== -1) { - // return; - // } - // cache.push(value); - // } - // return value; - // }); - // console.log(json_str); - propsRef.current.showDrawer(e, locationParams.id, messageRef.current); + if (e.target.get('name') !== 'anchor-point' && e.item) { + propsRef.current.showDrawer(e, locationParams.id, messageRef.current); + } }; const getGraphData = (data) => { if (graph) { @@ -387,8 +377,7 @@ function ExperimentText() { fitView: true, fitViewPadding: [320, 320, 220, 320], }); - - graph.on('dblclick', handlerClick); + graph.on('node:click', handlerClick); window.onresize = () => { if (!graph || graph.get('destroyed')) return; if (!graphRef.current || !graphRef.current.scrollWidth || !graphRef.current.scrollHeight) diff --git a/react-ui/src/pages/Pipeline/editPipeline/index.jsx b/react-ui/src/pages/Pipeline/editPipeline/index.jsx index af9e604c..406468e3 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/index.jsx +++ b/react-ui/src/pages/Pipeline/editPipeline/index.jsx @@ -128,18 +128,7 @@ const EditPipeline = () => { }; const handlerClick = (e) => { e.stopPropagation(); - console.log(propsRef, graph); - // let cache = []; - // let json_str = JSON.stringify(graph, function(key, value) { - // if (typeof value === 'object' && value !== null) { - // if (cache.indexOf(value) !== -1) { - // return; - // } - // cache.push(value); - // } - // return value; - // }); - // console.log(json_str); + // console.log(propsRef, graph); propsRef.current.showDrawer(e); }; const getGraphData = (data) => { @@ -353,7 +342,7 @@ const EditPipeline = () => { // this.graph.setItemState(e.item, 'showAnchors', false); graph.setItemState(e.item, 'nodeSelected', false); }); - graph.off('dblclick', handlerClick); + // graph.off('dblclick', handlerClick); }; }, []); const initGraph = () => { @@ -390,32 +379,15 @@ const EditPipeline = () => { getAnchorPoints(cfg) { return ( cfg.anchorPoints || [ - // 上下各3,左右各1 - [0.5, 0], - [0.5, 1], + // 四个 + // [0.5, 0], + // [0.5, 1], [0, 0.5], [1, 0.5], ] ); }, - // draw(cfg, group) { - - // let rect=group.addShape('text', { - // attrs: { - // text: fittingString(cfg.label, 110, 15), - // x: 90 - getTextSize(cfg.label, 110, 15), - // y: 0, - // fontSize: 10, - // textAlign: 'center', - // textBaseline: 'middle', - // fill:'#000' - // }, - // name: 'text-shape', - // }); - // return rect; - // }, afterDraw(cfg, group) { - // console.log(group, cfg, 12312); const image = group.addShape('image', { attrs: { x: -45, @@ -444,7 +416,6 @@ const EditPipeline = () => { } const bbox = group.getBBox(); const anchorPoints = this.getAnchorPoints(cfg); - // console.log(anchorPoints); anchorPoints.forEach((anchorPos, i) => { group.addShape('circle', { attrs: { @@ -578,7 +549,7 @@ const EditPipeline = () => { }, defaultEdge: { // type: 'quadratic', - type: 'cubic-vertical', + // type: 'cubic-vertical', style: { endArrow: { @@ -631,13 +602,9 @@ const EditPipeline = () => { // }); graph.on('node:click', (e) => { console.log(e.target.get('name')); - if (e.target.get('name') === 'anchor-point') { - // create edge - } else { - if (e.item) { - graph.setItemState(e.item, 'nodeClicked', true); - handlerClick(e); - } + if (e.target.get('name') !== 'anchor-point' && e.item) { + graph.setItemState(e.item, 'nodeClicked', true); + handlerClick(e); } }); graph.on('aftercreateedge', (e) => { From c2fcd65d09c07bc41f2a7414cf252ae71cb4a907 Mon Sep 17 00:00:00 2001 From: liu2592603532 <2592603532@qq.com> Date: Fri, 26 Apr 2024 14:48:04 +0800 Subject: [PATCH 08/13] merge --- react-ui/src/pages/Experiment/index.jsx | 4 ++++ react-ui/src/pages/Model/personalData.jsx | 6 +----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/react-ui/src/pages/Experiment/index.jsx b/react-ui/src/pages/Experiment/index.jsx index d8ac8f95..69748b4e 100644 --- a/react-ui/src/pages/Experiment/index.jsx +++ b/react-ui/src/pages/Experiment/index.jsx @@ -69,6 +69,7 @@ function Experiment() { return { ...item, key: item.id }; }), ); + setTotal(res.data.totalElements); } }; @@ -82,6 +83,7 @@ function Experiment() { // 获取实验实例 const getQueryByExperiment = (val) => { getQueryByExperimentId(val).then((ret) => { + console.log(val); setExpandedRowKeys(val); if (ret && ret.data && ret.data.length > 0) { try { @@ -159,6 +161,7 @@ function Experiment() { }; const expandChange = (e, record) => { clearExperimentInTimers(); + console.log(e, record); if (record.id === expandedRowKeys) { setExpandedRowKeys(null); } else { @@ -517,6 +520,7 @@ function Experiment() { : ''}
), + onExpand: (e, a) => { expandChange(e, a); }, diff --git a/react-ui/src/pages/Model/personalData.jsx b/react-ui/src/pages/Model/personalData.jsx index 096c4850..9595c6f1 100644 --- a/react-ui/src/pages/Model/personalData.jsx +++ b/react-ui/src/pages/Model/personalData.jsx @@ -6,11 +6,7 @@ import KFIcon from '@/components/KFIcon'; import { addModel, deleteModel, getAssetIcon, getModelList } from '@/services/dataset/index.js'; import { modalConfirm } from '@/utils/ui'; import { UploadOutlined } from '@ant-design/icons'; -<<<<<<< HEAD -import { Button, Form, Input, Modal, Pagination, Radio, Select, Upload, message } from 'antd'; -======= -import { Button, Form, Input, Modal, Pagination, Select, Upload } from 'antd'; ->>>>>>> 4065c42374905b323a937377ae9ab5f05d6ee297 +import { Button, Form, Input, Modal, Pagination, Select, Upload, message } from 'antd'; import moment from 'moment'; import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; From 3f69da987da614b359745316e329754a6921e207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Fri, 26 Apr 2024 15:09:40 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/platform/service/impl/DatasetServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..57d49d99 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 @@ -240,6 +240,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 +260,6 @@ public class DatasetServiceImpl implements DatasetService { if (dataset == null) { throw new Exception("数据集不存在,请检查数据集id"); } - DatasetVersion version = datasetVersionService.queryByDatasetVersion(datasetVersion); String url = ""; if (version == null) { From e76ab23cf06d16be6a1bc08458819ab6217d665b Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Fri, 26 Apr 2024 17:16:33 +0800 Subject: [PATCH 10/13] =?UTF-8?q?feat:=20=E9=80=80=E5=87=BA=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=92=8Ctoken=E5=A4=B1=E6=95=88=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/config/config.ts | 1 + react-ui/src/app.tsx | 17 +------- .../src/components/HeaderDropdown/index.tsx | 9 +---- .../RightContent/AvatarDropdown.tsx | 19 ++------- .../src/components/RightContent/index.tsx | 39 +++++++++---------- .../experimentText/addExperimentModal.tsx | 8 +++- react-ui/src/requestConfig.ts | 28 ++++++------- react-ui/src/services/session.ts | 5 +-- react-ui/src/services/system/auth.ts | 4 +- react-ui/src/utils/ui.tsx | 16 ++++++++ 10 files changed, 68 insertions(+), 78 deletions(-) diff --git a/react-ui/config/config.ts b/react-ui/config/config.ts index 405f85cb..4d7d3db8 100644 --- a/react-ui/config/config.ts +++ b/react-ui/config/config.ts @@ -163,4 +163,5 @@ export default defineConfig({ }, javascriptEnabled: true, }, + // plugins: ['umi-plugin-keep-alive'], }); diff --git a/react-ui/src/app.tsx b/react-ui/src/app.tsx index 10ab35bb..f8a3221b 100644 --- a/react-ui/src/app.tsx +++ b/react-ui/src/app.tsx @@ -133,22 +133,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/pages/Experiment/experimentText/addExperimentModal.tsx b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx index 3e58ee26..1433fb85 100644 --- a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx +++ b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx @@ -145,7 +145,13 @@ function AddExperimentModal({ name="description" rules={[{ required: true, message: '请输入实验描述' }]} > - + { 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 44861d39..39b0ff84 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() { @@ -101,7 +100,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/utils/ui.tsx b/react-ui/src/utils/ui.tsx index 51a74143..1ac54b1a 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 { search, pathname } = 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, + }); + } +}; From be873035ad3a8ad9e98d82626d3880f5e780f5d0 Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Sun, 28 Apr 2024 08:46:06 +0800 Subject: [PATCH 11/13] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/backup/component-icon-7-Failed.png | Bin 3217 -> 0 bytes .../images/backup/component-icon-7-Omitted.png | Bin 3115 -> 0 bytes .../images/backup/component-icon-7-Pending.png | Bin 3239 -> 0 bytes .../images/backup/component-icon-7-Running.png | Bin 3084 -> 0 bytes .../images/backup/component-icon-7-Skipped.png | Bin 3115 -> 0 bytes .../images/backup/component-icon-7-Succeeded.png | Bin 3322 -> 0 bytes .../assets/images/backup/component-icon-7.png | Bin 1435 -> 0 bytes .../experimentText/addExperimentModal.tsx | 1 + 8 files changed, 1 insertion(+) delete mode 100644 react-ui/public/assets/images/backup/component-icon-7-Failed.png delete mode 100644 react-ui/public/assets/images/backup/component-icon-7-Omitted.png delete mode 100644 react-ui/public/assets/images/backup/component-icon-7-Pending.png delete mode 100644 react-ui/public/assets/images/backup/component-icon-7-Running.png delete mode 100644 react-ui/public/assets/images/backup/component-icon-7-Skipped.png delete mode 100644 react-ui/public/assets/images/backup/component-icon-7-Succeeded.png delete mode 100644 react-ui/public/assets/images/backup/component-icon-7.png 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 2427996b7f47222d2e3408932666352306e6a857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3217 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 DGP4ez 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 33a4445eb39e6cc0c934948254aa8b2662edb227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 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 diff --git a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx index 1433fb85..f5b2bfc4 100644 --- a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx +++ b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx @@ -144,6 +144,7 @@ function AddExperimentModal({ label="实验描述" name="description" rules={[{ required: true, message: '请输入实验描述' }]} + style={{ marginBottom: '48px' }} > Date: Sun, 28 Apr 2024 10:21:46 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E9=87=8D=E5=90=8D=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/model/ModelsController.java | 2 +- .../com/ruoyi/platform/domain/Models.java | 2 ++ .../platform/mapper/DatasetVersionDao.java | 3 +- .../com/ruoyi/platform/mapper/ModelsDao.java | 4 +++ .../ruoyi/platform/service/ModelsService.java | 5 ++- .../service/impl/ImageServiceImpl.java | 3 +- .../service/impl/ModelsServiceImpl.java | 36 +++++++++++++++++-- .../managementPlatform/DatasetDaoMapper.xml | 1 + .../managementPlatform/ModelsDaoMapper.xml | 8 +++++ 9 files changed, 57 insertions(+), 7 deletions(-) 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/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/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/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/ModelsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java index 14b1e470..b91fb890 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; @@ -34,6 +36,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; @@ -116,8 +119,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 +177,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 +432,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/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 + + + +