Files
klp-oa/klp-ui/src/views/login.vue
2025-08-14 16:30:13 +08:00

268 lines
7.1 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-page">
<div class="login-left">
<div class="login-logo">
<img src="../assets/logo/logo.png" alt="logo" class="logo-img" />
<div class="login-title">科伦普综合办公系统</div>
</div>
<div class="login-box">
<div class="login-title-welcome">欢迎使用科伦普综合办公系统</div>
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
@keyup.enter.native="handleLogin">
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%"
@keyup.enter.native="handleLogin">
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" />
</div>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button :loading="loading" size="medium" type="primary" style="width:100%;"
@click.native.prevent="handleLogin">
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
</el-form-item>
</el-form>
</div>
</div>
<div class="login-right">
<div class="login-illustration">
<img src="https://sf3-scmcdn-cn.feishucdn.com/goofy/ee/suite/passport/static/login/img/light.ba71f7a1.png"
alt="illustration" class="illustration-img" />
<div class="login-slogan">
<div class="slogan-title">先进团队先用科伦普</div>
<div class="slogan-desc">信息一处搞定</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie";
import { encrypt, decrypt } from '@/utils/jsencrypt'
export default {
name: "Login",
data() {
return {
codeUrl: "",
loginForm: {
username: "admin",
password: "admin123",
rememberMe: false,
code: "",
uuid: ""
},
loginRules: {
username: [
{ required: true, trigger: "blur", message: "请输入您的账号" }
],
password: [
{ required: true, trigger: "blur", message: "请输入您的密码" }
],
code: [{ required: true, trigger: "change", message: "请输入验证码" }]
},
loading: false,
// 验证码开关
captchaEnabled: true,
// 注册开关
register: false,
redirect: undefined
};
},
watch: {
$route: {
handler: function (route) {
this.redirect = route.query && route.query.redirect;
},
immediate: true
}
},
created() {
this.getCode();
this.getCookie();
},
methods: {
getCode() {
getCodeImg().then(res => {
this.captchaEnabled = res.data.captchaEnabled === undefined ? true : res.data.captchaEnabled;
if (this.captchaEnabled) {
this.codeUrl = "data:image/gif;base64," + res.data.img;
this.loginForm.uuid = res.data.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)
};
},
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.$store.dispatch('category/getCategoryList');
this.$store.dispatch('category/getProductMap');
this.$store.dispatch('category/getRawMaterialMap');
this.$store.dispatch('category/getBomMap');
this.$store.dispatch('finance/getFinancialAccounts');
this.$store.dispatch('craft/getProcessList');
this.$router.push({ path: this.redirect || "/" }).catch(() => { });
}).catch(() => {
this.loading = false;
if (this.captchaEnabled) {
this.getCode();
}
});
}
});
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss">
.login-page {
display: flex;
height: 100vh;
background: #f7f8fa;
}
.login-logo {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
position: absolute;
top: 24px;
left: 24px;
.logo-img {
width: 64px;
height: 64px;
}
.login-title {
font-size: 22px;
}
}
.login-left {
flex: 2;
display: flex;
justify-content: center;
align-items: center;
background: #fff;
position: relative;
}
.login-box {
width: 500px;
padding: 40px 32px 32px 32px;
border-radius: 12px;
box-shadow: 0 4px 32px 0 rgba(0, 0, 0, 0.08);
background: #fff;
}
.login-title-welcome {
font-size: 22px;
font-weight: 600;
color: #222;
text-align: left;
margin-bottom: 24px;
}
.login-form {
.el-input {
height: 40px;
input {
height: 40px;
}
}
.input-icon {
height: 40px;
width: 16px;
margin-left: 2px;
}
}
.login-code {
width: 33%;
height: 40px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.login-code-img {
width: 100%;
height: 40px;
}
.login-right {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
background: linear-gradient(120deg, #e3eafc 0%, #f7f8fa 100%);
}
.login-illustration {
text-align: center;
}
.illustration-img {
width: 320px;
margin-bottom: 32px;
}
.login-slogan {
.slogan-title {
font-size: 20px;
font-weight: 600;
color: #222;
margin-bottom: 12px;
}
.slogan-desc {
font-size: 15px;
color: #888;
}
}
</style>