mes-lxsm-ui/src/views/login.vue
2023-11-23 17:31:22 +08:00

620 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="login-container ng-scope">
<div class="login-wrap">
<div class="bg-opacity">
<div class="logo" />
<div class="title" />
</div>
<el-card class="card-container">
<el-tabs type="card" :tab-position="tabPosition" style="height: 350px">
<el-tab-pane>
<span slot="label" style="width: 248px"
><i class="el-icon-user" /> 账号登录</span
>
<el-form
ref="loginForm"
:model="loginForm"
:rules="loginRules"
class="login-form"
autocomplete="on"
label-position="left"
>
<div class="title-container">
<h1 class="title">登录</h1>
</div>
<el-form-item prop="username">
<span class="svg-container">
<svg-icon icon-class="user" />
</span>
<el-input
ref="username"
v-model="loginForm.username"
placeholder="请输入账号"
name="username"
type="text"
tabindex="1"
auto-complete="on"
/>
</el-form-item>
<el-tooltip
v-model="capsTooltip"
content="密码明文查看"
placement="right"
manual
>
<el-form-item prop="password">
<span class="svg-container">
<svg-icon icon-class="password" />
</span>
<el-input
:key="passwordType"
ref="password"
v-model="loginForm.password"
:type="passwordType"
placeholder="请填写密码"
name="password"
tabindex="2"
autocomplete="on"
@keyup.native="checkCapslock"
@blur="capsTooltip = false"
/>
<span class="show-pwd" @click="showPwd">
<svg-icon
:icon-class="
passwordType === 'password' ? 'eye' : 'eye-open'
"
/>
</span>
</el-form-item>
</el-tooltip>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0px 76px 0px -155px"
>记住密码</el-checkbox
>
<el-button type="primary" @click.native.prevent="handleLogin"
>登 录</el-button
>
<!-- <span style="font-size:13px;cursor:pointer;color:#9b9ea0;text-decoration:none;position: absolute;right:20px;padding-top:20px;" @click="forgetPwd">忘记密码</span> -->
<!-- <el-row>
<el-col :span="24" style="text-align:right;margin-top:-20px"><span style="font-size:13px;cursor:pointer;color:#9b9ea0;text-decoration:none" @click="forgetPwd">忘记密码</span></el-col>
</el-row> -->
</el-form>
</el-tab-pane>
<el-tab-pane>
<span slot="label" style="width: 249px"
><i class="el-icon-phone" /> 手机号登录</span
>
<el-form
ref="loginForm"
:model="loginForm"
:rules="loginPhoneRules"
class="login-form"
autocomplete="on"
label-position="left"
>
<div class="title-container">
<h1 class="title">登录</h1>
</div>
<el-form-item prop="username">
<span class="svg-container">
<img
src="@/assets/images/shoujitianchong.png"
class="svgImg"
/>
</span>
<el-input
ref="phone"
v-model="loginForm.username"
placeholder="请输入手机号码"
name="phone"
type="text"
tabindex="1"
auto-complete="on"
/>
</el-form-item>
<el-tooltip
v-model="capsTooltip"
content="密码明文查看"
placement="right"
manual
>
<el-form-item prop="password">
<span class="svg-container">
<svg-icon icon-class="password" />
</span>
<el-input
:key="passwordType"
ref="password"
v-model="loginForm.password"
:type="passwordType"
placeholder="请填写密码"
name="password"
tabindex="2"
autocomplete="on"
@keyup.native="checkCapslock"
@blur="capsTooltip = false"
/>
<span class="show-pwd" @click="showPwd">
<svg-icon
:icon-class="
passwordType === 'password' ? 'eye' : 'eye-open'
"
/>
</span>
</el-form-item>
</el-tooltip>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0px 76px 0px -155px"
>记住密码</el-checkbox
>
<el-button type="primary" @click.native.prevent="handleLogin"
>登 录</el-button
>
<!-- <span style="font-size:13px;cursor:pointer;color:#9b9ea0;text-decoration:none;position: absolute;right:20px;padding-top:20px;" @click="forgetPwd">忘记密码</span> -->
<!-- <el-row>
<el-col :span="24" style="text-align:right;margin-top:-20px">
<span style="font-size:13px;cursor:pointer;color:#9b9ea0;text-decoration:none" @click="forgetPwd">忘记密码</span></el-col>
</el-row> -->
</el-form>
</el-tab-pane>
</el-tabs>
</el-card>
</div>
<el-dialog
title="忘记密码"
:visible.sync="dialogVisible"
width="30%"
append-to-body
center
>
<p>机构员工遗失密码,请联系本机构管理员进行密码重置;</p>
<p>
机构管理员遗失密码请联系平台客服QQ2546125360并提供相关身份证明材料。
</p>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="dialogVisible = false"
>确 定</el-button
>
</span>
</el-dialog>
<Footer />
</div>
</template>
<script>
import Footer from "@/components/Footer";
import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt";
export default {
components: { Footer },
name: "Login",
data() {
return {
loginForm: {
username: "",
password: "",
rememberMe: false,
code: "",
uuid: "",
},
loginPhoneForm: {
phone: "",
password: "",
},
tabPosition: "",
loginRules: {
username: [
{ required: true, trigger: "blur", message: "请输入用户名称" },
],
password: [{ required: true, trigger: "blur", message: "请录入密码" }],
},
loginPhoneRules: {
username: [{ required: true, trigger: "blur", message: "请输入手机号码" }],
// username: [
// { required: true, message: "手机号码不能为空", trigger: "blur" },
// {
// pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
// message: "请输入正确的手机号码",
// trigger: "blur",
// },
// ],
password: [{ required: true, trigger: "blur", message: "请录入密码" }],
},
passwordType: "password",
capsTooltip: false,
loading: false,
redirect: undefined,
otherQuery: {},
dialogVisible: false,
};
},
watch: {
$route: {
handler: function (route) {
this.redirect = route.query && route.query.redirect;
},
immediate: true,
},
},
created() {
this.getCode();
this.getCookie();
},
mounted() {
if (this.loginForm.username === "") {
this.$refs.username.focus();
} else if (this.loginForm.password === "") {
this.$refs.password.focus();
}
window.addEventListener("keydown", this.keyDown); //监听回车事件
},
destroyed() {
window.removeEventListener("keydown", this.keyDown, false); //销毁回车事件,如果不销毁,在其他页面敲回车也会执行回车登录操作。
},
methods: {
toIPC() {
window.open("https://beian.miit.gov.cn/", "_blank");
},
getCode() {
getCodeImg().then((res) => {
this.captchaOnOff =
res.captchaOnOff === undefined ? true : res.captchaOnOff;
if (this.captchaOnOff) {
this.codeUrl = "data:image/gif;base64," + res.img;
this.loginForm.uuid = res.uuid;
}
});
},
getCookie() {
const username = Cookies.get("username");
const password = Cookies.get("password");
const rememberMe = Cookies.get("rememberMe");
this.loginForm = {
username: username === undefined ? this.loginForm.username : username,
password:
password === undefined ? this.loginForm.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
};
},
checkCapslock(e) {
const { key } = e;
this.capsTooltip = key && key.length === 1 && key >= "A" && key <= "Z";
},
showPwd() {
if (this.passwordType === "password") {
this.passwordType = "";
} else {
this.passwordType = "password";
}
this.$nextTick(() => {
this.$refs.password.focus();
});
},
handleLogin() {
this.$refs.loginForm.validate((valid) => {
if (valid) {
this.loading = true;
if (this.loginForm.rememberMe) {
Cookies.set("username", this.loginForm.username, { expires: 30 });
Cookies.set("password", encrypt(this.loginForm.password), {
expires: 30,
});
Cookies.set("rememberMe", this.loginForm.rememberMe, {
expires: 30,
});
} else {
Cookies.remove("username");
Cookies.remove("password");
Cookies.remove("rememberMe");
}
this.$store
.dispatch("Login", this.loginForm)
.then(() => {
this.$router.push({ path: this.redirect || "/" }).catch(() => {});
})
.catch(() => {
this.loading = false;
if (this.captchaOnOff) {
this.getCode();
}
});
}
});
},
phoneLogin() {
// this.$refs.loginPhoneForm.validate((valid) => {
// if (valid) {
// this.loading = true;
// this.$store
// .dispatch("user/phoneLogin", this.loginPhoneForm)
// .then(() => {
// debugger;
// this.$router.push({ path: "/", query: this.otherQuery });
// this.loading = false;
// })
// .catch(() => {
// this.loading = false;
// });
// } else {
// console.log("error submit!!");
// return false;
// }
// });
},
},
};
</script>
<style lang="scss">
$bg: #fff;
$light_gray: #000;
$cursor: #858585;
@supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
.login-container .el-input input {
color: $cursor;
line-height: 44px;
}
}
/* reset element-ui css */
.login-container {
.el-input {
display: inline-block;
height: 44px;
width: 85%;
input {
background: transparent;
border: 0px;
-webkit-appearance: none;
border-radius: 0px;
padding: 6px 5px 12px 15px;
border-bottom: 1px solid #e0e0e0;
color: $light_gray;
height: 44px;
caret-color: $cursor;
&:-webkit-autofill {
box-shadow: 0 0 0px 1000px $bg inset !important;
-webkit-text-fill-color: $cursor !important;
}
}
}
.el-form-item {
border: 1px solid rgba(255, 255, 255, 0.1);
// background: rgba(0, 0, 0, 0.1);
border-radius: 5px;
color: #454545;
}
}
</style>
<style lang="scss" scoped>
$bg: #2d3a4b;
$dark_gray: rgb(29, 27, 27);
$light_gray: #eee;
.login-container {
height: 65%;
width: 100%;
position: absolute;
top: 0;
left: 0;
background: url("../../src/assets/images/login_bg.jpg") no-repeat center;
background-size: 100%;
content: "";
z-index: 0;
.bg-opacity {
padding-bottom: 10px;
background-color: rgba(0, 0, 0, 0.3);
}
.logo {
position: relative;
width: 25%;
height: 140px;
margin: 0 auto 20px;
background: url("../../src/assets/images/logo_white.png") no-repeat center;
background-size: 100% 100%;
}
.logo:after {
position: absolute;
content: "";
left: -15%;
bottom: 0;
height: 1px;
width: 129%;
border-bottom: 1px solid #fff;
}
.logo + .title {
width: 666px;
height: 44px;
margin: 0 auto;
background: url("../../src/assets/images/login_title.png") no-repeat center;
background-size: 100% 100%;
color: white;
// font-size: 24px;
// letter-spacing: 4px
}
.login-content {
overflow: hidden;
height: 100%;
}
.card-container {
width: 500px;
margin: 0 auto;
padding: 0 auto;
}
.el-card {
// padding: 5px 10px 0px 0px;
padding: 0px;
}
::v-deep .el-card__body {
padding: 0px !important;
.el-tabs__item {
width: 250px;
}
}
.login-form {
display: block;
position: relative;
width: 520px;
max-width: 100%;
padding: 0px 15px;
margin: 0 auto;
overflow: hidden;
}
.tips {
font-size: 14px;
color: #fff;
margin-bottom: 10px;
span {
&:first-of-type {
margin-right: 16px;
}
}
}
.svg-container {
padding: 0px 0px 6px 5px;
margin-bottom: -10px;
color: $dark_gray;
vertical-align: middle;
width: 30px;
display: inline-block;
.svgImg {
width: 1em;
height: 1em;
vertical-align: -0.16em;
fill: currentColor;
overflow: hidden;
}
}
.title-container {
.title {
color: #7e7e7e;
text-align: center;
letter-spacing: -0.05em;
line-height: 20px;
font-weight: 500;
font-family: "Helvetica Neue", Helvetica, "PingFang SC",
"Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
margin-bottom: 10px;
}
h1.title:before,
h1.title:after {
content: "";
height: 1px;
position: absolute;
top: 37px;
width: 35%;
}
h1.title:before {
background: rgb(126, 126, 126);
background: -moz-linear-gradient(
to left,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
background: -webkit-linear-gradient(
to left,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
background: -moz-linear-gradient(
to left,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
background: -ms-linear-gradient(
to left,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
background: linear-gradient(
to left,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
left: 0px;
}
h1.title:after {
background: rgb(126, 126, 126);
background: -moz-linear-gradient(
to right,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
background: -webkit-linear-gradient(
to right,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
background: -moz-linear-gradient(
to right,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
background: -ms-linear-gradient(
to right,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
background: linear-gradient(
to right,
rgba(126, 126, 126, 1) 0%,
rgba(255, 255, 255, 1) 100%
);
right: 0px;
}
}
.show-pwd {
position: absolute;
right: 10px;
top: 3px;
font-size: 16px;
color: $dark_gray;
cursor: pointer;
user-select: none;
}
.thirdparty-button {
position: absolute;
right: 0;
bottom: 6px;
}
@media only screen and (max-width: 470px) {
.thirdparty-button {
display: none;
}
}
.login-wrap {
position: absolute;
top: 70%;
left: 0;
right: 0;
width: 100%;
height: 418px;
text-align: center;
transform: translate(0, -50%);
}
}
</style>