You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

358 lines
11 KiB

import Vue from "vue";
import Router from "vue-router";
import http from "../utils/request";
import { isURL } from "@/utils/validate";
import Cookies from "js-cookie";
Vue.use(Router);
// 解决Vue-Router升级导致的Uncaught(in promise) navigation guard问题----------
const originalPush = Router.prototype.push;
Router.prototype.push = function push(location, onResolve, onReject) {
if (onResolve || onReject) {
return originalPush.call(this, location, onResolve, onReject);
}
return originalPush.call(this, location).catch((err) => err);
};
// 解决Vue-Router升级导致的Uncaught(in promise) navigation guard问题----------
// 页面路由(独立页面)
export const pageRoutes = [
{
path: "/404",
component: () => import("@/page-subspecialty/views/pages/404"),
name: "404",
meta: { title: "404未找到" },
beforeEnter(to, from, next) {
// 拦截处理特殊业务场景
// 如果, 重定向路由包含__双下划线, 为临时添加路由
if (/__.*/.test(to.redirectedFrom)) {
return next(to.redirectedFrom.replace(/__.*/, ""));
}
next();
},
},
{
path: "/login",
component: () => import("@/page-subspecialty/views/pages/login"),
name: "login",
meta: { title: "登录" },
},
{
path: "/pacs",
component: () => import("@/page-subspecialty/views/pages/pacsManage/index"),
name: "pacs",
meta: { title: "pacs浏览器", isTab: true },
},
];
// 模块路由(基于主入口布局页面)*8
export const moduleRoutes = {
path: "/",
component: () => import("@/page-subspecialty/views/main"),
name: "main",
redirect: { name: "outpatientManagement" },
meta: { title: "首页" },
children: [
{
path: "/outpatientManagement",
component: () =>
import("@/page-subspecialty/views/modules/outpatientManagement/call"),
name: "outpatientManagement",
meta: { title: "分诊管理", isTab: true },
},
// ok镜
{
path: "/patientInfo",
name: "patientInfo",
meta: { title: "详情", isTab: true },
component: () =>
import(
"@/page-subspecialty/views/modules/optometryManagement/seeDoctor/index"
),
},
{
path: "/iframe",
component: null,
name: "iframe",
meta: { title: "iframe", isTab: true },
},
{
path: "/redirect",
name: "redirect",
component: () => import("@/page-subspecialty/views/redirect"),
},
{
path: "/ot",
name: "ot",
component: () =>
import("@/page-subspecialty/views/modules/formList/mraForm.vue"),
},
],
};
export function addDynamicRoute(routeParams, router) {
// 组装路由名称, 并判断是否已添加, 如是: 则直接跳转
var routeName = routeParams.routeName;
var dynamicRoute = window.SITE_CONFIG["dynamicRoutes"].filter(
(item) => item.name === routeName
)[0];
if (dynamicRoute) {
return router.push({ name: routeName, params: routeParams.params });
}
// 否则: 添加并全局变量保存, 再跳转
dynamicRoute = {
path: routeName,
component: () =>
Promise.resolve(
require(`@/page-subspecialty/views/modules/${routeParams.path}`).default
),
// component: () => import(`@/views/modules/${routeParams.path}`),
name: routeName,
meta: {
...window.SITE_CONFIG["contentTabDefault"],
menuId: routeParams.menuId,
title: `${routeParams.title}`,
},
};
router.addRoutes([
{
...moduleRoutes,
name: `main-dynamic__${dynamicRoute.name}`,
children: [dynamicRoute],
},
]);
window.SITE_CONFIG["dynamicRoutes"].push(dynamicRoute);
router.push({ name: dynamicRoute.name, params: routeParams.params });
}
const createRouter = () =>
new Router({
mode: "history",
scrollBehavior: () => ({ y: 0 }),
routes: pageRoutes.concat(moduleRoutes),
});
const router = createRouter();
// [vue-router] Duplicate named routes definition 重复的命名路由定义
// 动态路由退出再登录会出现警告重复路由
// 解决方案:在退出时调用resetRouter()方法
export function resetRouter() {
const newRouter = createRouter();
router.matcher = newRouter.matcher; // reset router
}
router.beforeEach((to, from, next) => {
// 添加动态(菜单)路由
// 已添加或者当前路由为页面路由, 可直接访问
if (
window.SITE_CONFIG["dynamicMenuRoutesHasAdded"] ||
fnCurrentRouteIsPageRoute(to, pageRoutes)
) {
return next();
}
if (to.path === from.path) {
return;
}
if (
to.name === "login" ||
to.path === "/login" ||
to.path === "satusScreen" ||
to.name === "satusScreen"
) {
next();
} else {
// 获取字典列表, 添加并全局变量保存
// http.get('/sys/dict/type/all').then(({ data: res }) => {
// if (res.code !== 0) {
// return
// }
// window.SITE_CONFIG['dictList'] = res.data
// }).catch(() => {})
// 获取左侧菜单列表,添加并全局变量保存
http
.get("/sys/menu/nav")
.then(({ data: res }) => {
if (res.code !== 0) {
Vue.prototype.$message.error(res.msg);
return next({ name: "login" });
}
window.SITE_CONFIG["menuList"] = res.data;
})
.catch(() => {
return next({ name: "login" });
});
// 获取菜单管理菜单列表,并添加动态路由
http
.get("/sys/menu/list", {
params: {
type: 0,
},
})
.then(({ data: res }) => {
if (res.code !== 0) {
Vue.prototype.$message.error(res.msg);
return next({ name: "login" });
}
// window.SITE_CONFIG['menuList'] = res.data
const menuListChild = res.data.filter(
(item) => item.children.length > 0
);
// console.log(menuListChild)
fnAddDynamicMenuRoutes(
JSON.parse(JSON.stringify(res.data)),
menuListChild.length
);
next({ ...to, replace: true });
})
.catch(() => {
// console.log(123)
return next({ name: "login" });
});
// 获取【字段字典表】, 添加并全局变量保存
// http.get('/sys/table/dict/getList', { params: { type: 1 }}).then(({ data: res }) => {
// window.SITE_CONFIG['dict_colSearch'] = res.data
// })
getInitData();
}
});
function getInitData() {
// 获取字典列表, 添加并全局变量保存
// http.get('/sys/dict/type/all').then(({ data: res }) => {
// if (res.code !== 0) { return }
// window.SITE_CONFIG['dictList'] = res.data
// })
// 获取【字段字典表】, 添加并全局变量保存
// http.get('/table/dict/optionsColumn').then(({ data: res }) => {
// window.SITE_CONFIG['dict_colAll'] = res.data
// })
//
// // 获取【字段字典表】, 添加并全局变量保存
// http.get('/table/dict/optionsColumn', { params: { type: 1 }}).then(({ data: res }) => {
// window.SITE_CONFIG['dict_colSearch'] = res.data
// })
//
// // 获取【字段字典表】, 添加并全局变量保存
// http.get('/table/dict/optionsColumn', { params: { type: 2 }}).then(({ data: res }) => {
// window.SITE_CONFIG['dict_colChart'] = res.data
// })
//
// // 获取【字段字典表】, 添加并全局变量保存
// http.get('/table/dict/optionsColumn', { params: { type: 3 }}).then(({ data: res }) => {
// window.SITE_CONFIG['dict_colCrf'] = res.data
// })
//
// // 获取【字段字典表】, 添加并全局变量保存
// http.get('/table/dict/optionsColumn', { params: { type: 4 }}).then(({ data: res }) => {
// window.SITE_CONFIG['dict_colExport'] = res.data
// })
// 获取【检查项目字典】, 添加并全局变量保存
// http.get('/table/dict/examItem').then(({ data: res }) => {
// sortChinese(res.data, 'itemName')
// window.SITE_CONFIG['dict_examItem'] = res.data
// })
// 获取【设备信息字典】, 添加并全局变量保存
// http.get('/device/getData2RelDeviceList').then(({ data: res }) => {
// window.SITE_CONFIG['dict_device'] = res.data
// })
// 获取【设备与检查项目字典】, 添加并全局变量保存
// http.get('/device/getData2RelDeviceItemList').then(({ data: res }) => {
// window.SITE_CONFIG['dict_device_item'] = res.data
// })
}
/**
* 判断当前路由是否为页面路由
* @param {*} route 当前路由
* @param {*} pageRoutes 页面路由
*/
function fnCurrentRouteIsPageRoute(route, pageRoutes = []) {
var temp = [];
for (var i = 0; i < pageRoutes.length; i++) {
if (route.path === pageRoutes[i].path) {
return true;
}
if (pageRoutes[i].children && pageRoutes[i].children.length >= 1) {
temp = temp.concat(pageRoutes[i].children);
}
}
return temp.length >= 1 ? fnCurrentRouteIsPageRoute(route, temp) : false;
}
/**
* 添加动态(菜单)路由
* PH自上而下遍历累积平铺
* @param {*} menuList 菜单列表
* @param {*} routes 递归创建的动态(菜单)路由
*/
function fnAddDynamicMenuRoutes(
menuList = [],
menuListChildLength,
routes = []
) {
let index = 0;
// console.log(menuList)
menuList.forEach((item, i) => {
// eslint-disable-next-line
let URL = (item.url || "").replace(/{{([^}}]+)?}}/g, (s1, s2) => eval(s2)); // URL支持{{ window.xxx }}占位符变量
item["meta"] = {
...window.SITE_CONFIG["contentTabDefault"],
menuId: item.id,
title: item.name,
};
if (isURL(URL)) {
item["path"] = item["name"] = `i-${item.id}`;
item["meta"].push({
iframeURL: URL,
});
} else {
// console.log(URL)
URL = URL.replace(/^\//, "").replace(/_/g, "-");
item["path"] = "/" + URL.replace(/\//g, "-");
item["name"] = URL.replace(/\//g, "-");
// 坑!!!父级也必须要有component,父级要有自己的vue组件,父级路由必须有<router-view />占位符
// 其孩子children才能展示出来,孩子展示在父级占位符的地方
URL.includes("seeDoctor") ? (URL = "seeDoctor") : ""; // 不同父级有相同子级seeDoctor,防止面包屑冲突,动态路由名字区分设置为seeDoctor、seeDoctorOne,在寻找组件时替换回seeDoctor,可以找到对应组件路径
item["component"] = () =>
Promise.resolve(
require(`@/page-subspecialty/views/modules/${URL}`).default
);
// 如果是父级给父级添加重定向到子菜单第一项
if (item.children.length > 0 && item.children[0].url) {
// console.log(item)
// isShow:0显示不菜单 1显示菜单
item.children[0].isShow === 0
? ""
: (item["redirect"] = "/" + item.children[0].url.replace(/\//g, "-"));
}
}
if (item.children.length > 0) {
index++;
fnAddDynamicMenuRoutes(item.children);
}
});
// routes = menuList
// console.log(routes)
// 此处一定要加判断,因为此方法在递归,要等到递归完成后再执行下面的内容
// 坑!!!如果不加此判断,this.$route.matched面包屑的父级就不会展示
if (menuListChildLength === index) {
routes = menuList;
// PH:底层调用一次
// 添加路由
router.addRoutes([
{
...moduleRoutes,
name: "main-dynamic-menu",
children: [...routes],
},
{ path: "*", redirect: { name: "404" } },
]);
// console.log('----------------------')
window.SITE_CONFIG["dynamicMenuRoutes"] = routes;
window.SITE_CONFIG["dynamicMenuRoutesHasAdded"] = true;
}
}
export default router;