diff --git a/pom.xml b/pom.xml index 91b8578..269c945 100644 --- a/pom.xml +++ b/pom.xml @@ -330,6 +330,7 @@ vetti-generator vetti-common vetti-ai + vetti-hotake pom diff --git a/vetti-admin/pom.xml b/vetti-admin/pom.xml index 6e12b32..b5ea68f 100644 --- a/vetti-admin/pom.xml +++ b/vetti-admin/pom.xml @@ -84,6 +84,12 @@ org.springframework.boot spring-boot-starter-websocket + + com.vetti + vetti-hotake + 3.9.0 + compile + diff --git a/vetti-admin/src/main/java/com/vetti/web/controller/hotake/HotakeSysFileController.java b/vetti-admin/src/main/java/com/vetti/web/controller/hotake/HotakeSysFileController.java new file mode 100644 index 0000000..03f94d3 --- /dev/null +++ b/vetti-admin/src/main/java/com/vetti/web/controller/hotake/HotakeSysFileController.java @@ -0,0 +1,112 @@ +package com.vetti.web.controller.hotake; + + +import com.vetti.common.annotation.Log; +import com.vetti.common.core.controller.BaseController; +import com.vetti.common.core.domain.AjaxResult; +import com.vetti.common.core.page.TableDataInfo; +import com.vetti.common.enums.BusinessType; +import com.vetti.common.utils.poi.ExcelUtil; +import com.vetti.hotake.domain.HotakeSysFile; +import com.vetti.hotake.domain.dto.HotakeSysFileDto; +import com.vetti.hotake.service.IHotakeSysFileService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 文件管理Controller + * + * @author ID + * @date 2025-09-06 + */ +@Api(tags = "文件管理") +@RestController +@RequestMapping("/hotake/sysFile") +public class HotakeSysFileController extends BaseController { + + @Autowired + private IHotakeSysFileService hotakeSysFileService; + + /** + * 查询文件管理列表 + */ + @ApiOperation("查询文件管理列表") + @PreAuthorize("@ss.hasPermi('command:sysFile:list')") + @GetMapping("/list") + public TableDataInfo list(HotakeSysFile HotakeSysFile) { + startPage(); + List list = hotakeSysFileService.selectHotakeSysFileList(HotakeSysFile); + return getDataTable(list); + } + + /** + * 导出文件管理列表 + */ + @ApiOperation("导出文件管理列表") + @PreAuthorize("@ss.hasPermi('command:sysFile:export')") + @Log(title = "文件管理", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(HotakeSysFile HotakeSysFile) { + List list = hotakeSysFileService.selectHotakeSysFileList(HotakeSysFile); + ExcelUtil util = new ExcelUtil(HotakeSysFileDto.class); + return util.exportExcel(list, "文件管理数据"); + } + + /** + * 获取文件管理详细信息 + */ + @ApiOperation("获取文件管理详细信息") + @PreAuthorize("@ss.hasPermi('command:sysFile:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(hotakeSysFileService.selectHotakeSysFileById(id)); + } + + /** + * 新增文件管理 + */ + @ApiOperation("新增文件管理") + @PreAuthorize("@ss.hasPermi('command:sysFile:add')") + @Log(title = "文件管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestPart("file") MultipartFile file, HotakeSysFile HotakeSysFile) { + hotakeSysFileService.insertHotakeSysFile(file, HotakeSysFile); + return toAjax(1); + } + + /** + * 修改文件管理 + */ + @ApiOperation("修改文件管理") + @PreAuthorize("@ss.hasPermi('command:sysFile:edit')") + @Log(title = "文件管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestPart(name = "file", required = false) MultipartFile file, HotakeSysFile HotakeSysFile) { + return toAjax(hotakeSysFileService.updateHotakeSysFile(file, HotakeSysFile)); + } + + /** + * 删除文件管理 + */ + @ApiOperation("删除文件管理") + @PreAuthorize("@ss.hasPermi('command:sysFile:remove')") + @Log(title = "文件管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(hotakeSysFileService.deleteHotakeSysFileByIds(ids)); + } + + @ApiOperation("禁用文件管理") + @PreAuthorize("@ss.hasPermi('command:sysFile:edit')") + @Log(title = "文件管理", businessType = BusinessType.UPDATE) + @PutMapping("/available/{id}") + public AjaxResult availableSysFile(@PathVariable Long id) { + return toAjax(hotakeSysFileService.availableSysFile(id)); + } +} diff --git a/vetti-hotake/pom.xml b/vetti-hotake/pom.xml new file mode 100644 index 0000000..a038dfb --- /dev/null +++ b/vetti-hotake/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.vetti + vetti-service + 3.9.0 + + + vetti-hotake + + + + + + io.swagger + swagger-models + + + + org.projectlombok + lombok + + + + + com.vetti + vetti-common + + + com.vetti + vetti-system + + + + \ No newline at end of file diff --git a/vetti-hotake/src/main/java/com/vetti/hotake/domain/HotakeSysFile.java b/vetti-hotake/src/main/java/com/vetti/hotake/domain/HotakeSysFile.java new file mode 100644 index 0000000..8b8cb45 --- /dev/null +++ b/vetti-hotake/src/main/java/com/vetti/hotake/domain/HotakeSysFile.java @@ -0,0 +1,71 @@ +package com.vetti.hotake.domain; + + +import com.vetti.common.annotation.Excel; +import com.vetti.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 文件管理对象 command_sys_file + * + * @author ID + * @date 2025-09-06 + */ +@Data +@Accessors(chain = true) +public class HotakeSysFile extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @ApiModelProperty("ID") + private Long id; + + /** 存储minio中桶名字 */ + @ApiModelProperty("存储minio中桶名字") + @Excel(name = "存储minio中桶名字") + private String minioBucketName; + + /** CODE */ + @ApiModelProperty("CODE") + @Excel(name = "CODE") + private String code; + + /** 文件名称 */ + @ApiModelProperty("文件名称") + @Excel(name = "文件名称") + private String fileName; + + /** 文件类型(如:image/jpeg, application/pdf等) */ + @ApiModelProperty("文件类型(如:image/jpeg, application/pdf等)") + @Excel(name = "文件类型", readConverterExp = "如=:image/jpeg,,a=pplication/pdf等") + private String fileType; + + /** 文件大小,单位字节 */ + @ApiModelProperty("文件大小,单位字节") + @Excel(name = "文件大小,单位字节") + private Long fileSize; + + /** 文件存储路径(物理路径或云存储URL) */ + @ApiModelProperty("文件存储路径(物理路径或云存储URL)") + @Excel(name = "文件存储路径", readConverterExp = "物理路径或云存储URL") + private String storagePath; + + /** 文件MD5值,用于校验文件完整性和去重 */ + @ApiModelProperty("文件MD5值,用于校验文件完整性和去重") + @Excel(name = "文件MD5值,用于校验文件完整性和去重") + private String fileMd5; + + /** 上传平台:1-PC管理平台,2-APP端 */ + @ApiModelProperty("上传平台:1-PC管理平台,2-APP端") + @Excel(name = "上传平台:1-PC管理平台,2-APP端") + private Integer uploadPlatform; + + /** 是否可用(1可用,2不可用) */ + @ApiModelProperty("是否可用(1可用,2不可用)") + @Excel(name = "是否可用", readConverterExp = "1=可用,2不可用") + private Integer available; + +} diff --git a/vetti-hotake/src/main/java/com/vetti/hotake/domain/dto/HotakeSysFileDto.java b/vetti-hotake/src/main/java/com/vetti/hotake/domain/dto/HotakeSysFileDto.java new file mode 100644 index 0000000..152f939 --- /dev/null +++ b/vetti-hotake/src/main/java/com/vetti/hotake/domain/dto/HotakeSysFileDto.java @@ -0,0 +1,23 @@ +package com.vetti.hotake.domain.dto; + +import com.vetti.common.utils.bean.BeanUtils; +import com.vetti.hotake.domain.HotakeSysFile; +import lombok.Data; + +/** + * @author ID + * @date 2025/9/7 16:10 + */ +@Data +public class HotakeSysFileDto extends HotakeSysFile { + + private String downloadLink; + + public static HotakeSysFileDto build(String link, HotakeSysFile data) { + HotakeSysFileDto dto = new HotakeSysFileDto(); + BeanUtils.copyBeanProp(dto, data); + dto.setDownloadLink(link); + return dto; + } + +} diff --git a/vetti-hotake/src/main/java/com/vetti/hotake/mapper/HotakeSysFileMapper.java b/vetti-hotake/src/main/java/com/vetti/hotake/mapper/HotakeSysFileMapper.java new file mode 100644 index 0000000..c870afe --- /dev/null +++ b/vetti-hotake/src/main/java/com/vetti/hotake/mapper/HotakeSysFileMapper.java @@ -0,0 +1,74 @@ +package com.vetti.hotake.mapper; + + +import com.vetti.hotake.domain.HotakeSysFile; + +import java.util.List; + +/** + * 文件管理Mapper接口 + * + * @author ID + * @date 2025-09-06 + */ +public interface HotakeSysFileMapper +{ + /** + * 查询文件管理 + * + * @param id 文件管理主键 + * @return 文件管理 + */ + public HotakeSysFile selectHotakeSysFileById(Long id); + + /** + * 查询文件管理列表 + * + * @param HotakeSysFile 文件管理 + * @return 文件管理集合 + */ + public List selectHotakeSysFileList(HotakeSysFile HotakeSysFile); + + /** + * 新增文件管理 + * + * @param HotakeSysFile 文件管理 + * @return 结果 + */ + public int insertHotakeSysFile(HotakeSysFile HotakeSysFile); + + /** + * 修改文件管理 + * + * @param HotakeSysFile 文件管理 + * @return 结果 + */ + public int updateHotakeSysFile(HotakeSysFile HotakeSysFile); + + /** + * 删除文件管理 + * + * @param id 文件管理主键 + * @return 结果 + */ + public int deleteHotakeSysFileById(Long id); + + /** + * 批量删除文件管理 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteHotakeSysFileByIds(Long[] ids); + /** + * 批量新增文件管理 + * + * @param HotakeSysFileList 文件管理列表 + * @return 结果 + */ + public int batchInsertHotakeSysFile(List HotakeSysFileList); + + + public List selectHotakeSysFileByIds(Long[] ids); + +} diff --git a/vetti-hotake/src/main/java/com/vetti/hotake/service/IHotakeSysFileService.java b/vetti-hotake/src/main/java/com/vetti/hotake/service/IHotakeSysFileService.java new file mode 100644 index 0000000..c088162 --- /dev/null +++ b/vetti-hotake/src/main/java/com/vetti/hotake/service/IHotakeSysFileService.java @@ -0,0 +1,102 @@ +package com.vetti.hotake.service; + +import com.vetti.hotake.domain.HotakeSysFile; +import com.vetti.hotake.domain.dto.HotakeSysFileDto; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; + +/** + * 文件管理Service接口 + * + * @author ID + * @date 2025-09-06 + */ +public interface IHotakeSysFileService { + /** + * 查询文件管理 + * + * @param id 文件管理主键 + * @return 文件管理 + */ + public HotakeSysFile selectHotakeSysFileById(Long id); + + /** + * 查询文件管理列表 + * + * @param hotakeSysFile 文件管理 + * @return 文件管理集合 + */ + public List selectHotakeSysFileList(HotakeSysFile hotakeSysFile); + + /** + * 新增文件管理 + * + * @param hotakeSysFile 文件管理 + * @return 结果 + */ + public HotakeSysFile insertHotakeSysFile(MultipartFile file, HotakeSysFile hotakeSysFile); + + /** + * 修改文件管理 + * + * @param hotakeSysFile 文件管理 + * @return 结果 + */ + public int updateHotakeSysFile(MultipartFile file, HotakeSysFile hotakeSysFile); + + /** + * 批量删除文件管理 + * + * @param ids 需要删除的文件管理主键集合 + * @return 结果 + */ + public int deleteHotakeSysFileByIds(Long[] ids); + + /** + * 删除文件管理信息 + * + * @param id 文件管理主键 + * @return 结果 + */ + public int deleteHotakeSysFileById(Long id); + + /** + * 批量新增文件管理 + * + * @param hotakeSysFileList 文件管理列表 + * @return 结果 + */ + public int batchInsertHotakeSysFile(List hotakeSysFileList); + + int availableSysFile(Long id); + + /** + * 获取文件url + * + * @param data + * @return + */ + String url(HotakeSysFile data); + + /** + * 获取文件url + * + * @param id + * @return + */ + String url(Long id); + + /** + * 获取文件url + * + * @param ids + * @return + */ + Map url(Long[] ids); + + public void updateData(MultipartFile file, HotakeSysFile hotakeSysFile); + + +} diff --git a/vetti-hotake/src/main/java/com/vetti/hotake/service/impl/HotakeSysFileServiceImpl.java b/vetti-hotake/src/main/java/com/vetti/hotake/service/impl/HotakeSysFileServiceImpl.java new file mode 100644 index 0000000..406b7f6 --- /dev/null +++ b/vetti-hotake/src/main/java/com/vetti/hotake/service/impl/HotakeSysFileServiceImpl.java @@ -0,0 +1,221 @@ +package com.vetti.hotake.service.impl; + + +import com.vetti.common.config.MinioConfig; +import com.vetti.common.core.service.BaseServiceImpl; +import com.vetti.common.enums.FillTypeEnum; +import com.vetti.common.utils.file.FileTypeUtils; +import com.vetti.common.utils.file.FileUtils; +import com.vetti.common.utils.file.MinioUtil; +import com.vetti.common.utils.sign.Md5Utils; +import com.vetti.hotake.domain.HotakeSysFile; +import com.vetti.hotake.domain.dto.HotakeSysFileDto; +import com.vetti.hotake.mapper.HotakeSysFileMapper; +import com.vetti.hotake.service.IHotakeSysFileService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.vetti.common.utils.SecurityUtils.getLoginUser; + +/** + * 文件管理Service业务层处理 + * + * @author ID + * @date 2025-09-06 + */ +@SuppressWarnings("all") +@Service +public class HotakeSysFileServiceImpl extends BaseServiceImpl implements IHotakeSysFileService { + @Resource + private HotakeSysFileMapper hotakeSysFileMapper; + + @Resource + MinioUtil minioUtil; + + @Resource + MinioConfig minioConfig; + + /** + * 查询文件管理 + * + * @param id 文件管理主键 + * @return 文件管理 + */ + @Transactional(readOnly = true) + @Override + public HotakeSysFile selectHotakeSysFileById(Long id) { + return hotakeSysFileMapper.selectHotakeSysFileById(id); + } + + /** + * 查询文件管理列表 + * + * @param HotakeSysFile 文件管理 + * @return 文件管理 + */ + @Transactional(readOnly = true) + @Override + public List selectHotakeSysFileList(HotakeSysFile HotakeSysFile) { + List l = new ArrayList<>(); + List dataL = hotakeSysFileMapper.selectHotakeSysFileList(HotakeSysFile); + if (CollectionUtils.isNotEmpty(dataL)) { + dataL.forEach(e -> { + l.add(HotakeSysFileDto.build(url(e), e)); + }); + } + return l; + } + + /** + * 新增文件管理 + * + * @param HotakeSysFile 文件管理 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public HotakeSysFile insertHotakeSysFile(MultipartFile file, HotakeSysFile HotakeSysFile) { + if (file == null) { + throw new IllegalArgumentException("文件不能为空"); + } + if (StringUtils.isEmpty(HotakeSysFile.getCode())) { + throw new IllegalArgumentException("CODE不能为空"); + } + if (StringUtils.isEmpty(HotakeSysFile.getMinioBucketName())) { + throw new IllegalArgumentException("桶不能为空"); + } + if (checkCode(HotakeSysFile)) { + throw new IllegalArgumentException("CODE不能重复"); + } + HotakeSysFile.setUploadPlatform(1);//PC + updateData(file, HotakeSysFile); + fill(FillTypeEnum.INSERT.getCode(), HotakeSysFile); + hotakeSysFileMapper.insertHotakeSysFile(HotakeSysFile); + return HotakeSysFile; + } + + private boolean checkCode(HotakeSysFile HotakeSysFile) { + HotakeSysFile query = new HotakeSysFile(); + query.setCode(HotakeSysFile.getCode()); + query.setMinioBucketName(HotakeSysFile.getMinioBucketName()); + List HotakeSysFiles = hotakeSysFileMapper.selectHotakeSysFileList(HotakeSysFile); + if (HotakeSysFiles.isEmpty()) { + return false; + } + return true; + } + + @Override + public void updateData(MultipartFile file, HotakeSysFile HotakeSysFile) { + try { + String fileUrl = minioUtil.uploadFile(file, minioUtil.objectName(getLoginUser().getUserId()), HotakeSysFile.getMinioBucketName()); + HotakeSysFile.setStoragePath(fileUrl); + HotakeSysFile.setAvailable(1);//可用 +// HotakeSysFile.setUploadPlatform(1);//PC + HotakeSysFile.setFileName(FileUtils.cleanFileName(file.getOriginalFilename())); + HotakeSysFile.setFileType(FileTypeUtils.getFileType(file.getOriginalFilename())); + HotakeSysFile.setFileSize(file.getSize()); + HotakeSysFile.setFileMd5(Md5Utils.getFileMd5(FileUtils.convert(file))); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 修改文件管理 + * + * @param HotakeSysFile 文件管理 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public int updateHotakeSysFile(MultipartFile file, HotakeSysFile HotakeSysFile) { + HotakeSysFile old = hotakeSysFileMapper.selectHotakeSysFileById(HotakeSysFile.getId()); + if (file == null) { + old.setRemark(HotakeSysFile.getRemark()); + fill(FillTypeEnum.UPDATE.getCode(), old); + return hotakeSysFileMapper.updateHotakeSysFile(old); + } + HotakeSysFile.setUploadPlatform(1);//PC + updateData(file, HotakeSysFile); + fill(FillTypeEnum.UPDATE.getCode(), HotakeSysFile); + return hotakeSysFileMapper.updateHotakeSysFile(HotakeSysFile); + } + + /** + * 批量删除文件管理 + * + * @param ids 需要删除的文件管理主键 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public int deleteHotakeSysFileByIds(Long[] ids) { + return hotakeSysFileMapper.deleteHotakeSysFileByIds(ids); + } + + /** + * 删除文件管理信息 + * + * @param id 文件管理主键 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public int deleteHotakeSysFileById(Long id) { + return hotakeSysFileMapper.deleteHotakeSysFileById(id); + } + + /** + * 批量新增文件管理 + * + * @param HotakeSysFileList 文件管理列表 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public int batchInsertHotakeSysFile(List HotakeSysFileList) { + return hotakeSysFileMapper.batchInsertHotakeSysFile(HotakeSysFileList); + } + + @Override + public int availableSysFile(Long id) { + HotakeSysFile HotakeSysFile = hotakeSysFileMapper.selectHotakeSysFileById(id); + HotakeSysFile.setAvailable(2); + fill(FillTypeEnum.UPDATE.getCode(), HotakeSysFile); + return hotakeSysFileMapper.updateHotakeSysFile(HotakeSysFile); + } + + @Override + public String url(HotakeSysFile data) { + return minioConfig.getEndpoint() + "/" + data.getMinioBucketName() + "/" + data.getStoragePath(); + } + + @Override + public String url(Long id) { + return url(hotakeSysFileMapper.selectHotakeSysFileById(id)); + } + + @Override + public Map url(Long[] ids) { + List l = hotakeSysFileMapper.selectHotakeSysFileByIds(ids); + if (CollectionUtils.isEmpty(l)) { + return null; + } + Map map = new HashMap<>(); + l.forEach(e -> { + map.put(e.getId(), url(e)); + }); + return map; + } + +} diff --git a/vetti-hotake/src/main/resources/mapper/hotake/HotakeSysFileMapper.xml b/vetti-hotake/src/main/resources/mapper/hotake/HotakeSysFileMapper.xml new file mode 100644 index 0000000..dc50c6d --- /dev/null +++ b/vetti-hotake/src/main/resources/mapper/hotake/HotakeSysFileMapper.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, minio_bucket_name, code, file_name, file_type, file_size, storage_path, file_md5, upload_platform, available, create_by, create_time, update_by, update_time, remark from hotake_sys_file + + + + + + + + insert into Hotake_sys_file + + minio_bucket_name, + code, + file_name, + file_type, + file_size, + storage_path, + file_md5, + upload_platform, + available, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{minioBucketName}, + #{code}, + #{fileName}, + #{fileType}, + #{fileSize}, + #{storagePath}, + #{fileMd5}, + #{uploadPlatform}, + #{available}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update Hotake_sys_file + + minio_bucket_name = #{minioBucketName}, + code = #{code}, + file_name = #{fileName}, + file_type = #{fileType}, + file_size = #{fileSize}, + storage_path = #{storagePath}, + file_md5 = #{fileMd5}, + upload_platform = #{uploadPlatform}, + available = #{available}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from Hotake_sys_file where id = #{id} + + + + delete from Hotake_sys_file where id in + + #{id} + + + + + insert into Hotake_sys_file( id, minio_bucket_name, code, file_name, file_type, file_size, storage_path, file_md5, upload_platform, available, create_by, create_time, update_by, update_time, remark,) values + + ( #{item.id}, #{item.minioBucketName}, #{item.code}, #{item.fileName}, #{item.fileType}, #{item.fileSize}, #{item.storagePath}, #{item.fileMd5}, #{item.uploadPlatform}, #{item.available}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.remark},) + + + + + + \ No newline at end of file