增加验证码校验

dev
smallchill 6 years ago
parent 6d87153399
commit d76bd3a7e4
  1. 17
      src/api/user.js
  2. 186
      src/page/login/userlogin.vue
  3. 2
      src/store/modules/user.js
  4. 1
      src/styles/login.scss

@ -1,21 +1,23 @@
import request from '@/router/axios'; import request from '@/router/axios';
import { baseUrl } from '@/config/env'; import { baseUrl } from '@/config/env';
export const loginByUsername = (tenantId, username, password, type) => request({ export const loginByUsername = (tenantId, username, password, type, key, code) => request({
url: '/api/blade-auth/oauth/token', url: '/api/blade-auth/oauth/token',
method: 'post', method: 'post',
headers: { headers: {
'Tenant-Id': tenantId 'Tenant-Id': tenantId,
'Captcha-Key': key,
'Captcha-Code': code,
}, },
params: { params: {
tenantId, tenantId,
username, username,
password, password,
grant_type: "password", grant_type: "captcha",
scope: "all", scope: "all",
type type
} }
}) });
export const refreshToken = (refresh_token, tenantId) => request({ export const refreshToken = (refresh_token, tenantId) => request({
url: '/api/blade-auth/oauth/token', url: '/api/blade-auth/oauth/token',
@ -29,13 +31,18 @@ export const refreshToken = (refresh_token, tenantId) => request({
grant_type: "refresh_token", grant_type: "refresh_token",
scope: "all", scope: "all",
} }
}) });
export const getButtons = () => request({ export const getButtons = () => request({
url: '/api/blade-system/menu/buttons', url: '/api/blade-system/menu/buttons',
method: 'get' method: 'get'
}); });
export const getCaptcha = () => request({
url: '/api/blade-auth/oauth/captcha',
method: 'get'
});
export const getUserInfo = () => request({ export const getUserInfo = () => request({
url: baseUrl + '/user/getUserInfo', url: baseUrl + '/user/getUserInfo',
method: 'get' method: 'get'

@ -34,92 +34,132 @@
<i slot="prefix" class="icon-mima"/> <i slot="prefix" class="icon-mima"/>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="code">
<el-row :span="24">
<el-col :span="16">
<el-input size="small"
@keyup.enter.native="handleLogin"
v-model="loginForm.code"
auto-complete="off"
:placeholder="$t('login.code')">
<i slot="prefix" class="icon-yanzhengma"/>
</el-input>
</el-col>
<el-col :span="8">
<div class="login-code">
<img :src="loginForm.image" class="login-code-img" @click="refreshCode"
/>
</div>
</el-col>
</el-row>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" <el-button type="primary"
size="small" size="small"
@click.native.prevent="handleLogin" @click.native.prevent="handleLogin"
class="login-submit">{{$t('login.submit')}}</el-button> class="login-submit">{{$t('login.submit')}}
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</template> </template>
<script> <script>
import { mapGetters } from "vuex"; import {mapGetters} from "vuex";
import website from '@/config/website'; import website from '@/config/website';
import {info} from "@/api/system/tenant"; import {info} from "@/api/system/tenant";
import {getCaptcha} from "@/api/user";
export default { export default {
name: "userlogin", name: "userlogin",
data() { data() {
return { return {
tenantMode: website.tenantMode, tenantMode: website.tenantMode,
loginForm: { loginForm: {
tenantId: "000000", //ID
username: "admin", tenantId: "000000",
password: "admin", //
type: "account" username: "admin",
}, //
loginRules: { password: "admin",
tenantId: [ //
{ required: false, message: "请输入租户ID", trigger: "blur" } type: "account",
], //
username: [ code: "",
{ required: true, message: "请输入用户名", trigger: "blur" } //
], key: "",
password: [ //
{ required: true, message: "请输入密码", trigger: "blur" }, image: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
{ min: 1, message: "密码长度最少为6位", trigger: "blur" } },
] loginRules: {
}, tenantId: [
passwordType: "password" {required: false, message: "请输入租户ID", trigger: "blur"}
}; ],
}, username: [
created() { {required: true, message: "请输入用户名", trigger: "blur"}
this.getTenant(); ],
}, password: [
mounted() {}, {required: true, message: "请输入密码", trigger: "blur"},
computed: { {min: 1, message: "密码长度最少为6位", trigger: "blur"}
...mapGetters(["tagWel"]) ]
}, },
props: [], passwordType: "password"
methods: { };
showPassword() { },
this.passwordType === "" created() {
? (this.passwordType = "password") this.getTenant();
: (this.passwordType = ""); this.refreshCode();
}, },
handleLogin() { mounted() {
this.$refs.loginForm.validate(valid => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '登录中,请稍后。。。',
spinner: "el-icon-loading"
});
this.$store.dispatch("LoginByUsername", this.loginForm).then(() => {
this.$router.push({ path: this.tagWel.value });
loading.close();
}).catch(() => {
loading.close()
});
}
});
}, },
getTenant() { computed: {
let domain = window.location.href.replace("/#/login", ""); ...mapGetters(["tagWel"])
// 便 },
//domain = "https://bladex.vip"; props: [],
info(domain).then(res => { methods: {
const data = res.data; refreshCode() {
if (data.success && data.data.tenantId) { getCaptcha().then(res => {
this.tenantMode = false; const data = res.data;
this.loginForm.tenantId = data.data.tenantId; this.loginForm.key = data.key;
this.$parent.$refs.login.style.backgroundImage = `url(${data.data.backgroundUrl})`; this.loginForm.image = data.image;
} })
}) },
showPassword() {
this.passwordType === ""
? (this.passwordType = "password")
: (this.passwordType = "");
},
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '登录中,请稍后。。。',
spinner: "el-icon-loading"
});
this.$store.dispatch("LoginByUsername", this.loginForm).then(() => {
this.$router.push({path: this.tagWel.value});
loading.close();
}).catch(() => {
loading.close()
});
}
});
},
getTenant() {
let domain = window.location.href.replace("/#/login", "");
// 便
//domain = "https://bladex.vip";
info(domain).then(res => {
const data = res.data;
if (data.success && data.data.tenantId) {
this.tenantMode = false;
this.loginForm.tenantId = data.data.tenantId;
this.$parent.$refs.login.style.backgroundImage = `url(${data.data.backgroundUrl})`;
}
})
}
} }
} };
};
</script> </script>
<style> <style>

@ -47,7 +47,7 @@ const user = {
//根据用户名登录 //根据用户名登录
LoginByUsername({commit}, userInfo) { LoginByUsername({commit}, userInfo) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
loginByUsername(userInfo.tenantId, userInfo.username, userInfo.password, userInfo.type).then(res => { loginByUsername(userInfo.tenantId, userInfo.username, userInfo.password, userInfo.type, userInfo.key, userInfo.code).then(res => {
const data = res.data; const data = res.data;
if (data.error_description) { if (data.error_description) {
Message({ Message({

@ -180,4 +180,5 @@
line-height: 38px; line-height: 38px;
text-indent: 5px; text-indent: 5px;
text-align: center; text-align: center;
cursor:pointer!important;
} }

Loading…
Cancel
Save