ソースを参照

feat(adm-diagram): 图标相关接口、schema.sql

liyang 3 年 前
コミット
3d9411bd6e

+ 160 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/controller/IconController.java

@@ -0,0 +1,160 @@
+package com.persagy.adm.diagram.controller;
+
+import cn.hutool.http.HttpUtil;
+import com.persagy.adm.diagram.entity.IconEntity;
+import com.persagy.adm.diagram.frame.BdtpRequest;
+import com.persagy.adm.diagram.service.IconService;
+import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.common.utils.ResultHelper;
+import com.persagy.dmp.file.model.FileInfo;
+import com.persagy.dmp.file.model.FileInfoCreator;
+import com.persagy.dmp.file.utils.FileStorageHelper;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 图标相关接口
+ *
+ * @author liyang
+ * @date 2022-01-06
+ */
+@RestController
+@CrossOrigin
+@RequestMapping("/icon")
+public class IconController {
+
+    @Autowired
+    private IconService iconService;
+
+    /**
+     * 上传图标接口
+     *
+     * @param file     文件
+     * @param legendId 所关联的图例id
+     * @param skin     皮肤
+     * @return
+     */
+    @ApiOperation("上传图标")
+    @PostMapping("/uploadIcon")
+    public CommonResult<Object> uploadIcon(@RequestParam("file") MultipartFile file,
+                                           @RequestParam String legendId,
+                                           @RequestParam(required = false) String skin) {
+        String fileName = file.getOriginalFilename();
+        long size = file.getSize();
+
+        IconEntity entity = new IconEntity();
+        entity.setIconSkin(skin);
+        entity.setLegendId(legendId);
+        entity.setIconSize(String.valueOf(size));
+
+        Optional.ofNullable(fileName).ifPresent(s -> {
+            int index = s.lastIndexOf(".");
+            String name = s.substring(0, index);
+            String fileType = s.substring(index + 1);
+            entity.setIconName(name);
+            entity.setIconType(fileType);
+        });
+
+        InputStream inputStream = null;
+        Image img = null;
+        try {
+            inputStream = file.getInputStream();
+            img = ImageIO.read(inputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        boolean isImage = img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0;
+        if (null == inputStream || isImage) {
+            throw new BusinessException(ResponseCode.A0400.getCode(), "文件不能为空,并且必须是图片!");
+        }
+
+        FileInfo fileInfo = FileInfoCreator.of(BdtpRequest.getCurrent().getGroupCode(), null,
+                null, entity.getIconName());
+        String fileId = FileStorageHelper.uploadFile(fileInfo, inputStream);
+
+        entity.setIconFileId(fileId);
+
+        return ResultHelper.single(iconService.saveIcon(entity));
+
+    }
+
+    /**
+     * 图标预览
+     * TODO 目前这个接口不可用 文件服务器好像有问题
+     * @param request  请求体
+     * @param response 响应体
+     * @param iconId   图标数据id
+     */
+    @ApiOperation("图标预览")
+    @GetMapping("/showImage")
+    public void loadFile(HttpServletRequest request, HttpServletResponse response,
+                         @RequestParam("id") String iconId) {
+        IconEntity info = iconService.getIconInfo(iconId);
+        if (null == info) {
+            throw new BusinessException(ResponseCode.A0400.getCode(), "未查到此数据");
+        }
+        FileInfo fileInfo = FileStorageHelper.downloadUrl(info.getIconFileId());
+        System.out.println(fileInfo);
+        // 2.通过http请求获取文件流
+        byte[] bytes = HttpUtil.downloadBytes(fileInfo.getFileDownloadUrl());
+        ServletOutputStream out = null;
+        try {
+            response.setHeader("Content-Type", "image/" + info.getIconType());
+            out = response.getOutputStream();
+            out.write(bytes);
+            out.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 根据图例id获取图标列表
+     *
+     * @param legendId 图例id
+     * @return
+     */
+    @ApiOperation("根据图例id获取图标列表")
+    @GetMapping("/icons/legend")
+    public CommonResult<List<IconEntity>> getIconsByLegendId(String legendId) {
+        return ResultHelper.multi(iconService.getIconsByLegendId(legendId));
+    }
+
+    /**
+     * 获取项目 集团 下的所有图标
+     *
+     * @return
+     */
+    @ApiOperation("获取所有图标")
+    @GetMapping("/cons")
+    public CommonResult<List<IconEntity>> getIcons() {
+        return ResultHelper.multi(iconService.getIcons());
+    }
+}

+ 32 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/dao/IconMapper.java

@@ -0,0 +1,32 @@
+package com.persagy.adm.diagram.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.adm.diagram.entity.IconEntity;
+
+import java.util.List;
+
+/**
+ * 图例Dao
+ *
+ * @author liyang
+ * @date 2022-01-05
+ */
+public interface IconMapper extends BaseMapper<IconEntity> {
+
+
+    /**
+     * 获取某个图例下的所有图标
+     *
+     * @param legendId 图例id
+     * @return
+     */
+    List<IconEntity> getIconsByLegendId(String legendId);
+
+    /**
+     * 获取所有图标
+     *
+     * @return
+     */
+    List<IconEntity> getIcons();
+
+}

+ 49 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/entity/IconEntity.java

@@ -0,0 +1,49 @@
+package com.persagy.adm.diagram.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.dmp.common.model.entity.AuditableEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 图标实体
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@TableName(value = "diagram_icon")
+public class IconEntity extends AuditableEntity<IconEntity> {
+
+    /**
+     * 图标原名称
+     */
+    private String iconName;
+
+    /**
+     * 图标文件类型
+     */
+    private String iconType;
+
+    /**
+     * 图标大小
+     */
+    private String iconSize;
+
+    /**
+     * 图标对应的文件id
+     */
+    private String iconFileId;
+
+    /**
+     * 图标皮肤
+     */
+    private String iconSkin;
+
+    /**
+     * 所属图例id
+     */
+    private String legendId;
+
+
+}

+ 45 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/service/IconService.java

@@ -0,0 +1,45 @@
+package com.persagy.adm.diagram.service;
+
+import com.persagy.adm.diagram.entity.IconEntity;
+
+import java.util.List;
+
+/**
+ * 图标服务
+ *
+ * @author liyang
+ * @date 2022-01-06
+ */
+public interface IconService {
+
+    /**
+     * 图标保存
+     *
+     * @param entity 图标对象信息
+     * @return
+     */
+    IconEntity saveIcon(IconEntity entity);
+
+    /**
+     * 根据id获取数据信息
+     *
+     * @param iconId
+     * @return
+     */
+    IconEntity getIconInfo(String iconId);
+
+    /**
+     * 根据图例id获取所有图标
+     *
+     * @param legendId 图例id
+     * @return
+     */
+    List<IconEntity> getIconsByLegendId(String legendId);
+
+    /**
+     * 获取所有图标
+     *
+     * @return
+     */
+    List<IconEntity> getIcons();
+}

+ 48 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/service/impl/IconServiceImpl.java

@@ -0,0 +1,48 @@
+package com.persagy.adm.diagram.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.persagy.adm.diagram.dao.IconMapper;
+import com.persagy.adm.diagram.entity.IconEntity;
+import com.persagy.adm.diagram.frame.BdtpRequest;
+import com.persagy.adm.diagram.service.IconService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class IconServiceImpl implements IconService {
+
+    @Autowired
+    private IconMapper iconMapper;
+
+    /**
+     * 保存图标
+     *
+     * @param entity 图标对象信息
+     * @return
+     */
+    @Override
+    public IconEntity saveIcon(IconEntity entity) {
+
+        entity.setId(IdUtil.simpleUUID());
+        iconMapper.insert(entity);
+
+        return entity;
+    }
+
+    @Override
+    public IconEntity getIconInfo(String iconId) {
+        return iconMapper.selectById(iconId);
+    }
+
+    @Override
+    public List<IconEntity> getIconsByLegendId(String legendId) {
+        return iconMapper.getIconsByLegendId(legendId);
+    }
+
+    @Override
+    public List<IconEntity> getIcons() {
+        return iconMapper.getIcons();
+    }
+}

+ 2 - 0
adm-business/adm-diagram/src/main/resources/bootstrap.yml

@@ -21,6 +21,8 @@ persagy:
       service: http://develop.ysbdtp.com/dmp-rwd
     dic:
       service: http://develop.ysbdtp.com/dmp-dic
+    file:
+      service: http://develop.ysbdtp.com/dmp-file
 
 #    driver-class-name: com.mysql.cj.jdbc.Driver
 #  datasource:

+ 18 - 0
adm-business/adm-diagram/src/main/resources/db.init/schema.sql

@@ -76,3 +76,21 @@ CREATE TABLE IF NOT EXISTS `diagram` (
   KEY `idx_project_id_system_id` (`project_id`,`system_id`) USING BTREE,
   KEY `idx_project_id_group_code` (`project_id`,`group_code`) USING BTREE
 ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='系统图表结构';
+
+-- 图标
+CREATE TABLE IF NOT EXISTS `diagram_icon` (
+  `id` varchar(40) NOT NULL COMMENT '主键',
+  `legend_id` varchar(40) DEFAULT NULL COMMENT '图例id',
+  `icon_name` varchar(255) DEFAULT NULL COMMENT '图标文件原名',
+  `icon_type` varchar(255) DEFAULT NULL COMMENT '图标文件类型',
+  `icon_size` varchar(255) DEFAULT NULL COMMENT '图标大小',
+  `icon_file_id` varchar(255) NOT NULL COMMENT '图标对应的文件id',
+  `icon_skin` varchar(255) DEFAULT NULL COMMENT '图标皮肤',
+  `creator` varchar(32) DEFAULT NULL COMMENT '创建人',
+  `creation_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
+  `modifier` varchar(32) DEFAULT NULL COMMENT '最后修改人',
+  `modified_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
+  `valid` tinyint DEFAULT 1 NOT NULL COMMENT '合法标识',
+  `ts` timestamp default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='图标表结构';

+ 41 - 0
adm-business/adm-diagram/src/main/resources/mapper/DiagramIcon.xml

@@ -0,0 +1,41 @@
+<?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.persagy.adm.diagram.dao.IconMapper">
+
+    <resultMap id="iconBaseMap" type="com.persagy.adm.diagram.entity.IconEntity">
+        <id column="id" property="id" jdbcType="VARCHAR"/>
+        <result column="icon_name" property="iconName" jdbcType="VARCHAR"/>
+        <result column="icon_type" property="iconType" jdbcType="VARCHAR"/>
+        <result column="icon_size" property="iconSize" jdbcType="VARCHAR"/>
+        <result column="icon_file_id" property="iconFileId" jdbcType="VARCHAR"/>
+        <result column="icon_skin" property="iconSkin" jdbcType="VARCHAR"/>
+        <result column="legend_id" property="legendId" jdbcType="VARCHAR"/>
+        <result column="creator" property="creator" jdbcType="VARCHAR"/>
+        <result column="creation_time" property="creationTime" jdbcType="CHAR"/>
+        <result column="modifier" property="modifier" jdbcType="VARCHAR"/>
+        <result column="modified_time" property="modifiedTime" jdbcType="CHAR"/>
+        <result column="valid" property="valid" jdbcType="TINYINT"/>
+        <result column="ts" property="ts" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="baseSql">
+        id,icon_name,icon_type,icon_size,icon_file_id,icon_skin,legend_id,
+        creator,creation_time,modifier,modified_time,valid,ts
+    </sql>
+
+    <select id="getIconsByLegendId" resultMap="iconBaseMap">
+        SELECT
+        <include refid="baseSql"/>
+        FROM diagram_icon
+        WHERE valid = 1 AND legend_id=#{legendId}
+    </select>
+
+    <select id="getIcons" resultMap="iconBaseMap">
+        SELECT
+        <include refid="baseSql"/>
+        FROM diagram_icon
+        WHERE valid = 1
+    </select>
+</mapper>
+
+