From c3aaf28f7316cce12eec007a9f85a96cbcddeec2 Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期三, 07 五月 2025 10:34:20 +0800
Subject: [PATCH] 最新版本541200007
---
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..6cdf919 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">瀹夊窘瀹夋嘲鐗╂祦鏈夐檺璐d换鍏徃</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: 186px;
+ 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