doum
2025-09-19 9b8baee48d0bdd95ea157be10e7c24711c511dc1
admin/src/components/common/CommonHeader.vue
@@ -2,14 +2,29 @@
  <div class="common-header">
    <div class="header">
      <div class="logo">
        <div>{{title}}</div>
        <div class="title">{{ title }}</div>
        <div class="list">
          <div class="item active">
            <div>服务中心</div>
            <div class="linellae"></div>
          </div>
          <div  class="item" v-for="(item,index) in topMenuList.list" :key="item.id"  @click="getHeaderNav(item)" :index="index">{{item.label}}</div>
<!--          <div class="item" @click="getHeaderNav('0')">安防中心</div>
          <div class="item" @click="getHeaderNav('1')">消控中心</div>
          <div class="item" @click="getHeaderNav('2')">能管中心</div>
          <div class="item" @click="getHeaderNav('7')">后勤中心</div>
          <div class="item" @click="getHeaderNav('3')">驾驶舱</div>-->
          <!-- <div class="item" @click="handleTest">测试</div> -->
        </div>
        <!-- <div class="title-en">Diagnosis of Intelligent Manufacturing Integrated Service Platfrom</div> -->
      </div>
      <div class="user">
        <el-dropdown v-if="isLogined" trigger="click">
          <span class="el-dropdown-link">
            <!-- <img v-if="userInfo != null" :src="userInfo.avatar == null ? `${require('@/assets/avatar/man.png')}` : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i> -->
            <img v-if="userInfo != null" style="width: 30px !important;" src="@/assets/avatar/man.png" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i>
            <img v-if="userInfo != null" style="width: 30px !important" src="@/assets/avatar/man.png" alt="" />{{
              userInfo | displayName
            }}<i class="el-icon-arrow-down el-icon--right"></i>
          </span>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item @click.native="changePwd">修改密码</el-dropdown-item>
@@ -19,21 +34,23 @@
      </div>
    </div>
    <!-- 修改密码 -->
    <GlobalAlertWindow
      title="修改密码"
      :visible.sync="visible.changePwd"
      @confirm="confirmChangePwd"
      @close="visible.changePwd = false"
    >
    <GlobalAlertWindow title="修改密码" :visible.sync="visible.changePwd"
      :showClose="userInfo && (!userInfo.needChangePwd || userInfo.needChangePwd == '0')"
      :showCancel="userInfo && (!userInfo.needChangePwd || userInfo.needChangePwd == '0')" @confirm="confirmChangePwd"
      @close="visible.changePwd = false">
      <el-form :model="changePwdData.form" ref="changePwdDataForm" :rules="changePwdData.rules">
        <el-form-item label="原始密码" prop="oldPwd" required>
          <el-input v-model="changePwdData.form.oldPwd" type="password" placeholder="请输入原始密码" maxlength="30" show-password></el-input>
          <el-input v-model="changePwdData.form.oldPwd" type="password" placeholder="请输入原始密码" maxlength="30"
            show-password></el-input>
        </el-form-item>
        <el-form-item label="新密码" prop="newPwd" required>
          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="请输入新密码" maxlength="30" show-password></el-input>
          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="请输入新密码,密码需包含字母、数字及特殊字符中的至少两种"
            maxlength="20" show-password></el-input>
        </el-form-item>
        <!-- <div style="font-size: 12px;color:#999999">密码需包含字母、数字及特殊字符中的至少两种</div> -->
        <el-form-item label="确认新密码" prop="confirmPwd" required>
          <el-input v-model="changePwdData.form.confirmPwd" type="password" placeholder="请再次输入新密码" maxlength="30" show-password></el-input>
          <el-input v-model="changePwdData.form.confirmPwd" type="password" placeholder="请再次输入新密码" maxlength="20"
            show-password></el-input>
        </el-form-item>
      </el-form>
    </GlobalAlertWindow>
@@ -44,6 +61,7 @@
import { mapState, mapMutations } from 'vuex'
import GlobalAlertWindow from './GlobalAlertWindow'
import { logout, updatePwd } from '@/api/system/common'
import { getAppHeaderNav } from '@/api'
export default {
  name: 'CommonHeader',
  components: { GlobalAlertWindow },
@@ -56,6 +74,7 @@
  data () {
    return {
      title: process.env.VUE_APP_TITLE,
      headerNavData: {},
      visible: {
        // 修改密码
        changePwd: false
@@ -77,7 +96,8 @@
            { required: true, message: '请输入原始密码' }
          ],
          newPwd: [
            { required: true, message: '请输入新密码' }
            { required: true, message: '请输入密码', trigger: 'blur' },
            { validator: this.validatePassword, trigger: 'blur' }
          ],
          confirmPwd: [
            { required: true, message: '请再次输入新密码' }
@@ -87,9 +107,18 @@
    }
  },
  computed: {
    ...mapState(['menuData', 'userInfo']),
    title () {
      return this.$route.meta.title
    ...mapState(['menuData', 'userInfo', 'topMenuList'])
    // title () {
    //   return this.$route.meta.title
    // }
  },
  created () {
  },
  mounted () {
    // needChangePwd 0 : 默认密码需要修改,1 不需要
    if (this.userInfo && (!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0')) {
      this.visible.changePwd = true
    }
  },
  filters: {
@@ -113,6 +142,100 @@
        this.$refs.changePwdDataForm.resetFields()
      })
    },
    validatePassword (rule, value, callback) {
      if (!value) {
        callback(new Error('请输入密码'))
      } else {
        const lengthValid = /^.{6,20}$/.test(value)
        const hasLetter = /[a-zA-Z]/.test(value)
        const hasNumber = /[0-9]/.test(value)
        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value)
        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length
        if (!lengthValid) {
          callback(new Error('密码长度需为6到20个字符'))
        } else if (typesCount < 2) {
          callback(new Error('密码需包含字母、数字及特殊字符中的至少两种'))
        } else {
          callback() // 验证通过
        }
      }
    },
    getHeaderNav (item) {
      if (item.url && item.url === 'goHKAF' && item.params != null) {
        this.getHKAFHeaderNav(item.params)
      } else if (item.url && item.url.indexOf('http') === 0) {
        window.open(item.url, '_blank')
      }
    },
    getHKAFHeaderNav (type) {
      getAppHeaderNav(type).then(res => {
        window.open(res, '_blank')
      })
    },
    handleTest () {
      const myWindow = window.open('https://10.50.250.253/portal/ui/index?componentId=dfe&componentMenuId=process_apply')
      setTimeout(() => {
        const params = {
          componentId: 'dfe',
          componentMenuId: 'process_apply',
          callback: {
            method: 'dealTlncMsg',
            argument: {
              msgId: '98c256b9-aaff-11ef-8347-fa163ee2c57c',
              moduleId: 'dfeFlowTodoModuleId',
              msgTitle: '请及时处理13856591439发起的请假申请',
              msgStatus: '0',
              msgCreateTime: '今天 15:33',
              msgCreateTimeIso: '2024-11-25T15:33:42.000+08:00',
              serverTime: 1732531014591,
              menuCode: 'process_apply',
              msgStatusStr: '待处理',
              comId: 'dfe',
              userId: '13856591439',
              extendNoShow: '{"processInstanceId":"98a57fe0-aaff-11ef-8347-fa163ee2c57c","processId":"process_dabcfdd39f1b6f46d36a9f4ff6ce1080","param":{"sourceType":"todo","modelCode":"tb_leave_dfe_for_dfe_runtime","processNodeId":"UserTask_dde7d83377343a2d5fa1f60c23b023ef","taskId":"98c256b9-aaff-11ef-8347-fa163ee2c57c"},"process.param.appId":"32ca8770-6f85-11ec-b5a3-991864da52a6","appId":"32ca8770-6f85-11ec-b5a3-991864da52a6","name":"请假申请","taskId":"98c256b9-aaff-11ef-8347-fa163ee2c57c","taskNodeId":"UserTask_dde7d83377343a2d5fa1f60c23b023ef","url":"/dfe-form/process/tlnc/apply"}',
              targetComId: 'dfe',
              moduleName: '流程待办',
              tid: '99cad778-aaff-11ef-9dbf-ff08ba71965c',
              msgEndTime: null,
              msgEndTimeIso: '',
              picUrl: '',
              extendJson: '{"key1":"请及时处理陈鸿飞发起的请假申请"}',
              extendParam: null,
              extendCascade: null,
              createUser: '13856591439',
              webCascadeUrl: null,
              h5CascadeUrl: null,
              cascadeTodoOpenType: null,
              cascadeSourceConfigId: null,
              h5Url: '/h5/pages/form-page/form-page?returnPath=-1&appId=32ca8770-6f85-11ec-b5a3-991864da52a6&taskId=98c256b9-aaff-11ef-8347-fa163ee2c57c&processNodeId=UserTask_dde7d83377343a2d5fa1f60c23b023ef&modelCode=tb_leave_dfe_for_dfe_runtime&type=flowHandle&component=form-apply&_sn=true',
              segmentId: 'dfe-form',
              lastUsers: '陈鸿飞',
              currentUsers: '陈鸿飞',
              todoTypeCode: 'dfe@@tlnc_placeholder_tlnc@@dfeFlowTodoModuleId',
              currentUserIds: '13856591439',
              lastUserIds: '13856591439',
              msgDesc: null,
              widgetUrl: null,
              detailType: null,
              widgetWidth: null,
              widgetHeight: null,
              userIdList: null,
              statusName: null,
              arriveTime: null,
              stayTime: null,
              todoType: null,
              cascadePort: null,
              openMode: null
            }
          },
          msgType: 'tlnc'
        }
        const argus = JSON.stringify(params)
        myWindow.postMessage('{"method":"goToApp","argument":' + argus + '}', '*')
      }, 8000)
    },
    // 确定修改密码
    confirmChangePwd () {
      if (this.isWorking.changePwd) {
@@ -135,10 +258,11 @@
        })
          .then(() => {
            this.$tip.apiSuccess('修改成功')
            this.$store.commit('setUserInfo', { needChangePwd: 1 })
            this.visible.changePwd = false
          })
          .catch(e => {
            this.$tip.apiFailed(e)
            //  this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking.changePwd = false
@@ -155,7 +279,7 @@
          window.location.reload()
        })
        .catch(e => {
          this.$tip.apiFailed(e)
          // this.$tip.apiFailed(e)
        })
    }
  }
@@ -164,9 +288,40 @@
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
.common-header {
  background-color: #1457C7;
  background-color: #2080f7;
}
.list {
  flex: 1;
  display: flex;
  align-items: center;
  margin-left: 60px;
  .item {
    margin-right: 40px;
    font-size: 16px;
    font-weight: 400;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
    height: 40px;
    cursor: pointer;
    .linellae {
      width: 64px;
      height: 2px;
      background: #FFFFFF;
    }
  }
  .active {
    font-weight: 500;
  }
}
.header {
  overflow: hidden;
  // background: #fff;
@@ -175,16 +330,23 @@
  justify-content: space-between;
  .logo {
    background: url('../../assets/images/top_ic_chilun@2x.png') no-repeat;
    /* background: url("../../assets/images/top_ic_chilun@2x.png") no-repeat; */
    box-sizing: border-box;
    min-width: 280px;
    height: 70px;
    padding: 17px 30px;
    min-width: 360px;
    height: 56px;
    padding: 10px 30px;
    // flex-shrink: 0;
    line-height: 36px;
    font-size: 22px;
    font-weight: 600;
    color: #fff;
    display: flex;
    align-items: center;
    .title {
      width: 240px;
    }
    // display: inline;
    .title-en {
      font-size: 11px;
@@ -192,18 +354,22 @@
      color: rgb(202, 214, 238);
    }
  }
  .user {
    width: 712px;
    width: 212px;
    box-sizing: border-box;
    height: 70px;
    height: 56px;
    padding-right: 25px;
    background: url('../../assets/images/top_ic_bolang@2x.png') no-repeat;
    background: url("../../assets/images/top_ic_bolang@2x.png") no-repeat;
    flex-shrink: 0;
    text-align: right;
    cursor: pointer;
    .el-dropdown {
      top: 10px;
      top: 2px;
      color: #fff;
    }
    img {
      width: 32px;
      position: relative;
@@ -212,11 +378,13 @@
    }
  }
}
// 下拉菜单框
.el-dropdown-menu {
  width: 140px;
  .el-dropdown-menu__item:hover {
    background: #E3EDFB;
    background: #e3edfb;
    color: $primary-color;
  }
}