You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
3.8 KiB
179 lines
3.8 KiB
<template>
|
|
<div class="login_modal">
|
|
<img :src="showPassword ? Open : Eye" class="eye" @click="handleEye" />
|
|
<p class="tips">{{ tip }}</p>
|
|
<input
|
|
type="text"
|
|
v-model="username"
|
|
class="username"
|
|
@focus="handleFocus(1)"
|
|
placeholder="请输入用户名"
|
|
/>
|
|
<input
|
|
:type="showPassword ? 'text' : 'password'"
|
|
class="password"
|
|
v-model="password"
|
|
@focus="handleFocus(2)"
|
|
id="txtPassword"
|
|
placeholder="请输入设备密码"
|
|
/>
|
|
<div class="login_btn style-btn" @click="handleLogin"></div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import Eye from '@/assets/img/login/eye.png'
|
|
import Open from '@/assets/img/login/open.png'
|
|
import { useWebSocketStore, useUserStore } from '@/store'
|
|
import { ref, watch } from 'vue'
|
|
import { useRouter } from 'vue-router'
|
|
import { loginJSON, getAllUserJSON } from '@/mock/command'
|
|
|
|
const props = defineProps({
|
|
handleShowKey: {
|
|
type: Function,
|
|
},
|
|
handleHideKey: {
|
|
type: Function,
|
|
},
|
|
clearInput: {
|
|
type: Function,
|
|
},
|
|
input: {
|
|
type: String,
|
|
},
|
|
hideLoginModal: {
|
|
type: Function,
|
|
default: () => {},
|
|
},
|
|
modal: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
changeTab: {
|
|
type: Function,
|
|
default: () => {},
|
|
},
|
|
})
|
|
|
|
const activeInput = ref(1)
|
|
const handleFocus = flag => {
|
|
props.handleShowKey()
|
|
props.clearInput()
|
|
activeInput.value = flag
|
|
}
|
|
|
|
const router = useRouter()
|
|
const userStore = useUserStore()
|
|
const webSocketStore = useWebSocketStore()
|
|
const showPassword = ref(false)
|
|
const username = ref('')
|
|
const password = ref('')
|
|
const tip = ref('')
|
|
|
|
const handleEye = () => {
|
|
showPassword.value = !showPassword.value
|
|
}
|
|
watch(() => {
|
|
// 需要有个逻辑判断
|
|
if (activeInput.value == 1) {
|
|
username.value = props.input
|
|
} else {
|
|
password.value = props.input
|
|
}
|
|
})
|
|
|
|
const handleLogin = () => {
|
|
props.handleHideKey()
|
|
if (username.value == '') {
|
|
tip.value = '用户名不能为空'
|
|
return
|
|
}
|
|
if (password.value == '') {
|
|
tip.value = '密码不能为空'
|
|
return
|
|
}
|
|
tip.value = ''
|
|
webSocketStore?.sendCommandMsg(loginJSON(username.value, password.value))
|
|
// 前端自己校验
|
|
setTimeout(() => {
|
|
userStore.allUserList?.map(item => {
|
|
if (item.uid == username.value && password.value == item.passwd) {
|
|
// 登陆成功
|
|
userStore.updatePermission(item.permission_level)
|
|
userStore.updateLoginUser(item.uid)
|
|
if (props.modal) {
|
|
props.changeTab(5)
|
|
props.hideLoginModal()
|
|
// 判断是否在消毒中,如果在消毒中,将TAB切换到设置
|
|
} else {
|
|
window.location.href = 'http://127.0.0.1/'
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.login_modal {
|
|
width: 476px;
|
|
height: 414px;
|
|
border-radius: 16px;
|
|
overflow: hidden;
|
|
background: url(../assets/img/login/login.png) no-repeat;
|
|
background-size: 100% 100%;
|
|
box-sizing: border-box;
|
|
position: relative;
|
|
.eye {
|
|
width: 16px;
|
|
height: 13px;
|
|
position: absolute;
|
|
right: 78.04px;
|
|
top: 211px;
|
|
}
|
|
.tips {
|
|
font-family: Source Han Sans CN;
|
|
font-size: 12px;
|
|
font-weight: 350;
|
|
letter-spacing: 0.06em;
|
|
color: #fa1c1c;
|
|
position: absolute;
|
|
left: 73px;
|
|
bottom: 143px;
|
|
}
|
|
.username {
|
|
border: none;
|
|
outline: none;
|
|
width: 253px;
|
|
height: 20px;
|
|
position: absolute;
|
|
left: 120px;
|
|
top: 142px;
|
|
font-family: Source Han Sans CN;
|
|
font-size: 22px;
|
|
font-weight: 350;
|
|
letter-spacing: 0.06em;
|
|
}
|
|
.password {
|
|
border: none;
|
|
outline: none;
|
|
width: 253px;
|
|
height: 17px;
|
|
position: absolute;
|
|
left: 120px;
|
|
top: 209px;
|
|
font-family: Source Han Sans CN;
|
|
font-size: 18px;
|
|
font-weight: 350;
|
|
letter-spacing: 0.06em;
|
|
}
|
|
.login_btn {
|
|
position: absolute;
|
|
width: 340px;
|
|
height: 68px;
|
|
left: 68px;
|
|
bottom: 62px;
|
|
}
|
|
}
|
|
</style>
|