Commit d872676748cd1f45198e82ed108779d72b5af130
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
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/package-info.java
0 → 100644
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
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/ureport/package-info.java
0 → 100644
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 | ... | ... |