若依集成积木就不说了官网有ruoyi vue版集成积木报表 · JimuReport 积木报表 · 看云 (jeecg.com)
考虑到用若依的一般都是刚成立的公司,没有自己公司的框架,所以一般都是前后端都干,我这里前后端都搞上,让你们快速搞完摸鱼去,代码写的如果不好多担待。
如果这篇文章对你有帮助希望点个赞,这样我的分享才会有乐趣!谢谢大家!
接下来是积木进行token传递的集成过积木主要有两个接口需要进行token传递
第一次写博客不好之处的多担待
1. /jmreport/list 查看积木列表
2. /jmreport/view/* 查看积木报表详情
后端
主要是后端的
一、首先说第一个 /jmreport/list 接口,也就是下面这个页面
1.直接创建 JimuReportTokenService 实现 JmReportTokenServiceI接口就行了
2.实现
package com.ruoyi.framework.web.service;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.TokenUtils;
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author dzh
* @version 1.0
* @date 2022/7/26 11:06
*/
@Component
public class JimuReportTokenService implements JmReportTokenServiceI {
@Autowired
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;
}
}
3.TokenUtils
/**
* @author dzh
* @version 1.0
* @date 2022/7/26 14:18
*/
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;
}
}
4. 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;
}
4.这样子就可以了再次访问接口时如果不带token时就会报错
5.成功案例 /jmreport/list?token=#{token}
二 /jmreport/view/* 查看积木报表详情
这个需要做一个拦截器,监听/jmreport/view/*接口,必须携带token
1.定义拦截器
代码段
package com.ruoyi.framework.interceptor;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.framework.web.service.TokenService;
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 dzh
* @version 1.0
* @date 2022/7/26 16:28
*/
@Component
public class JimuInterceptor implements HandlerInterceptor {
@Autowired
private 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;
}
}
2.进行接口拦截
完成,这样访问/jmreport/view 也需要token了
前端
接下来主要是前端的
我这里是放到菜单中了并没有另外开一个网页
1.搞一个菜单
2.代码段1
<template>
<i-frame :src="openUrl" />
</template>
<script>
import { getToken } from '@/utils/auth'
import { indexUrl } from '@/api/ruoyi/jimu/jimu'
import iFrame from "@/components/iFrame/index";
export default {
name: 'Jimu',
components: { iFrame },
data() {
return {
openUrl: ''
}
},
created() {
indexUrl().then(res => {
this.openUrl = res + '?token=' + getToken()
})
}
}
</script>
<style scoped>
</style>
3.代码段2
import request from "@/utils/request";
// 首页
export function indexUrl() {
return request({
url: "/ruoyi/jimu/index",
method: "get"
});
}
4.后端代码段,其实就是返回积木列表的访问地址,获取当前服务器I拼接了一下
/**
* @author dzh
* @version 1.0
* @date 2022/7/26 11:02
*/
@RestController
@RequestMapping("/ruoyi/jimu")
public class JimuController {
@Autowired
Environment environment;
@GetMapping("/index")
public String index(){
String hostIp = IpUtils.getHostIp();
String property = environment.getProperty("ruoyi.reportUrl");
String format = String.format(property, hostIp);
return format+"/jmreport/list";
}
}
5.application.yml
完成,不管怎么访问都需要携带带token的,摸鱼去吧!