HuanMengAdmin/admin-client/src/views/Login.vue
2024-10-21 19:19:54 +08:00

202 lines
4.4 KiB
Vue

<script lang="ts" setup>
import { reactive, ref, onMounted } from "vue";
import AppIcon from "@/core/components/AppIcon.vue";
import router from "@/core/router";
import Tools from "@/core/utils/Tools";
import AppStore from "@/core/store/AppStore";
import LoginService from "@/services/LoginService";
import LanguageComponent from "@/locale/components/LanguageComponent.vue";
import i18n from "@/locale/Main.js";
const state = reactive({
// userName: "admin",
// userPassword: "123456",
userName: "MiaoYu",
userPassword: "MiaoYu",
});
const inputPassword = ref<HTMLElement | null>(null);
const loading = ref(false);
const appStore = AppStore();
const title = appStore.state.title;
onMounted(() => {
reset();
inputPassword.value!.focus();
});
/**
* 检查账户并登录
*/
async function check() {
if (!state.userName) {
return Tools.message.warning(i18n.global.t("login.validate.username"));
}
if (!state.userPassword) {
return Tools.message.warning(i18n.global.t("login.validate.userPassword"));
}
try {
loading.value = true;
const result = await LoginService.login(state.userName, state.userPassword);
loading.value = false;
if (result.code != 200) return;
console.log(result.data);
Tools.setAuthorization(result.data.token);
// router.push("/");
window.location.href = window.location.origin;
} catch (error) {
loading.value = false;
}
}
/**
* 重置系统信息
*/
function reset() {
Tools.removeAuthorization();
appStore.resetInfo();
}
</script>
<template>
<div>
<div class="lang-content">
<LanguageComponent />
</div>
<div class="login">
<div class="login-card">
<div class="flex-left">
<img src="../assets/images/info_service.png" alt="" />
</div>
<div class="flex-right p-30">
<div class="title">{{ $t("login.title") }}</div>
<div class="mt-16">
<a-input v-model:value="state.userName" placeholder="请输入" size="large" allow-clear>
<template #prefix>
<AppIcon name="UserOutlined" style="color: #1890ff; font-size: 14px" />
</template>
</a-input>
</div>
<div class="mt-16">
<a-input-password type="password" v-model:value="state.userPassword" size="large" ref="inputPassword" @keyup.enter="check()">
<template #prefix>
<AppIcon name="LockOutlined" style="color: #1890ff; font-size: 14px" />
</template>
</a-input-password>
</div>
<div class="mt-40">
<a-button type="primary" @click="check()" :loading="loading" size="large" block>
{{ $t("login.submit") }}
</a-button>
</div>
</div>
</div>
</div>
</div>
</template>
<style lang="less" scoped>
body {
margin: 0;
padding: 0;
overflow: hidden;
}
.login {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
//可以解开一下注解 放置一个背景图片
background: url("../assets/images/login-1.jpg") no-repeat;
background-size: cover;
.login-card {
height: 600px;
width: 1000px;
box-shadow: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000;
display: flex;
border-radius: 5px;
.flex-left {
flex: 1;
width: 450px;
img {
height: 100%;
}
}
.flex-right {
flex: 1;
background-color: #ffffff;
display: flex;
justify-content: center;
flex-direction: column;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.title {
text-align: center;
font-size: 30px;
padding: 20px;
font-weight: bold;
}
.el-input-group__append {
padding: 0 !important;
.login-code {
height: 38px;
}
}
}
}
//小于 1024 像素 选择采用此样式
@media (max-width: 1024px) {
.flex-left {
display: none;
flex: 0 !important;
img {
height: auto !important;
width: 80% !important;
}
}
.flex-right {
border-radius: 5px;
}
}
@media (min-width: 600px) and (max-width: 1024px) {
.login-card {
width: 70% !important;
}
}
@media (max-width: 600px) {
.login-card {
// flex-direction: column;
width: 100% !important;
}
}
.lang-content {
position: absolute;
right: 24px;
top: 20px;
}
</style>