|
@@ -15,63 +15,50 @@
|
|
|
<!-- 操作栏 -->
|
|
|
<div class="main-list">
|
|
|
<div class="btns">
|
|
|
- <!-- 全选 -->
|
|
|
- <div v-show="isImgType" class="all-select" :class="{disable: !cameraList.length}">
|
|
|
- <el-checkbox
|
|
|
- v-model="selectAll"
|
|
|
- @change="handleSelectAll"
|
|
|
- :disabled="!cameraList.length"
|
|
|
- >
|
|
|
- 全选
|
|
|
- </el-checkbox>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 协作按钮 -->
|
|
|
- <el-button
|
|
|
+ <!-- 批量操作提示 -->
|
|
|
+ <!-- <div v-show="!isImgType && selectedArr.length > 0" class="selection-info">
|
|
|
+ 已选择 {{ selectedArr.length }} 项
|
|
|
+ </div> -->
|
|
|
+
|
|
|
+ <i
|
|
|
v-if="tabActive !== 0 && selectedArr.length > 0"
|
|
|
- type="primary"
|
|
|
- size="small"
|
|
|
@click="multCop"
|
|
|
- >
|
|
|
- 协作
|
|
|
- </el-button>
|
|
|
+ class="iconfont icon-menu_cooperation1"
|
|
|
+ :title="$t('manage.myDevices.pictle')"
|
|
|
+ :class="{ active: isImgType }"
|
|
|
+ ></i>
|
|
|
|
|
|
<!-- 解绑按钮 -->
|
|
|
- <el-button
|
|
|
+ <i
|
|
|
v-if="tabActive !== 0 && selectedArr.length > 0"
|
|
|
- type="danger"
|
|
|
- size="small"
|
|
|
@click="multDel"
|
|
|
- >
|
|
|
- 解绑
|
|
|
- </el-button>
|
|
|
+ class="iconfont icon-unbind"
|
|
|
+ :title="$t('manage.myDevices.unbind')"
|
|
|
+ :class="{ active: isImgType }"
|
|
|
+ ></i>
|
|
|
</div>
|
|
|
|
|
|
<div class="rig-con">
|
|
|
<!-- 添加设备 -->
|
|
|
- <el-button type="primary" size="small" @click="addDevice">
|
|
|
- 添加设备
|
|
|
- </el-button>
|
|
|
+ <h-icon :title="$t('manage.deviceAdmin.collaborative')" @click="multCop" type="icon-new_camera" class="icon main-list-left-icon icon-new_camera" />
|
|
|
|
|
|
<!-- 视图切换 -->
|
|
|
- <template v-if="tabActive !== 0">
|
|
|
- <el-button-group class="view-toggle">
|
|
|
- <el-button
|
|
|
- :type="isImgType ? 'primary' : 'default'"
|
|
|
- size="small"
|
|
|
- @click="changeType(true)"
|
|
|
- >
|
|
|
- 卡片
|
|
|
- </el-button>
|
|
|
- <el-button
|
|
|
- :type="!isImgType ? 'primary' : 'default'"
|
|
|
- size="small"
|
|
|
- @click="changeType(false)"
|
|
|
- >
|
|
|
- 列表
|
|
|
- </el-button>
|
|
|
- </el-button-group>
|
|
|
- </template>
|
|
|
+ <div v-if="tabActive !== 0">
|
|
|
+ <i
|
|
|
+ @click="changeType(true)"
|
|
|
+ v-if="!isImgType"
|
|
|
+ class="iconfont icon-main_grid"
|
|
|
+ :title="$t('manage.myDevices.pictle')"
|
|
|
+ :class="{ active: isImgType }"
|
|
|
+ ></i>
|
|
|
+ <i
|
|
|
+ @click="changeType(false)"
|
|
|
+ v-else
|
|
|
+ class="iconfont icon-view_list"
|
|
|
+ :title="$t('manage.myDevices.listtle')"
|
|
|
+ :class="{ active: !isImgType }"
|
|
|
+ ></i>
|
|
|
+ </div>
|
|
|
|
|
|
<!-- 搜索框 -->
|
|
|
<el-input
|
|
@@ -91,10 +78,11 @@
|
|
|
/>
|
|
|
</el-select>
|
|
|
</template>
|
|
|
- <template #append>
|
|
|
- <el-button @click="handleSearch">
|
|
|
- 搜索
|
|
|
- </el-button>
|
|
|
+ <template #suffix>
|
|
|
+ <h-icon
|
|
|
+ class="search-btn"
|
|
|
+ type="search"
|
|
|
+ />
|
|
|
</template>
|
|
|
</el-input>
|
|
|
</div>
|
|
@@ -102,105 +90,73 @@
|
|
|
</div>
|
|
|
|
|
|
<!-- 内容区域 -->
|
|
|
- <template>
|
|
|
- <!-- 协作设备特殊显示 -->
|
|
|
- <el-row :gutter="20" class="camera-cards" v-show="tabActive === 0">
|
|
|
- <template v-if="!loading">
|
|
|
- <el-col
|
|
|
- :span="8"
|
|
|
- v-for="(item, index) in cameraList"
|
|
|
- :key="index"
|
|
|
- class="camera-item"
|
|
|
- >
|
|
|
- <div class="card-wrapper">
|
|
|
- <el-checkbox
|
|
|
- v-model="item.selected"
|
|
|
- @change="handleItemSelect(item)"
|
|
|
- class="item-checkbox"
|
|
|
- />
|
|
|
- <camera-item
|
|
|
- :item="item"
|
|
|
- @handleCooperation="handleCooperation"
|
|
|
- @unbind="unbind"
|
|
|
- @renew="handleRenew"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </template>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <!-- TableList组件 - 支持列表和卡片视图 -->
|
|
|
+ <div class="content-wrapper">
|
|
|
<table-list
|
|
|
- v-show="tabActive !== 0"
|
|
|
- ref="tableRef"
|
|
|
+ :data="cameraList"
|
|
|
+ :header="tabHeader"
|
|
|
+ :selection="tabActive !== 0"
|
|
|
+ :show-card-view="isImgType"
|
|
|
@selection-change="selectHandle"
|
|
|
- @unbind="unbind"
|
|
|
@cooperation="handleCooperation"
|
|
|
+ @unbind="unbind"
|
|
|
@renew="handleRenew"
|
|
|
- :header="tabHeader"
|
|
|
- :selection="cameraList.length > 0"
|
|
|
- :data="cameraList"
|
|
|
- :show-card-view="isImgType"
|
|
|
- :show-line="true"
|
|
|
- class="table-list"
|
|
|
+ ref="tableRef"
|
|
|
>
|
|
|
- <template #item="{ data, type, canclick, item }">
|
|
|
- <template v-if="canclick">
|
|
|
- <span
|
|
|
+ <!-- 自定义插槽内容 -->
|
|
|
+ <template #item="{ data, subKey, type, item, canclick }">
|
|
|
+ <div v-if="type === 'image'" class="flex-avatar">
|
|
|
+ <div v-if="isMember(item)" class="vip-icon"></div>
|
|
|
+ <div v-else-if="isExpiredMember(item)" class="vip-icon vip-expired-icon"></div>
|
|
|
+ <span>{{ data }}</span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-else-if="type === 'qingkuang'">
|
|
|
+ <span>{{ item.usedSpaceStr || '0B' }}/{{ item.totalSpaceStr || '0B' }}</span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-else-if="type === 'spaceEndStr'">
|
|
|
+ <span :class="{ 'text-danger': isExpired(item) }">
|
|
|
+ {{ data || '-' }}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-else-if="canclick && subKey === 'operation'" class="operation-buttons">
|
|
|
+ <span
|
|
|
+ v-if="tabActive === 0"
|
|
|
class="table-btn"
|
|
|
@click="handleCooperation(item)"
|
|
|
- v-if="item.status !== 0"
|
|
|
>
|
|
|
- 协作列表
|
|
|
+ 协作
|
|
|
</span>
|
|
|
-
|
|
|
- <span class="info-wrapper">
|
|
|
- <span class="table-btn" @mouseover="showInfo = item.id" @mouseout="showInfo = null">
|
|
|
- 详细信息
|
|
|
+ <template v-else>
|
|
|
+ <span
|
|
|
+ class="table-btn"
|
|
|
+ @click="handleCooperation(item)"
|
|
|
+ style="margin-right: 10px;"
|
|
|
+ >
|
|
|
+ 协作
|
|
|
</span>
|
|
|
- <div
|
|
|
- v-show="showInfo === item.id"
|
|
|
- class="info-tooltip"
|
|
|
+ <span
|
|
|
+ class="table-btn"
|
|
|
+ @click="unbind(item)"
|
|
|
+ style="margin-right: 10px;"
|
|
|
>
|
|
|
- <div class="info-content">
|
|
|
- <span class="th">场景数量</span><span class="th">最后时间</span>
|
|
|
- <span class="td">{{ item.sceneNum || '-' }}</span><span class="td">{{ item.lastTime || '-' }}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </span>
|
|
|
- </template>
|
|
|
-
|
|
|
- <span v-else-if="type === 'image'" class="flex-avatar">
|
|
|
- <span v-if="isMember(item)" class="vip-icon"></span>
|
|
|
- <span v-else-if="isExpiredMember(item)" class="vip-icon vip-expired-icon"></span>
|
|
|
- {{ item.snCode }}
|
|
|
- </span>
|
|
|
-
|
|
|
- <span v-else-if="type === 'qingkuang'">
|
|
|
- <span v-if="item.usedSpaceStr && item.totalSpaceStr && item.totalSpaceStr != '0B'">
|
|
|
- {{ item.usedSpaceStr }}{{ isMember(item) ? "" : ` / ${item.totalSpaceStr}` }}
|
|
|
- </span>
|
|
|
- <span v-else>--</span>
|
|
|
- </span>
|
|
|
-
|
|
|
- <span v-else-if="type === 'spaceEndStr'">
|
|
|
- {{ item.spaceEndStr || "--" }}
|
|
|
- <span v-if="isExpired(item)" class="expired-icon" @mouseover="showCtrls = item.id" @mouseout="showCtrls = null">
|
|
|
- ⚠️
|
|
|
- <div v-show="showCtrls === item.id" class="expired-tooltip">
|
|
|
- <p>{{ isExpired(item) ? '会员已过期' : '会员即将过期' }}</p>
|
|
|
- <div class="ctrls-w">
|
|
|
- <el-button size="small" @click="showCtrls = null">取消</el-button>
|
|
|
- <el-button size="small" type="primary" @click="handleRenew(item)">续费</el-button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </span>
|
|
|
- </span>
|
|
|
+ 解绑
|
|
|
+ </span>
|
|
|
+ <span
|
|
|
+ v-if="item.userIncrementId"
|
|
|
+ class="table-btn"
|
|
|
+ @click="handleRenew(item)"
|
|
|
+ >
|
|
|
+ 续费
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
|
|
|
- <span v-else>{{ data || "-" }}</span>
|
|
|
+ <span v-else>{{ data || '-' }}</span>
|
|
|
</template>
|
|
|
</table-list>
|
|
|
- </template>
|
|
|
+ </div>
|
|
|
|
|
|
<!-- 空状态 -->
|
|
|
<div class="empty-state" v-if="!loading && !total">
|
|
@@ -248,7 +204,6 @@
|
|
|
import { ref, computed, onMounted, watch } from 'vue'
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
import TableList from '@/components/tableList/index.vue'
|
|
|
-import CameraItem from '@/components/CameraItem.vue'
|
|
|
|
|
|
defineOptions({
|
|
|
name: 'DeviceIndex'
|
|
@@ -270,11 +225,11 @@ const searchTypeList = ref([
|
|
|
|
|
|
// 表格头部配置
|
|
|
const tabHeader = ref([
|
|
|
- { key: 'snCode', name: 'S/N码', type: 'image', width: 200 },
|
|
|
- { key: 'status', name: '云容量', width: 100 },
|
|
|
- { key: 'spaceEndStr', name: '到期时间', type: 'spaceEndStr', width: 150 },
|
|
|
- { key: 'qingkuang', name: '协作者', type: 'qingkuang', width: 150 },
|
|
|
- { key: 'operation', name: '操作', canclick: true, width: 200 }
|
|
|
+ { key: 'snCode', name: 'S/N码', type: 'image' },
|
|
|
+ { key: 'status', name: '状态' },
|
|
|
+ { key: 'qingkuang', name: '云容量', type: 'qingkuang' },
|
|
|
+ { key: 'spaceEndStr', name: '到期时间', type: 'spaceEndStr'},
|
|
|
+ { key: 'operation', name: '操作', canclick: true }
|
|
|
])
|
|
|
|
|
|
// 静态设备数据
|
|
@@ -420,7 +375,6 @@ const isImgType = ref(localStorage.getItem("isImgTypeForDevice") !== "false")
|
|
|
const searchKey = ref("")
|
|
|
const loading = ref(false)
|
|
|
const selectedArr = ref<any[]>([])
|
|
|
-const selectAll = ref(false)
|
|
|
const showBinding = ref(false)
|
|
|
const showRenew = ref(false)
|
|
|
const reNewItem = ref<any>({})
|
|
@@ -433,14 +387,16 @@ const totalObj = ref<Record<number, number>>({
|
|
|
0: 0,
|
|
|
4: 0,
|
|
|
10: 0,
|
|
|
- 11: 0
|
|
|
+ 11: 0,
|
|
|
+ 12: 0
|
|
|
})
|
|
|
|
|
|
const oldTotalObj = ref<Record<number, number>>({
|
|
|
0: 0,
|
|
|
4: 0,
|
|
|
10: 0,
|
|
|
- 11: 0
|
|
|
+ 11: 0,
|
|
|
+ 12: 0
|
|
|
})
|
|
|
|
|
|
const filteredData = computed(() => {
|
|
@@ -449,9 +405,10 @@ const filteredData = computed(() => {
|
|
|
// 根据当前标签页过滤
|
|
|
data = mockCameraData.value.filter(item => {
|
|
|
if (tabActive.value === 0) return item.status === 0 // 协作设备
|
|
|
- if (tabActive.value === 4) return item.goodsId === 0 // 我的设备(排除充值设备)
|
|
|
+ if (tabActive.value === 4) return item.goodsId === 0 && item.status !== 0 // 我的设备(排除充值设备,排除协作设备)
|
|
|
if (tabActive.value === 10) return item.cooperationUserName && item.goodsId === 0 // 共享设备(有协作用户)
|
|
|
if (tabActive.value === 11) return item.goodsId === 1 || item.goodsId === 8 // 租赁设备(充值设备)
|
|
|
+ if (tabActive.value === 12) return item.cameraType === 12 // 四维深巡
|
|
|
return true
|
|
|
})
|
|
|
|
|
@@ -472,7 +429,6 @@ const filteredData = computed(() => {
|
|
|
|
|
|
const cameraList = computed(() => {
|
|
|
const data = filteredData.value
|
|
|
- console.log(data, 888)
|
|
|
// 分页
|
|
|
const start = (currentPage.value - 1) * pageSize.value
|
|
|
const end = start + pageSize.value
|
|
@@ -498,9 +454,10 @@ const handleTabClick = (tab: any) => {
|
|
|
const updateTotalCount = () => {
|
|
|
// 更新各个标签的数量
|
|
|
totalObj.value[0] = mockCameraData.value.filter(item => item.status === 0).length // 协作设备
|
|
|
- totalObj.value[4] = mockCameraData.value.filter(item => item.goodsId === 0).length // 我的设备(排除充值设备)
|
|
|
+ totalObj.value[4] = mockCameraData.value.filter(item => item.goodsId === 0 && item.status !== 0).length // 我的设备(排除充值设备,排除协作设备)
|
|
|
totalObj.value[10] = mockCameraData.value.filter(item => item.cooperationUserName && item.goodsId === 0).length // 共享设备(有协作用户)
|
|
|
totalObj.value[11] = mockCameraData.value.filter(item => item.goodsId === 1 || item.goodsId === 8).length // 租赁设备(充值设备)
|
|
|
+ totalObj.value[12] = mockCameraData.value.filter(item => item.cameraType === 12).length // 四维深巡
|
|
|
|
|
|
oldTotalObj.value = { ...totalObj.value }
|
|
|
}
|
|
@@ -514,18 +471,9 @@ const handleSearch = () => {
|
|
|
currentPage.value = 1
|
|
|
}
|
|
|
|
|
|
-const handleSelectAll = (val: boolean) => {
|
|
|
- cameraList.value.forEach(item => {
|
|
|
- item.selected = val
|
|
|
- })
|
|
|
- updateSelectedArr()
|
|
|
-}
|
|
|
|
|
|
-const handleItemSelect = (_item: any) => {
|
|
|
+const handleItemSelect = () => {
|
|
|
updateSelectedArr()
|
|
|
-
|
|
|
- // 更新全选状态
|
|
|
- selectAll.value = cameraList.value.every(item => item.selected)
|
|
|
}
|
|
|
|
|
|
const updateSelectedArr = () => {
|
|
@@ -632,22 +580,31 @@ onMounted(() => {
|
|
|
// 监听器
|
|
|
watch(tabActive, () => {
|
|
|
selectedArr.value = []
|
|
|
- selectAll.value = false
|
|
|
})
|
|
|
</script>
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
.camera-page {
|
|
|
- padding: 30px;
|
|
|
- background: #fff;
|
|
|
- min-height: calc(100vh - 60px);
|
|
|
+ padding: 20px 30px!important;
|
|
|
}
|
|
|
|
|
|
.camera-header {
|
|
|
- margin-bottom: 20px;
|
|
|
|
|
|
:deep(.el-tabs__header) {
|
|
|
- margin-bottom: 20px;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ .el-tabs__item{
|
|
|
+ font-size: 16px;
|
|
|
+ }
|
|
|
+ .el-tabs__item.is-active, .el-tabs__item:hover{
|
|
|
+ color: #15bec8;
|
|
|
+ }
|
|
|
+ .el-tabs__active-bar{
|
|
|
+ background-color: #15bec8;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.el-tabs__nav-wrap:after) {
|
|
|
+ height: 0;
|
|
|
}
|
|
|
|
|
|
.main-list {
|
|
@@ -660,20 +617,19 @@ watch(tabActive, () => {
|
|
|
.btns {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- gap: 10px;
|
|
|
+ gap: 20px;
|
|
|
|
|
|
- .all-select {
|
|
|
- &.disable {
|
|
|
- opacity: 0.5;
|
|
|
- pointer-events: none;
|
|
|
- }
|
|
|
+ .selection-info {
|
|
|
+ color: #15bec8;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 500;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.rig-con {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- gap: 10px;
|
|
|
+ gap: 20px;
|
|
|
|
|
|
.view-toggle {
|
|
|
margin: 0 10px;
|
|
@@ -694,6 +650,9 @@ watch(tabActive, () => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ :deep(.el-input-group__prepend .el-select){
|
|
|
+ margin: 0!important;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -798,4 +757,18 @@ watch(tabActive, () => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.content-wrapper {
|
|
|
+ margin: 20px 0;
|
|
|
+}
|
|
|
+
|
|
|
+.operation-buttons {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.text-danger {
|
|
|
+ color: #f56c6c;
|
|
|
+}
|
|
|
</style>
|