| | |
| | | <script setup> |
| | | import { getCurrentInstance, inject, ref } from 'vue'; |
| | | import { message } from 'ant-design-vue'; |
| | | import { get, post } from '../../utils/request.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('请输入账号密码!'); |
| | | 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('登录成功') |
| | | 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; |
| | | } 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="请输入用户名" 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="请输入密码" v-model="password" class="inputField" type="password"> |
| | | </div> |
| | | |
| | | <input @click="loginConfirm" type="button" class="login-button" value="登录"> |
| | | |
| | | <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> |