From 1e4c221bcb60aa40c78c3900074a929c85a5f29b Mon Sep 17 00:00:00 2001 From: qianming Date: Tue, 16 Aug 2022 09:02:21 +0800 Subject: [PATCH 01/61] update README.md --- README.md | 3 ++- doc/docs/guide/briefUsing.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 16bd4d4..d4da422 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,8 @@ sql文件的目录在:report-core --> src --> main --> resources -- > db.migra -
+ +
diff --git a/doc/docs/guide/briefUsing.md b/doc/docs/guide/briefUsing.md index b3722b4..dd5016c 100644 --- a/doc/docs/guide/briefUsing.md +++ b/doc/docs/guide/briefUsing.md @@ -5,7 +5,8 @@ -
+ +
-- Gitee From a7a17fe9815955ff088661cf11475e02f323a483 Mon Sep 17 00:00:00 2001 From: lengleng Date: Wed, 17 Aug 2022 04:44:46 +0000 Subject: [PATCH 02/61] bug fix | popconfirm @onConfirm to @confirm https://github.com/ElemeFE/element/pull/20240 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @onConfirm 属性已经去掉了,所以在删除数据集的时候没有作用 Signed-off-by: lengleng --- report-ui/src/views/excelreport/designer/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-ui/src/views/excelreport/designer/index.vue b/report-ui/src/views/excelreport/designer/index.vue index 64e05f1..319a32a 100644 --- a/report-ui/src/views/excelreport/designer/index.vue +++ b/report-ui/src/views/excelreport/designer/index.vue @@ -25,7 +25,7 @@ Date: Fri, 19 Aug 2022 10:28:18 +0800 Subject: [PATCH 03/61] =?UTF-8?q?=E9=9C=80=E6=B1=82----=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E7=BB=86=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/i18n/messages_en_US.properties | 14 +++++++------- .../main/resources/i18n/messages_zh_CN.properties | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/report-core/src/main/resources/i18n/messages_en_US.properties b/report-core/src/main/resources/i18n/messages_en_US.properties index 43cf12e..209a129 100644 --- a/report-core/src/main/resources/i18n/messages_en_US.properties +++ b/report-core/src/main/resources/i18n/messages_en_US.properties @@ -37,16 +37,16 @@ Rule.field.value.is.required=Rule field value is required Rule.field.value.type.error=Rule field value type error Rule.fields.check.error=Rule fields check error Component.load.check.error={0} Component not load -4001=Data source connection failed +4001=Data source connection failed {0} 4002=Data source type is not currently supported -4003=execute sql error -4004=Incomplete parameter replacement values -4005=execute js error -4006=analysis data error +4003=execute sql error, {0} +4004=Incomplete parameter replacement values {0} +4005=execute js error {0} +4006=analysis data error {0} 4007=The report code does not allow duplication 4008=The set code does not allow duplication -4009=The source code does not allow duplication +4009=The source code does not allow duplication {0} 4010=Can't auto find match driver class -4011=execute javaBean error +4011=execute javaBean error {0} report.share.link.invalid=report share link invalid diff --git a/report-core/src/main/resources/i18n/messages_zh_CN.properties b/report-core/src/main/resources/i18n/messages_zh_CN.properties index a8e5426..b9e9086 100644 --- a/report-core/src/main/resources/i18n/messages_zh_CN.properties +++ b/report-core/src/main/resources/i18n/messages_zh_CN.properties @@ -38,17 +38,17 @@ Rule.field.value.type.error=\u89C4\u5219\u5B57\u6BB5\u503C\u7C7B\u578B\u9519\u8B Rule.fields.check.error=\u89C4\u5219\u53C2\u6570\u6821\u9A8C\u4E0D\u901A\u8FC7 Component.load.check.error={0}\u7EC4\u4EF6\u672A\u52A0\u8F7D -4001=\u6570\u636E\u6E90\u8FDE\u63A5\u5931\u8D25 +4001=\u6570\u636E\u6E90\u8FDE\u63A5\u5931\u8D25\uFF0C{0} 4002=\u6570\u636E\u6E90\u7C7B\u578B\u6682\u4E0D\u652F\u6301 -4003=\u6267\u884Csql\u5931\u8D25 -4004=\u53C2\u6570\u66FF\u6362\u503C\u4E0D\u5168 -4005=\u6267\u884Cjs\u5931\u8D25 -4006=\u89E3\u6790\u6570\u636E\u5931\u8D25 +4003=\u6267\u884Csql\u5931\u8D25\uFF0C{0} +4004=\u53C2\u6570\u66FF\u6362\u503C\u4E0D\u5168\uFF0C{0} +4005=\u6267\u884Cjs\u5931\u8D25\uFF0C{0} +4006=\u89E3\u6790\u6570\u636E\u5931\u8D25\uFF0C{0} 4007=\u62A5\u8868\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D 4008=\u6570\u636E\u96C6\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D 4009=\u6570\u636E\u6E90\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D -4010=\u9A71\u52A8\u5305\u4E0D\u5B58\u5728 -4011=\u6267\u884CjavaBean\u5931\u8D25 +4010=\u9A71\u52A8\u5305\u4E0D\u5B58\u5728\uFF0C{0} +4011=\u6267\u884CjavaBean\u5931\u8D25\uFF0C{0} 6001={0} 7001=\u89E3\u6790\u5931\u8D25 -- Gitee From 7965878e51fa249fda34eadfc3be9188dd10f3d9 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Fri, 19 Aug 2022 10:42:31 +0800 Subject: [PATCH 04/61] =?UTF-8?q?=E5=BA=95=E5=B1=82=E9=87=87=E7=94=A8redis?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report-core/README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/report-core/README.md b/report-core/README.md index 0ad3e4f..56e22ee 100644 --- a/report-core/README.md +++ b/report-core/README.md @@ -1 +1,41 @@ ## 后端springboot + +### 采用redis缓存 + +#### 1.pom文件 +```java + + com.anji-plus + spring-boot-gaea + 2.0.3.RELEASE + + + org.springframework.boot + spring-boot-starter-data-redis + + + +``` +删除exclusions内容,因为底层默认支持redis +删除ehcache相关依赖 + +#### 2.删除 package com.anjiplus.template.gaea.business.cache +CacheHelper底层默认实现为RedisCacheHelper。 +@ConditionalOnMissingBean 注解起到的作用 +```java +package com.anji.plus.gaea; + +@Configuration +@EnableConfigurationProperties({GaeaProperties.class}) +public class GaeaAutoConfiguration { + @Bean + @ConditionalOnClass({RedisAutoConfiguration.class}) + @ConditionalOnMissingBean + public CacheHelper cacheHelper() { + return new RedisCacheHelper(); + } +} +``` + +#### 3.bootstrap.yml加上对应的redis配置即可 + -- Gitee From 42f85532de2dd37796bcfb7e248d91a550edd74c Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Fri, 19 Aug 2022 10:49:25 +0800 Subject: [PATCH 05/61] file upload --- .../modules/file/service/impl/GaeaFileServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java index fed4368..fdc1fab 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java @@ -123,8 +123,7 @@ public class GaeaFileServiceImpl implements GaeaFileService { // 将完整的http访问路径返回 return gaeaFile; } catch (Exception e) { - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - log.error("file upload error: {}", e); + log.error("file upload error", e); throw BusinessExceptionBuilder.build(ResponseCode.FILE_UPLOAD_ERROR); } } -- Gitee From 7c70df8a664a58a254532ece80aeb3417635dc03 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Wed, 31 Aug 2022 14:50:36 +0800 Subject: [PATCH 06/61] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/file/service/impl/GaeaFileServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java index fdc1fab..0d1de05 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java @@ -122,7 +122,9 @@ public class GaeaFileServiceImpl implements GaeaFileService { } // 将完整的http访问路径返回 return gaeaFile; - } catch (Exception e) { + } catch (BusinessException e){ + throw BusinessExceptionBuilder.build(e.getCode()); + }catch (Exception e) { log.error("file upload error", e); throw BusinessExceptionBuilder.build(ResponseCode.FILE_UPLOAD_ERROR); } -- Gitee From eaadabd35f60bf4ee6b4329b4dbde87e2c2bffb5 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Wed, 31 Aug 2022 15:46:40 +0800 Subject: [PATCH 07/61] =?UTF-8?q?gaea=E5=8D=87=E7=BA=A72.0.4.RELEASE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report-core/pom.xml | 2 +- .../anjiplus/template/gaea/business/filter/TokenFilter.java | 2 +- .../accessuser/service/impl/AccessUserServiceImpl.java | 3 ++- report-ui/src/utils/request.js | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/report-core/pom.xml b/report-core/pom.xml index 7118783..a81c828 100644 --- a/report-core/pom.xml +++ b/report-core/pom.xml @@ -76,7 +76,7 @@ com.anji-plus spring-boot-gaea - 2.0.3.RELEASE + 2.0.4.RELEASE org.springframework.boot diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java index 8022cf4..74ded38 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java @@ -231,7 +231,7 @@ public class TokenFilter implements Filter { } private void error(HttpServletResponse response) throws IOException { - ResponseBean responseBean = ResponseBean.builder().code("50008").message("The Token has expired").build(); + ResponseBean responseBean = ResponseBean.builder().code("User.credentials.expired").message("The Token has expired").build(); response.setContentType(ContentType.APPLICATION_JSON.getMimeType()); response.getWriter().print(JSONObject.toJSONString(responseBean)); } diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/impl/AccessUserServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/impl/AccessUserServiceImpl.java index 9661960..d2164b1 100755 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/impl/AccessUserServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/accessuser/service/impl/AccessUserServiceImpl.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject; import com.anji.plus.gaea.bean.TreeNode; import com.anji.plus.gaea.cache.CacheHelper; import com.anji.plus.gaea.constant.BaseOperationEnum; +import com.anji.plus.gaea.constant.GaeaConstant; import com.anji.plus.gaea.exception.BusinessException; import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; @@ -163,7 +164,7 @@ public class AccessUserServiceImpl implements AccessUserService { } else { // 生成用户token String uuid = GaeaUtils.UUID(); - token = jwtBean.createToken(loginName, uuid); + token = jwtBean.createToken(loginName, uuid, 0, GaeaConstant.TENANT_CODE); cacheHelper.stringSetExpire(tokenKey, token, 3600); } diff --git a/report-ui/src/utils/request.js b/report-ui/src/utils/request.js index 7745369..a985ccc 100644 --- a/report-ui/src/utils/request.js +++ b/report-ui/src/utils/request.js @@ -27,8 +27,8 @@ service.interceptors.response.use( * code为非20000是抛错 可结合自己业务进行修改 */ const res = response.data - // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; - if (res.code == '50008' || res.code == '50012' || res.code == '50014') { + // User.credentials.expired:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; + if (res.code == 'User.credentials.expired' || res.code == '50012' || res.code == '50014') { MessageBox.confirm( '你已被登出,可以取消继续留在该页面,或者重新登录', '重新登录', -- Gitee From c9cc5f37c8e494bdb8888b6ce2e89d1a2154fb29 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Thu, 1 Sep 2022 12:25:25 +0800 Subject: [PATCH 08/61] =?UTF-8?q?gaea=E5=8D=87=E7=BA=A72.0.5.RELEASE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report-core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-core/pom.xml b/report-core/pom.xml index a81c828..1ca9263 100644 --- a/report-core/pom.xml +++ b/report-core/pom.xml @@ -76,7 +76,7 @@ com.anji-plus spring-boot-gaea - 2.0.4.RELEASE + 2.0.5.RELEASE org.springframework.boot -- Gitee From 9d9cb8b5ea698162431756f8d0b859938d3bcf2c Mon Sep 17 00:00:00 2001 From: qianming Date: Thu, 1 Sep 2022 14:16:15 +0800 Subject: [PATCH 09/61] =?UTF-8?q?=E8=AF=B4=E6=98=8E=E5=AD=97=E4=BD=93?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report-ui/src/views/layout/components/Navbar.vue | 8 ++++---- report-ui/src/views/login.vue | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/report-ui/src/views/layout/components/Navbar.vue b/report-ui/src/views/layout/components/Navbar.vue index 7fd42b9..0ee611b 100644 --- a/report-ui/src/views/layout/components/Navbar.vue +++ b/report-ui/src/views/layout/components/Navbar.vue @@ -90,14 +90,14 @@ width="34%" center > -
+ -
- 个人/商业使用须遵循Apache2.0开源协议。 +
+ 个人/商业使用须遵循Apache2.0开源协议。 禁止将AJ-Report产品用于违法违规业务。
diff --git a/report-ui/src/views/login.vue b/report-ui/src/views/login.vue index 1eb4fd2..d6fa169 100644 --- a/report-ui/src/views/login.vue +++ b/report-ui/src/views/login.vue @@ -133,14 +133,14 @@ width="34%" center > -
+ -
- 个人/商业使用须遵循Apache2.0开源协议。 +
+ 个人/商业使用须遵循Apache2.0开源协议。 禁止将AJ-Report产品用于违法违规业务。
-- Gitee From dd0a419daf628e99b8e4fa441d523433312a4601 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Fri, 2 Sep 2022 15:16:25 +0800 Subject: [PATCH 10/61] gaea oss --- report-core/pom.xml | 12 + .../gaea/business/code/ResponseCode.java | 3 +- .../impl/ReportDashboardServiceImpl.java | 16 +- .../modules/file/service/GaeaFileService.java | 7 + .../service/impl/GaeaFileServiceImpl.java | 235 +++++++++--------- .../service/impl/ReportExcelServiceImpl.java | 4 +- .../template/gaea/business/util/FileUtil.java | 92 +++++-- .../src/main/resources/bootstrap-dev.yml | 15 +- .../src/main/resources/bootstrap-prod.yml | 4 - report-core/src/main/resources/bootstrap.yml | 34 ++- .../resources/i18n/messages_en_US.properties | 3 +- .../resources/i18n/messages_zh_CN.properties | 3 +- 12 files changed, 256 insertions(+), 172 deletions(-) diff --git a/report-core/pom.xml b/report-core/pom.xml index 1ca9263..7b2b59c 100644 --- a/report-core/pom.xml +++ b/report-core/pom.xml @@ -61,6 +61,12 @@ test + + org.springframework + spring-mock + 2.0.8 + + org.springframework.cloud spring-cloud-context @@ -85,6 +91,12 @@ + + com.anji-plus + spring-boot-starter-gaea-oss + 2.0.5.RELEASE + + com.baomidou mybatis-plus-boot-starter diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java index f0fe703..0cefc8b 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/code/ResponseCode.java @@ -118,7 +118,8 @@ public interface ResponseCode { String FILE_SUFFIX_UNSUPPORTED = "2002"; String FILE_UPLOAD_ERROR = "2003"; String FILE_ONT_EXSIT = "2004"; - String LIST_IS_EMPTY = "2005"; + String FILE_OPERATION_FAILED = "file.operation.failed"; + String PUSHCODE_NEED_UNIQUE = "3001"; String RECEIVER_IS_EMPTY = "3002"; String DATA_SOURCE_CONNECTION_FAILED = "4001"; diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java index fd3f211..f6d7811 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java @@ -80,13 +80,13 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi @Autowired private ReportService reportService; - @Value("${customer.file.downloadPath:''}") + @Value("${spring.gaea.subscribes.oss.downloadPath:}") private String fileDownloadPath; - @Value("${customer.file.dist-path:''}") + @Value("${customer.file.tmp-path:.}") private String dictPath; - private final static String ZIP_PATH = "/zip/"; + private final static String ZIP_PATH = "/tmp_zip/"; private final static String JSON_PATH = "dashboard.json"; private Map queryServiceImplMap = new HashMap<>(); @@ -395,13 +395,9 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi queryWrapper.eq(GaeaFile::getFileId, fileName); GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper); if (null != gaeaFile) { - String fileType = gaeaFile.getFileType(); - path = path + "/image/" + fileName + "." + fileType; - //path = /app/disk/upload/zip/UUID/image - - //原始文件的路径 - String filePath = gaeaFile.getFilePath(); - FileUtil.copyFileUsingFileChannels(filePath, path); + byte[] file = gaeaFileService.getFile(gaeaFile.getFileId()); + path = path + "/image/"; + FileUtil.byte2File(file, path, gaeaFile.getFileId().concat(".").concat(gaeaFile.getFileType())); } } diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/GaeaFileService.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/GaeaFileService.java index 4082ca7..9cceea1 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/GaeaFileService.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/GaeaFileService.java @@ -54,4 +54,11 @@ public interface GaeaFileService extends GaeaBaseService download(HttpServletRequest request, HttpServletResponse response, String fileId); + + /** + * 获取文件 + * @param fileId + * @return + */ + byte[] getFile(String fileId); } diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java index 0d1de05..e45b6db 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java @@ -4,59 +4,51 @@ import com.anji.plus.gaea.constant.BaseOperationEnum; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.exception.BusinessException; import com.anji.plus.gaea.exception.BusinessExceptionBuilder; +import com.anji.plus.gaea.oss.exceptions.GaeaOSSException; +import com.anji.plus.gaea.oss.exceptions.GaeaOSSTypeLimitedException; +import com.anji.plus.gaea.oss.ossbuilder.GaeaOSSTemplate; +import com.anji.plus.gaea.oss.utils.ResponseUtil; import com.anjiplus.template.gaea.business.code.ResponseCode; import com.anjiplus.template.gaea.business.modules.file.dao.GaeaFileMapper; import com.anjiplus.template.gaea.business.modules.file.entity.GaeaFile; import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService; -import com.anjiplus.template.gaea.business.modules.file.util.FileUtils; -import com.anjiplus.template.gaea.business.modules.file.util.StringPatternUtil; -import com.anjiplus.template.gaea.business.util.FileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.http.entity.ContentType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.CacheControl; -import org.springframework.http.MediaType; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.ResponseEntity; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Arrays; +import java.io.FileInputStream; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; /** - * (GaeaFile)ServiceImpl - * - * @author peiyanni - * @since 2021-02-18 14:48:26 + * 文件管理服务实现 + * @author: Raod + * @since: 2022-08-31 */ @Service @Slf4j +@RefreshScope public class GaeaFileServiceImpl implements GaeaFileService { - @Value("${customer.file.dist-path:''}") - private String dictPath; - - @Value("${customer.file.white-list:''}") - private String whiteList; - - @Value("${customer.file.excelSuffix:''}") - private String excelSuffix; - - @Value("${customer.file.downloadPath:''}") + @Value("${spring.gaea.subscribes.oss.downloadPath:''}") private String fileDownloadPath; + @Autowired + private GaeaOSSTemplate gaeaOSSTemplate; + @Autowired private GaeaFileMapper gaeaFileMapper; @@ -69,65 +61,60 @@ public class GaeaFileServiceImpl implements GaeaFileService { @Override @Transactional(rollbackFor = Exception.class) public GaeaFile upload(MultipartFile multipartFile, File file, String customFileName) { - try { - String fileName = ""; - if (null != multipartFile) { - fileName = multipartFile.getOriginalFilename(); - }else { - fileName = file.getName(); - } + String originalFilename = multipartFile.getOriginalFilename(); - if (StringUtils.isBlank(fileName)) { - throw BusinessExceptionBuilder.build(ResponseCode.FILE_EMPTY_FILENAME); - } + if (StringUtils.isBlank(originalFilename)) { + throw BusinessExceptionBuilder.build(ResponseCode.FILE_EMPTY_FILENAME); + } + // 文件后缀 .png + String suffixName = originalFilename.substring(originalFilename.lastIndexOf(".")); + // 生成文件唯一性标识 + String fileId; + if (StringUtils.isBlank(customFileName)) { + fileId = UUID.randomUUID().toString(); + } else { + fileId = customFileName; + } + // 生成在oss中存储的文件名 402b6193e70e40a9bf5b73a78ea1e8ab.png + String fileObjectName = fileId + suffixName; + // 生成链接通过fileId http访问路径 http://10.108.3.121:9089/meta/file/download/402b6193e70e40a9bf5b73a78ea1e8ab + String urlPath = fileDownloadPath + "/" + fileId; + + // 上传文件 + try{ + gaeaOSSTemplate.uploadFileByInputStream(multipartFile, fileObjectName); + }catch (GaeaOSSTypeLimitedException e){ + log.error("上传失败GaeaOSSTypeLimitedException", e); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_SUFFIX_UNSUPPORTED, e.getMessage()); + }catch (GaeaOSSException e){ + log.error("上传失败GaeaOSSException", e); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_UPLOAD_ERROR, e.getMessage()); + } - String suffixName = fileName.substring(fileName.lastIndexOf(".")); - String fileInstruction = fileName.substring(0, fileName.lastIndexOf(".")); - //白名单校验(不区分大小写) - List list = new ArrayList<>(Arrays.asList(whiteList.split("\\|"))); - list.addAll(list.stream().map(String::toUpperCase).collect(Collectors.toList())); - if (!list.contains(suffixName)) { - throw BusinessExceptionBuilder.build(ResponseCode.FILE_SUFFIX_UNSUPPORTED); - } - // 生成文件唯一性标识 - String fileId; - if (StringUtils.isBlank(customFileName)) { - fileId = UUID.randomUUID().toString(); - } else { - fileId = customFileName; - } - String newFileName = fileId + suffixName; - // 本地文件保存路径 - String filePath = dictPath + newFileName; - String urlPath = fileDownloadPath + "/" + fileId; - - GaeaFile gaeaFile = new GaeaFile(); - gaeaFile.setFilePath(filePath); - gaeaFile.setFileId(fileId); - gaeaFile.setUrlPath(urlPath); - gaeaFile.setFileType(suffixName.replace(".", "")); - gaeaFile.setFileInstruction(fileInstruction); - gaeaFileMapper.insert(gaeaFile); - - //写文件 将文件保存/app/dictPath/upload/下 - java.io.File dest = new java.io.File(dictPath + newFileName); - java.io.File parentFile = dest.getParentFile(); - if (!parentFile.exists()) { - parentFile.mkdirs(); - } - if (null != multipartFile) { - multipartFile.transferTo(dest); - }else { - FileUtil.copyFileUsingFileChannels(file, dest); - } - // 将完整的http访问路径返回 - return gaeaFile; - } catch (BusinessException e){ - throw BusinessExceptionBuilder.build(e.getCode()); - }catch (Exception e) { - log.error("file upload error", e); - throw BusinessExceptionBuilder.build(ResponseCode.FILE_UPLOAD_ERROR); + // 保存到文件管理中 + GaeaFile gaeaFile = new GaeaFile(); + gaeaFile.setFileId(fileId); + gaeaFile.setFilePath(fileObjectName); + gaeaFile.setUrlPath(urlPath); + gaeaFile.setFileType(suffixName.replace(".", "")); + gaeaFile.setFileInstruction(originalFilename); + insert(gaeaFile); + + return gaeaFile; + } + + private MultipartFile getMultipartFile(File file){ + FileInputStream fileInputStream; + MultipartFile multipartFile; + try { + fileInputStream = new FileInputStream(file); + multipartFile = new MockMultipartFile(file.getName(),file.getName(), + ContentType.APPLICATION_OCTET_STREAM.toString(),fileInputStream); + } catch (Exception e) { + log.error("file转MultipartFile失败", e); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } + return multipartFile; } /** @@ -150,52 +137,73 @@ public class GaeaFileServiceImpl implements GaeaFileService { */ @Override public GaeaFile upload(File file, String customFileName) { - return upload(null, file, customFileName); + return upload(getMultipartFile(file)); } @Override public ResponseEntity download(HttpServletRequest request, HttpServletResponse response, String fileId) { try { - String userAgent = request.getHeader("User-Agent"); - boolean isIeBrowser = userAgent.indexOf("MSIE") > 0; - //根据fileId,从gaea_file中读出filePath + // fileId必填 + if(StringUtils.isBlank(fileId)){ + throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); + } + // 根据fileId,从gaea_file中读出filePath LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(GaeaFile::getFileId, fileId); GaeaFile gaeaFile = gaeaFileMapper.selectOne(queryWrapper); if (null == gaeaFile) { throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); } - //解析文件路径、文件名和后缀 - String filePath = gaeaFile.getFilePath(); - if (StringUtils.isBlank(filePath)) { + + String userAgent = request.getHeader("User-Agent"); + boolean isIEBrowser = userAgent.indexOf("MSIE") > 0; + // 在oss中存储的文件名 402b6193e70e40a9bf5b73a78ea1e8ab.png + String fileObjectName = gaeaFile.getFilePath(); + String originalFilename = gaeaFile.getFileInstruction(); + if (StringUtils.isBlank(fileObjectName) || StringUtils.isBlank(originalFilename)) { throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); } - String filename = filePath.substring(filePath.lastIndexOf(File.separator)); - String fileSuffix = filename.substring(filename.lastIndexOf(".")); - - //根据文件后缀来判断,是显示图片\视频\音频,还是下载文件 - File file = new File(filePath); - ResponseEntity.BodyBuilder builder = ResponseEntity.ok(); - builder.contentLength(file.length()); - if (StringPatternUtil.stringMatchIgnoreCase(fileSuffix, "(.png|.jpg|.jpeg|.bmp|.gif|.icon)")) { - builder.cacheControl(CacheControl.noCache()).contentType(MediaType.IMAGE_PNG); - } else if (StringPatternUtil.stringMatchIgnoreCase(fileSuffix, "(.flv|.swf|.mkv|.avi|.rm|.rmvb|.mpeg|.mpg|.ogg|.ogv|.mov|.wmv|.mp4|.webm|.wav|.mid|.mp3|.aac)")) { - builder.header("Content-Type", "video/mp4; charset=UTF-8"); - } else { - //application/octet-stream 二进制数据流(最常见的文件下载) - builder.contentType(MediaType.APPLICATION_OCTET_STREAM); - filename = URLEncoder.encode(filename, "UTF-8"); - if (isIeBrowser) { - builder.header("Content-Disposition", "attachment; filename=" + filename); - } else { - builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + filename); - } - } - return builder.body(FileUtils.readFileToByteArray(file)); + + // 调用文件存储工厂,读取文件,返回字节数组 + byte[] fileBytes = gaeaOSSTemplate.downloadFile(fileObjectName); + + // 根据文件后缀来判断,是显示图片\视频\音频,还是下载文件 + return ResponseUtil.writeBody(originalFilename, fileBytes, isIEBrowser); } catch (Exception e) { - log.error("file download error: {}", e); - return null; + log.error("file download error", e); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); + } + } + + /** + * 获取文件 + * + * @param fileId + * @return + */ + @Override + public byte[] getFile(String fileId) { + // fileId必填 + if(StringUtils.isBlank(fileId)){ + throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); + } + // 根据fileId,从gaea_file中读出filePath + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(GaeaFile::getFileId, fileId); + GaeaFile gaeaFile = gaeaFileMapper.selectOne(queryWrapper); + if (null == gaeaFile) { + throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); } + + // 在oss中存储的文件名 402b6193e70e40a9bf5b73a78ea1e8ab.png + String fileObjectName = gaeaFile.getFilePath(); + String originalFilename = gaeaFile.getFileInstruction(); + if (StringUtils.isBlank(fileObjectName) || StringUtils.isBlank(originalFilename)) { + throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); + } + + // 调用文件存储工厂,读取文件,返回字节数组 + return gaeaOSSTemplate.downloadFile(fileObjectName); } /** @@ -212,10 +220,7 @@ public class GaeaFileServiceImpl implements GaeaFileService { // 删除本地文件 entities.forEach(gaeaFile -> { String filePath = gaeaFile.getFilePath(); - File file = new File(filePath); - if (file.exists()) { - file.delete(); - } + gaeaOSSTemplate.deleteFile(filePath); }); } diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/reportexcel/service/impl/ReportExcelServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/reportexcel/service/impl/ReportExcelServiceImpl.java index b25832d..5af3165 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/reportexcel/service/impl/ReportExcelServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/reportexcel/service/impl/ReportExcelServiceImpl.java @@ -58,10 +58,10 @@ public class ReportExcelServiceImpl implements ReportExcelService { @Autowired private ReportMapper reportMapper; - @Value("${customer.file.dist-path:''}") + @Value("${customer.file.tmp-path:.}") private String dictPath; - @Value("${customer.file.downloadPath:''}") + @Value("${spring.gaea.subscribes.oss.downloadPath:''}") private String fileDownloadPath; @Autowired diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/util/FileUtil.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/util/FileUtil.java index 5532b53..a0ac736 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/util/FileUtil.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/util/FileUtil.java @@ -1,7 +1,7 @@ package com.anjiplus.template.gaea.business.util; -import com.anji.plus.gaea.code.ResponseCode; import com.anji.plus.gaea.exception.BusinessExceptionBuilder; +import com.anjiplus.template.gaea.business.code.ResponseCode; import lombok.extern.slf4j.Slf4j; import org.springframework.web.multipart.MultipartFile; @@ -42,7 +42,7 @@ public class FileUtil { log.info("链接下载图片:{},临时路径:{}", urlPath, path); } catch (IOException e) { log.error("根据链接下载失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } @@ -66,14 +66,14 @@ public class FileUtil { outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); } catch (IOException e) { log.error("复制文件失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } finally { try { inputChannel.close(); outputChannel.close(); } catch (IOException e) { log.error("", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } } @@ -106,7 +106,7 @@ public class FileUtil { outputStream.close(); } catch (Exception e) { log.error("写入文件失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } @@ -132,20 +132,20 @@ public class FileUtil { return sbf.toString(); } catch (IOException e) { log.error("读文件失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } finally { if (null != isr) { try { isr.close(); } catch (IOException e) { - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } if (reader != null) { try { reader.close(); } catch (IOException e1) { - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e1.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e1.getMessage()); } } } @@ -185,14 +185,14 @@ public class FileUtil { compress(srcFile, zipOut, baseDir); } catch (IOException e) { log.error("压缩文件夹失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } finally { if (null != zipOut) { try { zipOut.close(); } catch (IOException e) { log.error("", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } out = null; } @@ -201,7 +201,7 @@ public class FileUtil { out.close(); } catch (IOException e) { log.error("", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } } @@ -246,14 +246,14 @@ public class FileUtil { } catch (IOException e) { log.error("压缩文件夹失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } finally { if (null != bis) { try { bis.close(); } catch (IOException e) { log.error("", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } } @@ -264,23 +264,26 @@ public class FileUtil { decompress(new ZipFile(zipFile), dstPath); } catch (IOException e) { log.error("", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } public static void decompress(MultipartFile zipFile, String dstPath) { try { - File file = new File(dstPath + File.separator + zipFile.getOriginalFilename()); - if (!file.getParentFile().exists()) { - file.getParentFile().mkdirs(); + File dir = new File(dstPath); + if (!dir.exists()){ + dir.mkdirs(); } + String path = dir.getPath(); + String absolutePath = dir.getAbsolutePath(); + File file = new File(dir.getAbsolutePath() + File.separator + zipFile.getOriginalFilename()); zipFile.transferTo(file); decompress(new ZipFile(file), dstPath); //解压完删除 file.delete(); } catch (IOException e) { log.error("", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } @@ -326,14 +329,14 @@ public class FileUtil { } } catch (IOException e) { log.error("解压失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } finally { if (null != in) { try { in.close(); } catch (IOException e) { log.error("", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } @@ -342,7 +345,7 @@ public class FileUtil { out.close(); } catch (IOException e) { log.error("", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } } @@ -350,7 +353,7 @@ public class FileUtil { zip.close(); } catch (IOException e) { log.error("解压失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } @@ -371,7 +374,7 @@ public class FileUtil { ins.close(); } catch (Exception e) { log.error("获取流文件失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); } } @@ -399,8 +402,49 @@ public class FileUtil { }); } catch (IOException e) { log.error("删除文件失败", e); - throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); + } + } + + /** + * byte 转file + */ + public static File byte2File(byte[] buf, String filePath, String fileName){ + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try{ + File dir = new File(filePath); + if (!dir.exists()){ + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + }catch (Exception e){ + log.error("", e); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); + } + finally{ + if (bos != null){ + try{ + bos.close(); + }catch (IOException e){ + log.error("", e); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); + } + } + if (fos != null){ + try{ + fos.close(); + }catch (IOException e){ + log.error("", e); + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); + } + } } + return file; } diff --git a/report-core/src/main/resources/bootstrap-dev.yml b/report-core/src/main/resources/bootstrap-dev.yml index ad947c1..e11aeec 100644 --- a/report-core/src/main/resources/bootstrap-dev.yml +++ b/report-core/src/main/resources/bootstrap-dev.yml @@ -4,8 +4,15 @@ spring: url: jdbc:mysql://10.108.26.197:3306/aj_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: appuser@anji + gaea: + subscribes: + oss: #文件存储 + enabled: true + ##允许上传的文件后缀 + file-type-while-list: .png|.jpg|.gif|.icon|.pdf|.xlsx|.xls|.csv|.mp4|.avi|.jpeg + # 用于文件上传成功后,生成文件的下载公网完整URL + downloadPath: http://127.0.0.1:9095/file/download + nfs: + path: D:\\aaa\\ + -customer: - file: - dist-path: D:\Workspace\AJ-Report\report-core\upload - downloadPath: http://127.0.0.1:9095/file/download diff --git a/report-core/src/main/resources/bootstrap-prod.yml b/report-core/src/main/resources/bootstrap-prod.yml index 17071c3..d2b38dd 100644 --- a/report-core/src/main/resources/bootstrap-prod.yml +++ b/report-core/src/main/resources/bootstrap-prod.yml @@ -4,7 +4,3 @@ spring: url: jdbc:mysql://10.108.26.197:3306/aj_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: appuser@anji - -customer: - file: - dist-path: /app/disk/upload/ \ No newline at end of file diff --git a/report-core/src/main/resources/bootstrap.yml b/report-core/src/main/resources/bootstrap.yml index 2d3581a..3eb10d5 100644 --- a/report-core/src/main/resources/bootstrap.yml +++ b/report-core/src/main/resources/bootstrap.yml @@ -46,6 +46,30 @@ spring: placeholder-replacement: false init-sqls: - CREATE DATABASE IF NOT EXISTS `aj_report` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; + gaea: + subscribes: + oss: #文件存储 + enabled: true + ##允许上传的文件后缀 + file-type-while-list: .png|.jpg|.gif|.icon|.pdf|.xlsx|.xls|.csv|.mp4|.avi|.jpeg|.aaa + # 用于文件上传成功后,生成文件的下载公网完整URL + downloadPath: http://10.108.26.197:9095/file/download + nfs: + path: /app/disk/upload/ + #若要使用minio文件存储,请启用以下配置 + #minio: + # url: http://127.0.0.1 + # port: 9000 + # access-key: minioreport + # secret-key: minioreport + # bucket-name: aj-report + #若要使用amazonS3文件存储,请启用以下配置 + #amazonS3: + # url: http://127.0.0.1 + # access-key: access-key + # secret-key: secret-key + # bucket-name: AJ-Report + #若minio和amazonS3都没有,使用服务器高可用的nfs共享盘 mybatis-plus: configuration: @@ -64,16 +88,6 @@ logging: # 本应用自定义参数 customer: - # 开发测试用本地文件,如果是生产,请考虑使用对象存储 - file: - #上传对应本地全路径,目录必须是真实存在的,注意 Win是 \ 且有盘符,linux是 / 无盘符 - dist-path: /app/disk/upload/ - #dist-path: D:\Download - white-list: .png|.jpg|.jpeg|.gif|.icon|.pdf|.xlsx|.xls|.csv|.mp4|.avi - excelSuffix: .xlsx|.xls|.csv - #上传对应下载的下载链接路径 http://serverip:9095/file/download - downloadPath: http://10.108.26.197:9095/file/download - # 跳过token验证和权限验证的url清单 skip-authenticate-urls: /gaeaDict/all, /login, /static, /file/download/, /index.html, /favicon.ico, /reportShare/detailByCode user: diff --git a/report-core/src/main/resources/i18n/messages_en_US.properties b/report-core/src/main/resources/i18n/messages_en_US.properties index 209a129..9b37389 100644 --- a/report-core/src/main/resources/i18n/messages_en_US.properties +++ b/report-core/src/main/resources/i18n/messages_en_US.properties @@ -9,8 +9,9 @@ user.old.password.error=user old password error 1013=The code does not allow duplication 2001=File names are not allowed to be empty 2002=Unsupported suffix type -2003=File upload failed +2003=File upload failed:{0} 2004=File does not exist +file.operation.failed=File operation failed\uFF1A{0} field.not.null={} can not be null field.not.empty={} can not be empty diff --git a/report-core/src/main/resources/i18n/messages_zh_CN.properties b/report-core/src/main/resources/i18n/messages_zh_CN.properties index b9e9086..7222ba5 100644 --- a/report-core/src/main/resources/i18n/messages_zh_CN.properties +++ b/report-core/src/main/resources/i18n/messages_zh_CN.properties @@ -8,8 +8,9 @@ user.old.password.error=\u65E7\u5BC6\u7801\u4E0D\u6B63\u786E 1013=\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D 2001=\u6587\u4EF6\u540D\u4E0D\u5141\u8BB8\u4E3A\u7A7A 2002=\u6587\u4EF6\u7C7B\u578B\u4E0D\u652F\u6301 -2003=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25 +2003=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF1A{0} 2004=\u6587\u4EF6\u4E0D\u5B58\u5728 +file.operation.failed=\u6587\u4EF6\u64CD\u4F5C\u5931\u8D25\uFF1A{0} field.not.null={}\u4E0D\u80FD\u4E3Anull field.not.empty={}\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32 -- Gitee From 9fb7321fdd3e524b216dc90d98f3541bec1c6fd3 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Fri, 2 Sep 2022 16:20:34 +0800 Subject: [PATCH 11/61] gaea oss --- .../impl/ReportDashboardServiceImpl.java | 2 +- .../modules/file/service/GaeaFileService.java | 13 +--- .../service/impl/GaeaFileServiceImpl.java | 32 ++++------ .../service/impl/ReportExcelServiceImpl.java | 59 +++++++++++-------- .../src/main/resources/bootstrap-dev.yml | 2 + report-core/src/main/resources/bootstrap.yml | 3 + 6 files changed, 51 insertions(+), 60 deletions(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java index f6d7811..8cf36c4 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java @@ -331,7 +331,7 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper); String uploadPath; if (null == gaeaFile) { - GaeaFile upload = gaeaFileService.upload(imageFile, fileName); + GaeaFile upload = gaeaFileService.upload(imageFile); log.info("存入图片: {}", upload.getFilePath()); uploadPath = upload.getUrlPath(); }else { diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/GaeaFileService.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/GaeaFileService.java index 9cceea1..0581399 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/GaeaFileService.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/GaeaFileService.java @@ -18,16 +18,6 @@ import java.io.File; */ public interface GaeaFileService extends GaeaBaseService { - /** - * 文件上传 - * - * @param multipartFile 文件 - * @param file 文件 - * @param customFileName 自定义文件名,默认给null - * @return - */ - GaeaFile upload(MultipartFile multipartFile, File file, String customFileName); - /** * 文件上传 * @@ -41,10 +31,9 @@ public interface GaeaFileService extends GaeaBaseService lists=(List ) JSON.parse(jsonStr); - OutputStream out; + OutputStream out = null; + File file = null; try { - String fileId = UUID.randomUUID().toString(); - String filePath = dictPath + File.separator + fileId + ".xlsx"; - String urlPath = fileDownloadPath + java.io.File.separator + fileId; - - GaeaFile gaeaFile = new GaeaFile(); - gaeaFile.setFilePath(filePath); - gaeaFile.setFileId(fileId); - gaeaFile.setUrlPath(urlPath); - gaeaFile.setFileType("xlsx"); - gaeaFile.setFileInstruction(reportCode + ".xlsx"); - - out = new FileOutputStream(filePath); + String fileName = report.getReportCode(); + File dir = new File(dictPath + ZIP_PATH); + if (!dir.exists()){ + dir.mkdirs(); + } + String filePath = dir.getAbsolutePath() + File.separator + fileName + ".xlsx"; + file = new File(filePath); + out = Files.newOutputStream(Paths.get(filePath)); XlsUtil.exportXlsFile(out, true, lists); + gaeaFileService.upload(file); - gaeaFileMapper.insert(gaeaFile); - logger.info("导出成功:{}", gaeaFile); } catch (IOException e) { logger.error("导出失败", e); + }finally { + try { + out.close(); + file.delete(); + } catch (IOException e) { + throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); + } + } } return true; diff --git a/report-core/src/main/resources/bootstrap-dev.yml b/report-core/src/main/resources/bootstrap-dev.yml index e11aeec..f8383dc 100644 --- a/report-core/src/main/resources/bootstrap-dev.yml +++ b/report-core/src/main/resources/bootstrap-dev.yml @@ -16,3 +16,5 @@ spring: path: D:\\aaa\\ + + diff --git a/report-core/src/main/resources/bootstrap.yml b/report-core/src/main/resources/bootstrap.yml index 3eb10d5..c48b776 100644 --- a/report-core/src/main/resources/bootstrap.yml +++ b/report-core/src/main/resources/bootstrap.yml @@ -90,6 +90,9 @@ logging: customer: # 跳过token验证和权限验证的url清单 skip-authenticate-urls: /gaeaDict/all, /login, /static, /file/download/, /index.html, /favicon.ico, /reportShare/detailByCode + file: + #导入导出临时文件夹 默认.代表当前目录,拼接/tmp_zip/目录 + tmpPath: . user: ##新增用户默认密码 default: -- Gitee From 5fddf983731d9ae64ab51afa24506b2223b7e241 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Mon, 5 Sep 2022 15:27:17 +0800 Subject: [PATCH 12/61] gaea oss --- report-core/src/main/resources/bootstrap.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-core/src/main/resources/bootstrap.yml b/report-core/src/main/resources/bootstrap.yml index c48b776..6d90740 100644 --- a/report-core/src/main/resources/bootstrap.yml +++ b/report-core/src/main/resources/bootstrap.yml @@ -48,7 +48,7 @@ spring: - CREATE DATABASE IF NOT EXISTS `aj_report` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; gaea: subscribes: - oss: #文件存储 + oss: #文件存储 都配置的情况下优先级minio->amazonS3->nfs enabled: true ##允许上传的文件后缀 file-type-while-list: .png|.jpg|.gif|.icon|.pdf|.xlsx|.xls|.csv|.mp4|.avi|.jpeg|.aaa -- Gitee From fbc97d0740483f3d79aafce598d0c947f5c573b4 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Tue, 6 Sep 2022 10:07:28 +0800 Subject: [PATCH 13/61] gaea oss --- .../business/modules/file/controller/param/GaeaFileParam.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/controller/param/GaeaFileParam.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/controller/param/GaeaFileParam.java index 7d6bd83..cac2f1b 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/controller/param/GaeaFileParam.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/controller/param/GaeaFileParam.java @@ -4,6 +4,7 @@ package com.anjiplus.template.gaea.business.modules.file.controller.param; import com.anji.plus.gaea.annotation.Query; import com.anji.plus.gaea.constant.QueryEnum; import com.anji.plus.gaea.curd.params.PageParam; +import lombok.Data; import java.io.Serializable; @@ -13,6 +14,7 @@ import java.io.Serializable; * @author peiyanni * @since 2021-02-18 14:48:29 */ +@Data public class GaeaFileParam extends PageParam implements Serializable { /** 模糊查询 */ -- Gitee From 13df7e89180dce4f53208a69d8a001bd1a2df353 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Tue, 6 Sep 2022 10:17:07 +0800 Subject: [PATCH 14/61] gaea oss --- .../business/modules/file/service/impl/GaeaFileServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java index 7aa0af1..a9bba7a 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java @@ -146,7 +146,7 @@ public class GaeaFileServiceImpl implements GaeaFileService { String userAgent = request.getHeader("User-Agent"); boolean isIEBrowser = userAgent.indexOf("MSIE") > 0; // 在oss中存储的文件名 402b6193e70e40a9bf5b73a78ea1e8ab.png - String fileObjectName = gaeaFile.getFilePath(); + String fileObjectName = gaeaFile.getFileId().concat(".").concat(gaeaFile.getFileType()); String originalFilename = gaeaFile.getFileInstruction(); if (StringUtils.isBlank(fileObjectName) || StringUtils.isBlank(originalFilename)) { throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); -- Gitee From 910fbc3e62c095ee50e9d49c6209886c41c37539 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Tue, 6 Sep 2022 10:24:54 +0800 Subject: [PATCH 15/61] gaea oss --- .../business/modules/file/service/impl/GaeaFileServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java index a9bba7a..c7baa24 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java @@ -184,7 +184,7 @@ public class GaeaFileServiceImpl implements GaeaFileService { } // 在oss中存储的文件名 402b6193e70e40a9bf5b73a78ea1e8ab.png - String fileObjectName = gaeaFile.getFilePath(); + String fileObjectName = gaeaFile.getFileId().concat(".").concat(gaeaFile.getFileType()); String originalFilename = gaeaFile.getFileInstruction(); if (StringUtils.isBlank(fileObjectName) || StringUtils.isBlank(originalFilename)) { throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); -- Gitee From 8df75b69a73f3670b68b0ad95eac885a25b6b6ca Mon Sep 17 00:00:00 2001 From: qianming Date: Tue, 6 Sep 2022 10:34:57 +0800 Subject: [PATCH 16/61] update --- report-core/src/main/resources/bootstrap.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/report-core/src/main/resources/bootstrap.yml b/report-core/src/main/resources/bootstrap.yml index 6d90740..a13e300 100644 --- a/report-core/src/main/resources/bootstrap.yml +++ b/report-core/src/main/resources/bootstrap.yml @@ -55,6 +55,7 @@ spring: # 用于文件上传成功后,生成文件的下载公网完整URL downloadPath: http://10.108.26.197:9095/file/download nfs: + #上传对应本地全路径,目录必须是真实存在的,注意 Win是 \ 且有盘符,linux是 / 无盘符 path: /app/disk/upload/ #若要使用minio文件存储,请启用以下配置 #minio: -- Gitee From 278127a07278ab6ed3c3c28871511c4b2f47937a Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Tue, 6 Sep 2022 10:37:07 +0800 Subject: [PATCH 17/61] gaea oss --- .../modules/file/service/impl/GaeaFileServiceImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java index c7baa24..23be8a9 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java @@ -206,10 +206,7 @@ public class GaeaFileServiceImpl implements GaeaFileService { public void processBatchAfterOperation(List entities, BaseOperationEnum operationEnum) throws BusinessException { if (operationEnum.equals(BaseOperationEnum.DELETE_BATCH)) { // 删除本地文件 - entities.forEach(gaeaFile -> { - String filePath = gaeaFile.getFilePath(); - gaeaOSSTemplate.deleteFile(filePath); - }); + entities.forEach(gaeaFile -> gaeaOSSTemplate.deleteFile(gaeaFile.getFileId().concat(".").concat(gaeaFile.getFileType()))); } } -- Gitee From 69cd778ea47a3c82d97a03f7e4a411fb680e4ba9 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Tue, 6 Sep 2022 14:36:53 +0800 Subject: [PATCH 18/61] gaea oss --- .../modules/file/service/impl/GaeaFileServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java index 23be8a9..4a1588a 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java @@ -151,6 +151,9 @@ public class GaeaFileServiceImpl implements GaeaFileService { if (StringUtils.isBlank(fileObjectName) || StringUtils.isBlank(originalFilename)) { throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); } + if (!originalFilename.endsWith(".".concat(gaeaFile.getFileType()))) { + originalFilename = originalFilename.concat(".").concat(gaeaFile.getFileType()); + } // 调用文件存储工厂,读取文件,返回字节数组 byte[] fileBytes = gaeaOSSTemplate.downloadFile(fileObjectName); -- Gitee From 054191d0c8171bac7a82d6065d0007c6048f8961 Mon Sep 17 00:00:00 2001 From: qianming Date: Tue, 6 Sep 2022 16:06:48 +0800 Subject: [PATCH 19/61] update pom.xml --- report-core/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/report-core/pom.xml b/report-core/pom.xml index 7b2b59c..7a41ea4 100644 --- a/report-core/pom.xml +++ b/report-core/pom.xml @@ -106,6 +106,7 @@ mysql mysql-connector-java + 8.0.28 com.alibaba @@ -127,7 +128,7 @@ org.apache.httpcomponents httpclient - 4.5.10 + 4.5.13 -- Gitee From 292d19b554d699a1413e3ffc81c8287b1ee89e82 Mon Sep 17 00:00:00 2001 From: qianming Date: Wed, 7 Sep 2022 08:55:43 +0800 Subject: [PATCH 20/61] update 0.9.8.5 --- report-ui/src/views/layout/components/Sidebar/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-ui/src/views/layout/components/Sidebar/index.vue b/report-ui/src/views/layout/components/Sidebar/index.vue index 170228c..84fa6f6 100644 --- a/report-ui/src/views/layout/components/Sidebar/index.vue +++ b/report-ui/src/views/layout/components/Sidebar/index.vue @@ -3,7 +3,7 @@
- V0.9.8.1 + V0.9.8.5
Date: Wed, 7 Sep 2022 10:04:09 +0800 Subject: [PATCH 21/61] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/docs/guide/quicklyDistribution.md | 15 ++--- doc/docs/guide/quicklySeparate.md | 65 +++++++++---------- doc/docs/guide/quicklySource.md | 15 +++-- doc/docs/picture/quickly/img.png | Bin 0 -> 98874 bytes doc/docs/picture/quickly/img_15.png | Bin 37384 -> 0 bytes report-core/README.md | 2 +- report-core/src/main/resources/bootstrap.yml | 8 +++ 7 files changed, 57 insertions(+), 48 deletions(-) create mode 100644 doc/docs/picture/quickly/img.png delete mode 100644 doc/docs/picture/quickly/img_15.png diff --git a/doc/docs/guide/quicklyDistribution.md b/doc/docs/guide/quicklyDistribution.md index 3ea87cb..fce4e5d 100644 --- a/doc/docs/guide/quicklyDistribution.md +++ b/doc/docs/guide/quicklyDistribution.md @@ -1,8 +1,9 @@ ``` 第一步,下载zip包,解压 - 第二步,conf->bootstrap.yml,修改mysql连接 + 第二步,conf->bootstrap.yml,修改mysql连接等信息 第三步,启动bin目录下start.sh - 第四步,访问 http://localhost:9095 + 第四步,访问 http://localhost:9095 admin 123456 + 第五步,修改"数据源->mysql数据源"用户名密码 ``` ## 下载发行版 @@ -21,10 +22,10 @@ ![bootstrap.png](../picture/quickly/img_2.png)
**注**:请确认你的Mysql是否支持远程连接,登陆用户是否有DDL权限
-## 上传功能 +## OSS配置 -使用上传功能,必须修改此内容,注意路径格式,比如Win是 \ ,linux是 /
-![file.png](../picture/quickly/img_15.png)
+OSS底层已支持minio、amazonS3、dfs,都配置的情况下优先级minio->amazonS3->nfs
+![file.png](../picture/quickly/img.png)
## 启动 @@ -38,9 +39,7 @@ aj-report-XXX --> bin --> start.bat
如果start.bat启动有问题的话,可以尝试以下方法解决。
修改第4行的JAVA_HOME,改成你自己的JAVA_HOME,并去掉**rem**注释,双击启动
-![java.png](../picture/quickly/img_7.png)
-**注**:如果你JAVA_HOME目录存在空格,将bat文件最下面的JAVA_HOME添加""号 -![img.png](../picture/quickly/img_8.png)
+![java.png](../picture/quickly/img_7.png) ## 访问 diff --git a/doc/docs/guide/quicklySeparate.md b/doc/docs/guide/quicklySeparate.md index 7917ce5..f30599d 100644 --- a/doc/docs/guide/quicklySeparate.md +++ b/doc/docs/guide/quicklySeparate.md @@ -15,6 +15,8 @@ java -jar BASE_API: '"./"',改成自己后端的api npm install npm run build + +使用nginx转发 ``` ## linux部署后端 @@ -24,8 +26,8 @@ npm run build - [Apache Maven] 3.5
- [Node.js] v14.16.0
- [Jdk] 1.8
- 请在你的Windows上先准备好maven、node.js、jdk
- **注**:已知 **Jdk11** (部分小版本)存在兼容性问题,请不要使用openJdk,环境问题请看 **常见问题** 大类
+ +**注**:已知 **Jdk11** (部分小版本)存在兼容性问题,请不要使用openJdk,环境问题请看 **常见问题** 大类
### 克隆源码 @@ -36,46 +38,39 @@ git clone https://gitee.com/anji-plus/report.git
### 修改mysql连接 report-core --> src --> main --> resources --> bootstrap.yml
-![bootstrap.png](../picture/quickly/img_2.png)
将图中关于mysql的连接配置信息换成你使用的IP
-**注**:aj_report库是存放底层基础信息的库,flyway启动时会自动建立,如果你在这里修改了库,将会出错
-**注**:请确认你的Mysql是否支持远程连接,登陆用户是否有DDL权限
- -### 上传功能 -使用上传功能,必须修改此内容,注意路径格式,比如Win是 \ ,linux是 /
-![file.png](../picture/quickly/img_15.png)
+![bootstrap.png](../picture/quickly/img_2.png)
-### maven打包 +**注 :** -**打包之前如果系统用的不止mysql数据源,需要自己在pom文件中加入对应的数据库的驱动,登陆系统之后,数据源提示无驱动,则选择通用JDBC数据源,这里不做演示了**
-使用 maven package
-**注**:不要使用maven install
-**注**:此方式不会打包 lib目录下的驱动,详情可查看 **数据源 扩展**
-![img10](../picture/quickly/img_10.png)
- -### linux启动jar包 +``` +1、aj_report库是存放底层基础信息的库,flyway启动时会自动建立,如果你在这里修改了库,将会出错 +2、请确认你的Mysql是否支持远程连接,登陆用户是否有DDL权限 +``` -将上步生成的jar包上传至linux,使用java -jar命令启动
-**注**:请确保你的linux有jdk
+### OSS配置 -## 本地启动前端 +OSS底层已支持minio、amazonS3、dfs,都配置的情况下优先级minio->amazonS3->nfs
+![file.png](../picture/quickly/img.png)
-### 前端编译 +### maven打包 -进入前端目录:report-ui
-![img11](../picture/quickly/img_11.png)
-执行 npm install
+直接使用 maven package 打包,打包完成如图所示
-### 修改config +![img10](../picture/quickly/img_10.png)
+**注 :** -目录地址:report-ui --> config --> dev.env.js
-修改你的BASE_API地址
+``` +1、打包之前如果系统用的不止mysql数据源,需要自己在pom文件中加入对应的数据库的驱动,登陆系统之后,数据源提示无驱动,则选择通用JDBC数据源,这里不做演示了 +2、不要使用 maven install +3、此方式不会打包 lib目录下的驱动,详情可查看 "数据源->扩展" +``` -### 启动前端 +### linux启动jar包 -report-ui目录:
-执行 npm run dev
+将上步生成的jar包上传至linux,使用java -jar命令启动
+**注**:请确保你的linux有jdk1.8
## 前端build @@ -88,14 +83,18 @@ report-ui目录:
### 修改config 目录地址:report-ui --> config --> prod.env.js
-修改你的BASE_API地址,改成自己后端的api
+将BASE_API地址,改成你后端的api地址
-### build +### 打包 -reoprt-ui目录:
执行 npm run build
生成的前端dist目录文件在report-ui下面
+ ![img12](../picture/quickly/img_12.png)
+### 前端部署 + +使用nginx做转发 + diff --git a/doc/docs/guide/quicklySource.md b/doc/docs/guide/quicklySource.md index 9c272a6..14770b1 100644 --- a/doc/docs/guide/quicklySource.md +++ b/doc/docs/guide/quicklySource.md @@ -9,8 +9,10 @@ cd aj-report-xxxx vim conf/bootstrap.yml 修改数据库连接、上传文件的路径以及地址 sh bin/start.sh -访问 -http://serverip:9095 +访问:http://serverip:9095 +admin 123456 + +修改:"数据源->mysql数据源"用户名密码 ``` ## 编译环境 @@ -37,7 +39,8 @@ git clone https://gitee.com/anji-plus/report.git
编译完成后是放在当前目录下的build文件夹中:aj-report-xxxx.zip
**注:** 如果Win10部署的话,如图用git执行sh build.sh就行了。Linux就直接去report目录下执行sh build.sh就行。
-**特别注意:** 如果是Win10编译,那么几个启动脚本的格式则是win的格式,放linux上执行会报错的,反之放linux编译在win10启动也会报错,需要转格式。
+**特别注意:** +如果是Win10编译,那么几个启动脚本的格式则是win的格式,放linux上执行会报错的,反之放linux编译在win10启动也会报错,需要转格式。
## 修改mysql连接 @@ -50,10 +53,10 @@ git clone https://gitee.com/anji-plus/report.git
![bootstrap.png](../picture/quickly/img_2.png)
**注**:请确认你的Mysql是否支持远程连接,登陆用户是否有DDL权限
-## 上传功能 +## OSS配置 -使用上传功能,必须修改此内容,注意路径格式,比如Win是 \ ,linux是 /
-![file.png](../picture/quickly/img_15.png) +OSS底层已支持minio、amazonS3、dfs,都配置的情况下优先级minio->amazonS3->nfs
+![file.png](../picture/quickly/img.png)
## 启动 diff --git a/doc/docs/picture/quickly/img.png b/doc/docs/picture/quickly/img.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2c477dbfbc899947c5d027028b04c8242350ff GIT binary patch literal 98874 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%0DX6j?4-ss-a~Hz&4e%4U++yvjL4kR68P&W^&(jjH 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%0AD%==UlAO4yC@?cN0ZQ-8;}1e2Cd!P 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 CnJ9Mv literal 0 HcmV?d00001 diff --git a/doc/docs/picture/quickly/img_15.png b/doc/docs/picture/quickly/img_15.png deleted file mode 100644 index dbdb455a05fd8e2ea382b352184f4f9060279e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37384 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 Dqs~S_ diff --git a/report-core/README.md b/report-core/README.md index 56e22ee..c2001c5 100644 --- a/report-core/README.md +++ b/report-core/README.md @@ -7,7 +7,7 @@ com.anji-plus spring-boot-gaea - 2.0.3.RELEASE + 2.0.5.RELEASE org.springframework.boot diff --git a/report-core/src/main/resources/bootstrap.yml b/report-core/src/main/resources/bootstrap.yml index a13e300..eb251e4 100644 --- a/report-core/src/main/resources/bootstrap.yml +++ b/report-core/src/main/resources/bootstrap.yml @@ -22,6 +22,14 @@ spring: url: jdbc:mysql://10.108.26.197:3306/aj_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: appuser@anji + + #如果要使用redis,请参考report-core目录下的README.md文件中写的进行调整 +# redis: +# host: 127.0.0.1 +# port: 6379 +# password: root +# database: 1 + #数据源连接池配置 druid: initial-size: 10 # 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 -- Gitee From 65625d0f9b296267265fffad5bba9cf3bec67576 Mon Sep 17 00:00:00 2001 From: qianming Date: Thu, 15 Sep 2022 15:25:45 +0800 Subject: [PATCH 22/61] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/docs/guide/dataset.md | 7 ++++--- doc/docs/picture/dateset/img_6.png | Bin 0 -> 20174 bytes 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 doc/docs/picture/dateset/img_6.png diff --git a/doc/docs/guide/dataset.md b/doc/docs/guide/dataset.md index 00514cd..54b43a4 100644 --- a/doc/docs/guide/dataset.md +++ b/doc/docs/guide/dataset.md @@ -34,14 +34,15 @@ #### js脚本 -**注**:这里的JS是java的scriptengine执行的,很多es6的语法不支持
+**注**:这里的JS是java的scriptengine执行的,很多ES6的语法不支持
![img4](../picture/dateset/img_4.png)
入参是data,返回值也必须是data,中间是JS的处理过程,注意入参返回都是List,记得保存。
#### 字典项 -场景有限,待补充。 +![img6.png](../picture/dateset/img_6.png)
+记得保存 ## HTTP数据集 -即原有http数据源的功能,原有http数据源不动 \ No newline at end of file +即原有http数据源的功能,原有http数据源不动 diff --git a/doc/docs/picture/dateset/img_6.png b/doc/docs/picture/dateset/img_6.png new file mode 100644 index 0000000000000000000000000000000000000000..98ff8773938519e3ee7152916052b09e15e56d7d GIT binary patch literal 20174 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 literal 0 HcmV?d00001 -- Gitee From 4577fcd94e9ec5d967f5d7c8462ee95482430397 Mon Sep 17 00:00:00 2001 From: qianming Date: Fri, 16 Sep 2022 09:39:27 +0800 Subject: [PATCH 23/61] bugfix--I5R22O no auth --- .../modules/dashboard/controller/ReportDashboardController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/controller/ReportDashboardController.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/controller/ReportDashboardController.java index 69037cf..fdb66fb 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/controller/ReportDashboardController.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/controller/ReportDashboardController.java @@ -101,7 +101,7 @@ public class ReportDashboardController { @PostMapping("/share") @GaeaAuditLog(pageTitle = "分享") - @Permission(code = "bigScreenManage", name = "分享报表") + @Permission(code = "share", name = "分享报表") public ResponseBean share(@Validated @RequestBody ReportShareDto dto) { return ResponseBean.builder().data(reportShareService.insertShare(dto)).build(); } -- Gitee From f873a58331d9145aeb3e7a778454c0a5959e5d57 Mon Sep 17 00:00:00 2001 From: qianming Date: Fri, 16 Sep 2022 09:41:24 +0800 Subject: [PATCH 24/61] update 0.9.8.6 --- report-ui/src/views/layout/components/Sidebar/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-ui/src/views/layout/components/Sidebar/index.vue b/report-ui/src/views/layout/components/Sidebar/index.vue index 84fa6f6..d557662 100644 --- a/report-ui/src/views/layout/components/Sidebar/index.vue +++ b/report-ui/src/views/layout/components/Sidebar/index.vue @@ -3,7 +3,7 @@
- V0.9.8.5 + V0.9.8.6
Date: Fri, 16 Sep 2022 10:34:10 +0800 Subject: [PATCH 25/61] hotfix--excel no auth --- .../modules/reportexcel/controller/ReportExcelController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/reportexcel/controller/ReportExcelController.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/reportexcel/controller/ReportExcelController.java index 9e5594b..fbb2186 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/reportexcel/controller/ReportExcelController.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/reportexcel/controller/ReportExcelController.java @@ -84,7 +84,7 @@ public class ReportExcelController extends GaeaBaseController Date: Tue, 20 Sep 2022 16:26:10 +0800 Subject: [PATCH 26/61] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/docs/guide/dataset.md | 5 ++++ doc/docs/guide/question.md | 34 ++++++++++++++++++++-------- doc/docs/picture/qusetion/img_6.png | Bin 0 -> 38552 bytes doc/docs/picture/qusetion/img_7.png | Bin 0 -> 64083 bytes 4 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 doc/docs/picture/qusetion/img_6.png create mode 100644 doc/docs/picture/qusetion/img_7.png diff --git a/doc/docs/guide/dataset.md b/doc/docs/guide/dataset.md index 54b43a4..558686e 100644 --- a/doc/docs/guide/dataset.md +++ b/doc/docs/guide/dataset.md @@ -38,6 +38,11 @@ ![img4](../picture/dateset/img_4.png)
入参是data,返回值也必须是data,中间是JS的处理过程,注意入参返回都是List,记得保存。
+#### java脚本 + +通过Groovy来进行实现的
+[Groovy用法参考](https://my.oschina.net/u/4517014/blog/5526324)
+ #### 字典项 ![img6.png](../picture/dateset/img_6.png)
diff --git a/doc/docs/guide/question.md b/doc/docs/guide/question.md index 450ea3a..cfdcf3f 100644 --- a/doc/docs/guide/question.md +++ b/doc/docs/guide/question.md @@ -80,34 +80,48 @@
-- flyway执行报错1.0.10sql失败
- 错误提示:Caused by: org.flywaydb.core.api.FlywayException: Validate failed: Detected failed
- migration to version 1.0.10 (create report share)
- 请参考此 [Issue](https://gitee.com/anji-plus/report/issues/I47JNE) 解决此问题
+- flyway执行sql相关错误
+ 错误提示:** Error creating bean with name 'flywayInitializer' defined in class XXX migration to version V1.0.XXX.sql failed **
+ 解析:flyway在执行某个版本里面包含的sql时报错了
+ +- 可能原因:
+ 1、mysql版本问题,在不同版本的mysql中,部分语法可能存在异同
+ 2、mysql配置问题
+ + 解决方案: + 一、禁用flyway,手动执行已有的各版本sql文件
+ 1、在bootstrap.yml配置文件中找到flyway配置项,如图示
+ [img6.png](../picture/qusetion/img_6.png)
+ 2、将report-core/src/main/resources/db.migration目录下所有的sql文件都执行一次,遇到报错,手动修改sql文件。
+ 3、sql文件中,只有** aj_report **数据库相关的sql是必须的依赖,在确保和aj_report数据库相关sql都执行后在启动服务。
+ + 二、保持flyway开启状态,手动执行报错的那个版本sql文件
+ 1、在report-core/src/main/resources/db.migration目录下找到报错的那个版本sql
+ 2、根据报错提示找到sql文件中具体报错的那一段sql,或者和数据库已有的数据对比,找到没有执行成功的那部分sql
+ 3、手动执行flyway没执行成功的那部分,根据提示,对sql进行修改调整
+ 4、执行完毕后,在aj_report数据库下flyway_schema_history表中找到报错对应的sql文件版本,将对应的success改完1
+ [img7.png](../picture/qusetion/img_7.png)

## 数据集相关 - 系统异常,后台日志显示“** Data too long for colum ** ”
+ 查询到的数据太多了,无法入库,这里查询入库的数据只作为在使用动态数据时做解析用
1、建议不要使用 "select *"
2、一张图表能承载的数据量是有限的,太多则图表展示不出来、页面卡死等
3、必须使用 "select *" ,或者展示很多数据。解决方法,将测试预览的值删掉只剩一条,注意数据的结构 [{}]
## 大屏图表组件相关 -- 访问白屏
+- 访问大屏,浏览器白屏
设计完大屏,保存后进行预览,发现背景全白
1、回到编辑页面,查看大屏背景颜色是否设置
- 2、查看大屏的宽高,如果宽高都是0(大屏宽高在设计时,有概率性变成0,不知原因)大屏背景图片,颜色,皆无法显示
+ 2、查看大屏的宽高,如果宽高都是0,大屏背景图片,颜色,皆无法显示
3、大屏宽高改成 1920 1080

-- 文本框颜色无法改变
- 使用文本框,改变颜色,无法改变。已知有概率性的出现无法修改文本框颜色的情况。解决方法有以下
- 1、保存退出大屏,重新进入大屏修改文本框颜色
- 2、删掉文本框,重新拖动一个
diff --git a/doc/docs/picture/qusetion/img_6.png b/doc/docs/picture/qusetion/img_6.png new file mode 100644 index 0000000000000000000000000000000000000000..d41c722fa4bbb84f3ae7e6b29742e092912d755a GIT binary patch literal 38552 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 N$~m~Lc{R*4B^G>rfN literal 0 HcmV?d00001 diff --git a/doc/docs/picture/qusetion/img_7.png b/doc/docs/picture/qusetion/img_7.png new file mode 100644 index 0000000000000000000000000000000000000000..bdbc9c98610372d14299faa525e109d45ed59c2a GIT binary patch literal 64083 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∓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 literal 0 HcmV?d00001 -- Gitee From f55e16dc810db905086d29fd1f78c4f361197241 Mon Sep 17 00:00:00 2001 From: Foming Date: Thu, 22 Sep 2022 07:19:07 +0000 Subject: [PATCH 27/61] update README.md. Signed-off-by: Foming --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 47d31b3..986bb1f 100644 --- a/README.md +++ b/README.md @@ -210,9 +210,9 @@ AJ-Report使用[Apache2.0开源协议](http://www.apache.org/licenses/LICENSE-2. ## 技术支持 **如有问题,请提交 [Issue](https://gitee.com/anji-plus/report/issues)
** -个人企业微信:加微信进群备注 AJ-Report 或者 Report
+个人企业微信:加微信进群备注 ** AJ-Report ** 或者 ** Report **
如果不是为了进群,请直接说明来意,每天加群的都很多,企微也是我们自己的工作企微,会有很多消息会被刷下去,如果半天没有回复你,请发送多次。如果加了之后一言不发,不好意思,我直接忽略,我也不知道你要干嘛。
- + #### 开源不易,劳烦各位star ☺ -- Gitee From f2a637bda2375edcd9b946a66d0881253ef230d0 Mon Sep 17 00:00:00 2001 From: Foming Date: Thu, 22 Sep 2022 07:20:20 +0000 Subject: [PATCH 28/61] update README.md. Signed-off-by: Foming --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 986bb1f..e6b7708 100644 --- a/README.md +++ b/README.md @@ -210,7 +210,7 @@ AJ-Report使用[Apache2.0开源协议](http://www.apache.org/licenses/LICENSE-2. ## 技术支持 **如有问题,请提交 [Issue](https://gitee.com/anji-plus/report/issues)
** -个人企业微信:加微信进群备注 ** AJ-Report ** 或者 ** Report **
+个人企业微信:加微信进群备注 AJ-Report 或者 Report
如果不是为了进群,请直接说明来意,每天加群的都很多,企微也是我们自己的工作企微,会有很多消息会被刷下去,如果半天没有回复你,请发送多次。如果加了之后一言不发,不好意思,我直接忽略,我也不知道你要干嘛。
-- Gitee From 385555ac71f14d6f0426c87b20e57834c84c896c Mon Sep 17 00:00:00 2001 From: Foming Date: Fri, 23 Sep 2022 00:44:53 +0000 Subject: [PATCH 29/61] update README.md. Signed-off-by: Foming --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index e6b7708..1773af9 100644 --- a/README.md +++ b/README.md @@ -217,3 +217,14 @@ AJ-Report使用[Apache2.0开源协议](http://www.apache.org/licenses/LICENSE-2. #### 开源不易,劳烦各位star ☺ + +#### 感谢JetBrains 的支持 + +##### JetBrains:[https://www.jetbrains.com/?from=AJ-Report](https://www.jetbrains.com/?from=AJ-Report"链接") + +
+ + +## Stargazers over time + +[![Stargazers over time](https://starchart.cc/anji-plus/report.svg)](https://starchart.cc/anji-plus/report) -- Gitee From 84b75bd07836e4de96acedaa68fe27bd48425a3f Mon Sep 17 00:00:00 2001 From: Foming Date: Fri, 23 Sep 2022 00:46:08 +0000 Subject: [PATCH 30/61] update README.md. Signed-off-by: Foming --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1773af9..49b1f47 100644 --- a/README.md +++ b/README.md @@ -218,9 +218,9 @@ AJ-Report使用[Apache2.0开源协议](http://www.apache.org/licenses/LICENSE-2. #### 开源不易,劳烦各位star ☺ -#### 感谢JetBrains 的支持 +## 感谢JetBrains 的支持 -##### JetBrains:[https://www.jetbrains.com/?from=AJ-Report](https://www.jetbrains.com/?from=AJ-Report"链接") +#### JetBrains:[https://www.jetbrains.com/?from=AJ-Report](https://www.jetbrains.com/?from=AJ-Report"链接")
-- Gitee From 1ad233d7c900f18570ef87e22052e22eee659979 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Sat, 8 Oct 2022 16:58:45 +0800 Subject: [PATCH 31/61] =?UTF-8?q?shareToken=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AD=98=E5=82=A8=E5=A4=9A=E4=B8=AAshareToke?= =?UTF-8?q?n=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=8D=95=E4=B8=AA=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E6=89=93=E5=BC=80=E5=A4=9A=E4=B8=AA=E5=88=86?= =?UTF-8?q?=E4=BA=AB=E9=93=BE=E6=8E=A5=EF=BC=8C=E5=88=86=E4=BA=AB=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gaea/business/filter/TokenFilter.java | 15 ++++++++------- .../template/gaea/business/util/JwtUtil.java | 13 +++++++++++++ report-ui/src/api/GaeaReport.js | 2 ++ report-ui/src/permission.js | 2 +- report-ui/src/utils/auth.js | 6 +++++- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java index 74ded38..b9214f6 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java @@ -101,15 +101,17 @@ public class TokenFilter implements Filter { filterChain.doFilter(request, response); return; } - + //获取token + String token = request.getHeader("Authorization"); //针对大屏分享,优先处理 String shareToken = request.getHeader("Share-Token"); - if (StringUtils.isNotBlank(shareToken)) { - //两个接口需要处理 + if (StringUtils.isNotBlank(shareToken) && StringUtils.isBlank(token)) { + //需要处理 // /reportDashboard/getData // /reportDashboard/{reportCode} - String reportCode = JwtUtil.getReportCode(shareToken); - if (!uri.endsWith("/getData") && !uri.contains(reportCode)) { + // /reportExcel/preview + List reportCodeList = JwtUtil.getReportCodeList(shareToken); + if (!uri.endsWith("/reportDashboard/getData") && !uri.endsWith("/reportExcel/preview") && reportCodeList.stream().noneMatch(uri::contains)) { ResponseBean responseBean = ResponseBean.builder().code("50014") .message("分享链接已过期").build(); response.getWriter().print(JSONObject.toJSONString(responseBean)); @@ -120,8 +122,7 @@ public class TokenFilter implements Filter { } - //获取token - String token = request.getHeader("Authorization"); + if (StringUtils.isBlank(token)) { error(response); return; diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/util/JwtUtil.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/util/JwtUtil.java index 753f4de..2646159 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/util/JwtUtil.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/util/JwtUtil.java @@ -1,5 +1,6 @@ package com.anjiplus.template.gaea.business.util; +import com.anji.plus.gaea.constant.GaeaConstant; import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anjiplus.template.gaea.business.code.ResponseCode; import com.auth0.jwt.JWT; @@ -9,8 +10,11 @@ import com.auth0.jwt.interfaces.Claim; import com.auth0.jwt.interfaces.DecodedJWT; import org.apache.commons.lang3.StringUtils; +import java.util.Arrays; import java.util.Date; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * Created by raodeming on 2021/8/18. @@ -53,6 +57,15 @@ public class JwtUtil { return claim.asString(); } + /** + * 存在多个分享token + * @param tokenList + * @return + */ + public static List getReportCodeList(String tokenList) { + return Arrays.stream(tokenList.split(GaeaConstant.SPLIT)).filter(StringUtils::isNotBlank).map(JwtUtil::getReportCode).distinct().collect(Collectors.toList()); + } + public static String getShareCode(String token) { Claim claim = getClaim(token).get("shareCode"); if (null == claim) { diff --git a/report-ui/src/api/GaeaReport.js b/report-ui/src/api/GaeaReport.js index 5421b12..731f15d 100644 --- a/report-ui/src/api/GaeaReport.js +++ b/report-ui/src/api/GaeaReport.js @@ -1,4 +1,5 @@ import request from '@/utils/request' +import {getShareToken, getToken} from "@/utils/auth"; // 设计报表 export function design(data) { @@ -14,6 +15,7 @@ export function preview(data) { return request({ url: 'reportExcel/preview', method: 'post', + headers: { 'Share-Token': getShareToken(), 'Authorization': getToken() }, data, }) } diff --git a/report-ui/src/permission.js b/report-ui/src/permission.js index 3fa4c4f..4f15119 100644 --- a/report-ui/src/permission.js +++ b/report-ui/src/permission.js @@ -3,7 +3,7 @@ import NProgress from 'nprogress' import 'nprogress/nprogress.css' import { getToken, getAccessUser } from "@/utils/auth"; export default router -const whiteList = ['/login', '/aj/**', '/bigscreen/viewer'] +const whiteList = ['/login', '/aj/**', '/el/**', '/bigscreen/viewer', '/excelreport/viewer'] // 判断是否需要登录权限 以及是否登录 router.beforeEach((to, from, next) => { diff --git a/report-ui/src/utils/auth.js b/report-ui/src/utils/auth.js index ca0cc19..1c80845 100644 --- a/report-ui/src/utils/auth.js +++ b/report-ui/src/utils/auth.js @@ -11,9 +11,13 @@ export function getShareToken() { return getStorageItem(ShareTokenKey) == null ? '' : getStorageItem(ShareTokenKey); } export function setToken(token) { - return setStorageItem(TokenKey, token) + return setStorageItem(TokenKey, token); } export function setShareToken(shareToken) { + const originalShareToken = getShareToken(); + if ((originalShareToken != null || originalShareToken != '') && originalShareToken.indexOf(shareToken) == -1) { + shareToken = originalShareToken + ',' + shareToken + } return setStorageItem(ShareTokenKey, shareToken) } export function delToken() { -- Gitee From afa50789af187c9bc3ee1c38d01a37ccb270d354 Mon Sep 17 00:00:00 2001 From: qianming Date: Fri, 14 Oct 2022 09:44:40 +0800 Subject: [PATCH 32/61] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- doc/docs/guide/dataset.md | 3 ++- doc/docs/guide/datasource.md | 1 + doc/docs/guide/quicklyDevelop.md | 7 ++++++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d4da422..97f3dfa 100644 --- a/README.md +++ b/README.md @@ -185,11 +185,11 @@ sql文件的目录在:report-core --> src --> main --> resources -- > db.migra ## 版本问题 -已知以下版本存在兼容性问题 +已知以下版本存在兼容性问题,请不要使用 -- Node.js V16 +- Node.js V16及以上 - openJdk -- Jdk 11 +- Jdk 1.7及以下/11及以上 - Mysql 8.0(8.0.23/26版本没有问题,8.0.21版本存在问题) **[常见问题](https://ajreport.beliefteam.cn/report-doc/guide/question.html)** diff --git a/doc/docs/guide/dataset.md b/doc/docs/guide/dataset.md index 558686e..3e69721 100644 --- a/doc/docs/guide/dataset.md +++ b/doc/docs/guide/dataset.md @@ -50,4 +50,5 @@ ## HTTP数据集 -即原有http数据源的功能,原有http数据源不动 +即原有http数据源的功能
+**注:** Http接口返回类型必须是Json、不能是text,text无法解析 diff --git a/doc/docs/guide/datasource.md b/doc/docs/guide/datasource.md index 2dc5e43..1272b1b 100644 --- a/doc/docs/guide/datasource.md +++ b/doc/docs/guide/datasource.md @@ -17,6 +17,7 @@ 表aj_report.gaea_dict_item,字段dict_code:SOURCE_TYPE 表aj_report.gaea_dict_item, item_extend字段是下拉选择后动态表单渲染的json数据 ``` +**注:** Http接口返回类型必须是Json、不能是text,text无法解析 ## 操作 diff --git a/doc/docs/guide/quicklyDevelop.md b/doc/docs/guide/quicklyDevelop.md index ed2252a..b43c2cd 100644 --- a/doc/docs/guide/quicklyDevelop.md +++ b/doc/docs/guide/quicklyDevelop.md @@ -37,7 +37,12 @@ - [Node.js] 14.16.0 - [Windows 10] -已知 **Mysql8.0** 和 **Jdk11** (部分小版本)会出现兼容性问题,后续有解决方法将会在下方 **其他** 大类进行补充 +已知 **Mysql8.0** 部分小版本会出现兼容性问题,后续有解决方法将会在下方 **其他** 大类进行补充 + +## 不支持的版本 + +- [JDK] 1.7及以下/11及以上 +- [Node.js] V16及以上 ## SQL初始化 -- Gitee From 60f722c3c6c02fd0f27b55d5197503a8f18b3ca5 Mon Sep 17 00:00:00 2001 From: qianming Date: Fri, 21 Oct 2022 15:36:35 +0800 Subject: [PATCH 33/61] =?UTF-8?q?=E7=A6=81=E6=AD=A2widget=E7=A7=BB?= =?UTF-8?q?=E5=87=BA=E7=94=BB=E5=B8=83=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/widget/widget.vue | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/report-ui/src/views/bigscreenDesigner/designer/widget/widget.vue b/report-ui/src/views/bigscreenDesigner/designer/widget/widget.vue index f86d7b5..b7049bd 100644 --- a/report-ui/src/views/bigscreenDesigner/designer/widget/widget.vue +++ b/report-ui/src/views/bigscreenDesigner/designer/widget/widget.vue @@ -106,7 +106,9 @@ export default { data: { setup: {}, data: {}, - position: {} + position: {}, + leftMargin: null, + topMargin: null } }; }, @@ -118,10 +120,10 @@ export default { return this.value.position.height; }, widgetsLeft() { - return this.value.position.left; + return this.value.position.left >= this.leftMargin ? this.leftMargin : this.value.position.left; }, widgetsTop() { - return this.value.position.top; + return this.value.position.top >= this.topMargin ? this.topMargin : this.value.position.top; }, widgetsZIndex() { return this.value.position.zIndex || 1; @@ -133,6 +135,28 @@ export default { handleBlur({ index, left, top, width, height }) { this.$emit("onActivated", { index, left, top, width, height }); this.$refs.draggable.setActive(true); + // 处理widget超出workbench的问题 + this.handleBoundary({ index, left, top, width, height }) + }, + handleBoundary({ index, left, top, width, height }) { + // 计算workbench的X轴边界值 + // 组件距离左侧宽度 + 组件宽度 > 大屏总宽度时,右侧边界值 = (大屏宽度 - 组件宽度);左侧边界值 = 0 + const { bigscreenWidth, bigscreenHeight } = this.bigscreen; + const xBoundaryValue = (left + width) > bigscreenWidth ? bigscreenWidth - width : left < 0 ? 0 : left; + // 初始化X轴边界值 + this.leftMargin = left; + // 计算Y轴边界值 + const yBoundaryValue = (top + height) > bigscreenHeight ? bigscreenHeight - height : top < 0 ? 0 : top; + // 初始化Y轴边界值 + this.topMargin = top; + // 若位置超出边界值则重新设置位置 + if (this.leftMargin != xBoundaryValue || this.topMargin != yBoundaryValue) { + this.$nextTick(() => { + this.leftMargin = xBoundaryValue; + this.topMargin = yBoundaryValue; + this.$emit("onActivated", { index, left: xBoundaryValue, top: yBoundaryValue, width, height }); + }) + } } } }; -- Gitee From 9a9955787672e7cdb01b33091a35f971280cf695 Mon Sep 17 00:00:00 2001 From: qianming Date: Fri, 28 Oct 2022 16:43:41 +0800 Subject: [PATCH 34/61] =?UTF-8?q?iconfont=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report-ui/src/assets/iconfont/demo_index.html | 33 +++++++++++++++--- report-ui/src/assets/iconfont/iconfont.css | 10 ++++-- report-ui/src/assets/iconfont/iconfont.js | 2 +- report-ui/src/assets/iconfont/iconfont.json | 7 ++++ report-ui/src/assets/iconfont/iconfont.ttf | Bin 40724 -> 40932 bytes report-ui/src/assets/iconfont/iconfont.woff | Bin 26748 -> 26912 bytes report-ui/src/assets/iconfont/iconfont.woff2 | Bin 22876 -> 23020 bytes 7 files changed, 43 insertions(+), 9 deletions(-) diff --git a/report-ui/src/assets/iconfont/demo_index.html b/report-ui/src/assets/iconfont/demo_index.html index be9a80f..c00f8e8 100644 --- a/report-ui/src/assets/iconfont/demo_index.html +++ b/report-ui/src/assets/iconfont/demo_index.html @@ -3,8 +3,8 @@ iconfont Demo - - + + @@ -54,6 +54,12 @@