|
@@ -0,0 +1,197 @@
|
|
|
+<template>
|
|
|
+ <view class="device-list">
|
|
|
+ <up-search v-model="searchValue"></up-search>
|
|
|
+ <view class="stat-ctl">
|
|
|
+ <view class="u-page__tag-item" v-for="(item, index) in DeviceCameraState" :key="index">
|
|
|
+ <up-tag
|
|
|
+ :text="item.label"
|
|
|
+ :plain="selectTag === item.value"
|
|
|
+ :plainFill="true"
|
|
|
+ bgColor="#007aff"
|
|
|
+ :name="item.value"
|
|
|
+ @click="()=>radioClick(item)"
|
|
|
+ >
|
|
|
+ </up-tag>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="u-page-list" style="padding-bottom: 100rpx">
|
|
|
+ <up-list @scrolltolower="scrolltolower">
|
|
|
+ <up-list-item
|
|
|
+ v-for="(item, index) in indexList"
|
|
|
+ :key="item.id"
|
|
|
+ >
|
|
|
+ <view class="item-content">
|
|
|
+ <view class="content-info">
|
|
|
+ <view>
|
|
|
+ <up-text :lines="1" :text="`设备名称: ${formatTxt(item.name)}`" size="24rpx"/>
|
|
|
+ <up-tag
|
|
|
+ :text="valueToConst(DeviceCameraState,item.onLine).label"
|
|
|
+ plain
|
|
|
+ size="mini"
|
|
|
+ :bgColor="valueToConst(DeviceCameraState,item.onLine).color"
|
|
|
+ class="tag-stat"
|
|
|
+ ></up-tag>
|
|
|
+ <up-text text="详情>" color="#007aff" style="flex:none;width: auto"
|
|
|
+ @click="()=>onDetailClick(item)"></up-text>
|
|
|
+ </view>
|
|
|
+ <view>
|
|
|
+ <up-text :lines="1" :text="`设备编号:${formatTxt(item.deviceId)}`" size="24rpx"/>
|
|
|
+ </view>
|
|
|
+ <view>
|
|
|
+ <up-text :lines="1" :text="`地址:${formatTxt(item.hostAddress)}`" size="24rpx"/>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </up-list-item>
|
|
|
+ <up-loading-icon v-if="loading" text="加载中" textSize="12"></up-loading-icon>
|
|
|
+ <up-text
|
|
|
+ v-if="!loadmoreFlag" text="已经到底了" style="justify-content: center;"
|
|
|
+ size="24rpx"
|
|
|
+ color="gray"
|
|
|
+ >
|
|
|
+ </up-text>
|
|
|
+ </up-list>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="ts">
|
|
|
+import {ref} from "vue"
|
|
|
+import {DeviceCameraState} from '@/common/consts/DeviceConst.js'
|
|
|
+import {valueToConst} from '@/common/consts/CommonConst.js'
|
|
|
+import {onLoad, onPullDownRefresh, onShow} from '@dcloudio/uni-app';
|
|
|
+import {formatTxt, navigateTo,} from '@/util/index.js'
|
|
|
+import {getCameraList} from "@/api/device.js";
|
|
|
+
|
|
|
+let searchValue = ref("")
|
|
|
+let indexList = ref([])
|
|
|
+let selectTag = ref(DeviceCameraState.ALL.value)
|
|
|
+let loadmoreFlag = ref(true)
|
|
|
+let loading = ref(false)
|
|
|
+const page = ref(1)
|
|
|
+
|
|
|
+onLoad(() => {
|
|
|
+ page.value = 1
|
|
|
+ loading.value = true;
|
|
|
+ loadmore();
|
|
|
+});
|
|
|
+onPullDownRefresh(() => {
|
|
|
+ refreshPage(() => {
|
|
|
+ uni.stopPullDownRefresh();
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
+onShow(() => {
|
|
|
+ uni.$on('refreshData', (res) => {
|
|
|
+ if (res.refresh) {
|
|
|
+ refreshPage()
|
|
|
+ }
|
|
|
+ })
|
|
|
+});
|
|
|
+
|
|
|
+const refreshPage = (callback = () => {
|
|
|
+}) => {
|
|
|
+ page.value = 1
|
|
|
+ indexList.value = []
|
|
|
+ loading.value = true;
|
|
|
+ loadmore(callback);
|
|
|
+}
|
|
|
+
|
|
|
+function radioClick(item) {
|
|
|
+ selectTag.value = item.value
|
|
|
+ page.value = 1
|
|
|
+ indexList.value = []
|
|
|
+ loading.value = true;
|
|
|
+ loadmore();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const loadmore = async (callback = null) => {
|
|
|
+ const {
|
|
|
+ list: records
|
|
|
+ } = await getCameraList({
|
|
|
+ page: page.value,
|
|
|
+ status: selectTag.value,
|
|
|
+ })
|
|
|
+ if (records && records.length > 0) {
|
|
|
+ indexList.value = indexList.value.concat(records)
|
|
|
+ page.value += 1
|
|
|
+ if (records.length < 10) {
|
|
|
+ loadmoreFlag.value = false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ loadmoreFlag.value = false;
|
|
|
+ }
|
|
|
+ loading.value = false;
|
|
|
+ callback && callback();
|
|
|
+};
|
|
|
+
|
|
|
+const scrolltolower = () => {
|
|
|
+ if (!loadmoreFlag.value) return;
|
|
|
+ loading.value = true;
|
|
|
+ loadmore();
|
|
|
+};
|
|
|
+const onDetailClick = (item) => {
|
|
|
+ navigateTo({
|
|
|
+ url: "/pages/workbenchsub/device/camera-detail",
|
|
|
+ param: item
|
|
|
+ })
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+.device-list {
|
|
|
+ width: 680rpx;
|
|
|
+ margin: 14rpx auto 0;
|
|
|
+
|
|
|
+ .u-search__content {
|
|
|
+ background: $uni-bg-color !important;
|
|
|
+
|
|
|
+ .u-search__content__input {
|
|
|
+ background-color: $uni-bg-color !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .u-page-list {
|
|
|
+ margin-top: 14rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .item-content {
|
|
|
+ width: 100%;
|
|
|
+ border-radius: $comm-border-radius;
|
|
|
+ display: flex;
|
|
|
+ box-sizing: border-box;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-start;
|
|
|
+ background: $uni-bg-color;
|
|
|
+ margin-bottom: 14rpx;
|
|
|
+
|
|
|
+ padding: 14rpx;
|
|
|
+
|
|
|
+ .content-info {
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: flex-start;
|
|
|
+ justify-content: flex-start;
|
|
|
+ margin-left: 14rpx;
|
|
|
+
|
|
|
+ > view {
|
|
|
+ font-size: inherit;
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-start;
|
|
|
+
|
|
|
+ .u-link {
|
|
|
+ flex: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:not(:first-child) {
|
|
|
+ margin-top: 14rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|