// src/store/modlues/template.ts
const state = {
sign: 'productLibrary', // 产品库路由标识
routePath: '/template', // 产品库跳转中间页path
isFullFrame: false, // 是否设置产品库Iframe全屏
NODE_ENV: process.env.NODE_ENV, // 环境变量
ENV_URLS: {
development: 'http://127.0.0.1:3000',
test: 'http://cms-test.shenlanbao.com',
uat: 'http://cms-uat.shenlanbao.com',
production: 'http://cms.shenlanbao.com',
},
};
const mutations: MutationTree = {
SET_isFullFrame(state, val) {
state.isFullFrame = val;
},
};
// src/router/modules/page-productLibrary-router.ts
{
path: '/template', // 对应Store/template.ts 的 routePath
name: 'productLibrary', // 对应Store/template.ts 的 sign
cn: '产品库',
hidden: true,
component: () => import('@/views/productLibrary/template.vue'),
children: [],
},
// src/components/common/MenuItem.vue
// src/views/productLibrary/template.vue
// index.html
// src/router/routerGuards.ts
export function createRouterGuards(routers: Router) {
routers.beforeEach(async (to, _, next) => {
const isFrame = JSON.parse(localStorage.getItem('isFrame') || '') // 是否是 iframe 加载
if (!isFrame) {
// 正常登陆操作
} else {
const hasToken = localStorage.getItem('auth') || ''
const { addRouter } = store.state.global
if (hasToken && addRouter) {
next()
return
}
localStorage.setItem('auth', localStorage.getItem('auth') || '')
await store.commit('global/setRoutes', JSON.parse(localStorage.getItem('routes') || ''))
await store.commit('global/setUserInfo', JSON.parse(localStorage.getItem('userInfo') || ''))
// 路由添加/标记
store.commit('global/isAddRouter', true)
const getNewRouter = store.getters['global/getNewRouter']
getNewRouter.forEach((route: Iroute) => {
routers.addRoute(route)
})
const path = localStorage.getItem('path')
to.path = path
const newTo = {
...to,
name: to.name || undefined,
}
next({ ...newTo, replace: true })
}
})
}
// src/utils/template.ts
// ifarame 内嵌时向产品测评窗口进行通信事件定义
const source = 'productLibrary' // 产品库跳转路由标识
const posMessage = function (config) {
const message = Object.assign({ source }, config)
return new Promise((resolve) => {
top.postMessage(message, '*')
resolve(true)
})
}
// 是否设置全屏遮罩
export function postFrameCover(val) {
const config = {
fnName: 'setIframeCover',
params: val,
}
return posMessage(config)
}
// 跳转产品测评页面
export function postTopRouter(path) {
if (!path) return
const config = {
fnName: 'setRoute',
params: path,
}
return posMessage(config)
}
展示产品库页面时,对应左侧菜单路由要相应高亮选中。
在监听路由跳转时,判断当跳转产品库页面时,取 query 中的 path 字段为 url 做高亮处理。
// src/components/Nav.vue
展示产品库页面时,对应上方面包屑导航要显示正确的路由名称。
在监听路由跳转时,判断当跳转产品库页面时,取 query 中的 path 字段为 url 做高亮处理。
// src/components/common/BaseHeard.vue
当点击弹窗时,通知父窗口,同步修改外层样式。
// 产品库
测试弹窗
// 产品测评 template.vue
setIframeCover(val) {
this.$store.commit('template/SET_isFullFrame', val);
}
// 产品测评 App.vue
// 修改左侧菜单的z-index,使遮罩在最顶层
.hidemenu {
background: rgba(0, 0, 0, 0.5);
z-index: 100;
}
// 产品测评 template.vue
.hidemenu {
background: rgba(0, 0, 0, 0.5);
z-index: 100;
}
// 产品库
跳转产品测评文章详情
// index.html