Browse Source

报警管理/站点监控

master
xuhuajiao 1 day ago
parent
commit
cb5b3c5904
  1. 161
      src/views/assetManage/monitor/index.vue
  2. 523
      src/views/assetManage/monitor/index1.vue
  3. 25
      src/views/home.vue
  4. 8
      src/views/system/user/index.vue

161
src/views/assetManage/monitor/index.vue

@ -32,76 +32,55 @@
<img src="@/assets/images/tab_archives_logo.png" alt="" style="display: block; width: 50px; margin-right: 10px;"> <img src="@/assets/images/tab_archives_logo.png" alt="" style="display: block; width: 50px; margin-right: 10px;">
<div style="flex: 1;"> <div style="flex: 1;">
<div class="store-info-item store-top"> <div class="store-info-item store-top">
<p>{{ item.warehouseName || '仓库' }} </p>
<p style="margin-left: 10px;">面积{{ item.warehouseArea || '0' }} </p>
<p style="width:62%;">{{ item.warehouseName || '仓库' }} </p>
<p style="flex:1;">面积{{ item.warehouseArea || '0' }} </p>
<i
style="width:6%; text-align: center; cursor: pointer;"
class="iconfont icon-wangluoshexiangtou"
@click.stop="openWarehouseCamera(item)"
/>
</div> </div>
<div class="store-info-item" style="font-size: 12px; color: #909399; margin-top: 10px;"> <div class="store-info-item" style="font-size: 12px; color: #909399; margin-top: 10px;">
<!-- <i class="iconfont icon-yonghuguanli" /> --> <!-- <i class="iconfont icon-yonghuguanli" /> -->
<div style="display: flex; justify-content: flex-start;">
<p v-if="item.administrator">{{ item.administrator }}</p> <p v-if="item.administrator">{{ item.administrator }}</p>
<p v-if="item.contactPhone">{{ item.contactPhone }}</p> <p v-if="item.contactPhone">{{ item.contactPhone }}</p>
</div> </div>
<p v-if="item.lastSyncTime">最后同步时间: {{ item.lastSyncTime | parseTime }}</p>
</div> </div>
</div> </div>
<swiper
v-if="item.deviceList && item.deviceList.length > 0"
ref="swiperContent"
class="swiper-content"
:options="swiperOptionContent"
:auto-update="true"
:auto-destroy="true"
:delete-instance-on-destroy="true"
:cleanup-styles-on-destroy="true"
>
<swiper-slide v-for="(slide, idx) in getDeviceSlides(item.deviceList)" :key="idx" class="swiper-slide-content">
<div class="device-grid">
<div
v-for="device in slide"
:key="device.id"
class="device-item"
:style="{
...getDeviceListBg(device.deviceTypeName),
cursor: device.deviceTypeName === '网络高清球机' ? 'pointer' : 'default'
}"
@click="device.deviceTypeName === '网络高清球机' && handleViewVideo(device.id)"
>
<div style="display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; text-align: center; border-radius: 50%;" :style="getDeviceIconBg(device.deviceTypeName)">
<i :class="getDeviceIcon(device.deviceTypeName)" :style="getDeviceIconStyle(device.deviceTypeName)" />
</div>
<p>{{ device.deviceName }}</p>
<i
v-if="device.deviceTypeName === '网络高清球机'"
class="iconfont icon-yulan"
style="margin-right: 4px; cursor: pointer;"
/>
</div>
</div> </div>
</swiper-slide>
<!-- 分页指示器 -->
<div v-if="getDeviceSlides(item.deviceList).length > 1" slot="pagination" class="swiper-pagination" />
</swiper>
<!-- <ul v-if="item.deviceList && item.deviceList.length > 0" v-loading="crud.loading" class="device-monitor-list">
<li v-for="device in item.deviceList" :key="device.id">
<i :class="getDeviceIcon(device.deviceTypeName)" :style="getDeviceIconStyle(device.deviceTypeName)" />
<p>{{ device.deviceName }}</p>
<i
v-if="device.deviceTypeName === '网络高清球机'"
class="iconfont icon-yulan"
style="margin-right: 4px; cursor: pointer;"
@click="handleViewVideo(device.id)"
/>
<ul class="store-monitor">
<li>
<span>当日进出</span>
<p>{{ item.todayInCount || '0' }}</p>
</li> </li>
</ul> -->
<!-- 空数据 -->
<div v-else class="no-device">
<el-empty style="display: flex; flex-direction: column; align-items: center; height: 210px; padding: 0 !important;" :image-size="60" description="暂无设备" />
</div>
<li>
<span>本月进出</span>
<p>{{ item.todayInCount || '0' }}</p>
</li>
<li>
<span>本月入库</span>
<p>{{ item.todayInCount || '0' }}</p>
</li>
<li>
<span>本月出库</span>
<p>{{ item.todayInCount || '0' }}</p>
</li>
<li>
<span>本月出入库异动</span>
<p>{{ item.todayInCount || '0' }}</p>
</li>
<li>
<span>本月重点资产异动</span>
<p>{{ item.todayInCount || '0' }}</p>
</li>
</ul>
<div v-if="item.isWarningActive" class="warning-text">
<i class="iconfont icon-baojingjilu" />
<div class="warning-text-scroll" :class="{ scroll: item.warningNeedScroll }">
<div class="warning-text">
<i v-if="item.isWarningActive" class="iconfont icon-baojingjilu" />
<div v-if="item.isWarningActive" class="warning-text-scroll" :class="{ scroll: item.warningNeedScroll }">
<span :ref="el => setWarningRef(el, index)" class="scroll-text">{{ item.warningText }}</span> <span :ref="el => setWarningRef(el, index)" class="scroll-text">{{ item.warningText }}</span>
</div> </div>
</div> </div>
@ -130,14 +109,16 @@
import crudDevice, { FetchFondsWarehouseTree, FetchWarehouseTree } from '@/api/assetDevice/index' import crudDevice, { FetchFondsWarehouseTree, FetchWarehouseTree } from '@/api/assetDevice/index'
import CRUD, { presenter, header, crud } from '@crud/crud' import CRUD, { presenter, header, crud } from '@crud/crud'
import hkVideo from '@/views/components/hkVideo.vue' import hkVideo from '@/views/components/hkVideo.vue'
import { swiper, swiperSlide } from 'vue-awesome-swiper'
import 'swiper/dist/css/swiper.css'
// import { swiper, swiperSlide } from 'vue-awesome-swiper'
// import 'swiper/dist/css/swiper.css'
export default { export default {
name: 'Monitor', name: 'Monitor',
components: { hkVideo,
swiper,
swiperSlide },
components: {
hkVideo
// swiper,
// swiperSlide
},
cruds() { cruds() {
return CRUD({ return CRUD({
title: '设备监控', title: '设备监控',
@ -291,8 +272,8 @@ export default {
this.storeData = res || [] this.storeData = res || []
// 使 // 使
// this.storeData = [] // this.storeData = []
// this.storeData[0].lastSyncTime = '2026-04-03T08:33:19.014+00:00'
// this.storeData[0].syncExplanation = ''
this.storeData[0].lastSyncTime = '2026-04-03T08:33:19.014+00:00'
this.storeData[0].syncExplanation = '报警文案报警文案报警文案报警文案报警文案报警文案报警文案报警文案报警文案报警文案'
// this.storeData[2].lastSyncTime = '2026-04-03T08:33:19.014+00:00' // this.storeData[2].lastSyncTime = '2026-04-03T08:33:19.014+00:00'
// this.storeData[2].syncExplanation = 'ddd' // this.storeData[2].syncExplanation = 'ddd'
@ -454,7 +435,19 @@ export default {
handleClose() { handleClose() {
this.hkVideoVisible = false this.hkVideoVisible = false
}, },
openWarehouseCamera(warehouse) {
// warehouse.deviceList
const cameraList = warehouse.deviceList || []
//
const camera = cameraList.find(item => item.deviceTypeName === '网络高清球机')
if (!camera) {
this.$message.warning('该仓库暂无监控设备')
return
}
// IDhandleViewVideo
this.handleViewVideo(camera.id)
},
handleViewVideo(data) { handleViewVideo(data) {
const deviceId = data const deviceId = data
Promise.all([ Promise.all([
@ -535,13 +528,16 @@ export default {
align-items: center; align-items: center;
.store-info-item{ .store-info-item{
display: flex; display: flex;
justify-content: flex-start;
justify-content: space-between;
align-items: center; align-items: center;
p{ p{
margin-right: 6px; margin-right: 6px;
} }
&.store-top{ &.store-top{
justify-content: space-between; justify-content: space-between;
.iconfont::before{
margin: 0 !important;
}
} }
} }
} }
@ -549,24 +545,33 @@ export default {
.el-card__body{ .el-card__body{
padding: 5px 10px; padding: 5px 10px;
border-radius: 0 0 10px 10px; border-radius: 0 0 10px 10px;
.device-monitor-list{
height: 200px;
padding: 10px;
line-height: 30px;
.store-monitor{
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: flex-start;
padding: 5px 5px 10px 5px;
line-height: 35px;
font-size: 14px; font-size: 14px;
overflow: hidden;
overflow-y: scroll;
li{ li{
width: calc(50% - 10px);
display: flex; display: flex;
justify-content: flex-start;
justify-content: space-between;
align-items: center; align-items: center;
.iconfont{
width: 22px;
text-align: center;
&:nth-child(even){
margin-left: 15px;
}
span{
display: block;
width: 120px;
// color: #0348f3;
} }
p{ p{
flex: 1; flex: 1;
padding: 0 6px;
text-align: right;
font-weight: bold;
color: #0C0E1E;
} }
} }
} }

523
src/views/assetManage/monitor/index1.vue

@ -1,523 +0,0 @@
<template>
<div class="app-container">
<div class="container-main" style="justify-content: flex-start;">
<div class="elect-cont-left">
<el-scrollbar style="height: calc(100vh - 198px);">
<el-tree
ref="tree"
:data="warehouseTreeData"
:props="defaultProps"
node-key="id"
default-expand-all
:default-checked-keys="defaultCheckedKeys"
:expand-on-click-node="false"
:highlight-current="true"
@node-click="handleNodeClick"
/>
</el-scrollbar>
</div>
<!--用户数据-->
<div class="elect-cont-right" style="background-color: transparent; padding: 0 !important;">
<div class="container-right" style="height: calc(100vh - 158px) !important;background-color: transparent !important; ">
<span class="right-top-line" />
<span class="left-bottom-line" />
<div class="monitor-list" style="height: calc(100%); overflow: hidden; overflow-y: scroll;">
<el-card
v-for="(item, index) in warehouseCardList"
:key="index"
class="list-card"
:class="{ 'warning-active': item.isWarningActive }"
>
<div slot="header" class="store-info">
<div class="store-info-item">
<i class="iconfont icon-kufangguanli" />
<p>{{ item.warehouseName || '仓库' }} </p>
<p>面积{{ item.warehouseArea || '0' }} </p>
</div>
<div v-if="item.administrator || item.contactPhone" class="store-info-item">
<i class="iconfont icon-yonghuguanli" />
<p v-if="item.administrator">{{ item.administrator }}</p>
<p v-if="item.contactPhone">{{ item.contactPhone }}</p>
</div>
</div>
<ul v-if="item.deviceList && item.deviceList.length > 0" v-loading="crud.loading" class="device-monitor-list">
<li v-for="device in item.deviceList" :key="device.id">
<i :class="getDeviceIcon(device.deviceTypeName)" :style="getDeviceIconStyle(device.deviceTypeName)" />
<p>{{ device.deviceName }}</p>
<i
v-if="device.deviceTypeName === '网络高清球机'"
class="iconfont icon-yulan"
style="margin-right: 4px; cursor: pointer;"
@click="handleViewVideo(device.id)"
/>
</li>
</ul>
<!-- 空数据 -->
<div v-else class="no-device">
<el-empty style="display: flex; flex-direction: column; align-items: center; height: 200px; padding: 0 !important;" :image-size="60" description="暂无设备" />
</div>
<div v-if="item.isWarningActive" class="warning-text">
<i class="iconfont icon-baojingjilu" />
<div class="warning-text-scroll" :class="{ scroll: item.warningNeedScroll }">
<span :ref="el => setWarningRef(el, index)" class="scroll-text">{{ item.warningText }}</span>
</div>
</div>
</el-card>
<!-- 只有一个仓库都没有时才显示 -->
<div v-if="warehouseCardList.length === 0 && !crud.loading" class="no-device" style="width: 100%; height: 100%;">
<el-empty style="display: flex; flex-direction: column; align-items: center; padding: 0 !important; height: 100%;" :image-size="60" description="暂无仓库信息" />
</div>
</div>
</div>
</div>
</div>
<!-- 查看监控视频 -->
<el-dialog class="view-video" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :visible="hkVideoVisible" title="查看监控视频" :before-close="handleClose">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<hkVideo ref="hkVideoRef" :hk-config="hkConfig" />
</div>
</el-dialog>
</div>
</template>
<script>
import crudDevice, { FetchFondsWarehouseTree, FetchWarehouseTree } from '@/api/assetDevice/index'
import CRUD, { presenter, header, crud } from '@crud/crud'
import hkVideo from '@/views/components/hkVideo.vue'
export default {
name: 'Monitor',
components: { hkVideo },
cruds() {
return CRUD({
title: '设备监控',
url: 'api/device/getDeviceAllByWarehouseId',
idField: 'id || deviceId',
sort: [],
crudMethod: { ...crudDevice },
optShow: {
add: false,
edit: false,
del: false,
reset: true,
download: false,
group: false
},
queryOnPresenterCreated: false
})
},
mixins: [presenter(), header(), crud()],
data() {
return {
permission: { add: [], edit: [], del: [] },
warehouseTreeData: null,
defaultProps: {
children: 'children',
label: 'name'
},
defaultCheckedKeys: [],
selectedTreeKey: null,
storeData: [],
//
warehouseCardList: [],
warningRefs: [], //
hkVideoVisible: false,
hkConfig: {
username: null,
password: null,
ip: null,
port: null
}
}
},
created() {
//
FetchFondsWarehouseTree().then(res => {
const filteredData = this.filterTreeData(res)
const topParent = {
id: 0,
name: '市州',
children: filteredData
}
this.warehouseTreeData = [topParent]
this.$nextTick(() => {
this.selectFirstWarehouseNode()
})
}).catch(() => {})
//
this.getWarehouseTree()
},
mounted() {},
methods: {
[CRUD.HOOK.beforeRefresh](crud) {
this.crud.params.page = null
this.crud.params.size = null
},
[CRUD.HOOK.afterRefresh](crud) {
// + +
this.buildWarehouseCardList(crud.data || [])
},
//
getDeviceIcon(typeName) {
const iconMap = {
'RFID吸顶式安全门': 'iconfont icon-saomiao',
'RFID固定式读写器': 'iconfont icon-rfidduxieqi',
'RFID手持盘点终端': 'iconfont icon-shouchipandianyi',
'网络高清球机': 'iconfont icon-wangluoshexiangtou',
'智能一体机': 'iconfont icon-yitiji',
'人脸识别门禁一体机': 'iconfont icon-renlianshibiejiqi'
}
return iconMap[typeName] || 'iconfont icon-default'
},
//
getDeviceIconStyle(typeName) {
const styleMap = {
'RFID吸顶式安全门': { fontSize: '12px' },
'RFID固定式读写器': { fontSize: '20px' },
'网络高清球机': { fontSize: '18px' },
'人脸识别门禁一体机': { fontSize: '18px' },
'RFID手持盘点终端': { fontSize: '18px' }
}
return styleMap[typeName] || { fontSize: '16px' }
},
getWarehouseTree() {
FetchWarehouseTree().then(res => {
this.storeData = res || []
// 使
// this.storeData = []
// this.storeData[4].lastSyncTime = '2026-04-03T08:33:19.014+00:00'
// this.storeData[4].syncExplanation = ''
// this.storeData[2].lastSyncTime = '2026-04-03T08:33:19.014+00:00'
// this.storeData[2].syncExplanation = 'ddd'
// console.log('storeData', this.storeData)
}).catch(() => {})
},
//
buildWarehouseCardList(deviceList) {
// 1.
if (!this.storeData.length) {
this.warehouseCardList = []
return
}
// 2.
const currentFondsNo = this.selectedTreeKey?.fondsNo
// 3.
let allWarehousesInCurrentFonds = []
if (this.selectedTreeKey.id === 0) {
//
allWarehousesInCurrentFonds = this.storeData
} else {
//
allWarehousesInCurrentFonds = this.storeData.filter(
s => s.fondsNo === currentFondsNo
)
}
// 4. 便
const deviceGroup = {}
deviceList.forEach(item => {
const key = item.fondsNo + '_' + item.warehouseNo
if (!deviceGroup[key]) deviceGroup[key] = []
deviceGroup[key].push(item)
})
// 5.
const cardList = []
allWarehousesInCurrentFonds.forEach(warehouse => {
const key = warehouse.fondsNo + '_' + warehouse.warehouseNo
const deviceListOfWarehouse = deviceGroup[key] || [] //
let isWarningActive = false
let warningText = ''
const lastSyncTime = warehouse.lastSyncTime
const syncExplanation = warehouse.syncExplanation
if (lastSyncTime) {
try {
const now = new Date().getTime()
const syncTime = new Date(lastSyncTime).getTime()
if (!isNaN(syncTime)) {
const diffMinutes = (now - syncTime) / (1000 * 60)
if (diffMinutes > 10) {
isWarningActive = true
warningText = syncExplanation || '同步超时超过10分钟'
}
}
} catch (e) {
console.log(e)
}
}
cardList.push({
...warehouse,
deviceList: deviceListOfWarehouse,
isWarningActive,
warningText,
warningNeedScroll: false
})
})
this.warehouseCardList = cardList
// 6.
this.$nextTick(() => {
this.startAllTextScroll()
})
},
// DOM
setWarningRef(el, index) {
if (el) this.warningRefs[index] = el
},
//
startAllTextScroll() {
this.warehouseCardList.forEach((item, idx) => {
if (!item.isWarningActive) return
const scrollText = this.warningRefs[idx]
if (!scrollText) return
const scrollBox = scrollText.parentElement
if (!scrollBox) return
const textWidth = scrollText.scrollWidth
const boxWidth = scrollBox.clientWidth
this.warehouseCardList[idx].warningNeedScroll = textWidth > boxWidth
if (textWidth <= boxWidth) return
let pos = 0
const speed = 1
setInterval(() => {
pos -= speed
if (pos < -textWidth) pos = boxWidth
scrollText.style.transform = `translateX(${pos}px)`
}, 30)
})
},
//
filterTreeData(tree) {
return tree.map(node => {
if (node.type === 'warehouse') return null
const newNode = { ...node }
if (newNode.children && newNode.children.length) {
newNode.children = this.filterTreeData(newNode.children).filter(item => item)
}
return newNode
}).filter(item => item)
},
// //
// selectFirstWarehouseNode() {
// const root = this.warehouseTreeData[0]
// if (root && root.children && root.children.length) {
// const firstFonds = root.children[0]
// this.defaultCheckedKeys = [firstFonds.id]
// this.$refs.tree.setCurrentKey(firstFonds.id)
// this.handleNodeClick(firstFonds)
// }
// },
//
selectFirstWarehouseNode() {
const root = this.warehouseTreeData[0]
if (root) {
// id = 0
this.defaultCheckedKeys = [root.id]
this.$refs.tree.setCurrentKey(root.id)
this.handleNodeClick(root)
}
},
//
handleNodeClick(data) {
this.selectedTreeKey = data
if (this.selectedTreeKey.id === 0) {
this.crud.query.warehouseId = null
this.crud.query.fondsId = null
} else {
this.crud.query.fondsId = data.id
}
this.search = ''
this.crud.toQuery()
},
//
handleClose() {
this.hkVideoVisible = false
},
handleViewVideo(data) {
const deviceId = data
Promise.all([
crudDevice.FetchDeviceDetailsById({ deviceId }),
crudDevice.FetchDevicePasswordById({ deviceId })
]).then(([detailRes, pwdRes]) => {
if (detailRes) {
const finalPassword = pwdRes || detailRes.devicePassword
this.hkConfig = {
username: detailRes.deviceAccount,
devicePassword: finalPassword,
ip: detailRes.deviceIp,
port: detailRes.devicePort
}
this.hkVideoVisible = true
this.$nextTick(() => {
this.$refs.hkVideoRef.initVideo()
})
}
}).catch(err => {
console.log('获取设备视频信息失败', err)
})
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-tree{
.el-tree-node__content{
font-size: 14px;
color: #545B65;
.tree-text{
font-size: 16px;
font-weight: 600;
color: #0C0E1E;
}
}
.el-tree-node__children{
.tree-text {
font-size: 14px !important;
font-weight: normal;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
display: inline-block;
min-width: 170px;
color: #545B65;
}
}
}
.monitor-list{
display: flex;
justify-content: flex-start;
align-items: flex-start;
flex-wrap: wrap;
padding-top: 15px;
.list-card{
width: calc(100% / 3 - 20px);
margin: 0 10px 20px 10px;
}
}
::v-deep .el-card {
border-radius: 10px;
.el-card__header{
padding: 12px 10px !important;
border-radius: 10px 10px 0 0;
color: #0c0e1e;
font-size: 14px;
font-weight: 600;
background-color: #fff !important;
border-bottom: 1px solid #ebeef5 !important;
.store-info{
display: flex;
justify-content: space-between;
align-items: center;
.store-info-item{
display: flex;
justify-content: flex-start;
align-items: center;
p{
margin-right: 6px;
}
}
}
}
.el-card__body{
border-radius: 0 0 10px 10px;
.device-monitor-list{
height: 200px;
padding: 10px;
line-height: 30px;
font-size: 14px;
overflow: hidden;
overflow-y: scroll;
li{
display: flex;
justify-content: flex-start;
align-items: center;
.iconfont{
width: 22px;
text-align: center;
}
p{
flex: 1;
padding: 0 6px;
}
}
}
}
.warning-text{
color: #F65163;
font-size: 14px;
font-weight: 600;
border-top: 1px solid #ebeef5 !important;
display: flex;
align-items: center;
gap: 6px;
height: 44px;
overflow: hidden;
padding: 0 10px !important;
.iconfont{
flex-shrink: 0;
}
.warning-text-scroll {
flex: 1;
height: 100%;
overflow: hidden;
line-height: 44px;
position: relative;
}
.scroll-text {
display: inline-block;
white-space: nowrap;
position: absolute;
left: 0;
top: 0;
}
}
&.warning-active{
.el-card__header{
background-color: rgba(85, 85, 85, 0.2) !important;
border-bottom: 1px solid #fff !important;
}
.el-card__body{
background-color: rgba(85, 85, 85, 0.2) !important;
}
.warning-text{
border-top: 1px solid #fff !important;
}
}
}
.view-video{
::v-deep .el-dialog{
width: 1000px !important;
}
}
</style>

25
src/views/home.vue

@ -147,6 +147,28 @@
<h3 class="home-item-title"> <h3 class="home-item-title">
报警设备 报警设备
</h3> </h3>
<div class="home-flowable-list" style="height: calc(100% - 45px); overflow-x: hidden;">
<el-table
v-if="alarmData.length!==0"
height="calc(100%)"
:data="alarmData"
class="archives-table"
stripe
style="width: 100%"
>
<el-table-column prop="warehouseName" label="仓库名称" />
<el-table-column prop="syncExplanation" label="报警说明" />
<el-table-column prop="checkStartTime" label="最后同步时间" width="150px">
<template slot-scope="scope">
<div>{{ scope.row.checkStartTime | parseTime }}</div>
</template>
</el-table-column>
</el-table>
<div v-else class="empty-main" style="height: 100%;">
<svg-icon icon-class="empty" class-name="empty-img" />
<p>暂无数据</p>
</div>
</div>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
@ -228,7 +250,8 @@ export default {
disableOnInteraction: false disableOnInteraction: false
}, },
slidesPerView: 'auto' slidesPerView: 'auto'
}
},
alarmData: []
} }
}, },
computed: { computed: {

8
src/views/system/user/index.vue

@ -201,15 +201,17 @@
<el-table-column type="selection" :selectable="checkboxT" align="center" width="55" /> <el-table-column type="selection" :selectable="checkboxT" align="center" width="55" />
<el-table-column prop="loginid" label="账号" /> <el-table-column prop="loginid" label="账号" />
<el-table-column prop="lastname" label="用户名" /> <el-table-column prop="lastname" label="用户名" />
<el-table-column prop="sex" label="性别" width="60" />
<el-table-column prop="sex" label="性别" width="60" align="center" />
<!-- <el-table-column prop="fondsNo" label="市州编号" /> -->
<el-table-column prop="fondsName" label="市州名称" />
<el-table-column prop="departmentname" label="所属部门" /> <el-table-column prop="departmentname" label="所属部门" />
<el-table-column prop="addtype" label="用户类型" align="center">
<el-table-column prop="addtype" label="用户类型" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.addtype === 2">自建用户</el-tag> <el-tag v-if="scope.row.addtype === 2">自建用户</el-tag>
<el-tag v-if="scope.row.addtype === 1" type="success">同步用户</el-tag> <el-tag v-if="scope.row.addtype === 1" type="success">同步用户</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="facetBarcode" label="人脸绑定">
<el-table-column prop="facetBarcode" label="人脸绑定" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.facetBarcode !== null" type="success">已绑定</el-tag> <el-tag v-if="scope.row.facetBarcode !== null" type="success">已绑定</el-tag>
<el-tag v-else type="info">未绑定</el-tag> <el-tag v-else type="info">未绑定</el-tag>

Loading…
Cancel
Save