Browse Source

Merge remote-tracking branch 'remotes/epmet/dev_epmet_mix' into release

dev
jianjun 4 years ago
parent
commit
5f5ad2d9d2
  1. 37
      doc/tduck.sql
  2. 2
      tduck-common/src/main/java/com/tduck/cloud/common/sms/AliyunSmsServiceImpl.java
  3. 19
      tduck-project/src/main/java/com/tduck/cloud/project/service/impl/UserProjectResultServiceImpl.java
  4. 7
      tduck-storage/pom.xml
  5. 69
      tduck-storage/src/main/java/com/tduck/cloud/storage/cloud/MIniOStorageService.java
  6. 2
      tduck-storage/src/main/java/com/tduck/cloud/storage/cloud/OssStorageFactory.java
  7. 216
      tduck-storage/src/main/java/com/tduck/cloud/storage/entity/enums/MimeTypeEnum.java
  8. 6
      tduck-storage/src/main/java/com/tduck/cloud/storage/entity/enums/OssTypeEnum.java

37
doc/tduck.sql

@ -1,22 +1,16 @@
/*
Navicat Premium Data Transfer
Source Server : ivo
Source Server Type : MySQL
Source Server Version : 50718
Source Host : sh-cynosdbmysql-grp-e911sges.sql.tencentcdb.com:29062
Source Schema : tduck
Target Server Type : MySQL
Target Server Version : 50718
File Encoding : 65001
Date: 17/07/2021 15:12:39
*/
SET NAMES utf8mb4;
SET
FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for ac_user
@ -39,7 +33,7 @@ CREATE TABLE `ac_user`
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 945 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for ac_user_authorize
@ -57,7 +51,7 @@ CREATE TABLE `ac_user_authorize`
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '第三方用户授权信息' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '第三方用户授权信息' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for pr_project_template
@ -77,7 +71,7 @@ CREATE TABLE `pr_project_template`
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `code`(`key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 341 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for pr_project_template_category
@ -117,7 +111,7 @@ CREATE TABLE `pr_project_template_item`
`is_display_type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '展示类型组件',
PRIMARY KEY (`id`) USING BTREE,
INDEX `project_key`(`project_key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2451 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for pr_project_theme
@ -134,7 +128,7 @@ CREATE TABLE `pr_project_theme`
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 216 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目主题外观模板' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目主题外观模板' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for pr_user_project
@ -156,7 +150,7 @@ CREATE TABLE `pr_user_project`
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `code`(`key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4081 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '项目表' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '项目表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for pr_user_project_item
@ -182,7 +176,7 @@ CREATE TABLE `pr_user_project_item`
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `project_key`(`project_key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 30013 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for pr_user_project_logic
@ -199,7 +193,7 @@ CREATE TABLE `pr_user_project_logic`
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `project_key`(`project_key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 569 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目逻辑' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目逻辑' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for pr_user_project_result
@ -224,7 +218,7 @@ CREATE TABLE `pr_user_project_result`
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `project_key`(`project_key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2226 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for pr_user_project_setting
@ -259,7 +253,7 @@ CREATE TABLE `pr_user_project_setting`
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `project_key`(`project_key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 530 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for pr_user_project_theme
@ -282,7 +276,7 @@ CREATE TABLE `pr_user_project_theme`
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `project_key`(`project_key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 945 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表单项' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for wx_mp_user
@ -306,7 +300,8 @@ CREATE TABLE `wx_mp_user`
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `wx_union_id`(`head_img_url`(191)) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 728 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信公众号用户 ' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信公众号用户 ' ROW_FORMAT = DYNAMIC;
INSERT INTO `tduck`.`ac_user`( `name`, `avatar`, `gender`, `email`, `phone_number`, `password`, `reg_channel`, `last_login_channel`, `last_login_time`, `last_login_ip`, `deleted`, `create_time`, `update_time`) VALUES ( 'Tduck001', 'https://oss.smileyi.top/757b505cfd34c64c85ca5b5690ee5293/4c415e1c1af04af68d740e667819bece.png', 0, 'test@tduckapp.com', NULL, 'ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f', '1', 2, '2021-06-24 11:08:21', '111.30.56.26', 0, '2020-11-12 11:50:50', '2021-06-24 11:08:21');
SET
FOREIGN_KEY_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;

2
tduck-common/src/main/java/com/tduck/cloud/common/sms/AliyunSmsServiceImpl.java

@ -14,7 +14,7 @@ import java.util.Map;
/**
* @author : smalljop
* @description : 腾讯云短信
* @description : 阿里云短信
* @create : 2020-12-15 10:33
**/
@Data

19
tduck-project/src/main/java/com/tduck/cloud/project/service/impl/UserProjectResultServiceImpl.java

@ -41,6 +41,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.util.*;
import java.util.function.Function;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import static com.tduck.cloud.project.constant.ProjectRedisKeyConstants.PROJECT_RESULT_NUMBER;
@ -137,15 +138,27 @@ public class UserProjectResultServiceImpl extends ServiceImpl<UserProjectResultM
if (CollectionUtil.isEmpty(resultEntityList)) {
throw new BaseException("此表单无有效反馈,不能导出");
}
// 导出会使用第一行数据作为标题 第一行未填写的数据需要填充默认值 不然导出会存在列丢失
AtomicReference<Boolean> isFillRow = new AtomicReference<>(false);
List<PrUserProjectResultExtDTO> extList = prUserProjectResultExtDao.selectResultExtList(request.getProjectKey());
Map<String, PrUserProjectResultExtDTO> map = extList.stream().collect(Collectors.toMap(PrUserProjectResultExtDTO::getUserProjectResult, Function.identity()));
List<Map<String, Object>> resultList = resultEntityList.stream().map(item -> {
Map<String, Object> processData = item.getProcessData();
if (!isFillRow.get()) {
titleList.stream()
.map(ExportProjectResultVO.ExcelHeader::getFieldKey).collect(Collectors.toList()).forEach(key -> {
if (!processData.containsKey(key))
processData.put(key, StrUtil.EMPTY);
});
isFillRow.set(true);
}
Iterator<String> iterator = processData.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
if (!titleList.stream()
.map(ExportProjectResultVO.ExcelHeader::getFieldKey).collect(Collectors.toList()).contains(key)) {
List<String> titleStrList = titleList.stream()
.map(ExportProjectResultVO.ExcelHeader::getFieldKey).collect(Collectors.toList());
// 不存在导出列的数据移除掉 避免多于字段导致excel格式错乱
if (!titleStrList.contains(key)) {
iterator.remove();
}
}
@ -227,4 +240,4 @@ public class UserProjectResultServiceImpl extends ServiceImpl<UserProjectResultM
});
return Result.success(uuid);
}
}
}

7
tduck-storage/pom.xml

@ -38,5 +38,10 @@
<groupId>com.upyun</groupId>
<artifactId>java-sdk</artifactId>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>
</dependencies>
</project>
</project>

69
tduck-storage/src/main/java/com/tduck/cloud/storage/cloud/MIniOStorageService.java

@ -0,0 +1,69 @@
package com.tduck.cloud.storage.cloud;
import com.tduck.cloud.storage.entity.enums.MimeTypeEnum;
import com.tduck.cloud.storage.exception.StorageException;
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
/**
* @author pfwang
*/
public class MIniOStorageService extends OssStorageService {
private MinioClient client;
public MIniOStorageService(OssStorageConfig config) {
this.config = config;
//初始化
init();
}
private void init() {
try {
client = new MinioClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret(), false);
} catch (InvalidEndpointException e) {
e.printStackTrace();
} catch (InvalidPortException e) {
e.printStackTrace();
}
}
@Override
public String upload(InputStream inputStream, String path) {
try {
PutObjectOptions poo = new PutObjectOptions(inputStream.available(), -1);
poo.setContentType(MimeTypeEnum.getContentType(path));
client.putObject(config.getBucketName(), path, inputStream, poo);
} catch (Exception e) {
throw new StorageException("上传文件失败,请检查配置信息", e);
}
return config.getDomain() + "/" + path;
}
@Override
public String upload(byte[] data, String path) {
try {
PutObjectOptions poo = new PutObjectOptions(data.length, -1);
poo.setContentType(MimeTypeEnum.getContentType(path));
client.putObject(config.getBucketName(), path, new ByteArrayInputStream(data), poo);
} catch (Exception e) {
throw new StorageException("上传文件失败,请检查配置信息", e);
}
return config.getDomain() + "/" + path;
}
@Override
public void delete(String path) {
try {
client.removeObject(config.getBucketName(), path);
} catch (Exception e) {
throw new StorageException("删除文件失败", e);
}
}
}

2
tduck-storage/src/main/java/com/tduck/cloud/storage/cloud/OssStorageFactory.java

@ -26,6 +26,8 @@ public final class OssStorageFactory {
return new UpyunStorageService(config);
} else if (config.getOssType() == OssTypeEnum.LOCAL) {
return new localStorageService(config);
}else if (config.getOssType() == OssTypeEnum.MINIO) {
return new MIniOStorageService(config);
}
return null;
}

216
tduck-storage/src/main/java/com/tduck/cloud/storage/entity/enums/MimeTypeEnum.java

@ -0,0 +1,216 @@
package com.tduck.cloud.storage.entity.enums;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
/**
* 文件后缀名与ContentType
* @author pfwang
*/
@Getter
public enum MimeTypeEnum {
AAC("acc", "AAC音频", "audio/aac"),
ABW("abw", "AbiWord文件", "application/x-abiword"),
ARC("arc", "存档文件", "application/x-freearc"),
AVI("avi", "音频视频交错格式", "video/x-msvideo"),
AZW("azw", "亚马逊Kindle电子书格式", "application/vnd.amazon.ebook"),
BIN("bin", "任何类型的二进制数据", "application/octet-stream"),
BMP("bmp", "Windows OS / 2位图图形", "image/bmp"),
BZ("bz", "BZip存档", "application/x-bzip"),
BZ2("bz2", "BZip2存档", "application/x-bzip2"),
CSH("csh", "C-Shell脚本", "application/x-csh"),
CSS("css", "级联样式表(CSS)", "text/css"),
CSV("csv", "逗号分隔值(CSV)", "text/csv"),
DOC("doc", "微软Word文件", "application/msword"),
DOCX("docx", "Microsoft Word(OpenXML)", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"),
EOT("eot", "MS Embedded OpenType字体", "application/vnd.ms-fontobject"),
EPUB("epub", "电子出版物(EPUB)", "application/epub+zip"),
GZ("gz", "GZip压缩档案", "application/gzip"),
GIF("gif", "图形交换格式(GIF)", "image/gif"),
HTM("htm", "超文本标记语言(HTML)", "text/html"),
HTML("html", "超文本标记语言(HTML)", "text/html"),
ICO("ico", "图标格式", "image/vnd.microsoft.icon"),
ICS("ics", "iCalendar格式", "text/calendar"),
JAR("jar", "Java存档", "application/java-archive"),
JPEG("jpeg", "JPEG图像", "image/jpeg"),
JPG("jpg", "JPEG图像", "image/jpeg"),
JS("js", "JavaScript", "text/javascript"),
JSON("json", "JSON格式", "application/json"),
JSONLD("jsonld", "JSON-LD格式", "application/ld+json"),
MID("mid", "乐器数字接口(MIDI)", "audio/midi"),
MIDI("midi", "乐器数字接口(MIDI)", "audio/midi"),
MJS("mjs", "JavaScript模块", "text/javascript"),
MP3("mp3", "MP3音频", "audio/mpeg"),
MPEG("mpeg", "MPEG视频", "video/mpeg"),
MPKG("mpkg", "苹果安装程序包", "application/vnd.apple.installer+xml"),
ODP("odp", "OpenDocument演示文稿文档", "application/vnd.oasis.opendocument.presentation"),
ODS("ods", "OpenDocument电子表格文档", "application/vnd.oasis.opendocument.spreadsheet"),
ODT("odt", "OpenDocument文字文件", "application/vnd.oasis.opendocument.text"),
OGA("oga", "OGG音讯", "audio/ogg"),
OGV("ogv", "OGG视频", "video/ogg"),
OGX("ogx", "OGG", "application/ogg"),
OPUS("opus", "OPUS音频", "audio/opus"),
OTF("otf", "otf字体", "font/otf"),
PNG("png", "便携式网络图形", "image/png"),
PDF("pdf", "Adobe 可移植文档格式(PDF)", "application/pdf"),
PHP("php", "php", "application/x-httpd-php"),
PPT("ppt", "Microsoft PowerPoint", "application/vnd.ms-powerpoint"),
PPTX("pptx", "Microsoft PowerPoint(OpenXML)", "application/vnd.openxmlformats-officedocument.presentationml.presentation"),
RAR("rar", "RAR档案", "application/vnd.rar"),
RTF("rtf", "富文本格式", "application/rtf"),
SH("sh", "Bourne Shell脚本", "application/x-sh"),
SVG("svg", "可缩放矢量图形(SVG)", "image/svg+xml"),
SWF("swf", "小型Web格式(SWF)或Adobe Flash文档", "application/x-shockwave-flash"),
TAR("tar", "磁带存档(TAR)", "application/x-tar"),
TIF("tif", "标记图像文件格式(TIFF)", "image/tiff"),
TIFF("tiff", "标记图像文件格式(TIFF)", "image/tiff"),
TS("ts", "MPEG传输流", "video/mp2t"),
TTF("ttf", "ttf字体", "font/ttf"),
TXT("txt", "文本(通常为ASCII或ISO 8859- n", "text/plain"),
VSD("vsd", "微软Visio", "application/vnd.visio"),
WAV("wav", "波形音频格式", "audio/wav"),
WEBA("weba", "WEBM音频", "audio/webm"),
WEBM("webm", "WEBM视频", "video/webm"),
WEBP("webp", "WEBP图像", "image/webp"),
WOFF("woff", "Web开放字体格式(WOFF)", "font/woff"),
WOFF2("woff2", "Web开放字体格式(WOFF)", "font/woff2"),
XHTML("xhtml", "XHTML", "application/xhtml+xml"),
XLS("xls", "微软Excel", "application/vnd.ms-excel"),
XLSX("xlsx", "微软Excel(OpenXML)", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),
XML("xml", "XML", "application/xml"),
XUL("xul", "XUL", "application/vnd.mozilla.xul+xml"),
ZIP("zip", "ZIP", "application/zip"),
MIME_3GP("3gp", "3GPP audio/video container", "video/3gpp"),
MIME_3GP_WITHOUT_VIDEO("3gp", "3GPP audio/video container doesn't contain video", "audio/3gpp2"),
MIME_3G2("3g2", "3GPP2 audio/video container", "video/3gpp2"),
MIME_3G2_WITHOUT_VIDEO("3g2", "3GPP2 audio/video container doesn't contain video", "audio/3gpp2"),
MIME_7Z("7z", "7-zip存档", "application/x-7z-compressed");
//扩展名
private final String extension;
//说明
private final String explain;
//contentType/mime类型
private final String mimeType;
/**
* @param extension 上传的文件扩展名
* @param explain 类型说明
* @param mimeType Mime对应的类型
*/
MimeTypeEnum(String extension, String explain, String mimeType) {
this.extension = extension;
this.explain = explain;
this.mimeType = mimeType;
}
/**
* 通过扩展名获取枚举类型
*
* @param extension 扩展名
* @return 枚举类
*/
public static MimeTypeEnum getByExtension(String extension) {
if (StringUtils.isEmpty(extension)) {
return null;
}
for (MimeTypeEnum typesEnum : MimeTypeEnum.values()) {
if (extension.equals(typesEnum.getExtension())) {
return typesEnum;
}
}
return null;
}
/**
* Content-Type常用对照
* 根据后缀获取Mime
*
* @param path 文件名
* @return mime类型
*/
public static String getContentType(String path) {
String fileType = path.substring(path.lastIndexOf(".") + 1);
MimeTypeEnum mimeTypeEnum = MimeTypeEnum.getByExtension(fileType);
if (mimeTypeEnum != null) {
return mimeTypeEnum.getMimeType();
}
return "application/octet-stream";
}
}

6
tduck-storage/src/main/java/com/tduck/cloud/storage/entity/enums/OssTypeEnum.java

@ -29,8 +29,12 @@ public enum OssTypeEnum {
/**
* 本地存储
*/
LOCAL(3);
LOCAL(3),
/**
* minio
*/
MINIO(4);
@EnumValue
@JsonValue

Loading…
Cancel
Save