Compare commits

..

2 Commits

Author SHA1 Message Date
30079ec854 设备列表 2025-11-17 11:17:40 +08:00
aa7229e21b 6170控制面板代码优化 2025-10-13 17:01:11 +08:00
4 changed files with 10 additions and 187 deletions

View File

@ -6,8 +6,8 @@ VITE_APP_ENV = 'development'
# 开发环境
#VITE_APP_BASE_API = 'https://fuyuanshen.com/backend'
VITE_APP_BASE_API = 'https://www.cnxhyc.com/jq'
#VITE_APP_BASE_API = 'http://192.168.2.34:8000'
VITE_APP_BASE_API = 'https://www.cnxhyc.com/jq'
#VITE_APP_BASE_API = 'http://192.168.2.23:8000'
#代永飞接口
# VITE_APP_BASE_API = 'http://457102h2d6.qicp.vip:24689'

View File

@ -1,174 +0,0 @@
<style scoped>
.dashboard-container {
width: 100vw;
height: 100vh;
display: flex;
flex-direction: column;
position: relative;
overflow: hidden;
background: radial-gradient( 0% 0% at 0% 0%, #091B2D 0%, #0C2644 100%), #267AD0;
}
/* 全屏地图 - 背景图层 */
.fullscreen-map {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
pointer-events: none;
}
/* 顶部栏 */
.top-bar {
position: relative;
z-index: 10;
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 20px;
background-color: rgba(74, 85, 104, 0.9);
color: #fff;
font-size: 14px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.top-bar h1 {
font-size: 18px;
margin: 0;
font-weight: 600;
}
.header-info {
display: flex;
gap: 16px;
align-items: center;
}
.header-info span {
font-size: 12px;
}
/* 悬浮模块容器 */
.floating-modules {
display: flex;
flex-direction: column;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: calc(100% - 60px); /* 减去顶部栏高度 */
z-index: 5;
padding: 20px;
box-sizing: border-box;
pointer-events: none;
}
.left-modules,
.right-modules {
display: flex;
flex-direction: column;
gap: 16px;
width: 100%;
flex: 1;
pointer-events: auto;
}
.bottom-middle-module {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
max-width: 800px;
pointer-events: auto;
}
.module-card {
background-color: rgba(107, 114, 128, 0.9);
border-radius: 6px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
border: 1px solid rgba(255, 255, 255, 0.1);
width: 100%;
box-sizing: border-box;
overflow: hidden;
}
.module-card:hover {
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.3);
}
.module-header {
padding: 10px 14px;
font-size: 14px;
font-weight: 600;
color: #fff;
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
display: flex;
align-items: center;
background: linear-gradient(90deg, #3b82f6, #60a5fa);
}
.module-header::before {
content: '';
display: inline-block;
width: 8px;
height: 16px;
margin-right: 8px;
border-radius: 2px;
background-color: inherit;
}
.module-content {
padding: 14px;
color: #e5e7eb;
font-size: 13px;
height: calc(100% - 36px);
box-sizing: border-box;
overflow: auto;
}
.overview-card .module-header::before { background-color: #3b82f6; }
.alarm-card .module-header::before { background-color: #ef4444; }
.realtime-card .module-header::before { background-color: #f97316; }
.module-card:nth-child(2) .module-header::before { background-color: #8b5cf6; }
.module-card:nth-child(3) .module-header::before { background-color: #06b6d4; }
@media (max-width: 1400px) {
.left-modules,
.right-modules {
width: 100%;
}
}
@media (max-width: 1200px) {
.left-modules,
.right-modules {
width: 100%;
}
.bottom-middle-module {
max-width: 600px;
}
}
@media (max-width: 900px) {
.left-modules,
.right-modules {
width: 100%;
}
.bottom-middle-module {
max-width: 500px;
}
}
@media (max-width: 768px) {
.left-modules,
.right-modules {
width: 100%;
}
.bottom-middle-module {
max-width: 100%;
}
}
</style>

View File

@ -592,17 +592,15 @@ const getMainLightModeLabel = (mode: any) => {
// 处理设备消息
const handleDeviceMessage = (msg: any) => {
try {
// 解析设备消息(假设格式为 { state: [类型, 模式值, 亮度, 续航...] }
const payloadObj = JSON.parse(msg.payload.toString());
const deviceState = payloadObj.state; // 设备状态数组
if (!Array.isArray(deviceState)) {
return;
}
// 用switch处理不同的消息类型deviceState[0]
switch (deviceState[0]) {
case 1:
// 类型1灯光主键
const lightModeId = getMainLightModeLabel(deviceState[1]); // 获取模式ID如'strong'
const lightModeId = getMainLightModeLabel(deviceState[1]);
const brightness = deviceState[2]; // 亮度值
const batteryTime = deviceState[3]; // 续航时间
console.log('灯光模式消息:', { 模式ID: lightModeId, 亮度: brightness, 续航: batteryTime });
@ -625,7 +623,7 @@ const handleDeviceMessage = (msg: any) => {
break;
case 12:
// 灯光主键
const lightModeIdA = getMainLightModeLabel(deviceState[1]); // 获取模式ID如'strong'
const lightModeIdA = getMainLightModeLabel(deviceState[1]);
if (lightModeIdA !== 'unknown') {
lightModes.value.forEach(mode => {
const isActive = mode.id === lightModeIdA;
@ -650,7 +648,6 @@ const handleDeviceMessage = (msg: any) => {
break;
default:
// 其他类型消息(不处理,仅打印)
console.log('未处理的消息类型:', deviceState[0]);
break;
}
@ -658,7 +655,7 @@ const handleDeviceMessage = (msg: any) => {
}
};
onMounted(async () => {
await getList(); // 先获取设备信息
await getList();
// 连接mqtt
onConnect(async () => {
const deviceImei = deviceDetail.value.deviceImei;
@ -684,7 +681,7 @@ onMounted(async () => {
handleDeviceMessage(msg);
});
onError((err) => {
console.error('MQTT连接失败原因:', err.message); // 关键:打印连接失败的具体原因
console.error('MQTT连接失败原因:', err.message);
});
connect();
});

View File

@ -112,7 +112,7 @@
<el-tag :type="scope.row.bindingStatus === 1 ? 'success' : 'info'">
{{ scope.row.bindingStatus === 1 ? '已绑定' : '未绑定' }}
</el-tag>
</template>
</template>
</el-table-column>
<el-table-column prop="onlineStatus" label="设备状态">
<template #default="scope">
@ -312,11 +312,11 @@
<span style="color: #409eff">批量导入完成共检测到 <span style="color: #e6a23c">{{ importResult.total }}</span> 条数据导入成功
<span style="color: #67c23a">{{ importResult.succeed }}</span> 失败
<span style="color: red">{{ importResult.errorSun }}</span> </span>
<p v-if="importResult.errorSun > 0" style="padding: 10px">
<a :href="importResult.link">>>> 上传失败明细下载 <i class="el-icon-download" /></a>
</p>
</div>
</el-upload>
<p v-if="importResult.errorSun > 0" style="padding: 10px">
<a :href="importResult.link">>>> 上传失败明细下载 <i class="el-icon-download" /></a>
</p>
<template #footer>
<div class="dialog-footer">
<el-button @click="importDialogVisible = false"> </el-button>