123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- <template>
- <div :class="['home', { 'home-page-main': IS_HOME_PAGE }]">
- <div class="home-header">
- <div class="head-menu menu-list">
- <ul>
- <li
- v-for="(menu, index) in menus"
- :key="index"
- :class="[
- 'menu-item',
- { 'menu-item-act': curMenu.url === menu.url }
- ]"
- @click="toMenu(menu)"
- >
- <!-- <i
- :class="[
- 'icon',
- MENU_ICONS[menu.url]
- ? `icon-${MENU_ICONS[menu.url]}`
- : 'icon-workspace'
- ]"
- ></i> -->
- <span>{{ menu.name }}</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="toResetPwd">
- <i class="icon icon-account"></i>
- <span :title="username">{{ username }}</span>
- </li>
- <li class="menu-item" @click="toLogout">
- <i class="icon icon-logout" title="退出登录"></i>
- </li>
- </ul>
- </div>
- </div>
- <div class="home-navs">
- <div class="head-logo">
- <div class="head-logo-content" @click="toHomePage">
- <img v-if="schoolLogo" :src="schoolLogo" alt="知学知考" />
- <h1 v-else>知学知考</h1>
- </div>
- </div>
- <el-menu
- v-if="curMenu.children && curMenu.children.length"
- class="el-menu-home"
- active-text-color="#3a5ae5"
- text-color="#434656"
- router
- :default-active="curRouteName"
- :default-openeds="curSubMenuNames"
- >
- <template v-for="submenu in curMenu.children">
- <el-submenu
- v-if="submenu.children && submenu.children.length"
- :key="submenu.id"
- :index="submenu.url"
- >
- <span slot="title">{{ submenu.name }}</span>
- <el-menu-item
- v-for="nav in submenu.children"
- :key="nav.id"
- :index="nav.url"
- :route="{ name: nav.url }"
- >
- <span>{{ nav.name }}</span>
- <span
- class="nav-item-info"
- v-if="nav.url === 'WaitTask' && waitTaskCount"
- >{{ waitTaskCount }}</span
- >
- </el-menu-item>
- </el-submenu>
- <el-menu-item
- v-else
- :key="submenu.id"
- :index="submenu.url"
- :route="{ name: submenu.url }"
- >
- <span>{{ submenu.name }}</span>
- </el-menu-item>
- </template>
- </el-menu>
- </div>
- <div class="home-body">
- <div class="home-body-content">
- <div class="home-breadcrumb" v-if="breadcrumbs.length">
- <span class="breadcrumb-tips">
- <i class="icon icon-location"></i>
- <span>当前所在位置:</span>
- </span>
- <el-breadcrumb separator="/">
- <el-breadcrumb-item v-for="bread in breadcrumbs" :key="bread.url">{{
- bread.name
- }}</el-breadcrumb-item>
- </el-breadcrumb>
- </div>
- <!-- home-view: page detail -->
- <div class="home-view">
- <router-view />
- </div>
- </div>
- </div>
- <!-- 修改密码 -->
- <reset-pwd
- :user-info="userInfo"
- ref="ResetPwd"
- @modified="resetPwdModified"
- ></reset-pwd>
- </div>
- </template>
- <script>
- import { mapState, mapActions } from "vuex";
- import localMenus from "@/constants/menus-data";
- 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",
- stmms: "book"
- };
- export default {
- name: "home",
- components: { ResetPwd },
- data() {
- const user = this.$ls.get("user", { id: "", realName: "", roleList: [] });
- const IS_SUPER_ADMIN = user.loginName === SYS_ADMIN_NAME;
- return {
- MENU_ICONS,
- privileges: [],
- menus: [],
- curMenu: { url: "", children: [] },
- curRouteName: "",
- curSubMenuNames: [],
- breadcrumbs: [],
- validRoutes: [],
- username: user.realName,
- userRoles: user.roleList,
- schoolLogo: this.$ls.get("schoolLogo"),
- schoolName: this.$ls.get("schoolName"),
- userInfo: {
- pwdCount: 0,
- mobileNumber: 1,
- userId: user.id
- },
- IS_SUPER_ADMIN
- };
- },
- watch: {
- $route(val) {
- if (val.name === "Home") return;
- if (this.$route.name === "HomePage") {
- this.curMenu = { url: "", children: [] };
- return;
- }
- this.routerChange();
- }
- },
- computed: {
- ...mapState("exam", ["waitTaskCount"]),
- IS_HOME_PAGE() {
- return this.$route.name === "HomePage";
- }
- },
- created() {
- // this.initData1();
- this.initData();
- },
- methods: {
- ...mapActions("exam", ["updateWaitTaskCount"]),
- initData1() {
- // 开发阶段专用
- this.initPrivilegeMap(localMenus);
- this.privileges = this.transformMenu(localMenus);
- this.menus = this.getMenu();
- if (this.IS_HOME_PAGE) return;
- if (this.$route.name === "Home") {
- this.$router.replace({
- name: "HomePage"
- });
- return;
- }
- if (!this.validRoutes.includes(this.$route.name)) {
- this.$router.replace({
- name: "404"
- });
- return;
- }
- this.updateBreadcrumbs();
- const curMenu = this.menus.find(
- menu => menu.url === this.breadcrumbs[0].url
- );
- this.menuChange(curMenu);
- if (
- this.validRoutes.includes("WaitTask") &&
- this.curMenu.url === "exam"
- ) {
- this.updateWaitTaskCount();
- }
- },
- async initData() {
- const data = await sysMenu();
- this.initPrivilegeMap(data.privileges);
- this.privileges = this.transformMenu(data.privileges);
- this.menus = this.getMenu();
- if (this.IS_HOME_PAGE) return;
- if (this.$route.name === "Home") {
- this.$router.replace({
- name: "HomePage"
- });
- return;
- }
- if (!this.validRoutes.includes(this.$route.name)) {
- this.$router.replace({
- name: "404"
- });
- return;
- }
- this.updateBreadcrumbs();
- const curMenu = this.menus.find(
- menu => menu.url === this.breadcrumbs[0].url
- );
- this.menuChange(curMenu);
- if (
- this.validRoutes.includes("WaitTask") &&
- this.curMenu.url === "exam"
- ) {
- this.updateWaitTaskCount();
- }
- },
- transformMenu(list) {
- return list.map(item => {
- return {
- id: item.id,
- parentId: item.parentId,
- name: item.name,
- type: item.type,
- url: item.url
- };
- });
- },
- getMenu() {
- const getChildren = id => {
- return this.privileges
- .filter(item => item.parentId === id)
- .map(item => {
- return { ...item };
- });
- };
- let menus = getChildren("-1");
- let validRoutes = [];
- const toTree = menus => {
- menus.forEach(menu => {
- const children = getChildren(menu.id);
- if (children.length) {
- menu.children = children;
- toTree(menu.children);
- } else {
- validRoutes.push(menu.url);
- }
- });
- };
- toTree(menus);
- this.validRoutes = validRoutes;
- // console.log(JSON.stringify(menus));
- return menus;
- },
- getCurMenuFirstRouter() {
- let firstRouteName = "";
- let menu = this.curMenu;
- while (menu) {
- firstRouteName = menu.url;
- menu = menu.children && menu.children[0];
- }
- return firstRouteName;
- },
- initPrivilegeMap(data) {
- let privilegeMap = {};
- const pageSetTypes = ["conditions", "buttons", "lists", "links"];
- data.forEach(item => {
- // const isPage = [...pageSetTypes, "urls"].some(
- // type => item[type] && item[type].length
- // );
- // if (!isPage) return;
- privilegeMap[item.url] = [];
- pageSetTypes.forEach((type, index) => {
- if (item[type] && item[type].length) {
- item[type].forEach(elem => {
- privilegeMap[item.url].push(
- `${elem.type}_${elem.url}`.toLowerCase()
- );
- });
- }
- });
- });
- this.$store.commit("setPrivilegeMap", privilegeMap);
- this.$ls.set("privilegeMap", privilegeMap);
- },
- menuChange(menu) {
- this.curMenu = menu;
- this.curSubMenuNames = this.privileges
- .filter(item => item.parentId === menu.id)
- .map(item => item.url);
- },
- toMenu(menu) {
- if (this.curMenu.url === menu.url) return;
- this.menuChange(menu);
- const firstRouteName = this.getCurMenuFirstRouter();
- this.$router.replace({
- name: firstRouteName
- });
- },
- updateBreadcrumbs() {
- this.curRouteName = this.$route.name;
- let breadcrumbs = [];
- 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;
- },
- routerChange() {
- this.updateBreadcrumbs();
- if (!this.curMenu.url) {
- // 从HomePage快捷菜单跳转过来的
- const curMenu = this.menus.find(
- menu => menu.url === this.breadcrumbs[0].url
- );
- this.menuChange(curMenu);
- }
- if (
- this.validRoutes.includes("WaitTask") &&
- this.curMenu.url === "exam"
- ) {
- this.updateWaitTaskCount();
- }
- },
- toLogout() {
- this.$confirm("确定要退出登录吗?", "提示", {
- type: "warning"
- })
- .then(() => {
- this.logoutAction();
- })
- .catch(() => {});
- },
- async logoutAction() {
- await logout();
- this.$ls.clear();
- this.$router.push({ name: "Login" });
- },
- toHomePage() {
- this.$router.push({ name: "HomePage" });
- },
- toSelectSchool() {
- if (this.IS_SUPER_ADMIN) this.$router.push({ name: "SelectSchool" });
- },
- toResetPwd() {
- if (this.IS_SUPER_ADMIN) return;
- this.$refs.ResetPwd.open();
- },
- resetPwdModified() {
- this.logoutAction();
- },
- // other
- getSubMenus(menu) {
- return this.privileges.filter(
- m => m.parentId === menu.id && m.type === "MENU"
- );
- },
- 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;
- }
- }
- };
- </script>
|