完善积木报表的集成

This commit is contained in:
YunaiV 2022-07-28 09:29:51 +08:00
parent 40520b6c88
commit d872676748
16 changed files with 177 additions and 56 deletions

View File

@ -115,7 +115,7 @@ public class WebFrameworkUtils {
return (CommonResult<?>) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT);
}
private static HttpServletRequest getRequest() {
public static HttpServletRequest getRequest() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (!(requestAttributes instanceof ServletRequestAttributes)) {
return null;

View File

@ -14,7 +14,8 @@
<name>${project.artifactId}</name>
<description>
visualization 模块,主要实现数据可视化报表等功能。
visualization 模块,主要实现数据可视化报表等功能:
1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。
</description>
<dependencies>
<dependency>
@ -62,7 +63,13 @@
<dependency>
<groupId>org.jeecgframework.jimureport</groupId>
<artifactId>jimureport-spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>mongodb-driver-sync</artifactId> <!-- 暂时不使用 MongoDB -->
<groupId>org.mongodb</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
</project>

View File

@ -1,44 +0,0 @@
package cn.iocoder.yudao.module.visualization.config;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class JimuReportTokenService implements JmReportTokenServiceI {
@Autowired
private OAuth2TokenApi oauth2TokenApi;
@Autowired
private AdminUserService adminUserService;
@Override
public String getUsername(String token) {
if (StrUtil.isNotEmpty(token)) {
OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
if (accessToken != null) {
Long userId = accessToken.getUserId();
System.out.println(userId);
AdminUserDO user = adminUserService.getUser(userId);
if (user != null) {
return user.getUsername();
}
}
}
return null;
}
@Override
public Boolean verifyToken(String token) {
if (StrUtil.isNotEmpty(token)) {
OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
return accessToken != null;
}
return false;
}
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.visualization.framework.jmreport.config;
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
import cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl;
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 积木报表的配置类
*
* @author 芋道源码
*/
@Configuration
public class JmReportConfiguration {
@Bean
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi) {
return new JmReportTokenServiceImpl(oAuth2TokenApi);
}
}

View File

@ -0,0 +1,77 @@
package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
import lombok.RequiredArgsConstructor;
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
/**
* {@link JmReportTokenServiceI} 实现类提供积木报表的 Token 校验用户信息的查询等功能
*
* @author 随心
*/
@RequiredArgsConstructor
public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
private final OAuth2TokenApi oauth2TokenApi;
/**
* 校验 Token 是否有效即验证通过
*
* @param token JmReport 前端传递的 token
* @return 是否认证通过
*/
@Override
public Boolean verifyToken(String token) {
if (StrUtil.isEmpty(token)) {
return false;
}
// TODO 如下的实现不算特别优雅主要咱是不想搞的太复杂所以参考对应的 Filter 先实现了
// 参考 TokenAuthenticationFilter 的认证逻辑Security 的上下文清理交给 Spring Security 完成
// 目的实现基于 JmReport 前端传递的 token实现认证
TenantContextHolder.setIgnore(true); // 忽略租户保证可查询到 token 信息
LoginUser user = null;
try {
OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
if (accessToken == null) {
return false;
}
user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
.setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes());
} catch (ServiceException ignored) {
// do nothing如果报错说明认证失败则返回 false 即可
}
if (user == null) {
return false;
}
SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest());
// 参考 TenantContextWebFilter 实现Tenant 的上下文清理交给 TenantContextWebFilter 完成
// 目的基于 LoginUser 获得到的租户编号设置到 Tenant 上下文避免查询数据库时的报错
TenantContextHolder.setIgnore(false);
TenantContextHolder.setTenantId(user.getTenantId());
return true;
}
/**
* 获得用户编号
*
* 虽然方法名获得的是 username实际对应到项目中是用户编号
*
* @param token JmReport 前端传递的 token
* @return 用户编号
*/
@Override
public String getUsername(String token) {
Long userId = SecurityFrameworkUtils.getLoginUserId();
return userId != null ? String.valueOf(userId) : null;
}
}

View File

@ -0,0 +1,4 @@
/**
* 占位后续会基于 Filter 实现积木报表的认证等功能替代 {@link cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl}
*/
package cn.iocoder.yudao.module.visualization.framework.jmreport.core.web;

View File

@ -0,0 +1,6 @@
/**
* 属于 visualization 模块的 framework 封装
*
* @author 芋道源码
*/
package cn.iocoder.yudao.module.visualization.framework;

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.visualization.framework.security.config;
import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
/**
* Visualization 模块的 Security 配置
*/
@Configuration("visualizationSecurityConfiguration")
public class SecurityConfiguration {
@Bean("visualizationAuthorizeRequestsCustomizer")
public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
return new AuthorizeRequestsCustomizer() {
@Override
public void customize(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry) {
//积木报表
registry.antMatchers("/jmreport/**").permitAll();
}
};
}
}

View File

@ -0,0 +1,4 @@
/**
* 占位
*/
package cn.iocoder.yudao.module.visualization.framework.security.core;

View File

@ -0,0 +1,7 @@
/**
* ureport2https://github.com/youseries/ureport
*
* ureport2 jimurepot 是相同类型的产品不过停更了最好发布时间是 2018
* 它们之间的功能对比可见 https://juejin.cn/post/6939836480269320200 地址
*/
package cn.iocoder.yudao.module.visualization.framework.ureport;

View File

@ -0,0 +1,9 @@
/**
* visualization 模块主要实现数据可视化报表等功能
* 1. 基于积木报表实现打印设计报表设计图形设计大屏设计等URL 前缀是 /jmreport表名前缀是 jimu_
*
* 由于积木报表的大屏设计器需要收费后续会自研对应的是
* 1. Controller URL /visualization/ 开头避免和其它 Module 冲突
* 2. DataObject 表名 visualization_ 开头方便在数据库中区分
*/
package cn.iocoder.yudao.module.visualization;

View File

@ -58,11 +58,11 @@
<version>${revision}</version>
</dependency>
<!-- 默认引入 yudao-module-bpm-biz-flowable 实现,可以替换为 yudao-module-bpm-biz-activiti 实现-->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-module-bpm-biz</artifactId>
<version>${revision}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>cn.iocoder.boot</groupId>-->
<!-- <artifactId>yudao-module-bpm-biz</artifactId>-->
<!-- <version>${revision}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>cn.iocoder.boot</groupId>-->
<!-- <artifactId>yudao-module-bpm-biz-activiti</artifactId>-->

View File

@ -2,7 +2,6 @@ package cn.iocoder.yudao.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
/**
* 项目的启动类
@ -14,7 +13,7 @@ import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
* @author 芋道源码
*/
@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package}
@SpringBootApplication(exclude = MongoAutoConfiguration.class, scanBasePackages = {"${yudao.info.base-package}.server", "${yudao.info.base-package}.module", "org.jeecg.modules.jmreport"})
@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}.server", "${yudao.info.base-package}.module", "org.jeecg.modules.jmreport"})
public class YudaoServerApplication {
public static void main(String[] args) {

View File

@ -96,7 +96,8 @@ yudao:
- /admin-api/infra/file/*/get/** # 获取图片,和租户无关
- /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号
- /app-api/pay/order/notify/* # 支付回调通知,不携带租户编号
- /jmreport/list
# - /jmreport/list
- /jmreport/*
ignore-tables:
- system_tenant
- system_tenant_package
@ -148,4 +149,4 @@ debug: false
#积木报表配置
minidao :
base-package: org.jeecg.modules.jmreport.desreport.dao*
db-type: mysql
db-type: mysql