<template>
  <div class="validation">
    <div class="container">
      <div class="content" v-show="goFirstStep">
        <div class="content-top">
          <h3 @click="getVerifyWay">验证手机</h3>
          <div class="step">
            <img src="/images/all/step01.png" alt=""/>
            <div class="step-item"><span class="active">账号验证</span><span>新手机号码</span><span>设置完成</span></div>
          </div>
        </div>
        <div class="choose">
          <div v-show="hasValidPhoneWay"
               @click="chooseWay(1)">
            <img src="/images/all/icon01.png" alt="" class="first mob"/>
            <span>通过验证手机</span><i class="fa fa-angle-right second"></i>
          </div>
          <div v-show="hasValidEmailWay"
               @click="chooseWay(2)">
            <img src="/images/all/icon02.png" alt="" class="first"/>
            <span>通过验证邮箱</span><i class="fa fa-angle-right second"></i>
          </div>
          <div v-show="hasValidQuestionsWay"
               @click="chooseWay(3)">
            <img src="/images/all/icon03.png" alt="" class="first"/>
            <span>通过验证密保</span><i class="fa fa-angle-right second"></i>
          </div>
          <div v-show="showManualAppeal"
               @click="goAccountAppeal()">
            <img src="/images/all/icon04.png" alt="" class="first"/>
            <span>通过人工申诉</span><i class="fa fa-angle-right second"></i>
          </div>
        </div>
      </div>
      <div class="content" v-show="showPhoneValid">
        <div class="content-top">
          <h3>验证手机</h3>
          <div class="step">
            <img src="/images/all/step01.png" alt=""/>
            <div class="step-item"><span class="active">账号验证</span><span>新手机号码</span><span>设置完成</span></div>
            <a @click="goPreviousStep" class="return"><img src="/images/all/return.png" alt=""/></a>
          </div>
        </div>
        <div class="content-bottom">
          <span class="use">使用手机号<em>{{secretMobile}}</em>接收验证码</span>
          <div>
            <el-form :model="valid" :rules="rules" ref="valid" label-width="100px" class="demo-ruleForm">
              <el-form-item prop="code">
                <el-input type="text" v-model="valid.code"
                          v-bind:class="{ active: codeErrorChecked }"
                          auto-complete="off" class="msg"
                          placeholder="短信验证码"></el-input>
                <el-button type="primary" class="code"
                           v-show="sendAccountCode"
                           @click="getCheckCode">获取验证码</el-button>
                <el-button type="primary"  v-show="!sendAccountCode" class="code code-send">已发送({{account_time}}s)</el-button>
                <span v-show="codeErrorChecked" class="tip codeError-tip" >{{codeErrorMsg}}</span>
              </el-form-item>
              <el-form-item>
                <a class="btn finish"
                   :disabled="!codeChecked"
                   @click="goNextStep">下一步</a>
              </el-form-item>
            </el-form>
          </div>
        </div>
      </div>
      <div class="content" v-show="showEmailValid">
        <div class="content-top">
          <h3>验证手机</h3>
          <div class="step">
            <img src="/images/all/step01.png" alt=""/>
            <div class="step-item"><span class="active">账号验证</span><span>新手机号码</span><span>设置完成</span></div>
            <a href="" class="return"><img src="/images/all/return.png" alt=""/></a>
          </div>
        </div>
        <div class="content-bottom">
          <span class="use">使用电子邮箱<em>183****08@qq.com</em>进行验证，有效期7天</span>
          <div class="warp"><button class="btn">发送验证请求</button></div>
        </div>
      </div>
      <div class="content" v-show="showQuestionsValid">
        <div class="content-top">
          <h3>验证手机</h3>
          <div class="step">
            <img src="/images/all/step01.png" alt=""/>
            <div class="step-item"><span class="active">账号验证</span><span>新手机号码</span><span>设置完成</span></div>
            <a href="" class="return"><img src="/images/all/return.png" alt=""/></a>
          </div>
        </div>
        <form action="">
          <div class="form-group">
            <input type="text" value="问题一" class="answer form-control"/>
            <ul>
              <li>您的母亲的生日是几月几日？</li>
              <li>您最喜欢的宠物叫什么名字？</li>
              <li>您最喜欢的电影片名是什么？</li>
              <li>您的学号是？</li>
            </ul>
          </div>
          <div class="form-group">
            <input type="text" class="form-control" placeholder="答案一"/>
          </div>
          <div class="form-group">
            <input type="text" value="问题一" class="answer form-control"/>
            <ul>
              <li>您的爷爷叫什么名字？</li>
              <li>您的配偶的生日是几月几日？</li>
              <li>您最喜欢的歌手是谁？</li>
              <li>您就读的小学学校全称是？</li>
            </ul>
          </div>
          <div class="form-group">
            <input type="text" class="form-control" placeholder="答案二"/>
          </div>
          <button class="btn">提交</button>
        </form>
      </div>
      <div class="content" v-show="goSecondStep">
        <div class="content-top">
          <h3>验证手机</h3>
          <div class="step">
            <img src="/images/all/step02.png" alt=""/>
            <div class="step-item"><span class="active">账号验证</span><span class="active">新手机号码</span><span>设置完成</span></div>
          </div>
        </div>
        <div class="content-bottom">
          <div>
            <el-form :model="valid2" :rules="rules2" ref="valid2" label-width="100px" class="demo-ruleForm">
              <el-form-item prop="mobile">
                <el-input v-model="valid2.mobile" placeholder="新手机号码"></el-input>
              </el-form-item>
              <el-form-item prop="code">
                <el-input type="text" v-model="valid2.code"
                          v-bind:class="{ active: this.secondStepCodeErrorChecked }"
                          auto-complete="off"
                          class="msg"
                          placeholder="短信验证码"></el-input>
                <el-button type="primary" class="code"
                           v-show="showSecondStepCode"
                           @click="getSecondCheckCode"
                           :disabled="getCodeBtnIsDisabled">获取验证码</el-button>
                <el-button type="primary"  v-show="!showSecondStepCode" class="code code-send">已发送({{second_step_time}}s)</el-button>
                <span v-show="secondStepCodeErrorChecked" class="tip codeError-tip">{{secondCodeErrorMsg}}</span>
              </el-form-item>
              <el-form-item>
                <a class="btn finish"
                    :disabled="!mobileSecondChecked || !secondCodeChecked"
                    @click="setNewMobile">确认</a>
              </el-form-item>
            </el-form>
          </div>
        </div>
      </div>
      <div class="content" v-show="goLastStep">
        <div class="content-top">
          <h3>验证手机</h3>
          <div class="step">
            <img src="/images/all/step03.png" alt=""/>
            <div class="step-item"><span class="active">账号验证</span><span class="active">新手机号码</span><span class="active">设置完成</span></div>
          </div>
        </div>
        <div class="content-bottom">
          <p class="passed"><img src="/images/all/pass.png" alt=""/>设置成功</p>
          <span>及时更换最新的手机号码能极大地提高账号安全性哦！</span>
          <div class="close-btn" @click="goCloudCenter">关闭</div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'validation',
    data () {
//      第一步校验验证码
      var validateFirstCode = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('请填写正确的验证码'))
          this.codeErrorChecked = false
          this.codeChecked = false
        } else {
          if (this.valid.code !== '') {
            if (this.token !== '') {
              if (this.valid.code !== '' && this.getMobile !== '') {
                let param = new FormData()
                param.append('mobile', this.getMobile)
                param.append('code', this.valid.code)
                param.append('token', this.token)
                let config = {
                  headers: {'Content-Type': 'multipart/form-data'}
                }
                this.$http.post(`/update/user/checkCode/mobile`, param, config)
                  .then(response => {
                    if (response.data.success) {
                      this.codeChecked = true
                      this.codeErrorChecked = false
                    } else {
                      this.codeErrorChecked = true
                      this.codeChecked = false
                      return Promise.reject(response.data)
                    }
                  }).catch(err => {
                    this.codeErrorMsg = err.errMsg
                  })
              }
            } else {}
          }
          callback()
        }
      }
//      第二步
      var validateSecondMobile = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('请填写正确的手机号'))
          this.getCodeBtnIsDisabled = true
          this.mobileSecondChecked = false
        } else {
          if (this.valid2.mobile !== '') {
            var reg = /^1[0-9]{10}$/
            if (!reg.test(value)) {
              callback(new Error('请填写正确的手机号'))
              this.getCodeBtnIsDisabled = true
              this.mobileSecondChecked = false
            } else {
              this.getCodeBtnIsDisabled = false
              this.mobileSecondChecked = true
            }
          }
          callback()
        }
      }
      var validateSecondCode = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('请填写正确的验证码'))
          this.secondStepCodeErrorChecked = false
          this.secondCodeChecked = false
        } else {
          if (this.valid2.code !== '') {
            if (this.secondToken !== '') {
              if (this.valid2.code !== '' && this.valid2.mobile !== '') {
                let param = new FormData()
                param.append('mobile', this.valid2.mobile)
                param.append('code', this.valid2.code)
                param.append('token', this.secondToken)
                let config = {
                  headers: {'Content-Type': 'multipart/form-data'}
                }
                this.$http.post(`/update/user/checkCode/mobile`, param, config)
                  .then(response => {
                    if (response.data.success) {
                      this.secondCodeChecked = true
                      this.secondStepCodeErrorChecked = false
                    } else {
                      this.secondStepCodeErrorChecked = true
                      this.secondCodeChecked = false
                      return Promise.reject(response.data)
                    }
                  }).catch(err => {
                    this.secondCodeErrorMsg = err.errMsg
                  })
              }
            } else {}
          }
          callback()
        }
      }
      return {
        activeTab: 0,
        goFirstStep: true,
        goSecondStep: false,
        goLastStep: false,
        hasValidPhoneWay: false,
        hasValidQuestionsWay: false,
        hasValidEmailWay: false,
        showManualAppeal: false,
        showPhoneValid: false,
        showEmailValid: false,
        showQuestionsValid: false,
        sendAccountCode: true,
        account_time: 0,
        second_step_time: 0,
        codeErrorChecked: false,
        secondStepCodeErrorChecked: false,
        codeChecked: false,
        secondCodeChecked: false,
        secretMobile: '',
        getMobile: '',
        codeErrorMsg: '',
        secondCodeErrorMsg: '',
        firstStepToken: '',
        mobileSecondChecked: false,
        getCodeBtnIsDisabled: true,
        showSecondStepCode: true,
        valid: {
          code: ''
        },
        valid2: {
          mobile: '',
          code: ''
        },
        rules: {
          code: [
            {validator: validateFirstCode, trigger: 'blur'}
          ]
        },
        rules2: {
          mobile: [
            {validator: validateSecondMobile, trigger: 'blur'}
          ],
          code: [
            {validator: validateSecondCode, trigger: 'blur'}
          ]
        }
      }
    },
    computed: {
      logged () {
//        console.log(this.$store.state.option.isLogin.data.content)
        return this.$store.state.option.isLogin.data.content
      }
    },
    mounted () {
//      验证是否登录
      this.$nextTick(() => {
        this.isLogin()
        // 刷新统计信息
        setInterval(() => {
          this.isLogin()
        }, 10000)
      })
//      获取验证方式
      this.$nextTick(() => {
        this.getVerifyWay()
      })
    },
    methods: {
//      判断用户是否登录
      isLogin () {
        if (!this.logged.isLogin) {
//          console.log(this.logged.isLogin)
//          未登录跳到登录页面
          window.location.href = '/'
        }
      },
//      获取验证方式
      getVerifyWay () {
        this.$http.get('/update/user/checkType').then(response => {
          if (response.data.success) {
            if (!response.data.content) {
              this.goSecondStep = true
              this.goFirstStep = false
              this.showManualAppeal = false
            } else {
              if (response.data.content.mobile) {
                this.hasValidPhoneWay = true
                this.showManualAppeal = true
                this.getMobile = response.data.content.mobile
                var reg = /^(\d{3})\d{6}(\d{2})$/
                this.secretMobile = this.getMobile.replace(reg, '$1******$2')
              }
              if (response.data.content.questions) {
                this.hasValidQuestionsWay = true
                this.showManualAppeal = true
              }
              if (response.data.content.email) {
                this.hasValidEmailWay = true
                this.showManualAppeal = true
              }
              this.goSecondStep = false
              this.goFirstStep = true
            }
          }
        })
      },
//      选择方式
      chooseWay (flag) {
        if (flag === 1) {
          this.showPhoneValid = true
        } else if (flag === 2) {
          this.showEmailValid = true
        } else if (flag === 3) {
          this.showQuestionsValid = true
        }
        this.goFirstStep = false
      },
//      跳转到人工申诉页面
      goAccountAppeal () {
        window.location.href = '/appeals/accountAppeal'
      },
//      返回上一步
      goPreviousStep () {
        this.goFirstStep = true
        this.showPhoneValid = false
        this.showEmailValid = false
        this.showQuestionsValid = false
      },
//      获取第一步手机验证码
      getCheckCode () {
        this.$http.get(`/update/user/check/mobile`, {params: {mobile: this.getMobile}})
          .then(response => {
            this.token = response.data.content.token
            console.log(this.token)
            if (this.token !== '') {
              this.$message({
                message: '验证码已经发送到您的手机，请注意查收',
                type: 'success'
              })
              this.sendAccountCode = false
              this.account_time = 60
              var accountTime = setInterval(() => {
                this.account_time--
                if (this.account_time <= 0) {
                  this.sendAccountCode = true
                  clearInterval(accountTime)
                }
              }, 1000)
            }
          }).catch(err => {
            this.$message.error(err.errMsg)
          })
      },
//      手机号验证下一步
      goNextStep () {
        if (this.codeChecked) {
          console.log(this.token)
          let param = new FormData()
          param.append('mobile', this.getMobile)
          param.append('code', this.valid.code)
          param.append('token', this.token)
          let config = {
            headers: {'Content-Type': 'multipart/form-data'}
          }
          this.$http.post(`/update/user/check/mobile`, param, config)
            .then(response => {
              if (response.data.success) {
                this.firstStepToken = response.data.content
                this.goSecondStep = true
                this.showPhoneValid = false
              } else {
                this.goSecondStep = false
                this.showPhoneValid = true
                return Promise.reject(response.data)
              }
            }).catch(err => {
              this.$message.error(err.errMsg)
            })
        }
      },
//      获取第二步手机验证码
      getSecondCheckCode () {
        this.$http.get(`/update/user/setMobile`, {params: {mobile: this.valid2.mobile, token: this.firstStepToken}})
          .then(response => {
            this.secondToken = response.data.content.token
            if (this.secondToken !== '') {
              this.$message({
                message: '验证码已经发送到您的手机，请注意查收',
                type: 'success'
              })
              this.showSecondStepCode = false
              this.second_step_time = 60
              var secondStepTime = setInterval(() => {
                this.second_step_time--
                if (this.second_step_time <= 0) {
                  this.showSecondStepCode = true
                  clearInterval(secondStepTime)
                }
              }, 1000)
            }
          }).catch(err => {
            console.log(err)
          })
      },
//      设置新手机号
      setNewMobile () {
        if (this.mobileSecondChecked && this.secondCodeChecked) {
          let param = new FormData()
          param.append('mobile', this.valid2.mobile)
          param.append('code', this.valid2.code)
          param.append('token', this.secondToken)
          let config = {
            headers: {'Content-Type': 'multipart/form-data'}
          }
          this.$http.post(`/update/user/setMobile`, param, config)
            .then(response => {
              if (response.data.success) {
                console.log(response.data.success)
                this.goLastStep = true
                this.goSecondStep = false
              } else {
                this.goLastStep = false
                this.goSecondStep = true
                return Promise.reject(response.data)
              }
            }).catch(err => {
              console.log(err)
            })
        }
      },
//      跳转至云中心页面
      goCloudCenter () {
        window.location.href = '/cloudcenter'
      }
    }
  }
</script>
<style lang="scss" scoped>
  .validation {
    margin: 0 auto;
    width: 100%;
    background: #eee;
    .container{
      padding-top: 50px;
      margin: 0 auto;
      width: 980px;
      text-align: center;
      .content{
        padding: 0 50px;
        margin: 50px auto 0;
        width: 100%;
        /*height: 540px;*/
        text-align: center;
        background: #fff;
          .content-top{
            height: 80px;
            line-height: 80px;
            h3{
              margin-bottom: 0;
              font-size: 24px;
              color: #000;
              border-bottom: 1px solid #dcdcdc;
            }
            .step{
              position: relative;
              margin-top: 10px;
              img{
                width: 315px;
                height: 46px;
              }
              .step-item{
                position: absolute;
                top: 45px;
                left: 265px;
                span{
                  margin-right: 78px;
                  font-size: 14px;
                  color: #b4b4b4;
                }
                span.active {
                  color: #0076ad;
                }
              }
            }
          }
          form {
            padding-bottom: 44px;
              input{
                padding: 0 0 0 18px;
                width: 360px;
                height: 44px;
                line-height: 44px;
                font-size: 14px;
                color: #000;
                border-radius: 0;
              }
              input.answer {
                background: url("/images/all/more.png") no-repeat 325px center;
                cursor: pointer;
              }
              ul{
                display: none;
                position: absolute;
                top: 44px;
                left: 0;
                width: 360px;
                background: #fff;
                box-shadow: 0 0 5px rgba(0,0,0,.5);
                -moz-box-shadow: 0 0 5px rgba(0,0,0,.5);
                -o-box-shadow: 0 0 5px rgba(0,0,0,.5);
                -webkit-box-shadow: 0 0 5px rgba(0,0,0,.5);
                z-index: 10;
                li{
                  padding-left: 18px;
                  width: 100%;
                  height: 30px;
                  line-height: 30px;
                  text-align: left;
                  font-size: 14px;
                  color: #000;
                  cursor: pointer;
                  &:hover{
                    background: #0076ad;
                    color: #fff;
                   }
                }
              }
              span.tip{
                position: absolute;
                top: 0;
                right: -238px;
                font-size: 13px;
                color: #8c8c8c;
                a{
                  font-size: 13px;
                  color: #0076ad;
                }
              }
              span.tip.codeError-tip{
                position: absolute;
                top: 3px;
                left: 378px;
                width: 200px;
                text-align: left;
                color: #ff4949;
                font-size: 12px;
              }
              i{
                position: absolute;
                top: 13px;
                left: 20px;
                font-size: 20px;
                color: #a0a0a0;
              }
            .btn {
              margin: 34px 0 16px 0;
              width: 360px;
              height: 44px;
              line-height: 44px;
              font-size: 16px;
              color: #fff;
              background: #0076AD;
              border-radius: 3px;
            }
          }
          .content-bottom{
            margin: 155px auto 0;
            padding-bottom: 50px;
            width: 360px;
            div.warp{
              padding-bottom: 65px;
            }
            p{
              font-size: 24px;
              color: #323232;
              img{
                margin-right: 20px;
                width: 30px;
                height: 28px;
              }
            }
            p.pass{
              font-size: 24px;
              color: #e77405;
              img{
                height: 30px;
              }
            }
            p.passed {
              color: #2ab300;
              img{
                height: 30px;
              }
            }
            span{
              display: inline-block;
              margin: 15px 0 140px 0;
              font-size: 14px;
              color: #8b8b8b;
            }
            .close-btn{
              margin: 0 auto;
              width: 200px;
              height: 36px;
              line-height: 36px;
              font-size: 14px;
              text-align: center;
              color: #323232;
              border: 1px solid #d2d2d2;
              border-radius: 3px;
              cursor: pointer ;
            }
            span.use{
              display: inline-block;
              margin-bottom: 30px;
              width: 360px;
              font-size: 14px;
              color: #000;
              text-align: left;
              em{
                font-size: 14px;
                font-style: normal;
                color: #000;
              }
            }
            .form-group {
              margin: 0 auto 16px;
              position: relative;
              width: 360px;
              height: 44px;
              line-height: 44px;
              input{
                padding: 0 0 0 18px;
                width: 360px;
                height: 44px;
                line-height: 44px;
                font-size: 14px;
                color: #000;
                border-radius: 0;
              }
              input.msg{
                float: left;
                width: 210px;
                padding: 0 0 0 18px;
                height: 44px;
                line-height: 44px;
                font-size: 14px;
                color: #000;
                border-radius: 0;
              }
              span.msg{
                float: right;
                margin: 0;
                width: 130px;
                height: 44px;
                line-height: 44px;
                text-align: center ;
                font-size: 14px;
                color: #5a5a5a;
                background: #f4f4f4;
                border: 1px solid #dcdcdc;
                cursor: pointer;
              }
              span.msg.send{
                background: #d2d2d2;
                color: #fff;
              }
            }
            .btn {
              margin: 34px 0 10px 0;
              width: 360px;
              height: 44px;
              line-height: 44px;
              font-size: 16px;
              color: #fff;
              background: #0076AD;
              border-radius: 3px;
            }
          }
          .choose{
            margin: 155px auto 0;
            padding-bottom: 44px;
            div{
              padding: 0 15px;
              margin: 0 auto 16px;
              width: 360px;
              height: 60px;
              line-height: 60px;
              text-align: left;
              overflow: hidden;
              border: 1px solid #d2d2d2;
              cursor: pointer;
              &:hover,&.active{
                border-color: #0076ad;
                span{
                  color: #0076ad;
                }
                i.second {
                  color: #0076ad;
                }
               }
                img.first{
                  float: left;
                  margin: 24px 20px 0 0;
                  font-size: 20px;
                  color: #323232;
                }
                img.first.mob{
                  margin: 22px 20px 0 5px;
                  font-size: 28px;
                }
                i.second {
                  float: right;
                  margin: 20px 0 0 5px;
                  font-size: 20px;
                  color: #323232;
                }
                span{
                  float: left;
                  font-size: 14px;
                  color: #323232;
                }
            }
          }
        a.return{
          position: absolute;
          left: 0;
          top: -15px;
          img{
            width: 34px !important;
            height: 34px !important;
          }
        }
      }
    }
  }
</style>
