| <template> | 
|     <div class="wrap"> | 
|         <div class="introduce"> | 
|             <h2>{{systemTitle}}</h2> | 
|         </div> | 
|         <div class="login"> | 
|             <h1>系统登录 / LOGIN IN</h1> | 
|             <div class="login_type"> | 
|                 <div :class="active === 1 ? 'login_type_item active' : 'login_type_item'" @click="handleClick(1)">账号登录</div> | 
|                 <div :class="active === 2 ? 'login_type_item active' : 'login_type_item'" @click="handleClick(2)">手机登录</div> | 
|             </div> | 
|             <div class="info-input"> | 
|                 <template v-if="active === 1"> | 
|                     <el-input v-model="username" placeholder="请输入用户名" prefix-icon="el-icon-user-solid" maxlength="50" v-trim/> | 
|                     <el-input v-model="password" placeholder="请输入密码" type="password" prefix-icon="eva-icon-password" maxlength="30" show-password/> | 
|                     <div class="captcha-input"> | 
|                         <el-input v-model="captcha.value" placeholder="图片验证码" prefix-icon="eva-icon-shield" maxlength="4" @keypress.enter.native="login"/> | 
|                         <img v-if="!captcha.loading" :src="captcha.uri" @click="refreshCaptcha"> | 
|                         <span v-else><i class="el-icon-loading"></i></span> | 
|                     </div> | 
|                 </template> | 
|                 <template v-else> | 
|                     <el-input v-model="phone" placeholder="请输入手机号" prefix-icon="el-icon-phone" maxlength="11" v-trim/> | 
|                     <div class="captcha-input"> | 
|                         <el-input v-model="code" placeholder="请输入验证码" prefix-icon="eva-icon-shield" @keypress.enter.native="login" v-trim/> | 
|                         <el-button type="primary" style="width: 120px; margin-left: 20px;" @click="send" v-if="num === 0">发送验证码</el-button> | 
|                         <el-button type="primary" style="width: 120px; margin-left: 20px;" v-else>{{num}}</el-button> | 
|                     </div> | 
|                 </template> | 
|             </div> | 
|           <div style="text-align: left;margin-bottom: 15px;font-size: 14px"> | 
|             <el-checkbox :true-label="1" :false-label="0"   v-model="readed"/> | 
|               我已阅读和同意《<span @click="agreeType=0;title1='服务协议';visible1=true" style="color: dodgerblue;cursor: pointer">服务协议</span>》和 | 
|             《<span  @click="agreeType=1;title1='隐私协议';visible1=true" style="color: dodgerblue;cursor: pointer">隐私协议</span>》 | 
|           </div> | 
|           <el-button :loading="loading" @click="login">登  录</el-button> | 
|         </div> | 
|         <el-dialog | 
|             class="center-title" | 
|             :title="title1" | 
|             width="70%" | 
|             height="70%" | 
|             text="用户协议" | 
|             :visible.sync="visible1" | 
|         > | 
|           <div class="agree-list" v-if="agreeType==0" v-html="agreement0"> | 
|           </div> | 
|           <div class="agree-list"  v-else v-html="agreement1"> | 
|           </div> | 
|           <template  v-slot:footer> | 
|             <el-button type="primary"   @click="readed=1;visible1=false">同意</el-button> | 
|             <el-button @click="visible1=false">返回</el-button> | 
|           </template> | 
|         </el-dialog> | 
|     </div> | 
|   | 
| </template> | 
| <script> | 
| import { mapMutations } from 'vuex' | 
| import { getCaptcha, loginByPassword, loginByPhone } from '@/api/system/common' | 
| import { sendSms } from '@/api/business/smsEmail' | 
| import { getAgreement } from '@/api/system/dict' | 
|   | 
| export default { | 
|   name: 'Login', | 
|   data () { | 
|     return { | 
|       title1:'服务协议', | 
|       systemTitle: process.env.VUE_APP_SYSTEM_TITLE, | 
|       loading: false, | 
|       username: '', | 
|       password: '', | 
|       phone: '', | 
|       visible1:false, | 
|       code: '', | 
|       readed: 0, | 
|       agreeType:'', | 
|       active: 1, | 
|       num: 0, | 
|       timer: null, | 
|       agreement0: '这是服务协议', | 
|       agreement1: '这是隐私协议', | 
|       // 验证码 | 
|       captcha: { | 
|         loading: false, | 
|         value: '', | 
|         uuid: '', | 
|         uri: '' | 
|       } | 
|     } | 
|   }, | 
|   methods: { | 
|     ...mapMutations(['setUserInfo']), | 
|     handleClick (e) { | 
|       this.active = e | 
|       this.username = '' | 
|       this.password = '' | 
|       this.phone = '' | 
|       this.code = '' | 
|     }, | 
|     getAgree () { | 
|       getAgreement({}).then(res => { | 
|         if (res && res.length >= 2) { | 
|           this.agreement0 = res[0] | 
|           this.agreement1 = res[1] | 
|         } | 
|       }) | 
|     }, | 
|     send () { | 
|       if (!this.phone) { | 
|         this.$message.warning('请先输入手机号') | 
|         return | 
|       } | 
|       var reg = /^1[3456789]\d{9}$/ | 
|       if (!reg.test(this.phone)) { | 
|         this.$message.warning('手机号不合法') | 
|         return | 
|       } | 
|       sendSms({ | 
|         phone: this.phone | 
|       }).then(res => { | 
|         this.num = 60 | 
|         this.setTimer() | 
|       }) | 
|     }, | 
|     setTimer () { | 
|       this.timer = setInterval(() => { | 
|         if (this.num === 0) { | 
|           this.num = 0 | 
|           clearInterval(this.timer) | 
|           this.timer = null | 
|           return | 
|         } | 
|         this.num -= 1 | 
|       }, 1000) | 
|     }, | 
|     // 登录 | 
|     login () { | 
|       if (this.loading) { | 
|         return | 
|       } | 
|       if (this.readed != 1) { | 
|         this.$message.error('请先阅读和同意《服务协议》和《隐私协议》') | 
|         return | 
|       } | 
|       if (this.active === 1) { | 
|         if (!this.__check()) { | 
|           return | 
|         } | 
|         this.loading = true | 
|         loginByPassword({ | 
|           username: this.username.trim(), | 
|           password: this.password, | 
|           code: this.captcha.value.trim(), | 
|           uuid: this.captcha.uuid | 
|         }) | 
|           .then(() => { | 
|             window.location.href = process.env.VUE_APP_CONTEXT_PATH | 
|           }) | 
|           .catch(e => { | 
|             this.refreshCaptcha() | 
|             this.$tip.apiFailed(e) | 
|           }) | 
|           .finally(() => { | 
|             this.loading = false | 
|           }) | 
|       } else { | 
|         if (!this.phone) { | 
|           this.$tip.error('请输入手机号') | 
|           return | 
|         } | 
|         if (!this.code) { | 
|           this.$tip.error('请输入验证码') | 
|           return | 
|         } | 
|         this.loading = true | 
|         loginByPhone({ | 
|           phone: this.phone, | 
|           code: this.code.trim() | 
|         }) | 
|           .then(() => { | 
|             window.location.href = process.env.VUE_APP_CONTEXT_PATH | 
|           }) | 
|           .catch(e => { | 
|             this.$tip.apiFailed(e) | 
|           }) | 
|           .finally(() => { | 
|             this.loading = false | 
|           }) | 
|       } | 
|     }, | 
|     // 刷新验证码 | 
|     refreshCaptcha () { | 
|       this.captcha.loading = true | 
|       getCaptcha() | 
|         .then(data => { | 
|           this.captcha.uri = data.image | 
|           this.captcha.uuid = data.uuid | 
|         }) | 
|         .catch(e => { | 
|           this.$tip.apiFailed(e) | 
|         }) | 
|         .finally(() => { | 
|           setTimeout(() => { | 
|             this.captcha.loading = false | 
|           }, 150) | 
|         }) | 
|     }, | 
|     // 登录前验证 | 
|     __check () { | 
|       if (this.username.trim() === '') { | 
|         this.$tip.error('请输入用户名') | 
|         return false | 
|       } | 
|       if (this.password === '') { | 
|         this.$tip.error('请输入密码') | 
|         return false | 
|       } | 
|       if (this.captcha.value.trim() === '') { | 
|         this.$tip.error('请输入图片验证码') | 
|         return false | 
|       } | 
|       return true | 
|     } | 
|   }, | 
|   created () { | 
|     this.refreshCaptcha() | 
|     this.getAgree() | 
|     document.title = this.systemTitle | 
|   } | 
| } | 
| </script> | 
|   | 
| <style scoped lang="scss"> | 
|     @import "@/assets/style/variables.scss"; | 
|     .agree-list{ | 
|       height: 550px; | 
|       //max-height: 50%; | 
|       overflow: auto; | 
|     } | 
|     $input-gap: 30px; | 
|     .wrap { | 
|         display: flex; | 
|         width: 100%; | 
|         height: 100vh; | 
|         background-image: url("../assets/images/login.jpg"); | 
|         background-repeat: no-repeat; | 
|         background-size: auto 180%; | 
|         background-clip: content-box; | 
|         background-position: center; | 
|         // 左边介绍 | 
|         .introduce { | 
|             padding-left: 10%; | 
|             width: 100%; | 
|             height: 100%; | 
|             box-sizing: border-box; | 
|             color: #fff; | 
|             background: rgba(0, 0, 0, 0.4); | 
|             display: flex; | 
|             flex-direction: column; | 
|             justify-content: center; | 
|             h2 { | 
|                 font-size:34px; | 
|                 font-style: italic; | 
|                 font-weight: 900; | 
|                 margin-top: 50px; | 
|             } | 
|             h3 { | 
|                 font-size: 49px; | 
|                 font-weight: 300; | 
|                 margin: 25px 0; | 
|             } | 
|         } | 
|         // 右边登录 | 
|         .login { | 
|             height: 100%; | 
|             width: 38%; | 
|             max-width: 560px; | 
|             min-width: 460px; | 
|             flex-shrink: 0; | 
|             text-align: center; | 
|             background: #fff; | 
|             padding: 0 80px; | 
|             display: flex; | 
|             flex-direction: column; | 
|             justify-content: center; | 
|             box-sizing: border-box; | 
|             h1 { | 
|                 font-size: 28px; | 
|                 font-weight: 500; | 
|             } | 
|             .login_type { | 
|                 width: 100%; | 
|                 height: 50px; | 
|                 display: flex; | 
|                 align-items: center; | 
|                 margin: 20px 0; | 
|                 .active { | 
|                     box-sizing: border-box; | 
|                     color: rgba(64, 106, 255, 0.996) !important; | 
|                     border-bottom: 1px solid rgba(64, 106, 255, 0.996) !important; | 
|                 } | 
|                 .login_type_item { | 
|                     flex: 1; | 
|                     height: 100%; | 
|                     display: flex; | 
|                     align-items: center; | 
|                     justify-content: center; | 
|                     color: black; | 
|                     font-size: 14px; | 
|                     cursor: pointer; | 
|                 } | 
|             } | 
|             .info-input { | 
|                 margin-bottom: 15px; | 
|                 /deep/ .el-input { | 
|                     margin-top: 30px; | 
|                     &:first-child { | 
|                         margin-top: 0 !important; | 
|                     } | 
|                     .el-input__inner { | 
|                         height: 50px; | 
|                         background: #F9F9F9; | 
|                         border: 1px solid transparent; | 
|                         &:focus { | 
|                             border: 1px solid $primary-color; | 
|                         } | 
|                     } | 
|                 } | 
|             } | 
|             // 验证码输入 | 
|             .captcha-input { | 
|                 display: flex; | 
|                 margin-top: $input-gap; | 
|                 height: 50px; | 
|                 .el-input { | 
|                     width: 100%; | 
|                     margin-top: 0; | 
|                 } | 
|                 span, img { | 
|                     width: 45%; | 
|                     height: 100%; | 
|                     flex-shrink: 0; | 
|                     margin-left: 16px; | 
|                 } | 
|                 span { | 
|                     display: flex; | 
|                     align-items: center; | 
|                     justify-content: center; | 
|                     background: #f7f7f7; | 
|                     border-radius: 8px; | 
|                 } | 
|             } | 
|             .el-button { | 
|                 height: 50px; | 
|                 width: 100%; | 
|                 color: #fff; | 
|                 font-size: 16px; | 
|                 background: linear-gradient(130deg, $primary-color + 20 0%, $primary-color - 20 100%); | 
|             } | 
|         } | 
|     } | 
|    ::v-deep .center-title .el-dialog__title { | 
|       text-align: center; | 
|       width: 100%; | 
|       font-size: 18px; | 
|       font-weight: bold; | 
|   | 
|     } | 
|     ::v-deep  .el-dialog__header{ | 
|       text-align: center; | 
|     } | 
| </style> |