parent
432385fc14
commit
832bc376be
@ -0,0 +1,34 @@
|
||||
<template>
|
||||
<a-dropdown v-if="syncToApp && syncToLocal">
|
||||
<a-button type="primary" icon="sync">同步{{name}}</a-button>
|
||||
<a-menu slot="overlay" @click="handleMenuClick">
|
||||
<a-menu-item v-if="syncToApp" key="to-app">同步到{{name}}</a-menu-item>
|
||||
<a-menu-item v-if="syncToLocal" key="to-local">同步到本地</a-menu-item>
|
||||
</a-menu>
|
||||
</a-dropdown>
|
||||
<a-button v-else-if="syncToApp" type="primary" icon="sync" @click="handleMenuClick({key:'to-app'})">同步{{name}}</a-button>
|
||||
<a-button v-else type="primary" icon="sync" @click="handleMenuClick({key:'to-local'})">同步{{name}}到本地</a-button>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
/* JThirdAppButton 的子组件,不可单独使用 */
|
||||
export default {
|
||||
name: 'JThirdAppDropdown',
|
||||
props: {
|
||||
type: String,
|
||||
name: String,
|
||||
syncToApp: Boolean,
|
||||
syncToLocal: Boolean,
|
||||
},
|
||||
methods: {
|
||||
handleMenuClick(event) {
|
||||
this.$emit(event.key, {type: this.type})
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
@ -0,0 +1,155 @@
|
||||
<template>
|
||||
<div>
|
||||
<a-form-model ref="form" :model="model" :rules="validatorRules">
|
||||
<a-form-model-item required prop="username">
|
||||
<a-input v-model="model.username" size="large" placeholder="请输入帐户名 / jeecg">
|
||||
<a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }"/>
|
||||
</a-input>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item required prop="password">
|
||||
<a-input v-model="model.password" size="large" type="password" autocomplete="false" placeholder="请输入密码 / 123456">
|
||||
<a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/>
|
||||
</a-input>
|
||||
</a-form-model-item>
|
||||
|
||||
<a-row :gutter="0">
|
||||
<a-col :span="16">
|
||||
<a-form-model-item required prop="inputCode">
|
||||
<a-input v-model="model.inputCode" size="large" type="text" placeholder="请输入验证码">
|
||||
<a-icon slot="prefix" type="smile" :style="{ color: 'rgba(0,0,0,.25)' }"/>
|
||||
</a-input>
|
||||
</a-form-model-item>
|
||||
</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>
|
||||
|
||||
<script>
|
||||
import { getAction } from '@/api/manage'
|
||||
import Vue from 'vue'
|
||||
import { mapActions } from 'vuex'
|
||||
|
||||
export default {
|
||||
name: 'LoginAccount',
|
||||
data(){
|
||||
return {
|
||||
requestCodeSuccess: false,
|
||||
randCodeImage: '',
|
||||
currdatetime: '',
|
||||
loginType: 0,
|
||||
model:{
|
||||
username: '',
|
||||
password: '',
|
||||
inputCode: ''
|
||||
},
|
||||
validatorRules:{
|
||||
username: [
|
||||
{ required: true, message: '请输入用户名!' },
|
||||
{ validator: this.handleUsernameOrEmail }
|
||||
],
|
||||
password: [{
|
||||
required: true, message: '请输入密码!', validator: 'click'
|
||||
}],
|
||||
inputCode: [{
|
||||
required: true, message: '请输入验证码!'
|
||||
}]
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.handleChangeCheckCode();
|
||||
},
|
||||
methods:{
|
||||
...mapActions(['Login']),
|
||||
/**刷新验证码*/
|
||||
handleChangeCheckCode(){
|
||||
this.currdatetime = new Date().getTime();
|
||||
this.model.inputCode = ''
|
||||
getAction(`/sys/randomImage/${this.currdatetime}`).then(res=>{
|
||||
if(res.success){
|
||||
this.randCodeImage = res.result
|
||||
this.requestCodeSuccess=true
|
||||
}else{
|
||||
this.$message.error(res.message)
|
||||
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
|
||||
} else {
|
||||
this.loginType = 1
|
||||
}
|
||||
callback()
|
||||
},
|
||||
/**
|
||||
* 验证字段
|
||||
* @param arr
|
||||
* @param callback
|
||||
*/
|
||||
validateFields(arr, callback){
|
||||
let promiseArray = []
|
||||
for(let item of arr){
|
||||
let p = new Promise((resolve, reject) => {
|
||||
this.$refs['form'].validateField(item, (err)=>{
|
||||
if(!err){
|
||||
resolve();
|
||||
}else{
|
||||
reject(err);
|
||||
}
|
||||
})
|
||||
});
|
||||
promiseArray.push(p)
|
||||
}
|
||||
Promise.all(promiseArray).then(()=>{
|
||||
callback()
|
||||
}).catch(err=>{
|
||||
callback(err)
|
||||
})
|
||||
},
|
||||
acceptUsername(username){
|
||||
this.model['username'] = username
|
||||
},
|
||||
//账号密码登录
|
||||
handleLogin(rememberMe){
|
||||
this.validateFields([ 'username', 'password', 'inputCode' ], (err)=>{
|
||||
if(!err){
|
||||
let loginParams = {
|
||||
username: this.model.username,
|
||||
password: this.model.password,
|
||||
captcha: this.model.inputCode,
|
||||
checkKey: this.currdatetime,
|
||||
remember_me: rememberMe,
|
||||
}
|
||||
console.log("登录参数", loginParams)
|
||||
this.Login(loginParams).then((res) => {
|
||||
this.$emit('success', res.result)
|
||||
}).catch((err) => {
|
||||
this.$emit('fail', err)
|
||||
});
|
||||
}else{
|
||||
this.$emit('validateFail')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
@ -0,0 +1,172 @@
|
||||
<template>
|
||||
<div>
|
||||
<a-form-model ref="form" :model="model" :rules="validatorRules">
|
||||
<a-form-model-item required prop="mobile">
|
||||
<a-input v-model="model.mobile" size="large" type="text" placeholder="请输入手机号">
|
||||
<a-icon slot="prefix" type="mobile" :style="{ color: 'rgba(0,0,0,.25)' }"/>
|
||||
</a-input>
|
||||
</a-form-model-item>
|
||||
<a-row :gutter="16">
|
||||
<a-col class="gutter-row" :span="16">
|
||||
<a-form-model-item required prop="captcha">
|
||||
<a-input v-model="model.captcha" size="large" type="text" placeholder="请输入验证码">
|
||||
<a-icon slot="prefix" type="mail" :style="{ color: 'rgba(0,0,0,.25)' }"/>
|
||||
</a-input>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col class="gutter-row" :span="8">
|
||||
<a-button
|
||||
class="getCaptcha"
|
||||
tabindex="-1"
|
||||
:disabled="state.smsSendBtn"
|
||||
@click.stop.prevent="getCaptcha"
|
||||
v-text="!state.smsSendBtn && '获取验证码' || (state.time+' s')"></a-button>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { postAction } from '@/api/manage'
|
||||
import { mapActions } from 'vuex'
|
||||
|
||||
export default {
|
||||
name: 'LoginPhone',
|
||||
data(){
|
||||
return {
|
||||
model:{
|
||||
mobile: '',
|
||||
captcha: ''
|
||||
},
|
||||
//手机号登录用
|
||||
state: {
|
||||
time: 60,
|
||||
smsSendBtn: false,
|
||||
},
|
||||
validatorRules:{
|
||||
mobile: [
|
||||
{ required: true, message: '请输入手机号码!' },
|
||||
{ validator: this.validateMobile }
|
||||
],
|
||||
captcha: [{
|
||||
required: true, message: '请输入验证码!'
|
||||
}]
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
...mapActions(['PhoneLogin']),
|
||||
handleLogin(rememberMe){
|
||||
this.validateFields([ 'mobile', 'captcha' ], (err) => {
|
||||
if (!err) {
|
||||
let loginParams = {
|
||||
mobile: this.model.mobile,
|
||||
captcha: this.model.captcha,
|
||||
remember_me: rememberMe
|
||||
}
|
||||
console.log("登录参数", loginParams)
|
||||
this.PhoneLogin(loginParams).then((res) => {
|
||||
this.$emit('success', res.result)
|
||||
}).catch((err) => {
|
||||
this.$emit('fail', err)
|
||||
});
|
||||
}else{
|
||||
this.$emit('validateFail')
|
||||
}
|
||||
})
|
||||
},
|
||||
// 校验手机号
|
||||
validateMobile(rule,value,callback){
|
||||
if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)){
|
||||
callback();
|
||||
}else{
|
||||
callback("您的手机号码格式不正确!");
|
||||
}
|
||||
},
|
||||
//获取验证码
|
||||
getCaptcha (e) {
|
||||
e.preventDefault();
|
||||
let that = this;
|
||||
that.validateFields([ 'mobile' ], (err) => {
|
||||
if (!err) {
|
||||
that.state.smsSendBtn = true;
|
||||
let interval = window.setInterval(() => {
|
||||
if (that.state.time-- <= 0) {
|
||||
that.state.time = 60;
|
||||
that.state.smsSendBtn = false;
|
||||
window.clearInterval(interval);
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
const hide = that.$message.loading('验证码发送中..', 0);
|
||||
let smsParams = {};
|
||||
smsParams.mobile=that.model.mobile;
|
||||
smsParams.smsmode="0";
|
||||
postAction("/sys/sms",smsParams)
|
||||
.then(res => {
|
||||
if(!res.success){
|
||||
setTimeout(hide, 0);
|
||||
that.cmsFailed(res.message);
|
||||
}
|
||||
console.log(res);
|
||||
setTimeout(hide, 500);
|
||||
})
|
||||
.catch(err => {
|
||||
setTimeout(hide, 1);
|
||||
clearInterval(interval);
|
||||
that.state.time = 60;
|
||||
that.state.smsSendBtn = false;
|
||||
that.requestFailed(err);
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
cmsFailed(err){
|
||||
this.$notification[ 'error' ]({
|
||||
message: '获取验证码失败',
|
||||
description:err,
|
||||
duration: 4,
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 验证字段
|
||||
* @param arr
|
||||
* @param callback
|
||||
*/
|
||||
validateFields(arr, callback){
|
||||
let promiseArray = []
|
||||
for(let item of arr){
|
||||
let p = new Promise((resolve, reject) => {
|
||||
this.$refs['form'].validateField(item, (err)=>{
|
||||
if(!err){
|
||||
resolve();
|
||||
}else{
|
||||
reject(err);
|
||||
}
|
||||
})
|
||||
});
|
||||
promiseArray.push(p)
|
||||
}
|
||||
Promise.all(promiseArray).then(()=>{
|
||||
callback()
|
||||
}).catch(err=>{
|
||||
callback(err)
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.getCaptcha{
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
}
|
||||
</style>
|
Loading…
Reference in new issue