Browse Source

Merge branch 'dev' of https://gitlink.org.cn/ci4s/ci4sManagement-cloud into optimus

pull/19/head^2
liu2592603532 1 year ago
parent
commit
3dde45bf37
20 changed files with 143 additions and 120 deletions
  1. +3
    -1
      react-ui/config/config.ts
  2. BIN
      react-ui/src/assets/img/modal-select-model.png
  3. +0
    -2
      react-ui/src/components/KFModal/index.tsx
  4. +7
    -3
      react-ui/src/pages/Dataset/datasetIntro.jsx
  5. +10
    -1
      react-ui/src/pages/Dataset/personalData.jsx
  6. +3
    -3
      react-ui/src/pages/Experiment/index.jsx
  7. +38
    -4
      react-ui/src/pages/Model/personalData.jsx
  8. +1
    -1
      react-ui/src/pages/Model/publicData.jsx
  9. +1
    -1
      react-ui/src/services/dataset/index.js
  10. +5
    -6
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java
  11. +2
    -2
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java
  12. +1
    -1
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java
  13. +1
    -1
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java
  14. +12
    -20
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java
  15. +4
    -3
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetVersionServiceImpl.java
  16. +31
    -27
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java
  17. +4
    -3
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java
  18. +5
    -3
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/DatasetVo.java
  19. +14
    -37
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/ModelsVo.java
  20. +1
    -1
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/VersionVo.java

+ 3
- 1
react-ui/config/config.ts View File

@@ -108,7 +108,9 @@ export default defineConfig({
* @description 内置了 babel import 插件 * @description 内置了 babel import 插件
* @doc https://umijs.org/docs/max/antd#antd * @doc https://umijs.org/docs/max/antd#antd
*/ */
antd: {},
antd: {
configProvider: {},
},
/** /**
* @name 网络请求配置 * @name 网络请求配置
* @description 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。 * @description 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。


BIN
react-ui/src/assets/img/modal-select-model.png View File

Before After
Width: 43  |  Height: 44  |  Size: 2.3 kB

+ 0
- 2
react-ui/src/components/KFModal/index.tsx View File

@@ -1,6 +1,5 @@
// 自定义 Modal // 自定义 Modal


import { ReactComponent as CloseIcon } from '@/assets/svg/modal-close.svg';
import ModalTitle from '@/components/ModalTitle'; import ModalTitle from '@/components/ModalTitle';
import { Modal, type ModalProps } from 'antd'; import { Modal, type ModalProps } from 'antd';
import classNames from 'classnames'; import classNames from 'classnames';
@@ -15,7 +14,6 @@ function KFModal({ title, image, children, className, ...rest }: KFModalProps) {
className={classNames(['kf-modal', className])} className={classNames(['kf-modal', className])}
{...rest} {...rest}
title={<ModalTitle title={title} image={image}></ModalTitle>} title={<ModalTitle title={title} image={image}></ModalTitle>}
closeIcon={<CloseIcon></CloseIcon>}
> >
{children} {children}
</Modal> </Modal>


+ 7
- 3
react-ui/src/pages/Dataset/datasetIntro.jsx View File

@@ -59,12 +59,14 @@ const Dataset = () => {
const locationParams = useParams(); //新版本获取路由参数接口 const locationParams = useParams(); //新版本获取路由参数接口
const [wordList, setWordList] = useState([]); const [wordList, setWordList] = useState([]);
const [activeTabKey, setActiveTabKey] = useState('1'); const [activeTabKey, setActiveTabKey] = useState('1');
const [uuid, setUuid] = useState(Date.now());
const getDatasetByDetail = () => { const getDatasetByDetail = () => {
getDatasetById(locationParams.id).then((ret) => { getDatasetById(locationParams.id).then((ret) => {
console.log(ret); console.log(ret);
setDatasetDetailObj(ret.data); setDatasetDetailObj(ret.data);
}); });
}; };
// 获取数据集版本
const getDatasetVersionList = () => { const getDatasetVersionList = () => {
getDatasetVersionsById(locationParams.id).then((ret) => { getDatasetVersionsById(locationParams.id).then((ret) => {
console.log(ret); console.log(ret);
@@ -77,6 +79,8 @@ const Dataset = () => {
}; };
}), }),
); );
setVersion(ret.data[0]);
getDatasetVersions({ version: ret.data[0], dataset_id: locationParams.id });
} }
}); });
}; };
@@ -90,6 +94,7 @@ const Dataset = () => {
form.setFieldsValue({ name: datasetDetailObj.name }); form.setFieldsValue({ name: datasetDetailObj.name });


setDialogTitle('创建新版本'); setDialogTitle('创建新版本');
setUuid(Date.now());
setIsModalOpen(true); setIsModalOpen(true);
}; };
const handleCancel = () => { const handleCancel = () => {
@@ -118,9 +123,7 @@ const Dataset = () => {


onOk: () => { onOk: () => {
deleteDatasetVersion({ dataset_id: locationParams.id, version }).then((ret) => { deleteDatasetVersion({ dataset_id: locationParams.id, version }).then((ret) => {
setVersion(null);
getDatasetVersionList(); getDatasetVersionList();
getDatasetVersions({ version, dataset_id: locationParams.id });
message.success('删除成功'); message.success('删除成功');
}); });
}, },
@@ -133,6 +136,7 @@ const Dataset = () => {
message.success('创建成功'); message.success('创建成功');
}); });
}; };
// 获取版本下的文件列表
const getDatasetVersions = (params) => { const getDatasetVersions = (params) => {
getDatasetVersionIdList(params).then((res) => { getDatasetVersionIdList(params).then((res) => {
setWordList(res?.data?.content ?? []); setWordList(res?.data?.content ?? []);
@@ -377,7 +381,7 @@ const Dataset = () => {
}, },
]} ]}
> >
<Upload {...props}>
<Upload {...props} data={{ uuid: uuid }}>
<Button <Button
style={{ style={{
fontSize: '14px', fontSize: '14px',


+ 10
- 1
react-ui/src/pages/Dataset/personalData.jsx View File

@@ -24,7 +24,16 @@ const PublicData = (React.FC = () => {
onChange({ file, fileList }) { onChange({ file, fileList }) {
if (file.status !== 'uploading') { if (file.status !== 'uploading') {
console.log(file, fileList); console.log(file, fileList);
form.setFieldsValue({ dataset_version_vos: fileList.map((item) => item.response.data[0]) });
form.setFieldsValue({
dataset_version_vos: fileList.map((item) => {
const data = item.response.data[0];
return {
file_name: data.fileName,
file_size: data.fileSize,
url: data.url,
};
}),
});
} }
}, },
defaultFileList: [], defaultFileList: [],


+ 3
- 3
react-ui/src/pages/Experiment/index.jsx View File

@@ -98,7 +98,7 @@ function Experiment() {
setExperimentInList(list); setExperimentInList(list);
// 获取 TensorBoard 状态 // 获取 TensorBoard 状态
list.forEach((item) => { list.forEach((item) => {
if (item.nodes_result.tensorboard_log) {
if (item.nodes_result?.tensorboard_log) {
const timerId = setTimeout(() => { const timerId = setTimeout(() => {
getTensorBoardStatus(item); getTensorBoardStatus(item);
}, 0); }, 0);
@@ -161,8 +161,8 @@ function Experiment() {
} }
}; };
const expandChange = (e, record) => { const expandChange = (e, record) => {
clearExperimentInTimers();
if (record.id === expandedRowKeys) { if (record.id === expandedRowKeys) {
clearExperimentInTimers();
setExpandedRowKeys(null); setExpandedRowKeys(null);
} else { } else {
getQueryByExperiment(record.id); getQueryByExperiment(record.id);
@@ -446,7 +446,7 @@ function Experiment() {
{index + 1} {index + 1}
</a> </a>
<div style={{ width: '300px' }}> <div style={{ width: '300px' }}>
{item.nodes_result.tensorboard_log ? (
{item.nodes_result?.tensorboard_log ? (
<TensorBoardStatus <TensorBoardStatus
status={item.tensorBoardStatus} status={item.tensorBoardStatus}
onClick={() => handleTensorboard(item)} onClick={() => handleTensorboard(item)}


+ 38
- 4
react-ui/src/pages/Model/personalData.jsx View File

@@ -23,14 +23,23 @@ const PublicData = () => {
onChange({ file, fileList }) { onChange({ file, fileList }) {
if (file.status !== 'uploading') { if (file.status !== 'uploading') {
console.log(file, fileList); console.log(file, fileList);
form.setFieldsValue({ dataset_version_vos: fileList.map((item) => item.response.data[0]) });
form.setFieldsValue({
models_version_vos: fileList.map((item) => {
const data = item.response.data[0];
return {
file_name: data.fileName,
file_size: data.fileSize,
url: data.url,
};
}),
});
} }
}, },
defaultFileList: [], defaultFileList: [],
}; };
const [queryFlow, setQueryFlow] = useState({ const [queryFlow, setQueryFlow] = useState({
page: 0, page: 0,
size: 10,
size: 20,
name: null, name: null,
available_range: 0, available_range: 0,
}); });
@@ -326,6 +335,21 @@ const PublicData = () => {
<Input placeholder="请输入模型名称" showCount maxLength={64} /> <Input placeholder="请输入模型名称" showCount maxLength={64} />
</Form.Item> </Form.Item>


<Form.Item
label="模型版本"
name="version"
rules={
[
// {
// required: true,
// message: 'Please input your username!',
// },
]
}
>
<Input placeholder="请输入模型版本" />
</Form.Item>

<Form.Item <Form.Item
label="模型描述" label="模型描述"
name="description" name="description"
@@ -372,9 +396,19 @@ const PublicData = () => {
> >
<Select allowClear placeholder="请选择模型标签" options={[]} /> <Select allowClear placeholder="请选择模型标签" options={[]} />
</Form.Item> </Form.Item>
<Form.Item label="模型文件" name="dataset_version_vos">
<Form.Item label="模型文件" name="models_version_vos">
<Upload {...props} data={{ uuid: uuid }}> <Upload {...props} data={{ uuid: uuid }}>
<Button icon={<UploadOutlined style={{ color: '#1664ff' }} />}>上传文件</Button>
<Button
style={{
fontSize: '14px',
border: '1px solid',
borderColor: '#1664ff',
background: '#fff',
}}
icon={<UploadOutlined style={{ color: '#1664ff', fontSize: '14px' }} />}
>
上传文件
</Button>
</Upload> </Upload>
</Form.Item> </Form.Item>
</Form> </Form>


+ 1
- 1
react-ui/src/pages/Model/publicData.jsx View File

@@ -10,7 +10,7 @@ const leftdataList = [1, 2, 3];
const PublicData = () => { const PublicData = () => {
const [queryFlow, setQueryFlow] = useState({ const [queryFlow, setQueryFlow] = useState({
page: 0, page: 0,
size: 10,
size: 20,
name: null, name: null,
available_range: 1, available_range: 1,
}); });


+ 1
- 1
react-ui/src/services/dataset/index.js View File

@@ -25,7 +25,7 @@ export function addDatesetAndVesion(data) {
} }
// 新增模型 // 新增模型
export function addModel(data) { export function addModel(data) {
return request(`/api/mmp//models`, {
return request(`/api/mmp/models/addModelAndVersion`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json;charset=UTF-8', 'Content-Type': 'application/json;charset=UTF-8',


+ 5
- 6
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java View File

@@ -52,13 +52,13 @@ public class DatasetController {
@ApiOperation("数据集广场公开数据集分页查询,根据data_type筛选,1公开0私有") @ApiOperation("数据集广场公开数据集分页查询,根据data_type筛选,1公开0私有")
public AjaxResult queryByPage(Dataset dataset, @RequestParam("page") int page, public AjaxResult queryByPage(Dataset dataset, @RequestParam("page") int page,
@RequestParam("size") int size, @RequestParam("size") int size,
//@RequestParam("available_range") int availableRange ,
@RequestParam(value = "available_range") int availableRange ,
@RequestParam(value = "data_type", required = false) String dataType) { @RequestParam(value = "data_type", required = false) String dataType) {


if (dataType != null) { // 仅当dataType有值时设置 if (dataType != null) { // 仅当dataType有值时设置
dataset.setDataType(dataType); dataset.setDataType(dataType);
} }
dataset.setAvailableRange(1);
dataset.setAvailableRange(availableRange);
PageRequest pageRequest = PageRequest.of(page, size); PageRequest pageRequest = PageRequest.of(page, size);
return AjaxResult.success(this.datasetService.queryByPage(dataset, pageRequest)); return AjaxResult.success(this.datasetService.queryByPage(dataset, pageRequest));
} }
@@ -182,16 +182,15 @@ public class DatasetController {
/** /**
* 上传数据集 * 上传数据集
* *
// * @param datasetId 数据集ID
* @param files 上传的数据集文件 * @param files 上传的数据集文件
*
* @param uuid 上传唯一标识,构建url
* @return 上传结果 * @return 上传结果
*/ */
@CrossOrigin(origins = "*", allowedHeaders = "*") @CrossOrigin(origins = "*", allowedHeaders = "*")
@PostMapping("/upload") @PostMapping("/upload")
@ApiOperation(value = "上传数据集", notes = "根据数据集版本表id上传数据集文件,并将信息存入数据库。") @ApiOperation(value = "上传数据集", notes = "根据数据集版本表id上传数据集文件,并将信息存入数据库。")
public AjaxResult uploadDataset(@RequestParam("file") MultipartFile[] files) throws Exception {
return AjaxResult.success(this.datasetService.uploadDataset(files));
public AjaxResult uploadDataset(@RequestParam("file") MultipartFile[] files, @RequestParam("uuid") String uuid) throws Exception {
return AjaxResult.success(this.datasetService.uploadDataset(files,uuid));
} }






+ 2
- 2
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java View File

@@ -176,8 +176,8 @@ public class ModelsController extends BaseController {
@CrossOrigin(origins = "*", allowedHeaders = "*") @CrossOrigin(origins = "*", allowedHeaders = "*")
@PostMapping("/upload") @PostMapping("/upload")
@ApiOperation(value = "上传模型", notes = "根据模型id上传模型文件,并将信息存入数据库。") @ApiOperation(value = "上传模型", notes = "根据模型id上传模型文件,并将信息存入数据库。")
public GenericsAjaxResult<List<Map<String, String>>> uploadModels(@RequestParam("file") MultipartFile[] files) throws Exception {
return genericsSuccess(this.modelsService.uploadModels(files));
public GenericsAjaxResult<List<Map<String, String>>> uploadModels(@RequestParam("file") MultipartFile[] files , @RequestParam("uuid") String uuid) throws Exception {
return genericsSuccess(this.modelsService.uploadModels(files,uuid));


} }




+ 1
- 1
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java View File

@@ -72,7 +72,7 @@ DatasetService {


ResponseEntity<InputStreamResource> downloadDataset(Integer id) throws Exception; ResponseEntity<InputStreamResource> downloadDataset(Integer id) throws Exception;


List<Map<String, String>> uploadDataset(MultipartFile[] files) throws Exception;
List<Map<String, String>> uploadDataset(MultipartFile[] files, String uuid) throws Exception;


Map uploadDatasetPipeline(DatasetVersion datasetVersion) throws Exception; Map uploadDatasetPipeline(DatasetVersion datasetVersion) throws Exception;




+ 1
- 1
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java View File

@@ -70,7 +70,7 @@ public interface ModelsService {






List<Map<String, String>> uploadModels(MultipartFile[] files) throws Exception;
List<Map<String, String>> uploadModels(MultipartFile[] files, String uuid) throws Exception;


Map uploadModelsPipeline(ModelsVersion modelsVersion) throws Exception; Map uploadModelsPipeline(ModelsVersion modelsVersion) throws Exception;




+ 12
- 20
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java View File

@@ -12,7 +12,7 @@ import com.ruoyi.platform.service.DatasetVersionService;
import com.ruoyi.platform.utils.BeansUtils; import com.ruoyi.platform.utils.BeansUtils;
import com.ruoyi.platform.utils.FileUtil; import com.ruoyi.platform.utils.FileUtil;
import com.ruoyi.platform.utils.MinioUtil; import com.ruoyi.platform.utils.MinioUtil;
import com.ruoyi.platform.vo.DatasetVersionVo;
import com.ruoyi.platform.vo.VersionVo;
import com.ruoyi.platform.vo.DatasetVo; import com.ruoyi.platform.vo.DatasetVo;
import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.model.LoginUser;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -203,16 +203,16 @@ public class DatasetServiceImpl implements DatasetService {
/** /**
* 上传数据集 * 上传数据集
* *
* @param files 文件
* @param files 文件
* @param uuid
* @return 是否成功 * @return 是否成功
*/ */
@Override @Override
public List<Map<String, String>> uploadDataset(MultipartFile[] files) throws Exception {
public List<Map<String, String>> uploadDataset(MultipartFile[] files, String uuid) throws Exception {
List<Map<String, String>> results = new ArrayList<>(); List<Map<String, String>> results = new ArrayList<>();
//时间戳统一定在外面,一次上传就定好
Date createTime = new Date();
String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);
// //时间戳统一定在外面,一次上传就定好
// Date createTime = new Date();
// String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);


for (MultipartFile file:files){ for (MultipartFile file:files){
if (file.isEmpty()) { if (file.isEmpty()) {
@@ -225,20 +225,12 @@ public class DatasetServiceImpl implements DatasetService {
// 其余操作基于 modelsVersionToUse // 其余操作基于 modelsVersionToUse
String username = SecurityUtils.getLoginUser().getUsername(); String username = SecurityUtils.getLoginUser().getUsername();
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
String objectName = "datasets/" + username + "/" + timestamp + "/" + fileName;
String objectName = "datasets/" + username + "/" + uuid + "/" + fileName;


// 上传文件到MinIO并将记录新增到数据库中 // 上传文件到MinIO并将记录新增到数据库中
try (InputStream inputStream = file.getInputStream()) { try (InputStream inputStream = file.getInputStream()) {
minioUtil.uploadObject(bucketName, objectName, inputStream); minioUtil.uploadObject(bucketName, objectName, inputStream);
// DatasetVersion datasetVersion = new DatasetVersion();
// datasetVersion.setDatasetId(id);
// datasetVersion.setVersion(version);
// datasetVersion.setUrl(objectName);
// datasetVersion.setFileName(fileName);
// datasetVersion.setFileSize(formattedSize);
//
// //返回插入结果
// DatasetVersion insertedDatasetversion = datasetVersionService.insert(datasetVersion);

Map<String, String> fileResult = new HashMap<>(); Map<String, String> fileResult = new HashMap<>();
fileResult.put("fileName", file.getOriginalFilename()); fileResult.put("fileName", file.getOriginalFilename());
fileResult.put("url", objectName); // objectName根据实际情况定义 fileResult.put("url", objectName); // objectName根据实际情况定义
@@ -313,8 +305,8 @@ public class DatasetServiceImpl implements DatasetService {
@Override @Override
@Transactional @Transactional
public String insertDatasetAndVersion(DatasetVo datasetVo) throws Exception { public String insertDatasetAndVersion(DatasetVo datasetVo) throws Exception {
List<DatasetVersionVo> datasetVersionVos = datasetVo.getDatasetVersionVos();
if (datasetVersionVos==null||datasetVersionVos.size()==0){
List<VersionVo> datasetVersionVos = datasetVo.getDatasetVersionVos();
if (datasetVersionVos==null || datasetVersionVos.isEmpty()){
throw new Exception("数据集版本信息错误"); throw new Exception("数据集版本信息错误");
} }


@@ -329,7 +321,7 @@ public class DatasetServiceImpl implements DatasetService {
throw new Exception("新增数据集失败"); throw new Exception("新增数据集失败");
} }


for (DatasetVersionVo datasetVersionVo :datasetVersionVos){
for (VersionVo datasetVersionVo :datasetVersionVos){
DatasetVersion datasetVersion = new DatasetVersion(); DatasetVersion datasetVersion = new DatasetVersion();
datasetVersion.setDatasetId(datasetInsert.getId()); datasetVersion.setDatasetId(datasetInsert.getId());
datasetVersion.setVersion(datasetVo.getVersion()); datasetVersion.setVersion(datasetVo.getVersion());


+ 4
- 3
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetVersionServiceImpl.java View File

@@ -138,9 +138,10 @@ public class DatasetVersionServiceImpl implements DatasetVersionService {
Map<String, Object> response = new HashMap<>(); Map<String, Object> response = new HashMap<>();


List<DatasetVersion> datasetVersionList = this.datasetVersionDao.queryAllByDatasetVersion(datasetId, version); List<DatasetVersion> datasetVersionList = this.datasetVersionDao.queryAllByDatasetVersion(datasetId, version);
datasetVersionList.stream().
findFirst().
ifPresent(datasetVersion -> {
datasetVersionList.stream()
.filter(datasetVersion -> datasetVersion.getUrl() != null && !datasetVersion.getUrl().isEmpty())
.findFirst()
.ifPresent(datasetVersion -> {
String url = datasetVersion.getUrl(); String url = datasetVersion.getUrl();
String path = bucketName + '/' + url.substring(0, url.lastIndexOf('/')); String path = bucketName + '/' + url.substring(0, url.lastIndexOf('/'));
response.put("path", path); response.put("path", path);


+ 31
- 27
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java View File

@@ -1,7 +1,6 @@
package com.ruoyi.platform.service.impl; package com.ruoyi.platform.service.impl;


import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.platform.domain.DatasetVersion;
import com.ruoyi.platform.domain.Models; import com.ruoyi.platform.domain.Models;
import com.ruoyi.platform.domain.ModelsVersion; import com.ruoyi.platform.domain.ModelsVersion;
import com.ruoyi.platform.mapper.ModelsDao; import com.ruoyi.platform.mapper.ModelsDao;
@@ -12,16 +11,15 @@ import com.ruoyi.platform.utils.BeansUtils;
import com.ruoyi.platform.utils.FileUtil; import com.ruoyi.platform.utils.FileUtil;
import com.ruoyi.platform.utils.MinioUtil; import com.ruoyi.platform.utils.MinioUtil;
import com.ruoyi.platform.vo.ModelsVo; import com.ruoyi.platform.vo.ModelsVo;
import com.ruoyi.platform.vo.VersionVo;
import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.model.LoginUser;
import io.minio.MinioClient;
import io.netty.util.Version;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.InputStreamResource;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -33,7 +31,6 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
@@ -169,6 +166,7 @@ public class ModelsServiceImpl implements ModelsService {
ModelsVersion modelsVersion = this.modelsVersionDao.queryById(id); ModelsVersion modelsVersion = this.modelsVersionDao.queryById(id);
if (modelsVersion == null) { if (modelsVersion == null) {
throw new Exception("未找到该模型下版本记录"); throw new Exception("未找到该模型下版本记录");

} }
// 从数据库中获取存储路径(即MinIO中的对象名称) // 从数据库中获取存储路径(即MinIO中的对象名称)
String objectName = modelsVersion.getUrl(); String objectName = modelsVersion.getUrl();
@@ -199,15 +197,16 @@ public class ModelsServiceImpl implements ModelsService {
* 上传模型 * 上传模型
* *
* @param files 文件 * @param files 文件
* @param uuid
* @return 是否成功 * @return 是否成功
*/ */
@Override @Override
public List<Map<String, String>> uploadModels(MultipartFile[] files) throws Exception {
public List<Map<String, String>> uploadModels(MultipartFile[] files, String uuid) throws Exception {


List<Map<String, String>> results = new ArrayList<>(); List<Map<String, String>> results = new ArrayList<>();
//时间戳统一定在外面,一次上传就定好
Date createTime = new Date();
String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);
// //时间戳统一定在外面,一次上传就定好
// Date createTime = new Date();
// String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);


for (MultipartFile file:files){ for (MultipartFile file:files){
if (file.isEmpty()) { if (file.isEmpty()) {
@@ -217,22 +216,18 @@ public class ModelsServiceImpl implements ModelsService {
long sizeInBytes = file.getSize(); long sizeInBytes = file.getSize();
String formattedSize = FileUtil.formatFileSize(sizeInBytes); // 格式化文件大小 String formattedSize = FileUtil.formatFileSize(sizeInBytes); // 格式化文件大小





// 其余操作基于 modelsVersionToUse // 其余操作基于 modelsVersionToUse
String username = SecurityUtils.getLoginUser().getUsername(); String username = SecurityUtils.getLoginUser().getUsername();
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
String objectName = "models/" + username + "/" + timestamp + "/" + fileName;
String objectName = "models/" + username + "/" + uuid + "/" + fileName;


// 上传文件到MinIO并将记录新增到数据库中 // 上传文件到MinIO并将记录新增到数据库中
try (InputStream inputStream = file.getInputStream()) { try (InputStream inputStream = file.getInputStream()) {
minioUtil.uploadObject(bucketName, objectName, inputStream); minioUtil.uploadObject(bucketName, objectName, inputStream);
// ModelsVersion modelsVersion = new ModelsVersion();
// modelsVersion.setModelsId(id);
// modelsVersion.setVersion(version);
// modelsVersion.setUrl(objectName);
// modelsVersion.setFileName(fileName);
// modelsVersion.setFileSize(formattedSize);
// //返回插入结果
// ModelsVersion insertedModelsVersion = modelsVersionService.insert(modelsVersion);
//
Map<String, String> fileResult = new HashMap<>(); Map<String, String> fileResult = new HashMap<>();
fileResult.put("fileName", file.getOriginalFilename()); fileResult.put("fileName", file.getOriginalFilename());
fileResult.put("url", objectName); // objectName根据实际情况定义 fileResult.put("url", objectName); // objectName根据实际情况定义
@@ -361,6 +356,11 @@ public class ModelsServiceImpl implements ModelsService {
@Override @Override
@Transactional @Transactional
public String insertModelAndVersion(ModelsVo modelsVo) throws Exception { public String insertModelAndVersion(ModelsVo modelsVo) throws Exception {
List<VersionVo> modelsVersionVos = modelsVo.getModelsVersionVos();

if (modelsVersionVos==null || modelsVersionVos.isEmpty()){
throw new Exception("模型版本信息错误");
}
Models models = new Models(); Models models = new Models();
models.setName(modelsVo.getName()); models.setName(modelsVo.getName());
models.setDescription(modelsVo.getDescription()); models.setDescription(modelsVo.getDescription());
@@ -371,16 +371,20 @@ public class ModelsServiceImpl implements ModelsService {
if (modelsInsert == null){ if (modelsInsert == null){
throw new Exception("新增模型失败"); throw new Exception("新增模型失败");
} }
ModelsVersion modelsVersion = new ModelsVersion();
modelsVersion.setModelsId(modelsInsert.getId());
modelsVersion.setVersion(modelsVo.getVersion());
modelsVersion.setUrl(modelsVo.getUrl());
modelsVersion.setFileName(modelsVo.getFileName());
modelsVersion.setFileSize(modelsVo.getFileSize());
ModelsVersion modelsVersionInsert = this.modelsVersionService.insert(modelsVersion);
if (modelsVersionInsert == null) {
throw new Exception("新增模型失败");
//遍历版本信息列表,把文件信息插入数据库
for(VersionVo modelsVersionVo : modelsVersionVos){
ModelsVersion modelsVersion = new ModelsVersion();
modelsVersion.setModelsId(modelsInsert.getId());
modelsVersion.setVersion(modelsVo.getVersion());
modelsVersion.setUrl(modelsVersionVo.getUrl());
modelsVersion.setFileName(modelsVersionVo.getFileName());
modelsVersion.setFileSize(modelsVersionVo.getFileSize());
ModelsVersion modelsVersionInsert = this.modelsVersionService.insert(modelsVersion);
if (modelsVersionInsert == null) {
throw new Exception("新增模型版本失败");
}
} }

return "新增模型成功"; return "新增模型成功";


} }


+ 4
- 3
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java View File

@@ -166,9 +166,10 @@ public class ModelsVersionServiceImpl implements ModelsVersionService {
Map<String,Object> response = new HashMap<>(); Map<String,Object> response = new HashMap<>();


List<ModelsVersion> modelsVersionList = this.modelsVersionDao.queryAllByModelsVersion(modelsId, version); List<ModelsVersion> modelsVersionList = this.modelsVersionDao.queryAllByModelsVersion(modelsId, version);
modelsVersionList.stream().
findFirst().
ifPresent(modelsVersion -> {
modelsVersionList.stream()
.filter(modelsVersion -> modelsVersion.getUrl() != null && !modelsVersion.getUrl().isEmpty())
.findFirst()
.ifPresent(modelsVersion -> {
String url = modelsVersion.getUrl(); String url = modelsVersion.getUrl();
String path = bucketName + '/' + url.substring(0, url.lastIndexOf('/')); String path = bucketName + '/' + url.substring(0, url.lastIndexOf('/'));
response.put("path", path); response.put("path", path);


+ 5
- 3
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/DatasetVo.java View File

@@ -30,7 +30,9 @@ public class DatasetVo implements Serializable {
*/ */
@ApiModelProperty(name = "version") @ApiModelProperty(name = "version")
private String version; private String version;
private List<DatasetVersionVo> datasetVersionVos;

@ApiModelProperty(name = "dataset_version_vos")
private List<VersionVo> datasetVersionVos;
/** /**
* 可用集群 * 可用集群
*/ */
@@ -85,11 +87,11 @@ public class DatasetVo implements Serializable {
this.version = version; this.version = version;
} }


public List<DatasetVersionVo> getDatasetVersionVos() {
public List<VersionVo> getDatasetVersionVos() {
return datasetVersionVos; return datasetVersionVos;
} }


public void setDatasetVersionVos(List<DatasetVersionVo> datasetVersionVos) {
public void setDatasetVersionVos(List<VersionVo> datasetVersionVos) {
this.datasetVersionVos = datasetVersionVos; this.datasetVersionVos = datasetVersionVos;
} }




+ 14
- 37
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/ModelsVo.java View File

@@ -2,9 +2,11 @@ package com.ruoyi.platform.vo;


import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.ruoyi.platform.domain.ModelsVersion;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;


import java.io.Serializable; import java.io.Serializable;
import java.util.List;


@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class ModelsVo implements Serializable { public class ModelsVo implements Serializable {
@@ -36,27 +38,16 @@ public class ModelsVo implements Serializable {
*/ */
@ApiModelProperty(name = "version") @ApiModelProperty(name = "version")
private String version; private String version;
/**
* 模型存储地址
*/
@ApiModelProperty(name = "url")
private String url;
/**
* 文件名
*/
@ApiModelProperty(name = "file_name")
private String fileName;
/**
* 文件大小
*/
@ApiModelProperty(name = "file_size")
private String fileSize;

/** /**
* 状态 * 状态
*/ */
@ApiModelProperty(name = "status") @ApiModelProperty(name = "status")
private Integer status; private Integer status;


@ApiModelProperty(name = "models_version_vos")
private List<VersionVo> modelsVersionVos;



public String getName() { public String getName() {
return name; return name;
@@ -107,35 +98,21 @@ public class ModelsVo implements Serializable {
this.version = version; this.version = version;
} }


public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getFileName() {
return fileName;
public Integer getStatus() {
return status;
} }


public void setFileName(String fileName) {
this.fileName = fileName;
public void setStatus(Integer status) {
this.status = status;
} }


public String getFileSize() {
return fileSize;
public List<VersionVo> getModelsVersionVos() {
return modelsVersionVos;
} }


public void setFileSize(String fileSize) {
this.fileSize = fileSize;
public void setModelsVersionVos(List<VersionVo> modelsVersionVos) {
this.modelsVersionVos = modelsVersionVos;
} }


public Integer getStatus() {
return status;
}


public void setStatus(Integer status) {
this.status = status;
}
} }

ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/DatasetVersionVo.java → ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/VersionVo.java View File

@@ -7,7 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;


@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DatasetVersionVo implements Serializable {
public class VersionVo implements Serializable {


/** /**
* 数据集存储地址 * 数据集存储地址

Loading…
Cancel
Save