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