forked from kongfp/Tp_Web2.0
feat: 视频分析页开发
parent
402ca4719e
commit
fff9fc175c
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,318 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { PureTable } from "@pureadmin/table";
|
||||||
|
import { type PaginationProps } from "@pureadmin/table";
|
||||||
|
import { onMounted, ref, reactive } from "vue";
|
||||||
|
import { useWindowSize } from "@vueuse/core";
|
||||||
|
import { getVideoList } from "@/api/videoParse";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "VideoList"
|
||||||
|
});
|
||||||
|
|
||||||
|
const formInline = reactive({
|
||||||
|
date: "",
|
||||||
|
violation: ""
|
||||||
|
});
|
||||||
|
function pickerOptions(time) {
|
||||||
|
return time.getTime() > Date.now();
|
||||||
|
}
|
||||||
|
const now_date = new Date();
|
||||||
|
now_date.setMonth(now_date.getMonth() - 1);
|
||||||
|
const lastMonth = now_date;
|
||||||
|
const tableData = ref([]);
|
||||||
|
// const violationMap = ref({
|
||||||
|
// 疑似静止: "0",
|
||||||
|
// 疑似遮挡: "1",
|
||||||
|
// 疑似抖动: "2",
|
||||||
|
// 疑似递烟: "3",
|
||||||
|
// 疑似递钱: "4"
|
||||||
|
// });
|
||||||
|
const options = [
|
||||||
|
{
|
||||||
|
value: "疑似静止",
|
||||||
|
label: "疑似静止"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "疑似遮挡",
|
||||||
|
label: "疑似遮挡"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "疑似抖动",
|
||||||
|
label: "疑似抖动"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "疑似递烟",
|
||||||
|
label: "疑似递烟"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "疑似递钱",
|
||||||
|
label: "疑似递钱"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
const { height } = useWindowSize();
|
||||||
|
const tableSize = ref("default");
|
||||||
|
const columns: TableColumnList = [
|
||||||
|
{
|
||||||
|
label: "序号",
|
||||||
|
type: "index",
|
||||||
|
width: 70,
|
||||||
|
fixed: "left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "视频名称",
|
||||||
|
// width: 200,
|
||||||
|
prop: "video_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "日期",
|
||||||
|
prop: "video_date",
|
||||||
|
// width: 140,
|
||||||
|
sortable: true
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: "异常数量",
|
||||||
|
// width: 100,
|
||||||
|
prop: "abnormal_count"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "异常表现",
|
||||||
|
prop: "abnormal_performance",
|
||||||
|
width: 370,
|
||||||
|
slot: "violation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "文件地址",
|
||||||
|
prop: "video_path"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "操作",
|
||||||
|
fixed: "right",
|
||||||
|
// width: 160,
|
||||||
|
slot: "operation"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
function tagStyle(type) {
|
||||||
|
switch (type) {
|
||||||
|
case "疑似遮挡":
|
||||||
|
return "span-occlusion";
|
||||||
|
case "疑似递烟":
|
||||||
|
return "span-smoke";
|
||||||
|
case "疑似递钱":
|
||||||
|
return "span-money";
|
||||||
|
case "疑似静止":
|
||||||
|
return "span-stillness";
|
||||||
|
default:
|
||||||
|
return "span-shake";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async function onSearch() {
|
||||||
|
const params = {
|
||||||
|
start_time: formInline.date === null ? undefined : formInline.date[0],
|
||||||
|
end_time: formInline.date === null ? undefined : formInline.date[1],
|
||||||
|
abnormal_behavior: formInline.violation || undefined,
|
||||||
|
page: pagination.currentPage || undefined,
|
||||||
|
page_size: pagination.pageSize || undefined
|
||||||
|
};
|
||||||
|
const { results, count } = await getVideoList(params);
|
||||||
|
pagination.total = count;
|
||||||
|
tableData.value = results;
|
||||||
|
setTimeout(() => {
|
||||||
|
loading.value = false;
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
function handleSearch() {
|
||||||
|
pagination.currentPage = 1;
|
||||||
|
onSearch();
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleRefresh() {
|
||||||
|
Object.assign(formInline, { date: "", violation: "" });
|
||||||
|
onSearch();
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSizeChange(val) {
|
||||||
|
pagination.pageSize = val;
|
||||||
|
onSearch();
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleCurrentChange(val) {
|
||||||
|
pagination.currentPage = val;
|
||||||
|
onSearch();
|
||||||
|
}
|
||||||
|
const router = useRouter();
|
||||||
|
function handleProductDetail(product) {
|
||||||
|
// 保存信息到标签页
|
||||||
|
useMultiTagsStoreHook().handleTags("push", {
|
||||||
|
path: `/videoParse/index`,
|
||||||
|
name: "VideoParsePage",
|
||||||
|
query: product,
|
||||||
|
meta: {
|
||||||
|
title: `视频分析`,
|
||||||
|
showLink: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
router.push({ name: "VideoParsePage", query: product });
|
||||||
|
}
|
||||||
|
const loading = ref(true);
|
||||||
|
const pagination = reactive<PaginationProps>({
|
||||||
|
total: 0,
|
||||||
|
pageSize: 15,
|
||||||
|
currentPage: 1,
|
||||||
|
background: true
|
||||||
|
});
|
||||||
|
onMounted(() => {
|
||||||
|
onSearch();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="main">
|
||||||
|
<h2 class="mb-4 text-xl">视频分析</h2>
|
||||||
|
<el-card shadow="never" :style="{ height: `calc(${height}px - 140px)` }">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span class="font-semibold">异常分析</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<el-form
|
||||||
|
:inline="true"
|
||||||
|
:model="formInline"
|
||||||
|
class="search-form bg-bg_color w-[99/100]"
|
||||||
|
>
|
||||||
|
<el-form-item style="margin-right: 10px">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formInline.date"
|
||||||
|
type="daterange"
|
||||||
|
unlink-panels
|
||||||
|
range-separator="~"
|
||||||
|
start-placeholder="起始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
:disabled-date="pickerOptions"
|
||||||
|
:default-value="lastMonth"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item style="margin-right: 12px">
|
||||||
|
<el-select
|
||||||
|
v-model="formInline.violation"
|
||||||
|
placeholder="异常表现"
|
||||||
|
multiple
|
||||||
|
collapse-tags
|
||||||
|
collapse-tags-tooltip
|
||||||
|
clearable
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in options"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleSearch">查询</el-button>
|
||||||
|
<el-button @click="handleRefresh">重置 </el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<!-- <PureTableBar title="" :columns="columns" @refresh="onSearch"> -->
|
||||||
|
<!-- <template v-slot="{ size, columns }"> -->
|
||||||
|
<pure-table
|
||||||
|
adaptive
|
||||||
|
align-whole="left"
|
||||||
|
table-layout="auto"
|
||||||
|
:loading="loading"
|
||||||
|
:data="tableData"
|
||||||
|
showOverflowTooltip
|
||||||
|
:columns="columns"
|
||||||
|
:pagination="pagination"
|
||||||
|
:paginationSmall="tableSize === 'small' ? true : false"
|
||||||
|
:header-cell-style="{
|
||||||
|
background: 'var(--el-table-row-hover-bg-color)',
|
||||||
|
color: 'var(--el-text-color-primary)'
|
||||||
|
}"
|
||||||
|
@page-size-change="handleSizeChange"
|
||||||
|
@page-current-change="handleCurrentChange"
|
||||||
|
>
|
||||||
|
<template #violation="{ row }">
|
||||||
|
<!-- {{ row.is_violation ? "是" : "否" }} -->
|
||||||
|
<span
|
||||||
|
:class="tagStyle(item)"
|
||||||
|
v-for="(item, index) in row.abnormal_performance"
|
||||||
|
:key="index"
|
||||||
|
>{{ item }}</span
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
<template #operation="{ row }">
|
||||||
|
<el-button
|
||||||
|
class="reset-margin"
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="handleProductDetail(row)"
|
||||||
|
>
|
||||||
|
详情
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</pure-table>
|
||||||
|
<!-- </template> -->
|
||||||
|
<!-- </PureTableBar> -->
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.span-occlusion,
|
||||||
|
.span-smoke,
|
||||||
|
.span-money,
|
||||||
|
.span-stillness,
|
||||||
|
.span-shake {
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: inline-block;
|
||||||
|
width: 64px;
|
||||||
|
height: 24px;
|
||||||
|
margin-right: 10px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: rgb(247 95 25 / 100%);
|
||||||
|
text-align: center;
|
||||||
|
background: rgb(247 112 49 / 10%);
|
||||||
|
border: 1px solid #f75f19;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.span-smoke {
|
||||||
|
color: rgb(2 36 215 / 100%);
|
||||||
|
background: rgb(2 36 215 / 10%);
|
||||||
|
border: 1px solid rgb(2 36 215 / 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.span-money {
|
||||||
|
color: rgb(232 13 13 / 100%);
|
||||||
|
background: rgb(232 13 13 / 10%);
|
||||||
|
border: 1px solid rgb(232 13 13 / 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.span-stillness {
|
||||||
|
color: rgb(68 174 245 / 100%);
|
||||||
|
background: rgb(68 174 245 / 10%);
|
||||||
|
border: 1px solid rgb(68 174 245 / 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.span-shake {
|
||||||
|
color: rgb(246 148 0 / 100%);
|
||||||
|
background: rgb(246 148 0 / 10%);
|
||||||
|
border: 1px solid rgb(246 148 0 / 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.reset-margin {
|
||||||
|
color: #e80d0d;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #e80d0d;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue