mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-22 23:31:52 +08:00
完善积木报表的集成
This commit is contained in:
parent
40520b6c88
commit
d872676748
@ -115,7 +115,7 @@ public class WebFrameworkUtils {
|
|||||||
return (CommonResult<?>) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT);
|
return (CommonResult<?>) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HttpServletRequest getRequest() {
|
public static HttpServletRequest getRequest() {
|
||||||
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
|
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
|
||||||
if (!(requestAttributes instanceof ServletRequestAttributes)) {
|
if (!(requestAttributes instanceof ServletRequestAttributes)) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -14,7 +14,8 @@
|
|||||||
|
|
||||||
<name>${project.artifactId}</name>
|
<name>${project.artifactId}</name>
|
||||||
<description>
|
<description>
|
||||||
visualization 模块,主要实现数据可视化报表等功能。
|
visualization 模块,主要实现数据可视化报表等功能:
|
||||||
|
1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。
|
||||||
</description>
|
</description>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -62,6 +63,12 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
<artifactId>jimureport-spring-boot-starter</artifactId>
|
<artifactId>jimureport-spring-boot-starter</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>mongodb-driver-sync</artifactId> <!-- 暂时不使用 MongoDB -->
|
||||||
|
<groupId>org.mongodb</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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;
|
@ -0,0 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* 属于 visualization 模块的 framework 封装
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
package cn.iocoder.yudao.module.visualization.framework;
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* 占位
|
||||||
|
*/
|
||||||
|
package cn.iocoder.yudao.module.visualization.framework.security.core;
|
@ -0,0 +1,7 @@
|
|||||||
|
/**
|
||||||
|
* ureport2:https://github.com/youseries/ureport
|
||||||
|
*
|
||||||
|
* ureport2 和 jimurepot 是相同类型的产品,不过停更了,最好发布时间是 2018 年。
|
||||||
|
* 它们之间的功能对比,可见 https://juejin.cn/post/6939836480269320200 地址
|
||||||
|
*/
|
||||||
|
package cn.iocoder.yudao.module.visualization.framework.ureport;
|
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* visualization 模块,主要实现数据可视化报表等功能:
|
||||||
|
* 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。URL 前缀是 /jmreport,表名前缀是 jimu_
|
||||||
|
*
|
||||||
|
* 由于「积木报表」的大屏设计器需要收费,后续会自研,对应的是:
|
||||||
|
* 1. Controller URL:以 /visualization/ 开头,避免和其它 Module 冲突
|
||||||
|
* 2. DataObject 表名:以 visualization_ 开头,方便在数据库中区分
|
||||||
|
*/
|
||||||
|
package cn.iocoder.yudao.module.visualization;
|
@ -58,11 +58,11 @@
|
|||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 默认引入 yudao-module-bpm-biz-flowable 实现,可以替换为 yudao-module-bpm-biz-activiti 实现-->
|
<!-- 默认引入 yudao-module-bpm-biz-flowable 实现,可以替换为 yudao-module-bpm-biz-activiti 实现-->
|
||||||
<dependency>
|
<!-- <dependency>-->
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
<!-- <groupId>cn.iocoder.boot</groupId>-->
|
||||||
<artifactId>yudao-module-bpm-biz</artifactId>
|
<!-- <artifactId>yudao-module-bpm-biz</artifactId>-->
|
||||||
<version>${revision}</version>
|
<!-- <version>${revision}</version>-->
|
||||||
</dependency>
|
<!-- </dependency>-->
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>cn.iocoder.boot</groupId>-->
|
<!-- <groupId>cn.iocoder.boot</groupId>-->
|
||||||
<!-- <artifactId>yudao-module-bpm-biz-activiti</artifactId>-->
|
<!-- <artifactId>yudao-module-bpm-biz-activiti</artifactId>-->
|
||||||
|
@ -2,7 +2,6 @@ package cn.iocoder.yudao.server;
|
|||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
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 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package}
|
@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 class YudaoServerApplication {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
@ -96,7 +96,8 @@ yudao:
|
|||||||
- /admin-api/infra/file/*/get/** # 获取图片,和租户无关
|
- /admin-api/infra/file/*/get/** # 获取图片,和租户无关
|
||||||
- /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号
|
- /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号
|
||||||
- /app-api/pay/order/notify/* # 支付回调通知,不携带租户编号
|
- /app-api/pay/order/notify/* # 支付回调通知,不携带租户编号
|
||||||
- /jmreport/list
|
# - /jmreport/list
|
||||||
|
- /jmreport/*
|
||||||
ignore-tables:
|
ignore-tables:
|
||||||
- system_tenant
|
- system_tenant
|
||||||
- system_tenant_package
|
- system_tenant_package
|
||||||
|
Loading…
Reference in New Issue
Block a user