231 lines
7.5 KiB
Vue
231 lines
7.5 KiB
Vue
<template>
|
||
<div id="background" class="fixed"></div>
|
||
<div class="bg-backdrop-layout"></div>
|
||
<div class="login-container">
|
||
<div class="login-width md:w-10/12 mx-auto flex justify-between h-full items-center">
|
||
<div class="w-6/12 mx-auto left-panel rounded-l pl-5 pr-5 hidden md:block">
|
||
<div class="logo">
|
||
<img src="@/assets/img/wxwx-logo.svg" width="45" /><span>{{ $title }}</span>
|
||
</div>
|
||
<div class="slogan flex justify-end">
|
||
<span>---- 为测评服务,打造测评高地</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="md:w-6/12 w-11/12 md:rounded-r mx-auto pl-5 pr-5 pb-10">
|
||
<h2 class="mt-10 text-3xl pb-0 mb-10">登录</h2>
|
||
<a-form :model="form" @submit="handleSubmit">
|
||
<a-form-item
|
||
field="username"
|
||
:hide-label="true"
|
||
:rules="[
|
||
{ required: true, message: '用户名不能为空' },
|
||
{ maxLength: 30, message: '用户名不能超过30个字符' }
|
||
]"
|
||
>
|
||
<a-input
|
||
v-model="form.username"
|
||
class="w-full"
|
||
size="large"
|
||
placeholder="用户名"
|
||
allow-clear
|
||
:max-length="30"
|
||
>
|
||
<template #prefix><icon-user /></template>
|
||
</a-input>
|
||
</a-form-item>
|
||
|
||
<a-form-item
|
||
field="password"
|
||
:hide-label="true"
|
||
:rules="[
|
||
{ required: true, message: '密码不能为空' },
|
||
{ maxLength: 30, message: '密码不超过30字符' }
|
||
]"
|
||
>
|
||
<a-input-password
|
||
v-model="form.password"
|
||
placeholder="请输入密码"
|
||
size="large"
|
||
allow-clear
|
||
:max-length="30"
|
||
>
|
||
<template #prefix><icon-lock /></template>
|
||
</a-input-password>
|
||
</a-form-item>
|
||
|
||
<a-form-item
|
||
field="code"
|
||
:hide-label="true"
|
||
:rules="[
|
||
{
|
||
required: true,
|
||
match: /^[a-zA-Z0-9]{4}$/,
|
||
message: '验证码不符合要求'
|
||
}
|
||
]"
|
||
>
|
||
<a-input
|
||
v-model="form.code"
|
||
placeholder="请输入验证码"
|
||
size="large"
|
||
allow-clear
|
||
:max-length="4"
|
||
>
|
||
<template #prefix><icon-safe /></template>
|
||
<template #append>
|
||
<verify-code ref="Verify" />
|
||
</template>
|
||
</a-input>
|
||
</a-form-item>
|
||
|
||
<a-form-item :hide-label="true" class="mt-5">
|
||
<a-button html-type="submit" type="primary" long size="large" :loading="loading">
|
||
登录
|
||
</a-button>
|
||
</a-form-item>
|
||
|
||
<a-divider orientation="center">未来登录方式</a-divider>
|
||
<div class="flex w-3/4 pt-2 mx-auto items-stretch justify-around">
|
||
<a-avatar class="other-login wechat"><icon-wechat /></a-avatar>
|
||
<a-avatar class="other-login alipay"><icon-alipay-circle /></a-avatar>
|
||
<a-avatar class="other-login qq"><icon-qq /></a-avatar>
|
||
<a-avatar class="other-login weibo"><icon-weibo /></a-avatar>
|
||
</div>
|
||
</a-form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { reactive, ref } from "vue"
|
||
import verifyCode from "@cps/ma-verifyCode/index.vue"
|
||
import { useUserStore } from "@/store"
|
||
import { useRouter, useRoute } from "vue-router"
|
||
import userApi from "@/api/system/user"
|
||
const router = useRouter()
|
||
const route = useRoute()
|
||
const userStore = useUserStore()
|
||
// 绑定登录form的数据
|
||
// const form = reactive({ username: "superAdmin", password: "admin123", code: "" })
|
||
const form = reactive({ username: "", password: "", code: "" })
|
||
// 获取验证码dom && arco表单loading
|
||
const Verify = ref(null)
|
||
const loading = ref(null)
|
||
// 点击登录按钮
|
||
const errorMessage = ref("")
|
||
const handleSubmit = async ({ values, errors }) => {
|
||
if (loading.value) {
|
||
return
|
||
}
|
||
loading.value = true
|
||
if (Verify.value.checkResult(form.code) && !errors) {
|
||
// 登录逻辑需要用到userStore
|
||
try {
|
||
const login_res = await userStore.login(form)
|
||
if (login_res) {
|
||
const { redirect, ...otherQuery } = router.currentRoute.value.query
|
||
router.push({
|
||
name: redirect || "workplace",
|
||
query: {
|
||
...otherQuery // 将退出时的查询参数放入,这样就不会错误
|
||
}
|
||
})
|
||
// 加载LDAP数据/内网/暂定
|
||
await userApi.loadLDAPUsers()
|
||
} else {
|
||
return
|
||
}
|
||
} catch (err) {
|
||
errorMessage.value = err.message
|
||
} finally {
|
||
loading.value = false
|
||
}
|
||
}
|
||
loading.value = false
|
||
}
|
||
</script>
|
||
|
||
<style lang="less" scoped>
|
||
#background {
|
||
top: 0;
|
||
left: 0;
|
||
z-index: 1;
|
||
width: 100%;
|
||
height: 100%;
|
||
background-size: cover;
|
||
background-image: url("@/assets/BingWallpaper.jpg");
|
||
}
|
||
.bg-backdrop-layout {
|
||
top: 0;
|
||
left: 0;
|
||
position: fixed;
|
||
width: 100%;
|
||
height: 100%;
|
||
z-index: 2;
|
||
backdrop-filter: blur(0.01px); // 给背景图模糊
|
||
}
|
||
.login-container {
|
||
width: 100%;
|
||
height: 100%;
|
||
position: absolute;
|
||
background-size: cover;
|
||
z-index: 3;
|
||
.login-width {
|
||
max-width: 950px;
|
||
background: #fff;
|
||
padding: 10px;
|
||
height: 500px;
|
||
position: relative;
|
||
top: 50%;
|
||
margin-top: -255px;
|
||
border-radius: 2px;
|
||
}
|
||
|
||
.left-panel {
|
||
height: 491px;
|
||
background-image: url(@/assets/login_picture.svg);
|
||
background-repeat: no-repeat;
|
||
background-position: center 140px;
|
||
background-size: contain;
|
||
}
|
||
|
||
.logo {
|
||
display: flex;
|
||
margin-top: 20px;
|
||
color: #333;
|
||
perspective: 100px;
|
||
span {
|
||
font-size: 28px;
|
||
margin-left: 15px;
|
||
color: rgb(var(--primary-6));
|
||
}
|
||
}
|
||
.slogan {
|
||
font-size: 16px;
|
||
line-height: 50px;
|
||
}
|
||
|
||
:deep(.arco-input-append) {
|
||
padding: 0 !important;
|
||
}
|
||
|
||
.other-login {
|
||
cursor: pointer;
|
||
}
|
||
|
||
.qq:hover,
|
||
.alipay:hover {
|
||
background: #165dff;
|
||
}
|
||
.wechat:hover {
|
||
background: #0f9c02;
|
||
}
|
||
|
||
.weibo:hover {
|
||
background: #f3ce2b;
|
||
}
|
||
}
|
||
</style>
|