管道基础大数据平台系统开发-【前端】-新系統界面
surprise
2024-05-09 e897fc3d35f8e5dfa56d5f0c80a655ccf99202cf
src/components/navMenu.vue
@@ -1,61 +1,66 @@
<template>
  <div class="topMenu">
    <div class="logo"></div>
    <div class="headerTitle">
      <p class="textp1">管道基础大数据平台</p>
      <p class="textp2">Pipeline basic big data platform</p>
    </div>
    <div class="rightWrapper">
      <div class="rightMenu">
        <ul class="infinite-list menu_ul">
          <li
            @click="setMenuMove(index, item)"
            v-for="(item, index) in listMenu"
            class="infinite-list-item"
          >
            <div
              class="menuImage"
              :class="changeSelectStyle == index ? item.checkClass : item.class"
            ></div>
            <div
              class="menulabel"
              :class="{ changeStyle: changeSelectStyle == index }"
            >
              {{ item.label }}
  <div class="NavBox"
       @click.stop>
    <div class="topBox">
      <div class="topTitle"></div>
      <div class="topMenu">
        <div class="menuContent">
          <div class="contentDiv"
               @click="setMenuMove(index, item)"
               v-for="(item, index) in listMenu">
            <div style="display: flex;align-items: center">
              <div class="ImgMenu">
                <div class="menuImage"
                     :class="changeSelectStyle == index ? item.checkClass : item.css"></div>
              </div>
              <div class="menulabel"
                   :class="{ changeStyle: changeSelectStyle == index }">
                <span v-show="language"> {{ item.cnName }}</span> <span v-show="!language"> {{ item.enName }}</span>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="rightUser">
        <div @click="logOut" class="topdiv topUser">
          <div class="userImage user1"></div>
          <div class="userText"><span>admin</span>注销</div>
            <div class="secondMenuDiv   subpage_Div"
                 v-show="index == showFlag ? true :false">
              <div v-for="res in item.children"
                   @click="setLiClick(res,index)"
                   :class="{ changeLiStyle: changeliSelect == res.cnName }">
                <span v-show="language"> {{ res.cnName }}</span> <span v-show="!language"> {{ res.enName }}</span>
              </div>
            </div>
          </div>
        </div>
        <div @click="switchLang" class="topdiv botLingo">
          <div class="userImage user2"></div>
          <div class="userText">Language</div>
        </div>
        <color-change></color-change>
      </div>
      <div class="topUser">
        <div class="userLanguage">
          <div class="userImage theme"
               @click="themeChange"></div>
          <div class="userImage user2"
               @click="switchLang"></div>
      <!-- <div class="menu"></div>
      <div class="userInfo">
        <img src="../assets/img/user.png" alt="" />
        <span>admin</span>
        <span >注销</span>
        &nbsp;
        <span> 切换语言</span>
      </div> -->
        </div>
        <div class="userName">
          <div class="userImage user1"></div>
          <div class="userText">
            <span>{{ this.$store.state.uname }}</span>
            <el-link @click="logOut"
                     :underline="false"
                     class="elLink">{{ $t('common.logout') }}</el-link>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { logout } from '@/api/api';
import { removeToken, getToken } from '@/utils/auth';
import { logout,selectMenuRecursive,sign_insertOpLog } from '@/api/api';
import { removeToken,getToken } from '@/utils/auth';
import customElMenu from '../components/customElMenu.vue';
import { queryMenuTree, getPerms } from '../api/api';
import { queryMenuTree,getPerms } from '../api/api';
import colorChange from '../views/maintenance/colorChange.vue';
import { containsCoordinate } from 'ol/extent';
import Vue,{ nextTick } from 'vue';
import $ from 'jquery'
export default {
  name: 'navMenu',
  //import引入的组件需要注入到对象中才能使用
@@ -63,8 +68,9 @@
    customElMenu,
    colorChange,
  },
  data() {
  data () {
    return {
      themeColor: true,
      oriData: [], //原始树数据
      dirData: [], //el树数据
@@ -82,123 +88,296 @@
      itemdetail: {},
      formLabelWidth: '70px',
      count: 5,
      changeSelectStyle: 5,
      listMenu: [
      changeSelectStyle: null,
      changeliSelect: null,
      changeSelectdiv: false,
      listMenu: [],
      showFlag: null,
      language: true,
      nowPage: [
        {
          label: '数据质检',
          class: 'm1',
          checkClass: 'm11',
          name: '/Archive',
          index: 3
        },
        {
          label: '数据交换',
          class: 'm2',
          checkClass: 'm21',
          name: '/dataApplication',
          index: 3
        },
        {
          label: '数据管理',
          class: 'm3',
          checkClass: 'm31',
          name: '/ExportMap',
          index: 3
        },
        {
          label: '服务管理',
          class: 'm4',
          checkClass: 'm41',
          name: '/Synthesis',
          index: 3
        },
        {
          label: '综合展示',
          class: 'm5',
          checkClass: 'm51',
          name: '/dataController',
          index: 4
        },
        {
          label: '运维管理',
          class: 'm6',
          checkClass: 'm61',
        },
      ],
          name: '/mochaitmo',
          index: 5
        }
      ]
    };
  },
  mounted() {
    this.getUserPerms();
  created () { },
  mounted () {
    this.$store.state.themeflag=false;
    $("#app").removeClass("Black_theme");
    this.getMenuTree();
    if(sessionStorage.getItem('changeliSelect')) {
      this.$set(this,'changeliSelect',sessionStorage.getItem('changeliSelect'))
      // this.changeliSelect = sessionStorage.getItem('changeliSelect')
    }
    document.body.addEventListener('click',() => {
      this.showFlag=null;
    },false);
    // this.$bus.$on('closeMenuSecond', res => {
    //   this.showFlag = null;
    // })
    window.addEventListener('message',(e) => {
      this.showFlag=null;
    })
  },
  computed: {
    // 我们使用计算属性来获取到当前点击的菜单的路由路径,然后设置default-active中的值
    // 使得菜单在载入时就能对应高亮
    // activeIndex() {
    //   const route = this.$route;
    //   const { meta, path } = route;
    //   // if set path, the sidebar will highlight the path you set
    //   // 可以在路由配置文件中设置自定义的路由路径到meta.activeMenu属性中,来控制菜单自定义高亮显示
    //   if (meta.activeMenu) {
    //     return meta.activeMenu;
    //   }
    //   return path;
    // },
  },
  computed: {},
  methods: {
    //主题切换
    setThemeColors() {
      // var value;
      // if (this.themeColor) {
      //   value = '#303030';
      // } else {
      //   value = '#409EFF';
      // }
      // localStorage.setItem('theme', value);
      // this.$store.commit('setSkin', value);
    closeSecondMenu () {
      this.showFlag=null
    },
    //鼠标移入菜单事件
    setMenuMove(index, item) {
      this.changeSelectStyle = index;
    },
    getMenuTree() {
      //获取目录树最大ID,新建节点使用
      // queryMaxId().then((res) => {
      //   this.id = res.data;
      // });
      // 获取目录树数据
      queryMenuTree().then((res) => {
        if (res.code == 200) {
          if (res.result.length != 0) {
            let menuLists = res.result.filter((value) => {
              return value.pid == 1;
            });
            // console.log(menuLists);
            this.menuList = menuLists;
          } else {
            alert('暂无菜单栏数据');
          }
        } else {
          console.log('接口报错');
        }
      });
    },
    treeData(source) {
      let cloneData = JSON.parse(JSON.stringify(source)); // 对源数据深度克隆
      // console.log(cloneData);
      if (cloneData.length != 0) {
        return cloneData.filter((father) => {
          // 循环所有项
          let branchArr = cloneData.filter((child) => father.id == child.pid); // 对比ID,分别上下级菜单,并返回数据
          branchArr.length > 0 ? (father.children = branchArr) : ''; // 给父级添加一个children属性,并赋值
          // 属于同一对象问题,例如:令 a=b、c=1 ,然后再令 b.c=c , 那么 a.c=b.c=c=1 ;同理,后续令 c.d=2 ,那么 a.c.d 也是=2;
          // 由此循环多次后,就能形成相应的树形数据结构
          return father.pid == 1; // 返回一级菜单
        });
    themeChange () {
      this.$store.state.themeflag=!this.$store.state.themeflag;
      if(this.$store.state.themeflag==true) {
        $("#app").addClass("Black_theme");
      } else {
        alert('暂无菜单栏数据');
        $("#app").removeClass("Black_theme");
      }
    },
    async getCookies () {
      var boolean=this.getTimeCookies();
      if(boolean!=true) {
        this.$router.push('/login');
        return;
      }
      if(this.$store.state.permsEntity.length==0) {
        const data=await getPerms();
        this.$store.state.permsEntity=data.result;
      }
      this.$store.state.uname=JSON.parse(
        localStorage.getItem('LFToken')
      ).uname;
      this.$store.state.unid=JSON.parse(
        localStorage.getItem('LFToken')
      ).userid;
      this.$router.push('/');
    },
    getTimeCookies () {
      if(!localStorage.getItem('LFToken')) {
        return false
      }
      var time1=new Date(JSON.parse(localStorage.getItem('LFToken')).time);
      var time2=new Date();
      if(time2>time1) {
        return false;
      } else {
        return true;
      }
    },
    logOut() {
      this.$confirm('确认是否退出登录?', '提示', {
    //主题切换
    setThemeColors () { },
    async signInsertOpLog (m1,m2) {
      var obj={
        m1: m1,
        m2: m2,
      }
      const data=await sign_insertOpLog(obj);
    },
    //鼠标移入菜单事件
    setMenuMove (index,item) {
      if(item.perms!=null&&item.perms!="") {
        this.$router.push(item.url);
        if(this.showFlag!=null) {
          this.changeliSelect='%%';
          this.showFlag=null;
        }
        if(item.url=="Thematic") {
          this.signInsertOpLog("综合展示",item.cnName)
          this.$nextTick(function() {
            location.reload();
          })
        }
        this.changeSelectStyle=index;
        sessionStorage.setItem('changeSelectStyle',index)
      } else {
        if(this.showFlag!=index) {
          this.showFlag=index;
        } else {
          this.showFlag=null;
        }
      }
      //
      if(index===4||index===5||index===6) {
        sessionStorage.removeItem('changeliSelect')
        this.$set(this,'changeliSelect',null)
      }
    },
    closeAllChildren () {
      var val=this.listMenu
      for(var i=0;i<val.length;i++) {
        let newItem=val[i];
        newItem.show=false;
        Vue.set(val,i,newItem);
      }
    },
    setShowFalseDiv (bolean) {
      var index=this.showFlag;
      if(index!=null) {
        let newItem=this.listMenu[index];
        newItem.show=bolean;
        Vue.set(this.listMenu,index,newItem);
      }
    },
    setLiClick (res,index) {
      this.changeSelectStyle=index;
      sessionStorage.setItem('changeSelectStyle',index)
      sessionStorage.removeItem('hanleselectmochaitmo')
      sessionStorage.removeItem('hanleselectindex')
      // this.signInsertOpLog(this.listMenu[index].cnName, res.cnName)
      setTimeout(() => {
        this.changeliSelect=res.cnName;
        sessionStorage.setItem('changeliSelect',res.cnName)
        if(res.url.indexOf('{fmeHost}')!=-1) {
          this.$store.reporturl=res.url;
          sessionStorage.setItem('iframehttpurl',this.$store.reporturl)
          this.$router.push('/QualityInspection');
          // if (location.href.indexOf('/WareInspection') == -1) {
          //   this.$store.reporturl = res.url;
          //   this.$router.push('/WareInspection');
          // } else {
          //   this.$bus.$emit('changeNaveUrl', res.url);
          // }
        } else {
          this.$store.reporturl=null;
          sessionStorage.setItem('iframehttpurl',null)
          // sessionStorage.setItem('changeliSelect', null)
          this.$router.push(res.url);
          this.$store.commit('currentPerms',res.perms);
        }
        this.setShowFalseDiv(false)
      },100)
    },
    async getMenuTree () {
      this.getCookies();
      const data=await queryMenuTree();
      var that=this;
      if(data.code==200) {
        if(data.result.length!=0) {
          let menuLists=data.result.filter((value) => {
            return value.pid==1;
          });
          that.menuList=menuLists;
          that.setMenuTree(menuLists);
        } else {
          this.$message({
            message: '暂无菜单栏数据',
            type: 'warning'
          });
        }
      }
    },
    async setMenuTree (res) {
      for(var i in res) {
        res[i].checkClass=res[i].css+'1';
        res[i].show=false; //控制显隐
        if(res[i].perms==null||res[i].perms=="") {
          const result=await selectMenuRecursive({ id: res[i].id });
          if(result.code==200) {
            res[i].children=result.result.filter((value) => {
              return value.isShow==1;
            })
              .filter((value) => {
                return value.pid==res[i].id;
              });
          }
          this.listMenu.push(res[i]);
          // this.changeSelectStyle = this.listMenu.length - 1;
          // this.changeSelectStyle = 0
          // const nowPage = this.nowPage
          // if (sessionStorage.getItem('routerName')) {
          //   for (let index = 0; index < nowPage.length; index++) {
          //     if (this.$route.path === nowPage[index].name) {
          //       this.$set(this, 'changeSelectStyle', nowPage[index].index)
          //     }
          //   }
          // } else {
          //   this.changeSelectStyle = this.listMenu.length - 1;
          // }
          this.changeSelectStyle=sessionStorage.getItem('changeSelectStyle')
          // var strartMneu = res[i].children[0];
          // this.$store.commit('currentPerms', strartMneu.perms);
          // this.changeliSelect = strartMneu.cnName;
          // this.$bus.$emit('currentPerms', strartMneu.perms);
        } else {
          this.listMenu.push(res[i]);
        }
      }
    },
    treeData (source) {
      let cloneData=JSON.parse(JSON.stringify(source)); // 对源数据深度克隆
      // console.log(cloneData);
      if(cloneData.length!=0) {
        return cloneData.filter((father) => {
          // 循环所有项
          let branchArr=cloneData.filter((child) => father.id==child.pid); // 对比ID,分别上下级菜单,并返回数据
          branchArr.length>0? (father.children=branchArr):''; // 给父级添加一个children属性,并赋值
          // 属于同一对象问题,例如:令 a=b、c=1 ,然后再令 b.c=c , 那么 a.c=b.c=c=1 ;同理,后续令 c.d=2 ,那么 a.c.d 也是=2;
          // 由此循环多次后,就能形成相应的树形数据结构
          return father.pid==1; // 返回一级菜单
        });
      } else {
        this.$message({
          message: '暂无菜单栏数据',
          type: 'warning'
        });
      }
    },
    logOut () {
      this.$confirm('确认是否退出登录?','提示',{
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
        .then(async () => {
          const data = await logout({ token: getToken() });
          const data=await logout({ token: getToken() });
          // console.log(data);
          if (data.code != 200) {
          if(data.code!=200) {
            return this.$message.error('退出登录失败');
          }
          removeToken();
@@ -215,256 +394,61 @@
          });
        });
    },
    switchLang() {
    switchLang () {
      //当前en
      if (this.lang == 'en') {
      if(this.lang=='en') {
        //语言换成zh
        this.lang = 'zh';
        this.lang='zh';
        this.language=true;
        this.$store.state.language=true;
        //菜单换为zh
        this.$store.commit('changeLang', 'zh');
        this.$store.commit('changeLang','zh');
        //i18换成zh
        this.$i18n.locale = this.lang;
        this.$i18n.locale=this.lang;
      }
      //当前zh
      else {
        this.lang = 'en';
        this.$i18n.locale = this.lang;
        this.$store.commit('changeLang', 'en'); //传递点击的节点
        this.lang='en';
        this.language=false;
        this.$store.state.language=false;
        this.$i18n.locale=this.lang;
        this.$store.commit('changeLang','en'); //传递点击的节点
      }
    },
    handleselect(index, indexPath, e) {
    handleselect (index,indexPath,e) {
      // console.log(e.$attrs.perms);
      this.$store.commit('currentPerms', e.$attrs.perms.perms);
      if (Window.ws != null) {
      this.$store.commit('currentPerms',e.$attrs.perms.perms);
      if(Window.ws!=null) {
        Window.ws.close();
        Window.ws.onclose = () => {
        Window.ws.onclose=() => {
          console.log('服务器关闭');
        };
        Window.ws = null;
        Window.ws=null;
      }
      if (index.indexOf('http') != -1) {
      debugger
      if(index.indexOf('{fmeHost}')!=-1) {
        this.$router.push('/databaseMonitoring');
        this.$store.commit('getIframe', index);
      } else if (isNaN(Number(index))) {
        this.$store.commit('getIframe',index);
      } else if(isNaN(Number(index))) {
        this.$router.push(index);
      }
    },
    getUserPerms() {
      getPerms().then((res) => {
        if (res.code == 200) this.$store.commit('getPermsEntity', res.result);
      });
    },
  },
  watch: {
    $route() {
      let str = this.$route.path;
      if (str[0] == '/') {
        this.activeIndex = str.slice(1);
    $route () {
      let str=this.$route.path;
      if(str[0]=='/') {
        this.activeIndex=str.slice(1);
      }
    },
  },
  created() {
    let str = this.$route.path;
    if (str[0] == '/') {
      this.activeIndex = str.slice(1);
  created () {
    this.$store.reporturl=null;
    let str=this.$route.path;
    if(str[0]=='/') {
      this.activeIndex=str.slice(1);
    }
  },
};
</script>
<style lang="less" scoped>
//@import url(); 引入公共css类
.topMenu {
  width: 100%;
  height: 100%;
  background-image: linear-gradient(rgb(34, 33, 33), rgb(27, 31, 78));
  display: flex;
  justify-content: space-between;
  .logo {
    width: 80px;
    height: 80px;
    margin-left: 30px;
    margin-top: 33px;
    background: url('../assets/img/图层 34.png') no-repeat 100% 100%;
  }
  // .rightWrapper {
  //   width: 70%;
  //   height: 100%;
  //   display: flex;
  //   .menu {
  //     height: 100%;
  //     width: 80%;
  //     background-color: rgb(120, 121, 120);
  //     ul {
  //       display: flex;
  //       justify-content: space-around;
  //       li {
  //         width: 120px;
  //         height: 120px;
  //         background: #bfa;
  //       }
  //     }
  //   }
  .rightWrapper {
    float: right;
    margin-right: 48px;
    margin-top: 32px;
    height: 80px;
    float: left;
    .rightMenu {
      height: 100%;
      float: left;
      margin-right: 40px;
      .menu_ul {
        list-style: none;
      }
      .menu_ul li {
        float: left;
        margin-right: 70px;
      }
      .menulabel {
        font-size: 19px;
        font-family: Source Han Sans CN;
        font-weight: 500;
        color: #ffffff;
      }
      .changeStyle {
        color: #fec801;
      }
      .menuImage {
        width: 70px;
        height: 70px;
      }
      .m1 {
        background: url('../assets/img/menu/menu11.png') no-repeat;
        background-size: 100% 100%;
      }
      .m2 {
        background: url('../assets/img/menu/menu21.png') no-repeat;
        background-size: 100% 100%;
      }
      .m3 {
        background: url('../assets/img/menu/menu31.png') no-repeat;
        background-size: 100% 100%;
      }
      .m4 {
        background: url('../assets/img/menu/menu41.png') no-repeat;
        background-size: 100% 100%;
      }
      .m5 {
        background: url('../assets/img/menu/menu51.png') no-repeat;
        background-size: 100% 100%;
      }
      .m6 {
        background: url('../assets/img/menu/menu61.png') no-repeat;
        background-size: 100% 100%;
      }
      .m11 {
        background: url('../assets/img/menu/menu12.png') no-repeat;
        background-size: 100% 100%;
      }
      .m21 {
        background: url('../assets/img/menu/menu22.png') no-repeat;
        background-size: 100% 100%;
      }
      .m31 {
        background: url('../assets/img/menu/menu32.png') no-repeat;
        background-size: 100% 100%;
      }
      .m41 {
        background: url('../assets/img/menu/menu42.png') no-repeat;
        background-size: 100% 100%;
      }
      .m51 {
        background: url('../assets/img/menu/menu52.png') no-repeat;
        background-size: 100% 100%;
      }
      .m61 {
        background: url('../assets/img/menu/menu62.png') no-repeat;
        background-size: 100% 100%;
      }
    }
    .rightUser {
      height: 100%;
      float: left;
      min-width: 130px;
      display: flex;
      flex-direction: column;
      .topdiv {
        width: 100%;
        height: 30px;
        margin-top: 10px;
        line-height: 30px;
        .userImage {
          width: 30px;
          height: 30px;
          float: left;
          margin-right: 10px;
        }
        .user1 {
          background: url('../assets/img/user.png') no-repeat;
          background-size: 100% 100%;
        }
        .user2 {
          background: url('../assets/img/EN.png') no-repeat;
          background-size: 100% 100%;
        }
        .userText {
          font-size: 15px;
          font-family: Microsoft YaHei;
          font-weight: 400;
          color: #ffffff;
          text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.35);
        }
      }
      .topUser {
        flex-shrink: 0;
      }
      .botLingo {
        flex-shrink: 1;
      }
    }
  }
  // .userInfo {
  //   background-color: pink;
  //   // width: 138px;
  //   font-size: 16px;
  //   font-family: Microsoft YaHei;
  //   font-weight: 400;
  //   color: #fcfcfc;
  //   // display: flex;
  //   // justify-content: space-between;
  //   // align-items: center;
  //   // cursor: pointer;
  // }
  .headerTitle {
    margin-top: 49px;
    margin-left: 120px;
    position: absolute;
    .textp1 {
      font-size: 36px;
      font-family: Microsoft YaHei;
      font-weight: bold;
      color: #ffffff;
      background: linear-gradient(0deg, #79a8ff 0%, #ffffff 100%);
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
    }
    .textp2 {
      font-size: 9px;
      font-family: Microsoft YaHei;
      font-weight: 300;
      color: #ffffff;
      display: flex;
      background: linear-gradient(0deg, #79a8ff 0%, #ffffff 100%);
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
    }
  }
}
</style>