You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
5.0 KiB
222 lines
5.0 KiB
<template>
|
|
<!-- 背景容器 -->
|
|
<div class="login-bg">
|
|
<!-- 登录表单 -->
|
|
<div class="login-form">
|
|
<h3>欢迎登录系统</h3>
|
|
<el-form :model="loginForm" label-width="0" class="form-item">
|
|
<!-- 账号输入框 -->
|
|
<el-form-item>
|
|
<el-input v-model="loginForm.username" prefix-icon="User" placeholder="请输入登录账号" clearable @input="clearErrorMsg"/>
|
|
</el-form-item>
|
|
<!-- 密码输入框 -->
|
|
<el-form-item>
|
|
<el-input v-model="loginForm.password" prefix-icon="Lock" type="password" placeholder="请输入登录密码" clearable @input="clearErrorMsg"/>
|
|
</el-form-item>
|
|
<!-- 错误提示 -->
|
|
<div v-show="errorMsg" class="error-tip fixed-height">{{ errorMsg }}</div>
|
|
<div v-show="!errorMsg" class="error-placeholder fixed-height"></div>
|
|
<!-- 记住密码复选框 -->
|
|
<el-form-item class="remember">
|
|
<el-checkbox v-model="loginForm.remember">记住密码</el-checkbox>
|
|
</el-form-item>
|
|
<!-- 登录按钮 -->
|
|
<el-form-item>
|
|
<el-button type="primary" style="width: 100%;" @click="handleLogin">
|
|
登 录
|
|
</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref, onMounted } from 'vue';
|
|
import { useRouter } from 'vue-router';
|
|
import { loginApi } from '../api/userPermissions'
|
|
|
|
const router = useRouter();
|
|
|
|
// 表单数据
|
|
const loginForm = ref({
|
|
username: '',
|
|
password: '',
|
|
remember: false
|
|
});
|
|
|
|
// 错误提示
|
|
const errorMsg = ref('');
|
|
|
|
// 页面加载时,自动填充“记住的账号密码”
|
|
onMounted(() => {
|
|
const storedLogin = localStorage.getItem('deepchart_login');
|
|
if (storedLogin) {
|
|
const { username, password, remember } = JSON.parse(storedLogin);
|
|
loginForm.value.username = username;
|
|
loginForm.value.password = password;
|
|
loginForm.value.remember = remember;
|
|
}
|
|
});
|
|
|
|
// 输入时清空错误提示
|
|
const clearErrorMsg = () => {
|
|
errorMsg.value = '';
|
|
};
|
|
|
|
// 登录逻辑:包含表单校验、消息提醒、记住密码存储
|
|
const handleLogin = async() => {
|
|
// 先清空之前的错误提示
|
|
errorMsg.value = '';
|
|
|
|
// 校验必填项
|
|
if (!loginForm.value.username && !loginForm.value.password) {
|
|
errorMsg.value = '请输入账号和密码后再登录';
|
|
return;
|
|
}
|
|
if (!loginForm.value.username) {
|
|
errorMsg.value = '账号为必填项,请输入账号';
|
|
return;
|
|
}
|
|
if (!loginForm.value.password) {
|
|
errorMsg.value = '密码为必填项,请输入密码';
|
|
return;
|
|
}
|
|
|
|
// 登录
|
|
try {
|
|
const res = await loginApi({
|
|
username: Number(loginForm.value.username),
|
|
password: loginForm.value.password,
|
|
app_from: 'en'
|
|
});
|
|
const data = res.data;
|
|
|
|
if (data && data.data.token) {
|
|
localStorage.setItem('token', data.data.token);
|
|
// “记住密码”存储
|
|
if (loginForm.value.remember) {
|
|
localStorage.setItem('deepchart_login', JSON.stringify({
|
|
username: loginForm.value.username,
|
|
password: loginForm.value.password,
|
|
remember: true
|
|
}));
|
|
} else {
|
|
localStorage.removeItem('deepchart_login');
|
|
}
|
|
|
|
// 跳转到首页
|
|
router.push('/');
|
|
} else {
|
|
errorMsg.value = '账号或密码有误,请重新输入';
|
|
}
|
|
} catch (error) {
|
|
errorMsg.value = '登录失败,请稍后重试';
|
|
console.error('登录请求异常:', error);
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
/* 背景图全屏样式 */
|
|
.login-bg {
|
|
background-image: url('../assets/images/login.png');
|
|
background-size: cover;
|
|
background-position: center;
|
|
height: calc(100vh - 16px);
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
/* 表单样式 */
|
|
.login-form {
|
|
margin-left: 650px;
|
|
width: 400px;
|
|
padding: 40px 30px;
|
|
}
|
|
|
|
/* 标题样式 */
|
|
.login-form h3 {
|
|
text-align: center;
|
|
margin-bottom: 50px;
|
|
color: #2d3748;
|
|
font-size: 24px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.form-item {
|
|
width: 100%;
|
|
}
|
|
|
|
/* 输入框区域 */
|
|
.el-form-item {
|
|
margin-bottom: 30px;
|
|
}
|
|
|
|
.el-input {
|
|
border-radius: 4px;
|
|
border: 1px solid #e5e7eb;
|
|
height: 48px;
|
|
}
|
|
|
|
.el-input__inner {
|
|
padding: 0 16px;
|
|
font-size: 16px;
|
|
}
|
|
|
|
.el-input__placeholder {
|
|
font-size: 16px !important;
|
|
}
|
|
|
|
/* 记住密码 */
|
|
.remember {
|
|
text-align: left;
|
|
margin-bottom: 32px;
|
|
font-size: 15px;
|
|
color: #4b5563;
|
|
}
|
|
|
|
.el-checkbox__label {
|
|
font-size: 15px !important;
|
|
margin-left: 8px !important;
|
|
}
|
|
|
|
/* 登录按钮 */
|
|
.el-button--primary {
|
|
height: 52px;
|
|
font-size: 18px;
|
|
border-radius: 4px;
|
|
background-color: #1890ff;
|
|
border: none;
|
|
}
|
|
|
|
.el-button--primary:hover {
|
|
background-color: #096dd9;
|
|
}
|
|
|
|
/* 图标大小适配 */
|
|
.el-input__prefix {
|
|
font-size: 18px !important;
|
|
}
|
|
|
|
/* 错误提示 */
|
|
.error-tip {
|
|
color: #ff4d4f;
|
|
font-size: 14px;
|
|
font-weight: 700;
|
|
text-align: left;
|
|
line-height: 1.5;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.error-placeholder {
|
|
visibility: hidden;
|
|
}
|
|
|
|
.fixed-height {
|
|
height: 21px;
|
|
margin-bottom: 6px;
|
|
}
|
|
|
|
</style>
|