skyouc
2024-12-21 c635d78b479510ebe2556a420948effcd30a0731
zy-asrs-admin/src/views/login/LoginView.vue
@@ -1,307 +1,307 @@
<script setup>
import { getCurrentInstance, inject, ref } from 'vue';
import { message } from 'ant-design-vue';
import { get, post } from '../../utils/request.js'
import { formatMessage } from '@/utils/localeUtils.js';
const context = getCurrentInstance()?.appContext.config.globalProperties;
const globalState = inject('globalState');
let copyrightLargeShow = ref(false);
let username = ref("");
let password = ref("");
let hostId = ref(null);
let hostList = ref([]);
function loginConfirm() {
    if (username.value == "" || password.value == "") {
        message.info(formatMessage('login.input', '请输入账号密码!'));
        return;
    }
    post('/api/login', {
        username: username.value,
        password: password.value,
        hostId: hostId.value,
    }).then((result) => {
        if (result.data.code == 200) {
            let data = result.data.data;
            globalState.token = data.accessToken;
            globalState.user = data.user;
            localStorage.setItem('token', data.accessToken)
            localStorage.setItem('user', JSON.stringify(data.user))
            message.success(formatMessage('login.success', '登录成功'))
            window.location.reload();
        } else {
            message.error(result.data.msg)
        }
    })
}
getHostList()
function getHostList() {
    get('/api/auth/host', {}).then((result) => {
        if (result.data.code == 200) {
            let data = result.data.data;
            let tmp = []
            data.forEach((item) => {
                tmp.push({
                    label: item.name,
                    value: item.id
                })
            })
            hostList.value = tmp;
            if(tmp.length > 0) {
                let tmpHost = tmp[0]
                hostId.value = tmpHost.value;
            }
        } else {
            message.error(result.data.msg)
        }
    })
}
</script>
<script>
export default {
    name: 'login'
}
</script>
<template>
    <div class="container" @keyup.enter="loginConfirm">
        <div class="left-box">
            <div class="login-video">
                <video src="/public/img/login-bg.mp4" height="100%" loop autoplay muted="false"
                    controlslist="nodownload" disablepictureinpicture></video>
                <!-- <img src="/public/img/bg1.png" height="100%"> -->
            </div>
        </div>
        <div class="right-box">
            <div class="login-box">
                <div class="form-main">
                    <p style="text-align: center;"><img class="loginLogoUrl" src="/public/img/logo.png" alt=""
                            style="width: 80%">
                    </p>
                    <p style="margin-top: -10px;"><span class="login100-form-title p-t-20 p-b-45"
                            style="color: #868686;font-size: 24px">WMS</span></p>
                    <div class="inputContainer">
                        <a-select v-model:value="hostId" style="width: 100%;" :options="hostList"></a-select>
                    </div>
                    <div class="inputContainer">
                        <svg viewBox="0 0 16 16" fill="#2e2e2e" height="16" width="16"
                            xmlns="http://www.w3.org/2000/svg" class="inputIcon">
                            <path
                                d="M13.106 7.222c0-2.967-2.249-5.032-5.482-5.032-3.35 0-5.646 2.318-5.646 5.702 0 3.493 2.235 5.708 5.762 5.708.862 0 1.689-.123 2.304-.335v-.862c-.43.199-1.354.328-2.29.328-2.926 0-4.813-1.88-4.813-4.798 0-2.844 1.921-4.881 4.594-4.881 2.735 0 4.608 1.688 4.608 4.156 0 1.682-.554 2.769-1.416 2.769-.492 0-.772-.28-.772-.76V5.206H8.923v.834h-.11c-.266-.595-.881-.964-1.6-.964-1.4 0-2.378 1.162-2.378 2.823 0 1.737.957 2.906 2.379 2.906.8 0 1.415-.39 1.709-1.087h.11c.081.67.703 1.148 1.503 1.148 1.572 0 2.57-1.415 2.57-3.643zm-7.177.704c0-1.197.54-1.907 1.456-1.907.93 0 1.524.738 1.524 1.907S8.308 9.84 7.371 9.84c-.895 0-1.442-.725-1.442-1.914z">
                            </path>
                        </svg>
                        <input :placeholder="formatMessage('login.rule.username', '请输入用户名')" v-model="username" class="inputField" type="text">
                    </div>
                    <div class="inputContainer">
                        <svg viewBox="0 0 16 16" fill="#2e2e2e" height="16" width="16"
                            xmlns="http://www.w3.org/2000/svg" class="inputIcon">
                            <path
                                d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2z">
                            </path>
                        </svg>
                        <input :placeholder="formatMessage('login.rule.password', '请输入密码')" v-model="password" class="inputField" type="password">
                    </div>
                    <input @click="loginConfirm" type="button" class="login-button" :value="formatMessage('common.submit', '登录')">
                    <div style="display: none;margin-top: 5px;width: 100%;" id="updateLicense">
                        <form enctype="multipart/form-data" style="display: none;">
                            <input id="license" type="file" name="file">
                        </form>
                        <input type="button" id="submitLicense" class="login-button" style="margin: 0;" value="更新许可证">
                    </div>
                </div>
            </div>
            <div class="login-copyright">
                <div class="copyright-text">Copyright ©2023 浙江中扬立库技术有限公司版权所有</div>
                <div id="copyright-img1" class="copyright-img" @mouseover="copyrightLargeShow = true"
                    @mouseout="copyrightLargeShow = false">
                    <img class="copyright-img-url" src="/public/img/weixin_qrcode.jpg" />
                    <div v-if="copyrightLargeShow" class="copyright-img-large"><img class="copyright-img-url"
                            src="/public/img/weixin_qrcode.jpg" /></div>
                </div>
            </div>
        </div>
    </div>
</template>
<style>
* {
    padding: 0;
    margin: 0;
}
.container {
    display: flex;
    height: 100vh;
    width: 100%;
}
.left-box {
    height: 100%;
    width: 70%;
}
.login-video {
    height: 100%;
    overflow: hidden;
}
.form-main {
    width: 300px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background-color: rgba(255, 255, 255, 0.6);
    padding: 50px 30px 50px 30px;
    border-radius: 20px;
    box-shadow: 0px 0px 40px rgba(0, 0, 0, 0.062);
}
.heading {
    font-size: 2.5em;
    color: #2e2e2e;
    font-weight: 700;
    margin: 15px 0 0px 0;
}
.inputContainer {
    width: 100%;
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
}
.inputIcon {
    position: absolute;
    left: 10px;
}
.inputField {
    width: 100%;
    height: 40px;
    background-color: transparent;
    border: none;
    border-bottom: 2px solid rgb(173, 173, 173);
    border-radius: 30px;
    margin: 10px 0;
    color: black;
    font-size: .8em;
    font-weight: 500;
    box-sizing: border-box;
    padding-left: 30px;
}
.inputField:focus {
    outline: none;
    border-bottom: 2px solid rgb(199, 114, 255);
}
.inputField::placeholder {
    color: rgb(80, 80, 80);
    font-size: 1em;
    font-weight: 500;
}
.login-box {
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}
.login-button {
    position: relative;
    width: 100%;
    border: 2px solid #8000ff;
    background-color: #8000ff;
    height: 40px;
    color: white;
    font-size: .8em;
    font-weight: 500;
    letter-spacing: 1px;
    border-radius: 30px;
    margin: 10px;
    cursor: pointer;
    overflow: hidden;
}
.login-button::after {
    content: "";
    position: absolute;
    background-color: rgba(255, 255, 255, 0.253);
    height: 100%;
    width: 150px;
    top: 0;
    left: -200px;
    border-bottom-right-radius: 100px;
    border-top-left-radius: 100px;
    filter: blur(10px);
    transition-duration: .5s;
}
.login-button:hover::after {
    transform: translateX(600px);
    transition-duration: .5s;
}
.right-box {
    height: 100%;
    width: 30%;
    background: #f6f6f6;
    position: relative;
}
.login-copyright {
    position: absolute;
    bottom: 20px;
    right: 20px;
    font-size: 14px;
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}
.copyright-text {
    margin-right: 20px;
}
.copyright-img {
    width: 40px;
    height: 40px;
    position: relative;
}
.copyright-img>img {
    width: 100%;
    height: 100%;
}
.copyright-img-large {
    width: 140px;
    height: 140px;
    position: absolute;
    top: -140px;
    left: -50px;
}
.copyright-img-large>img {
    width: 100%;
    height: 100%;
}
<script setup>
import { getCurrentInstance, inject, ref } from 'vue';
import { message } from 'ant-design-vue';
import { get, post } from '../../utils/request.js'
import { formatMessage } from '@/utils/localeUtils.js';
const context = getCurrentInstance()?.appContext.config.globalProperties;
const globalState = inject('globalState');
let copyrightLargeShow = ref(false);
let username = ref("");
let password = ref("");
let hostId = ref(null);
let hostList = ref([]);
function loginConfirm() {
    if (username.value == "" || password.value == "") {
        message.info(formatMessage('login.input', '请输入账号密码!'));
        return;
    }
    post('/api/login', {
        username: username.value,
        password: password.value,
        hostId: hostId.value,
    }).then((result) => {
        if (result.data.code == 200) {
            let data = result.data.data;
            globalState.token = data.accessToken;
            globalState.user = data.user;
            localStorage.setItem('token', data.accessToken)
            localStorage.setItem('user', JSON.stringify(data.user))
            message.success(formatMessage('login.success', '登录成功'))
            window.location.reload();
        } else {
            message.error(result.data.msg)
        }
    })
}
getHostList()
function getHostList() {
    get('/api/auth/host', {}).then((result) => {
        if (result.data.code == 200) {
            let data = result.data.data;
            let tmp = []
            data.forEach((item) => {
                tmp.push({
                    label: item.name,
                    value: item.id
                })
            })
            hostList.value = tmp;
            if(tmp.length > 0) {
                let tmpHost = tmp[0]
                hostId.value = tmpHost.value;
            }
        } else {
            message.error(result.data.msg)
        }
    })
}
</script>
<script>
export default {
    name: 'login'
}
</script>
<template>
    <div class="container" @keyup.enter="loginConfirm">
        <div class="left-box">
            <div class="login-video">
                <video src="/public/img/login-bg.mp4" height="100%" loop autoplay muted="false"
                    controlslist="nodownload" disablepictureinpicture></video>
                <!-- <img src="/public/img/bg1.png" height="100%"> -->
            </div>
        </div>
        <div class="right-box">
            <div class="login-box">
                <div class="form-main">
                    <p style="text-align: center;"><img class="loginLogoUrl" src="/public/img/logo.png" alt=""
                            style="width: 80%">
                    </p>
                    <p style="margin-top: -10px;"><span class="login100-form-title p-t-20 p-b-45"
                            style="color: #868686;font-size: 24px">WMS</span></p>
                    <div class="inputContainer">
                        <a-select v-model:value="hostId" style="width: 100%;" :options="hostList"></a-select>
                    </div>
                    <div class="inputContainer">
                        <svg viewBox="0 0 16 16" fill="#2e2e2e" height="16" width="16"
                            xmlns="http://www.w3.org/2000/svg" class="inputIcon">
                            <path
                                d="M13.106 7.222c0-2.967-2.249-5.032-5.482-5.032-3.35 0-5.646 2.318-5.646 5.702 0 3.493 2.235 5.708 5.762 5.708.862 0 1.689-.123 2.304-.335v-.862c-.43.199-1.354.328-2.29.328-2.926 0-4.813-1.88-4.813-4.798 0-2.844 1.921-4.881 4.594-4.881 2.735 0 4.608 1.688 4.608 4.156 0 1.682-.554 2.769-1.416 2.769-.492 0-.772-.28-.772-.76V5.206H8.923v.834h-.11c-.266-.595-.881-.964-1.6-.964-1.4 0-2.378 1.162-2.378 2.823 0 1.737.957 2.906 2.379 2.906.8 0 1.415-.39 1.709-1.087h.11c.081.67.703 1.148 1.503 1.148 1.572 0 2.57-1.415 2.57-3.643zm-7.177.704c0-1.197.54-1.907 1.456-1.907.93 0 1.524.738 1.524 1.907S8.308 9.84 7.371 9.84c-.895 0-1.442-.725-1.442-1.914z">
                            </path>
                        </svg>
                        <input :placeholder="formatMessage('login.rule.username', '请输入用户名')" v-model="username" class="inputField" type="text">
                    </div>
                    <div class="inputContainer">
                        <svg viewBox="0 0 16 16" fill="#2e2e2e" height="16" width="16"
                            xmlns="http://www.w3.org/2000/svg" class="inputIcon">
                            <path
                                d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2z">
                            </path>
                        </svg>
                        <input :placeholder="formatMessage('login.rule.password', '请输入密码')" v-model="password" class="inputField" type="password">
                    </div>
                    <input @click="loginConfirm" type="button" class="login-button" :value="formatMessage('common.submit', '登录')">
                    <div style="display: none;margin-top: 5px;width: 100%;" id="updateLicense">
                        <form enctype="multipart/form-data" style="display: none;">
                            <input id="license" type="file" name="file">
                        </form>
                        <input type="button" id="submitLicense" class="login-button" style="margin: 0;" value="更新许可证">
                    </div>
                </div>
            </div>
            <div class="login-copyright">
                <div class="copyright-text">Copyright ©2023 浙江中扬立库技术有限公司版权所有</div>
                <div id="copyright-img1" class="copyright-img" @mouseover="copyrightLargeShow = true"
                    @mouseout="copyrightLargeShow = false">
                    <img class="copyright-img-url" src="/public/img/weixin_qrcode.jpg" />
                    <div v-if="copyrightLargeShow" class="copyright-img-large"><img class="copyright-img-url"
                            src="/public/img/weixin_qrcode.jpg" /></div>
                </div>
            </div>
        </div>
    </div>
</template>
<style>
* {
    padding: 0;
    margin: 0;
}
.container {
    display: flex;
    height: 100vh;
    width: 100%;
}
.left-box {
    height: 100%;
    width: 70%;
}
.login-video {
    height: 100%;
    overflow: hidden;
}
.form-main {
    width: 300px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background-color: rgba(255, 255, 255, 0.6);
    padding: 50px 30px 50px 30px;
    border-radius: 20px;
    box-shadow: 0px 0px 40px rgba(0, 0, 0, 0.062);
}
.heading {
    font-size: 2.5em;
    color: #2e2e2e;
    font-weight: 700;
    margin: 15px 0 0px 0;
}
.inputContainer {
    width: 100%;
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
}
.inputIcon {
    position: absolute;
    left: 10px;
}
.inputField {
    width: 100%;
    height: 40px;
    background-color: transparent;
    border: none;
    border-bottom: 2px solid rgb(173, 173, 173);
    border-radius: 30px;
    margin: 10px 0;
    color: black;
    font-size: .8em;
    font-weight: 500;
    box-sizing: border-box;
    padding-left: 30px;
}
.inputField:focus {
    outline: none;
    border-bottom: 2px solid rgb(199, 114, 255);
}
.inputField::placeholder {
    color: rgb(80, 80, 80);
    font-size: 1em;
    font-weight: 500;
}
.login-box {
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}
.login-button {
    position: relative;
    width: 100%;
    border: 2px solid #8000ff;
    background-color: #8000ff;
    height: 40px;
    color: white;
    font-size: .8em;
    font-weight: 500;
    letter-spacing: 1px;
    border-radius: 30px;
    margin: 10px;
    cursor: pointer;
    overflow: hidden;
}
.login-button::after {
    content: "";
    position: absolute;
    background-color: rgba(255, 255, 255, 0.253);
    height: 100%;
    width: 150px;
    top: 0;
    left: -200px;
    border-bottom-right-radius: 100px;
    border-top-left-radius: 100px;
    filter: blur(10px);
    transition-duration: .5s;
}
.login-button:hover::after {
    transform: translateX(600px);
    transition-duration: .5s;
}
.right-box {
    height: 100%;
    width: 30%;
    background: #f6f6f6;
    position: relative;
}
.login-copyright {
    position: absolute;
    bottom: 20px;
    right: 20px;
    font-size: 14px;
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}
.copyright-text {
    margin-right: 20px;
}
.copyright-img {
    width: 40px;
    height: 40px;
    position: relative;
}
.copyright-img>img {
    width: 100%;
    height: 100%;
}
.copyright-img-large {
    width: 140px;
    height: 140px;
    position: absolute;
    top: -140px;
    left: -50px;
}
.copyright-img-large>img {
    width: 100%;
    height: 100%;
}
</style>