123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- <template>
- <div class="home">
- <div class="home-header">
- <div class="head-logo">
- <img v-if="schoolLogo" :src="schoolLogo" alt="分布式印刷" />
- <h1 v-else>分布式印刷</h1>
- </div>
- <div class="head-menu menu-list">
- <ul>
- <li
- v-for="(menu, index) in menus"
- :key="index"
- :class="[
- 'menu-item',
- { 'menu-item-act': curMenu.name === menu.name }
- ]"
- @click="toMenu(menu)"
- >
- <i :class="menu.icon"></i>
- <span>{{ menu.title }}</span>
- </li>
- </ul>
- </div>
- <div class="head-user menu-list">
- <ul>
- <li v-if="schoolName" @click="toSelectSchool" title="切换学校">
- <i class="el-icon-s-home"></i>
- <span>{{ schoolName }}</span>
- </li>
- <li
- class="menu-item menu-item-account"
- @click="$refs.ResetPwd.open()"
- >
- <i class="el-icon-s-custom"></i>
- <span :title="username">{{ username }}</span>
- </li>
- <li class="menu-item" @click="toLogout">
- <i class="el-icon-switch-button"></i>
- <span>退出登录</span>
- </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
- v-for="(submenu, sindex) in curMenu.children"
- :key="sindex"
- class="nav-part"
- >
- <div class="nav-head">
- <i :class="submenu.icon"></i>
- <span>{{ submenu.title }}</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.router }
- ]"
- @click="toNav(nav)"
- >
- <p class="nav-item-cont">{{ nav.title }}</p>
- <span class="nav-item-icon nav-item-icon-right">
- <i
- :class="[
- 'icon',
- curActNav === nav.router
- ? 'icon-arrow-right-act'
- : 'icon-arrow-right'
- ]"
- ></i>
- </span>
- <span
- class="nav-item-info"
- v-if="nav.router === 'WaitTask' && waitTaskCount"
- >{{ waitTaskCount }}</span
- >
- </div>
- </li>
- </ul>
- </div>
- </div>
- <div class="home-body">
- <div class="home-main">
- <div class="home-breadcrumb" v-if="breadcrumbs.length">
- <el-breadcrumb separator=">">
- <el-breadcrumb-item>
- <i class="el-icon-s-home" style="margin-top: -2px;"></i>
- </el-breadcrumb-item>
- <el-breadcrumb-item
- v-for="(bread, index) in breadcrumbs"
- :key="index"
- >{{ bread.title }}</el-breadcrumb-item
- >
- </el-breadcrumb>
- </div>
- <!-- home-view: page detail -->
- <div class="home-view">
- <router-view />
- </div>
- </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.title }} - {{ submenu.title }}</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.router }
- ]"
- @click="toNav(nav)"
- >
- <p class="nav-item-cont">{{ nav.title }}</p>
- <span class="nav-item-icon nav-item-icon-right">
- <i
- :class="[
- 'icon',
- curActNav === nav.router
- ? 'icon-arrow-right-act'
- : 'icon-arrow-right'
- ]"
- ></i>
- </span>
- <span
- class="nav-item-info"
- v-if="nav.router === '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 @modified="logoutAction" ref="ResetPwd"></reset-pwd>
- </div>
- </template>
- <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";
- export default {
- name: "home",
- components: { ResetPwd },
- data() {
- return {
- menus: [],
- curMenu: { name: "" },
- curActNav: "",
- breadcrumbs: [],
- validRoutes: [],
- username: this.$ls.get("user", { realName: "" }).realName,
- userRoles: this.$ls.get("user", { roleList: [] }).roleList,
- schoolLogo: this.$ls.get("schoolLogo"),
- schoolName: this.$ls.get("schoolName"),
- menuDailogIsShow: false
- };
- },
- watch: {
- $route(val) {
- if (val.name === "Home") return;
- this.actCurNav();
- }
- },
- computed: {
- ...mapState("exam", ["waitTaskCount"])
- },
- created() {
- this.getMenus();
- },
- methods: {
- ...mapActions("exam", ["updateWaitTaskCount"]),
- getMenus1() {
- this.menus = localNavs;
- if (this.$route.name === "Home") {
- this.$router.replace({
- name: "ExamTaskManage"
- });
- } else {
- this.actCurNav();
- }
- },
- async getMenus() {
- const data = await sysMenu();
- const { menus, firstRouter } = this.menusToTree(data);
- console.log(menus, firstRouter);
- this.menus = menus;
- if (this.$route.name === "Home") {
- this.$router.replace({
- name: firstRouter
- });
- return;
- } else {
- if (!this.validRoutes.includes(this.$route.name)) {
- this.$router.replace({
- name: "404"
- });
- return;
- }
- this.actCurNav();
- }
- },
- 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["router"] || item["name"];
- if (!validMenuDict[routerOrName]) return;
- if (!firstRouter && item["router"]) firstRouter = item["router"];
- item.title = 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 };
- },
- toMenu(menu) {
- this.curMenu = menu;
- const firstRouter = menu.children[0].children[0];
- this.toNav(firstRouter);
- },
- toNav(nav) {
- if (nav.router === this.$route.name) return;
- this.curActNav = nav.router;
- this.$router.push({ name: nav.router });
- this.menuDailogIsShow = false;
- },
- actCurNav() {
- const routerName = this.$route.name;
- let breadcrumbs = [];
- const getRouterPath = (navs, pathList) => {
- navs.forEach(nav => {
- let navPathList = [...pathList];
- if (breadcrumbs.length) return;
- if (nav["router"] === routerName) {
- breadcrumbs = [
- ...navPathList,
- { title: nav.title, router: nav.router, isRouter: true }
- ];
- return;
- } else {
- const routerOrName = nav["router"] || nav["name"];
- navPathList = [
- ...navPathList,
- {
- title: nav.title,
- router: routerOrName,
- isRouter: !!nav["router"]
- }
- ];
- 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.name === breadcrumbs[0].router
- );
- this.breadcrumbs = breadcrumbs;
- if (
- this.validRoutes.includes("WaitTask") &&
- this.curMenu.name === "exam"
- ) {
- this.updateWaitTaskCount(this.userRoles);
- }
- },
- toLogout() {
- this.$confirm("确定要退出登录吗?", "提示", {
- cancelButtonClass: "el-button--danger is-plain",
- confirmButtonClass: "el-button--primary",
- type: "warning"
- })
- .then(() => {
- this.logoutAction();
- })
- .catch(() => {});
- },
- async logoutAction() {
- await logout();
- this.$ls.clear();
- this.$router.push({ name: "Login" });
- },
- toSelectSchool() {
- this.$router.push({ name: "SelectSchool" });
- },
- // popover menu
- showMenu() {
- this.menuDailogIsShow = !this.menuDailogIsShow;
- },
- toNavDetail(mainNo, subNo) {
- this.toNav(subNo);
- this.showMenu();
- }
- }
- };
- </script>
|