一、需求背景

有老系统需要重构,新做的系统需要做一个大一统的整合,类似一个分类栏目

在菜单位置罗列出有什么子系统应用,点击对应的应用菜单,展示区跳转到相应的子系统应用中

我用Excel简单描述了下系统的页面效果:

二、技术方案

第一种,使用iframe实现,html提供了iframe标签实现页面内访问其他页面的功能

第二种,使用微前端框架,微前端的实现原理很多,iframe或则组件,又或者远程调用....

  详细见:https://www.jianshu.com/p/0aaf0daaaeee

基于现实情况的考量:非专业前端开发,项目成员没有前端大神,微前端一无所知,项目初版开发周期短

我们选择的方案是使用iframe实现

三、落地实现

主应用web + 基础应用web 共用 基础应用server的接口

基础应用相当于认证中心,其他业务server只需要认证中心的鉴权即可

所有web使用同一个令牌做前端权限控制(同理后端)

iframe标签内的应用和主应用共享浏览器数据,需要保持在同一个域之内

1、主应用web改造

主应用本身不需要server,  都是对接基础应用的,所以新增api接口

解决web登录,跳转,退出的接口问题

请求基础应用的令牌携带方式和一些其他参数传递的处理也调整:

vuex的用户actions的方法也要调整

这里定义如何存储用户信息,和退出时需要处理的步骤逻辑

因为我的token存储方式和基础应用的存储方式并不一致,同一个token以两种方式存储

在退出登录的时候,一定要同步把基础应用的token删除,那这里是把那边的逻辑代码搬过来了

(见上面logout方法调用 removeJnpfToken)

iframe跳转实现

首先要有侧边应用菜单的选择:

<el-aside class="sub-sys-menu">
<img :src="appLogo" class="app-logo">
<el-menu
mode="vertical"
class="sub-sys-menu-list"
:default-active="getDefaultActiveMenu"
@select="whenMenuItemSelect"
>
<el-menu-item
v-for="(m, idx) in sysMenuList"
:key="`menu${idx}`"
:index="m.key"
>
<template slot="title">
<div class="sub-sys-menu-item">
<svg-icon :icon-class="m.icon" class="sub-sys-menu-icon" />
<span class="sub-sys-menu-title">{{ m.name }}</span>
</div>
</template>
</el-menu-item>
</el-menu>
</el-aside>

默认激活的应用,和应用选中后的事件处理

    getDefaultActiveMenu() {
if (!this.sysMenuList || this.sysMenuList.length === 0) return ''
return this.sysMenuList[0].key
},
async whenMenuItemSelect(key, keyPath) {
await this.isLoginCheck()
const app = this.appList.find(x => x.symbol === key)
const menu = this.sysMenuList.find(x => x.key === key)
this.currentAppUrl = `${app.url}?Authorization=${encodeURIComponent(this.currentToken)}&time=${new Date().getTime()}`
this.currentAppTitle = menu.name
},

 

因为点击时不是路由跳转,所以手动追加是否在线判断:

async isLoginCheck() {
try {
await this.$store.dispatch('UserGetInfo')
} catch (error) {
await this.$store.dispatch('UserResetToken')
this.$router.push({ path: '/login' })
}
}

iframe标签去除所有边框,外边距,百分百填充容器元素

 <el-main class="frame-container">
<iframe
frameborder="0"
border="0"
marginwidth="0"
marginheight="0"
width="100%"
height="100%"
:src="currentAppUrl"
/>
</el-main>

  

数据定义部分:

  data() {
return {
color: 'red',
appLogo: require('@/assets/sidelogo-light.png'),
sysMenuList: [
{ name: '经营场所', icon: 'jxxcs', key: 'APP-1001' },
{ name: '非经营场所', icon: 'fjyxcs', key: 'APP-1002' },
{ name: '等保测评', icon: 'dbcp', key: 'APP-1003' },
{ name: 'APP管理', icon: 'app', key: 'APP-1004' },
{ name: '系统管理', icon: 'sz', key: 'APP-1005' }
],
appList: [
{ symbol: 'APP-1001', url: 'https://www.cnblogs.com/mindzone/p/17964919' },
{ symbol: 'APP-1002', url: 'https://www.bilibili.com/' },
{ symbol: 'APP-1003', url: 'http://192.168.200.45/cp-mng-web/home' },
{ symbol: 'APP-1004', url: 'https://www.cnblogs.com/mindzone' },
{ symbol: 'APP-1005', url: 'http://192.168.200.45:3000/home' }
// { symbol: 'APP-1005', url: 'http://172.17.29.7:3000/home' }
],
currentAppUrl: '',
currentAppTitle: '',
currentUserName: '',
currentToken: '',
changeFlag: false
}
},
computed: {
...mapGetters(['userInfo', 'token'])
},

  

页面挂载时,同步当前用户信息:

  mounted() {
this.currentUserName = this.userInfo.userName
this.currentToken = `${this.token}`
},

2、子应用免登录访问问题:

因为进入子应用不应该再次输入密码登录访问,在进入主应用的时候已经通过了认证中心的处理

这里以基础应用为例(本身也是子应用)进行改造调整:

在路由权限逻辑中追加一个免登录的跳转,判断路由路径 + 请求参数是否携带令牌,如果符号则设置令牌,继续跳转

【Vue】使用iframe解决多应用整合问题(微前端)的更多相关文章

  1. 「微前端实践」使用Vue+qiankun微前端方案重构老项目的本地验证

    10月份换了新的工作,参与完一个月的需求迭代后,接到了项目重构的任务.简单来说,需要在短时间内提出方案设想,同时进行本地验证,最终需要拿出一套技术替换方案来.于是,埋头苦干了一个月,总算干了点成绩出来 ...

  2. [转]vue跨域解决方法

      vue跨域解决方法 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' hea ...

  3. 「实践篇」解决微前端 single-spa 项目中 Vue 和 React 路由跳转问题

    前言 本文介绍的是在做微前端 single-spa 项目过程中,遇到的 Vue 子应用和 React 子应用互相跳转路由时遇到的问题. 项目情况:single-spa 项目,基座用的是 React,目 ...

  4. 基于 iframe 的微前端框架 —— 擎天

    vivo 互联网前端团队- Jiang Zuohan 一.背景 VAPD是一款专为团队协作办公场景设计的项目管理工具,实践敏捷开发与持续交付,以「项目」为核心,融合需求.任务.缺陷等应用,使用敏捷迭代 ...

  5. [Django基础] django解决静态文件依赖问题以及前端引入方式

    一.静态文件依赖 学习django的时候发现静态文件(css,js等)不能只在html中引入,还要在项目的settings中设置,否则会报以下错误 [11/Sep/2018 03:18:15] &qu ...

  6. 《OneForAll框架搭建之旅》前端篇:微前端架构设计(Vue)

    心之所向,勇往直前!记录开发过程中的那些小事,给自己加点经验值. 前言 作为一个.Net后端开发,在竞争愈加激烈的当下,掌握点前端配菜好像已经是家常便饭了. 刚好在工作的第5个年头,辞去小主管职务的我 ...

  7. iframe & sandbox & 微前端

    iframe & sandbox & 微前端 沙箱,容器,隔离 sandbox demo svg progress bar https://stackoverflow.com/ques ...

  8. laravel整合vue 多入口解决

    2018年8月10日23:10:29 其实整合是挺简单,因为laravel本身就准备的挺好了 laravel 版本5.6   注意php cli是web是不一样的 这个需要设置环境变量 ,php需要7 ...

  9. easyUI layout 中使用tabs+iframe解决请求两次方法

    demo中的事例在加载tab页面时是 function createFrame(url) { var s = '<iframe name="iframepanel" scro ...

  10. vue项目中解决type=”file“ change事件只执行一次的问题

    问题描述 在最近的项目开发中遇到了这样的一个问题,当我上传了一个文件时,我将获取到的文件名清空后,却无法再次上传相同的文件 <template> <div class="h ...

随机推荐

  1. CF1815

    CF1815 Div. 1 确实难,Virtual Contest 上只完成了两道题,想出来了三道题. A. Ian and Array Sorting 秒切题--考虑将前 \(n - 1\) 个数变 ...

  2. LeetCode 40. Combination Sum II 组合总和 II (C++/Java)

    题目: Given a collection of candidate numbers (candidates) and a target number (target), find all uniq ...

  3. LeetCode 297. Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化(C++/Java)

    题目: Serialization is the process of converting a data structure or object into a sequence of bits so ...

  4. kettle从入门到精通 第六十四课 ETL之kettle kettle中执行SQL脚本步骤,使用需当心

    1.群里有不定时会有同学反馈执行SQL脚本步骤使用有问题,那么咱们今天一起来学习下该步骤.trans中的执行SQL脚本有两方面功能,使用时需小心,不然很容易踩坑. 官方定义: 翻译: 您可以使用此步骤 ...

  5. INFINI Labs 产品更新 | 统一版本号 1.22.0

    INFINI Labs 产品又更新啦~,包括 Console,Gateway,Loadgen,Agent 1.22.0.为了避免版本不同带来的困扰,以后发布均统一版本号,此次版本重点修复历史遗留 Bu ...

  6. k8s节点状态Init:0/1

    k8s节点状态Init:0/1 在节点机器上打印日志: journalctl -f -u kubelet 出现以下内容: 5月 29 15:27:34 k8snode2 kubelet[2249]: ...

  7. 题目:SHMIP The subglacial hydrology model intercomparison Project

    SHMIP(冰下水文模型比较计划)是一个致力于解决冰下水文多种理论方法问题的项目.该计划通过构建一系列综合模拟实验,并对运行这些模拟的各参与模型的结果进行比较,以达到其目标.这将有助于潜在的模型用户更 ...

  8. vue3 父子组件间的传值通信

    1.父转子 // 父组件 <template> <div> <div> <p>{{ count }}</p> <Son :countF ...

  9. aspose word模板文件生成pdf

    # aspose word模板文件生成pdf package com.example.core.mydemo; import com.alibaba.fastjson.JSON; import com ...

  10. Vue聊天框自动滚动底部

    原理:通过监听数据更新,将滚动的最大高度赋值给滚动条的最大高度,并等待页面更新完成后再将页面滚动到底部. 容器代码 watch监听 scrollTop: 距离最顶部高度 scrollHeight:滚动 ...