Commit d872676748cd1f45198e82ed108779d72b5af130

Authored by YunaiV
1 parent 40520b6c

完善积木报表的集成

Showing 16 changed files with 177 additions and 56 deletions
sql/mall.sql renamed to sql/optional/mall/mall.sql
sql/jimureport.mysql5.7.create.sql renamed to sql/optional/visualization/jimureport.mysql5.7.create.sql
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java
@@ -115,7 +115,7 @@ public class WebFrameworkUtils { @@ -115,7 +115,7 @@ public class WebFrameworkUtils {
115 return (CommonResult<?>) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT); 115 return (CommonResult<?>) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT);
116 } 116 }
117 117
118 - private static HttpServletRequest getRequest() { 118 + public static HttpServletRequest getRequest() {
119 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); 119 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
120 if (!(requestAttributes instanceof ServletRequestAttributes)) { 120 if (!(requestAttributes instanceof ServletRequestAttributes)) {
121 return null; 121 return null;
yudao-module-visualization/yudao-module-visualization-biz/pom.xml
@@ -14,7 +14,8 @@ @@ -14,7 +14,8 @@
14 14
15 <name>${project.artifactId}</name> 15 <name>${project.artifactId}</name>
16 <description> 16 <description>
17 - visualization 模块,主要实现数据可视化报表等功能。 17 + visualization 模块,主要实现数据可视化报表等功能:
  18 + 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。
18 </description> 19 </description>
19 <dependencies> 20 <dependencies>
20 <dependency> 21 <dependency>
@@ -62,7 +63,13 @@ @@ -62,7 +63,13 @@
62 <dependency> 63 <dependency>
63 <groupId>org.jeecgframework.jimureport</groupId> 64 <groupId>org.jeecgframework.jimureport</groupId>
64 <artifactId>jimureport-spring-boot-starter</artifactId> 65 <artifactId>jimureport-spring-boot-starter</artifactId>
  66 + <exclusions>
  67 + <exclusion>
  68 + <artifactId>mongodb-driver-sync</artifactId> <!-- 暂时不使用 MongoDB -->
  69 + <groupId>org.mongodb</groupId>
  70 + </exclusion>
  71 + </exclusions>
65 </dependency> 72 </dependency>
66 73
67 </dependencies> 74 </dependencies>
68 -</project>  
69 \ No newline at end of file 75 \ No newline at end of file
  76 +</project>
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/config/JimuReportTokenService.java deleted
1 -package cn.iocoder.yudao.module.visualization.config;  
2 -  
3 -import cn.hutool.core.util.StrUtil;  
4 -import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;  
5 -import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;  
6 -import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;  
7 -import cn.iocoder.yudao.module.system.service.user.AdminUserService;  
8 -import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;  
9 -import org.springframework.beans.factory.annotation.Autowired;  
10 -import org.springframework.stereotype.Component;  
11 -  
12 -@Component  
13 -public class JimuReportTokenService implements JmReportTokenServiceI {  
14 - @Autowired  
15 - private OAuth2TokenApi oauth2TokenApi;  
16 -  
17 - @Autowired  
18 - private AdminUserService adminUserService;  
19 -  
20 - @Override  
21 - public String getUsername(String token) {  
22 - if (StrUtil.isNotEmpty(token)) {  
23 - OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);  
24 - if (accessToken != null) {  
25 - Long userId = accessToken.getUserId();  
26 - System.out.println(userId);  
27 - AdminUserDO user = adminUserService.getUser(userId);  
28 - if (user != null) {  
29 - return user.getUsername();  
30 - }  
31 - }  
32 - }  
33 - return null;  
34 - }  
35 -  
36 - @Override  
37 - public Boolean verifyToken(String token) {  
38 - if (StrUtil.isNotEmpty(token)) {  
39 - OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);  
40 - return accessToken != null;  
41 - }  
42 - return false;  
43 - }  
44 -}  
45 \ No newline at end of file 0 \ No newline at end of file
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/config/JmReportConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.module.visualization.framework.jmreport.config;
  2 +
  3 +import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
  4 +import cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl;
  5 +import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
  6 +import org.springframework.context.annotation.Bean;
  7 +import org.springframework.context.annotation.Configuration;
  8 +
  9 +/**
  10 + * 积木报表的配置类
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Configuration
  15 +public class JmReportConfiguration {
  16 +
  17 + @Bean
  18 + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
  19 + public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi) {
  20 + return new JmReportTokenServiceImpl(oAuth2TokenApi);
  21 + }
  22 +
  23 +}
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service;
  2 +
  3 +import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.yudao.framework.common.exception.ServiceException;
  5 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  6 +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
  7 +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
  8 +import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
  9 +import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
  10 +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
  11 +import lombok.RequiredArgsConstructor;
  12 +import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
  13 +
  14 +/**
  15 + * {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能
  16 + *
  17 + * @author 随心
  18 + */
  19 +@RequiredArgsConstructor
  20 +public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
  21 +
  22 + private final OAuth2TokenApi oauth2TokenApi;
  23 +
  24 + /**
  25 + * 校验 Token 是否有效,即验证通过
  26 + *
  27 + * @param token JmReport 前端传递的 token
  28 + * @return 是否认证通过
  29 + */
  30 + @Override
  31 + public Boolean verifyToken(String token) {
  32 + if (StrUtil.isEmpty(token)) {
  33 + return false;
  34 + }
  35 + // TODO 如下的实现不算特别优雅,主要咱是不想搞的太复杂,所以参考对应的 Filter 先实现了
  36 +
  37 + // ① 参考 TokenAuthenticationFilter 的认证逻辑(Security 的上下文清理,交给 Spring Security 完成)
  38 + // 目的:实现基于 JmReport 前端传递的 token,实现认证
  39 + TenantContextHolder.setIgnore(true); // 忽略租户,保证可查询到 token 信息
  40 + LoginUser user = null;
  41 + try {
  42 + OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
  43 + if (accessToken == null) {
  44 + return false;
  45 + }
  46 + user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
  47 + .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes());
  48 + } catch (ServiceException ignored) {
  49 + // do nothing:如果报错,说明认证失败,则返回 false 即可
  50 + }
  51 + if (user == null) {
  52 + return false;
  53 + }
  54 + SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest());
  55 +
  56 + // ② 参考 TenantContextWebFilter 实现(Tenant 的上下文清理,交给 TenantContextWebFilter 完成)
  57 + // 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错
  58 + TenantContextHolder.setIgnore(false);
  59 + TenantContextHolder.setTenantId(user.getTenantId());
  60 + return true;
  61 + }
  62 +
  63 + /**
  64 + * 获得用户编号
  65 + *
  66 + * 虽然方法名获得的是 username,实际对应到项目中是用户编号
  67 + *
  68 + * @param token JmReport 前端传递的 token
  69 + * @return 用户编号
  70 + */
  71 + @Override
  72 + public String getUsername(String token) {
  73 + Long userId = SecurityFrameworkUtils.getLoginUserId();
  74 + return userId != null ? String.valueOf(userId) : null;
  75 + }
  76 +
  77 +}
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/web/package-info.java 0 → 100644
  1 +/**
  2 + * 占位,后续会基于 Filter 实现积木报表的认证等功能,替代 {@link cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl}
  3 + */
  4 +package cn.iocoder.yudao.module.visualization.framework.jmreport.core.web;
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/package-info.java 0 → 100644
  1 +/**
  2 + * 属于 visualization 模块的 framework 封装
  3 + *
  4 + * @author 芋道源码
  5 + */
  6 +package cn.iocoder.yudao.module.visualization.framework;
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/security/config/SecurityConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.module.visualization.framework.security.config;
  2 +
  3 +import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
  4 +import org.springframework.context.annotation.Bean;
  5 +import org.springframework.context.annotation.Configuration;
  6 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  7 +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
  8 +
  9 +/**
  10 + * Visualization 模块的 Security 配置
  11 + */
  12 +@Configuration("visualizationSecurityConfiguration")
  13 +public class SecurityConfiguration {
  14 +
  15 + @Bean("visualizationAuthorizeRequestsCustomizer")
  16 + public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
  17 + return new AuthorizeRequestsCustomizer() {
  18 +
  19 + @Override
  20 + public void customize(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry) {
  21 + //积木报表
  22 + registry.antMatchers("/jmreport/**").permitAll();
  23 + }
  24 +
  25 + };
  26 + }
  27 +
  28 +}
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/security/core/package-info.java 0 → 100644
  1 +/**
  2 + * 占位
  3 + */
  4 +package cn.iocoder.yudao.module.visualization.framework.security.core;
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/ureport/package-info.java 0 → 100644
  1 +/**
  2 + * ureport2:https://github.com/youseries/ureport
  3 + *
  4 + * ureport2 和 jimurepot 是相同类型的产品,不过停更了,最好发布时间是 2018 年。
  5 + * 它们之间的功能对比,可见 https://juejin.cn/post/6939836480269320200 地址
  6 + */
  7 +package cn.iocoder.yudao.module.visualization.framework.ureport;
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/package-info.java 0 → 100644
  1 +/**
  2 + * visualization 模块,主要实现数据可视化报表等功能:
  3 + * 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。URL 前缀是 /jmreport,表名前缀是 jimu_
  4 + *
  5 + * 由于「积木报表」的大屏设计器需要收费,后续会自研,对应的是:
  6 + * 1. Controller URL:以 /visualization/ 开头,避免和其它 Module 冲突
  7 + * 2. DataObject 表名:以 visualization_ 开头,方便在数据库中区分
  8 + */
  9 +package cn.iocoder.yudao.module.visualization;
yudao-server/pom.xml
@@ -58,11 +58,11 @@ @@ -58,11 +58,11 @@
58 <version>${revision}</version> 58 <version>${revision}</version>
59 </dependency> 59 </dependency>
60 <!-- 默认引入 yudao-module-bpm-biz-flowable 实现,可以替换为 yudao-module-bpm-biz-activiti 实现--> 60 <!-- 默认引入 yudao-module-bpm-biz-flowable 实现,可以替换为 yudao-module-bpm-biz-activiti 实现-->
61 - <dependency>  
62 - <groupId>cn.iocoder.boot</groupId>  
63 - <artifactId>yudao-module-bpm-biz</artifactId>  
64 - <version>${revision}</version>  
65 - </dependency> 61 +<!-- <dependency>-->
  62 +<!-- <groupId>cn.iocoder.boot</groupId>-->
  63 +<!-- <artifactId>yudao-module-bpm-biz</artifactId>-->
  64 +<!-- <version>${revision}</version>-->
  65 +<!-- </dependency>-->
66 <!-- <dependency>--> 66 <!-- <dependency>-->
67 <!-- <groupId>cn.iocoder.boot</groupId>--> 67 <!-- <groupId>cn.iocoder.boot</groupId>-->
68 <!-- <artifactId>yudao-module-bpm-biz-activiti</artifactId>--> 68 <!-- <artifactId>yudao-module-bpm-biz-activiti</artifactId>-->
yudao-server/src/main/java/cn/iocoder/yudao/server/YudaoServerApplication.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.server; @@ -2,7 +2,6 @@ package cn.iocoder.yudao.server;
2 2
3 import org.springframework.boot.SpringApplication; 3 import org.springframework.boot.SpringApplication;
4 import org.springframework.boot.autoconfigure.SpringBootApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
5 -import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;  
6 5
7 /** 6 /**
8 * 项目的启动类 7 * 项目的启动类
@@ -14,7 +13,7 @@ import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; @@ -14,7 +13,7 @@ import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
14 * @author 芋道源码 13 * @author 芋道源码
15 */ 14 */
16 @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} 15 @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package}
17 -@SpringBootApplication(exclude = MongoAutoConfiguration.class, scanBasePackages = {"${yudao.info.base-package}.server", "${yudao.info.base-package}.module", "org.jeecg.modules.jmreport"}) 16 +@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}.server", "${yudao.info.base-package}.module", "org.jeecg.modules.jmreport"})
18 public class YudaoServerApplication { 17 public class YudaoServerApplication {
19 18
20 public static void main(String[] args) { 19 public static void main(String[] args) {
yudao-server/src/main/resources/application.yaml
@@ -96,7 +96,8 @@ yudao: @@ -96,7 +96,8 @@ yudao:
96 - /admin-api/infra/file/*/get/** # 获取图片,和租户无关 96 - /admin-api/infra/file/*/get/** # 获取图片,和租户无关
97 - /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号 97 - /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号
98 - /app-api/pay/order/notify/* # 支付回调通知,不携带租户编号 98 - /app-api/pay/order/notify/* # 支付回调通知,不携带租户编号
99 - - /jmreport/list 99 +# - /jmreport/list
  100 + - /jmreport/*
100 ignore-tables: 101 ignore-tables:
101 - system_tenant 102 - system_tenant
102 - system_tenant_package 103 - system_tenant_package
@@ -148,4 +149,4 @@ debug: false @@ -148,4 +149,4 @@ debug: false
148 #积木报表配置 149 #积木报表配置
149 minidao : 150 minidao :
150 base-package: org.jeecg.modules.jmreport.desreport.dao* 151 base-package: org.jeecg.modules.jmreport.desreport.dao*
151 - db-type: mysql  
152 \ No newline at end of file 152 \ No newline at end of file
  153 + db-type: mysql