123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- <template>
- <el-menu
- class="top-submenu"
- :default-active="activeMenu"
- mode="horizontal"
- >
- <template v-for="(item, index) in topMenus">
- <el-menu-item :style="{'--theme': theme}" @click="handleSelect(item)" :index="item.path" :key="index" v-if="index < visibleNumber">
- <!--<svg-icon :icon-class="item.meta.icon" />-->
- {{ item.meta.title }}
- </el-menu-item>
- </template>
- <!-- 顶部菜单超出数量折叠 -->
- <el-submenu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber">
- <template slot="title">更多</template>
- <template v-for="(item, index) in topMenus">
- <el-menu-item
- @click="handleSelect(item)"
- class="all-menu"
- :index="item.path"
- :key="index"
- v-if="index >= visibleNumber">
- <!--<svg-icon :icon-class="item.meta.icon" />-->
- {{ item.meta.title }}
- </el-menu-item>
- </template>
- </el-submenu>
- </el-menu>
- </template>
- <script>
- import { constantRoutes } from "@/router";
- import store from '@/store'
- export default {
- data() {
- return {
- // 顶部栏初始数
- visibleNumber: 5,
- // 是否为首次加载
- isFrist: false,
- // 当前激活菜单的 index
- currentIndex: undefined,
- routerType:true,
- };
- },
- computed: {
- theme() {
- return this.$store.state.settings.theme;
- },
- // 顶部显示菜单
- topMenus() {
- let topMenus = [];
- this.routers.map((menu) => {
- if (menu.hidden !== true) {
- // 兼容顶部栏一级菜单内部跳转
- if (menu.path === "/") {
- topMenus.push(menu.children[0]);
- } else {
- topMenus.push(menu);
- }
- }
- });
- return topMenus;
- },
- // 所有的路由信息
- routers() {
- return this.$store.state.permission.topbarRouters;
- },
- // 设置子路由
- childrenMenus() {
- var childrenMenus = [];
- this.routers.map((router) => {
- for (var item in router.children) {
- if (router.children[item].parentPath === undefined) {
- if(router.path === "/") {
- router.children[item].path = "/redirect/" + router.children[item].path;
- } else {
- if(!this.ishttp(router.children[item].path)) {
- router.children[item].path = router.path + "/" + router.children[item].path;
- }
- }
- router.children[item].parentPath = router.path;
- }
- childrenMenus.push(router.children[item]);
- }
- });
- return constantRoutes.concat(childrenMenus);
- },
- // 默认激活的菜单
- activeMenu() {
- const path = this.$route.path;
- let activePath = this.defaultRouter();
- if (path.lastIndexOf("/") > 0) {
- const tmpPath = path.substring(1, path.length);
- activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"));
- } else if ("/index" == path || "" == path) {
- if (!this.isFrist) {
- this.isFrist = true;
- } else {
- activePath = "index";
- }
- }
- if(this.routerType){
- this.routerType = false;
- var routes = this.activeRoutes(activePath);
- if (routes.length === 0) {
- activePath = this.currentIndex || this.defaultRouter()
- this.activeRoutes(activePath);
- }
- }
- return activePath;
- },
- },
- beforeMount() {
- window.addEventListener('resize', this.setVisibleNumber)
- },
- beforeDestroy() {
- window.removeEventListener('resize', this.setVisibleNumber)
- },
- mounted() {
- this.setVisibleNumber();
- },
- methods: {
- // 根据宽度计算设置显示栏数
- setVisibleNumber() {
- const width = document.body.getBoundingClientRect().width / 3;
- // this.visibleNumber = parseInt(width / 85);
- },
- // 默认激活的路由
- defaultRouter() {
- let self = this;
- let router;
- Object.keys(this.routers).some((key) => {
- if (!this.routers[key].hidden) {
- router = this.routers[key].path;
- return true;
- }
- });
- let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
- for(let i=0;i<self.topMenus.length;i++){
- if(matched[0]){
- if(matched[0].path == self.topMenus[i].path){
- if(matched[0].meta.title != '数据可视化'){
- store.dispatch('settings/setPageName', matched[0].meta.title)
- }
- }
- }
- }
- return router;
- },
- // 菜单选择事件
- handleSelect(item) {
- if(item.isFrame){
- this.xmlRequestSkip(item);
- }else{
- if(item.children){
- this.currentIndex = item.path;
- this.activeRoutes(item.path);
- for(let i=0;i<item.children.length;i++){
- if(item.children[i].children){
- for(let o=0;o<item.children[i].children.length;o++){
- if(!item.children[i].children[o].isFrame){
- //路由跳转
- this.$router.push({
- path: item.children[i].path+'/'+item.children[i].children[o].path
- });
- return
- }
- }
- }else{
- if(!item.children[i].isFrame){
- //路由跳转
- this.$router.push({
- path: item.children[i].path
- });
- return
- }
- }
- }
- // this.msgError('该目录没有可跳转的页面')
- }else{
- this.msgError('这是一个空目录')
- }
- }
- },
- //链接跳转方法
- xmlRequestSkip(item){
- let self = this;
- if(item.needAuth){
- let urlText = window.location.href.split('://')[0]+'://';
- //链接请求跳转
- let formData = new FormData();
- item.params.customParameter.forEach((item)=>{
- formData.append(item.key,item.value);
- })
- let xhr = new XMLHttpRequest();
- xhr.onreadystatechange = function() {
- if (xhr.readyState === XMLHttpRequest.DONE) {
- if (xhr.status === 200) {
- window.open(item.name,item.params.skipType)
- } else {
- self.msgError('操作失败,请联系管理员')
- }
- }
- };
- xhr.open(item.params.reqMethod,urlText+item.params.reqApi);
- xhr.send(formData)
- }else{
- //链接直接跳转
- // window.open(item.name,'_blank ')
- //外部链接-暂定为获取当前大屏地址跳转
- window.open(localStorage.getItem('screenUrl') + '?identity=' + localStorage.getItem('identity'));
- }
- },
- // 当前激活的路由
- activeRoutes(key) {
- let self = this;
- var routes = [];
- if (this.childrenMenus && this.childrenMenus.length > 0) {
- this.childrenMenus.map((item) => {
- // if (key == item.parentPath || (key == "index" && "" == item.path)) {
- if (key == item.parentPath || (key == "index" && "" == item.path)) {
- routes.push(item);
- }
- });
- }
- if(routes.length > 0) {
- for(let i=0;i<self.topMenus.length;i++){
- if(key == self.topMenus[i].path){
- localStorage.setItem('leftRoutesName',self.topMenus[i].meta.title);
- }
- }
- localStorage.setItem('leftRoutesData',JSON.stringify(routes));
- if(routes[0].path != ''){
- this.$store.commit("SET_SIDEBAR_ROUTERS", routes);
- }
- }else{
- store.dispatch('settings/setPageName', localStorage.getItem('leftRoutesName'))
- this.$store.commit("SET_SIDEBAR_ROUTERS", JSON.parse(localStorage.getItem('leftRoutesData')));
- }
- return routes;
- },
- ishttp(url) {
- return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
- }
- },
- };
- </script>
- <style lang="scss">
- .topmenu-container.el-menu--horizontal > .el-menu-item {
- float: left;
- height: 80px !important;
- line-height: 80px !important;
- color: #fff !important;
- padding: 0 5px !important;
- margin: 0 10px !important;
- }
- .topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
- border-bottom: 2px solid #{'var(--theme)'} !important;
- color: #303133;
- }
- /* submenu item */
- .topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title {
- float: left;
- height: 50px !important;
- line-height: 50px !important;
- color: #999093 !important;
- padding: 0 5px !important;
- margin: 0 10px !important;
- }
- .top-submenu{
- .el-submenu__title i{
- color:#fff;
- }
- }
- </style>
|