24282 2 years ago
parent
commit
00185aa8d7

+ 49 - 0
hx-file/pom.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.ruoyi</groupId>
+        <artifactId>ruoyi</artifactId>
+        <version>3.8.5</version>
+    </parent>
+
+    <artifactId>hx-file</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.huaweicloud</groupId>
+            <artifactId>esdk-obs-java</artifactId>
+            <version>3.19.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okio</groupId>
+            <artifactId>okio</artifactId>
+            <version>2.8.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fly</groupId>
+            <artifactId>my-generator</artifactId>
+            <version>1.0.0</version>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 47 - 0
hx-file/src/main/java/com/fjhx/file/controller/FileInfoController.java

@@ -0,0 +1,47 @@
+package com.fjhx.file.controller;
+
+import com.fjhx.file.entity.FileInfoSelectDto;
+import com.fjhx.file.entity.FileInfoVo;
+import com.fjhx.file.entity.SingDto;
+import com.fjhx.file.entity.SingVo;
+import com.fjhx.file.service.FileInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 文件表 前端控制器
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-03-14
+ */
+@RestController
+@RequestMapping("/fileInfo")
+public class FileInfoController {
+
+    @Autowired
+    private FileInfoService fileInfoService;
+
+    /**
+     * 获取前端直传签名
+     */
+    @PostMapping("/getSing")
+    public SingVo getSing(@RequestBody SingDto dto) {
+        return fileInfoService.getSing(dto);
+    }
+
+    /**
+     * 文件表列表
+     */
+    @PostMapping("/getList")
+    public List<FileInfoVo> getList(@RequestBody FileInfoSelectDto dto) {
+        return fileInfoService.getList(dto);
+    }
+
+}

+ 41 - 0
hx-file/src/main/java/com/fjhx/file/entity/FileInfo.java

@@ -0,0 +1,41 @@
+package com.fjhx.file.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 文件表
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-03-14
+ */
+@Getter
+@Setter
+@TableName("file_info")
+public class FileInfo extends BasePo {
+
+    /**
+     * 文件链接
+     */
+    private String fileUrl;
+
+    /**
+     * 文件名
+     */
+    private String fileName;
+
+    /**
+     * 业务id
+     */
+    private Long businessId;
+
+    /**
+     * 业务类型
+     */
+    private Byte businessType;
+
+}

+ 29 - 0
hx-file/src/main/java/com/fjhx/file/entity/FileInfoSelectDto.java

@@ -0,0 +1,29 @@
+package com.fjhx.file.entity;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 文件表列表查询入参实体
+ *
+ * @author zlj
+ * @since 2023-03-14
+ */
+@Getter
+@Setter
+public class FileInfoSelectDto extends BaseSelectDto {
+
+    /**
+     * 文件id列表
+     */
+    private List<Long> fileIdList;
+
+    /**
+     * 文件类型
+     */
+    private Integer fileType;
+
+}

+ 26 - 0
hx-file/src/main/java/com/fjhx/file/entity/FileInfoVo.java

@@ -0,0 +1,26 @@
+package com.fjhx.file.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 文件表列表查询返回值实体
+ *
+ * @author zlj
+ * @since 2023-03-14
+ */
+@Getter
+@Setter
+public class FileInfoVo {
+
+    /**
+     * 文件链接
+     */
+    private String url;
+
+    /**
+     * 文件名
+     */
+    private String name;
+
+}

+ 15 - 0
hx-file/src/main/java/com/fjhx/file/entity/SingDto.java

@@ -0,0 +1,15 @@
+package com.fjhx.file.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class SingDto {
+
+    /**
+     * 文件名
+     */
+    private String fileName;
+
+}

+ 37 - 0
hx-file/src/main/java/com/fjhx/file/entity/SingVo.java

@@ -0,0 +1,37 @@
+package com.fjhx.file.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Map;
+
+@Getter
+@Setter
+public class SingVo {
+
+    /**
+     * 上传路径
+     */
+    private String uploadUrl;
+
+    /**
+     * 上传参数
+     */
+    private Map<String, String> uploadBody;
+
+    /**
+     * 文件id
+     */
+    private Long id;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 文件名称
+     */
+    private String fileUrl;
+
+}

+ 26 - 0
hx-file/src/main/java/com/fjhx/file/mapper/FileInfoMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.file.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.file.entity.FileInfo;
+import com.fjhx.file.entity.FileInfoVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 文件表 Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-03-14
+ */
+public interface FileInfoMapper extends BaseMapper<FileInfo> {
+
+    /**
+     * 文件表列表
+     */
+    List<FileInfoVo> getList(@Param("ew") IWrapper<Object> wrapper);
+
+}

+ 29 - 0
hx-file/src/main/java/com/fjhx/file/service/FileInfoService.java

@@ -0,0 +1,29 @@
+package com.fjhx.file.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.file.entity.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 文件表 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-03-14
+ */
+public interface FileInfoService extends IService<FileInfo> {
+
+    /**
+     * 获取前端直传签名
+     */
+    SingVo getSing(SingDto dto);
+
+    /**
+     * 文件表列表
+     */
+    List<FileInfoVo> getList(FileInfoSelectDto dto);
+
+
+}

+ 135 - 0
hx-file/src/main/java/com/fjhx/file/service/impl/FileInfoServiceImpl.java

@@ -0,0 +1,135 @@
+package com.fjhx.file.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.file.entity.*;
+import com.fjhx.file.mapper.FileInfoMapper;
+import com.fjhx.file.service.FileInfoService;
+import com.obs.services.ObsClient;
+import com.obs.services.model.PostSignatureRequest;
+import com.obs.services.model.PostSignatureResponse;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * <p>
+ * 文件表 服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-03-14
+ */
+@Service
+public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> implements FileInfoService {
+
+    @Value("${obs.ak}")
+    private String ak;
+
+    @Value("${obs.sk}")
+    private String sk;
+
+    @Value("${obs.endPoint}")
+    private String endPoint;
+
+    @Value("${obs.url}")
+    private String url;
+
+    @Value("${obs.bucketName}")
+    private String bucketName;
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    @Override
+    public SingVo getSing(SingDto dto) {
+
+        SingVo singVo = new SingVo();
+
+        // 文件后缀名
+        String suffix = FileUtil.getSuffix(dto.getFileName());
+
+        // 文件路径
+        String objectKey = new StringJoiner("/")
+                .add("byteSailing")
+                .add(active)
+                .add(DateUtil.format(new Date(), "yyyy/MM/dd"))
+                .add(IdUtil.fastSimpleUUID() + (ObjectUtil.isEmpty(suffix) ? "" : "." + suffix))
+                .toString();
+
+        ObsClient obsClient = null;
+
+        try {
+            // 获取oss链接客户端
+            obsClient = getObsClient();
+            // 指定签名有效期为10秒
+            long currentTimeMillis = System.currentTimeMillis() + 1000 * 10;
+            // 获取签名
+            PostSignatureRequest request = new PostSignatureRequest(currentTimeMillis, bucketName, objectKey);
+            PostSignatureResponse temporarySignature = obsClient.createPostSignature(request);
+            // 封装签名
+            Map<String, String> body = new LinkedHashMap<>();
+            body.put("policy", temporarySignature.getPolicy());
+            body.put("AccessKeyId", sk);
+            body.put("signature", temporarySignature.getSignature());
+            body.put("key", objectKey);
+            singVo.setUploadBody(body);
+
+        } catch (Exception e) {
+            throw new ServiceException("获取签名失败");
+        } finally {
+            IoUtil.close(obsClient);
+        }
+
+        // 保存文件
+        FileInfo fileInfo = new FileInfo();
+        fileInfo.setFileUrl(objectKey);
+        fileInfo.setFileName(dto.getFileName());
+        save(fileInfo);
+
+        // 封装文件信息
+        singVo.setUploadUrl("https://" + bucketName + "." + endPoint);
+        singVo.setId(fileInfo.getId());
+        singVo.setFileName(dto.getFileName());
+        singVo.setFileUrl(url + objectKey);
+
+        return singVo;
+    }
+
+    public List<FileInfoVo> getList(FileInfoSelectDto dto) {
+
+        if (ObjectUtil.isEmpty(dto.getFileIdList())) {
+            return new ArrayList<>();
+        }
+
+        IWrapper<Object> wrapper = IWrapper.getWrapper();
+        wrapper.in("fi", FileInfo::getId, dto.getFileIdList());
+        wrapper.eq("fi", FileInfo::getBusinessType, dto.getFileType());
+        List<FileInfoVo> list = this.baseMapper.getList(wrapper);
+
+        if (list.size() == 0) {
+            return list;
+        }
+
+        for (FileInfoVo fileInfoVo : list) {
+            fileInfoVo.setUrl(url + fileInfoVo.getUrl());
+        }
+
+        return list;
+    }
+
+    /**
+     * 获取oss链接客户端
+     */
+    private ObsClient getObsClient() {
+        return new ObsClient(ak, sk, endPoint);
+    }
+
+}

+ 12 - 0
hx-file/src/main/resources/mapper/FileInfoMapper.xml

@@ -0,0 +1,12 @@
+<?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.fjhx.file.mapper.FileInfoMapper">
+    <select id="getList" resultType="com.fjhx.file.entity.FileInfoVo">
+        select fi.id,
+               fi.url,
+               fi.name
+        from file_info fi
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 17 - 0
hx-file/src/test/java/Main.java

@@ -0,0 +1,17 @@
+import fly.generator.GeneratorApplication;
+
+public class Main {
+
+    public static void main(String[] args) {
+        GeneratorApplication.builder()
+                .url("jdbc:mysql://36.134.91.96:17330/ry_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")
+                .username("fjhx2012mysql")
+                .password("3PN-Mzn#vnP&q6d")
+                .port(9989)
+                .module("fly-file")
+                .parent("com.fjhx.file")
+                .superServiceClass("com.ruoyi.common.core.service.BaseService")
+                .build();
+    }
+
+}

+ 30 - 0
hx-flow/pom.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.ruoyi</groupId>
+        <artifactId>ruoyi</artifactId>
+        <version>3.8.5</version>
+    </parent>
+
+    <artifactId>hx-flow</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 8 - 0
pom.xml

@@ -162,6 +162,12 @@
                 <version>${ruoyi.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>hx-file</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
@@ -172,6 +178,8 @@
         <module>ruoyi-common</module>
         <module>hx-socket</module>
         <module>hx-base</module>
+        <module>hx-file</module>
+        <module>hx-flow</module>
     </modules>
     <packaging>pom</packaging>