|  |  | 
 |  |  | <template> | 
 |  |  |   <div class="wrap"> | 
 |  |  |     <div class="introduce"> | 
 |  |  |       <h2>预选清单查询系统</h2> | 
 |  |  |     </div> | 
 |  |  |     <div class="login"> | 
 |  |  |       <h1>系统登录 / LOGIN IN</h1> | 
 |  |  |       <div class="info-input"> | 
 |  |  |         <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 class="wrap"> | 
 |  |  |         <div class="introduce"> | 
 |  |  |             <h2>云易保</h2> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |       <el-button :loading="loading" @click="login">登  录</el-button> | 
 |  |  |         <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" maxlength="4" @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> | 
 |  |  |             <el-button :loading="loading" @click="login">登  录</el-button> | 
 |  |  |         </div> | 
 |  |  |     </div> | 
 |  |  |   </div> | 
 |  |  | </template> | 
 |  |  |  | 
 |  |  | <script> | 
 |  |  | import { mapMutations } from 'vuex' | 
 |  |  | import { getCaptcha, loginByPassword } from '@/api/system/common' | 
 |  |  |     import { mapMutations } from 'vuex' | 
 |  |  |     import { getCaptcha, loginByPassword, loginByPhone } from '@/api/system/common' | 
 |  |  |     import { sendSms } from '@/api/business/smsEmail' | 
 |  |  |  | 
 |  |  | export default { | 
 |  |  |   name: 'Login', | 
 |  |  |   data () { | 
 |  |  |     return { | 
 |  |  |       loading: false, | 
 |  |  |       username: '', | 
 |  |  |       password: '', | 
 |  |  |       // 验证码 | 
 |  |  |       captcha: { | 
 |  |  |         loading: false, | 
 |  |  |         value: '', | 
 |  |  |         uuid: '', | 
 |  |  |         uri: '' | 
 |  |  |       } | 
 |  |  |     export default { | 
 |  |  |         name: 'Login', | 
 |  |  |         data () { | 
 |  |  |             return { | 
 |  |  |                 loading: false, | 
 |  |  |                 username: '', | 
 |  |  |                 password: '', | 
 |  |  |                 phone: '', | 
 |  |  |                 code: '', | 
 |  |  |                 active: 1, | 
 |  |  |                 num: 0, | 
 |  |  |                 timer: null, | 
 |  |  |                 // 验证码 | 
 |  |  |                 captcha: { | 
 |  |  |                     loading: false, | 
 |  |  |                     value: '', | 
 |  |  |                     uuid: '', | 
 |  |  |                     uri: '' | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }, | 
 |  |  |         methods: { | 
 |  |  |             ...mapMutations(['setUserInfo']), | 
 |  |  |             handleClick(e) { | 
 |  |  |                 this.active = e | 
 |  |  |                 this.username = '' | 
 |  |  |                 this.password = '' | 
 |  |  |                 this.phone = '' | 
 |  |  |                 this.code = '' | 
 |  |  |             }, | 
 |  |  |             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.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() | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |   }, | 
 |  |  |   methods: { | 
 |  |  |     ...mapMutations(['setUserInfo']), | 
 |  |  |     // 登录 | 
 |  |  |     login () { | 
 |  |  |       if (this.loading) { | 
 |  |  |         return | 
 |  |  |       } | 
 |  |  |       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 | 
 |  |  |         }) | 
 |  |  |     }, | 
 |  |  |     // 刷新验证码 | 
 |  |  |     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() | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | </script> | 
 |  |  |  | 
 |  |  | <style scoped lang="scss"> | 
 |  |  | @import "@/assets/style/variables.scss"; | 
 |  |  | $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; | 
 |  |  |     } | 
 |  |  |     .info-input { | 
 |  |  |       margin-top: $input-gap; | 
 |  |  |       margin-bottom: 60px; | 
 |  |  |       /deep/ .el-input { | 
 |  |  |         margin-top: 30px; | 
 |  |  |         .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 { | 
 |  |  |     @import "@/assets/style/variables.scss"; | 
 |  |  |     $input-gap: 30px; | 
 |  |  |     .wrap { | 
 |  |  |         display: flex; | 
 |  |  |         align-items: center; | 
 |  |  |         justify-content: center; | 
 |  |  |         background: #f7f7f7; | 
 |  |  |         border-radius: 8px; | 
 |  |  |       } | 
 |  |  |         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: 60px; | 
 |  |  |                 /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%); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |     .el-button { | 
 |  |  |       height: 50px; | 
 |  |  |       width: 100%; | 
 |  |  |       color: #fff; | 
 |  |  |       font-size: 16px; | 
 |  |  |       background: linear-gradient(130deg, $primary-color + 20 0%, $primary-color - 20 100%); | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | </style> |