对于一个稍大点的项目来说,必然存在着分久必合,合久必分的历史周期律。
原系统X,被拆成A和B两个子系统,现在又需要在A系统上通过点击按钮跳转到B系统上。好在之前的拆分并不是很彻底,A、B两个子系统是共用一个框架数据库的,redis也是共用的。只需要在jeecg框架的束缚下将A系统的token传递给B系统,并在B系统上初始化一些必要的信息(基本用户信息,项目信息,缓存等等)即可。
OK,首先需要在A系统上创建一个按钮,该按钮对应一个vue页面,我们在这个Vue页面里面完成3件事:1、拿B系统的地址;2、拿A系统的token、3、跳转。
<template>
<div>
正在跳转,请稍等...
</div>
</template>
<script>
import Vue from 'vue'
import { ACCESS_TOKEN } from '@/store/mutation-types'
export default {
name: 'JumpByToken',
data(){
},
mounted() {
const urlParams = new URLSearchParams(window.location.search)
let jumpUrl = urlParams.get('jump')
if(!jumpUrl){
this.$message.error('未设置jump地址!')
return;
}
const token = Vue.ls.get(ACCESS_TOKEN);
if(!token){
this.$message.error('未找到TOKEN!')
return;
}
jumpUrl += "?token=" + token;
window.location.href = jumpUrl;
},
methods: {
}
}
</script>
还需要在router.config.js配置路由:
{
path: '/jumpByToken', component: () => import('@/views/user/JumpByToken'), hidden: true
},
同时在框架的菜单配置里,将菜单路径配置为:http://A机器地址/a/jumpByToken?jump=http://B机器地址/b/user/login。将前端组件改为:layouts/IframePageView;勾选打开方式为外部。
至此,点击A系统配置的跳转按钮后,可以看到,浏览器打开新tab到B项目,且token以url参数形式传递到B系统。修改B系统的对应vue:
mounted() {
const urlParams = new URLSearchParams(window.location.search)
const token = urlParams.get('token')
if(token) {
Vue.ls.set(ACCESS_TOKEN, token, 7 * 24 * 60 * 60 * 1000)
getAction("/sys/user/getUserInfo", {}).then(res => {
if(res.success) {
let userInfo = res.result.userInfo;
Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
this.initData();
}
})
}
},
在B系统对应的页面(也就是登录页面),完成token的获取和存储、其他必要信息的获取,以及登录成功的自动跳转。