feat(video): 新增模型管理与MinIO对象存储功能

- 新增算法模型实体类VModel及对应CRUD接口和实现
- 新增MinIO对象记录实体类VMinioObject及对应CRUD接口和实现
- 实现模型下载重定向功能
- 扩展MinioService支持指定文件名上传和删除对象
- 在CommonController中增加上传后持久化MinIO对象记录逻辑
- 新增ModelController用于模型管理RESTful接口- 新增VMinioObjectController用于MinIO对象记录管理接口
- 添加相关Mapper XML配置和DAO接口
- 更新pom.xml引入必要依赖
This commit is contained in:
2025-09-29 10:37:12 +08:00
parent e4f0c65478
commit af815e00ee
16 changed files with 611 additions and 4 deletions

View File

@@ -0,0 +1,36 @@
package com.ruoyi.video.domain;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* MinIO 返回结果记录实体,对应表 v_minio_object
*/
public class VMinioObject extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 主键ID */
private Long objectId;
/** MinIO 对象名Key */
private String objectName;
/** 访问URL */
private String url;
/** 原始文件名(上传时的文件名) */
private String originalName;
/** 删除标志0存在 2删除 */
private String delFlag;
public Long getObjectId() { return objectId; }
public void setObjectId(Long objectId) { this.objectId = objectId; }
public String getObjectName() { return objectName; }
public void setObjectName(String objectName) { this.objectName = objectName; }
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public String getOriginalName() { return originalName; }
public void setOriginalName(String originalName) { this.originalName = originalName; }
public String getDelFlag() { return delFlag; }
public void setDelFlag(String delFlag) { this.delFlag = delFlag; }
}

View File

@@ -0,0 +1,47 @@
package com.ruoyi.video.domain;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 算法模型ONNX等记录表 v_model
*/
public class VModel extends BaseEntity {
private static final long serialVersionUID = 1L;
private Long modelId;
private String modelName;
private String version;
private String framework; // e.g., onnx
private String url; // OSS/MinIO 直链
private Long fileSize; // bytes
private String checksum; // e.g., sha256
private Integer enabled; // 1启用 0禁用
private String delFlag; // 0存在 2删除
public Long getModelId() { return modelId; }
public void setModelId(Long modelId) { this.modelId = modelId; }
public String getModelName() { return modelName; }
public void setModelName(String modelName) { this.modelName = modelName; }
public String getVersion() { return version; }
public void setVersion(String version) { this.version = version; }
public String getFramework() { return framework; }
public void setFramework(String framework) { this.framework = framework; }
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public Long getFileSize() { return fileSize; }
public void setFileSize(Long fileSize) { this.fileSize = fileSize; }
public String getChecksum() { return checksum; }
public void setChecksum(String checksum) { this.checksum = checksum; }
public Integer getEnabled() { return enabled; }
public void setEnabled(Integer enabled) { this.enabled = enabled; }
public String getDelFlag() { return delFlag; }
public void setDelFlag(String delFlag) { this.delFlag = delFlag; }
}

View File

@@ -0,0 +1,15 @@
package com.ruoyi.video.mapper;
import com.ruoyi.video.domain.VMinioObject;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface VMinioObjectMapper {
int insertVMinioObject(VMinioObject obj);
VMinioObject selectVMinioObjectById(@Param("id") Long id);
int deleteVMinioObjectById(@Param("id") Long id);
VMinioObject selectVMinioObjectByObjectName(@Param("objectName") String objectName);
int deleteVMinioObjectByObjectName(@Param("objectName") String objectName);
}

View File

@@ -0,0 +1,16 @@
package com.ruoyi.video.mapper;
import com.ruoyi.video.domain.VModel;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface VModelMapper {
int insertModel(VModel model);
VModel selectModelById(@Param("id") Long id);
int deleteModelById(@Param("id") Long id);
int updateEnabled(@Param("id") Long id, @Param("enabled") Integer enabled);
List<VModel> selectModelList(Map<String, Object> params);
}

View File

@@ -0,0 +1,13 @@
package com.ruoyi.video.service;
import com.ruoyi.video.domain.VMinioObject;
public interface IVMinioObjectService {
int insert(VMinioObject obj);
VMinioObject selectById(Long id);
int deleteById(Long id);
VMinioObject selectByObjectName(String objectName);
int deleteByObjectName(String objectName);
}

View File

@@ -0,0 +1,14 @@
package com.ruoyi.video.service;
import com.ruoyi.video.domain.VModel;
import java.util.List;
import java.util.Map;
public interface IVModelService {
int insert(VModel model);
VModel selectById(Long id);
int deleteById(Long id);
int updateEnabled(Long id, Integer enabled);
List<VModel> selectList(Map<String, Object> params);
}

View File

@@ -0,0 +1,43 @@
package com.ruoyi.video.service.impl;
import com.ruoyi.video.domain.VMinioObject;
import com.ruoyi.video.mapper.VMinioObjectMapper;
import com.ruoyi.video.service.IVMinioObjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class VMinioObjectServiceImpl implements IVMinioObjectService {
@Autowired
private VMinioObjectMapper mapper;
@Override
public int insert(VMinioObject obj) {
if (obj.getDelFlag() == null) {
obj.setDelFlag("0");
}
return mapper.insertVMinioObject(obj);
}
@Override
public VMinioObject selectById(Long id) {
return mapper.selectVMinioObjectById(id);
}
@Override
public int deleteById(Long id) {
return mapper.deleteVMinioObjectById(id);
}
@Override
public VMinioObject selectByObjectName(String objectName) {
return mapper.selectVMinioObjectByObjectName(objectName);
}
@Override
public int deleteByObjectName(String objectName) {
return mapper.deleteVMinioObjectByObjectName(objectName);
}
}

View File

@@ -0,0 +1,46 @@
package com.ruoyi.video.service.impl;
import com.ruoyi.video.domain.VModel;
import com.ruoyi.video.mapper.VModelMapper;
import com.ruoyi.video.service.IVModelService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class VModelServiceImpl implements IVModelService {
private final VModelMapper mapper;
public VModelServiceImpl(VModelMapper mapper) {
this.mapper = mapper;
}
@Override
public int insert(VModel model) {
if (model.getEnabled() == null) model.setEnabled(1);
if (model.getDelFlag() == null) model.setDelFlag("0");
return mapper.insertModel(model);
}
@Override
public VModel selectById(Long id) {
return mapper.selectModelById(id);
}
@Override
public int deleteById(Long id) {
return mapper.deleteModelById(id);
}
@Override
public int updateEnabled(Long id, Integer enabled) {
return mapper.updateEnabled(id, enabled);
}
@Override
public List<VModel> selectList(Map<String, Object> params) {
return mapper.selectModelList(params);
}
}

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.video.mapper.VMinioObjectMapper">
<resultMap id="VMinioObjectResult" type="com.ruoyi.video.domain.VMinioObject">
<id property="objectId" column="object_id" />
<result property="objectName" column="object_name" />
<result property="url" column="url" />
<result property="originalName" column="original_name" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="delFlag" column="del_flag" />
</resultMap>
<insert id="insertVMinioObject" parameterType="com.ruoyi.video.domain.VMinioObject" useGeneratedKeys="true" keyProperty="objectId">
INSERT INTO v_minio_object (
object_name,
url,
original_name,
create_by,
create_time,
update_by,
update_time,
remark,
del_flag
) VALUES (
#{objectName},
#{url},
#{originalName},
#{createBy},
NOW(),
#{updateBy},
NOW(),
#{remark},
#{delFlag}
)
</insert>
<select id="selectVMinioObjectById" parameterType="long" resultMap="VMinioObjectResult">
SELECT * FROM v_minio_object WHERE object_id = #{id}
</select>
<delete id="deleteVMinioObjectById" parameterType="long">
DELETE FROM v_minio_object WHERE object_id = #{id}
</delete>
<select id="selectVMinioObjectByObjectName" parameterType="string" resultMap="VMinioObjectResult">
SELECT * FROM v_minio_object WHERE object_name = #{objectName}
</select>
<delete id="deleteVMinioObjectByObjectName" parameterType="string">
DELETE FROM v_minio_object WHERE object_name = #{objectName}
</delete>
</mapper>

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.video.mapper.VModelMapper">
<resultMap id="VModelResult" type="com.ruoyi.video.domain.VModel">
<id property="modelId" column="model_id" />
<result property="modelName" column="model_name" />
<result property="version" column="version" />
<result property="framework" column="framework" />
<result property="url" column="url" />
<result property="fileSize" column="file_size" />
<result property="checksum" column="checksum" />
<result property="enabled" column="enabled" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="delFlag" column="del_flag" />
</resultMap>
<insert id="insertModel" parameterType="com.ruoyi.video.domain.VModel" useGeneratedKeys="true" keyProperty="modelId">
INSERT INTO v_model (
model_name, version, framework, url, file_size, checksum, enabled,
create_by, create_time, update_by, update_time, remark, del_flag
) VALUES (
#{modelName}, #{version}, #{framework}, #{url}, #{fileSize}, #{checksum}, #{enabled},
#{createBy}, NOW(), #{updateBy}, NOW(), #{remark}, #{delFlag}
)
</insert>
<select id="selectModelById" parameterType="long" resultMap="VModelResult">
SELECT * FROM v_model WHERE model_id = #{id}
</select>
<delete id="deleteModelById" parameterType="long">
DELETE FROM v_model WHERE model_id = #{id}
</delete>
<update id="updateEnabled">
UPDATE v_model SET enabled = #{enabled}, update_time = NOW() WHERE model_id = #{id}
</update>
<select id="selectModelList" parameterType="map" resultMap="VModelResult">
SELECT * FROM v_model
<where>
<if test="modelName != null and modelName != ''">
AND model_name LIKE CONCAT('%', #{modelName}, '%')
</if>
<if test="framework != null and framework != ''">
AND framework = #{framework}
</if>
<if test="enabled != null">
AND enabled = #{enabled}
</if>
<if test="keyword != null and keyword != ''">
AND (
model_name LIKE CONCAT('%', #{keyword}, '%')
OR version LIKE CONCAT('%', #{keyword}, '%')
OR url LIKE CONCAT('%', #{keyword}, '%')
)
</if>
</where>
ORDER BY create_time DESC
</select>
</mapper>