删除了验证码组件并且复写了一些UI

This commit is contained in:
Liuqi 2023-08-14 14:15:18 +08:00
parent 1ddaf42574
commit eaa4a7fe8b
3 changed files with 239 additions and 250 deletions

BIN
src/assets/background.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@ -4,7 +4,7 @@
<div class="top"> <div class="top">
<div class="header"> <div class="header">
<a href="/"> <a href="/">
<img src="~@/assets/logo.svg" class="logo" alt="logo"> <img src="~@/assets/logo.svg" class="logo" alt="logo" />
<span class="title">计科院ERP系统</span> <span class="title">计科院ERP系统</span>
</a> </a>
</div> </div>
@ -30,121 +30,123 @@
</template> </template>
<script> <script>
import RouteView from "@/components/layouts/RouteView" import RouteView from '@/components/layouts/RouteView'
import { mixinDevice } from '@/utils/mixin.js' import { mixinDevice } from '@/utils/mixin.js'
export default { export default {
name: "UserLayout", name: 'UserLayout',
components: { RouteView }, components: { RouteView },
mixins: [mixinDevice], mixins: [mixinDevice],
data () { data() {
return {} return {}
}, },
mounted () { mounted() {
document.body.classList.add('userLayout') document.body.classList.add('userLayout')
}, },
beforeDestroy () { beforeDestroy() {
document.body.classList.remove('userLayout') document.body.classList.remove('userLayout')
},
} }
}
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
#userLayout.user-layout-wrapper { #userLayout.user-layout-wrapper {
height: 100%; height: 100%;
background: #f0f2f5 url(~@/assets/background.jpg) no-repeat 0%;
&.mobile { &.mobile {
.container {
.main {
max-width: 368px;
width: 98%;
}
}
}
.container { .container {
width: 100%;
min-height: 100%;
background: #f0f2f5 url(~@/assets/background.svg) no-repeat 50%;
background-size: 100%;
padding: 110px 0 144px;
position: relative;
a {
text-decoration: none;
}
.top {
text-align: center;
.header {
height: 44px;
line-height: 44px;
.badge {
position: absolute;
display: inline-block;
line-height: 1;
vertical-align: middle;
margin-left: -12px;
margin-top: -10px;
opacity: 0.8;
}
.logo {
height: 44px;
vertical-align: top;
margin-right: 16px;
border-style: none;
}
.title {
font-size: 33px;
color: rgba(0, 0, 0, .85);
font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-weight: 600;
position: relative;
top: 2px;
}
}
.desc {
font-size: 14px;
color: rgba(0, 0, 0, 0.45);
margin-top: 12px;
margin-bottom: 40px;
}
}
.main { .main {
min-width: 260px; max-width: 368px;
width: 368px; width: 98%;
margin: 0 auto;
}
.footer {
position: absolute;
width: 100%;
bottom: 0;
padding: 0 16px;
margin: 48px 0 24px;
text-align: center;
.links {
margin-bottom: 8px;
font-size: 14px;
a {
color: rgba(0, 0, 0, 0.45);
transition: all 0.3s;
&:not(:last-child) {
margin-right: 40px;
}
}
}
.copyright {
color: rgba(0, 0, 0, 0.45);
font-size: 14px;
}
} }
} }
} }
</style>
.container {
width: 900px;
background-size: cover;
min-height: 100%;
padding: 110px 0 144px;
position: absolute;
background-size: cover;
right: 0%;
a {
text-decoration: none;
}
.top {
text-align: center;
.header {
height: 44px;
line-height: 44px;
.badge {
position: absolute;
display: inline-block;
line-height: 1;
vertical-align: middle;
margin-left: -12px;
margin-top: -10px;
opacity: 0.8;
}
.logo {
height: 44px;
vertical-align: top;
margin-right: 16px;
border-style: none;
}
.title {
font-size: 33px;
color: rgba(0, 0, 0, 0.85);
font-family: 'Chinese Quote', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB',
'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol';
font-weight: 600;
position: relative;
top: 2px;
}
}
.desc {
font-size: 14px;
color: rgba(0, 0, 0, 0.45);
margin-top: 12px;
margin-bottom: 40px;
}
}
.main {
min-width: 260px;
width: 368px;
margin: 0 auto;
}
.footer {
position: absolute;
width: 100%;
bottom: 0;
padding: 0 16px;
margin: 48px 0 24px;
text-align: center;
.links {
margin-bottom: 8px;
font-size: 14px;
a {
color: rgba(0, 0, 0, 0.45);
transition: all 0.3s;
&:not(:last-child) {
margin-right: 40px;
}
}
}
.copyright {
color: rgba(0, 0, 0, 0.45);
font-size: 14px;
}
}
}
}
</style>

View File

@ -1,160 +1,147 @@
<template> <template>
<div> <div>
<a-form-model ref="form" :model="model" :rules="validatorRules"> <a-form-model ref="form" :model="model" :rules="validatorRules">
<a-form-model-item required prop="username"> <a-form-model-item required prop="username">
<a-input v-model="model.username" size="large" placeholder="请输入帐户名 / admin"> <a-input v-model="model.username" size="large" placeholder="请输入帐户名 / admin">
<a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }"/> <a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }" />
</a-input> </a-input>
</a-form-model-item> </a-form-model-item>
<a-form-model-item required prop="password"> <a-form-model-item required prop="password">
<a-input v-model="model.password" size="large" type="password" autocomplete="false" placeholder="请输入密码 / 123456"> <a-input
<a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/> v-model="model.password"
</a-input> size="large"
</a-form-model-item> type="password"
autocomplete="false"
<a-row :gutter="0"> placeholder="请输入密码 / 123456"
<a-col :span="16"> >
<a-form-model-item required prop="inputCode"> <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }" />
<a-input v-model="model.inputCode" size="large" type="text" placeholder="请输入验证码"> </a-input>
<a-icon slot="prefix" type="smile" :style="{ color: 'rgba(0,0,0,.25)' }"/> </a-form-model-item>
</a-input> </a-form-model>
</a-form-model-item> </div>
</a-col>
<a-col :span="8" style="text-align: right">
<img v-if="requestCodeSuccess" style="margin-top: 2px;" :src="randCodeImage" @click="handleChangeCheckCode"/>
<img v-else style="margin-top: 2px;" src="../../assets/checkcode.png" @click="handleChangeCheckCode"/>
</a-col>
</a-row>
</a-form-model>
</div>
</template> </template>
<script> <script>
import { getAction } from '@/api/manage' import { getAction } from '@/api/manage'
import Vue from 'vue' import Vue from 'vue'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
export default { export default {
name: 'LoginAccount', name: 'LoginAccount',
data(){ data() {
return { return {
requestCodeSuccess: false, requestCodeSuccess: false,
randCodeImage: '', randCodeImage: '',
currdatetime: '', currdatetime: '',
loginType: 0, loginType: 0,
model:{ model: {
username: 'admin', username: 'admin',
password: '123456', password: '123456'
inputCode: '' },
}, validatorRules: {
validatorRules:{ username: [{ required: true, message: '请输入用户名!' }, { validator: this.handleUsernameOrEmail }],
username: [ password: [
{ required: true, message: '请输入用户名!' }, {
{ validator: this.handleUsernameOrEmail } required: true,
], message: '请输入密码!',
password: [{ validator: 'click'
required: true, message: '请输入密码!', validator: 'click' }
}], ]
inputCode: [{ }
required: true, message: '请输入验证码!' }
}] },
} created() {
this.handleChangeCheckCode()
} },
}, methods: {
created() { ...mapActions(['Login']),
this.handleChangeCheckCode(); /**刷新验证码*/
}, handleChangeCheckCode() {
methods:{ this.currdatetime = new Date().getTime()
...mapActions(['Login']), getAction(`/sys/randomImage/${this.currdatetime}`)
/**刷新验证码*/ .then(res => {
handleChangeCheckCode(){ if (res.success) {
this.currdatetime = new Date().getTime(); this.randCodeImage = res.result
this.model.inputCode = '' this.requestCodeSuccess = true
getAction(`/sys/randomImage/${this.currdatetime}`).then(res=>{ } else {
if(res.success){ this.$message.error(res.message)
this.randCodeImage = res.result this.requestCodeSuccess = false
this.requestCodeSuccess=true
}else{
this.$message.error(res.message)
this.requestCodeSuccess=false
} }
}).catch(()=>{
this.requestCodeSuccess=false
}) })
}, .catch(() => {
// this.requestCodeSuccess = false
handleUsernameOrEmail (rule, value, callback) { })
const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; },
if (regex.test(value)) { //
this.loginType = 0 handleUsernameOrEmail(rule, value, callback) {
} else { const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/
this.loginType = 1 if (regex.test(value)) {
} this.loginType = 0
callback() } else {
}, this.loginType = 1
/** }
* 验证字段 callback()
* @param arr },
* @param callback /**
*/ * 验证字段
validateFields(arr, callback){ * @param arr
let promiseArray = [] * @param callback
for(let item of arr){ */
let p = new Promise((resolve, reject) => { validateFields(arr, callback) {
this.$refs['form'].validateField(item, (err)=>{ let promiseArray = []
if(!err){ for (let item of arr) {
resolve(); let p = new Promise((resolve, reject) => {
}else{ this.$refs['form'].validateField(item, err => {
reject(err); if (!err) {
} resolve()
}) } else {
}); reject(err)
promiseArray.push(p) }
} })
Promise.all(promiseArray).then(()=>{ })
promiseArray.push(p)
}
Promise.all(promiseArray)
.then(() => {
callback() callback()
}).catch(err=>{ })
.catch(err => {
callback(err) callback(err)
}) })
}, },
acceptUsername(username){ acceptUsername(username) {
this.model['username'] = username this.model['username'] = username
}, },
// //
handleLogin(rememberMe){ handleLogin(rememberMe) {
this.validateFields([ 'username', 'password', 'inputCode' ], (err)=>{ this.validateFields(['username', 'password'], err => {
if(!err){ if (!err) {
let loginParams = { let loginParams = {
username: this.model.username, username: this.model.username,
password: this.model.password, password: this.model.password,
captcha: this.model.inputCode, checkKey: this.currdatetime,
checkKey: this.currdatetime, remember_me: rememberMe
remember_me: rememberMe, }
} console.log('登录参数', loginParams)
console.log("登录参数", loginParams) this.Login(loginParams)
this.Login(loginParams).then((res) => { .then(res => {
this.$emit('success', res.result) this.$emit('success', res.result)
}).catch((err) => { })
.catch(err => {
//update-begin-author: taoyan date:20220425 for: #41 //update-begin-author: taoyan date:20220425 for: #41
if(err && err.code===412){ if (err && err.code === 412) {
this.handleChangeCheckCode(); this.handleChangeCheckCode()
} }
//update-end-author: taoyan date:20220425 for: #41 //update-end-author: taoyan date:20220425 for: #41
this.$emit('fail', err) this.$emit('fail', err)
}); })
}else{ } else {
this.$emit('validateFail') this.$emit('validateFail')
} }
}) })
}
} }
} }
}
</script> </script>
<style scoped> <style scoped></style>
</style>