odc.xiaohui
2023-03-08 d24c9dde20cba23b96082b4db81b5223c75e4ea9
src/views/layout/components/Header/index.vue
@@ -1,78 +1,143 @@
<template>
  <!-- 头部 -->
  <el-header>
  <el-header v-if="show">
    <!-- 左侧菜单 -->
    <div class="header-left">
      <div class="menu-left__item" v-for="(item,index) in menuLeftList" :key="item.id" @click="changeActive(index)">
        <span :class="item.checked ? 'my-active':''">{{item.label}}</span>
      <div class="menu-left__item" v-for="(item, index) in menuLeftList" :key="item.id" @click="changeActive(index)">
        <span :class="item.checked ? 'my-active' : 'my-activeno'" @click="menuChange(item)">{{ item.label }}</span>
      </div>
    </div>
    <!-- 右侧菜单 -->
    <div class="header-right">
      <!-- 搜索框 -->
      <div class="menu-right__item search">
        <el-input suffix-icon="el-icon-search" v-model="keyword" placeholder="请输入搜索内容"></el-input>
      <div class="menu-right__item search"></div>
      <!-- 消息 -->
      <div class="menu-right__item btn" @mousemove="flag.message = true" @mouseleave="flag.message = false">
        <el-tooltip effect="dark" content="消息中心" placement="bottom-end" :hide-after="600">
          <el-badge :value="messageCounts" class="item">
            <i @click="getMessage" class="el-icon-message-solid"></i>
          </el-badge>
        </el-tooltip>
        <!-- 消息操作 -->
        <div class="message-card" v-if="flag.message" @mouseleave="flag.message = false">
          <el-card class="box-card">
            <div class="card-header">
              <span>消息中心</span>
              <el-button type="text" @click="channelSetting">接收设置</el-button>
            </div>
            <div v-for="item in menuMessageList" :key="item.id" class="message-card__item">
              <router-link to='/home/operate/message/messageIndex'>
                <span class="label">{{ item.columnName }}</span>
              </router-link>
              <span>({{ item.messageNumber }})</span>
            </div>
          </el-card>
        </div>
      </div>
      <!-- 登录用户 -->
      <div class="menu-right__item user" @mousemove="flag.user=true" @mouseleave="flag.user=false">
        <el-avatar :size="20" :src="user.icon" v-if="user.icon"></el-avatar>
      <div class="menu-right__item user" @mousemove="flag.user = true" @mouseleave="flag.user = false">
        <span class="user-span">|</span>
        <el-avatar :size="20" :src="user.user.icon" v-if="user.user.icon"></el-avatar>
        <el-avatar :size="20" src="https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png" v-else>
        </el-avatar>
        <span style="padding: 0 5px;">{{user.username? user.username:'Admin'}}</span>
        <span style="padding: 0 5px;">{{ user.user.username }}</span>
        <i class="el-icon-arrow-down"></i>
        <!-- 用户操作 -->
        <div class="user-card" v-if="flag.user" @mouseleave="flag.user = false">
          <el-card class="box-card">
            <div class="user-card__item">修改密码</div>
            <div style="margin-top: 10px;" class="user-card__item">基本信息</div>
            <div class="user-card__item" @click="updatePassword()">修改密码</div>
            <div style="margin-top: 10px;" class="user-card__item" @click="baseInfo()">基本信息</div>
          </el-card>
        </div>
      </div>
      <!-- 消息 -->
      <div class="menu-right__item btn" @mousemove="flag.message = true" @mouseleave=" flag.message = false ">
        <el-tooltip effect="dark" content="消息中心" placement="bottom-end" :hide-after="600">
          <el-badge :value="50" :max="99" class="item">
            <i class="el-icon-message-solid"></i>
          </el-badge>
        </el-tooltip>
        <!-- 消息操作 -->
        <div class="message-card" v-if="flag.message" @mouseleave=" flag.message = false ">
          <el-card class="box-card">
            <div class="card-header">
              <span>消息中心</span>
              <el-button type="text">接收设置</el-button>
            </div>
            <div v-for="item in menuMessageList" :key="item.id" class="message-card__item">
              <span class="label">{{item.label}}</span>
              <span>({{item.num}})</span>
            </div>
          </el-card>
        </div>
      </div>
      <!-- 设置 -->
      <div class="menu-right__item btn">
        <el-tooltip effect="dark" content="账户设置" placement="bottom-end" :hide-after="1000">
          <i class="el-icon-s-tools"></i>
        </el-tooltip>
      </div>
      <!-- 退出登录 -->
      <div class="menu-right__item btn" @click="loginout">
        <el-tooltip effect="dark" content="退出登录" placement="bottom-end" :hide-after="1000">
          <i class="el-icon-switch-button"></i>
        </el-tooltip>
      </div>
      <el-dialog :visible.sync="channelSettingVisible" width="25%" title="消息栏目设置" v-if="channelSettingVisible"
        :before-close="handleChannelClose">
        <el-table ref="multipleTable" :header-cell-style="{
                                        'font-size': '14px',
                                        'font-weight': '650',
                                        'line-height': '45px',
                                      }" :data="channelData" style="width: 100%" @selection-change="handleSelectionChange">
          <el-table-column width="55">
          </el-table-column>
          <el-table-column prop="columnName" label="全部" min-width="5" align="center">
            <!-- <template slot-scope="scope">{{ scope.row.id }}</template> -->
          </el-table-column>
          <el-table-column label="启用" min-width="5">
            <template slot-scope="scope">
              <!-- @change="handleChangeStatus(scope.row)" -->
              <el-switch class="switchStyle"
              v-model="scope.row.isReceive"
              active-color="#3fef9a"
              inactive-color="#000212"
              :active-value="1"
              :inactive-value="0"
              @change="handleSelectionChange(scope.row)">
              </el-switch>
            </template>
          </el-table-column>
        </el-table>
        <el-button type="button" @click="cancelChannel">取消</el-button>
      </el-dialog>
      <el-dialog :visible.sync="updatePasswordDialog" width="40%" title="修改密码" v-if="updatePasswordDialog"
        :before-close="handleClose">
        <updatePassword />
      </el-dialog>
      <el-dialog :visible.sync="baseInformationVisible" width="35%" title="基本信息" v-if="baseInformationVisible">
        <el-form :model="info" class="info" label-width="6vw">
          <el-form-item label="用户ID" min-width="6">
            <el-input v-model="info.id"></el-input>
          </el-form-item>
          <el-form-item prop="nickName" label="用户名称" min-width="10">
            <el-input v-model="info.nickName"></el-input>
          </el-form-item>
          <el-form-item prop="nickName" label="所属姓名" min-width="8">
            <el-input v-model="info.username"></el-input>
          </el-form-item>
          <el-form-item prop="mobile" label="联系方式" min-width="7">
            <el-input v-model="info.mobile"></el-input>
          </el-form-item>
          <el-form-item prop="jobTitle" label="所属职务" min-width="8">
            <el-input v-model="info.jobTitle"></el-input>
          </el-form-item>
          <el-form-item prop="createTime" label="创建时间" min-width="10">
            <el-input v-model="info.createTime"></el-input>
          </el-form-item>
        </el-form>
      </el-dialog>
    </div>
  </el-header>
</template>
<script>
import updatePassword from "./updatePassword";
import users from "@/api/users";
import { Message } from "element-ui";
export default {
  components: {
    updatePassword
  },
  data() {
    return {
      baseInformationVisible: false,
      updatePasswordDialog: false,
      channelSettingVisible: false,
      checked3: true,
      menuLeftList: [
        {
          label: '驾驶舱',
          checked: true,
          checked: false,
          url: '',
          id: '1f'
        },
@@ -86,7 +151,13 @@
          label: '执法管理',
          checked: false,
          url: '',
          if: '3f',
          id: '3f',
        },
        {
          label: '油烟检测',
          checked: false,
          url: '',
          id: '4f',
        },
      ],
      flag: {
@@ -94,35 +165,95 @@
        message: false
      },
      user: '',
      menuMessageList: [
        {
          label: '全部消息',
          num: 10,
          id: '1m'
        },
        {
          label: '产品消息',
          num: 10,
          id: '2m'
        },
        {
          label: '安全消息',
          num: 10,
          id: '3m'
        },
        {
          label: '服务消息',
          num: 10,
          id: '4m'
        },
      ],
      menuMessageList: [],
      channelData: [],
      messageCounts: 0,
      keyword: '',
      info: null,
      show: false,
      messageColumnSet: {
      }
    };
  },
  created() {
    this.getLoginInfo();
    this.setLoginInfo();
  },
  watch:{
    $route() {
      this.menuLeftList.map(item=>{
        item.checked = false
      })
    },
  },
  methods: {
    cancelChannel(){
      this.channelSettingVisible=false
    },
    handleSelectionChange(val) {
      const userInfo = JSON.parse(sessionStorage.getItem('user'));
      this.messageColumnSet.userId = userInfo.user.id
      this.messageColumnSet.messageColumnId = val.id
      if (val.isReceive == null) {
        this.messageColumnSet.isReceive = 1
      }
      if (val.isReceive == 1) {
        this.messageColumnSet.isReceive = 1
      }
      else if (val.isReceive == 0) {
        this.messageColumnSet.isReceive = 0
      }
      this.$axios({
        method: 'post',
        url: 'sccg/message_column_set/update',
        data: this.messageColumnSet
      }).then(res => {
        this.$message.success("订阅成功")
      })
    },
    baseInfo() {
      this.baseInformationVisible = true;
      const name = sessionStorage.getItem('name');
      this.$axios({
        method: 'get',
        url: 'sccg/admin/info?name=' + name,
      })
        .then(res => {
          sessionStorage.setItem('user', JSON.stringify(res.data));
          this.info = res.data.user;
        })
    },
    channelSetting(row) {
      this.channelSettingVisible = true;
      const userInfo = JSON.parse(sessionStorage.getItem('user'));
      this.$axios({
        method: 'get',
        url: 'sccg/message_column/getShowColumn?' + 'id=' + userInfo.user.id
      })
        .then(res => {
          this.channelData = res.data
          // this.channelData.forEach(item=>{this.$refs.multipleTable.toggleRowSelection(item,true);console.log(this.$refs.multipleTable.toggleRowSelection(item,true))})
        })
    },
    handleChannelClose(done) {
      this.$confirm("确认关闭?")
        .then((_) => {
          this.dialogUpload = false;
          done();
        })
        .catch((_) => { });
    },
    handleClose(done) {
      this.$confirm("确认关闭?")
        .then((_) => {
          this.channelSettingVisible = false;
          done();
        })
        .catch((_) => { });
    },
    //修改密码
    updatePassword() {
      this.updatePasswordDialog = true;
    },
    // 退出功能
    loginout() {
      this.$confirm('退出系统确认', '确认提示', {
@@ -130,38 +261,58 @@
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        sessionStorage.removeItem('token');
        sessionStorage.removeItem('tokenHead');
        sessionStorage.clear();
        this.$router.push({ path: "/login" })
      }).catch(err => {
        console.log(err);
      })
    },
    // 改变选中状态
    changeActive(idx) {
      this.menuLeftList.forEach((item, index) => {
        if (index === idx) {
          item.checked = true;
        } else {
          item.checked = false;
        }
        item.checked = index === idx;
      })
    },
    // 获取登录用户信息
    getLoginInfo() {
    // 设置用户基本信息
    async setLoginInfo() {
      const info = JSON.parse(sessionStorage.getItem('user'));
      if (info) {
        this.user = info;
        this.user = info;
      } else {
        const name = sessionStorage.getItem('name');
        this.$axios({
          method: 'get',
          url: 'sccg/admin/info?name=' + name,
        })
          .then(res => {
            sessionStorage.setItem('user', JSON.stringify(res.data));
            this.user = res.data;
        this.user = await this.getLoginInfo();
      }
      this.getMessage();
      this.show = true
    },
    // 获取登录用户信息
    async getLoginInfo() {
      const name = sessionStorage.getItem('name');
      let res = await this.$axios({
        method: 'get',
        url: 'sccg/admin/info?name=' + name,
      })
      sessionStorage.setItem('user', JSON.stringify(res.data));
      return res.data;
    },
    getMessage() {
      const userInfo = JSON.parse(sessionStorage.getItem('user'));
      users.getMessageAuditList({ userId: userInfo.user.id })
        .then(res => {
          this.menuMessageList = res;
          this.menuMessageList.forEach(item => {
            this.messageCounts += item.messageNumber;
          })
        })
        .catch(err => this.$message.error(`${err}`))
    },
    menuChange(data) {
      if (data.id === '1f') {
        window.open('http://cockpit.patstech.net:28081/cockpit/dist/board.html#/share-board/zfu0LsJ9', '_blank');
      }
      if (data.id === '2f') {
        this.$router.push({ path: "/home/video" })
      }
      if (data.id === '3f') {
        this.$router.push({ path: "/home/operate/casepool/pool" })
      }
    }
  }
@@ -169,20 +320,27 @@
</script>
<style lang="scss" scoped>
::v-deep .el-form {
  padding: 3vh 5vw;
  .el-form-item__label {
    color: #4b9bb7;
  }
}
.el-header {
  background-color: #071a38;
  color: #333;
  background-color: #313350;
  text-align: center;
  line-height: 60px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 20px;
  // width: 100%;
  color: #4b9bb7;
  color: #fff;
  .header-left {
    display: flex;
    flex: 1;
    .menu-left__item {
      width: 120px;
@@ -194,23 +352,38 @@
        &:hover {
          cursor: pointer;
          color: #fff;
          //color: #fff;
        }
      }
    }
    .my-active {
      border-radius: 20px;
      color: #2f54eb;
      background-color: #313350;
    }
    .my-activeno{
      border-radius: 20px;
      color: #fff;
      background-color: #092c4a;
      background-color: #313350;
    }
    .my-active:hover {
      color: #2f54eb;
      background-color: #313350;
    }
    .my-activeno:hover{
      color: #2f54eb;
      background-color: #313350;
    }
  }
  .header-right {
    display: flex;
    padding-left: 10vw;
    flex: 1;
    .item {
      width: 60px;
      width: 100%;
      position: relative;
      :deep(.is-fixed) {
@@ -225,21 +398,24 @@
    }
    .search {
      width: 200px;
      flex: 3;
    }
    .user {
      margin-left: 20px;
      width: 120px;
      //margin-left: 20px;
      flex: 1;
      display: flex;
      align-items: center;
      justify-content: center;
      position: relative;
.user-span{
  padding: 0 10px;
}
      .user-card {
        position: absolute;
        top: 60px;
        width: 120px;
        z-index: 3000;
        .user-card__item {
          padding: 5px 0;
@@ -264,7 +440,7 @@
    }
    .btn {
      width: 60px;
      flex: 1;
      font-size: 20px;
      position: relative;
@@ -273,6 +449,7 @@
        top: 60px;
        width: 180px;
        left: -50px;
        z-index: 3000;
        :deep(.el-card__body) {
          padding: 0;
@@ -310,9 +487,10 @@
    .user:hover,
    .btn:hover {
      background-color: #092c4a;
      //background-color: #092c4a;
      cursor: pointer;
      color: #2f54eb;
    }
  }
}
</style>
</style>