背景

我又来水一篇博客啦!

最近公司项目中需要集成积木报表工具,但是同事在集成积木报表工具的时候死活不成功
会出现积木报表的静态文件访问不到的情况,例如下图中的情况

让我看看啥情况,我也就来学习一下积木报表吧,顺便看看这啥原因,看起来好像是静态资源文件路径映射的问题

集成积木框架

  • 导入依赖

    <!--积木报表JimuReport-->
    <dependency>
      <groupId>org.jeecgframework.jimureport</groupId>
      <artifactId>jimureport-spring-boot-starter</artifactId>
      <version>1.5.8</version>
    </dependency>
  • 创建数据库表
    积木报表中是mysql的sql文件,如果你是其他数据库,可以先创建成mysql表,
    再使用navicat将mysql数据库表转成oracle的数据库表或是其他数据库表
    下载积木报表sql文件

    如何将mysql数据库表转成oracle等其他数据库表呢?
    点击navicat上方的,工具–>数据传输,选择要导入的数据库和目标数据库,下一步选择要导入的数据库表
    在下面的选项中可以选择转换对象名改成大写,这样导入后数据库表名就是大写了,详细内容可以自行百度看看

  • 修改自己系统的权限拦截路径
    放开系统对积木报表请求路径的权限控制,如果你使用的权限框架是shiro
    可以在项目中全局搜索下filterChainDefinitionMap.put,应该能找到相应的shiro权限路径配置
    然后增加下面的配置

    //积木报表排除
    filterChainDefinitionMap.put("/jmreport/**", "anon");
    filterChainDefinitionMap.put("/**/*.js.map", "anon");
    filterChainDefinitionMap.put("/**/*.css.map", "anon");
  • 创建自定义积木报表鉴权,这一步不是必须的

    
    //
    ///**
    // * 自定义积木报表鉴权(如果不进行自定义,则所有请求不做权限控制)
    // *  * 1.自定义获取登录token
    // *  * 2.自定义获取登录用户
    // */
    @Component
    public class JimuReportTokenService implements JmReportTokenServiceI {
        @Autowired
        private ISysBaseAPI sysBaseAPI;
        @Autowired
        @Lazy
        private RedisUtil redisUtil;
    
        @Override
        public String getToken(HttpServletRequest request) {
            return TokenUtils.getTokenByRequest(request);
        }
    
        @Override
        public String getUsername(String token) {
            return JwtUtil.getUsername(token);
        }
    
        @Override
        public Boolean verifyToken(String token) {
            return TokenUtils.verifyToken(token, sysBaseAPI, redisUtil);
        }
    
        @Override
        public Map<String, Object> getUserInfo(String token) {
            String username = JwtUtil.getUsername(token);
            //此处通过token只能拿到一个信息 用户账号  后面的就是根据账号获取其他信息 查询数据或是走redis 用户根据自身业务可自定义
            SysUserCacheInfo userInfo = sysBaseAPI.getCacheUser(username);
            Map<String, Object> map = new HashMap<String, Object>();
            //设置账号名
            map.put(SYS_USER_CODE, userInfo.getSysUserCode());
            //设置部门编码
            map.put(SYS_ORG_CODE, userInfo.getSysOrgCode());
            // 将所有信息存放至map 解析sql/api会根据map的键值解析
            return map;
        }
    }
  • 最后部署后端系统,然后访问http://localhost:端口号/项目根路径/jmreport/list
    看看页面是否正常显示,一些样式文件的请求后端是否正常返回了,
    如果出现问题,则可以看看积木报表的官方文档:积木报表官方文档

积木报表静态资源访问不到的问题

官方文档中的静态资源访问不了和我这种情况有些区别,官方文档是请求路径的问题,我这里是代码写的有问题
之前写过一个拦截器,然后需要将该拦截器配置到spring容器中,我是这么写的

@Configuration
public class MyAppConfigurer extends WebMvcConfigurationSupport {
    @Autowired
    private UserInfoInterceptor userInfoInterceptor;

    /**
     * 拦截器,将用户信息放入threadLocal
     * @param registry
     */
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(this.userInfoInterceptor).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}

但是这么做其实有很大的问题,springmvc在系统启动时会根据自动装配类去初始化一些对象放入容器中
来看看WebMvcAutoConfiguration类中怎么写的

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, 
TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {}

我们可以看到@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
意思是当系统中没有该类的时候WebMvcAutoConfiguration才会生效,而我创建了它的子类,就会导致
WebMvcAutoConfiguration并不生效,所以导致系统的静态资源处理等其他默认配置失效,你需要修改为下面的形式

@Configuration
public class MyAppConfigurer implements WebMvcConfigurer {
    @Autowired
    private UserInfoInterceptor userInfoInterceptor;

    /*
     * 拦截器,将用户信息放入threadLocal
     * @param
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(this.userInfoInterceptor).addPathPatterns("/**");
    }
}

记住,如果你和我一样是个菜逼,一定要使用WebMvcConfigurer,而不是使用WebMvcConfigurationSupport

所以还是我到处给系统埋坑,,,,TAT

相关文章