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.
166 lines
5.1 KiB
166 lines
5.1 KiB
<template>
|
|
<view class="min-height bg-gray-light">
|
|
<template v-if="!loading">
|
|
<template v-if="isLogin">
|
|
<view v-if="channelList.length" class="p-20 bg-white flex justify-between items-center text-30"
|
|
@click="showRoom = true">
|
|
<template v-if="currentRoom">
|
|
<text>{{ villageName }}</text>
|
|
</template>
|
|
</view>
|
|
<view class="p-20" v-if="isLogin">
|
|
<view class="bg-white rounded flex justify-start items-start flex-wrap" v-if="channelList.length">
|
|
<view v-for="(item, index) in channelList" :key="index"
|
|
@click="openDoor(item.deviceNo)"
|
|
class="flex flex-col justify-start items-start channel" style="width: 43%">
|
|
<image src="/userPages/static/无线电波.png" mode="widthFix"/>
|
|
<text class="text-25 text-white m-15 font-bold">{{
|
|
item.name
|
|
}}({{ parseInt(item.passagewayTypeInout) === 1 ? '进' : '出' }})
|
|
</text>
|
|
<view class="w-100p flex justify-end items-center">
|
|
<view class="tag">一键开门</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="flex flex-col justify-center items-center p-30" style="height: 80vh" v-else>
|
|
<image src="https://img.ggsxiangan.com/认证.png" class="mb-40"
|
|
style="width: 180rpx; height: 180rpx"/>
|
|
<u-button type="primary" shape="circle">暂无可用门禁</u-button>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
<template v-else>
|
|
<view class="flex flex-col justify-center items-center p-30" style="height: 80vh">
|
|
<image src="https://img.ggsxiangan.com/手机.png" class="mb-40"
|
|
style="width: 180rpx; height: 180rpx"/>
|
|
<u-button type="primary" shape="circle" @click="login">登录并开门</u-button>
|
|
</view>
|
|
</template>
|
|
</template>
|
|
<Login ref="Login" @done="getUserData"/>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import {openDoorReq} from "@/api/common";
|
|
import {listChannelReq, userRoomListReq} from "@/api/room";
|
|
import {userInfoReq} from "@/api/user";
|
|
import {getUserInfo} from "@/util/user";
|
|
import Login from "@/components/Login.vue";
|
|
import {getInviteInfoReq} from "@/api/invite";
|
|
import dayjs from 'dayjs'
|
|
|
|
export default {
|
|
name: "remote-door",
|
|
components: {Login},
|
|
data() {
|
|
return {
|
|
roomList: [],
|
|
channelList: [],
|
|
currentRoom: null,
|
|
showRoom: false,
|
|
isLogin: false,
|
|
loading: false,
|
|
id: null,
|
|
baseVillageVillageCode: null,
|
|
villageName: '',
|
|
}
|
|
},
|
|
methods: {
|
|
async getChannelList() {
|
|
const {data} = await listChannelReq({
|
|
baseVillageVillageCode: this.baseVillageVillageCode
|
|
})
|
|
const dataList = data.filter(item => !!item.deviceNo)
|
|
const list = JSON.parse(JSON.stringify(dataList))
|
|
this.channelList = dataList.filter(item => parseInt(item.passagewayType) === 1)
|
|
this.channelList = [...this.channelList, ...list.filter(item => {
|
|
return parseInt(item.passagewayType) === 2 && item.baseUnitUnitCode === this.currentRoom.baseUnitUnitCode
|
|
})]
|
|
this.loading = false
|
|
uni.hideLoading()
|
|
// console.log(this.channelList)
|
|
},
|
|
async openDoor(deviceNo) {
|
|
const [serial, _, __] = deviceNo.split('_')
|
|
uni.showLoading({
|
|
title: '正在开锁...',
|
|
mask: true
|
|
})
|
|
const res = await openDoorReq(serial).finally(() => {
|
|
uni.hideLoading()
|
|
})
|
|
if (res && res.data) {
|
|
this.$toast('开锁成功')
|
|
}
|
|
},
|
|
async getInfo() {
|
|
uni.showLoading()
|
|
this.loading = true
|
|
const {data} = await getInviteInfoReq(this.id)
|
|
this.roomList = [data.roomCode]
|
|
this.baseVillageVillageCode = data.baseVillageVillageCode
|
|
this.villageName = data.villageName
|
|
this.currentRoom = data.room
|
|
if (data.phone !== this.userData.phone) {
|
|
this.$toast('手机号码不匹配')
|
|
setTimeout(() => {
|
|
uni.switchTab({url: '/pages/index/index'})
|
|
}, 1500)
|
|
}
|
|
if (dayjs().isAfter(dayjs(data.timeEnd))) {
|
|
this.$toast('邀请已过期')
|
|
setTimeout(() => {
|
|
uni.switchTab({url: '/pages/index/index'})
|
|
}, 1500)
|
|
}
|
|
if (this.roomList.length) {
|
|
await this.getChannelList()
|
|
}
|
|
},
|
|
async getUserData() {
|
|
const {data} = await userInfoReq()
|
|
this.userData = data
|
|
this.isLogin = true
|
|
await this.getInfo()
|
|
},
|
|
login() {
|
|
this.$refs.Login.open()
|
|
}
|
|
},
|
|
onLoad(e) {
|
|
this.id = e.scene
|
|
},
|
|
onShow() {
|
|
if (getUserInfo().token) this.getUserData()
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.channel {
|
|
background: linear-gradient(to right, #25a1f1, #3eabf1);
|
|
border-radius: 20rpx;
|
|
margin: 20rpx;
|
|
position: relative;
|
|
height: 140rpx;
|
|
|
|
image {
|
|
position: absolute;
|
|
left: 0;
|
|
bottom: 0;
|
|
height: 80rpx;
|
|
width: 80rpx;
|
|
filter: opacity(0.6);
|
|
}
|
|
|
|
.tag {
|
|
background: linear-gradient(to right, #fd7600, #fad3b2);
|
|
border-radius: 999rpx 0 0 999rpx;
|
|
color: white;
|
|
font-size: 24rpx;
|
|
padding: 10rpx 20rpx;
|
|
}
|
|
}
|
|
</style>
|