| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 | <template>  <div class="navbar">    <!-- <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> -->    <!-- <breadcrumb class="breadcrumb-container" /> -->    <div class="left-menu">      <i class='el-icon-location-information topIcon'></i>      <el-popover placement="top-start"                  width="200"                  trigger="hover"                  :content="organName">        <span slot="reference">{{ organName.length > 10 ? organName.substr(0, 10) + '...' : organName}}</span>      </el-popover>    </div>    <div class="right-menu">      <div class="msginfo"           v-permission="'/journals'"           @click="gotoRecode">        <img src="@/assets/images/base/base-bell.png"             alt="">        <!-- <div class="active"></div> -->      </div>      <el-dropdown class="avatar-container"                   trigger="click">        <div class="avatar-wrapper">          <img v-if="$store.getters.avatar"               :src="$store.getters.avatar"               class="user-avatar" />          <img v-else               src="@/assets/images/base/placehorder-icon.png" />          <!-- <i class="el-icon-caret-bottom" /> -->          <span>{{ username }}</span>        </div>        <el-dropdown-menu slot="dropdown"                          class="user-dropdown">          <!-- divided -->          <el-dropdown-item>            <span style="display:block;"                  @click="resetPassWord">修改密码</span>          </el-dropdown-item>          <el-dropdown-item>            <span style="display:block;"                  @click="logout">退出</span>          </el-dropdown-item>        </el-dropdown-menu>      </el-dropdown>    </div>    <el-dialog title="修改密码"               width="500px"               append-to-body               :visible.sync="resetVisible">      <el-form :model="resetForm"               label-position='right'               label-width="100px"               ref='pwdForm'>        <el-form-item label="手机号"                      prop="phone">          <div>{{this.$store.getters.phone}}</div>        </el-form-item>        <el-form-item label="新密码"                      :rules="[{ required: true, message: '密码不能为空',trigger: 'blur'},{pattern:/^[\w]{6,20}$/,message:'密码为6-20位',trigger: 'blur'}]"                      prop="password">          <el-input v-model.trim="resetForm.password"                    type='password'                    style="width:180px"                    autocomplete="off"></el-input>        </el-form-item>        <el-form-item label="再次输入"                      :rules="[{ required: true, message: '密码不能为空',trigger: 'blur'},{pattern:/^[\w]{6,20}$/,message:'密码为6-20位',trigger: 'blur'}]"                      prop="password2">          <el-input v-model.trim="resetForm.password2"                    type='password'                    style="width:180px"                    autocomplete="off"></el-input>        </el-form-item>        <el-form-item label="验证码"                      :rules="[{ required: true, message: '验证码不能为空',trigger: 'blur'}]"                      prop="authCode"                      style="">          <el-input v-model.trim="resetForm.authCode"                    style="width:180px"                    autocomplete="off"></el-input>          <el-button :disabled="isDisable"                     @click="getCode">{{ btnName }}</el-button>        </el-form-item>      </el-form>      <div slot="footer"           class="dialog-footer">        <el-button @click="resetVisible = false">取 消</el-button>        <el-button type="primary"                   @click="submitResetPassWord">确 定</el-button>      </div>    </el-dialog>  </div></template><script>import qs from 'qs'import axios from 'axios'import { mapGetters } from "vuex";// import Breadcrumb from '@/components/Breadcrumb'// import Hamburger from '@/components/Hamburger'import { resetPassword } from '@/api/buildTeam'export default {  data () {    return {      username: '',      organName: this.$store.getters.organName,      resetVisible: false,      resetForm: {        phone: '',        authCode: '',        password: '',        password2: ''      },      isDisable: false, // 是否允许发送验证码      timerCount: 60,      btnName: '获取验证码'    }  },  components: {    // Breadcrumb,    // Hamburger  },  computed: {    ...mapGetters(["sidebar", "avatar"])  },  mounted () {    // 手动加入    this.toggleSideBar();    this.username = this.$store.getters.name;  },  methods: {    toggleSideBar () {      this.$store.dispatch("app/toggleSideBar");    },    async logout () {      await this.$store.dispatch("user/logout");      // await this.$store.dispatch("permission/removePermission")      this.$router.push(`/login`);      window.location.reload()    },    gotoRecode () {      this.$router.push('/journal/journal')    },    resetPassWord () {      this.resetVisible = true;    },    submitResetPassWord () {      if (this.resetForm.password !== this.resetForm.password2) {        this.$message.error('两次密码必须相同')        return      }      this.$refs['pwdForm'].validate(res => {        if (res) {          // 发请求          resetPassword({ authCode: this.resetForm.authCode, mobile: this.$store.getters.phone, newPassword: this.resetForm.password }).then(res => {            if (res.code == 200) {              // 修改成功              this.$message.success('修改成功')              this.logout()            }          })        }      })    },    getCode () {      // 获取验证码      if (!this.$store.getters.phone) {        this.$message.error('请输入正确的手机号')        return      }      if (!this.isDisable) {        this.isDisable = true;        // 发请求成功后开启定时器        // 发送验证码         axios.post('/api-web/code/sendSms', qs.stringify({ mobile: this.$store.getters.phone })).then(res => {          if (res.data.code == 200) {            let timer = setInterval(res => {              if (this.timerCount <= 0) {                clearInterval(timer)                this.isDisable = false;                this.btnName = '获取验证码';                this.timerCount = 60;              } else {                this.timerCount--;                this.btnName = `${this.timerCount}s后重试`              }            }, 1000)          }        })      }    }  },  watch: {    resetVisible (val) {      if (!val) {        this.resetForm = {          phone: '',          authCode: '',          password: '',          password2: ''        }      }    }  }};</script><style lang="scss" scoped>.navbar {  display: flex;  flex-direction: row;  justify-content: space-between;  height: 60px;  overflow: hidden;  position: relative;  background: #fff;  box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.1);  h2 {    font-size: 18px;    line-height: 60px;    margin: 0 0 0 30px;    display: inline-block;  }  .hamburger-container {    line-height: 60px;    height: 100%;    float: left;    cursor: pointer;    transition: background 0.3s;    -webkit-tap-highlight-color: transparent;    &:hover {      background: rgba(0, 0, 0, 0.025);    }  }  .breadcrumb-container {    float: left;  }  .left-menu {    line-height: 60px;    padding-left: 22px;    font-size: 16px;    color: #444;    .topIcon {      width: 20px;      height: 25px;    }  }  .right-menu {    min-width: 204px;    float: right;    height: 100%;    line-height: 60px;    display: flex;    flex-direction: row;    justify-content: flex-start;    &:focus {      outline: none;    }    .msginfo {      display: flex;      flex-direction: row;      justify-content: flex-start;      align-items: center;      margin-right: 34px;      position: relative;      cursor: pointer;      img {        width: 23px;        height: 30px;      }      .active {        position: absolute;        width: 7px;        height: 7px;        background-color: #f97215;        border-radius: 50%;        top: 20px;        right: -4px;      }    }    .right-menu-item {      display: inline-block;      padding: 0 8px;      height: 100%;      font-size: 14px;      color: #5a5e66;      vertical-align: text-bottom;      &.hover-effect {        cursor: pointer;        transition: background 0.3s;        &:hover {          background: rgba(0, 0, 0, 0.025);        }      }    }    .avatar-container {      height: 60px;      margin-right: 42px;      cursor: pointer;      .avatar-wrapper {        position: relative;        display: flex;        flex-direction: row;        justify-content: flex-start;        align-items: center;        span {          margin-left: 15px;          font-size: 14px;          font-weight: 500;          color: rgba(68, 68, 68, 1);        }        .user-avatar {          cursor: pointer;          width: 32px;          height: 32px;          border: 2px solid #f0f2f5;          border-radius: 50%;        }        .el-icon-caret-bottom {          cursor: pointer;          position: absolute;          right: -20px;          top: 25px;          font-size: 14px;        }      }    }  }}</style>
 |