|
@@ -0,0 +1,222 @@
|
|
|
+<template>
|
|
|
+ <div class="login-container">
|
|
|
+ <!-- 背景图 -->
|
|
|
+ <img class="background-image" :src="loginbg" alt="背景图">
|
|
|
+
|
|
|
+ <!-- 登录框 -->
|
|
|
+ <div class="login-form-container">
|
|
|
+ <div class="login-box">
|
|
|
+ <el-card class="login-card" shadow="never">
|
|
|
+ <template #header>
|
|
|
+ <div class="login-header">
|
|
|
+ <img :src="loginLogo" alt="logo" class="login-logo"/>
|
|
|
+ <h2>欢迎登录</h2>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-form
|
|
|
+ :model="loginForm"
|
|
|
+ :rules="loginRules"
|
|
|
+ ref="loginFormRef"
|
|
|
+ @keyup.enter="handleLogin"
|
|
|
+ >
|
|
|
+ <el-form-item prop="username" label="邮箱:" style="margin-bottom: 20px;">
|
|
|
+ <el-input
|
|
|
+ v-model="loginForm.username"
|
|
|
+ placeholder="请输入用户名"
|
|
|
+ prefix-icon="User"
|
|
|
+ clearable
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item prop="password" label="密码:">
|
|
|
+ <el-input
|
|
|
+ v-model="loginForm.password"
|
|
|
+ placeholder="请输入密码"
|
|
|
+ prefix-icon="Lock"
|
|
|
+ show-password
|
|
|
+ clearable
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item prop="remember">
|
|
|
+ <div style="width: 100%; display: flex; justify-content: space-between;">
|
|
|
+ <el-checkbox v-model="loginForm.remember">记住我</el-checkbox>
|
|
|
+ <el-link type="info">忘记密码</el-link>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item>
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ class="login-btn"
|
|
|
+ :loading="loading"
|
|
|
+ @click="handleLogin"
|
|
|
+ >
|
|
|
+ 登 录
|
|
|
+ </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <div class="login-footer">
|
|
|
+ <div class="register-prompt">没有账号?点击</div>
|
|
|
+ <el-link type="primary">注册</el-link>
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
+import router from "@/router"
|
|
|
+import { request,enPassword } from "@/utils/request"
|
|
|
+
|
|
|
+import { getToken, setToken, setUserId} from "@/utils/token"
|
|
|
+
|
|
|
+import loginbg from '@/assets/img/login-bg.png'
|
|
|
+import loginLogo from '@/assets/img/login-logo.png'
|
|
|
+// 表单引用
|
|
|
+const loginFormRef = ref(null)
|
|
|
+
|
|
|
+// 登录表单数据
|
|
|
+const loginForm = reactive({
|
|
|
+ username: '',
|
|
|
+ password: '',
|
|
|
+ remember: false
|
|
|
+})
|
|
|
+
|
|
|
+// 加载状态
|
|
|
+const loading = ref(false)
|
|
|
+
|
|
|
+// 表单验证规则
|
|
|
+const loginRules = reactive({
|
|
|
+ username: [
|
|
|
+ { required: true, message: '请输入用户名', trigger: 'blur' },
|
|
|
+ { min: 3, max: 18, message: '长度在 3 到 18 个字符', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ password: [
|
|
|
+ { required: true, message: '请输入密码', trigger: 'blur' },
|
|
|
+ { min: 6, max: 18, message: '长度在 6 到 18 个字符', trigger: 'blur' }
|
|
|
+ ]
|
|
|
+})
|
|
|
+
|
|
|
+// 登录方法
|
|
|
+const handleLogin = () => {
|
|
|
+ loginFormRef.value.validate(valid => {
|
|
|
+ if (!valid) return
|
|
|
+
|
|
|
+ loading.value = true
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ transCode: "A00002",
|
|
|
+ loginName: loginForm.username,
|
|
|
+ password: enPassword(loginForm.password),
|
|
|
+ type: "",
|
|
|
+ }
|
|
|
+ console.log(params)
|
|
|
+ request(params)
|
|
|
+ .then((res) => {
|
|
|
+ setToken(res.clientToken)
|
|
|
+ setUserId(res.userId)
|
|
|
+ router.push({ path: "/" })
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ console.error('错误信息:',err);
|
|
|
+ ElMessage.error(err.returnMsg);
|
|
|
+ loading.value = false;
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ loading.value = false
|
|
|
+ });
|
|
|
+
|
|
|
+ })
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.login-container {
|
|
|
+ position: relative;
|
|
|
+ width: 100%;
|
|
|
+ height: 100vh;
|
|
|
+ min-width: 1200px;
|
|
|
+ min-height: 600px;
|
|
|
+ overflow: auto;
|
|
|
+}
|
|
|
+
|
|
|
+.background-image {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: cover;
|
|
|
+ object-position: center;
|
|
|
+ z-index: 0;
|
|
|
+}
|
|
|
+
|
|
|
+.login-form-container {
|
|
|
+ position: absolute;
|
|
|
+ left: 60%;
|
|
|
+ width: 40%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.login-box {
|
|
|
+ height: 100%;
|
|
|
+ background-color: rgba(255, 255, 255, 0.6);
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+.login-card {
|
|
|
+ border: none !important;
|
|
|
+ width: 60%;
|
|
|
+ background-color: transparent;
|
|
|
+ :deep(.el-card__header) {
|
|
|
+ border-bottom: none;
|
|
|
+ padding-bottom: 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.login-header {
|
|
|
+ text-align: start;
|
|
|
+ width: 75%;
|
|
|
+
|
|
|
+ h2 {
|
|
|
+ margin: 0;
|
|
|
+ font-size: 24px;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #2D2D2D;
|
|
|
+ margin: 10px 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.login-logo {
|
|
|
+ width: 70px;
|
|
|
+ margin-bottom: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.login-btn {
|
|
|
+ width: 100%;
|
|
|
+ height: 42px;
|
|
|
+ margin-top: 10px;
|
|
|
+ font-size: 16px;
|
|
|
+ background-color: #2267B1;
|
|
|
+}
|
|
|
+
|
|
|
+.login-footer {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ margin-top: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.register-prompt {
|
|
|
+ margin-right: 5px;
|
|
|
+ font-size: 13px;
|
|
|
+}
|
|
|
+
|
|
|
+</style>
|