iot-gateway_fontend/src/views/iot/device/components/device-detail.vue
Kven 827bb69f22 feat(iot): 增加设备所属产品详情展示并优化搜索功能
- 在设备详情页面添加所属产品信息展示,包括产品名称、类型、型号、通讯协议等
- 实现设备和产品名称的模糊搜索功能
- 优化设备列表查询,改用名称搜索替代原有列表查询方式
-修复产品 TSL 页面权限控制错误
2025-02-25 22:00:47 +08:00

150 lines
4.4 KiB
Vue

<template>
<div class="container">
<Breadcrumb :items="['物联网管理', '设备管理', '设备详情']" />
<a-card class="general-card" title=" ">
<a-descriptions v-model="renderData" size="large">
<template #title
><h3 style="margin-top: -15px"
><a-button
class="nav-btn"
type="outline"
:shape="'circle'"
@click="() => $router.go(-1)"
>
<icon-undo />
</a-button>
设备详情</h3
>
</template>
<a-descriptions-item label="设备名称">{{ renderData.name }}</a-descriptions-item>
<a-descriptions-item label="硬件版本">{{ renderData.hardwareVersion }}</a-descriptions-item>
<a-descriptions-item label="固件版本">{{ renderData.firmwareVersion }}</a-descriptions-item>
<a-descriptions-item label="所属产品">{{ renderData.productId }}</a-descriptions-item>
<!-- <a-descriptions-item label="备注">{{renderData.remark }}</a-descriptions-item>-->
<a-descriptions-item label="创建时间">{{dayjs(renderData.createTime).format('YYYY-MM-DD HH:mm:ss') }}</a-descriptions-item>
</a-descriptions>
</a-card>
<a-card class="general-card" style="margin-top: 10px">
<a-tabs
:active-key="activeKey"
@tab-click="handleMenuClick"
style="padding-top: 20px"
>
<a-tab-pane key="1" tab="参数" title="扩展属性">
<a-table :columns="columns" :data="renderData.params" />
</a-tab-pane>
<a-tab-pane key="2" tab="基本信息" title="基本信息">
<a-card class="general-card" title=" ">
<a-descriptions size="large">
<template #title>
<h3 style="margin-top: -15px">所属产品详情</h3>
</template>
<a-descriptions-item label="产品名称">{{
renderData.productName
}}</a-descriptions-item>
<a-descriptions-item label="产品类型">{{
renderData.productType
}}</a-descriptions-item>
<a-descriptions-item label="产品型号">{{
renderData.model
}}</a-descriptions-item>
<a-descriptions-item label="通讯协议">{{
renderData.link
}}</a-descriptions-item>
<a-descriptions-item label="备注">{{
renderData.remark
}}</a-descriptions-item>
<a-descriptions-item label="创建时间">{{
dayjs(renderData.createTime).format('YYYY-MM-DD HH:mm:ss')
}}</a-descriptions-item>
</a-descriptions>
</a-card>
</a-tab-pane>
<a-tab-pane key="3" tab="执行服务" title="执行服务">
执行服务内容
</a-tab-pane>
</a-tabs>
</a-card>
</div>
</template>
<script lang="ts" setup>
import dayjs from 'dayjs';
import { useRoute } from 'vue-router';
import { onMounted, ref } from 'vue';
import { queryDeviceDetail } from '@/api/device';
const route = useRoute();
const id = Number(route.params.id);
const columns = [
{
title: '参数名称',
dataIndex: 'name',
slotName: 'name',
},
{
title: '参数标识',
dataIndex: 'identifier',
slotName: 'identifier',
},
{
title: '数据类型',
dataIndex: 'dataType',
slotName: 'dataType',
},
{
title: '参数类型',
dataIndex: 'type',
slotName: 'type',
},
];
const activeKey = ref('1');
const renderData = ref([]);
const fetchData = async (Id: number) => {
const res = await queryDeviceDetail(Id);
renderData.value = res.data;
};
const handleMenuClick = (e: any) => {
activeKey.value = e;
};
onMounted(() => {
fetchData(id);
});
</script>
<style scoped>
.container {
padding: 0 20px 20px 20px;
}
h1 {
font-size: 24px;
margin-bottom: 10px;
}
.meta span {
margin-right: 20px;
}
.attachments li {
margin-bottom: 10px;
}
.attachments a {
display: flex;
align-items: center;
font-size: 14px;
color: #1890ff;
text-decoration: none;
}
.attachments a:hover {
text-decoration: underline;
}
.nav-btn {
border-color: rgb(var(--gray-2));
color: rgb(var(--gray-8));
font-size: 16px;
}
</style>