若依(ruoyi)前后端分离项目集成积木报表

瑞星  论坛元老 | 2025-3-27 17:27:51 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1683|帖子 1683|积分 5049

若依(ruoyi)前后端分离项目集成积木报表

致敬:

1:致敬若依开源项目(本文使用的是前后端分离版本:3.8.9)
  1. <template>
  2.   
  3.     <i-frame :src="reportUrl"></i-frame>
  4.   
  5. </template>若依官网:https://www.ruoyi.vip/
复制代码
2:致敬积木开源项目
  1. <template>
  2.   
  3.     <i-frame :src="reportUrl"></i-frame>
  4.   
  5. </template>积木报表官网:https://www.jimureport.com/
复制代码
3:致敬CSDN大神的文章(我是根据他的原文一步步设置的,前端设置有一些改动,如有版权问题,可随时接洽本人删除)
  1. <template>
  2.   
  3.     <i-frame :src="reportUrl"></i-frame>
  4.   
  5. </template>原文地址:https://blog.csdn.net/qq_55896432/article/details/145060090
复制代码
背景:

写在前面:

搭建这个项目是因为自己想记录日常使用的一些数据(练琴统计,钢琴课程数量,花费等等这些),然后找了一些BI发现都不是很得当,目前积木是最得当的(开源且集成程度高),所以记录了一下整体的操纵步骤。
目前整体使用感觉照旧可以的,数据源数据集设置都很方便,必要的控件也都够用。
项目运行的条件条件:

能正常运行若依前后端分离版本就OK.
结果(部分截图)

平凡报表管理菜单


平凡报表设计


数据源&数据集设置



大屏报表管理菜单


大屏设计


数据源&数据集设置




后端设置

ruoyi-common模块下pom.xml文件添加依赖
  1. <template>
  2.   
  3.     <i-frame :src="reportUrl"></i-frame>
  4.   
  5. </template>
  6. <template>
  7.   
  8.     <i-frame :src="reportUrl"></i-frame>
  9.   
  10. </template><dependency>
  11. <template>
  12.   
  13.     <i-frame :src="reportUrl"></i-frame>
  14.   
  15. </template>    <groupId>org.jeecgframework.jimureport</groupId>
  16. <template>
  17.   
  18.     <i-frame :src="reportUrl"></i-frame>
  19.   
  20. </template>    <artifactId>jimureport-spring-boot-starter</artifactId>
  21. <template>
  22.   
  23.     <i-frame :src="reportUrl"></i-frame>
  24.   
  25. </template>    <version>1.9.2</version>
  26. <template>
  27.   
  28.     <i-frame :src="reportUrl"></i-frame>
  29.   
  30. </template></dependency>
  31. <template>
  32.   
  33.     <i-frame :src="reportUrl"></i-frame>
  34.   
  35. </template>
  36. <template>
  37.   
  38.     <i-frame :src="reportUrl"></i-frame>
  39.   
  40. </template><dependency>
  41. <template>
  42.   
  43.     <i-frame :src="reportUrl"></i-frame>
  44.   
  45. </template>    <groupId>org.jeecgframework.jimureport</groupId>
  46. <template>
  47.   
  48.     <i-frame :src="reportUrl"></i-frame>
  49.   
  50. </template>    <artifactId>jimubi-spring-boot-starter</artifactId>
  51. <template>
  52.   
  53.     <i-frame :src="reportUrl"></i-frame>
  54.   
  55. </template>    <version>1.9.1</version>
  56. <template>
  57.   
  58.     <i-frame :src="reportUrl"></i-frame>
  59.   
  60. </template></dependency>
复制代码

添加完重新加载maven


ruoyi-admin模块修改application.yml文件,新增积木报表相关设置
  1. jeecg :
  2.   # 权限配置
  3.   permission:
  4.     # 报表权限配置
  5.     report:
  6.       # 查询权限符号,配置此权限代表只能查看报表
  7.       query: jeecg:report:query
  8.       # 修改权限符号,配置此权限代表拥有报表所有权限
  9.       edit: jeecg:report:edit
  10.     # 大屏权限配置
  11.     drag:
  12.       # 查询权限符号,配置此权限代表只能查看大屏
  13.       query: jeecg:drag:query
  14.       # 修改权限符号,配置此权限代表拥有大屏所有权限
  15.       edit: jeecg:drag:edit
  16.   jmreport:
  17.     #自定义项目前缀
  18.     # 现在是开发环境下的前端访问前缀,部署项目时,需要切换到生成环境访问前缀
  19.     customPrePath: /dev-api
复制代码
  1. 注意:
  2. 1.目前报表和大屏分别设置两个类型的权限,其中query权限表示只能查看,edit权限表示用于一切权限。
  3. 2.customPrePath是用来配置前端访问后端的接口的前缀,当前是开发环境配置为/dev-api没问题。
  4. 3.项目发布时,一定将这个配置改为生产环境下访问前缀,如:/prod-api。
复制代码
允许匿名访问ruoyi-framework模块下修改SecurityConfig.java文件

增加积木报表和大屏匿名访问权限。
  1. , "/jmreport/**", "/drag/**"
复制代码

新建积木报表相关设置类

在com.ruoyi.framework包下增加包report,在report包下新增config包,在cofig包下新增ReportConfig.java类,并在此类中添加以下代码。
  1. package com.ruoyi.framework.report.config;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class ReportConfig {
  6.     // 报表查询权限
  7.     @Value("${jeecg.permission.report.query}")
  8.     private String reportQueryPermission;
  9.     // 报表修改权限
  10.     @Value("${jeecg.permission.report.edit}")
  11.     private String reportEditPermission;
  12.     // 大屏查看权限
  13.     @Value("${jeecg.permission.drag.query}")
  14.     private String dragQueryPermission;
  15.     //大屏修改权限
  16.     @Value("${jeecg.permission.drag.edit}")
  17.     private String dragEditPermission;
  18.     public String getReportQueryPermission() {
  19. <template>
  20.   
  21.     <i-frame :src="reportUrl"></i-frame>
  22.   
  23. </template>return reportQueryPermission;
  24.     }
  25.     public void setReportQueryPermission(String reportQueryPermission) {
  26. <template>
  27.   
  28.     <i-frame :src="reportUrl"></i-frame>
  29.   
  30. </template>this.reportQueryPermission = reportQueryPermission;
  31.     }
  32.     public String getReportEditPermission() {
  33. <template>
  34.   
  35.     <i-frame :src="reportUrl"></i-frame>
  36.   
  37. </template>return reportEditPermission;
  38.     }
  39.     public void setReportEditPermission(String reportEditPermission) {
  40. <template>
  41.   
  42.     <i-frame :src="reportUrl"></i-frame>
  43.   
  44. </template>this.reportEditPermission = reportEditPermission;
  45.     }
  46.     public String getDragQueryPermission() {
  47. <template>
  48.   
  49.     <i-frame :src="reportUrl"></i-frame>
  50.   
  51. </template>return dragQueryPermission;
  52.     }
  53.     public void setDragQueryPermission(String dragQueryPermission) {
  54. <template>
  55.   
  56.     <i-frame :src="reportUrl"></i-frame>
  57.   
  58. </template>this.dragQueryPermission = dragQueryPermission;
  59.     }
  60.     public String getDragEditPermission() {
  61. <template>
  62.   
  63.     <i-frame :src="reportUrl"></i-frame>
  64.   
  65. </template>return dragEditPermission;
  66.     }
  67.     public void setDragEditPermission(String dragEditPermission) {
  68. <template>
  69.   
  70.     <i-frame :src="reportUrl"></i-frame>
  71.   
  72. </template>this.dragEditPermission = dragEditPermission;
  73.     }
  74. }
复制代码

重写若依框架getLoginUser()方法

打开web.service包下的TokenService.java文件,将自带的getLoginUser方法解释掉


新增代码
  1.     /***************************积木报表修改,注释掉了原来的getLoginUser*******************************/
  2.     // 修改
  3.     public LoginUser getLoginUser(HttpServletRequest request) {
  4. <template>
  5.   
  6.     <i-frame :src="reportUrl"></i-frame>
  7.   
  8. </template>// 获取请求携带的令牌
  9. <template>
  10.   
  11.     <i-frame :src="reportUrl"></i-frame>
  12.   
  13. </template>String token = getToken(request);
  14. <template>
  15.   
  16.     <i-frame :src="reportUrl"></i-frame>
  17.   
  18. </template>return getLoginUser(token);
  19.     }
  20.     public LoginUser getLoginUser(String token) {
  21. <template>
  22.   
  23.     <i-frame :src="reportUrl"></i-frame>
  24.   
  25. </template>if (StringUtils.isNotEmpty(token)) {
  26. <template>
  27.   
  28.     <i-frame :src="reportUrl"></i-frame>
  29.   
  30. </template>    try {
  31. <template>
  32.   
  33.     <i-frame :src="reportUrl"></i-frame>
  34.   
  35. </template><template>
  36.   
  37.     <i-frame :src="reportUrl"></i-frame>
  38.   
  39. </template>Claims claims = parseToken(token);
  40. <template>
  41.   
  42.     <i-frame :src="reportUrl"></i-frame>
  43.   
  44. </template><template>
  45.   
  46.     <i-frame :src="reportUrl"></i-frame>
  47.   
  48. </template>// 解析对应的权限以及用户信息
  49. <template>
  50.   
  51.     <i-frame :src="reportUrl"></i-frame>
  52.   
  53. </template><template>
  54.   
  55.     <i-frame :src="reportUrl"></i-frame>
  56.   
  57. </template>String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
  58. <template>
  59.   
  60.     <i-frame :src="reportUrl"></i-frame>
  61.   
  62. </template><template>
  63.   
  64.     <i-frame :src="reportUrl"></i-frame>
  65.   
  66. </template>String userKey = getTokenKey(uuid);
  67. <template>
  68.   
  69.     <i-frame :src="reportUrl"></i-frame>
  70.   
  71. </template><template>
  72.   
  73.     <i-frame :src="reportUrl"></i-frame>
  74.   
  75. </template>LoginUser user = redisCache.getCacheObject(userKey);
  76. <template>
  77.   
  78.     <i-frame :src="reportUrl"></i-frame>
  79.   
  80. </template><template>
  81.   
  82.     <i-frame :src="reportUrl"></i-frame>
  83.   
  84. </template>return user;
  85. <template>
  86.   
  87.     <i-frame :src="reportUrl"></i-frame>
  88.   
  89. </template>    } catch (Exception e) {
  90. <template>
  91.   
  92.     <i-frame :src="reportUrl"></i-frame>
  93.   
  94. </template><template>
  95.   
  96.     <i-frame :src="reportUrl"></i-frame>
  97.   
  98. </template>log.error("获取用户信息异常'{}'", e.getMessage());
  99. <template>
  100.   
  101.     <i-frame :src="reportUrl"></i-frame>
  102.   
  103. </template>    }
  104. <template>
  105.   
  106.     <i-frame :src="reportUrl"></i-frame>
  107.   
  108. </template>}
  109. <template>
  110.   
  111.     <i-frame :src="reportUrl"></i-frame>
  112.   
  113. </template>return null;
  114.     }
  115.     /***************************积木报表修改,注释掉了原来的getLoginUser*******************************/
复制代码
在report包下新增service包下,在service包下新增ReportTokenService.java类,并且在此类中添加以下代码
  1. package com.ruoyi.framework.report.service;
  2. import com.ruoyi.common.constant.Constants;
  3. import com.ruoyi.common.core.domain.entity.SysRole;
  4. import com.ruoyi.common.core.domain.entity.SysUser;
  5. import com.ruoyi.common.core.domain.model.LoginUser;
  6. import com.ruoyi.common.utils.StringUtils;
  7. import com.ruoyi.framework.report.config.ReportConfig;
  8. import com.ruoyi.framework.web.service.TokenService;
  9. import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.beans.factory.annotation.Value;
  12. import org.springframework.http.HttpHeaders;
  13. import org.springframework.stereotype.Component;
  14. import javax.servlet.http.HttpServletRequest;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.Set;
  19. @Component
  20. public class ReportTokenService implements JmReportTokenServiceI {
  21.     // 若依框架token
  22.     @Value("${token.header}")
  23.     private String ryHeader;
  24.     // 积木报表token
  25.     private String jmHeader = "X-Access-Token";
  26.     @Autowired
  27.     private ReportConfig reportConfig;
  28.     @Autowired
  29.     private TokenService tokenService;
  30.     @Override
  31.     public String getUsername(String s) {
  32. <template>
  33.   
  34.     <i-frame :src="reportUrl"></i-frame>
  35.   
  36. </template>LoginUser loginUser = tokenService.getLoginUser(s);
  37. <template>
  38.   
  39.     <i-frame :src="reportUrl"></i-frame>
  40.   
  41. </template>return loginUser.getUsername();
  42.     }
  43.     @Override
  44.     public String[] getRoles(String s) {
  45. <template>
  46.   
  47.     <i-frame :src="reportUrl"></i-frame>
  48.   
  49. </template>LoginUser loginUser = tokenService.getLoginUser(s);
  50. <template>
  51.   
  52.     <i-frame :src="reportUrl"></i-frame>
  53.   
  54. </template>SysUser user = loginUser.getUser();
  55. <template>
  56.   
  57.     <i-frame :src="reportUrl"></i-frame>
  58.   
  59. </template>List<SysRole> roles = user.getRoles();
  60. <template>
  61.   
  62.     <i-frame :src="reportUrl"></i-frame>
  63.   
  64. </template>String[] roleNameArray = roles.stream().map(SysRole::getRoleName).toArray(String[]::new);
  65. <template>
  66.   
  67.     <i-frame :src="reportUrl"></i-frame>
  68.   
  69. </template>return roleNameArray;
  70.     }
  71.     @Override
  72.     public Boolean verifyToken(String s) {
  73. <template>
  74.   
  75.     <i-frame :src="reportUrl"></i-frame>
  76.   
  77. </template>LoginUser loginUser = tokenService.getLoginUser(s);
  78. <template>
  79.   
  80.     <i-frame :src="reportUrl"></i-frame>
  81.   
  82. </template>if (StringUtils.isNotNull(loginUser)){
  83. <template>
  84.   
  85.     <i-frame :src="reportUrl"></i-frame>
  86.   
  87. </template>    tokenService.refreshToken(loginUser);
  88. <template>
  89.   
  90.     <i-frame :src="reportUrl"></i-frame>
  91.   
  92. </template>    SysUser user = loginUser.getUser();
  93. <template>
  94.   
  95.     <i-frame :src="reportUrl"></i-frame>
  96.   
  97. </template>    // 超级管理员放权
  98. <template>
  99.   
  100.     <i-frame :src="reportUrl"></i-frame>
  101.   
  102. </template>    if (StringUtils.isNotNull(user) && user.isAdmin()) {
  103. <template>
  104.   
  105.     <i-frame :src="reportUrl"></i-frame>
  106.   
  107. </template><template>
  108.   
  109.     <i-frame :src="reportUrl"></i-frame>
  110.   
  111. </template>return true;
  112. <template>
  113.   
  114.     <i-frame :src="reportUrl"></i-frame>
  115.   
  116. </template>    } else {
  117. <template>
  118.   
  119.     <i-frame :src="reportUrl"></i-frame>
  120.   
  121. </template><template>
  122.   
  123.     <i-frame :src="reportUrl"></i-frame>
  124.   
  125. </template>Set<String> permissions = loginUser.getPermissions();
  126. <template>
  127.   
  128.     <i-frame :src="reportUrl"></i-frame>
  129.   
  130. </template><template>
  131.   
  132.     <i-frame :src="reportUrl"></i-frame>
  133.   
  134. </template>if (StringUtils.isNotNull(permissions) && (permissions.contains(reportConfig.getReportQueryPermission()) || permissions.contains(reportConfig.getReportEditPermission()) || permissions.contains(reportConfig.getDragQueryPermission()) || permissions.contains(reportConfig.getDragEditPermission()))) {
  135. <template>
  136.   
  137.     <i-frame :src="reportUrl"></i-frame>
  138.   
  139. </template><template>
  140.   
  141.     <i-frame :src="reportUrl"></i-frame>
  142.   
  143. </template>    return true;
  144. <template>
  145.   
  146.     <i-frame :src="reportUrl"></i-frame>
  147.   
  148. </template><template>
  149.   
  150.     <i-frame :src="reportUrl"></i-frame>
  151.   
  152. </template>}
  153. <template>
  154.   
  155.     <i-frame :src="reportUrl"></i-frame>
  156.   
  157. </template>    }
  158. <template>
  159.   
  160.     <i-frame :src="reportUrl"></i-frame>
  161.   
  162. </template>}
  163. <template>
  164.   
  165.     <i-frame :src="reportUrl"></i-frame>
  166.   
  167. </template>return false;
  168.     }
  169.     @Override
  170.     public String getToken(HttpServletRequest request) {
  171. <template>
  172.   
  173.     <i-frame :src="reportUrl"></i-frame>
  174.   
  175. </template>String token = request.getParameter("token");
  176. <template>
  177.   
  178.     <i-frame :src="reportUrl"></i-frame>
  179.   
  180. </template>if (StringUtils.isNull(token)) {
  181. <template>
  182.   
  183.     <i-frame :src="reportUrl"></i-frame>
  184.   
  185. </template>    token = request.getHeader(jmHeader);
  186. <template>
  187.   
  188.     <i-frame :src="reportUrl"></i-frame>
  189.   
  190. </template>}
  191. <template>
  192.   
  193.     <i-frame :src="reportUrl"></i-frame>
  194.   
  195. </template>if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX))
  196. <template>
  197.   
  198.     <i-frame :src="reportUrl"></i-frame>
  199.   
  200. </template>{
  201. <template>
  202.   
  203.     <i-frame :src="reportUrl"></i-frame>
  204.   
  205. </template>    token = token.replace(Constants.TOKEN_PREFIX, "");
  206. <template>
  207.   
  208.     <i-frame :src="reportUrl"></i-frame>
  209.   
  210. </template>}
  211. <template>
  212.   
  213.     <i-frame :src="reportUrl"></i-frame>
  214.   
  215. </template>return token;
  216.     }
  217.     @Override
  218.     public Map<String, Object> getUserInfo(String token) {
  219. <template>
  220.   
  221.     <i-frame :src="reportUrl"></i-frame>
  222.   
  223. </template>token = token.replace(Constants.TOKEN_PREFIX, "");
  224. <template>
  225.   
  226.     <i-frame :src="reportUrl"></i-frame>
  227.   
  228. </template>LoginUser loginUser = tokenService.getLoginUser(token);
  229. <template>
  230.   
  231.     <i-frame :src="reportUrl"></i-frame>
  232.   
  233. </template>Map<String, Object> map = new HashMap<>();
  234. <template>
  235.   
  236.     <i-frame :src="reportUrl"></i-frame>
  237.   
  238. </template>map.put(SYS_USER_CODE, loginUser.getUserId());
  239. <template>
  240.   
  241.     <i-frame :src="reportUrl"></i-frame>
  242.   
  243. </template>map.put(SYS_ORG_CODE, loginUser.getDeptId());
  244. <template>
  245.   
  246.     <i-frame :src="reportUrl"></i-frame>
  247.   
  248. </template>return map;
  249.     }
  250.     @Override
  251.     public HttpHeaders customApiHeader() {
  252. <template>
  253.   
  254.     <i-frame :src="reportUrl"></i-frame>
  255.   
  256. </template>HttpHeaders headers = new HttpHeaders();
  257. <template>
  258.   
  259.     <i-frame :src="reportUrl"></i-frame>
  260.   
  261. </template>headers.add(ryHeader, Constants.TOKEN_PREFIX + getToken());
  262. <template>
  263.   
  264.     <i-frame :src="reportUrl"></i-frame>
  265.   
  266. </template>headers.add(jmHeader, getToken());
  267. <template>
  268.   
  269.     <i-frame :src="reportUrl"></i-frame>
  270.   
  271. </template>return headers;
  272.     }
  273. }
复制代码

贴一下原作者的注意事项:


设置拦截器

在report包下新增interceptor包,在interceptor包下新增ReportInterceptor.java类,并且在此类中添加以下代码
  1. package com.ruoyi.framework.report.interceptor;
  2. import com.alibaba.fastjson2.JSONObject;
  3. import com.ruoyi.common.core.domain.AjaxResult;
  4. import com.ruoyi.common.core.domain.entity.SysUser;
  5. import com.ruoyi.common.core.domain.model.LoginUser;
  6. import com.ruoyi.common.utils.ServletUtils;
  7. import com.ruoyi.common.utils.StringUtils;
  8. import com.ruoyi.framework.report.config.ReportConfig;
  9. import com.ruoyi.framework.report.service.ReportTokenService;
  10. import com.ruoyi.framework.web.service.TokenService;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.web.servlet.HandlerInterceptor;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16. import java.util.ArrayList;
  17. import java.util.HashSet;
  18. import java.util.Set;
  19. @Component
  20. public class ReportInterceptor implements HandlerInterceptor {
  21.     @Autowired
  22.     private TokenService tokenService;
  23.     @Autowired
  24.     private ReportConfig reportConfig;
  25.     @Autowired
  26.     private ReportTokenService reportTokenService;
  27.     @Override
  28.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  29. <template>
  30.   
  31.     <i-frame :src="reportUrl"></i-frame>
  32.   
  33. </template>String token = reportTokenService.getToken(request);
  34. <template>
  35.   
  36.     <i-frame :src="reportUrl"></i-frame>
  37.   
  38. </template>LoginUser loginUser = tokenService.getLoginUser(token);
  39. //<template>
  40.   
  41.     <i-frame :src="reportUrl"></i-frame>
  42.   
  43. </template>String uri = request.getRequestURI();
  44. //<template>
  45.   
  46.     <i-frame :src="reportUrl"></i-frame>
  47.   
  48. </template>System.out.println(uri);
  49. <template>
  50.   
  51.     <i-frame :src="reportUrl"></i-frame>
  52.   
  53. </template>if (StringUtils.isNotNull(loginUser)) {
  54. <template>
  55.   
  56.     <i-frame :src="reportUrl"></i-frame>
  57.   
  58. </template>    SysUser user = loginUser.getUser();
  59. <template>
  60.   
  61.     <i-frame :src="reportUrl"></i-frame>
  62.   
  63. </template>    // 超级管理员放权
  64. <template>
  65.   
  66.     <i-frame :src="reportUrl"></i-frame>
  67.   
  68. </template>    if (StringUtils.isNotNull(user) && user.isAdmin()) {
  69. <template>
  70.   
  71.     <i-frame :src="reportUrl"></i-frame>
  72.   
  73. </template><template>
  74.   
  75.     <i-frame :src="reportUrl"></i-frame>
  76.   
  77. </template>return true;
  78. <template>
  79.   
  80.     <i-frame :src="reportUrl"></i-frame>
  81.   
  82. </template>    } else {
  83. <template>
  84.   
  85.     <i-frame :src="reportUrl"></i-frame>
  86.   
  87. </template><template>
  88.   
  89.     <i-frame :src="reportUrl"></i-frame>
  90.   
  91. </template>//获取权限集合
  92. <template>
  93.   
  94.     <i-frame :src="reportUrl"></i-frame>
  95.   
  96. </template><template>
  97.   
  98.     <i-frame :src="reportUrl"></i-frame>
  99.   
  100. </template>Set<String> permissions = loginUser.getPermissions();
  101. <template>
  102.   
  103.     <i-frame :src="reportUrl"></i-frame>
  104.   
  105. </template><template>
  106.   
  107.     <i-frame :src="reportUrl"></i-frame>
  108.   
  109. </template>//如果拥有设计器的权限,则无需view权限,也可以通过校验
  110. <template>
  111.   
  112.     <i-frame :src="reportUrl"></i-frame>
  113.   
  114. </template><template>
  115.   
  116.     <i-frame :src="reportUrl"></i-frame>
  117.   
  118. </template>if (StringUtils.isNotNull(permissions)) {
  119. <template>
  120.   
  121.     <i-frame :src="reportUrl"></i-frame>
  122.   
  123. </template><template>
  124.   
  125.     <i-frame :src="reportUrl"></i-frame>
  126.   
  127. </template>    String uri = request.getRequestURI();
  128. <template>
  129.   
  130.     <i-frame :src="reportUrl"></i-frame>
  131.   
  132. </template><template>
  133.   
  134.     <i-frame :src="reportUrl"></i-frame>
  135.   
  136. </template>    // 如果访问报表
  137. <template>
  138.   
  139.     <i-frame :src="reportUrl"></i-frame>
  140.   
  141. </template><template>
  142.   
  143.     <i-frame :src="reportUrl"></i-frame>
  144.   
  145. </template>    if (uri.contains("/jmreport/")) {
  146. <template>
  147.   
  148.     <i-frame :src="reportUrl"></i-frame>
  149.   
  150. </template><template>
  151.   
  152.     <i-frame :src="reportUrl"></i-frame>
  153.   
  154. </template><template>
  155.   
  156.     <i-frame :src="reportUrl"></i-frame>
  157.   
  158. </template>// 如果有操作权限,直接放行
  159. <template>
  160.   
  161.     <i-frame :src="reportUrl"></i-frame>
  162.   
  163. </template><template>
  164.   
  165.     <i-frame :src="reportUrl"></i-frame>
  166.   
  167. </template><template>
  168.   
  169.     <i-frame :src="reportUrl"></i-frame>
  170.   
  171. </template>if (permissions.contains(reportConfig.getReportEditPermission())) {
  172. <template>
  173.   
  174.     <i-frame :src="reportUrl"></i-frame>
  175.   
  176. </template><template>
  177.   
  178.     <i-frame :src="reportUrl"></i-frame>
  179.   
  180. </template><template>
  181.   
  182.     <i-frame :src="reportUrl"></i-frame>
  183.   
  184. </template>    return true;
  185. <template>
  186.   
  187.     <i-frame :src="reportUrl"></i-frame>
  188.   
  189. </template><template>
  190.   
  191.     <i-frame :src="reportUrl"></i-frame>
  192.   
  193. </template><template>
  194.   
  195.     <i-frame :src="reportUrl"></i-frame>
  196.   
  197. </template>} else {
  198. <template>
  199.   
  200.     <i-frame :src="reportUrl"></i-frame>
  201.   
  202. </template><template>
  203.   
  204.     <i-frame :src="reportUrl"></i-frame>
  205.   
  206. </template><template>
  207.   
  208.     <i-frame :src="reportUrl"></i-frame>
  209.   
  210. </template>    // 设置查询报表的路径,没有带报表编码的路径
  211. <template>
  212.   
  213.     <i-frame :src="reportUrl"></i-frame>
  214.   
  215. </template><template>
  216.   
  217.     <i-frame :src="reportUrl"></i-frame>
  218.   
  219. </template><template>
  220.   
  221.     <i-frame :src="reportUrl"></i-frame>
  222.   
  223. </template>    Set<String> queryReportSet = new HashSet<>();
  224. <template>
  225.   
  226.     <i-frame :src="reportUrl"></i-frame>
  227.   
  228. </template><template>
  229.   
  230.     <i-frame :src="reportUrl"></i-frame>
  231.   
  232. </template><template>
  233.   
  234.     <i-frame :src="reportUrl"></i-frame>
  235.   
  236. </template>    queryReportSet.add("/jmreport/getQueryInfo");
  237. <template>
  238.   
  239.     <i-frame :src="reportUrl"></i-frame>
  240.   
  241. </template><template>
  242.   
  243.     <i-frame :src="reportUrl"></i-frame>
  244.   
  245. </template><template>
  246.   
  247.     <i-frame :src="reportUrl"></i-frame>
  248.   
  249. </template>    queryReportSet.add("/jmreport/show");
  250. <template>
  251.   
  252.     <i-frame :src="reportUrl"></i-frame>
  253.   
  254. </template><template>
  255.   
  256.     <i-frame :src="reportUrl"></i-frame>
  257.   
  258. </template><template>
  259.   
  260.     <i-frame :src="reportUrl"></i-frame>
  261.   
  262. </template>    // 设置查询报表的路径,带报表编码的路径
  263. <template>
  264.   
  265.     <i-frame :src="reportUrl"></i-frame>
  266.   
  267. </template><template>
  268.   
  269.     <i-frame :src="reportUrl"></i-frame>
  270.   
  271. </template><template>
  272.   
  273.     <i-frame :src="reportUrl"></i-frame>
  274.   
  275. </template>    ArrayList<String> queryReportList = new ArrayList<>();
  276. <template>
  277.   
  278.     <i-frame :src="reportUrl"></i-frame>
  279.   
  280. </template><template>
  281.   
  282.     <i-frame :src="reportUrl"></i-frame>
  283.   
  284. </template><template>
  285.   
  286.     <i-frame :src="reportUrl"></i-frame>
  287.   
  288. </template>    queryReportList.add("/jmreport/view/");
  289. <template>
  290.   
  291.     <i-frame :src="reportUrl"></i-frame>
  292.   
  293. </template><template>
  294.   
  295.     <i-frame :src="reportUrl"></i-frame>
  296.   
  297. </template><template>
  298.   
  299.     <i-frame :src="reportUrl"></i-frame>
  300.   
  301. </template>    queryReportList.add("/jmreport/addViewCount/");
  302. <template>
  303.   
  304.     <i-frame :src="reportUrl"></i-frame>
  305.   
  306. </template><template>
  307.   
  308.     <i-frame :src="reportUrl"></i-frame>
  309.   
  310. </template><template>
  311.   
  312.     <i-frame :src="reportUrl"></i-frame>
  313.   
  314. </template>    queryReportList.add("/jmreport/checkParam/");
  315. <template>
  316.   
  317.     <i-frame :src="reportUrl"></i-frame>
  318.   
  319. </template><template>
  320.   
  321.     <i-frame :src="reportUrl"></i-frame>
  322.   
  323. </template><template>
  324.   
  325.     <i-frame :src="reportUrl"></i-frame>
  326.   
  327. </template>    // 如果有查询权限
  328. <template>
  329.   
  330.     <i-frame :src="reportUrl"></i-frame>
  331.   
  332. </template><template>
  333.   
  334.     <i-frame :src="reportUrl"></i-frame>
  335.   
  336. </template><template>
  337.   
  338.     <i-frame :src="reportUrl"></i-frame>
  339.   
  340. </template>    if (permissions.contains(reportConfig.getReportQueryPermission())) {
  341. <template>
  342.   
  343.     <i-frame :src="reportUrl"></i-frame>
  344.   
  345. </template><template>
  346.   
  347.     <i-frame :src="reportUrl"></i-frame>
  348.   
  349. </template><template>
  350.   
  351.     <i-frame :src="reportUrl"></i-frame>
  352.   
  353. </template><template>
  354.   
  355.     <i-frame :src="reportUrl"></i-frame>
  356.   
  357. </template>// 如果是没有报表编码的路径,放行
  358. <template>
  359.   
  360.     <i-frame :src="reportUrl"></i-frame>
  361.   
  362. </template><template>
  363.   
  364.     <i-frame :src="reportUrl"></i-frame>
  365.   
  366. </template><template>
  367.   
  368.     <i-frame :src="reportUrl"></i-frame>
  369.   
  370. </template><template>
  371.   
  372.     <i-frame :src="reportUrl"></i-frame>
  373.   
  374. </template>if (queryReportSet.contains(uri)) {
  375. <template>
  376.   
  377.     <i-frame :src="reportUrl"></i-frame>
  378.   
  379. </template><template>
  380.   
  381.     <i-frame :src="reportUrl"></i-frame>
  382.   
  383. </template><template>
  384.   
  385.     <i-frame :src="reportUrl"></i-frame>
  386.   
  387. </template><template>
  388.   
  389.     <i-frame :src="reportUrl"></i-frame>
  390.   
  391. </template>    return true;
  392. <template>
  393.   
  394.     <i-frame :src="reportUrl"></i-frame>
  395.   
  396. </template><template>
  397.   
  398.     <i-frame :src="reportUrl"></i-frame>
  399.   
  400. </template><template>
  401.   
  402.     <i-frame :src="reportUrl"></i-frame>
  403.   
  404. </template><template>
  405.   
  406.     <i-frame :src="reportUrl"></i-frame>
  407.   
  408. </template>} else {
  409. <template>
  410.   
  411.     <i-frame :src="reportUrl"></i-frame>
  412.   
  413. </template><template>
  414.   
  415.     <i-frame :src="reportUrl"></i-frame>
  416.   
  417. </template><template>
  418.   
  419.     <i-frame :src="reportUrl"></i-frame>
  420.   
  421. </template><template>
  422.   
  423.     <i-frame :src="reportUrl"></i-frame>
  424.   
  425. </template>    // 如果是带报表编码的路径,放行
  426. <template>
  427.   
  428.     <i-frame :src="reportUrl"></i-frame>
  429.   
  430. </template><template>
  431.   
  432.     <i-frame :src="reportUrl"></i-frame>
  433.   
  434. </template><template>
  435.   
  436.     <i-frame :src="reportUrl"></i-frame>
  437.   
  438. </template><template>
  439.   
  440.     <i-frame :src="reportUrl"></i-frame>
  441.   
  442. </template>    for (int i = 0; i < queryReportList.size(); i++) {
  443. <template>
  444.   
  445.     <i-frame :src="reportUrl"></i-frame>
  446.   
  447. </template><template>
  448.   
  449.     <i-frame :src="reportUrl"></i-frame>
  450.   
  451. </template><template>
  452.   
  453.     <i-frame :src="reportUrl"></i-frame>
  454.   
  455. </template><template>
  456.   
  457.     <i-frame :src="reportUrl"></i-frame>
  458.   
  459. </template><template>
  460.   
  461.     <i-frame :src="reportUrl"></i-frame>
  462.   
  463. </template>String s = queryReportList.get(i);
  464. <template>
  465.   
  466.     <i-frame :src="reportUrl"></i-frame>
  467.   
  468. </template><template>
  469.   
  470.     <i-frame :src="reportUrl"></i-frame>
  471.   
  472. </template><template>
  473.   
  474.     <i-frame :src="reportUrl"></i-frame>
  475.   
  476. </template><template>
  477.   
  478.     <i-frame :src="reportUrl"></i-frame>
  479.   
  480. </template><template>
  481.   
  482.     <i-frame :src="reportUrl"></i-frame>
  483.   
  484. </template>if (uri.contains(s)) {
  485. <template>
  486.   
  487.     <i-frame :src="reportUrl"></i-frame>
  488.   
  489. </template><template>
  490.   
  491.     <i-frame :src="reportUrl"></i-frame>
  492.   
  493. </template><template>
  494.   
  495.     <i-frame :src="reportUrl"></i-frame>
  496.   
  497. </template><template>
  498.   
  499.     <i-frame :src="reportUrl"></i-frame>
  500.   
  501. </template><template>
  502.   
  503.     <i-frame :src="reportUrl"></i-frame>
  504.   
  505. </template>    return true;
  506. <template>
  507.   
  508.     <i-frame :src="reportUrl"></i-frame>
  509.   
  510. </template><template>
  511.   
  512.     <i-frame :src="reportUrl"></i-frame>
  513.   
  514. </template><template>
  515.   
  516.     <i-frame :src="reportUrl"></i-frame>
  517.   
  518. </template><template>
  519.   
  520.     <i-frame :src="reportUrl"></i-frame>
  521.   
  522. </template><template>
  523.   
  524.     <i-frame :src="reportUrl"></i-frame>
  525.   
  526. </template>}
  527. <template>
  528.   
  529.     <i-frame :src="reportUrl"></i-frame>
  530.   
  531. </template><template>
  532.   
  533.     <i-frame :src="reportUrl"></i-frame>
  534.   
  535. </template><template>
  536.   
  537.     <i-frame :src="reportUrl"></i-frame>
  538.   
  539. </template><template>
  540.   
  541.     <i-frame :src="reportUrl"></i-frame>
  542.   
  543. </template>    }
  544. <template>
  545.   
  546.     <i-frame :src="reportUrl"></i-frame>
  547.   
  548. </template><template>
  549.   
  550.     <i-frame :src="reportUrl"></i-frame>
  551.   
  552. </template><template>
  553.   
  554.     <i-frame :src="reportUrl"></i-frame>
  555.   
  556. </template><template>
  557.   
  558.     <i-frame :src="reportUrl"></i-frame>
  559.   
  560. </template>}
  561. <template>
  562.   
  563.     <i-frame :src="reportUrl"></i-frame>
  564.   
  565. </template><template>
  566.   
  567.     <i-frame :src="reportUrl"></i-frame>
  568.   
  569. </template><template>
  570.   
  571.     <i-frame :src="reportUrl"></i-frame>
  572.   
  573. </template>    }
  574. <template>
  575.   
  576.     <i-frame :src="reportUrl"></i-frame>
  577.   
  578. </template><template>
  579.   
  580.     <i-frame :src="reportUrl"></i-frame>
  581.   
  582. </template><template>
  583.   
  584.     <i-frame :src="reportUrl"></i-frame>
  585.   
  586. </template>}
  587. <template>
  588.   
  589.     <i-frame :src="reportUrl"></i-frame>
  590.   
  591. </template><template>
  592.   
  593.     <i-frame :src="reportUrl"></i-frame>
  594.   
  595. </template><template>
  596.   
  597.     <i-frame :src="reportUrl"></i-frame>
  598.   
  599. </template>//如果访问大屏
  600. <template>
  601.   
  602.     <i-frame :src="reportUrl"></i-frame>
  603.   
  604. </template><template>
  605.   
  606.     <i-frame :src="reportUrl"></i-frame>
  607.   
  608. </template>    } else if (uri.contains("/drag/")) {
  609. <template>
  610.   
  611.     <i-frame :src="reportUrl"></i-frame>
  612.   
  613. </template><template>
  614.   
  615.     <i-frame :src="reportUrl"></i-frame>
  616.   
  617. </template><template>
  618.   
  619.     <i-frame :src="reportUrl"></i-frame>
  620.   
  621. </template>// 如果有操作权限,直接放行
  622. <template>
  623.   
  624.     <i-frame :src="reportUrl"></i-frame>
  625.   
  626. </template><template>
  627.   
  628.     <i-frame :src="reportUrl"></i-frame>
  629.   
  630. </template><template>
  631.   
  632.     <i-frame :src="reportUrl"></i-frame>
  633.   
  634. </template>if (permissions.contains(reportConfig.getDragEditPermission())) {
  635. <template>
  636.   
  637.     <i-frame :src="reportUrl"></i-frame>
  638.   
  639. </template><template>
  640.   
  641.     <i-frame :src="reportUrl"></i-frame>
  642.   
  643. </template><template>
  644.   
  645.     <i-frame :src="reportUrl"></i-frame>
  646.   
  647. </template>    return true;
  648. <template>
  649.   
  650.     <i-frame :src="reportUrl"></i-frame>
  651.   
  652. </template><template>
  653.   
  654.     <i-frame :src="reportUrl"></i-frame>
  655.   
  656. </template><template>
  657.   
  658.     <i-frame :src="reportUrl"></i-frame>
  659.   
  660. </template>} else {
  661. <template>
  662.   
  663.     <i-frame :src="reportUrl"></i-frame>
  664.   
  665. </template><template>
  666.   
  667.     <i-frame :src="reportUrl"></i-frame>
  668.   
  669. </template><template>
  670.   
  671.     <i-frame :src="reportUrl"></i-frame>
  672.   
  673. </template>    // 设置查询大屏的路径,完全路径
  674. <template>
  675.   
  676.     <i-frame :src="reportUrl"></i-frame>
  677.   
  678. </template><template>
  679.   
  680.     <i-frame :src="reportUrl"></i-frame>
  681.   
  682. </template><template>
  683.   
  684.     <i-frame :src="reportUrl"></i-frame>
  685.   
  686. </template>    Set<String> queryDragSet = new HashSet<>();
  687. <template>
  688.   
  689.     <i-frame :src="reportUrl"></i-frame>
  690.   
  691. </template><template>
  692.   
  693.     <i-frame :src="reportUrl"></i-frame>
  694.   
  695. </template><template>
  696.   
  697.     <i-frame :src="reportUrl"></i-frame>
  698.   
  699. </template>    queryDragSet.add("/drag/page/queryById");
  700. <template>
  701.   
  702.     <i-frame :src="reportUrl"></i-frame>
  703.   
  704. </template><template>
  705.   
  706.     <i-frame :src="reportUrl"></i-frame>
  707.   
  708. </template><template>
  709.   
  710.     <i-frame :src="reportUrl"></i-frame>
  711.   
  712. </template>    queryDragSet.add("/drag/page/addVisitsNumber");
  713. <template>
  714.   
  715.     <i-frame :src="reportUrl"></i-frame>
  716.   
  717. </template><template>
  718.   
  719.     <i-frame :src="reportUrl"></i-frame>
  720.   
  721. </template><template>
  722.   
  723.     <i-frame :src="reportUrl"></i-frame>
  724.   
  725. </template>    // 设置查询大屏的路径,带有包含部分路径
  726. <template>
  727.   
  728.     <i-frame :src="reportUrl"></i-frame>
  729.   
  730. </template><template>
  731.   
  732.     <i-frame :src="reportUrl"></i-frame>
  733.   
  734. </template><template>
  735.   
  736.     <i-frame :src="reportUrl"></i-frame>
  737.   
  738. </template>    ArrayList<String> queryDragList = new ArrayList<>();
  739. <template>
  740.   
  741.     <i-frame :src="reportUrl"></i-frame>
  742.   
  743. </template><template>
  744.   
  745.     <i-frame :src="reportUrl"></i-frame>
  746.   
  747. </template><template>
  748.   
  749.     <i-frame :src="reportUrl"></i-frame>
  750.   
  751. </template>    queryDragList.add("/drag/share/view/");
  752. <template>
  753.   
  754.     <i-frame :src="reportUrl"></i-frame>
  755.   
  756. </template><template>
  757.   
  758.     <i-frame :src="reportUrl"></i-frame>
  759.   
  760. </template><template>
  761.   
  762.     <i-frame :src="reportUrl"></i-frame>
  763.   
  764. </template>    queryDragList.add("/drag/mock/json/");
  765. <template>
  766.   
  767.     <i-frame :src="reportUrl"></i-frame>
  768.   
  769. </template><template>
  770.   
  771.     <i-frame :src="reportUrl"></i-frame>
  772.   
  773. </template><template>
  774.   
  775.     <i-frame :src="reportUrl"></i-frame>
  776.   
  777. </template>    // 如果有查询权限,并且访问的查询接口,放行
  778. <template>
  779.   
  780.     <i-frame :src="reportUrl"></i-frame>
  781.   
  782. </template><template>
  783.   
  784.     <i-frame :src="reportUrl"></i-frame>
  785.   
  786. </template><template>
  787.   
  788.     <i-frame :src="reportUrl"></i-frame>
  789.   
  790. </template>    if (permissions.contains(reportConfig.getDragQueryPermission()) && queryDragSet.contains(uri)) {
  791. <template>
  792.   
  793.     <i-frame :src="reportUrl"></i-frame>
  794.   
  795. </template><template>
  796.   
  797.     <i-frame :src="reportUrl"></i-frame>
  798.   
  799. </template><template>
  800.   
  801.     <i-frame :src="reportUrl"></i-frame>
  802.   
  803. </template><template>
  804.   
  805.     <i-frame :src="reportUrl"></i-frame>
  806.   
  807. </template>return true;
  808. <template>
  809.   
  810.     <i-frame :src="reportUrl"></i-frame>
  811.   
  812. </template><template>
  813.   
  814.     <i-frame :src="reportUrl"></i-frame>
  815.   
  816. </template><template>
  817.   
  818.     <i-frame :src="reportUrl"></i-frame>
  819.   
  820. </template>    }
  821. <template>
  822.   
  823.     <i-frame :src="reportUrl"></i-frame>
  824.   
  825. </template><template>
  826.   
  827.     <i-frame :src="reportUrl"></i-frame>
  828.   
  829. </template><template>
  830.   
  831.     <i-frame :src="reportUrl"></i-frame>
  832.   
  833. </template>}
  834. <template>
  835.   
  836.     <i-frame :src="reportUrl"></i-frame>
  837.   
  838. </template><template>
  839.   
  840.     <i-frame :src="reportUrl"></i-frame>
  841.   
  842. </template><template>
  843.   
  844.     <i-frame :src="reportUrl"></i-frame>
  845.   
  846. </template>// 拦截非报表和大屏路径处理,正确配置,不会出现此情况。
  847. <template>
  848.   
  849.     <i-frame :src="reportUrl"></i-frame>
  850.   
  851. </template><template>
  852.   
  853.     <i-frame :src="reportUrl"></i-frame>
  854.   
  855. </template>    } else {
  856. <template>
  857.   
  858.     <i-frame :src="reportUrl"></i-frame>
  859.   
  860. </template><template>
  861.   
  862.     <i-frame :src="reportUrl"></i-frame>
  863.   
  864. </template><template>
  865.   
  866.     <i-frame :src="reportUrl"></i-frame>
  867.   
  868. </template>return true;
  869. <template>
  870.   
  871.     <i-frame :src="reportUrl"></i-frame>
  872.   
  873. </template><template>
  874.   
  875.     <i-frame :src="reportUrl"></i-frame>
  876.   
  877. </template>    }
  878. <template>
  879.   
  880.     <i-frame :src="reportUrl"></i-frame>
  881.   
  882. </template><template>
  883.   
  884.     <i-frame :src="reportUrl"></i-frame>
  885.   
  886. </template>}
  887. <template>
  888.   
  889.     <i-frame :src="reportUrl"></i-frame>
  890.   
  891. </template>    }
  892. <template>
  893.   
  894.     <i-frame :src="reportUrl"></i-frame>
  895.   
  896. </template>}
  897. <template>
  898.   
  899.     <i-frame :src="reportUrl"></i-frame>
  900.   
  901. </template>AjaxResult ajaxResult = AjaxResult.error(403, "当前操作没有权限");
  902. <template>
  903.   
  904.     <i-frame :src="reportUrl"></i-frame>
  905.   
  906. </template>ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult));
  907. <template>
  908.   
  909.     <i-frame :src="reportUrl"></i-frame>
  910.   
  911. </template>return false;
  912.     }
  913. }
复制代码

原作者说的注意事项:


打开config包下的ResourcesConfig.java文件,注入ReportInterceptor拦截器,并且注册拦截器和设置拦截规则

修改addInterceptors()方法
  1.   /**
  2.      * 自定义拦截规则
  3.      */
  4.     @Override
  5.     public void addInterceptors(InterceptorRegistry registry)
  6.     {
  7. <template>
  8.   
  9.     <i-frame :src="reportUrl"></i-frame>
  10.   
  11. </template>registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**")
  12. <template>
  13.   
  14.     <i-frame :src="reportUrl"></i-frame>
  15.   
  16. </template><template>
  17.   
  18.     <i-frame :src="reportUrl"></i-frame>
  19.   
  20. </template>// 积木报表新增:不拦截静态资源
  21. <template>
  22.   
  23.     <i-frame :src="reportUrl"></i-frame>
  24.   
  25. </template><template>
  26.   
  27.     <i-frame :src="reportUrl"></i-frame>
  28.   
  29. </template>.excludePathPatterns("/*.**, /**/*.html, /**/*.css, /**/*.js, /**/*.png, /**/*.jpg, /**/*.woff, /**/*.woff2, /**/*.ttf,  /**/*.svg, /**/*.ico, /**/*.map" )
  30. <template>
  31.   
  32.     <i-frame :src="reportUrl"></i-frame>
  33.   
  34. </template>;
  35.     }
复制代码
假如出现未设置的静态资源,必要自己进行设置。

实现数据格式转换器

在report包下新增adapter包,在adapter包下,新增ReportDataConvertAdapter.java文件,并且在此类中添加以下代码
  1. package com.ruoyi.framework.report.adapter;
  2. import com.alibaba.fastjson.JSONObject;
  3. import org.jeecg.modules.jmreport.desreport.render.handler.convert.ApiDataConvertAdapter;
  4. import org.springframework.stereotype.Component;
  5. @Component("reportDataConvertAdapter")
  6. public class ReportDataConvertAdapter implements ApiDataConvertAdapter {
  7.     @Override
  8.     public String getData(JSONObject jsonObject) {
  9. <template>
  10.   
  11.     <i-frame :src="reportUrl"></i-frame>
  12.   
  13. </template>if(jsonObject.containsKey("data")){
  14. <template>
  15.   
  16.     <i-frame :src="reportUrl"></i-frame>
  17.   
  18. </template>    String data = jsonObject.getString("data");
  19. <template>
  20.   
  21.     <i-frame :src="reportUrl"></i-frame>
  22.   
  23. </template>    return data;
  24. <template>
  25.   
  26.     <i-frame :src="reportUrl"></i-frame>
  27.   
  28. </template>}else if(jsonObject.containsKey("rows")){
  29. <template>
  30.   
  31.     <i-frame :src="reportUrl"></i-frame>
  32.   
  33. </template>    return jsonObject.getString("rows");
  34. <template>
  35.   
  36.     <i-frame :src="reportUrl"></i-frame>
  37.   
  38. </template>}else {
  39. <template>
  40.   
  41.     <i-frame :src="reportUrl"></i-frame>
  42.   
  43. </template>    return jsonObject.toJSONString();
  44. <template>
  45.   
  46.     <i-frame :src="reportUrl"></i-frame>
  47.   
  48. </template>}
  49.     }
  50. }
复制代码

去官网拿积木的数据结构,在数据库执行

官网地址:
  1. https://github.com/jeecgboot/jimureport/blob/master/db/jimureport.mysql5.7.create.sql
复制代码
前端设置

新建jeecg文件夹,并且jeecg文件夹下,新增request.js文件,并且在此文件中添加以下代码
  1. import axios from 'axios'
  2. import { Notification, MessageBox, Message } from 'element-ui'
  3. import store from '@/store'
  4. import { getToken } from '@/utils/auth'
  5. import errorCode from '@/utils/errorCode'
  6. import { tansParams } from "@/utils/ruoyi";
  7. import cache from '@/plugins/cache'
  8. // 是否显示重新登录
  9. export let isRelogin = { show: false };
  10. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  11. // 创建axios实例
  12. const service = axios.create({
  13.   // axios中请求配置有baseURL选项,表示请求URL公共部分
  14.   baseURL: process.env.VUE_APP_BASE_API,
  15.   // 超时
  16.   timeout: 10000
  17. })
  18. // request拦截器
  19. service.interceptors.request.use(config => {
  20.   // 是否需要设置 token
  21.   const isToken = (config.headers || {}).isToken === false
  22.   // 是否需要防止数据重复提交
  23.   const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
  24.   if (getToken() && !isToken) {
  25.     config.headers['X-Access-Token'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  26.   }
  27.   // get请求映射params参数
  28.   if (config.method === 'get' && config.params) {
  29.     let url = config.url + '?' + tansParams(config.params);
  30.     url = url.slice(0, -1);
  31.     config.params = {};
  32.     config.url = url;
  33.   }
  34.   if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
  35.     const requestObj = {
  36.       url: config.url,
  37.       data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
  38.       time: new Date().getTime()
  39.     }
  40.     const sessionObj = cache.session.getJSON('sessionObj')
  41.     if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
  42.       cache.session.setJSON('sessionObj', requestObj)
  43.     } else {
  44.       const s_url = sessionObj.url;<template>
  45.   
  46.     <i-frame :src="reportUrl"></i-frame>
  47.   
  48. </template><template>
  49.   
  50.     <i-frame :src="reportUrl"></i-frame>
  51.   
  52. </template>  // 请求地址
  53.       const s_data = sessionObj.data;<template>
  54.   
  55.     <i-frame :src="reportUrl"></i-frame>
  56.   
  57. </template><template>
  58.   
  59.     <i-frame :src="reportUrl"></i-frame>
  60.   
  61. </template>// 请求数据
  62.       const s_time = sessionObj.time;<template>
  63.   
  64.     <i-frame :src="reportUrl"></i-frame>
  65.   
  66. </template><template>
  67.   
  68.     <i-frame :src="reportUrl"></i-frame>
  69.   
  70. </template>// 请求时间
  71.       const interval = 1000;<template>
  72.   
  73.     <i-frame :src="reportUrl"></i-frame>
  74.   
  75. </template><template>
  76.   
  77.     <i-frame :src="reportUrl"></i-frame>
  78.   
  79. </template><template>
  80.   
  81.     <i-frame :src="reportUrl"></i-frame>
  82.   
  83. </template> // 间隔时间(ms),小于此时间视为重复提交
  84.       if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
  85. <template>
  86.   
  87.     <i-frame :src="reportUrl"></i-frame>
  88.   
  89. </template>const message = '数据正在处理,请勿重复提交';
  90. <template>
  91.   
  92.     <i-frame :src="reportUrl"></i-frame>
  93.   
  94. </template>console.warn(`[${s_url}]: ` + message)
  95. <template>
  96.   
  97.     <i-frame :src="reportUrl"></i-frame>
  98.   
  99. </template>return Promise.reject(new Error(message))
  100.       } else {
  101. <template>
  102.   
  103.     <i-frame :src="reportUrl"></i-frame>
  104.   
  105. </template>cache.session.setJSON('sessionObj', requestObj)
  106.       }
  107.     }
  108.   }
  109.   return config
  110. }, error => {
  111.   console.log(error)
  112.   Promise.reject(error)
  113. })
  114. // 响应拦截器
  115. service.interceptors.response.use(res => {
  116.     // 未设置状态码则默认成功状态
  117.     const code = res.data.code || 200;
  118.     // 获取错误信息
  119.     const msg = errorCode[code] || res.data.msg || res.data.message || errorCode['default']
  120.     // 二进制数据则直接返回
  121.     if (res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer') {
  122.       return res
  123.     }
  124.     if (code === 401) {
  125.       if (!isRelogin.show) {
  126. <template>
  127.   
  128.     <i-frame :src="reportUrl"></i-frame>
  129.   
  130. </template>isRelogin.show = true;
  131. <template>
  132.   
  133.     <i-frame :src="reportUrl"></i-frame>
  134.   
  135. </template>MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
  136. <template>
  137.   
  138.     <i-frame :src="reportUrl"></i-frame>
  139.   
  140. </template>  isRelogin.show = false;
  141. <template>
  142.   
  143.     <i-frame :src="reportUrl"></i-frame>
  144.   
  145. </template>  store.dispatch('LogOut').then(() => {
  146. <template>
  147.   
  148.     <i-frame :src="reportUrl"></i-frame>
  149.   
  150. </template>    location.href = '/index';
  151. <template>
  152.   
  153.     <i-frame :src="reportUrl"></i-frame>
  154.   
  155. </template>  })
  156. <template>
  157.   
  158.     <i-frame :src="reportUrl"></i-frame>
  159.   
  160. </template>}).catch(() => {
  161. <template>
  162.   
  163.     <i-frame :src="reportUrl"></i-frame>
  164.   
  165. </template>  isRelogin.show = false;
  166. <template>
  167.   
  168.     <i-frame :src="reportUrl"></i-frame>
  169.   
  170. </template>});
  171.       }
  172.       return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
  173.     } else if (code === 500) {
  174.       Message({ message: msg, type: 'error' })
  175.       return Promise.reject(new Error(msg))
  176.     } else if (code === 601) {
  177.       Message({ message: msg, type: 'warning' })
  178.       return Promise.reject('error')
  179.     } else if (code !== 200) {
  180.       Notification.error({ title: msg })
  181.       return Promise.reject('error')
  182.     } else {
  183.       return res.data
  184.     }
  185.   },
  186.   error => {
  187.     console.log('err' + error)
  188.     let { message } = error;
  189.     if (message == "Network Error") {
  190.       message = "后端接口连接异常";
  191.     } else if (message.includes("timeout")) {
  192.       message = "系统接口请求超时";
  193.     } else if (message.includes("Request failed with status code")) {
  194.       message = "系统接口" + message.substr(message.length - 3) + "异常";
  195.     }
  196.     Message({ message: message, type: 'error', duration: 5 * 1000 })
  197.     return Promise.reject(error)
  198.   }
  199. )
  200. export default service
复制代码

在jeecg文件夹下,新增report.js文件,并且在此文件中添加以下代码
  1. import request from "@/api/jeecg/request";
  2. let jmreportUrl = "/jmreport";
  3. import { getToken } from "@/utils/auth";
  4. let paramObj = {
  5.   token: "Bearer " + getToken()
  6. }
  7. // 获取填报报表
  8. export function listReport(queryParams) {
  9.   let params = {
  10.     ...paramObj,
  11.     ...queryParams
  12.   }
  13.   return request({
  14.     url: jmreportUrl + "/excelQuery",
  15.     method: 'get',
  16.     params: params
  17.   })
  18. }
  19. // 获取填报报表列表
  20. export function listFillReport(queryParams) {
  21.   paramObj["reportType"] = "1011126161407836160";
  22.   let params = {
  23.     ...paramObj,
  24.     ...queryParams
  25.   }
  26.   return request({
  27.     url: jmreportUrl + "/excelQuery",
  28.     method: 'get',
  29.     params: params
  30.   })
  31. }
复制代码

在src/view文件夹下新增jeecg文件夹,在jeecg文件夹下新增report文件夹,在report文件夹下新增index.vue文件,并且在此文件中添加以下代码
  1. <template>
  2.   
  3.     <i-frame :src="reportUrl"></i-frame>
  4.   
  5. </template>
复制代码

在report文件夹下新增view文件夹,在view文件夹下新增index.vue文件,并且在此文件中添加以下代码。
  1. <template>
  2.   
  3.     <i-frame :src="reportUrl"></i-frame>
  4.   
  5. </template>
复制代码

在jeecg文件夹下新增drag文件夹,在drag文件夹下新增index.vue文件,并且在此文件中添加以下代码
  1. <template>
  2.   
  3.     <i-frame :src="reportUrl"></i-frame>
  4.   
  5. </template>
复制代码

在drag文件夹下新增view文件夹,在view文件夹下新增index.vue文件,并且在此文件中添加以下代码。
  1. <template>
  2.   
  3.     <i-frame :src="reportUrl"></i-frame>
  4.   
  5. </template>
复制代码

执行创建菜单的SQL
  1. -- 主目录
  2. INSERT INTO `lucas`.`sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `route_name`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1083, '报表管理', 0, 7, 'jeecg', NULL, NULL, '', 1, 0, 'M', '0', '0', NULL, 'chart', 'admin', '2025-03-27 01:49:40', '', NULL, '');
  3. -- 基础报表菜单
  4. INSERT INTO `lucas`.`sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `route_name`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1084, '报表管理', 1083, 0, 'report', 'jeecg/report/index', NULL, '', 1, 0, 'C', '0', '0', 'jeecg:report:edit', 'druid', 'admin', '2025-03-27 01:51:44', 'admin', '2025-03-27 05:12:06', '');
  5. -- 大屏报表菜单
  6. INSERT INTO `lucas`.`sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `route_name`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1085, '大屏管理', 1083, 1, 'drag', 'jeecg/drag/index', NULL, '', 1, 0, 'C', '0', '0', 'jeecg:drag:edit', 'druid', 'admin', '2025-03-27 01:53:17', 'admin', '2025-03-27 05:12:13', '');
  7. -- 基础报表查看菜单
  8. INSERT INTO `lucas`.`sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `route_name`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1086, '报表查看', 1083, 2, 'report/view', 'jeecg/report/view/index', NULL, '', 1, 0, 'C', '1', '0', 'jeecg:report:query', 'eye-open', 'admin', '2025-03-27 01:54:41', 'admin', '2025-03-27 05:12:19', '');
  9. -- 大屏报表查看菜单
  10. INSERT INTO `lucas`.`sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `route_name`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1087, '大屏查看', 1083, 3, 'drag/view', 'jeecg/drag/view/index', NULL, '', 1, 0, 'C', '1', '0', 'jeecg:drag:query', 'eye-open', 'admin', '2025-03-27 01:55:46', 'admin', '2025-03-27 05:12:24', '');
复制代码
设置结束


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表