集成积木报表主要有两个接口需要进行权限token传递
查看积木报表列表:/jmreport/list
查看积木报表详情:/jmreport/view/*
后端处理
1.自定义Token鉴权,需要实现下接口 JmReportTokenServiceI , 不实现则报表默认不做权限控制
代码实现
package com.hotspot.framework.web.service;
import com.hotspot.common.core.domain.model.LoginUser;
import com.hotspot.common.utils.StringUtils;
import com.hotspot.common.utils.TokenUtils;
import lombok.AllArgsConstructor;
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @belongsProject:
* @belongsPackage: com.hotspot.framework.web.service
* @author:
* @createTime:
* @description: TODO
*/
@Component
@AllArgsConstructor
public class JimuReportTokenService implements JmReportTokenServiceI {
private final TokenService tokenService;
@Override
public String getUsername(String token) {
LoginUser loginUser = tokenService.getLoginUser(token);
return loginUser.getUsername();
}
@Override
public Boolean verifyToken(String token) {
LoginUser loginUser = tokenService.getLoginUser(token);
if(StringUtils.isNotNull(loginUser)){
tokenService.verifyToken(loginUser);
return true;
}
return false;
}
@Override
public String getToken(HttpServletRequest request) {
return TokenUtils.getTokenByRequest(request);
}
@Override
public Map<String, Object> getUserInfo(String token) {
return null;
}
}
2.创建一个工具类TokenUtils
代码实现
package com.hotspot.common.utils;
import javax.servlet.http.HttpServletRequest;
/**
* @belongsProject:
* @belongsPackage: com.hotspot.common.utils
* @author:
* @createTime:
* @description: TODO
*/
public class TokenUtils {
/**
* 获取 request 里传递的 token
*
* @param request
* @return
*/
public static String getTokenByRequest(HttpServletRequest request) {
String parameter = request.getParameter("token");
String header = request.getHeader("token");
if (parameter == null && header == null) {
parameter = request.getHeader("Authorization");
}
return parameter != null ? parameter : header;
}
}
3.TokenService类中重载getLoginUser方法
代码实现
/**
* 获取用户身份信息
*
* @return 用户信息
*/
public LoginUser getLoginUser(String token)
{
if(StringUtils.isNull(token)){
return null;
}
token = token.replace(Constants.TOKEN_PREFIX, "");
if (StringUtils.isNotEmpty(token))
{
try
{
Claims claims = parseToken(token);
// 解析对应的权限以及用户信息
String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
String userKey = getTokenKey(uuid);
LoginUser user = redisCache.getCacheObject(userKey);
return user;
}
catch (Exception e)
{
}
}
return null;
}
至此再访问积木报表列表:/jmreport/list就需要带上token验证了
4.针对报表预览查看请求地址进行权限控制,写spring拦截器
代码实现
package com.hotspot.framework.interceptor;
import com.alibaba.fastjson.JSONObject;
import com.hotspot.common.core.domain.model.LoginUser;
import com.hotspot.framework.web.service.TokenService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author
* @version
* @date
*/
@Component
@AllArgsConstructor
public class JimuInterceptor implements HandlerInterceptor {
private final TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
response.setContentType("text/html; charset=UTF-8");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String token = request.getParameter("token");
LoginUser loginUser = tokenService.getLoginUser(token);
if (loginUser != null) {
return true;
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", 200);
jsonObject.put("msg", "参数错误或无权访问数据");
response.getWriter().println(jsonObject);
return false;
}
}
访问积木报表列表:/jmreport/list?token=#{token}
5.添加到自定义拦截规则中
编辑
代码实现
@Override
public void addInterceptors(InterceptorRegistry registry)
{
registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
registry.addInterceptor(jimuInterceptor).addPathPatterns("/jmreport/view/*");
}
前端处理
1.创建前端页面
vue页面
<template>
<div class="app-container">
<div v-loading="loading" :style="'height:'+ height" class="app-container">
<iframe :src="src" id="reportView" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
</div>
</div>
</template>
<script>
import { getReportbb} from '@/api/ncp/cityenterprise'
import { getToken } from '@/utils/auth'
export default {
name: "CityEnterpriseReportbb",
data() {
return {
height: document.documentElement.clientHeight - 94.5 + "px;",
// 遮罩层
loading: true,
// 显示搜索条件
showSearch: true,
src: "",
views: "",
};
},
created() {
getReportbb().then(res => {
this.views = res
this.src =this.global.baseURL + this.views + "?token=Bearer " + getToken();
})
},
mounted: function () {
setTimeout(() => {
this.loading = false;
}, 300);
const that = this;
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 94.5 + "px;";
};
},
};
</script>
js方法
export function getReportbb() {
return request({
url: '/gsjgx/cityenterprise/reportbb',
method: 'get'
})
}
注:this.global.baseURL是访问路径,配置在了前端
代码实现
const baseURL = 'http://localhost:9007/ncx'; //静态文件域名 开发时使用
export default {
baseURL
}
注:9007是后台端口,ncx是后台访问路径
2.后台接口
@PreAuthorize("@ss.hasPermi('ncp:cityenterprise:reportbb')")
@GetMapping("/reportbb")
public String reportbb()
{
SysDictData dictData = ncpCityEnterpriseService.reportbb();
return "/jmreport/view/"+Long.parseLong(dictData.getDictValue());
}
注:后台接口主要查询返回创建报表生成的唯一id,我这里因为很多报表,用字典项查询方式处理的
3.后台配置菜单项,进行访问就可以了
注:记得链接要拼接?token=#{token},否则访问不成功