Files
as-partner-frontend/src/views/modules/manage/partner-device.vue
freeboss e39b88d1db feat: 优化日志页面/支付配置/设备列表/菜单详情数据解析
- 支付配置: privateKeyPath改为privateKey,支持textarea粘贴和pem文件上传
- 审计日志: 优化列表展示(head字段/result解析)和详情弹窗
- 橘视厅调用日志: 接口路径截断显示/JSON格式化/耗时颜色分级
- 第三方设备列表: 新增来源/WiFi MAC/UID/心跳时间列,状态改为已激活/未激活
- 菜单/角色/用户详情: 统一用 data.{entity} 提取业务对象
- 设备权益: 去除双层data嵌套,适配后端统一响应结构
2026-08-11 16:07:10 +08:00

146 lines
5.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>