main
chenyuan 10 months ago
parent 5b98ce87f7
commit 2b2bd55b65

@ -0,0 +1,15 @@
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
node_modules
node_modules/*
.DS_Store
dist
dist-ssr
/dist*
pnpm-debug
auto-*.d.ts
.idea
.history
pnpm-lock.yaml
.image
.cursorrules
.vscode

@ -7,11 +7,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="keywords"
content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
content="生产运营管理系统"
/>
<meta
name="description"
content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
content="生产运营管理系统"
/>
<title>%VITE_APP_TITLE%</title>
</head>

@ -23,7 +23,10 @@ export const DeviceApi = {
getDevicePage: async (params: any) => {
return await request.get({ url: `/iot/device/page`, params })
},
// 查询物联设备
getDeviceList: async () => {
return await request.get({ url: `/iot/device/deviceList` })
},
// 查询物联设备详情
getDevice: async (id: number) => {
return await request.get({ url: `/iot/device/get?id=` + id })

@ -14,7 +14,10 @@ export const MqttDataRecordApi = {
getMqttDataRecordPage: async (params: any) => {
return await request.get({ url: `/iot/mqtt-data-record/page`, params })
},
// 查询设备数据记录分页
getMqttDataRecordPage2: async (params: any) => {
return await request.get({ url: `/iot/mqtt-data-record/page2`, params })
},
// 查询设备数据记录详情
getMqttDataRecord: async (id: number) => {
return await request.get({ url: `/iot/mqtt-data-record/get?id=` + id })

@ -26,7 +26,10 @@ export const MqttRecordApi = {
getMqttRecord: async (id: number) => {
return await request.get({ url: `/iot/mqtt-record/get?id=` + id })
},
// 查询设备属性
getDeviceAttr: async (code: any) => {
return await request.get({ url: `/iot/mqtt-record/getDeviceAttr?code=` + code })
},
// 新增数采记录
createMqttRecord: async (data: MqttRecordVO) => {
return await request.post({ url: `/iot/mqtt-record/create`, data })

@ -11,6 +11,7 @@ const prefixCls = getPrefixCls('footer')
const appStore = useAppStore()
const docsUrl = computed(() => appStore.getDocsUrl)
const title = computed(() => appStore.getTitle)
</script>
@ -19,6 +20,7 @@ const title = computed(() => appStore.getTitle)
:class="prefixCls"
class="h-[var(--app-footer-height)] bg-[var(--app-content-bg-color)] text-center leading-[var(--app-footer-height)] text-[var(--el-text-color-placeholder)] dark:bg-[var(--el-bg-color)] overflow-hidden"
>
<span class="text-14px">Copyright ©2022-{{ title }}</span>
<span class="text-14px">Copyright ©2024-BESURE-{{ title }}&nbsp;&nbsp;</span>
<el-link type="success" :href="docsUrl" target="_blank">操作手册</el-link>
</div>
</template>

@ -0,0 +1,245 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="设备" prop="deviceName">
<el-select
v-model="queryParams.deviceName"
@change="handleQuery"
clearable
filterable
placeholder="请选择"
class="!w-240px"
>
<el-option
v-for="item in deviceList"
:key="item.id"
:label="item.deviceName"
:value="item.deviceName"
/>
</el-select>
</el-form-item>
<el-form-item label="属性" prop="attribute">
<el-select
v-model="queryParams.attributes"
@change="handleQuery"
clearable
filterable
multiple
collapse-tags
collapse-tags-tooltip
placeholder="请选择"
class="!w-240px"
>
<el-option
v-for="item in deviceAttrList"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="属性值" prop="attrValue">
<el-input
v-model="queryParams.attrValue"
placeholder="请输入属性值"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-360px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['iot:mqtt-data-record:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['iot:mqtt-data-record:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="数据" name="" />
<el-tab-pane label="看板" name="0" />
</el-tabs>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="设备" align="center" prop="deviceName" />
<el-table-column label="属性" align="center" prop="attribute" />
<el-table-column label="属性值" align="center" prop="attrValue" />
<el-table-column
label="设备时间"
align="center"
prop="deviceTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['iot:mqtt-data-record:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { MqttDataRecordApi, MqttDataRecordVO } from '@/api/iot/mqttdatarecord'
import {DeviceApi, DeviceVO} from "@/api/iot/device";
import {MqttRecordApi} from "@/api/iot/mqttrecord";
import {TabsPaneContext} from "element-plus";
/** 设备数据记录 列表 */
defineOptions({ name: 'MqttDataRecord' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<MqttDataRecordVO[]>([]) //
const deviceList = ref<DeviceVO[]>([])
const deviceAttrList = ref<string[]>([])
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
deviceName: undefined,
attributes: [],
attribute: undefined,
attrValue: undefined,
deviceTime: [],
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
console.log(queryParams)
const data = await MqttDataRecordApi.getMqttDataRecordPage2(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = async () => {
queryParams.pageNo = 1
if(deviceList.value!=null && deviceList.value.length > 0){
deviceAttrList.value = await MqttRecordApi.getDeviceAttr(queryParams.deviceName)
}
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await MqttDataRecordApi.deleteMqttDataRecord(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await MqttDataRecordApi.exportMqttDataRecord(queryParams)
download.excel(data, '设备数据记录.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(async () => {
deviceList.value = await DeviceApi.getDeviceList()
getList()
})
/** tab 切换 */
let activeName = ''
const handleTabClick = (tab: TabsPaneContext) => {
console.log(tab.paneName)
}
</script>
Loading…
Cancel
Save