From eb82684152ffb0acddf67da92e4533a0190eb258 Mon Sep 17 00:00:00 2001 From: MrShi <1878285526@qq.com> Date: 星期五, 10 十月 2025 18:27:31 +0800 Subject: [PATCH] 对接口 --- admin/src/views/login.vue | 206 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 154 insertions(+), 52 deletions(-) diff --git a/admin/src/views/login.vue b/admin/src/views/login.vue index 652081b..12a0bb7 100644 --- a/admin/src/views/login.vue +++ b/admin/src/views/login.vue @@ -3,45 +3,64 @@ <img src="@/assets/images/bg@2x.png" class="main_bg" alt=""> <div class="login_wrap"> <div class="login_img"> + <div class="h2">鑺滄箹鐑熻崏鏅烘収瀹夋秷瀹夊叏闃茶寖绯荤粺</div> <div class="h3">鏅烘収鐗╂祦鍥尯瀹夋秷涓�浣撳寲绯荤粺</div> </div> <div class="form_wrap"> - <!-- <div class="tabs"> - <div class="tab active"> + <div class="tabs"> + <div class="tab" @click="tabClick('0')" :class="{ active: activeTab == '0' }"> <div class="name">甯愬彿鐧诲綍</div> <div class="icon"></div> </div> - <div class="tab"> + <div class="tab" @click="tabClick('1')" :class="{ active: activeTab == '1' }"> <div class="name">鎵嬫満鐧诲綍</div> <div class="icon"></div> </div> - </div> --> - <div class="df_ac"> - <div class="label">甯愬彿</div> - <div class="line"> - <el-input v-model="username" placeholder="璇疯緭鍏ュ笎鍙�" maxlength="50" v-trim /> - </div> </div> - <div class="df_ac"> - <div class="label">瀵嗙爜</div> - <div class="line"> - <el-input v-model="password" placeholder="璇疯緭鍏ュ瘑鐮�" type="password" maxlength="30" show-password /> + <template v-if="activeTab == '0'"> + <div class="df_ac"> + <div class="label">甯愬彿</div> + <div class="line"> + <el-input v-model="username" placeholder="璇疯緭鍏ュ笎鍙�" maxlength="50" v-trim /> + </div> </div> - </div> + <div class="df_ac"> + <div class="label">瀵嗙爜</div> + <div class="line"> + <el-input v-model="password" placeholder="璇疯緭鍏ュ瘑鐮�" type="password" maxlength="30" show-password /> + </div> + </div> + <div class="df_ac"> + <div class="label">楠岃瘉鐮�</div> + <div class="line"> + <el-input v-model="captcha.value" placeholder="璇疯緭鍏ラ獙璇佺爜" maxlength="4" @keypress.enter.native="login" /> + <img v-if="!captcha.loading" class="code_image" :src="captcha.uri" @click="refreshCaptcha"> + <span v-else><i class="el-icon-loading"></i></span> + </div> + </div> + </template> + <template v-if="activeTab == '1'"> + <div class="df_ac"> + <div class="label">鎵嬫満鍙�</div> + <div class="line"> + <el-input v-model="phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" type="text" maxlength="16" /> + </div> + </div> + <div class="df_ac"> + <div class="label">楠岃瘉鐮�</div> + <div class="line"> + <el-input v-model="smsCode" placeholder="璇疯緭鍏ラ獙璇佺爜" maxlength="6" @keypress.enter.native="login" /> + <span v-if="downTime == 0" class="code_get" @click="getCode">鑾峰彇楠岃瘉鐮�</span> + <span v-else class="code_get downtime">{{ downTime }}</span> + </div> + </div> + </template> - <div class="df_ac"> - <div class="label">楠岃瘉鐮�</div> - <div class="line"> - <el-input v-model="captcha.value" placeholder="璇疯緭鍏ラ獙璇佺爜" maxlength="4" @keypress.enter.native="login" /> - <img v-if="!captcha.loading" class="code_image" :src="captcha.uri" @click="refreshCaptcha"> - <span v-else><i class="el-icon-loading"></i></span> - </div> - </div> - <el-button :loading="loading" type="primary" class="login_btn" - @click.native.prevent="login">绔嬪嵆鐧诲綍</el-button> + <el-button :loading="loading" type="primary" class="login_btn" @click.native.prevent="login">绔嬪嵆鐧诲綍</el-button> <div class="btn_wrap"> <el-checkbox v-model="isRemPsd"> - <span style="font-size: 13px; font-weight: 400" class="placeholder9">璁颁綇瀵嗙爜</span> + <span style="font-size: 13px; font-weight: 400" class="placeholder9">{{ activeTab == 0 ? '璁颁綇瀵嗙爜' : '璁颁綇鎵嬫満鍙�' + }}</span> </el-checkbox> </div> <div class="google"> @@ -55,8 +74,9 @@ <script> import { mapMutations } from 'vuex' -import { getCaptcha, loginByPassword } from '@/api/system/common' +import { getCaptcha, loginByPassword, sendSmsPost, loginByPhone } from '@/api/system/common' import Cookies from "js-cookie" +import { Message } from 'element-ui' export default { name: 'Login', @@ -66,6 +86,11 @@ isRemPsd: false, username: '', password: '', + phone: '', + downTime: 0, + + smsCode: '', + activeTab: '0', // 楠岃瘉鐮� captcha: { loading: false, @@ -78,6 +103,7 @@ mounted() { this.username = localStorage.getItem('username') || '' this.password = localStorage.getItem('password') || '' + this.phone = localStorage.getItem('phone') || '' const isRemPsd = localStorage.getItem('isRemPsd') || false this.isRemPsd = JSON.parse(isRemPsd) this.refreshCaptcha() @@ -89,37 +115,79 @@ 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((res) => { - // window.location.href = process.env.VUE_APP_CONTEXT_PATH + if (this.activeTab == 0) { + 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((res) => { + // window.location.href = process.env.VUE_APP_CONTEXT_PATH + if (this.isRemPsd) { + localStorage.setItem('username', this.username.trim()) + localStorage.setItem('password', this.password.trim()) + localStorage.setItem('isRemPsd', this.isRemPsd) + } else { + localStorage.removeItem('username') + localStorage.removeItem('password') + localStorage.removeItem('isRemPsd') + } + Cookies.set('dm_user_token', res) + this.$router.push('index') + }) + .catch(e => { + this.refreshCaptcha() + }) + .finally(() => { + this.loading = false + }) + } else { + const { smsCode, phone } = this + if (!phone || phone.length != 11) { + return Message.error('璇疯緭鍏ユ纭殑鎵嬫満鍙�') + } + if (!smsCode) { + return Message.error('璇疯緭鍏ラ獙璇佺爜') + } + this.loading = true + loginByPhone({ phone, code: smsCode }).then(res => { if (this.isRemPsd) { - localStorage.setItem('username', this.username.trim()) - localStorage.setItem('password', this.password.trim()) - localStorage.setItem('isRemPsd', this.isRemPsd) - } else { - localStorage.removeItem('username') - localStorage.removeItem('password') - localStorage.removeItem('isRemPsd') + localStorage.setItem('phone', this.username.trim()) } Cookies.set('dm_user_token', res) this.$router.push('index') - }) - .catch(e => { + }).catch(e => { this.refreshCaptcha() - // this.$tip.apiFailed(e) - }) - .finally(() => { + }).finally(() => { this.loading = false }) + } + + }, + getCode() { + console.log('getCode') + const { phone } = this + if (!phone || phone.length != 11) { + return Message.error('璇疯緭鍏ユ纭殑鎵嬫満鍙�') + } + sendSmsPost({ phone, type: 0 }).then(res => { + Message.success('鐭俊鍙戦�佹垚鍔�') + this.downTime = 60 + let timer = setInterval(() => { + if (this.downTime == 0) { + return clearInterval(timer) + } + this.downTime-- + }, 1000) + }) + }, + tabClick(val) { + this.activeTab = val }, // 鍒锋柊楠岃瘉鐮� refreshCaptcha() { @@ -200,7 +268,20 @@ background: url("../assets/images/login_img@2x.png"); background-size: 100% 100%; padding-left: 40px; - padding-top: 80px; + padding-top: 60px; + + .h2 { + color: $primary-color; + background-color: #fff; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + width: 208px; + display: flex; + margin-bottom: 12px; + } .h3 { font-size: 28px; @@ -221,7 +302,7 @@ background-color: #fff; box-sizing: border-box; /* padding: 50px 80px 20px; */ - padding: 80px 80px 20px; + padding: 50px 80px 20px; position: relative; .tabs { @@ -236,6 +317,7 @@ flex-direction: column; justify-content: center; align-items: center; + cursor: pointer; .icon { width: 36px; @@ -287,9 +369,12 @@ margin-bottom: 17px; display: flex; width: 100%; + align-items: center; + position: relative; .el-input { height: 40px; + flex: 1; // font-size: 14px; ::v-deep .el-input__inner { @@ -301,6 +386,23 @@ width: 100px; margin-left: 10px; } + + .code_get { + position: absolute; + top: 10px; + right: 10px; + font-size: 14px; + width: 72px; + z-index: 11; + margin-left: 10px; + cursor: pointer; + color: $primary-color; + text-align: right; + } + + .downtime { + color: #999999; + } } .forget { -- Gitblit v1.9.3