<template>
|
<div class="login">
|
<Row
|
type="flex"
|
justify="center"
|
align="middle"
|
@keydown.enter.native="submitLogin"
|
style="height: 100%"
|
>
|
<Col class="content">
|
<div>
|
<Header />
|
<div v-if="!socialLogining" style="margin-top: 150px">
|
<Form
|
ref="usernameLoginForm"
|
:model="form"
|
:rules="rules"
|
class="form"
|
v-if="tabName == 'username'"
|
>
|
<FormItem>
|
<h1 style="margin-left: 40%;">登 陆</h1>
|
</FormItem>
|
<FormItem prop="username">
|
<Input
|
v-model="form.username"
|
prefix="ios-contact"
|
size="large"
|
clearable
|
placeholder="账号"
|
autocomplete="off"
|
/>
|
</FormItem>
|
<FormItem prop="password">
|
<Input
|
type="password"
|
v-model="form.password"
|
prefix="ios-lock"
|
size="large"
|
password
|
placeholder="请输入密码"
|
autocomplete="off"
|
/>
|
</FormItem>
|
<FormItem prop="imgCode">
|
<Row
|
type="flex"
|
justify="space-between"
|
style="align-items: center; overflow: hidden"
|
>
|
<Input
|
v-model="form.imgCode"
|
size="large"
|
clearable
|
placeholder="请输入图片验证码"
|
:maxlength="10"
|
class="input-verify"
|
/>
|
<div
|
class="code-image"
|
style="position: relative; font-size: 12px"
|
>
|
<Spin v-if="loadingCaptcha" fix></Spin>
|
<img
|
:src="captchaImg"
|
@click="getCaptchaImg"
|
alt="加载验证码失败"
|
style="width: 110px; cursor: pointer; display: block"
|
/>
|
</div>
|
</Row>
|
</FormItem>
|
</Form>
|
|
<!--<Row justify="space-between" align="middle">-->
|
<!--<Checkbox v-model="saveLogin" size="large">{{-->
|
<!--$t("autoLogin")-->
|
<!--}}</Checkbox>-->
|
<!--<Dropdown trigger="click" @on-click="handleDropDown">-->
|
<!--<a class="forget-pass">{{ $t("forgetPass") }}</a>-->
|
<!--<DropdownMenu slot="list">-->
|
<!--<DropdownItem name="test">体验测试账号</DropdownItem>-->
|
<!--<DropdownItem name="resetByMobile"-->
|
<!-->使用手机号重置密码(付费)</DropdownItem-->
|
<!-->-->
|
<!--<DropdownItem name="resetByEmail"-->
|
<!-->使用邮箱重置密码(付费)</DropdownItem-->
|
<!-->-->
|
<!--</DropdownMenu>-->
|
<!--</Dropdown>-->
|
<!--</Row>-->
|
<Button
|
class="login-btn"
|
type="primary"
|
size="large"
|
:loading="loading"
|
@click="submitLogin"
|
long
|
>
|
<span v-if="!loading">{{ $t("login") }}</span>
|
<span v-else>{{ $t("logining") }}</span>
|
</Button>
|
</div>
|
<div v-if="socialLogining">
|
<RectLoading />
|
</div>
|
</div>
|
<!--<Footer />-->
|
</Col>
|
<LangSwitch />
|
</Row>
|
</div>
|
<!--<div>-->
|
|
<!--<VueFurcateTree-->
|
<!--:ft-data="ftData"-->
|
<!--:expandable="true"-->
|
<!--:expand-all="expandAllStatus"-->
|
<!--@click="click"-->
|
<!--@expand="expand"-->
|
<!-->-->
|
<!--我是#{label}-->
|
<!--<em>#{test.a}</em>-->
|
<!--</VueFurcateTree>-->
|
|
<!--</div>-->
|
|
|
</template>
|
|
<script>
|
import {
|
login,
|
userInfo,
|
getJWT,
|
sendLoginSms,
|
smsLogin,
|
initCaptcha,
|
drawCodeImage,
|
getOtherSet,
|
getNotice,
|
} from "@/api/index";
|
import { validateMobile } from "@/libs/validate";
|
import Cookies from "js-cookie";
|
import Header from "@/views/main-components/header";
|
//import Footer from "@/views/main-components/footer";
|
import LangSwitch from "@/views/main-components/lang-switch";
|
import RectLoading from "@/views/my-components/xboot/rect-loading";
|
import CountDownButton from "@/views/my-components/xboot/count-down-button";
|
import util from "@/libs/util.js";
|
import VueFurcateTree from 'vue-furcate-tree'
|
|
export default {
|
components: {
|
CountDownButton,
|
RectLoading,
|
LangSwitch,
|
Header,
|
VueFurcateTree
|
},
|
data() {
|
return {
|
ftData: [
|
{
|
expand: true, // 必须的,表示子级节点是否展开
|
label: '节点1', // 你的自定义属性,将来可在模板中作为变量
|
test: { // 你的自定义属性
|
a: 'b' // 你的自定义属性,可以在模板中使用test.a方式访问变量
|
},
|
children: [ // 可选的,子级节点数组
|
{
|
expand: false,
|
label: '节点2',
|
test: {
|
a: 'b'
|
},
|
children: [
|
{
|
expand: false,
|
label: '节点3',
|
test: {
|
a: 'c'
|
}
|
},
|
{
|
expand: false,
|
label: '节点3',
|
test: {
|
a: 'd'
|
}
|
}
|
]
|
}
|
]
|
}
|
],
|
sessionStorage: null,
|
showMore: false,
|
code:"",
|
captchaId: "",
|
captchaImg: "",
|
loadingCaptcha: true,
|
socialLogining: true,
|
error: false,
|
tabName: "username",
|
saveLogin: true,
|
getSms: "获取验证码",
|
loading: false,
|
sending: false,
|
errorCode: "",
|
form: {
|
username: "",
|
password: "",
|
code: "",
|
},
|
showChangePass: false,
|
};
|
},
|
methods: {
|
getCaptchaImg() {
|
this.loadingCaptcha = true;
|
initCaptcha().then((res) => {
|
this.loadingCaptcha = false;
|
if (res.success) {
|
this.code = res.result.code;
|
this.captchaId = res.result.captchaId;
|
this.captchaImg = drawCodeImage + this.captchaId;
|
}
|
});
|
},
|
sendSmsCode() {
|
this.$refs.mobileLoginForm.validate((valid) => {
|
if (valid) {
|
this.sending = true;
|
this.getSms = "发送中";
|
sendLoginSms(this.form.mobile).then((res) => {
|
this.getSms = "获取验证码";
|
this.sending = false;
|
if (res.success) {
|
this.$Message.success("发送短信验证码成功");
|
// 开始倒计时
|
this.$refs.countDown.startCountDown();
|
}
|
});
|
}
|
});
|
},
|
afterLogin(res) {
|
let accessToken = res.result;
|
console.log("login_afterLogin()",accessToken)
|
this.setSessionStore("accessToken", accessToken);
|
getOtherSet().then((res) => {
|
if (res.result) {
|
let domain = res.result.ssoDomain;
|
// Cookies.set("accessToken", accessToken, {
|
// domain: domain,
|
// expires: 7,
|
// });
|
}
|
});
|
// 获取用户信息
|
userInfo().then((res) => {
|
if (res.success) {
|
// 避免超过大小限制
|
delete res.result.permissions;
|
let roles = [];
|
res.result.roles.forEach((e) => {
|
roles.push(e.name);
|
});
|
delete res.result.roles;
|
this.setStore("roles", roles);
|
this.setStore("saveLogin", this.saveLogin);
|
if (this.saveLogin) {
|
// 保存7天
|
Cookies.set("userInfo", JSON.stringify(res.result), {
|
expires: 7,
|
});
|
} else {
|
Cookies.set("userInfo", JSON.stringify(res.result));
|
}
|
this.setStore("userInfo", res.result);
|
this.$store.commit("setUserInfo", res.result);
|
// 加载菜单
|
util.initRouter(this);
|
// window.location.reload();
|
this.$router.push({
|
name: "home2",
|
});
|
} else {
|
this.loading = false;
|
}
|
});
|
},
|
submitLogin() {
|
if (this.tabName == "username") {
|
if(this.code.toUpperCase()!=this.form.imgCode.toUpperCase()){
|
this.$Message.error("验证码错误");
|
this.getCaptchaImg();
|
return
|
}
|
this.loading = true;
|
login({
|
username: this.form.username,
|
password: btoa(this.form.password),
|
code: this.form.imgCode,
|
captchaId: this.captchaId,
|
saveLogin: this.saveLogin,
|
}).then((res) => {
|
if (res.success) {
|
this.afterLogin(res);
|
} else {
|
this.loading = false;
|
this.getCaptchaImg();
|
}
|
});
|
} else if (this.tabName == "mobile") {
|
this.$refs.mobileLoginForm.validate((valid) => {
|
if (valid) {
|
if (this.form.code == "") {
|
this.errorCode = "验证码不能为空";
|
return;
|
} else {
|
this.errorCode = "";
|
}
|
this.loading = true;
|
this.form.saveLogin = this.saveLogin;
|
smsLogin(this.form).then((res) => {
|
if (res.success) {
|
this.afterLogin(res);
|
} else {
|
this.loading = false;
|
}
|
});
|
}
|
});
|
}
|
},
|
toGithubLogin() {
|
this.socialLogining = true;
|
githubLogin().then((res) => {
|
if (res.success) {
|
window.location.href = res.result;
|
} else {
|
this.socialLogining = false;
|
}
|
});
|
},
|
toQQLogin() {
|
this.socialLogining = true;
|
qqLogin().then((res) => {
|
if (res.success) {
|
window.location.href = res.result;
|
} else {
|
this.socialLogining = false;
|
}
|
});
|
},
|
toWeiboLogin() {
|
this.socialLogining = true;
|
weiboLogin().then((res) => {
|
if (res.success) {
|
window.location.href = res.result;
|
} else {
|
this.socialLogining = false;
|
}
|
});
|
},
|
toWeixinLogin() {
|
this.socialLogining = true;
|
wechatLogin().then((res) => {
|
if (res.success) {
|
window.location.href = res.result;
|
} else {
|
this.socialLogining = false;
|
}
|
});
|
},
|
toDingdingLogin() {
|
this.socialLogining = true;
|
dingdingLogin().then((res) => {
|
if (res.success) {
|
window.location.href = res.result;
|
} else {
|
this.socialLogining = false;
|
}
|
});
|
},
|
toWorkwechatLogin() {
|
this.socialLogining = true;
|
workwechatLogin().then((res) => {
|
if (res.success) {
|
window.location.href = res.result;
|
} else {
|
this.socialLogining = false;
|
}
|
});
|
},
|
relatedLogin() {
|
let q = this.$route.query;
|
let error = q.error;
|
if (error !== "" && error !== undefined) {
|
this.$Message.error(error);
|
}
|
let related = q.related;
|
let JWTKey = q.JWTKey;
|
if (related && related == "1" && JWTKey) {
|
getJWT({ JWTKey: JWTKey }).then((res) => {
|
if (res.success) {
|
this.socialLogining = true;
|
let accessToken = res.result;
|
this.setSessionStore("accessToken", accessToken);
|
getOtherSet().then((res) => {
|
if (res.result) {
|
let domain = res.result.ssoDomain;
|
// Cookies.set("accessToken", accessToken, {
|
// domain: domain,
|
// expires: 7,
|
// });
|
}
|
});
|
// 获取用户信息
|
userInfo().then((res) => {
|
if (res.success) {
|
// 避免超过大小限制
|
delete res.result.permissions;
|
let roles = [];
|
res.result.roles.forEach((e) => {
|
roles.push(e.name);
|
});
|
delete res.result.roles;
|
this.setStore("roles", roles);
|
// 保存7天
|
Cookies.set("userInfo", JSON.stringify(res.result), {
|
expires: 7,
|
});
|
this.setStore("userInfo", res.result);
|
this.$store.commit("setUserInfo", res.result);
|
// 加载菜单
|
util.initRouter(this);
|
this.$router.push({
|
name: "home_index",
|
});
|
} else {
|
this.socialLogining = false;
|
this.$Message.error("获取登录用户信息失败");
|
}
|
});
|
} else {
|
this.socialLogining = false;
|
this.$Message.error("使用第三方账号登录失败");
|
}
|
});
|
} else {
|
this.socialLogining = false;
|
}
|
},
|
handleDropDown(v) {
|
if (v == "test") {
|
this.test();
|
} else if (v == "resetByMobile") {
|
this.$router.push({
|
name: "reset",
|
});
|
} else if (v == "resetByEmail") {
|
this.$router.push({
|
name: "reset",
|
query: {
|
type: "1",
|
},
|
});
|
}
|
},
|
showNotice() {
|
getNotice().then((res) => {
|
if (res.success) {
|
if (!res.result) {
|
return;
|
}
|
let data = res.result;
|
if (
|
data.open &&
|
(data.title || data.content) &&
|
data.position == "LOGIN"
|
) {
|
this.$Notice.info({
|
title: data.title,
|
desc: data.content,
|
duration: data.duration,
|
});
|
}
|
}
|
});
|
},
|
test() {
|
// this.$Notice.info({
|
// title: "测试体验账号",
|
// desc: "账号:test或test2<br>密码:123456",
|
// });
|
},
|
},
|
mounted() {
|
//this.showNotice();
|
this.relatedLogin();
|
this.getCaptchaImg();
|
|
},
|
};
|
</script>
|
|
<style lang="less">
|
@import "./login.less";
|
</style>
|