|
@@ -12,7 +12,7 @@
|
|
|
]"
|
|
|
@click="toMenu(menu)"
|
|
|
>
|
|
|
- <i :class="menu.icon"></i>
|
|
|
+ <i :class="['icon', `icon-${MENU_ICONS[menu.url]}`]"></i>
|
|
|
<span>{{ menu.name }}</span>
|
|
|
</li>
|
|
|
</ul>
|
|
@@ -32,48 +32,48 @@
|
|
|
</li>
|
|
|
</ul>
|
|
|
</div>
|
|
|
- <div class="head-menu-btn" @click="showMenu">
|
|
|
- <span><i class="el-icon-menu"></i></span>
|
|
|
- </div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="home-navs" v-if="curMenu.children">
|
|
|
+ <div class="home-navs">
|
|
|
<div class="head-logo">
|
|
|
- <img v-if="schoolLogo" :src="schoolLogo" alt="分布式印刷" />
|
|
|
- <h1 v-else>分布式印刷</h1>
|
|
|
+ <div class="head-logo-content">
|
|
|
+ <img v-if="schoolLogo" :src="schoolLogo" alt="分布式印刷" />
|
|
|
+ <h1 v-else>分布式印刷</h1>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div
|
|
|
- v-for="(submenu, sindex) in curMenu.children"
|
|
|
- :key="sindex"
|
|
|
- class="nav-part"
|
|
|
+
|
|
|
+ <el-menu
|
|
|
+ class="el-menu-home"
|
|
|
+ active-text-color="#705eff"
|
|
|
+ text-color="#383b4a"
|
|
|
+ router
|
|
|
+ :default-active="curRouteName"
|
|
|
+ :default-openeds="curSubMenuNames"
|
|
|
>
|
|
|
- <div class="nav-head">
|
|
|
- <span>{{ submenu.name }}</span>
|
|
|
- <i class="nav-head-right-icon el-icon-caret-bottom"></i>
|
|
|
- </div>
|
|
|
- <ul class="nav-list">
|
|
|
- <li
|
|
|
- class="nav-item"
|
|
|
- v-for="(nav, navNo) in submenu.children"
|
|
|
- :key="navNo"
|
|
|
+ <el-submenu
|
|
|
+ v-for="submenu in curMenu.children"
|
|
|
+ :key="submenu.id"
|
|
|
+ :index="submenu.url"
|
|
|
+ >
|
|
|
+ <template slot="title">
|
|
|
+ <span>{{ submenu.name }}</span>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-menu-item
|
|
|
+ v-for="nav in submenu.children"
|
|
|
+ :key="nav.id"
|
|
|
+ :index="nav.url"
|
|
|
+ :route="{ name: nav.url }"
|
|
|
>
|
|
|
- <div
|
|
|
- :class="[
|
|
|
- 'nav-item-main',
|
|
|
- { 'nav-item-main-act': curActNav === nav.url }
|
|
|
- ]"
|
|
|
- @click="toNav(nav)"
|
|
|
+ <span>{{ nav.name }}</span>
|
|
|
+ <span
|
|
|
+ class="nav-item-info"
|
|
|
+ v-if="nav.url === 'WaitTask' && waitTaskCount"
|
|
|
+ >{{ waitTaskCount }}</span
|
|
|
>
|
|
|
- <p class="nav-item-cont">{{ nav.name }}</p>
|
|
|
- <span
|
|
|
- class="nav-item-info"
|
|
|
- v-if="nav.url === 'WaitTask' && waitTaskCount"
|
|
|
- >{{ waitTaskCount }}</span
|
|
|
- >
|
|
|
- </div>
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
- </div>
|
|
|
+ </el-menu-item>
|
|
|
+ </el-submenu>
|
|
|
+ </el-menu>
|
|
|
</div>
|
|
|
|
|
|
<div class="home-body">
|
|
@@ -84,11 +84,9 @@
|
|
|
<span>当前所在位置:</span>
|
|
|
</span>
|
|
|
<el-breadcrumb separator="/">
|
|
|
- <el-breadcrumb-item
|
|
|
- v-for="(bread, index) in breadcrumbs"
|
|
|
- :key="index"
|
|
|
- >{{ bread.title }}</el-breadcrumb-item
|
|
|
- >
|
|
|
+ <el-breadcrumb-item v-for="bread in breadcrumbs" :key="bread.url">{{
|
|
|
+ bread.name
|
|
|
+ }}</el-breadcrumb-item>
|
|
|
</el-breadcrumb>
|
|
|
</div>
|
|
|
|
|
@@ -99,70 +97,6 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <!-- popover menu-->
|
|
|
- <el-dialog
|
|
|
- class="menu-dialog"
|
|
|
- :visible.sync="menuDailogIsShow"
|
|
|
- title="导航菜单"
|
|
|
- top="60px"
|
|
|
- fullscreen
|
|
|
- :close-on-click-modal="false"
|
|
|
- :close-on-press-escape="false"
|
|
|
- append-to-body
|
|
|
- >
|
|
|
- <div
|
|
|
- class="home-navs home-navs-full"
|
|
|
- v-for="(curMenu, mainNo) in menus"
|
|
|
- :key="mainNo"
|
|
|
- >
|
|
|
- <div
|
|
|
- v-for="(submenu, sindex) in curMenu.children"
|
|
|
- :key="sindex"
|
|
|
- class="nav-part"
|
|
|
- >
|
|
|
- <div class="nav-head">
|
|
|
- <i :class="submenu.icon"></i>
|
|
|
- <span>{{ curMenu.name }} - {{ submenu.name }}</span>
|
|
|
- </div>
|
|
|
- <ul class="nav-list">
|
|
|
- <li
|
|
|
- class="nav-item"
|
|
|
- v-for="(nav, navNo) in submenu.children"
|
|
|
- :key="navNo"
|
|
|
- >
|
|
|
- <div
|
|
|
- :class="[
|
|
|
- 'nav-item-main',
|
|
|
- { 'nav-item-main-act': curActNav === nav.url }
|
|
|
- ]"
|
|
|
- @click="toNav(nav)"
|
|
|
- >
|
|
|
- <p class="nav-item-cont">{{ nav.name }}</p>
|
|
|
- <span class="nav-item-icon nav-item-icon-right">
|
|
|
- <i
|
|
|
- :class="[
|
|
|
- 'icon',
|
|
|
- curActNav === nav.url
|
|
|
- ? 'icon-arrow-right-act'
|
|
|
- : 'icon-arrow-right'
|
|
|
- ]"
|
|
|
- ></i>
|
|
|
- </span>
|
|
|
- <span
|
|
|
- class="nav-item-info"
|
|
|
- v-if="nav.url === 'WaitTask' && waitTaskCount"
|
|
|
- >{{ waitTaskCount }}</span
|
|
|
- >
|
|
|
- </div>
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="menu-logout" @click="toLogout">
|
|
|
- <i class="el-icon-switch-button"></i>
|
|
|
- </div>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
<!-- 修改密码 -->
|
|
|
<reset-pwd
|
|
|
:user-info="userInfo"
|
|
@@ -175,11 +109,16 @@
|
|
|
<script>
|
|
|
import { mapState, mapActions } from "vuex";
|
|
|
import localNavs from "@/constants/navs";
|
|
|
-import { deepCopy } from "@/plugins/utils";
|
|
|
import { sysMenu, logout } from "../modules/login/api";
|
|
|
import ResetPwd from "../modules/base/components/ResetPwd";
|
|
|
import { SYS_ADMIN_NAME } from "@/constants/enumerate";
|
|
|
|
|
|
+const MENU_ICONS = {
|
|
|
+ base: "base",
|
|
|
+ exam: "exam",
|
|
|
+ customer: "customer"
|
|
|
+};
|
|
|
+
|
|
|
export default {
|
|
|
name: "home",
|
|
|
components: { ResetPwd },
|
|
@@ -188,16 +127,18 @@ export default {
|
|
|
const IS_SUPER_ADMIN = user.loginName === SYS_ADMIN_NAME;
|
|
|
|
|
|
return {
|
|
|
+ MENU_ICONS,
|
|
|
+ privileges: [],
|
|
|
menus: [],
|
|
|
curMenu: { url: "", children: [] },
|
|
|
- curActNav: "",
|
|
|
+ curRouteName: "",
|
|
|
+ curSubMenuNames: [],
|
|
|
breadcrumbs: [],
|
|
|
validRoutes: [],
|
|
|
username: user.realName,
|
|
|
userRoles: user.roleList,
|
|
|
schoolLogo: this.$ls.get("schoolLogo"),
|
|
|
schoolName: this.$ls.get("schoolName"),
|
|
|
- menuDailogIsShow: false,
|
|
|
userInfo: {
|
|
|
pwdCount: 0,
|
|
|
mobileNumber: 1,
|
|
@@ -216,7 +157,7 @@ export default {
|
|
|
...mapState("exam", ["waitTaskCount"])
|
|
|
},
|
|
|
created() {
|
|
|
- this.getMenus();
|
|
|
+ this.initData();
|
|
|
},
|
|
|
methods: {
|
|
|
...mapActions("exam", ["updateWaitTaskCount"]),
|
|
@@ -230,16 +171,17 @@ export default {
|
|
|
this.actCurNav();
|
|
|
}
|
|
|
},
|
|
|
- async getMenus() {
|
|
|
- // TODO:根据后台返回页面层级展示菜单,前端不再维护菜单树
|
|
|
+ async initData() {
|
|
|
const data = await sysMenu();
|
|
|
+ this.privileges = data.privileges;
|
|
|
+ this.menus = this.getMenu();
|
|
|
+ this.toMenu(this.menus[0]);
|
|
|
this.initPrivilegeMap(data.privileges);
|
|
|
- const { menus, firstRouter } = this.menusToTree(data.privileges);
|
|
|
- this.menus = menus;
|
|
|
|
|
|
if (this.$route.name === "Home") {
|
|
|
+ const firstRouteName = this.getFirstRouter();
|
|
|
this.$router.replace({
|
|
|
- name: firstRouter
|
|
|
+ name: firstRouteName
|
|
|
});
|
|
|
return;
|
|
|
} else {
|
|
@@ -249,9 +191,42 @@ export default {
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- this.actCurNav();
|
|
|
+ this.actCurNav();
|
|
|
+ },
|
|
|
+ getMenu() {
|
|
|
+ let menus = this.privileges.filter(item => item.parentId === "-1");
|
|
|
+ let validRoutes = [];
|
|
|
+ const toTree = menus => {
|
|
|
+ menus.forEach(menu => {
|
|
|
+ const children = this.privileges.filter(
|
|
|
+ item => item.parentId === menu.id
|
|
|
+ );
|
|
|
+ if (children.length) {
|
|
|
+ menu.children = children;
|
|
|
+ toTree(menu.children);
|
|
|
+ } else {
|
|
|
+ validRoutes.push(menu.url);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+ toTree(menus);
|
|
|
+
|
|
|
+ this.validRoutes = validRoutes;
|
|
|
+ return menus;
|
|
|
+ },
|
|
|
+ getFirstRouter() {
|
|
|
+ let childNavs = this.privileges;
|
|
|
+ let firstRouteName = "";
|
|
|
+ while (childNavs.length) {
|
|
|
+ firstRouteName = childNavs[0].url;
|
|
|
+ childNavs = this.privileges.filter(
|
|
|
+ item => item.parentId === childNavs[0].id
|
|
|
+ );
|
|
|
}
|
|
|
+
|
|
|
+ return firstRouteName;
|
|
|
},
|
|
|
initPrivilegeMap(data) {
|
|
|
let privilegeMap = {};
|
|
@@ -275,83 +250,33 @@ export default {
|
|
|
this.$store.commit("setPrivilegeMap", privilegeMap);
|
|
|
this.$ls.set("privilegeMap", privilegeMap);
|
|
|
},
|
|
|
- menusToTree(menus) {
|
|
|
- let navTree = deepCopy(localNavs);
|
|
|
- let validRoutes = [];
|
|
|
- let validMenuDict = {};
|
|
|
- let firstRouter = "";
|
|
|
- menus.forEach(item => (validMenuDict[item.url] = item.name));
|
|
|
-
|
|
|
- const anchorNav = menus => {
|
|
|
- let list = [];
|
|
|
- menus.forEach(item => {
|
|
|
- const routerOrName = item.url;
|
|
|
- if (!validMenuDict[routerOrName]) return;
|
|
|
-
|
|
|
- if (!firstRouter && item.isRouter) firstRouter = item.url;
|
|
|
- item.name = validMenuDict[routerOrName];
|
|
|
- validRoutes.push(routerOrName);
|
|
|
- let navItem = { ...item };
|
|
|
- if (item["children"]) {
|
|
|
- navItem.children = anchorNav(item.children);
|
|
|
- }
|
|
|
- list.push(navItem);
|
|
|
- });
|
|
|
- return list;
|
|
|
- };
|
|
|
-
|
|
|
- this.validRoutes = validRoutes;
|
|
|
-
|
|
|
- return { menus: anchorNav(navTree), firstRouter };
|
|
|
+ getSubMenus(menu) {
|
|
|
+ return this.privileges.filter(
|
|
|
+ m => m.parentId === menu.id && m.type === "MENU"
|
|
|
+ );
|
|
|
},
|
|
|
toMenu(menu) {
|
|
|
if (this.curMenu.url === menu.url) return;
|
|
|
this.curMenu = menu;
|
|
|
- const firstRouter = menu.children[0].children[0];
|
|
|
- this.toNav(firstRouter);
|
|
|
- },
|
|
|
- toNav(nav) {
|
|
|
- if (nav.url === this.$route.name) return;
|
|
|
- this.curActNav = nav.url;
|
|
|
- this.$router.push({ name: nav.url });
|
|
|
- this.menuDailogIsShow = false;
|
|
|
+
|
|
|
+ this.curSubMenuNames = this.privileges
|
|
|
+ .filter(item => item.parentId === menu.id)
|
|
|
+ .map(item => item.url);
|
|
|
},
|
|
|
actCurNav() {
|
|
|
- const routerName = this.$route.name;
|
|
|
+ this.curRouteName = this.$route.name;
|
|
|
let breadcrumbs = [];
|
|
|
- const getRouterPath = (navs, pathList) => {
|
|
|
- navs.forEach(nav => {
|
|
|
- let navPathList = [...pathList];
|
|
|
- if (breadcrumbs.length) return;
|
|
|
- if (nav.url === routerName) {
|
|
|
- breadcrumbs = [
|
|
|
- ...navPathList,
|
|
|
- { title: nav.name, router: nav.url, isRouter: true }
|
|
|
- ];
|
|
|
- return;
|
|
|
- } else {
|
|
|
- navPathList = [
|
|
|
- ...navPathList,
|
|
|
- {
|
|
|
- title: nav.name,
|
|
|
- router: nav.url,
|
|
|
- isRouter: !!nav.isRouter
|
|
|
- }
|
|
|
- ];
|
|
|
- if (nav["children"]) {
|
|
|
- getRouterPath(nav.children, navPathList);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- getRouterPath(this.menus, []);
|
|
|
-
|
|
|
- const curRouter = breadcrumbs.find(item => item.isRouter);
|
|
|
- this.curActNav = curRouter.router;
|
|
|
- this.curMenu = this.menus.find(
|
|
|
- menu => menu.url === breadcrumbs[0].router
|
|
|
+ let curBreadcrumb = this.privileges.find(
|
|
|
+ item => item.url === this.curRouteName
|
|
|
);
|
|
|
+ breadcrumbs.push({ ...curBreadcrumb });
|
|
|
+
|
|
|
+ while (curBreadcrumb && curBreadcrumb.parentId !== "-1") {
|
|
|
+ curBreadcrumb = this.privileges.find(
|
|
|
+ item => item.id === curBreadcrumb.parentId
|
|
|
+ );
|
|
|
+ if (curBreadcrumb) breadcrumbs.unshift({ ...curBreadcrumb });
|
|
|
+ }
|
|
|
|
|
|
this.breadcrumbs = breadcrumbs;
|
|
|
|
|
@@ -385,14 +310,6 @@ export default {
|
|
|
},
|
|
|
resetPwdModified() {
|
|
|
this.logoutAction();
|
|
|
- },
|
|
|
- // popover menu
|
|
|
- showMenu() {
|
|
|
- this.menuDailogIsShow = !this.menuDailogIsShow;
|
|
|
- },
|
|
|
- toNavDetail(mainNo, subNo) {
|
|
|
- this.toNav(subNo);
|
|
|
- this.showMenu();
|
|
|
}
|
|
|
}
|
|
|
};
|