2 changed files with 221 additions and 0 deletions
|
After Width: 1920 | Height: 1080 | Size: 422 KiB |
@ -0,0 +1,221 @@ |
|||||
|
<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, useRoute } from 'vue-router'; |
||||
|
|
||||
|
const router = useRouter(); |
||||
|
const route = useRoute(); |
||||
|
|
||||
|
// 表单数据 |
||||
|
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 = () => { |
||||
|
// 先清空之前的错误提示 |
||||
|
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; |
||||
|
} |
||||
|
|
||||
|
// 模拟接口登录 |
||||
|
// 假设正确账号:admin,正确密码:123456 |
||||
|
const isAccountCorrect = loginForm.value.username === 'admin'; |
||||
|
const isPasswordCorrect = loginForm.value.password === '123456'; |
||||
|
|
||||
|
if (isAccountCorrect && isPasswordCorrect) { |
||||
|
// 登录成功,处理“记住密码”存储 |
||||
|
localStorage.setItem('token', '123456'); |
||||
|
|
||||
|
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'); |
||||
|
} |
||||
|
|
||||
|
// 跳转到首页 |
||||
|
const redirectPath = '/'; |
||||
|
router.push(redirectPath); |
||||
|
} else { |
||||
|
// 登录失败 |
||||
|
if (!isAccountCorrect) { |
||||
|
errorMsg.value = '账号填写有误,请核对账号后重新输入'; |
||||
|
} else { |
||||
|
errorMsg.value = '密码填写有误,请核对密码后重新输入'; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
</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> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue