- 支付配置: privateKeyPath改为privateKey,支持textarea粘贴和pem文件上传
- 审计日志: 优化列表展示(head字段/result解析)和详情弹窗
- 橘视厅调用日志: 接口路径截断显示/JSON格式化/耗时颜色分级
- 第三方设备列表: 新增来源/WiFi MAC/UID/心跳时间列,状态改为已激活/未激活
- 菜单/角色/用户详情: 统一用 data.{entity} 提取业务对象
- 设备权益: 去除双层data嵌套,适配后端统一响应结构
146 lines
5.6 KiB
Vue
146 lines
5.6 KiB
Vue
<template>
|
||
<div class="mod-partner-device">
|
||
<el-form :inline="true" :model="dataForm" @keyup.enter="getDataList()">
|
||
<el-form-item>
|
||
<el-select v-model="dataForm.partnerId" placeholder="合作伙伴" clearable filterable style="width:180px">
|
||
<el-option v-for="p in partnerOptions" :key="p.id" :label="p.name" :value="p.partnerId"></el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item>
|
||
<el-input v-model="dataForm.mac" placeholder="MAC地址" clearable style="width:160px"></el-input>
|
||
</el-form-item>
|
||
<el-form-item>
|
||
<el-input v-model="dataForm.deviceSn" placeholder="设备SN" clearable style="width:160px"></el-input>
|
||
</el-form-item>
|
||
<el-form-item>
|
||
<el-button @click="getDataList()">查询</el-button>
|
||
</el-form-item>
|
||
</el-form>
|
||
<div class="table-page-wrap">
|
||
<el-table :data="dataList" border v-loading="dataListLoading" style="width: 100%">
|
||
<el-table-column type="index" header-align="center" align="center" width="55" label="序号" />
|
||
<el-table-column header-align="center" align="center" width="90" label="来源">
|
||
<template #default="scope">
|
||
<el-tag v-if="scope.row.source === 'PARTNER'" size="small" type="warning">第三方</el-tag>
|
||
<el-tag v-else-if="scope.row.source === 'DIRECT'" size="small" type="success">自营</el-tag>
|
||
<span v-else>{{ scope.row.source || '-' }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="mac" header-align="center" align="center" width="150" label="MAC" show-overflow-tooltip />
|
||
<el-table-column prop="wifiMac" header-align="center" align="center" width="150" label="WiFi MAC" show-overflow-tooltip>
|
||
<template #default="scope">{{ scope.row.wifiMac || '-' }}</template>
|
||
</el-table-column>
|
||
<el-table-column prop="deviceSn" header-align="center" align="center" min-width="160" label="SN" show-overflow-tooltip>
|
||
<template #default="scope">{{ scope.row.deviceSn || '-' }}</template>
|
||
</el-table-column>
|
||
<el-table-column prop="deviceUid" header-align="center" align="center" min-width="140" label="设备UID" show-overflow-tooltip>
|
||
<template #default="scope">{{ scope.row.deviceUid || '-' }}</template>
|
||
</el-table-column>
|
||
<el-table-column header-align="center" align="center" min-width="140" label="合作伙伴">
|
||
<template #default="scope">{{ partnerNameOf(scope.row.partnerId) }}</template>
|
||
</el-table-column>
|
||
<el-table-column prop="status" header-align="center" align="center" width="90" label="状态">
|
||
<template #default="scope">
|
||
<el-tag v-if="scope.row.status === 'ACTIVE'" size="small" type="success">已激活</el-tag>
|
||
<el-tag v-else-if="scope.row.status === 'INACTIVE'" size="small" type="info">未激活</el-tag>
|
||
<el-tag v-else size="small">{{ scope.row.status }}</el-tag>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="lastHeartbeat" header-align="center" align="center" width="170" label="心跳时间">
|
||
<template #default="scope">{{ scope.row.lastHeartbeat || '-' }}</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
<el-pagination
|
||
@size-change="sizeChangeHandle"
|
||
@current-change="currentChangeHandle"
|
||
:current-page="pageIndex"
|
||
:page-sizes="[10, 20, 50, 100]"
|
||
:page-size="pageSize"
|
||
:total="totalPage"
|
||
layout="total, sizes, prev, pager, next, jumper">
|
||
</el-pagination>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup lang="ts">
|
||
import { reactive, ref, onMounted } from 'vue'
|
||
import { getDeviceList, type DeviceInfo } from '@/api/manage/device'
|
||
import { getPartnerList, type PartnerInfo } from '@/api/manage/partner'
|
||
|
||
interface DataForm {
|
||
partnerId: string | null
|
||
mac: string
|
||
deviceSn: string
|
||
}
|
||
const dataForm = reactive<DataForm>({ partnerId: null, mac: '', deviceSn: '' })
|
||
const dataList = ref<DeviceInfo[]>([])
|
||
const pageIndex = ref<number>(1)
|
||
const pageSize = ref<number>(10)
|
||
const totalPage = ref<number>(0)
|
||
const dataListLoading = ref<boolean>(false)
|
||
|
||
const partnerOptions = ref<PartnerInfo[]>([])
|
||
|
||
async function loadPartnerOptions (): Promise<void> {
|
||
try {
|
||
const res = await getPartnerList({ page: 1, limit: 500 })
|
||
if (res && res.code === 0) partnerOptions.value = res.data?.page?.list || []
|
||
} catch {
|
||
partnerOptions.value = []
|
||
}
|
||
}
|
||
|
||
function partnerNameOf (partnerId?: string): string {
|
||
if (!partnerId) return '-'
|
||
const p = partnerOptions.value.find(i => i.partnerId === partnerId)
|
||
return p?.name || String(partnerId)
|
||
}
|
||
|
||
async function getDataList (): Promise<void> {
|
||
dataListLoading.value = true
|
||
try {
|
||
// 固定 source=PARTNER,只查第三方接口注册的设备
|
||
const res = await getDeviceList({
|
||
page: pageIndex.value,
|
||
limit: pageSize.value,
|
||
source: 'PARTNER',
|
||
partnerId: dataForm.partnerId ?? undefined,
|
||
mac: dataForm.mac || undefined,
|
||
deviceSn: dataForm.deviceSn || undefined
|
||
})
|
||
if (res && res.code === 0) {
|
||
dataList.value = res.data?.page?.list || []
|
||
totalPage.value = res.data?.page?.totalCount || 0
|
||
} else {
|
||
dataList.value = []
|
||
totalPage.value = 0
|
||
}
|
||
} finally {
|
||
dataListLoading.value = false
|
||
}
|
||
}
|
||
|
||
function sizeChangeHandle (val: number): void {
|
||
pageSize.value = val
|
||
pageIndex.value = 1
|
||
getDataList()
|
||
}
|
||
|
||
function currentChangeHandle (val: number): void {
|
||
pageIndex.value = val
|
||
getDataList()
|
||
}
|
||
|
||
onMounted(() => {
|
||
loadPartnerOptions()
|
||
getDataList()
|
||
})
|
||
</script>
|
||
|
||
<style scoped>
|
||
.mod-partner-device {
|
||
padding: 10px;
|
||
}
|
||
</style>
|