From d01700754282efce449ab8b8c1191a21419eb82f Mon Sep 17 00:00:00 2001
From: hanbaoshan <hanbaoshan@aiotlink.com>
Date: 星期五, 08 一月 2021 21:10:24 +0800
Subject: [PATCH] 朔黄视频分析项目添加
---
src/pages/shuohuangMonitorAnalyze/components/transferMemo.vue | 85 +
src/pages/shuohuangMonitorAnalyze/index/mixins.ts | 28
vue.config.js | 4
src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue | 943 +++++++++++++++++++++
src/pages/shuohuangMonitorAnalyze/index/main.ts | 15
public/apps.json | 23
src/pages/shuohuangMonitorAnalyze/components/memberManage.vue | 393 ++++++++
src/api/shuohuang.ts | 16
src/pages/shuohuangMonitorAnalyze/components/configManage.vue | 139 +++
src/pages/shuohuangMonitorAnalyze/index/App.vue | 102 ++
src/pages/shuohuangMonitorAnalyze/components/taskManage.vue | 279 ++++++
public/images/shuohuang/railroad.png | 0
src/Pool/TreeData.ts | 313 +++---
src/pages/shuohuangMonitorAnalyze/components/transferDeviceManage.vue | 124 ++
src/pages/shuohuangMonitorAnalyze/components/leftNav.vue | 107 ++
src/pages/panoramicView/components/TracePlot.vue | 2
src/pages/shuohuangMonitorAnalyze/components/topNav.vue | 35
17 files changed, 2,448 insertions(+), 160 deletions(-)
diff --git a/public/apps.json b/public/apps.json
index 3117b98..140d262 100644
--- a/public/apps.json
+++ b/public/apps.json
@@ -391,6 +391,29 @@
"installed": true,
"isUpgrade": false,
"progressMsg": ""
+ },{
+
+ "id": "fa5674ee-70cf-4e22-8a06-c17429fb777",
+ "name": "涔樺姟鍛樺畨鍏ㄨ涓哄垎鏋�",
+ "package": "shuohuangMonitorAnalyze",
+ "type": "1",
+ "url": "/view/shuohuangMonitorAnalyze/",
+ "title": "涔樺姟鍛樺畨鍏ㄨ涓哄垎鏋�",
+ "width": 1500,
+ "height": 750,
+ "iconBlob": "",
+ "icon": "../../images/app-mid/visual.png",
+ "version": "1.0.0",
+ "create_time": "2020-10-09 14:00:08",
+ "create_by": "",
+ "update_time": "",
+ "update_by": "",
+ "isDelete": 0,
+ "isDefault": false,
+ "remoteVersion": "",
+ "installed": true,
+ "isUpgrade": false,
+ "progressMsg": ""
}
],
"msg": "璇锋眰澶勭悊鎴愬姛",
diff --git a/public/images/shuohuang/railroad.png b/public/images/shuohuang/railroad.png
new file mode 100644
index 0000000..1486b69
--- /dev/null
+++ b/public/images/shuohuang/railroad.png
Binary files differ
diff --git a/src/Pool/TreeData.ts b/src/Pool/TreeData.ts
index 7ab436f..cbb1fde 100644
--- a/src/Pool/TreeData.ts
+++ b/src/Pool/TreeData.ts
@@ -7,140 +7,136 @@
updateAreaTreeData,
refreshGB28181Tree,
updateCameraArea
-} from "@/api/area";
-import {
- findAllFile,
- show,
- changeEnable
-} from "@/api/localVedio";
+} from '@/api/area'
+import { findAllFile, show, changeEnable } from '@/api/localVedio'
export default class TreeDataPool {
- public openeds: Array<boolean>;
- public treeData: Array<object>;
- public clusterData: Array<object>;
- public gb28181Data: Array<object>;
- public treeDataPure: Array<object>;
- public gb28181DataPure: Array<object>;
- public clusterDataPure: Array<object>;
- public videoArr: Array<string | undefined | object>;
- public searchCamType: number;
- public searchInput: string;
- public activeVideoIndex: number | string;
- public activeVideoId: number | string;
- public activeForceChoose: boolean;
- public readonly: boolean;
- public gbReadonly: boolean;
- public multiple: boolean;
- public searchFrom: string = '';
- public showTreeBox: boolean;
- public selectedNodes: Array<string>;
- public selectedNode: any;
+ public openeds: Array<boolean>
+ public treeData: Array<object>
+ public clusterData: Array<object>
+ public gb28181Data: Array<object>
+ public treeDataPure: Array<object>
+ public gb28181DataPure: Array<object>
+ public clusterDataPure: Array<object>
+ public videoArr: Array<string | undefined | object>
+ public searchCamType: number
+ public searchInput: string
+ public activeVideoIndex: number | string
+ public activeVideoId: number | string
+ public activeForceChoose: boolean
+ public readonly: boolean
+ public gbReadonly: boolean
+ public multiple: boolean
+ public searchFrom: string = ''
+ public showTreeBox: boolean
+ public selectedNodes: Array<string>
+ public selectedNode: any
// 璁板綍褰撳墠鎿嶄綔鐨勬爲
- public treeType: string;
+ public treeType: string
// 璁板綍鏀惰捣鐨勮妭鐐�
- public foldNodeList: object;
+ public foldNodeList: object
//璁板綍宸︿晶tab锛歛ctiveName
- public treeActiveName: string;
+ public treeActiveName: string
//鏈湴瑙嗛锛氳棰戝垎鏋愬鐞�
- public vedioAnaliyseSwitch: boolean;
+ public vedioAnaliyseSwitch: boolean
//鏈湴瑙嗛鍒楄〃
- public localVedioList: Array<any>;
+ public localVedioList: Array<any>
//鏈湴瑙嗛褰撳墠椤�
- public localCurrentPage: number;
+ public localCurrentPage: number
//鏈湴瑙嗛姣忛〉鏌ヨ20鏉�
- public localPageSize: number;
+ public localPageSize: number
//鏈湴瑙嗛鎬绘潯鏁�
- public localTotal: number;
+ public localTotal: number
//鍕鹃�夌殑鏈湴瑙嗛
- public checkedLocalVedio: Array<any>;
+ public checkedLocalVedio: Array<any>
//褰撳墠閫変腑鐨勬湰鍦拌棰�
- public clickLocalVideo: object;
+ public clickLocalVideo: object
//鎺у埗寮�濮嬨�佹殏鍋滄寜閽樉绀虹姸鎬�
- public btnStaus: string;
+ public btnStaus: string
//鏈湴瑙嗛绫诲瀷
- public searchLocalType: number;
+ public searchLocalType: number
//璁板綍澶嶅埗鐨勬憚鍍忔満id
- public ctrlCameraId: string;
+ public ctrlCameraId: string
//璁板綍澶嶅埗鐨勬憚鍍忔満name
- public ctrlCameraName: string;
+ public ctrlCameraName: string
constructor() {
- this.openeds = [true, true, false];
- this.treeData = [];
- this.gb28181Data = [];
- this.clusterData = [];
- this.treeDataPure = [];
- this.gb28181DataPure = [];
- this.clusterDataPure = [];
- this.videoArr = [""];
- this.searchCamType = 0;
- this.searchInput = "";
- this.activeVideoIndex = "";
- this.activeVideoId = "";
- this.activeForceChoose = false;
- this.showTreeBox = true;
- this.readonly = true;
- this.gbReadonly = true;
- this.multiple = false;
- this.selectedNodes = [];
- this.selectedNode = {};
- this.treeType = "";
- this.foldNodeList = {};
- this.vedioAnaliyseSwitch = false;
- this.treeActiveName = "camera";
- this.searchLocalType = 0;
- this.localVedioList = [];
- this.checkedLocalVedio = [];
- this.clickLocalVideo = {};
+ this.openeds = [true, true, false]
+ this.treeData = []
+ this.gb28181Data = []
+ this.clusterData = []
+ this.treeDataPure = []
+ this.gb28181DataPure = []
+ this.clusterDataPure = []
+ this.videoArr = ['']
+ this.searchCamType = 0
+ this.searchInput = ''
+ this.activeVideoIndex = ''
+ this.activeVideoId = ''
+ this.activeForceChoose = false
+ this.showTreeBox = true
+ this.readonly = true
+ this.gbReadonly = true
+ this.multiple = false
+ this.selectedNodes = []
+ this.selectedNode = {}
+ this.treeType = ''
+ this.foldNodeList = {}
+ this.vedioAnaliyseSwitch = false
+ this.treeActiveName = 'camera'
+ this.searchLocalType = 0
+ this.localVedioList = []
+ this.checkedLocalVedio = []
+ this.clickLocalVideo = {}
//1:鏆傚仠鐘舵�侊紱2锛氱瓑寰呯姸鎬�;3:缃伆
- this.btnStaus = "3";
- this.localCurrentPage = 1;
- this.localPageSize = 20;
- this.localTotal = 0;
- this.ctrlCameraId = "";
- this.ctrlCameraName = "";
+ this.btnStaus = '3'
+ this.localCurrentPage = 1
+ this.localPageSize = 20
+ this.localTotal = 0
+ this.ctrlCameraId = ''
+ this.ctrlCameraName = ''
}
setVideoArr(index: number, value: object, vue: any): void {
- vue.$set(this.videoArr, index, value);
- this.activeForceChoose = false;
+ vue.$set(this.videoArr, index, value)
+ this.activeForceChoose = false
}
updateSelectedNodes() {
- this.selectedNodes = [];
+ this.selectedNodes = []
if (!this.multiple) {
- this.selectedNodes = [this.selectedNode.id];
- return;
+ this.selectedNodes = [this.selectedNode.id]
+ return
}
- let _selected = this.selectedNodes;
+ let _selected = this.selectedNodes
console.log(this.selectedNodes)
function nodeFilter(node: any) {
- if (node.type === "4" && node.selected) {
- _selected.push(node.id);
+ if (node.type === '4' && node.selected) {
+ _selected.push(node.id)
}
if (node.children) {
node.children.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
}
}
if (this.selectedNode.cameraType === 0) {
//鎽勫儚鏈烘爲
- if(this.treeActiveName == "camera"){
+ if (this.treeActiveName == 'camera') {
this.treeData.forEach((n: any) => {
- nodeFilter(n);
- });
- }else if(this.treeActiveName == "cluster"){
+ nodeFilter(n)
+ })
+ } else if (this.treeActiveName == 'cluster') {
//闆嗙兢鏍�
this.clusterData.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
}
}
if (this.selectedNode.cameraType === 1) {
this.gb28181Data.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
}
// if (this.selectedNode.cameraType === -1) {
// this.clusterData.forEach((n: any) => {
@@ -150,105 +146,105 @@
}
getCameraInfoByIp(ipaddr) {
- let camera = null;
-
+ let camera = null
+
function nodeFilter(node: any) {
if (node.rtsp && node.rtsp.indexOf(ipaddr) != -1) {
- camera = node;
- return;
+ camera = node
+ return
}
if (node.children) {
node.children.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
}
}
this.treeData.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
if (!camera) {
this.gb28181Data.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
}
- return camera;
+ return camera
}
getCameraInfoById(id) {
- let camera = null;
+ let camera = null
function nodeFilter(node: any) {
if (node.id === id) {
- camera = node;
- return;
+ camera = node
+ return
}
if (node.children) {
node.children.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
}
}
this.treeData.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
if (!camera) {
this.gb28181Data.forEach((n: any) => {
- nodeFilter(n);
- });
+ nodeFilter(n)
+ })
}
- return camera;
+ return camera
}
getParent(id: string, isGB: boolean): string {
- let parent = "0";
+ let parent = '0'
function nodeFilter(node: Array<any>): any {
for (let i = 0; i < node.length; i++) {
if (node[i].id == id) {
- return true;
+ return true
}
if (node[i].children && node[i].children.length > 0) {
if (nodeFilter(node[i].children)) {
- parent = node[i].id;
+ parent = node[i].id
}
}
}
- return false;
+ return false
}
if (isGB) {
- nodeFilter(this.gb28181Data);
+ nodeFilter(this.gb28181Data)
} else {
- nodeFilter(this.treeData);
+ nodeFilter(this.treeData)
}
- return parent;
+ return parent
}
clean() {
- this.treeData = JSON.parse(JSON.stringify(this.treeDataPure));
- this.gb28181Data = JSON.parse(JSON.stringify(this.gb28181DataPure));
+ this.treeData = JSON.parse(JSON.stringify(this.treeDataPure))
+ this.gb28181Data = JSON.parse(JSON.stringify(this.gb28181DataPure))
this.isFold(this.treeData)
this.isFold(this.gb28181Data)
- this.selectedNodes = [];
- this.selectedNode = {};
+ this.selectedNodes = []
+ this.selectedNode = {}
- this.cleanLocalVedio();
+ this.cleanLocalVedio()
}
cleanTree(tree) {
- if (tree === "localTree") {
- this.treeData = JSON.parse(JSON.stringify(this.treeDataPure));
+ if (tree === 'localTree') {
+ this.treeData = JSON.parse(JSON.stringify(this.treeDataPure))
}
- if (tree === "gb28182Tree") {
- this.gb28181Data = JSON.parse(JSON.stringify(this.gb28181DataPure));
+ if (tree === 'gb28182Tree') {
+ this.gb28181Data = JSON.parse(JSON.stringify(this.gb28181DataPure))
}
}
@@ -258,7 +254,7 @@
}
node.forEach(n => {
if (this.foldNodeList[n.id]) {
- n.opened = false;
+ n.opened = false
}
if (n.children && n.children.length > 0) {
this.isFold(n.children)
@@ -274,8 +270,8 @@
if (n.children && n.children.length > 0) {
this.setDropDisable(n.children)
} else {
- if (n.type === "4") {
- n.dropDisabled = true;
+ if (n.type === '4') {
+ n.dropDisabled = true
}
}
})
@@ -285,17 +281,17 @@
if (!node) {
return
}
- node.sort(function (obj1: any, obj2: any) {
- var val1 = obj1.name;
- var val2 = obj2.name;
+ node.sort(function(obj1: any, obj2: any) {
+ var val1 = obj1.name
+ var val2 = obj2.name
if (val1 < val2) {
- return -1;
+ return -1
} else if (val1 > val2) {
- return 1;
+ return 1
} else {
- return 0;
+ return 0
}
- });
+ })
node.forEach(n => {
if (n.children && n.children.length > 0) {
@@ -307,13 +303,13 @@
async fetchLocalTree() {
let params: any = {
searchType: this.searchCamType,
- cameraName: this.searchInput,
+ cameraName: this.searchInput
//isPlatform: 1
- };
+ }
if (this.searchFrom == 'cluster') {
params.isPlatform = 1
}
- const rsp: any = await getLocalCameraTree(params);
+ const rsp: any = await getLocalCameraTree(params)
if (rsp && rsp.success) {
this.treeData = rsp.data ? rsp.data : []
@@ -323,23 +319,23 @@
// 璁剧疆绂佹鎷栨嫿鎽勫儚鏈哄埌鎽勫儚鏈鸿妭鐐�
this.setDropDisable(this.treeData)
- this.treeDataPure = JSON.parse(JSON.stringify(this.treeData));
+ this.treeDataPure = JSON.parse(JSON.stringify(this.treeData))
this.isFold(this.treeData)
}
}
-
+
async fetchClusterTree() {
const rsp: any = await getClusterTree({
searchType: this.searchCamType,
cameraName: this.searchInput
- });
+ })
if (rsp && rsp.success) {
- console.log(rsp.data);
+ console.log(rsp.data)
this.clusterData = rsp.data ? rsp.data : []
if (this.clusterData && this.clusterData.length > 0) {
this.sortTreeData(this.clusterData)
}
- this.clusterDataPure = JSON.parse(JSON.stringify(this.clusterData));
+ this.clusterDataPure = JSON.parse(JSON.stringify(this.clusterData))
this.isFold(this.clusterData)
}
}
@@ -348,7 +344,7 @@
const rsp: any = await getGB28181CameraTree({
searchType: this.searchCamType,
cameraName: this.searchInput
- });
+ })
if (rsp && rsp.success) {
this.gb28181Data = rsp.data ? rsp.data : []
@@ -356,7 +352,7 @@
this.sortTreeData(this.gb28181Data)
}
- this.gb28181DataPure = JSON.parse(JSON.stringify(this.gb28181Data));
+ this.gb28181DataPure = JSON.parse(JSON.stringify(this.gb28181Data))
this.isFold(this.gb28181Data)
}
}
@@ -376,17 +372,17 @@
await addAreaTreeData({
name: name,
parentId: parent
- });
+ })
- this.fetchTreeData();
+ this.fetchTreeData()
}
async del(id: string) {
await delAreaTreeData({
id: id
- });
+ })
- this.fetchTreeData();
+ this.fetchTreeData()
}
async update(name: string, id: string, alias: string, isGb: boolean) {
@@ -395,9 +391,9 @@
name: name,
parentId: this.getParent(id, isGb),
alias: alias
- });
+ })
- this.fetchTreeData();
+ this.fetchTreeData()
}
async refreshGB28181() {
@@ -406,8 +402,7 @@
}
async findAllFile(params: any) {
- params.fileName = this.searchInput,
- params.type = this.searchLocalType
+ ;(params.fileName = this.searchInput), (params.type = this.searchLocalType)
params.page = this.localCurrentPage
params.size = this.localPageSize
let res: any = await findAllFile(params)
@@ -422,7 +417,7 @@
}
if (!i.snapshot_url) {
// obj.snapshot_url = require('@/assets/nobody.png')
- obj.snapshot_url = ""
+ obj.snapshot_url = ''
} else {
obj.snapshot_url = '/httpImage/' + obj.snapshot_url
}
@@ -469,7 +464,7 @@
if (this.checkedLocalVedio.length === 0) {
this.btnStaus = '3'
- return false;
+ return false
}
this.checkedLocalVedio.every((i, index) => {
let t = ''
@@ -505,7 +500,7 @@
i.clickStatus = false
})
this.checkedLocalVedio = []
- this.btnStaus = "3"
+ this.btnStaus = '3'
}
async dropNode(cameraId, areaId) {
diff --git a/src/api/shuohuang.ts b/src/api/shuohuang.ts
new file mode 100644
index 0000000..c2a5273
--- /dev/null
+++ b/src/api/shuohuang.ts
@@ -0,0 +1,16 @@
+import request from "@/scripts/httpRequest";
+
+//鍒濆鍖栨煡璇�
+export const getlstInit = (query:any)=>request({
+ url:'/data/api-c/lkg/findlstA',
+ method:'get',
+ params: query
+});
+export const getShuohuangDepartTree = ()=>request({
+ url: '/data/api-c/dept/getlstWithUser',
+ method: 'get'
+});
+export const getOrganizeTree = ()=>request({
+ url:'/data/api-c/dept/getlstWithOutUser',
+ method: 'get'
+});
diff --git a/src/pages/panoramicView/components/TracePlot.vue b/src/pages/panoramicView/components/TracePlot.vue
index a164bc0..966368a 100644
--- a/src/pages/panoramicView/components/TracePlot.vue
+++ b/src/pages/panoramicView/components/TracePlot.vue
@@ -127,7 +127,7 @@
return;
}
//鍒ゆ柇鏄惁鏄煡鍘嗗彶鏁版嵁
- if (this.searchTime[1] < Date.now()) {
+ if (Date.parse(this.searchTime[1]) < Date.now()) {
this.filterData()
} else {
this.activeObjHashMap = {};
diff --git a/src/pages/shuohuangMonitorAnalyze/components/configManage.vue b/src/pages/shuohuangMonitorAnalyze/components/configManage.vue
new file mode 100644
index 0000000..382d0b0
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/components/configManage.vue
@@ -0,0 +1,139 @@
+<template>
+ <div class="config-manage">
+ <el-collapse v-model="activeNames" @change="handleChange">
+ <el-collapse-item title="瀛樺偍璁剧疆" name="1">
+ <div class="memory-setting">
+ <div class="flex-box">
+ <div>
+ <label>鍘熷瑙嗛淇濆瓨鍒板瓨鍌ㄦ湇鍔″櫒</label>
+ <el-switch
+ v-model="memoryServe"
+ active-color="#409eff"
+ inactive-color="#dcdfe6"
+ :active-value="true"
+ :inactive-value="false"
+ size="small"
+ ></el-switch>
+ </div>
+ <div>
+ <label>瀛樺偍鏃堕棿</label>
+ <el-select v-model="memoryTime" size="small">
+ <el-option value="week">涓�鍛�</el-option>
+ <el-option value="month">涓�涓湀</el-option>
+ </el-select>
+ </div>
+ </div>
+ <div class="flex-box">
+ <div>
+ <label>瑙嗛杞偍瀹屾垚鍚庢牸寮忓寲纭洏</label>
+ <el-switch
+ v-model="format"
+ active-color="#409eff"
+ inactive-color="#dcdfe6"
+ :active-value="true"
+ :inactive-value="false"
+ size="small"
+ ></el-switch>
+ </div>
+ </div>
+ <div class="flex-box">
+ <div>
+ <label>瑙嗛鏂囦欢瓒呭嚭鏃堕棿鑷姩鍒犻櫎</label>
+ <el-switch
+ v-model="autoRemove"
+ active-color="#409eff"
+ inactive-color="#dcdfe6"
+ :active-value="true"
+ :inactive-value="false"
+ size="small"
+ ></el-switch>
+ </div>
+ <div>
+ <label>鍒犻櫎鏃堕棿</label>
+ <el-select v-model="removeTime" size="small">
+ <el-option value="week">涓�鍛�</el-option>
+ <el-option value="month">涓�涓湀</el-option>
+ </el-select>
+ </div>
+ </div>
+ </div>
+ </el-collapse-item>
+ <el-collapse-item title="鍒嗘瀽璁剧疆" name="2">
+ <div class="analyze-setting">
+ <div class="flex-box">
+ <div>
+ <label>瑙嗛鍒嗘瀽鍛ㄦ湡:</label>
+ <el-input-number
+ v-model="analyzePeriod"
+ controls-position="right"
+ :min="1"
+ :max="10"
+ size="small"
+ ></el-input-number>
+ </div>
+ </div>
+ </div>
+ </el-collapse-item>
+ <el-collapse-item title="杞偍璁剧疆" name="3"></el-collapse-item>
+ </el-collapse>
+ <div class="btns text-right">
+ <el-button type="primary" size="small">淇濆瓨</el-button>
+ </div>
+ </div>
+</template>
+
+<script>
+export default {
+ data () {
+ return {
+ activeNames: ['1', '2'],
+ memoryServe: false,
+ memoryTime: '',
+ format: false,
+ autoRemove: true,
+ removeTime: '',
+ analyzePeriod: '',
+ }
+ },
+ methods: {
+ handleChange () {
+
+ }
+ }
+}
+</script>
+
+<style lang="scss">
+.config-manage {
+ padding: 20px;
+ .el-collapse-item__header {
+ font-weight: bold;
+ font-size: 15px;
+ }
+ .flex-box {
+ margin-bottom: 10px;
+ & > div {
+ display: flex;
+ align-items: center;
+ margin-right: 10px;
+ & + div {
+ margin-left: 40px;
+ }
+ label {
+ padding-right: 10px;
+ color: #666;
+ }
+ }
+ }
+ .memory-setting {
+ padding-left: 60px;
+ }
+ .analyze-setting {
+ padding-left: 60px;
+ }
+ .btns {
+ text-align: right;
+ padding-top: 20px;
+ }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/components/leftNav.vue b/src/pages/shuohuangMonitorAnalyze/components/leftNav.vue
new file mode 100644
index 0000000..0653bbd
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/components/leftNav.vue
@@ -0,0 +1,107 @@
+<template>
+ <div class="left-nav">
+ <h1>
+ <img class="icon" :src="`${publicPath}images/shuohuang/railroad.png`" style="height: 40px;" />
+ <span v-show="!isCollapse" style="padding-left: 6px;">鏈旈粍閾佽矾鏈鸿締鍒嗗叕鍙�</span>
+ </h1>
+ <el-menu
+ class="el-menu-vertical-demo"
+ @open="handleOpen"
+ @close="handleClose"
+ :collapse="isCollapse"
+ @select="handleSelect"
+ >
+ <el-menu-item index="1">
+ <i class="el-icon-menu"></i>
+ <span slot="title">棣栭〉</span>
+ </el-menu-item>
+ <el-menu-item index="searchForVideoAnalyze">
+ <i class="el-icon-menu"></i>
+ <span slot="title">瑙嗛鍒嗘瀽妫�绱�</span>
+ </el-menu-item>
+ <el-menu-item index="taskManage">
+ <i class="el-icon-menu"></i>
+ <span slot="title">浠诲姟绠$悊</span>
+ </el-menu-item>
+ <el-menu-item index="memberManage">
+ <i class="el-icon-menu"></i>
+ <span slot="title">浜哄憳绠$悊</span>
+ </el-menu-item>
+ <el-menu-item index="configManage">
+ <i class="el-icon-menu"></i>
+ <span slot="title">閰嶇疆绠$悊</span>
+ </el-menu-item>
+
+ <el-submenu index="6">
+ <template slot="title">
+ <i class="el-icon-menu"></i>
+ <span slot="title">杞偍绠$悊</span>
+ </template>
+ <el-menu-item index="transferMemo">瑙嗛杞偍璁板綍</el-menu-item>
+ <el-menu-item index="transferDeviceManage">杞偍璁惧绠$悊</el-menu-item>
+ </el-submenu>
+ <el-submenu index="7">
+ <template slot="title">
+ <i class="el-icon-menu"></i>
+ <span slot="title">鍙鍖栧ぇ灞�</span>
+ </template>
+ <el-menu-item index="7-1">浠诲姟澶у睆</el-menu-item>
+ <el-menu-item index="7-2">闅愭偅澶у睆</el-menu-item>
+ </el-submenu>
+ </el-menu>
+ </div>
+</template>
+
+<script>
+
+//import railroadImg from '/images/shuohuang/railroad.png';
+export default {
+ props: {
+ isCollapse: {
+ type: Boolean,
+ default: true
+ },
+ menuChange: {
+ type: Function
+ }
+ },
+ data () {
+ return {
+ publicPath: process.env.BASE_URL,
+ }
+ },
+ methods: {
+ handleSelect(index,indePath){
+ this.$emit('menuChange',index);
+ },
+ handleOpen () {
+
+ },
+ handleClose () {
+
+ }
+ }
+}
+</script>
+
+<style lang="scss">
+.left-nav {
+ background: #fff;
+ h1 {
+ display: flex;
+ align-items: center;
+ height: 65px;
+ padding: 0 20px;
+ border-bottom: 1px solid #eee;
+ color: rgb(0, 150, 250);
+ }
+ .el-menu-vertical-demo:not(.el-menu--collapse){
+ width: 250px;
+ }
+ .el-menu-item,
+ .el-submenu__title {
+ text-align: left;
+ }
+ height: 100vh;
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/components/memberManage.vue b/src/pages/shuohuangMonitorAnalyze/components/memberManage.vue
new file mode 100644
index 0000000..5d7a0a9
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/components/memberManage.vue
@@ -0,0 +1,393 @@
+<template>
+ <div class="member-manage">
+ <div class="left">
+ <div>
+ <el-input placeholder="璇疯緭鍏�" v-model="treeWord">
+ <el-button slot="append" icon="el-icon-search"></el-button>
+ </el-input>
+ </div>
+ <el-tree :data="treeData" node-key="id" default-expand-all></el-tree>
+ <div class="menuList" v-show="showMenu" :style="{top:menuTop+'px',left:menuLeft+'px'}">
+ <ul>
+ <li>鍒涘缓鍚岀骇鑺傜偣</li>
+ <li>鍒犻櫎鑺傜偣</li>
+ <li>閲嶅懡鍚嶈妭鐐�</li>
+ <li>鍏抽棴</li>
+ </ul>
+ </div>
+ </div>
+ <div class="right">
+ <div class="filter-bar">
+ <el-input class="keyword-input" placeholder="濮撳悕/缁勭粐鏈烘瀯/鎵嬫満鍙�" v-model="keyword" size="small"></el-input>
+ <el-select v-model="gender" size="small" placeholder="鎬у埆" style="margin: 0 10px;">
+ <el-option
+ v-for="item in genders"
+ :key="item.id"
+ :value="item.id"
+ :label="item.name"
+ >{{item.name}}</el-option>
+ </el-select>
+ <el-button type="primary" size="small" @click="dataSearch">鏌ヨ</el-button>
+ </div>
+ <div class="table-area">
+ <div class="actions">
+ <el-button type="primary" size="small" @click="addMember">娣诲姞浜哄憳</el-button>
+ <el-button type="primary" size="small" @click="toggleOrganize">鎹㈢粍缁�</el-button>
+ <el-button type="primary" size="small" @click="batchImport">鎵归噺瀵煎叆</el-button>
+ <el-button type="primary" size="small" @click="uploadPic">涓婁紶鐓х墖</el-button>
+ </div>
+ <el-table class="thbg" :data="tableData" fit ref="elTable">
+ <el-table-column type="selection" width="55"></el-table-column>
+ <el-table-column label="濮撳悕" prop="name" sortable>
+ <template slot-scope="scope">
+ <div style="cursor:pointer;">{{scope.row.name}}</div>
+ </template>
+ </el-table-column>
+ <el-table-column label="鐓х墖" prop="picture">
+ <template>
+ <div></div>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎬у埆" prop="gender"></el-table-column>
+ <el-table-column label="鎵�灞炵粍缁�" prop="organization"></el-table-column>
+ <el-table-column label="宸ュ彿" prop="no"></el-table-column>
+ <el-table-column label="鎵嬫満鍙�" prop="phone"></el-table-column>
+ <el-table-column label="鐢ㄦ埛鏉冮檺" prop="userpermission"></el-table-column>
+ <el-table-column label="杞偍鏉冮檺" prop="transferpermission"></el-table-column>
+ <el-table-column label="鎿嶄綔">
+ <template>
+ <div>
+ <i class="el-icon-edit"></i>
+ <i class="el-icon-delete"></i>
+ </div>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </div>
+ <el-dialog
+ :visible="memberEditDialogVisible"
+ class="member-edit-dialog"
+ :append-to-body="false"
+ title="娣诲姞/缂栬緫浜哄憳"
+ @close="memberEditDialogVisible=false"
+ >
+ <div class="text-center">
+ <el-form :model="memberEditForm">
+ <el-form-item>
+ <el-upload
+ class="avatar-uploader"
+ action="https://jsonplaceholder.typicode.com/posts/"
+ :show-file-list="false"
+ :http-request="uploadMemberPic"
+ >
+ <img
+ v-if="memberEditForm.memberPicUrl"
+ :src="memberEditForm.memberPicUrl"
+ class="avatar"
+ />
+ <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+ </el-upload>
+ </el-form-item>
+ <el-form-item label="宸ュ彿:" prop="no">
+ <el-input v-model="memberEditForm.no" size="mini"></el-input>
+ </el-form-item>
+ <el-form-item label="鐓х墖鏍囪瘑:">
+ <el-input v-model="memberEditForm.figure" size="mini"></el-input>
+ </el-form-item>
+ <el-form-item label="濮撳悕:">
+ <el-input v-model="memberEditForm.name" size="mini"></el-input>
+ </el-form-item>
+ <el-form-item label="鎬у埆:">
+ <el-radio v-model="memberEditForm.gender" label="1">濂�</el-radio>
+ <el-radio v-model="memberEditForm.gender" label="2">鐢�</el-radio>
+ </el-form-item>
+ <el-form-item label="韬唤璇佸彿:">
+ <el-input v-model="memberEditForm.idCard" size="mini"></el-input>
+ </el-form-item>
+ <el-form-item label="鎵嬫満鍙�:">
+ <el-input v-model="memberEditForm.phone" size="mini"></el-input>
+ </el-form-item>
+ <el-form-item label="鍏朵粬:">
+ <el-input v-model="memberEditForm.other" size="mini"></el-input>
+ </el-form-item>
+ <div class="btns">
+ <el-button size="small">鍙栨秷</el-button>
+ <el-button size="small" type="primary">淇濆瓨</el-button>
+ </div>
+ </el-form>
+ </div>
+ </el-dialog>
+ <el-dialog
+ :visible="toggleOrganizeDialogVisible"
+ class="toggle-organize-dialog"
+ :append-to-body="false"
+ title="绉诲姩浜哄憳鍒板叾浠栫粍缁�"
+ @close="toggleOrganizeDialogVisible=false"
+ >
+ <div class="text-left">
+ <div class="flex-box">
+ <label>浜哄憳:</label>
+ <span>lisi</span>
+ </div>
+ <el-input v-model="organizeKeyword" size="small">
+ <el-button slot="append" icon="el-icon-search"></el-button>
+ </el-input>
+ <div>榛樿缁勭粐</div>
+ <el-tree :data="organizeData" node-key="id" default-expand-all></el-tree>
+ <div slot="footer" class="btns">
+ <el-button size="small">鍙栨秷</el-button>
+ <el-button size="small" type="primary">纭畾</el-button>
+ </div>
+ </div>
+ </el-dialog>
+ <el-dialog
+ :visible="batchImportDialogVisible"
+ class="batch-import-dialog"
+ :append-to-body="false"
+ title="鎵归噺瀵煎叆"
+ @close="batchImportDialogVisible=false"
+ >
+ <div class="text-left">
+ <div class="flex-box">
+ <label>涓婁紶鏂囦欢:</label>
+ <el-upload
+ class="upload-demo batch-upload"
+ action="https://jsonplaceholder.typicode.com/posts/"
+ :on-remove="handleRemove"
+ multiple
+ :limit="3"
+ :http-request="batchImportFiles"
+ :on-exceed="handleExceed"
+ :file-list="fileList"
+ >
+ <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
+ <div slot="tip" class="el-upload__tip"></div>
+ </el-upload>
+ <p>
+ *璇锋寜鐓ф妯℃澘濉啓淇℃伅锛岀偣鍑讳笅杞芥ā鏉�
+ <a href="javascript:;">.excel</a>
+ </p>
+ </div>
+ <el-table class="thbg" :data="batchImportTableData" fit>
+ <el-table-column type="index" label="搴忓彿"></el-table-column>
+ <el-table-column prop="filename" label="鏂囦欢鍚嶇О"></el-table-column>
+ <el-table-column prop="time" label="涓婁紶鏃堕棿"></el-table-column>
+ <el-table-column prop="state" label="鐘舵��"></el-table-column>
+ </el-table>
+ </div>
+ </el-dialog>
+ </div>
+</template>
+
+<script>
+
+import { getShuohuangDepartTree, getOrganizeTree } from '@/api/shuohuang'
+
+export default {
+ data () {
+ return {
+ treeWord: '',
+ treeData: [],
+ showMenu: false,
+ menuTop: 0,
+ menuLeft: 0,
+ keyword: '',
+ gender: '',
+ genders: [{ name: '鐢�', id: 'g0' }, { name: '濂�', id: 'g1' }],
+ tableData: [],
+ organizeData: [],
+ memberEditDialogVisible: false,
+ toggleOrganizeDialogVisible: false,
+ batchImportDialogVisible: false,
+ fileList: [],
+ memberEditForm: {},
+ memberPicUrl: '',
+ batchImportTableData: [],
+ }
+ },
+ mounted () {
+ this.searchLeftTreeData();
+ this.getOrganizeTreeData();
+ },
+ methods: {
+ uploadPic(){
+
+ },
+ batchImportFiles () {
+
+ },
+ handleRemove () {
+
+ },
+ handleExceed () {
+
+ },
+ batchImport () {
+ this.batchImportDialogVisible = true;
+ },
+ toggleOrganize () {
+ this.toggleOrganizeDialogVisible = true;
+ },
+ uploadMemberPic () { },
+ openMenuList (t, l, frame) {
+ this.showMenu = true;
+ this.menuTop = t;
+ this.menuLeft = l;
+ },
+ closeMenuList () {
+ this.showMenu = false;
+ },
+ deepNodeChildren (node) {
+ if (node.ChildDept && node.ChildDept.length > 0) {
+ return node.ChildDept.map(child => {
+ let childObj = {};
+ childObj.id = child.ID;
+ childObj.label = child.Name;
+ childObj.Status = child.Status;
+ if (child.ChildDept) {
+ childObj.children = this.deepNodeChildren(child)
+ }
+ if (child.UserLst) {
+ childObj.children = this.deepNodeChildren(child)
+ }
+ return childObj;
+ });
+ } else if (node.UserLst && node.UserLst.length > 0) {
+ return node.UserLst.map(child => {
+ let childObj = {};
+ childObj.id = child.ID;
+ childObj.label = child.Name;
+ childObj.Status = child.Status;
+ return childObj;
+ });
+ }
+ },
+ getOrganizeTreeData () {
+ let _this = this;
+ getOrganizeTree().then(res => {
+ _this.organizeData = res.data.map(item => {
+ let obj = {};
+ obj.id = item.ID;
+ obj.label = item.Name;
+ obj.Status = item.Status;
+ obj.children = _this.deepNodeChildren(item);
+ return obj
+ })
+ })
+ },
+ searchLeftTreeData () {
+ let _this = this;
+ getShuohuangDepartTree().then(res => {
+ _this.treeData = res.data.map(item => {
+ let obj = {};
+ obj.id = item.ID;
+ obj.label = item.Name;
+ obj.Status = item.Status;
+ obj.children = _this.deepNodeChildren(item);
+ return obj
+ })
+ })
+ },
+ addMember () {
+ this.memberEditDialogVisible = true;
+ },
+ dataSearch () {
+
+ }
+ }
+}
+</script>
+
+<style lang="scss">
+.member-manage {
+ display: flex;
+ padding: 20px;
+ .avatar-uploader .el-upload {
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ overflow: hidden;
+ }
+ .avatar-uploader .el-upload:hover {
+ border-color: #409eff;
+ }
+ .avatar-uploader-icon {
+ font-size: 28px;
+ color: #8c939d;
+ width: 178px;
+ height: 178px;
+ line-height: 178px;
+ text-align: center;
+ }
+ .avatar {
+ width: 178px;
+ height: 178px;
+ display: block;
+ }
+ .batch-upload{
+ text-align: left;
+ margin: 0 20px 20px 10px;
+ }
+ .member-edit-dialog {
+ .el-dialog {
+ width: 500px;
+ padding: 0 30px;
+ .el-form-item {
+ .el-form-item__label {
+ width: 100px;
+ }
+ }
+ }
+ .el-input {
+ width: 270px;
+ }
+ }
+ .toggle-organize-dialog {
+ .el-dialog {
+ width: 450px;
+ min-height: 500px;
+ .el-dialog__body {
+ padding-bottom: 0;
+ .btns {
+ margin-top: 50px;
+ }
+ }
+ }
+ }
+ .menuList {
+ background: #fff;
+ position: absolute;
+ z-index: 100;
+ width: 180px;
+ text-align: left;
+ border: 1px solid #ccc;
+ }
+ .menuList li {
+ line-height: 28px;
+ height: 28px;
+ padding-left: 24px;
+ background: #fff;
+ }
+ .menuList li:hover {
+ background: rgba(152, 170, 190, 0.7);
+ }
+ .right {
+ padding: 8px 0 0 20px;
+ .filter-bar {
+ display: flex;
+ margin-bottom: 20px;
+ .keyword-input {
+ width: 300px;
+ }
+ }
+ .table-area {
+ .actions {
+ text-align: left;
+ }
+
+ }
+ }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue b/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue
new file mode 100644
index 0000000..f1478cb
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue
@@ -0,0 +1,943 @@
+<template>
+ <div class="search-for-video-analyze">
+ <div class="filter-area">
+ <div class="input-area">
+ <el-input
+ class="search-input"
+ size="small"
+ v-model="keyword"
+ placeholder="璇疯緭鍏ュ徃鏈恒�佽溅娆°�佹満杞﹀彿绛夊叧閿瘝杩涜鎼滅储"
+ ></el-input>
+ <el-date-picker
+ v-model="searchTime"
+ type="datetimerange"
+ size="small"
+ :picker-options="pickerOptions"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ align="right"
+ ></el-date-picker>
+ <el-button size="small" type="primary" @click="dataSearch">鎼滅储</el-button>
+ </div>
+ <div class="checked-config">
+ <span style="margin-top:3px;">宸查�夋潯浠�:</span>
+ <span
+ v-show="!checkedConfigs.length"
+ class="tip"
+ style="padding-left: 5px;margin-top:3px;"
+ >杩樻湭閫夋嫨绛涢�夋潯浠�</span>
+ <div class="config-item" v-for="(config,index) in checkedConfigs" :key="index">
+ <span class="title">{{config.title}}</span> :
+ <span class="val" v-for="option in config.data" :key="option.id">
+ <!-- <template>
+ <div>
+
+ </div>
+ </template>-->
+ <span v-if="option.isChecked" class="val-show">
+ {{option.name}}
+ <i>銆�</i>
+ </span>
+ </span>
+ <i class="el-icon-close remove" @click="removeCheckedConfig(config)"></i>
+ </div>
+ <el-button
+ class="clear-config-btn"
+ v-if="checkedConfigs.length"
+ size="mini"
+ @click="clearCheckedConfigs"
+ >鍙栨秷閫夋嫨</el-button>
+ </div>
+ <div class="optional-config">
+ <div class="config" v-for="(config,index) in optionalConfigs" :key="index">
+ <template v-show="config.isShow">
+ <div class="title">{{config.title}}</div>
+ <div class="options-wrap">
+ <div
+ class="options"
+ :ref="'options'+config.id"
+ :style="{height:fixedOneLineHeight+'px'}"
+ >
+ <div class="option" v-for="(option,index) in config.data" :key="index">
+ <div v-show="config.isMultCheck">
+ <el-checkbox v-model="option.isChecked"></el-checkbox>
+ <span>{{option.name}}</span>
+ </div>
+ <div v-show="!config.isMultCheck" @click="checkOption(config,option)">
+ <span>{{option.name}}</span>
+ </div>
+ </div>
+ </div>
+ <div class="btns text-center" v-show="config.isMultCheck">
+ <el-button size="mini" @click="cancleMultCheck(config)">鍙栨秷</el-button>
+ <el-button size="mini" type="primary" @click="checkOption(config)">纭畾</el-button>
+ </div>
+ </div>
+ <div class="right-btns">
+ <div class="more" v-if="config.showMore" @click="showMore(config)">
+ <span>鏇村</span>
+ <i :class="config.isShowMore?'el-icon-arrow-up':'el-icon-arrow-down'"></i>
+ </div>
+ <div
+ :class="[{'checked':config.isMultCheck},'multCheck']"
+ @click="toggleMultCheck(config)"
+ >
+ <i class="el-icon-plus"></i>
+ <span>澶氶��</span>
+ </div>
+ </div>
+ </template>
+ </div>
+ <div class="config">
+ <div class="title">楂樼骇閫夐」</div>
+ <div>
+ <el-menu class="el-menu-demo" mode="horizontal" @select="handleSelect">
+ <el-submenu
+ class="config-submenu"
+ :popper-append-to-body="false"
+ v-for="(config,index) in highLevelConfigs"
+ :key="index"
+ :index="index+''"
+ >
+ <template slot="title">{{config.title}}</template>
+ <el-menu-item
+ v-for="(option,ind) in config.data"
+ :key="ind"
+ :index="index+'-'+ind"
+ @click="checkOption(config,option)"
+ >{{option.name}}</el-menu-item>
+ </el-submenu>
+ </el-menu>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="data-list">
+ <div class="header-bar clearfix">
+ <div class="left">
+ <div>
+ <el-select v-model="watch" size="mini">
+ <el-option value label="鍏ㄩ儴"></el-option>
+ <el-option value="1" label="鏈叧娉�"></el-option>
+ <el-option value="2" label="宸插叧娉�"></el-option>
+ </el-select>
+ </div>
+ <div>
+ <el-select v-model="settle" size="mini">
+ <el-option value label="鍏ㄩ儴"></el-option>
+ <el-option value="1" label="鏈鐞�"></el-option>
+ <el-option value="2" label="宸插鐞�"></el-option>
+ </el-select>
+ </div>
+ </div>
+ <div class="right">
+ <div class="show-type">
+ <div class="type menu" :class="{'current':showType=='menu'}" @click="checkType('menu')">
+ <i class="el-icon-menu"></i>
+ </div>
+ <div class="type" :class="{'current':showType=='list'}" @click="checkType('list')">
+ <i class="el-icon-s-operation"></i>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="content" v-show="showType=='menu'">
+ <el-row :gutter="20">
+ <el-col :xs="8" :sm="6" :md="6" :lg="6" v-for="data in menuList" :key="data.id">
+ <div class="card">
+ <div class="video-wrap" @click="checkVideo(data)">
+ <video src></video>
+ </div>
+ <div class="video-info">
+ <div class="base-info">
+ <div>
+ <label>杞﹀彿:</label>
+ <span>{{data.no}}</span>
+ </div>
+ <div>
+ <label>杞︽:</label>
+ <span>{{data.frequency}}</span>
+ </div>
+ <div>
+ <label>鏃堕棿:</label>
+ <span>{{data.time}}</span>
+ </div>
+ <div>
+ <label>鍙告満|鍓徃鏈�:</label>
+ <span>{{data.driver}}</span>
+ </div>
+ </div>
+ <div class="mark-info">
+ <div class="abnormal" v-if="data.markType==1">
+ <span v-for="(mark,index) in data.marks" :key="index">{{mark}}</span>
+ </div>
+ <div v-else>
+ <span>鏃犲紓甯�</span>
+ </div>
+ </div>
+ <div class="tag-info">
+ <div class="tag" v-for="(tag,index) in data.tags" :key="index">{{tag}}</div>
+ </div>
+ </div>
+ <div class="star">
+ <i :class="[data.follow?'follow':'','el-icon-star-off']"></i>
+ </div>
+ </div>
+ </el-col>
+ </el-row>
+ <el-pagination
+ background
+ @size-change="handleSizeChange"
+ @current-change="handleCurrentChange"
+ :current-page.sync="curTabPage"
+ :page-size="tabPageSize"
+ layout="total, prev, pager, next"
+ :total="tabTotal">
+ </el-pagination>
+ </div>
+ <div class="content" v-show="showType=='list'">
+ <el-table :data="tableData" fit ref="elTable">
+ <el-table-column label="鍚嶇О" prop="name" sortable width="500">
+ <template slot-scope="scope">
+ <div style="cursor:pointer;">{{scope.row.name}}</div>
+ </template>
+ </el-table-column>
+ <el-table-column label="澶у皬" prop="size" sortable></el-table-column>
+ <el-table-column label="淇敼鏃ユ湡" prop="updateTime" sortable></el-table-column>
+ <el-table-column label="鍒涘缓鏃ユ湡" prop="createTime" sortable></el-table-column>
+ <el-table-column label="鎿嶄綔">
+ <template>
+ <div class="operation">
+ <i class="el-icon-star-off" style="font-size: 18px;"></i>
+ </div>
+ </template>
+ </el-table-column>
+ </el-table>
+ <!-- <el-pagination background layout="prev, pager, next" :page-size="pageSize" :total="tableListTotal"></el-pagination> -->
+ <el-pagination
+ @size-change="handleSizeChange"
+ @current-change="handleCurrentChange"
+ :current-page.sync="curTablePage"
+ :page-size="tablePageSize"
+ layout="total, prev, pager, next"
+ :total="tableTotal">
+ </el-pagination>
+ </div>
+ <el-dialog
+ class="dialog-video"
+ :visible="videoDialogVisible"
+ @close="videoDialogVisible=false"
+ :append-to-body="false"
+ >
+ <div slot="title" class="title">
+ <div class="center">
+ <i class="el-icon-connection"></i>
+ <span>鎾斁瑙嗛</span>
+ </div>
+ </div>
+ <div class="content">
+ <div class="content-top">
+ <div class="grid-check">
+ <span
+ :class="guid === 1 ? 'iconfont icongongge1 activegongge':'iconfont icongongge1'"
+ @click="setGuid(1)"
+ ></span>
+ <span
+ :class="guid === 2 ? 'iconfont icongongge activegongge':'iconfont icongongge'"
+ @click="setGuid(2)"
+ ></span>
+ <span
+ :class="guid === 3 ? 'iconfont icongongge2 activegongge':'iconfont icongongge2'"
+ @click="setGuid(3)"
+ ></span>
+ </div>
+ <div class="video-area">
+ <div class="info-list block">
+ <p class="title-partment">鐩稿叧瑙嗛</p>
+ <!-- <div class="video-name" v-for="video in videoDetails.videoList" :key="video.id">
+ <i class="el-icon-film"></i>
+ <span>{{video.name}}</span>
+ </div>-->
+ <div class="video-name">
+ <i class="el-icon-film"></i>
+ <span>椹鹃┒瀹�</span>
+ </div>
+ <div class="video-name">
+ <i class="el-icon-film"></i>
+ <span>鏈烘埧</span>
+ </div>
+ </div>
+ <div class="players">
+ <div class="video-item" v-for="(item,index) in videoWrapArr" :key="index"></div>
+ </div>
+ </div>
+ </div>
+ <div class="content-bottom">
+ <div class="bot-left block">
+ <p class="title-partment">蹇�熸爣娉�</p>
+ <div style="height:28px;">
+ <label style="padding-right:10px;">闅愭偅闂:</label>
+ <el-radio v-model="hiddenDanger" :label="1">鏃犲紓甯�</el-radio>
+ <el-radio v-model="hiddenDanger" :label="2">鏈夊紓甯�</el-radio>
+ <el-button
+ icon="el-icon-plus"
+ size="mini"
+ v-show="hiddenDanger==2"
+ type="primary"
+ @click="addLabel(videoDetails)"
+ >娣诲姞鏍囨敞</el-button>
+ </div>
+ </div>
+ <div class="bot-right block">
+ <p class="title-partment">瑙嗛璇︽儏</p>
+ <div class="base-info">
+ <div>
+ <label>杞﹀彿:</label>
+ <span>{{videoDetails.no}}</span>
+ </div>
+ <div>
+ <label>杞︽:</label>
+ <span>{{videoDetails.frequency}}</span>
+ </div>
+ <div>
+ <label>鏃堕棿:</label>
+ <span>{{videoDetails.time}}</span>
+ </div>
+ <div>
+ <label>鍙告満|鍓徃鏈�:</label>
+ <span>{{videoDetails.driver}}</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </el-dialog>
+ <el-dialog
+ class="label-dialog"
+ :visible="labelDialogVisible"
+ @close="labelDialogVisible=false"
+ :append-to-body="false"
+ >
+ <div class="label-check">
+ <el-checkbox-group v-model="labelCheckedList">
+ <el-checkbox v-for="item in labelOptions" :key="item.id" :label="item.id">{{item.name}}</el-checkbox>
+ </el-checkbox-group>
+ </div>
+ <div class="btns">
+ <el-button @click="delLabelChecked" size="small">鍒犻櫎</el-button>
+ <el-button @click="cancelLabelChecked" size="small">鍙栨秷</el-button>
+ <el-button @click="submitLabelChecked(videoDetails)" size="small" type="primary">纭畾</el-button>
+ </div>
+ </el-dialog>
+ </div>
+ </div>
+</template>
+
+<script>
+import { getlstInit } from '@/api/shuohuang';
+
+export default {
+ data () {
+ return {
+ keyword: '',
+ searchTime: [this.$moment(new Date().getTime() - 3600 * 1000 * 24 * 3).format("YYYY-MM-DD HH:mm:ss"), this.$moment(new Date()).format("YYYY-MM-DD HH:mm:ss")],
+ curTabPage: 1,
+ curTablePage: 1,
+ tabPageSize: 8,
+ tabTotal: 0,
+ tablePageSize: 8,
+ tableTotal: 0,
+ currentPage: 1,
+ pickerOptions: {
+ shortcuts: [{
+ text: '浠婂ぉ',
+ onClick (picker) {
+ const end = new Date();
+ const start = new Date();
+ start.setHours(0, 0, 0);
+ picker.$emit('pick', [start, end]);
+ }
+ }, {
+ text: '鏄ㄥぉ',
+ onClick (picker) {
+ const end = new Date();
+ const start = new Date();
+ start.setTime(start.getTime() - 3600 * 1000 * 24);
+ start.setHours(0, 0, 0);
+ end.setTime(end.getTime() - 3600 * 1000 * 24);
+ end.setHours(23, 59, 59);
+ picker.$emit('pick', [start, end]);
+ }
+ }, {
+ text: '杩戜笁澶�',
+ onClick (picker) {
+ const end = new Date();
+ const start = new Date();
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 3);
+ picker.$emit('pick', [start, end]);
+ }
+ }, {
+ text: '杩戜竴鍛�',
+ onClick (picker) {
+ const end = new Date();
+ const start = new Date();
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+ //start.setHours(0,0,0);
+ picker.$emit('pick', [start, end]);
+ }
+ }]
+ },
+ checkedConfigs: [],
+ optionalConfigs: [],
+ highLevelConfigs: [],
+ fixedOneLineHeight: 40,
+ watch: '',
+ settle: '',
+ showType: 'menu',
+ tableData: [
+ { name: 'SS4B115_06_B鑺備簩绔徃鏈哄_20201115_091500.mp4', size: '17.66M', updateTime: '2020-11-04 15:41', createTime: '2020-11-04 15:41' },
+ { name: 'SS4B115_06_B鑺備簩绔徃鏈哄_20201115_091700.mp4', size: '17.76M', updateTime: '2020-11-04 15:41', createTime: '2020-11-07 17:41' }
+ ],
+ menuList: [
+ { id: 'ss1', no: 'SS4B115', frequency: '8084', time: '2020-09-21 20:45:08', driver: '寮犱笁', marks: ['鏈懠鍞ゃ�佸懠鍞や笉鏍囧噯', '瀛︿範鍙告満鏈簲绛�'], markType: 1, tags: ['杩涘嚭绔�', '鍙告満绂诲矖'], follow: true },
+ { id: 'ss2', no: 'SS4B115', frequency: '8084', time: '2020-09-21 20:45:08', driver: '寮犱笁', marks: [], markType: 0, tags: ['杩涘嚭绔�', '鍙告満绂诲矖'], follow: false }
+ ],
+
+ videoDialogVisible: false,
+ videoDetails: {},
+ guid: 1,
+ videoWrapArr: [],
+ hiddenDanger: 1,
+ labelDialogVisible: false,
+ labelOptions: [{ id: 'whh', name: '鏈懠鍞ゃ�佸懠鍞や笉鏍囧噯' }, { id: 'jsbz', name: '绮剧涓嶆尟銆佽繍琛屼腑鐫¤' }, { id: 'xxsj', name: '瀛︿範鍙告満鏈簲绛�' }, { id: 'myhb', name: '娌℃湁鍚庨儴鐬湜銆佷笉鎸夎瀹氬仛闃叉簻鎺柦' }],
+ labelCheckedList: [],
+ }
+ },
+ mounted () {
+ // let mockConfigs = [
+ // { id: 'jch', isHighLevel: false, title: '鏈鸿溅鍙�', data: [{ name: '鍏ㄩ儴', id: '' }, { name: 'K24', id: 'k24' }, { name: 'G172', id: 'g172' }, { name: 'K254', id: 'k254' }, { name: 'K264', id: 'k264' }, { name: 'G132', id: 'g132' }, { name: 'K257', id: 'k257' }, { name: 'K269', id: 'k269' }, { name: 'G176', id: 'g176' }, { name: 'G137', id: 'g137' }, { name: 'K297', id: 'k297' }, { name: 'K209', id: 'k209' }, { name: 'G777', id: 'g777' }, { name: 'G337', id: 'g337' }, { name: 'K277', id: 'k277' }, { name: 'K299', id: 'k299' }, { name: 'G866', id: 'g866' }, { name: 'K877', id: 'k877' }, { name: 'K699', id: 'k699' }, { name: 'G906', id: 'g906' }, { name: 'L677', id: 'l677' }, { name: 'M987', id: 'm987' }] },
+ // { id: 'cc', isHighLevel: false, title: '杞︽', data: [{ name: '鍏ㄩ儴', id: '' }, { name: 'SS344', id: 'SS344' }, { name: 'SS345', id: 'SS345' }, { name: 'SS765', id: 'SS765' }, { name: 'SS776', id: 'SS776' }, { name: 'SS676', id: 'SS676' }, { name: 'SS876', id: 'SS876' }, { name: 'SS779', id: 'k779' }, { name: 'SS976', id: 'SS976' },] },
+ // { id: 'sj', isHighLevel: true, title: '鍙告満', data: [{ name: '寮犱笁', id: 'zs' }, { name: '鏉庢柉', id: "ls" }, { name: '鏉庢柉鐗�', id: "lst" }] },
+ // { id: 'lk', isHighLevel: true, title: '璺喌', data: [{ name: '鏍囩ず鐗�', id: 'bsp' }, { name: '淇″彿鏈�', id: "xhj" }, { name: '寮亾', id: "wd" }] }
+ // ];
+
+ // mockConfigs.forEach(config => {
+ // this.$set(config, 'isShow', true);
+ // config.data.forEach(item => {
+ // this.$set(item, 'isChecked', false);
+ // })
+ // if (config.isHighLevel) {
+ // this.highLevelConfigs.push(config);
+ // } else {
+ // this.$set(config, 'isMultCheck', false);
+ // this.$set(config, 'showMore', false);
+ // this.optionalConfigs.push(config);
+ // }
+ // })
+ // this.$nextTick(() => {
+ // this.optionalConfigs.forEach(config => {
+ // if (this.$refs[`options${config.id}`][0].scrollHeight > this.fixedOneLineHeight) {
+ // config.showMore = true;
+ // this.$set(config, 'isShowMore', false);
+ // } else {
+ // config.showMore = false;
+ // }
+ // });
+ // console.log(this.optionalConfigs);
+ // });
+ this.init();
+ },
+ methods: {
+ handleSizeChange(){
+
+ },
+ handleCurrentChange(){
+
+ },
+ init () {
+ let _this = this;
+ let query = {
+ KeyWord: this.keyword,
+ StartDate: this.searchTime[0],
+ EndDate: this.searchTime[1],
+ PageIndex: this.showType=='list'?this.curTablePage:this.showType=='list',
+ PageSize: this.showType=='list'?this.tablePageSize:this.tabPageSize,
+ IsDetail: this.showType=='list'
+ };
+ this.optionalConfigs = [];
+ this.highLevelConfigs = [];
+ getlstInit(query).then(res => {
+ debugger
+ if(_this.showType=='list'){
+ _this.tableTotal = res.total;
+ }else{
+ _this.tabTotal = res.total;
+ }
+
+ res.filterlst.forEach(config => {
+ this.$set(config, 'isShow', true);
+ config.data = Object.keys(config.Node).map(key => {
+ let obj = {};
+ obj.name = key;
+ obj.id = config.Node[key]
+ // item.id = item;
+ // item.name = k;
+ return obj
+ });
+ config.id = config.ID;
+ config.title = config.NameZn;
+ config.data.forEach(item => {
+ this.$set(item, 'isChecked', false);
+ });
+ if (config.IsAdvanced) {
+ this.highLevelConfigs.push(config);
+ } else {
+ this.$set(config, 'isMultCheck', false);
+ this.$set(config, 'showMore', false);
+ this.optionalConfigs.push(config)
+ }
+ });
+ this.$nextTick(() => {
+ this.optionalConfigs.forEach(config => {
+ if (this.$refs[`options${config.id}`][0].scrollHeight > this.fixedOneLineHeight) {
+ config.showMore = true;
+ this.$set(config, 'isShowMore', false);
+ } else {
+ config.showMore = false;
+ }
+ });
+ console.log(this.optionalConfigs);
+ });
+ })
+ },
+ delLabelChecked () {
+
+ },
+ cancelLabelChecked () {
+
+ },
+ submitLabelChecked () {
+
+ },
+ addLabel (videoDetails) {
+ debugger
+ this.labelDialogVisible = true;
+
+ },
+ setGuid (guid) {
+ this.videoWrapArr = Math.pow(guid, 2);
+
+ },
+ checkVideo (data) {
+ this.videoDialogVisible = true;
+ this.videoDetails = data;
+
+ },
+ checkFollow () {
+
+ },
+ checkType (type) {
+ this.showType = type;
+ this.init();
+ },
+ clearCheckedConfigs () {
+ this.checkedConfigs = [];
+ },
+ removeCheckedConfig (config) {
+ let index = this.checkedConfigs.findIndex(one => one.id == config.id);
+ this.checkedConfigs.splice(index, 1);
+ },
+ checkOption (config, option) {
+ if (option) {
+ option.isChecked = true;
+ }
+ this.checkedConfigs.push(config);
+
+ //config.isShow = false;
+
+ // this.dataSearch();
+ this.$nextTick(() => {
+ config.isShow = false;
+ })
+
+ },
+
+ cancleMultCheck (config) {
+ config.isMultCheck = false;
+ config.data.forEach(opt => {
+ opt.isChecked = false;
+ });
+ },
+ handleSelect (key, keyPath) {
+
+ },
+ showMore (config) {
+ config.isShowMore = !config.isShowMore;
+ this.$refs[`options${config.id}`][0].style.height = config.isShowMore ? this.$refs[`options${config.id}`][0].scrollHeight + 'px' : this.fixedOneLineHeight + 'px';
+ },
+ toggleMultCheck (config) {
+ config.isMultCheck = !config.isMultCheck;
+ this.optionalConfigs.forEach(conf => {
+ if (conf.id == config.id) {
+ return;
+ }
+ conf.isMultCheck = false;
+ })
+ },
+ dataSearch () {
+ console.log(this.checkedConfigs);
+ this.$forceUpdate();
+ },
+
+ }
+}
+</script>
+
+<style lang="scss">
+.search-for-video-analyze {
+ padding: 20px 30px;
+ .filter-area {
+ .input-area {
+ display: flex;
+ align-items: center;
+ height: 50px;
+ .search-input {
+ width: 408px;
+ }
+ .el-date-editor {
+ margin: 0 20px;
+ }
+ }
+ .checked-config {
+ display: flex;
+ text-align: left;
+ margin-bottom: 10px;
+ position: relative;
+ .config-item {
+ padding-left: 10px;
+ margin: 0 0 5px 5px;
+ background: #f3f3f3;
+ border: 1px solid #ddd;
+ .remove {
+ cursor: pointer;
+ padding: 5px 5px;
+ margin-left: 5px;
+ }
+ &:hover {
+ background: #fff;
+ border-color: #3d68e1;
+ .remove {
+ background: #3d68e1;
+ color: #fff;
+ }
+ }
+ .val-show {
+ &:last-child {
+ i {
+ display: none;
+ }
+ }
+ }
+ }
+ .clear-config-btn {
+ position: absolute;
+ right: 0;
+ }
+ }
+ .optional-config {
+ .config {
+ display: flex;
+ flex-wrap: no-wrap;
+ cursor: pointer;
+ border-bottom: 1px solid #ddd;
+ .title {
+ padding: 10px 20px;
+ width: 100px;
+ text-align: left;
+ background: #f3f3f3;
+ }
+ .options-wrap {
+ flex: 1;
+ .options {
+ display: flex;
+ flex-wrap: wrap;
+ height: 40px;
+ overflow: hidden;
+ .option {
+ padding: 10px 20px;
+ height: 20px;
+ line-height: 20px;
+ &:hover {
+ color: #6486e7;
+ }
+ .el-checkbox {
+ padding-right: 6px;
+ }
+ }
+ }
+ .btns {
+ margin: 20px 0;
+ }
+ }
+ .right-btns {
+ width: 158px;
+ display: flex;
+ user-select: none;
+ justify-content: flex-end;
+ .more {
+ margin-top: 6px;
+ padding: 0px 12px;
+ border: 1px solid #ccc;
+ margin-right: 10px;
+ width: 48px;
+ height: 26px;
+ line-height: 26px;
+ &:hover {
+ color: #6486e7;
+ }
+ }
+ .multCheck {
+ margin-top: 6px;
+ width: 48px;
+ height: 26px;
+ line-height: 26px;
+ padding: 0px 12px;
+ border: 1px solid #ccc;
+ &:hover {
+ color: #6486e7;
+ border-color: #6486e7;
+ }
+ &.checked {
+ color: #3d68e1;
+ border-color: #3d68e1;
+ }
+ }
+ }
+ .el-menu.el-menu--horizontal {
+ border: none;
+ }
+ .config-submenu {
+ .el-submenu__title {
+ height: 40px;
+ line-height: 40px;
+ border: none;
+ }
+ .el-menu--popup {
+ display: flex;
+ width: 900px;
+ li.el-menu-item {
+ display: inline-block;
+ min-width: auto;
+ }
+ }
+ }
+ }
+ }
+ .tip {
+ color: #ccc;
+ }
+ }
+ .data-list {
+ margin-top: 20px;
+ .header-bar {
+ padding-bottom: 5px;
+ border-bottom: 1px solid #ddd;
+ .left {
+ float: left;
+ display: flex;
+ > div {
+ margin-right: 10px;
+ }
+ }
+ .right {
+ float: right;
+ display: flex;
+ .show-type {
+ display: flex;
+ .type {
+ font-size: 20px;
+ padding: 2px 5px;
+ cursor: pointer;
+ border: 1px solid #eee;
+ border-radius: 3px;
+ &.menu {
+ margin-right: 10px;
+ }
+ &.current {
+ border-color: #3d68e1;
+ }
+ }
+ }
+ }
+ }
+ .content {
+ padding-top: 14px;
+ .el-col {
+ margin-bottom: 10px;
+ }
+ .card {
+ cursor: pointer;
+ position: relative;
+ text-align: left;
+ border: 1px solid #dedede;
+ border-radius: 5px;
+ .video-wrap {
+ background: aliceblue;
+ border-radius: 3px;
+ video {
+ border-radius: 3px;
+ }
+ }
+ .video-info {
+ padding: 10px;
+ .base-info {
+ > div {
+ margin-bottom: 5px;
+ }
+ label {
+ color: #999;
+ padding-right: 8px;
+ }
+ }
+ .mark-info {
+ margin: 10px 0;
+ color: #3d68e1;
+ .abnormal {
+ color: red;
+ }
+ }
+ .tag-info {
+ color: #999;
+ display: flex;
+ .tag {
+ padding: 2px 5px;
+ margin-right: 10px;
+ border-radius: 3px;
+ border: 1px solid #eee;
+ }
+ }
+ }
+ .star {
+ position: absolute;
+ font-size: 20px;
+ right: 10px;
+ bottom: 10px;
+ .follow {
+ color: #3d68e1;
+ }
+ }
+ }
+ .el-table {
+ border: 1px solid #dedede;
+ th {
+ background: #f5f5f5;
+ color: #333;
+ }
+ .operation {
+ cursor: pointer;
+ }
+ }
+ }
+ .dialog-video {
+ .el-dialog {
+ width: 1180px;
+ }
+ .el-dialog__body {
+ background: #f5f5f5;
+ padding: 0;
+ }
+ .title-partment {
+ font-size: 14px;
+ color: #333;
+ line-height: 18px;
+ margin-bottom: 8px;
+ }
+ .block {
+ background: #fff;
+ padding: 10px;
+ border-radius: 3px;
+ }
+ .title {
+ font-size: 18px;
+ }
+ .content {
+ padding: 15px;
+ text-align: left;
+ .content-top {
+ margin-bottom: 10px;
+ .grid-check {
+ text-align: right;
+ margin-bottom: 6px;
+ span {
+ font-size: 20px;
+ color: #cacaca;
+ padding-left: 12px;
+ cursor: pointer;
+ }
+ }
+ .video-area {
+ display: flex;
+ .info-list {
+ width: 160px;
+ margin-right: 10px;
+ .video-name {
+ color: #666;
+ margin-bottom: 10px;
+ &.current {
+ color: #3d68e1;
+ }
+ i {
+ padding-right: 4px;
+ }
+ }
+ }
+ .players {
+ width: 960px;
+ height: 540px;
+ display: flex;
+ .video-item {
+ flex: 1;
+ background: black;
+ border: 1px solid #fff;
+ }
+ }
+ }
+ }
+ .content-bottom {
+ display: flex;
+ .bot-left {
+ flex: 1;
+ }
+ .bot-right {
+ width: 210px;
+ margin-left: 10px;
+ label {
+ color: #999;
+ padding-right: 8px;
+ }
+ }
+ }
+ }
+ }
+ .label-dialog {
+ .el-dialog {
+ width: 700px;
+ .label-check {
+ min-height: 400px;
+ margin-bottom: 20px;
+ .el-checkbox-group {
+ display: flex;
+ flex-wrap: wrap;
+ > label {
+ width: 50%;
+ text-align: left;
+ margin: 0;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/components/taskManage.vue b/src/pages/shuohuangMonitorAnalyze/components/taskManage.vue
new file mode 100644
index 0000000..9374856
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/components/taskManage.vue
@@ -0,0 +1,279 @@
+<template>
+ <div class="tab-task-manage">
+ <div class="top">
+ <div class="top-left partment">
+ <div class="header">
+ <div class="title">瑙嗛鍒楄〃</div>
+ </div>
+ <div class="body">
+ <div class="flex-box">
+ <div>
+ <el-date-picker
+ v-model="videoSearchTime"
+ type="datetimerange"
+ size="mini"
+ :picker-options="pickerOptions"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ align="right"
+ ></el-date-picker>
+ </div>
+ <div>
+ <el-input
+ class="keyword-input"
+ v-model="videoListSearchWord"
+ placeholder="璇疯緭鍏ユ満杞﹀彿锛屽涓敤','鍒嗛殧"
+ size="mini"
+ style="margin: 0 10px;"
+ ></el-input>
+ </div>
+ <div></div>
+ <el-button
+ type="primary"
+ @click="searchVideoList"
+ size="mini"
+ style="margin-right:10px;"
+ >鎼滅储</el-button>
+ <el-checkbox v-model="isShowUndistributedOnly">浠呮樉绀烘湭鍒嗛厤</el-checkbox>
+ </div>
+ <div class="video-list">
+ <el-collapse v-model="actCollapseName">
+ <el-collapse-item :name="trainNo.id" v-for="trainNo in trainNoList" :key="trainNo.id">
+ <template slot="title">
+ <div>
+ <el-checkbox v-model="trainNo.checked" style="padding-right:10px;"></el-checkbox>
+ <span>{{trainNo.no}}({{trainNo.videos.length}})</span>
+ </div>
+ </template>
+ <div v-for="video in trainNo.videos" :key="video.id">
+ <i class="el-icon-film" style="margin-left: 20px;"></i>
+ <span style="padding-left: 10px;">{{video.name}}</span>
+ </div>
+ </el-collapse-item>
+ </el-collapse>
+ </div>
+ </div>
+ </div>
+ <div class="top-right partment">
+ <div class="header">
+ <div class="title">浜哄憳鍒楄〃</div>
+ </div>
+ <div class="body">
+ <div class="flex-box">
+ <label>閮ㄩ棬:</label>
+ <el-select placeholder="鍏ㄩ儴" size="mini" style="width: 200px;margin-right: 10px;">
+ <el-option></el-option>
+ </el-select>
+ <el-button type="primary" size="mini" @click="searchPerson">鎼滅储</el-button>
+ </div>
+ <div class="person-list">
+ <div class="person" v-for="person in personList" :key="person.id">
+ <el-checkbox v-model="person.personChecked">{{person.name}}</el-checkbox>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="devide"></div>
+ <div class="bot">
+ <div class="header">
+ <div class="title">浠诲姟鍒楄〃</div>
+ <div class="header-right flex-box">
+ <el-radio-group v-model="taskType" size="mini">
+ <el-radio-button label="1">寰呭垎閰�</el-radio-button>
+ <el-radio-button label="2">宸插垎閰�</el-radio-button>
+ </el-radio-group>
+ <el-input
+ class="keyword-input"
+ placeholder="璇疯緭鍏�"
+ v-model="keyWordOfTask"
+ size="mini"
+ style="margin-left: 10px;"
+ >
+ <el-button slot="append" icon="el-icon-search" @click="searchTask"></el-button>
+ </el-input>
+ </div>
+ </div>
+ <div class="body table-area">
+ <div class="actions">
+ <el-button type="primary" size="small" @click="distributeTask">鍒嗛厤浠诲姟</el-button>
+ </div>
+ <el-table class="thbg" :data="taskTableData" ref="elTable">
+ <el-table-column type="expand">
+ <template slot-scope="props">
+ <div class="video-item" v-for="video in props.videos" :key="video.id">{{video.name}}</div>
+ </template>
+ </el-table-column>
+ <el-table-column prop="trainNo" label="鏈鸿溅鍙�"></el-table-column>
+ <el-table-column label="瑙嗛鏁伴噺">
+ <template slot-scope="scope">
+ <div>{{scope.row.videos.length}}</div>
+ </template>
+ </el-table-column>
+ <el-table-column prop="person" label="鍒嗛厤浜�"></el-table-column>
+ <el-table-column prop="time" label="鍒嗛厤鏃堕棿"></el-table-column>
+ <el-table-column prop="handle" label="澶勭悊浜�"></el-table-column>
+ <el-table-column label="鎿嶄綔">
+ <template slot-scope="scope">
+ <div class="operation">
+ <span @click="cancelDistribute(scope.row)">鍙栨秷鍒嗛厤/鎸囨淳</span>
+ <span @click="toggleCollapse(scope.row)">鏌ョ湅/闅愯棌杞︽</span>
+ </div>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </div>
+ </div>
+</template>
+
+<script>
+export default {
+ data () {
+ return {
+ taskType: '1',
+ keyWordOfTask: '',
+ videoSearchTime: [],
+ pickerOptions: {
+ shortcuts: [{
+ text: '浠婂ぉ',
+ onClick (picker) {
+ const end = new Date();
+ const start = new Date();
+ start.setHours(0, 0, 0);
+ picker.$emit('pick', [start, end]);
+ }
+ }, {
+ text: '鏄ㄥぉ',
+ onClick (picker) {
+ const end = new Date();
+ const start = new Date();
+ start.setTime(start.getTime() - 3600 * 1000 * 24);
+ start.setHours(0, 0, 0);
+ end.setTime(end.getTime() - 3600 * 1000 * 24);
+ end.setHours(23, 59, 59);
+ picker.$emit('pick', [start, end]);
+ }
+ }, {
+ text: '杩戜竴鍛�',
+ onClick (picker) {
+ const end = new Date();
+ const start = new Date();
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+ //start.setHours(0,0,0);
+ picker.$emit('pick', [start, end]);
+ }
+ }]
+ },
+ isShowUndistributedOnly: false,
+ trainNoList: [
+ { no: 'SS4B115', id: 'SS4B115', videos: [{ id: 'SS4B115', name: 'SS4B115_06_B鑺備簩绔徃鏈哄_20201115_091500.mp4' }, { id: 'SS4B116', name: 'SS4B116_06_B鑺備簩绔徃鏈哄_20201115_091500.mp4' }] },
+ { no: 'SS5B115', id: 'SS5B115', videos: [{ id: 'SS5B116', name: 'SS5B116_06_B鑺備簩绔徃鏈哄_20201115_091500.mp4' }] }
+ ],
+ videoListSearchWord: '',
+ actCollapseName: '',
+ username: '',
+ personList: [
+ { name: '寮犱笁', id: 'zs' },
+ { name: '鏉庢柉', id: 'ls' }
+ ],
+ taskTableData: [],
+ }
+ },
+ mounted () {
+
+ },
+ methods: {
+ distributeTask () {
+
+ },
+ searchVideoList () {
+
+ },
+ searchPerson () {
+
+ },
+ searchTask () {
+
+ }
+ }
+}
+</script>
+
+<style lang="scss">
+.tab-task-manage {
+ .partment {
+ border: 1px solid #e8e8e8;
+ border-radius: 3px;
+ .header {
+ background: #fafafa;
+ border-bottom: 1px solid #e8e8e8;
+ }
+ }
+ .header {
+ height: 40px;
+ .title {
+ float: left;
+ padding-left: 20px;
+ height: 40px;
+ line-height: 40px;
+ font-size: 14px;
+ font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC';
+ }
+ .header-right {
+ float: right;
+ }
+ }
+ .body {
+ padding: 14px 20px 20px;
+ }
+ .flex-box {
+ align-items: center;
+ & > label {
+ padding-right: 8px;
+ }
+ }
+ .keyword-input {
+ width: 260px;
+ }
+ .top {
+ display: flex;
+ padding: 20px;
+ margin-bottom: 10px;
+ .top-left {
+ flex: 1;
+ margin-right: 10px;
+ .video-list {
+ margin-top: 14px;
+ text-align: left;
+ }
+ }
+ .top-right {
+ width: 360px;
+ .person-list {
+ padding-top: 14px;
+ .person {
+ text-align: left;
+ margin-bottom: 10px;
+ padding-bottom: 6px;
+ border-bottom: 1px solid #eee;
+ }
+ }
+ }
+ }
+ .devide {
+ height: 10px;
+ background: #f5f5f5;
+ }
+ .bot {
+ padding: 20px;
+ .table-area {
+ .actions {
+ text-align: left;
+ }
+
+ }
+ }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/components/topNav.vue b/src/pages/shuohuangMonitorAnalyze/components/topNav.vue
new file mode 100644
index 0000000..67805cd
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/components/topNav.vue
@@ -0,0 +1,35 @@
+<template>
+ <div class="top-nav">
+ <div class="search-area">
+ <i class="el-icon-search"></i>
+ </div>
+ <div class="notify">
+ <i class="el-icon-bell"></i>
+ </div>
+ <div class="user-area">
+ <img src alt />
+ username
+ </div>
+ </div>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style lang="scss">
+.top-nav {
+ display: flex;
+ height: 64px;
+ padding-right: 20px;
+ justify-content: flex-end;
+ align-items: center;
+ cursor: pointer;
+ i[class^='el-icon-']{
+ font-size: 20px;
+ padding: 14px;
+ }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/components/transferDeviceManage.vue b/src/pages/shuohuangMonitorAnalyze/components/transferDeviceManage.vue
new file mode 100644
index 0000000..3665b38
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/components/transferDeviceManage.vue
@@ -0,0 +1,124 @@
+<template>
+ <div class="transfer-device-manage">
+ <div class="general-view">
+ <div
+ class="indicator"
+ :class="{'lastOne':index==generalIndicators.length-1}"
+ v-for="(indicator,index) in generalIndicators"
+ :key="indicator.id"
+ >
+ <div class="title">
+ <span class="dot"></span>
+ <span class="word">{{indicator.title}}</span>
+ </div>
+ <div class="indicator-val">{{indicator.val}}</div>
+ </div>
+ </div>
+ <div class="table-area">
+ <div class="filter-bar flex-box">
+ <div>
+ <label>璁惧鍦板潃:</label>
+ <div>
+ <el-input v-model="deviceAddr" size="small"></el-input>
+ </div>
+ </div>
+ <div>
+ <label>璁惧鐘舵��:</label>
+ <div>
+ <el-select v-model="deviceState" size="small">
+ <el-option></el-option>
+ </el-select>
+ </div>
+ </div>
+ <div class="btns">
+ <el-button type="primary" size="small">鏌ヨ</el-button>
+ </div>
+ </div>
+ <el-table class="thbg" :data="tableData" fit>
+ <el-table-column prop="name" label="杞偍璁惧鍚嶇О"></el-table-column>
+ <el-table-column prop="state" label="璁惧鐘舵��"></el-table-column>
+ <el-table-column prop="pic" label="鐜板満鍥剧墖"></el-table-column>
+ <el-table-column prop="addr" label="璁惧鍦板潃"></el-table-column>
+ <el-table-column prop="tel" label="鎶ヤ慨鐢佃瘽"></el-table-column>
+ <el-table-column label="鎿嶄綔">
+ <template slot-scope="scope">
+ <div class="operation">
+ <span @click="checkSlot(scope.row)">鏌ョ湅鎻掓Ы</span>
+ </div>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </div>
+</template>
+<script>
+export default {
+
+ data () {
+ return {
+ generalIndicators: [{ id: 'gz', title: '鏈夋晠闅滆澶�', val: 156 }, { id: 'zc', title: '姝e父璁惧', val: 5000 }, { id: 'dx', title: '璇诲啓涓�', val: 56 }, { id: 'kx', title: '绌洪棽涓�', val: 2000 }, { id: 'ccgz', title: '鎻掓Ы鏁呴殰', val: 1000 }],
+ deviceAddr: '',
+ deviceState: '',
+ tableData: []
+ }
+ },
+ methods: {
+ checkSlot(row){
+
+ }
+ }
+}
+</script>
+
+<style lang="scss">
+.transfer-device-manage {
+ padding: 20px;
+ .general-view {
+ display: flex;
+ padding: 30px;
+ .indicator {
+ flex: 1;
+ position: relative;
+ &:not(.lastOne):after {
+ content: '';
+ width: 1px;
+ height: 57px;
+ background: #e9e9e9;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ }
+ .title {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 14px;
+ color: #999;
+ margin-bottom: 10px;
+ .dot {
+ width: 10px;
+ height: 10px;
+ margin-right: 5px;
+ border-radius: 50%;
+ background: rgb(94, 14, 243);
+ }
+ }
+ .indicator-val {
+ font-size: 24px;
+ }
+ }
+ }
+ .filter-bar.flex-box {
+ & > div {
+ display: flex;
+ align-items: center;
+ margin-right: 10px;
+ label {
+ padding-right: 10px;
+ }
+ }
+ }
+
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/components/transferMemo.vue b/src/pages/shuohuangMonitorAnalyze/components/transferMemo.vue
new file mode 100644
index 0000000..9dbc0bc
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/components/transferMemo.vue
@@ -0,0 +1,85 @@
+<template>
+ <div class="transfer-memo">
+ <div class="filter-bar flex-box">
+ <div>
+ <label>鎿嶄綔鏃堕棿:</label>
+ <div></div>
+ </div>
+ <div>
+ <label>鎿嶄綔浜�:</label>
+ <div>
+ <el-input v-model="operator" size="small"></el-input>
+ </div>
+ </div>
+ <div>
+ <label>杞偍鐘舵��:</label>
+ <div>
+ <el-select v-model="transferStatus" size="small">
+ <el-option
+ v-for="item in allTransferStatus"
+ :key="item.id"
+ :value="item.id"
+ :label="item.name"
+ ></el-option>
+ </el-select>
+ </div>
+ </div>
+ <div class="btns">
+ <el-button type="primary" size="small">鏌ヨ</el-button>
+ </div>
+ </div>
+ <div class="table-area">
+ <el-table :data="tableData" fit>
+ <el-table-column prop="time" label="鎿嶄綔鏃堕棿"></el-table-column>
+ <el-table-column prop="operator" label="鎿嶄綔浜�"></el-table-column>
+ <el-table-column prop="tranferDevice" label="杞偍璁惧鍚嶇О"></el-table-column>
+ <el-table-column prop="pos" label="鍗℃Ы浣嶇疆"></el-table-column>
+ <el-table-column prop="transferStatus" label="杞偍鐘舵��"></el-table-column>
+ <el-table-column prop="pic" label="鐜板満鍥剧墖"></el-table-column>
+ <el-table-column prop="content" label="杞偍鍐呭"></el-table-column>
+ </el-table>
+ <el-pagination background layout="prev, pager, next" :total="tableDataTotal"></el-pagination>
+ </div>
+ </div>
+</template>
+
+<script>
+export default {
+ data () {
+ return {
+ transferStatus: '',
+ operator: '',
+ allTransferStatus: [],
+ tableData: [],
+ tableDataTotal: 5
+ }
+ }
+}
+</script>
+
+<style lang="scss">
+.transfer-memo {
+ padding: 20px;
+ .filter-bar.flex-box {
+ & > div {
+ display: flex;
+ align-items: center;
+ margin-right: 10px;
+ label {
+ padding-right: 10px;
+ }
+ }
+ }
+ .el-table {
+ border: 1px solid #dedede;
+ margin-top: 10px;
+ th {
+ background: #f5f5f5;
+ color: #333;
+ }
+ .operation {
+ cursor: pointer;
+ }
+ }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/index/App.vue b/src/pages/shuohuangMonitorAnalyze/index/App.vue
new file mode 100644
index 0000000..30023bd
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/index/App.vue
@@ -0,0 +1,102 @@
+<template>
+ <div class="main-view">
+ <div class="view-left">
+ <left-nav :isCollapse="isCollapse" @menuChange="menuChange"></left-nav>
+ </div>
+ <div class="right">
+ <div class="top">
+ <div class="collapse-trigger" @click="toggleCollapse">
+ <i :class="isCollapse?'el-icon-s-fold':'el-icon-s-unfold'"></i>
+ </div>
+ <top-nav></top-nav>
+ </div>
+ <div class="container">
+ <searchForVideoAnalyze v-if="actPage=='searchForVideoAnalyze'"></searchForVideoAnalyze>
+ <memberManage v-if="actPage=='memberManage'"></memberManage>
+ <taskManage v-if="actPage=='taskManage'"></taskManage>
+ <transferMemo v-if="actPage=='transferMemo'"></transferMemo>
+ <transferDeviceManage v-if="actPage=='transferDeviceManage'"></transferDeviceManage>
+ <configManage v-if="actPage=='configManage'"></configManage>
+ </div>
+ </div>
+ </div>
+</template>
+
+<script>
+import LeftNav from '../components/leftNav';
+import TopNav from '../components/topNav';
+import SearchForVideoAnalyze from '../components/searchForVideoAnalyze';
+import MemberManage from '../components/memberManage';
+import TaskManage from '../components/taskManage';
+import TransferMemo from '../components/transferMemo';
+import TransferDeviceManage from '../components/transferDeviceManage';
+import ConfigManage from '../components/configManage';
+export default {
+ components: { LeftNav, TopNav, SearchForVideoAnalyze, MemberManage, TaskManage, TransferMemo, TransferDeviceManage, ConfigManage },
+ data () {
+ return {
+ isCollapse: false,
+ actPage: 'searchForVideoAnalyze',
+ }
+ },
+ mounted () {
+
+ },
+ methods: {
+ toggleCollapse () {
+ this.isCollapse = !this.isCollapse;
+ //閫氱煡褰撳墠娲诲姩椤祎able(濡傛灉鏈�) doLayout
+
+ },
+ menuChange (path) {
+ this.actPage = path;
+ }
+ }
+}
+</script>
+
+<style lang="scss">
+.flex-box{
+ display: flex;
+}
+.el-table.thbg {
+ border: 1px solid #dedede;
+ margin-top: 10px;
+ th {
+ background: #f5f5f5;
+ color: #333;
+ }
+ .operation {
+ cursor: pointer;
+ }
+}
+.main-view {
+ display: flex;
+ background: #f0f2f5;
+ .view-left {
+ z-index: 2;
+ box-shadow: 4px 0px 8px 0px rgba(0, 0, 0, 0.1);
+ }
+ .right {
+ flex: 1;
+ .top {
+ background: #fff;
+ position: relative;
+ .collapse-trigger {
+ position: absolute;
+ left: 20px;
+ top: 23px;
+ font-size: 20px;
+ cursor: pointer;
+ }
+ }
+ .container {
+ background: #fff;
+ margin: 10px;
+ box-sizing: border-box;
+ height: calc(100vh - 84px);
+ overflow-y: auto;
+ }
+ }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/shuohuangMonitorAnalyze/index/main.ts b/src/pages/shuohuangMonitorAnalyze/index/main.ts
new file mode 100644
index 0000000..ddd090c
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/index/main.ts
@@ -0,0 +1,15 @@
+import Vue from 'vue';
+import App from './App.vue';
+import Mixin from "./mixins";
+import ElementUI from 'element-ui';
+import moment from 'moment';
+
+import 'element-ui/lib/theme-chalk/index.css';
+import "@/assets/css/element-variables.scss";
+Vue.use(ElementUI);
+Vue.mixin(Mixin);
+Vue.prototype.$moment = moment;
+new Vue({
+ el: '#app',
+ render: h => h(App)
+})
diff --git a/src/pages/shuohuangMonitorAnalyze/index/mixins.ts b/src/pages/shuohuangMonitorAnalyze/index/mixins.ts
new file mode 100644
index 0000000..163c814
--- /dev/null
+++ b/src/pages/shuohuangMonitorAnalyze/index/mixins.ts
@@ -0,0 +1,28 @@
+import VideoPhotoData from "@/Pool/VideoPhotoData";
+import VideoTaskData from "@/Pool/VideoTaskData";
+import TreeDataPool from "@/Pool/TreeData";
+import CardList from "@/Pool/CardList";
+import DataStackPool from "@/Pool/dataStack"
+import AuthData from '@/Pool/AuthData';
+
+/* eslint-disable */
+const onlyVideoPhotoData = new VideoPhotoData
+const onlyVideoTaskData = new VideoTaskData
+const onlyTreeDataPool = new TreeDataPool
+const onlyDataStack = new DataStackPool
+const onlyCardList = new CardList
+const onlyAuthData = new AuthData
+
+const mixin = {
+ data() {
+ return {
+ TreeDataPool: onlyTreeDataPool,
+ VideoPhotoData: onlyVideoPhotoData,
+ CardList: onlyCardList,
+ DataStackPool: onlyDataStack,
+ VideoTaskData: onlyVideoTaskData,
+ AuthData: onlyAuthData,
+ };
+ },
+};
+export default mixin;
\ No newline at end of file
diff --git a/vue.config.js b/vue.config.js
index f276d7a..ce1b779 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -86,6 +86,10 @@
'^/data/api-v/app/findAllApp': 'apps.json'
}
},
+ "/api-c": {
+ target: 'http://192.168.20.113:8001',
+ changeOrigin: true
+ },
"/api-v": {
target: 'http://192.168.20.10:8000',
changeOrigin: true
--
Gitblit v1.8.0