| | |
| | | <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> |