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 115 return (CommonResult<?>) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT);
116 116 }
117 117  
118   - private static HttpServletRequest getRequest() {
  118 + public static HttpServletRequest getRequest() {
119 119 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
120 120 if (!(requestAttributes instanceof ServletRequestAttributes)) {
121 121 return null;
... ...
yudao-module-visualization/yudao-module-visualization-biz/pom.xml
... ... @@ -14,7 +14,8 @@
14 14  
15 15 <name>${project.artifactId}</name>
16 16 <description>
17   - visualization 模块,主要实现数据可视化报表等功能。
  17 + visualization 模块,主要实现数据可视化报表等功能:
  18 + 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。
18 19 </description>
19 20 <dependencies>
20 21 <dependency>
... ... @@ -62,7 +63,13 @@
62 63 <dependency>
63 64 <groupId>org.jeecgframework.jimureport</groupId>
64 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 72 </dependency>
66 73  
67 74 </dependencies>
68   -</project>
69 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 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 58 <version>${revision}</version>
59 59 </dependency>
60 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 66 <!-- <dependency>-->
67 67 <!-- <groupId>cn.iocoder.boot</groupId>-->
68 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 2  
3 3 import org.springframework.boot.SpringApplication;
4 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 13 * @author 芋道源码
15 14 */
16 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 17 public class YudaoServerApplication {
19 18  
20 19 public static void main(String[] args) {
... ...
yudao-server/src/main/resources/application.yaml
... ... @@ -96,7 +96,8 @@ yudao:
96 96 - /admin-api/infra/file/*/get/** # 获取图片,和租户无关
97 97 - /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号
98 98 - /app-api/pay/order/notify/* # 支付回调通知,不携带租户编号
99   - - /jmreport/list
  99 +# - /jmreport/list
  100 + - /jmreport/*
100 101 ignore-tables:
101 102 - system_tenant
102 103 - system_tenant_package
... ... @@ -148,4 +149,4 @@ debug: false
148 149 #积木报表配置
149 150 minidao :
150 151 base-package: org.jeecg.modules.jmreport.desreport.dao*
151   - db-type: mysql
152 152 \ No newline at end of file
  153 + db-type: mysql
... ...