Merge branch 'main' of http://47.107.152.87:3000/dyf/APP into new-20250827

# Conflicts:
#	pages/common/login/index.vue
This commit is contained in:
liub
2025-10-09 14:39:35 +08:00
4 changed files with 97 additions and 88 deletions

View File

@ -26,6 +26,7 @@
// uni.removeStorageSync(val); // uni.removeStorageSync(val);
// } // }
// }); // });
// uni.clearStorageSync();
//以上代码仅在开发时使用,否则会出现不可预知的问题。 //以上代码仅在开发时使用,否则会出现不可预知的问题。
uni.getSystemInfo({success:function(res){ uni.getSystemInfo({success:function(res){

View File

@ -5,14 +5,14 @@ const config = {
BASE_URL: 'http://192.168.110.56:8000', BASE_URL: 'http://192.168.110.56:8000',
API_PREFIX: '', API_PREFIX: '',
// MQTT 配置 // MQTT 配置
MQTT_HOST: '47.120.79.150', MQTT_HOST: 'www.cnxhyc.com',
MQTT_PORT: 8083, MQTT_PORT: 8083,
MQTT_USERNAME: 'admin', MQTT_USERNAME: 'admin',
MQTT_PASSWORD: '#YtvpSfCNG' MQTT_PASSWORD: '#YtvpSfCNG'
}, },
// 生产环境 // 生产环境
production: { production: {
BASE_URL: 'https://www.cnxhyc.com/jingquan', BASE_URL: 'https://www.cnxhyc.com/jq',
API_PREFIX: '', API_PREFIX: '',
// MQTT 配置 // MQTT 配置
MQTT_HOST: 'www.cnxhyc.com', MQTT_HOST: 'www.cnxhyc.com',

View File

@ -48,7 +48,9 @@
</view> </view>
<view class="info-row"> <view class="info-row">
<text class="info-label">设备状态</text> <text class="info-label">设备状态</text>
<text class="info-value status-running">{{ deviceInfo.onlineStatus === 0 ? '离线' : '在线' }}</text> <text class="info-value status-running">
{{ deviceInfo.onlineStatus === 0 ? '离线' : deviceInfo.onlineStatus === 2 ? '故障' : '在线' }}
</text>
</view> </view>
<view class="info-row"> <view class="info-row">
<text class="info-label" style="display: flex; align-items: center;">定位信息</text> <text class="info-label" style="display: flex; align-items: center;">定位信息</text>

View File

@ -23,55 +23,59 @@
<view class="Sendmessage" @click="location">位置</view> <view class="Sendmessage" @click="location">位置</view>
<view class="Sendmessage" @click="handleSend">发送信息</view> <view class="Sendmessage" @click="handleSend">发送信息</view>
</view> </view>
<mescroll-uni v-if="deviceList.length > 0" class="device-list" @init="mescrollInit" @down="downCallback" @up="upCallback" :up="upOption" <mescroll-uni v-if="deviceList.length > 0" class="device-list" @init="mescrollInit" @down="downCallback"
:down="downOption" :fixed="false"> @up="upCallback" :up="upOption" :down="downOption" :fixed="false"
<uni-swipe-action ref="swipeAction"> :style="{ height: mescrollHeight + 'px' }">
<block v-for="(item, index) in deviceList" :key="index" :ref="'swipeItem_' + index"> <uni-swipe-action ref="swipeAction">
<uni-swipe-action-item :right-options="Options" <block v-for="(item, index) in deviceList" :key="index" :ref="'swipeItem_' + index">
@click="handleSwipeClick($event, item, index)" class="device-card" <uni-swipe-action-item :right-options="Options" @click="handleSwipeClick($event, item, index)"
:style="{ border: item.communicationMode == 0 && item.onlineStatus == 1 && item.alarmStatus == 1 ? '1px solid rgba(224, 52, 52, 1)' : 'none' }"> class="device-card"
<view @click.stop="handleFile(item)"> :style="{ border: item.communicationMode == 0 && item.onlineStatus == 1 && item.alarmStatus == 1 ? '1px solid rgba(224, 52, 52, 1)' : 'none' }">
<view class="device-header"> <view @click.stop="handleFile(item)">
<view class="deviceIMG"> <view class="device-header">
<image :src="item.devicePic" class="IMG" mode="aspectFit"></image> <view class="deviceIMG">
</view> <image :src="item.devicePic" class="IMG" mode="aspectFit"></image>
<view class="device-name">
<view>设备:{{ item.deviceName }}</view>
<view class="ID">
<view class="ID" v-if="item.communicationMode == 0">ID:{{
item.deviceImei }}
</view>
<view class="ID" v-else>ID:{{ item.deviceMac }}</view>
<!-- 在线状态 -->
<view class="onlines"
v-if="item.communicationMode == 0 && item.onlineStatus == 1">在线
</view>
<!-- 离线状态 -->
<view class="offlines"
v-if="item.communicationMode == 0 && item.onlineStatus == 0">离线
</view>
<view>电量{{ item.battery || '0' }}%</view>
</view>
</view>
</view> </view>
<view class="device-callpolice" <view class="device-name">
v-if="item.communicationMode == 0 && item.onlineStatus == 1 && item.alarmStatus == 1"> <view>设备:{{ item.deviceName }}</view>
报警中</view> <view class="ID">
<view v-if="item.communicationMode == 1"> <view class="ID" v-if="item.communicationMode == 0">ID:{{
<view class="device-status online">已连接</view> item.deviceImei }}
<view class="device-status unline">未连接</view> </view>
<view class="ID" v-else>ID:{{ item.deviceMac }}</view>
<!-- 在线状态 -->
<view class="onlines"
v-if="item.communicationMode == 0 && item.onlineStatus == 1">在线
</view>
<!-- 离线状态 -->
<view class="offlines"
v-if="item.communicationMode == 0 && item.onlineStatus == 0">离线
</view>
<view class="offlines"
v-if="item.communicationMode == 0 && item.onlineStatus == 2">故障
</view>
<view>电量{{ item.battery || '0' }}%</view>
</view>
</view> </view>
</view> </view>
<image src="/static/images/common/cires.png" class="circle" mode="aspectFit"></image> <view class="device-callpolice"
</uni-swipe-action-item> v-if="item.communicationMode == 0 && item.onlineStatus == 1 && item.alarmStatus == 1">
</block> 报警中</view>
</uni-swipe-action> <view v-if="item.communicationMode == 1">
<!-- 加载状态提示 --> <view class="device-status online">已连接</view>
<view class="loading-status"> <view class="device-status unline">未连接</view>
<text v-if="loading">加载中...</text> </view>
<text v-if="finished">没有更多数据了</text> </view>
</view> <image src="/static/images/common/cires.png" class="circle" mode="aspectFit"></image>
</uni-swipe-action-item>
</block>
</uni-swipe-action>
<!-- 加载状态提示 -->
<view class="loading-status">
<text v-if="loading">加载中...</text>
<text v-if="finished">没有更多数据了</text>
</view>
</mescroll-uni> </mescroll-uni>
<view v-else class="noDATA"> <view v-else class="noDATA">
<view> <uni-icons type="image-filled" size="120" color="rgba(255, 255, 255, 0.9)"></uni-icons> <view> <uni-icons type="image-filled" size="120" color="rgba(255, 255, 255, 0.9)"></uni-icons>
@ -207,23 +211,25 @@
auto: false auto: false
}, },
upOption: { upOption: {
auto: false, auto: false,
noMoreSize: 1, noMoreSize: 0,
offset: 80, offset: 50,
empty: { isLock: false,
tip: '暂无相关数据' empty: {
} tip: '暂无数据',
hideScroll: false
}
}, },
page: 1, // 当前页码 page: 1, // 当前页码
size: 10, // 每页条数 size: 12, // 每页条数
total: 0, // 总数据量 total: 0, // 总数据量
loadedCount: 0, loadedCount: 0,
loading: false, loading: false,
finished: false, finished: false,
deviceId: '', deviceId: '',
deviceName: "", //重命名 deviceName: "", //重命名
activeTabInfo: '' activeTabInfo: '',
mescrollHeight: 0,
} }
}, },
methods: { methods: {
@ -234,39 +240,34 @@
downCallback() { downCallback() {
const currentDeviceType = this.activeTabInfo?.id === '' ? undefined : this.activeTabInfo?.id; const currentDeviceType = this.activeTabInfo?.id === '' ? undefined : this.activeTabInfo?.id;
const tempList = [...this.deviceList]; const tempList = [...this.deviceList];
// 重置分页参数 // 重置分页参数
this.page = 1; this.page = 1;
this.finished = false; this.finished = false;
this.loadedCount = 0; this.loadedCount = 0;
this.total = 0; // 重置总数
this.getData(currentDeviceType) this.getData(currentDeviceType)
.then(() => { .then(() => {
this.mescroll.endDownScroll(true); this.mescroll.endDownScroll(true);
}) })
.catch(() => { .catch(() => {
this.deviceList = tempList; this.deviceList = tempList;
this.mescroll.endDownScroll(false); this.mescroll.endDownScroll(false);
}); });
}, },
// 上拉加载 // 上拉加载
upCallback() { upCallback() {
// 防止重复加载 if (this.loading) {
if (this.finished || this.loading) {
this.mescroll.endUpScroll(false); this.mescroll.endUpScroll(false);
return; return;
} }
const currentDeviceType = this.activeTabInfo?.id === '' ? undefined : this.activeTabInfo?.id; const currentDeviceType = this.activeTabInfo?.id === '' ? undefined : this.activeTabInfo?.id;
this.getData(currentDeviceType) this.getData(currentDeviceType)
.then(() => { .then(() => {
const hasMore = this.loadedCount < this.total; // 如果本次加载的数据量为0则说明没有更多数据
console.log(`上拉加载 - 已加载: ${this.loadedCount}, 总数: ${this.total}, 是否还有更多: ${hasMore}`); const hasMore = this.deviceList.length > 0 && this.deviceList.length % this.size === 0;
this.mescroll.endUpScroll(hasMore); this.mescroll.endUpScroll(hasMore);
}) })
.catch(() => { .catch(() => {
// 失败时回退页码
this.page--; this.page--;
this.mescroll.endUpScroll(false); this.mescroll.endUpScroll(false);
}); });
@ -329,54 +330,48 @@
this.page = 1; this.page = 1;
this.finished = false; this.finished = false;
this.loadedCount = 0; this.loadedCount = 0;
this.total = 0; // 重置总数
const deviceType = tab.id === '' ? undefined : tab.id; const deviceType = tab.id === '' ? undefined : tab.id;
this.$nextTick(() => {
this.getSystemInfoSyncH();
});
this.getData(deviceType); this.getData(deviceType);
if (this.mescroll) { if (this.mescroll) {
this.mescroll.resetUpScroll(); this.mescroll.resetUpScroll();
} }
}, },
// 获取设备列表 - 核心修复 // 获取设备列表
getData(deviceType = '') { getData(deviceType = '') {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (this.loading || this.finished) { if (this.loading || this.finished) {
reject('正在加载或已无更多数据'); reject('正在加载或已无更多数据');
return; return;
} }
this.loading = true; this.loading = true;
let data = { let data = {
pageNum: this.page, pageNum: this.page,
pageSize: this.size, pageSize: this.size,
deviceType: deviceType deviceType: deviceType
} }
deviceInfo(data).then((res) => { deviceInfo(data).then((res) => {
if (res.code == 200) { if (res.code == 200) {
// 第一页加载时初始化总数据量
if (this.page === 1) {
this.total = res.total;
this.loadedCount = 0; // 重置计数
console.log(`第1页加载 - 总数据量: ${this.total}`);
}
const newDevices = res.rows.map(device => ({ const newDevices = res.rows.map(device => ({
...device, ...device,
showConfirm: false showConfirm: false
})); }));
this.loadedCount += newDevices.length;
console.log(`${this.page}页加载 - 新增: ${newDevices.length}, 累计: ${this.loadedCount}`);
// 数据累加
if (this.page === 1) { if (this.page === 1) {
this.total = Number(res.total) || 0;
this.deviceList = newDevices; this.deviceList = newDevices;
this.loadedCount = newDevices.length;
} else { } else {
this.deviceList = [...this.deviceList, ...newDevices]; this.deviceList = [...this.deviceList, ...newDevices];
this.loadedCount += newDevices.length;
} }
// 关键:正确判断是否加载完成 const hasMoreData = this.loadedCount < this.total;
if (this.loadedCount >= this.total || newDevices.length < this.size) { if (!hasMoreData) {
this.finished = true; this.finished = true;
console.log(`加载完成 - 已加载${this.loadedCount}/${this.total}`); }
} else { if (hasMoreData) {
this.page++; this.page++;
} }
resolve(); resolve();
@ -384,7 +379,6 @@
reject(res.msg || '获取数据失败'); reject(res.msg || '获取数据失败');
} }
}).catch((err) => { }).catch((err) => {
console.error('获取设备列表失败:', err);
reject(err); reject(err);
}).finally(() => { }).finally(() => {
this.loading = false; this.loading = false;
@ -564,7 +558,8 @@
onIntall() { onIntall() {
this.page = 1; this.page = 1;
this.finished = false; this.finished = false;
this.loadedCount = 0; // 重置计数 this.loadedCount = 0;
this.total = 0;
const deviceType = this.activeTabInfo?.id === '' ? undefined : this.activeTabInfo?.id; const deviceType = this.activeTabInfo?.id === '' ? undefined : this.activeTabInfo?.id;
this.getData(deviceType); this.getData(deviceType);
setTimeout(() => { setTimeout(() => {
@ -594,8 +589,19 @@
}) })
.filter(Boolean); .filter(Boolean);
}, },
// 动态计算屏幕高度
getSystemInfoSyncH() {
const sysInfo = uni.getSystemInfoSync();
const tabBarHeight = 80;
const sendBarHeight = 60;
const padding = 60;
const totalTopHeight = (this.navBarHeight) + (tabBarHeight + sendBarHeight + padding) * (sysInfo
.screenWidth / 750);
this.mescrollHeight = sysInfo.screenHeight - totalTopHeight;
}
}, },
onLoad() { onLoad() {
this.getSystemInfoSyncH()
this.getTab() this.getTab()
this.onIntall() this.onIntall()
uni.$on('refreshDeviceList', () => { uni.$on('refreshDeviceList', () => {
@ -974,4 +980,4 @@
width: 16px; width: 16px;
height: 16px; height: 16px;
} }
</style> </style>