deepchart后台管理系统
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

<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>