Files
klp-oa/klp-ui/src/views/login.vue
砂糖 54fe3496fa feat(发货单): 新增发货单打印功能及明细管理
refactor(组件): 重构发货单明细表格为独立组件
feat(组件): 添加发货单打印预览组件
fix(登录页): 移除默认用户名和密码
style(钢卷面板): 添加显示控制属性并优化布局
chore: 添加vitest测试配置和依赖
2025-11-28 11:02:19 +08:00

316 lines
9.0 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-box">
<div class="login-left">
<div class="login-title-welcome">
<img src="../assets/logo/logo.png" alt="logo" class="logo-img" />
<span class="login-title">欢迎使用科伦普冷轧涂镀数智一体化平台</span>
</div>
<p>
嘉祥科伦普重工有限公司是山东省重点工程项目是济宁市工程之一也是科伦普产品结构调整重要的工程项目工程采用了外方技术总负责关键设备整体引进点菜集成国内技术总成自主创新单体设备引进等多种建设方
保证了技术先进和人才的培养确保工程投产后达产达效
</p>
<p>
科伦普冷轧重工有限公司是设计年产量150万 能向广大用户提供热轧酸洗热轧镀锌冷硬罩式退火冷轧镀锌铝锌合金锌铝合金锌铝镁镀铬等各大类产品产品覆盖东北华北华东华南等地区
</p>
</div>
<div class="login-right">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<h2>登录</h2>
<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:10px 0px 25px 0px;">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button :loading="loading" size="medium" type="primary"
style="width:100%; height: 40px; font-size: 16px;" @click.native.prevent="handleLogin">
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
</el-form-item>
</el-form>
<!-- <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>
</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: "",
password: "",
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">
// 引入全局主题变量假设你有全局的variables.scss定义了以下变量
$--color-background: #f5f5f5;
$--color-text-primary: #111;
$--color-text-secondary: #b6bdc5;
$--border-color-light: #4c5057;
$--color-primary: #657b96;
$--metal-gradient-light: linear-gradient(145deg, #f5f5f550, #ffffff50);
.login-page {
display: flex;
height: 100vh;
justify-content: center;
align-items: center;
background: url('../assets/images/login.jpg'); // 金属渐变背景
// 拉伸且不重复
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.login-box {
width: 50%;
height: 50%;
display: flex;
justify-content: center;
align-items: center;
}
.login-left,
.login-right {
// flex: 1;
height: 100%;
padding: 20px;
}
.login-left {
flex: 4;
background-color: #637288;
display: flex;
flex-direction: column;
// box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); // 增加阴影增强质感
p {
text-indent: 2em;
}
}
.login-title-welcome {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
.logo-img {
width: 64px;
height: 64px;
}
.login-title {
font-size: 18px ;
color: $--color-text-primary; // 白色文字
}
}
.login-form {
.el-input {
margin-top: 20px;
input {
height: 40px !important;
color: $--color-text-primary; // 白色文字
background: transparent;
}
&:focus-within {
border-color: $--color-primary; // 聚焦时显示主题色边框
}
}
.input-icon {
height: 40px;
width: 16px;
margin-left: 2px;
color: $--color-text-secondary; // 浅灰色图标
}
}
.login-code {
width: 33%;
height: 40px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.login-code-img {
width: 100%;
height: 40px;
opacity: 0.8;
&:hover {
opacity: 1;
}
}
.el-checkbox {
color: $--color-text-primary; // 白色文字
}
.el-button--primary {
background: $--color-primary; // 主题色按钮
border: none;
color: #111;
}
.login-right {
flex: 3;
background: #ffffff; // 金属渐变背景
display: flex;
justify-content: center;
align-items: center;
}
.login-illustration {
text-align: center;
}
.illustration-img {
width: 320px;
margin-bottom: 32px;
opacity: 0.9;
}
.login-slogan {
.slogan-title {
font-size: 20px;
font-weight: 600;
color: $--color-text-primary; // 白色文字
margin-bottom: 12px;
}
.slogan-desc {
font-size: 15px;
color: $--color-text-secondary; // 浅灰色文字
}
}
</style>