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