| | |
| | | } |
| | | } |
| | | async findPerson2() { |
| | | // 111 |
| | | this.cards = [] |
| | | var compType = this.compTargetType == "1" ? 1 : 0 |
| | | var param = { |
| | | page: this.page, |
| | | size: this.size, |
| | | searchTime: this.searchTime, |
| | | picUrl: this.picUrl, |
| | | alarmlevel: this.queryAlarmlevel, |
| | | inputValue: this.inputValue, |
| | | tasks: this.queryTasks, |
| | | treeNodes: this.treeNodes, |
| | | compTargetId: this.compTargetId, |
| | | compTargetType: compType, |
| | | databases: this.compareTabs, |
| | | threshold: this.threshold |
| | | let param |
| | | if ( this.searchFrom== "cluster") { |
| | | param = { |
| | | page: this.page, |
| | | size: this.size, |
| | | searchTime: this.searchTime, |
| | | picUrl: this.picUrl, |
| | | alarmlevel: this.queryAlarmlevel, |
| | | inputValue: this.inputValue, |
| | | tasks: this.queryTasks, |
| | | treeNodes: this.treeNodes, |
| | | compTargetId: this.compTargetId, |
| | | compTargetType: compType, |
| | | databases: this.compareTabs, |
| | | threshold: this.threshold, |
| | | isAll: true |
| | | } |
| | | } else { |
| | | param = { |
| | | page: this.page, |
| | | size: this.size, |
| | | searchTime: this.searchTime, |
| | | picUrl: this.picUrl, |
| | | alarmlevel: this.queryAlarmlevel, |
| | | inputValue: this.inputValue, |
| | | tasks: this.queryTasks, |
| | | treeNodes: this.treeNodes, |
| | | compTargetId: this.compTargetId, |
| | | compTargetType: compType, |
| | | databases: this.compareTabs, |
| | | threshold: this.threshold, |
| | | } |
| | | } |
| | | const rsp: any = await findPersonByPic(param); |
| | | if (rsp && rsp.success) { |
| | |
| | | <card-item |
| | | :data="item" |
| | | :showType="showType" |
| | | :fromCluster="isFromCluster" |
| | | :searchT="searchTime" |
| | | @detailsClick="detailsClick" |
| | | @addToBase="toAdd" |
| | | ></card-item> |
| | |
| | | outWidth: { |
| | | type: String, |
| | | default: "100%" |
| | | }, |
| | | isFromCluster:{ |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | searchTime:{ |
| | | |
| | | } |
| | | }, |
| | | watch: { |
| | |
| | | showType: { |
| | | type: String, |
| | | default: "search" |
| | | } |
| | | }, |
| | | fromCluster:{ |
| | | type:Boolean, |
| | | default:false |
| | | }, |
| | | searchT:{} |
| | | }, |
| | | computed: { |
| | | isId() { |
| | |
| | | this.$emit("addToBase", item); |
| | | }, |
| | | tosearch(item) { |
| | | this.searchT |
| | | let captureId = item.id == "" ? item.baseInfo[0].targetId : item.id |
| | | let imgUrl = item.targetInfo ? item.targetInfo[0].picSmUrl : item.baseInfo[0].targetPicUrl |
| | | let compType = 1 // 数据来自于es |
| | | if (!item.id || item.id == "") { |
| | | compType = 0 // 数据来自于底库 |
| | | } |
| | | |
| | | let message = 'toSearch?showType=findByPic&targetId=' + captureId + '&picSmUrl=' + imgUrl + '&compType=' + compType + '×tamp=' + new Date().getTime(); |
| | | //let message = 'toSearch?showType=findByPic&targetId=' + captureId + '&picSmUrl=' + imgUrl + '&compType=' + compType; |
| | | let message |
| | | if (this.fromCluster) { |
| | | message = 'toCluster?showType=findByPic&targetId=' + captureId + '&picSmUrl=' + imgUrl + '&compType=' + compType + '×tamp=' + new Date().getTime() + '&start=' + this.searchT[0] + '&end=' + this.searchT[1]; |
| | | } else { |
| | | message = 'toSearch?showType=findByPic&targetId=' + captureId + '&picSmUrl=' + imgUrl + '&compType=' + compType + '×tamp=' + new Date().getTime() + '&start=' + this.searchT[0] + '&end=' + this.searchT[1]; |
| | | } |
| | | window.parent.postMessage({ |
| | | msg: message |
| | | }, "*") |
| | |
| | | >
|
| | | <el-button
|
| | | v-if="item.isUpgrade"
|
| | | @click="donwload(item)"
|
| | | @click="donwload(item,0)"
|
| | | type="warning"
|
| | | size="small"
|
| | | class="bot-btn"
|
| | |
| | | </div>
|
| | | <div class="mask-btn">
|
| | | <el-button
|
| | | @click="donwload(item)"
|
| | | @click="donwload(item,1)"
|
| | | type="primary"
|
| | | class="bot-btn"
|
| | | >安装</el-button
|
| | |
| | | </el-tab-pane>
|
| | | <el-tab-pane name="update">
|
| | | <span slot="label">
|
| | | <el-badge class="update-badge" :value="updateNum"
|
| | | <el-badge class="update-badge" :value="updateNum" :hidden="updateNum==0"
|
| | | >更新</el-badge
|
| | | >
|
| | | </span>
|
| | |
| | | >
|
| | | <el-button
|
| | | v-if="item.isUpgrade"
|
| | | @click="donwload(item)"
|
| | | @click="donwload(item,0)"
|
| | | type="warning"
|
| | | size="small"
|
| | | class="bot-btn"
|
| | |
| | | batchUpdate(type) {
|
| | | if (type == "sdk") {
|
| | | this.hasNewVersionSdk.forEach((sdk) => {
|
| | | this.donwload(sdk);
|
| | | this.donwload(sdk,0);
|
| | | });
|
| | | } else {
|
| | | this.hasNewVersionApp.forEach((app) => {
|
| | |
| | |
|
| | | cancelActivate(){
|
| | | this.showInputCode= false
|
| | | this.activeCode = ""
|
| | | },
|
| | | newActInfo() {
|
| | | return {
|
| | |
| | | },
|
| | | actived() {
|
| | | let _this = this;
|
| | | if (this.activeCode.trim()=="") {
|
| | | this.$notify({
|
| | | type: "error",
|
| | | message: "激活码不能为空",
|
| | | });
|
| | | return
|
| | | }
|
| | | if (this.actType == "sdk") {
|
| | | //激活算法
|
| | | actPageAlg(this.actId, this.activeCode)
|
| | | .then((res) => {
|
| | | if (res.data.isSuccess) {
|
| | | this.productDetailVisible = false
|
| | | _this.activedSdkOrApp = res.data.successMsg;
|
| | | this.showActivateSuccess=true
|
| | |
|
| | | // if (this.actType == "sdk") {
|
| | | // //激活算法
|
| | | // actPageAlg(this.actId, this.activeCode)
|
| | | // .then((res) => {
|
| | | // if (res.data.isSuccess) {
|
| | | // this.productDetailVisible = false
|
| | | // _this.activedSdkOrApp = res.data.successMsg;
|
| | | // this.showActivateSuccess=true
|
| | | // _this.actStep++;
|
| | | // _this.getUnActivedList();
|
| | | // _this.getAllSdk();
|
| | | // } else {
|
| | | // _this.$notify({
|
| | | // type: "error",
|
| | | // message: res.data.failMsg.failMsg,
|
| | | // });
|
| | | // }
|
| | | // })
|
| | | // .catch((e) => {
|
| | | // console.log(e);
|
| | | // });
|
| | | // } else if (this.actType == "app") {
|
| | | // //激活应用
|
| | | // actApp(this.actId, this.activeCode)
|
| | | // .then((res) => {
|
| | | // if (res.data.isSuccess) {
|
| | | // this.productDetailVisible = false
|
| | | // _this.activedSdkOrApp = res.data.successMsg;
|
| | | // this.showActivateSuccess=true
|
| | | // _this.actStep++;
|
| | | // _this.getUnActivedAppList();
|
| | | // _this.getAllApps();
|
| | | // } else {
|
| | | // _this.$notify({
|
| | | // type: "error",
|
| | | // message: res.data.failMsg.failMsg,
|
| | | // });
|
| | | // }
|
| | | // })
|
| | | // .catch((e) => {
|
| | | // console.log(e);
|
| | | // });
|
| | | // }
|
| | | _this.actStep++;
|
| | | _this.getUnActivedList();
|
| | | _this.getAllSdk();
|
| | | } else {
|
| | | _this.$notify({
|
| | | type: "error",
|
| | | message: res.data.failMsg.failMsg,
|
| | | });
|
| | | }
|
| | | })
|
| | | .catch((e) => {
|
| | | console.log(e);
|
| | | });
|
| | | } else if (this.actType == "app") {
|
| | | //激活应用
|
| | | actApp(this.actId, this.activeCode)
|
| | | .then((res) => {
|
| | | if (res.data.isSuccess) {
|
| | | this.productDetailVisible = false
|
| | | _this.activedSdkOrApp = res.data.successMsg;
|
| | | this.showActivateSuccess=true
|
| | | _this.actStep++;
|
| | | _this.getUnActivedAppList();
|
| | | _this.getAllApps();
|
| | | } else {
|
| | | _this.$notify({
|
| | | type: "error",
|
| | | message: res.data.failMsg.failMsg,
|
| | | });
|
| | | }
|
| | | })
|
| | | .catch((e) => {
|
| | | console.log(e);
|
| | | });
|
| | | }
|
| | | },
|
| | | getCodeDetail() {},
|
| | | checkMyAlgorith() {
|
| | |
| | | // 开启自动刷新
|
| | | this.sdkUpgreading = true;
|
| | | },
|
| | | donwload(item) {
|
| | | donwload(item,typ) {
|
| | | item.upgradeLoading = true;
|
| | | this.downloadItem = item.id;
|
| | |
|
| | |
| | | this.downloadItem = "";
|
| | | this.$notify({
|
| | | type: "success",
|
| | | message: "算法安装成功"
|
| | | message: typ==1? "算法安装成功":"算法升级成功"
|
| | | });
|
| | | })
|
| | | .catch((err) => {
|
| | |
| | | margin-bottom: 10px;
|
| | | .el-input{
|
| | | float: left;
|
| | | width: 64%;
|
| | | margin-bottom: 8px;
|
| | | width: 63%;
|
| | | margin-bottom: 8px;
|
| | | margin-right: 10px;
|
| | | }
|
| | | el-button{
|
| | | float: left;
|
| | |
| | | background-color: rgba(242, 242, 242, 1.3);
|
| | | margin: 5px 12px 0 12px;
|
| | | font-size: 12px;
|
| | | line-height: 18px;
|
| | |
|
| | | }
|
| | | margin-bottom: 12px;
|
| | | }
|
| | |
| | | let params = msg.substring(7);
|
| | | this.addFrameByName("search", params)
|
| | | }
|
| | | if (msg.indexOf("toCluster") >= 0) {
|
| | | let params = msg.substring(8);
|
| | | this.addFrameByName("searchForCluster", params)
|
| | | }
|
| | |
|
| | | if (msg.indexOf("toOpenApp") >= 0) {
|
| | | let id = msg.substring(10);
|
| | |
| | | :outHeight="'162px'" |
| | | :outWidth="VideoPhotoData.uploadDiaplay?searchImgCardWidth:cardWidth" |
| | | :data="item" |
| | | :searchTime="searchTimeFormated" |
| | | :showType="showType" |
| | | @detailsClick="getDetails($event, index)" |
| | | @addToBase="toAdd" |
| | |
| | | |
| | | }; |
| | | }, |
| | | |
| | | computed: { |
| | | searchTimeFormated(){ |
| | | return this.format(this.searchTime) |
| | | } |
| | | }, |
| | | created () { |
| | | this.TreeDataPool.readonly = true; |
| | | this.TreeDataPool.gbReadonly = true; |
| | |
| | | // this.VideoTaskData.tasks[this.VideoTaskData.activeIndex].taskId |
| | | // ]; |
| | | // } |
| | | |
| | | this.searchTime = this.getDateInit(); |
| | | this.VideoPhotoData.searchTime = this.getDateInit(); |
| | | let start = this.getUrlKey("start") |
| | | let end = this.getUrlKey("end") |
| | | if (start&&end) { |
| | | this.searchTime = [start,end] |
| | | this.VideoPhotoData.searchTime = [start,end] |
| | | }else{ |
| | | this.searchTime = this.getDateInit(); |
| | | this.VideoPhotoData.searchTime = this.getDateInit(); |
| | | } |
| | | |
| | | // 暂时关闭跳转 20200730 |
| | | // if (this.$route.query.showType === "findByPic") { |
| | |
| | | :outHeight="'162px'" |
| | | :outWidth="VideoPhotoData.uploadDiaplay?searchImgCardWidth:cardWidth" |
| | | :data="item" |
| | | :isFromCluster="true" |
| | | :showType="showType" |
| | | :searchTime="searchTimeFormated" |
| | | @detailsClick="getDetails($event, index)" |
| | | @addToBase="toAdd" |
| | | ></Card> |
| | |
| | | // this.VideoTaskData.tasks[this.VideoTaskData.activeIndex].taskId |
| | | // ]; |
| | | // } |
| | | |
| | | this.searchTime = this.getDateInit(); |
| | | this.VideoPhotoData.searchTime = this.getDateInit(); |
| | | let start = this.getUrlKey("start") |
| | | let end = this.getUrlKey("end") |
| | | if (start&&end) { |
| | | this.searchTime = [start,end] |
| | | this.VideoPhotoData.searchTime = [start,end] |
| | | }else{ |
| | | this.searchTime = this.getDateInit(); |
| | | this.VideoPhotoData.searchTime = this.getDateInit(); |
| | | } |
| | | //设置搜索来源(应用名称) |
| | | this.VideoPhotoData.searchFrom = 'cluster'; |
| | | //this.TreeDataPool.searchFrom = 'cluster'; |
| | |
| | | this.VideoPhotoData.uploadType = false; |
| | | this.VideoPhotoData.showType = "search"; |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | searchTimeFormated(){ |
| | | return this.format(this.searchTime) |
| | | } |
| | | }, |
| | | methods: { |
| | |
| | | tasks = tasks.concat(arr) |
| | | }); |
| | | this.VideoPhotoData.queryTasks = tasks; |
| | | |
| | | this.VideoPhotoData.queryAlarmlevel = this.stringToNum(); |
| | | this.VideoPhotoData.searchTime = this.format(this.searchTime); |
| | | //this.VideoPhotoData.inputValue = this.searchText; |
| | |
| | | }, |
| | | mounted() { |
| | | this.$nextTick(() => { |
| | | console.log('player marks',this.markers); |
| | | // console.log('player marks',this.markers); |
| | | this.init(); |
| | | }); |
| | | }, |
| | |
| | | scriptTag.addEventListener("load", () => { |
| | | this.initPlayer(); |
| | | }); |
| | | // return this.getDuration() |
| | | }, |
| | | |
| | | /** |
| | |
| | | if (this.source) this.config.source = this.source; //播放源 |
| | | this.config.id = this.playerId; //赋值播放器容器id |
| | | this.config.progressMarkers = this.markers; // 标注 |
| | | console.log("alipayer config", this.config); |
| | | // console.log("alipayer config", this.config); |
| | | this.player && this.player.dispose(); //防止实例的重复 |
| | | this.player = Aliplayer(this.config); |
| | | for (const ev in this.events) { |
| | |
| | | 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 |
| | | > |
| | | <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> |
| | |
| | | <i>、</i> |
| | | </span> |
| | | </span> |
| | | <i class="el-icon-close remove" @click="removeCheckedConfig(config)"></i> |
| | | <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> |
| | | >取消选择</el-button |
| | | > |
| | | </div> |
| | | <div class="optional-config"> |
| | | <div class="config" v-for="(config, index) in optionalConfigs" :key="index"> |
| | | <div |
| | | class="config" |
| | | v-for="(config, index) in optionalConfigs" |
| | | :key="index" |
| | | > |
| | | <template v-if="config.isShow"> |
| | | <div class="title">{{ config.title }}</div> |
| | | <div class="options-wrap"> |
| | |
| | | :ref="'options' + config.id" |
| | | :style="{ height: fixedOneLineHeight + 'px' }" |
| | | > |
| | | <div class="option" v-for="(option, index) in config.data" :key="index"> |
| | | <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)"> |
| | | <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> |
| | | <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)"> |
| | | <div |
| | | class="more" |
| | | v-if="config.showMore" |
| | | @click="showMore(config)" |
| | | > |
| | | <span>更多</span> |
| | | <i |
| | | :class=" |
| | |
| | | <div class="config" v-if="showAdvance"> |
| | | <div class="title">高级选项</div> |
| | | <div> |
| | | <el-menu class="el-menu-demo" mode="horizontal" @select="handleSelect"> |
| | | <el-menu |
| | | class="el-menu-demo" |
| | | mode="horizontal" |
| | | @select="handleSelect" |
| | | > |
| | | <el-submenu |
| | | class="config-submenu" |
| | | :popper-append-to-body="false" |
| | |
| | | :index="index + '-' + ind" |
| | | @click="checkOption(config, option)" |
| | | class="highlevel-option" |
| | | >{{ option.name }}</el-menu-item> |
| | | >{{ option.name }}</el-menu-item |
| | | > |
| | | </el-submenu> |
| | | </el-menu> |
| | | </div> |
| | |
| | | <div class="header-bar clearfix"> |
| | | <div class="left"> |
| | | <div> |
| | | <el-select v-model="IsFollow" size="mini" @change="filterSearchData"> |
| | | <el-select |
| | | v-model="IsFollow" |
| | | size="mini" |
| | | @change="filterSearchData" |
| | | > |
| | | <el-option value label="全部"></el-option> |
| | | <el-option :value="false" label="未关注"></el-option> |
| | | <el-option :value="true" label="已关注"></el-option> |
| | | </el-select> |
| | | </div> |
| | | <div> |
| | | <el-select v-model="IsOperate" size="mini" @change="filterSearchData"> |
| | | <el-select |
| | | v-model="IsOperate" |
| | | size="mini" |
| | | @change="filterSearchData" |
| | | > |
| | | <el-option value label="全部"></el-option> |
| | | <el-option value="0" label="未处理"></el-option> |
| | | <el-option value="1" label="已处理"></el-option> |
| | |
| | | > |
| | | <i class="el-icon-menu"></i> |
| | | </div> |
| | | <div class="type" :class="{ current: showType == 'list' }" @click="checkType('list')"> |
| | | <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 tabData" :key="data.id"> |
| | | <el-row :gutter="20"> |
| | | <el-col |
| | | :xs="8" |
| | | :sm="6" |
| | | :md="6" |
| | | :lg="6" |
| | | v-for="data in tabData" |
| | | :key="data.id" |
| | | > |
| | | <div class="card"> |
| | | <div class="video-wrap" @click="checkVideoDetail(data)"> |
| | | <img :src="data.VideoCover" alt /> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="mark-info"> |
| | | <div class="abnormal" v-if="data.LableLst && data.LableLst.length"> |
| | | <div |
| | | class="abnormal" |
| | | v-if="data.LableLst && data.LableLst.length" |
| | | > |
| | | <span |
| | | class="abnormal-label" |
| | | v-for="(label, index) in data.LableLst" |
| | | :key="index" |
| | | >{{ label.Desc +(index==data.LableLst.length-1?"":",")}}</span> |
| | | >{{ |
| | | label.Desc + |
| | | (index == data.LableLst.length - 1 ? "" : ",") |
| | | }}</span |
| | | > |
| | | </div> |
| | | <div v-else> |
| | | <span>无异常</span> |
| | | </div> |
| | | <div class="event-tag" v-if="data.EventLst && data.EventLst.length"> |
| | | <div |
| | | class="event-tag" |
| | | v-if="data.EventLst && data.EventLst.length" |
| | | > |
| | | <el-tag |
| | | size="mini" |
| | | type="info" |
| | | v-for="(label, index) in data.EventLst" |
| | | :key="index" |
| | | style="margin-right:5px;margin-bottom:5px" |
| | | style="margin-right: 5px; margin-bottom: 5px" |
| | | @click="checkEventVideo(label)" |
| | | >{{ label.Event }}</el-tag> |
| | | >{{ label.Event }}</el-tag |
| | | > |
| | | </div> |
| | | </div> |
| | | <div class="tag-info"> |
| | | <div class="tag" v-for="(tag, index) in data.tags" :key="index">{{ tag }}</div> |
| | | <div |
| | | class="tag" |
| | | v-for="(tag, index) in data.tags" |
| | | :key="index" |
| | | > |
| | | {{ tag }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="star" @click="toggleFollow(data)"> |
| | | <i class="iconfont" :class="[data.IsFollow ? 'follow' : '', 'iconguanzhu']"></i> |
| | | <i |
| | | class="iconfont" |
| | | :class="[data.IsFollow ? 'follow' : '', 'iconguanzhu']" |
| | | ></i> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | |
| | | ></el-pagination> |
| | | </div> |
| | | <div class="content" v-show="showType == 'list'"> |
| | | <el-table :data="tableData" fit ref="elTable" @row-click="checkVideoDetail" > |
| | | <el-table |
| | | :data="tableData" |
| | | fit |
| | | ref="elTable" |
| | | @row-click="checkVideoDetail" |
| | | > |
| | | <el-table-column label="名称" prop="VideoName" sortable width="500"> |
| | | <template slot-scope="scope" style="cursor: pointer"> |
| | | <template slot-scope="scope" style="cursor: pointer"> |
| | | <div>{{ scope.row.VideoName }}</div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="大小" prop="VideoSize" sortable></el-table-column> |
| | | <el-table-column label="修改日期" prop="VideoUpdateDate" sortable></el-table-column> |
| | | <el-table-column label="创建日期" prop="VideoCreateDate" sortable></el-table-column> |
| | | <el-table-column |
| | | label="大小" |
| | | prop="VideoSize" |
| | | sortable |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="修改日期" |
| | | prop="VideoUpdateDate" |
| | | sortable |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="创建日期" |
| | | prop="VideoCreateDate" |
| | | sortable |
| | | ></el-table-column> |
| | | |
| | | <el-table-column label="操作"> |
| | | <template slot-scope="scope"> |
| | | <div class="operation"> |
| | | <div class="star" > |
| | | <i class="iconfont" :class="[scope.row.IsFollow ? 'follow' : '', 'iconguanzhu']" @click.stop="toggleFollow(scope.row)"></i> |
| | | <div class="star"> |
| | | <i |
| | | class="iconfont" |
| | | :class="[scope.row.IsFollow ? 'follow' : '', 'iconguanzhu']" |
| | | @click.stop="toggleFollow(scope.row)" |
| | | ></i> |
| | | </div> |
| | | <!-- <i class="el-icon-star-off" @click="toggleFollow(scope.row)"></i> --> |
| | | </div> |
| | |
| | | :total="tableTotal" |
| | | ></el-pagination> |
| | | </div> |
| | | |
| | | |
| | | |
| | | <el-dialog |
| | | class="dialog-video" |
| | | :visible="videoDialogVisible" |
| | | @close="videoDialogVisible = false" |
| | | :modal="false" |
| | | destroy-on-close="true" |
| | | > |
| | | <div slot="title" class="title"> |
| | | <div class="center"> |
| | | <i class="el-icon-connection"></i> |
| | | <span>播放视频</span> |
| | | <!-- |
| | | |
| | | v-drag v-resize |
| | | |
| | | --> |
| | | <!-- <div > --> |
| | | <el-dialog v-drag v-resize |
| | | class="dialog-video" |
| | | :visible="videoDialogVisible" |
| | | @close="videoDialogVisible = false" |
| | | :modal="false" |
| | | :close-on-click-modal="false" |
| | | :destroy-on-close="true" |
| | | :modal-append-to-body="false" |
| | | > |
| | | <div slot="title" class="title"> |
| | | <div class="center"> |
| | | <i class="el-icon-connection"></i> |
| | | <span>播放视频</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <video-analyze :videoDetails="selectedVideo" /> |
| | | </el-dialog> |
| | | <video-analyze :videoDetails="selectedVideo" /> |
| | | </el-dialog> |
| | | <!-- </div> --> |
| | | |
| | | <el-dialog |
| | | class="dialog-event" |
| | | :visible="eventDialogVisible" |
| | |
| | | > |
| | | <div class="title" slot="title"> |
| | | <i class="el-icon-connection"></i> |
| | | <span>{{curEvName}}视频</span> |
| | | <span>{{ curEvName }}视频</span> |
| | | </div> |
| | | <event-videos :eventVideoArr="eventVideoArr"></event-videos> |
| | | </el-dialog> |
| | | </div> |
| | | </div> |
| | | |
| | | </template> |
| | | |
| | | <script> |
| | |
| | | getLabelMap, |
| | | delLabel, |
| | | editLabel, |
| | | getEventVideo |
| | | getEventVideo, |
| | | } from "@/api/shuohuang"; |
| | | import VideoAnalyze from "./videoAnalyze"; |
| | | import EventVideos from "./eventVideos"; |
| | |
| | | VideoAnalyze, |
| | | EventVideos, |
| | | }, |
| | | data () { |
| | | data() { |
| | | return { |
| | | CLIP: "http://", |
| | | keyword: "", |
| | | IsFollow: "", |
| | | //searchTime: [this.$moment(new Date().getTime() - 3600 * 1000 * 24 * 5).format("YYYY-MM-DD HH:mm:ss"), this.$moment(new Date()).format("YYYY-MM-DD HH:mm:ss")], |
| | | searchTime: [ |
| | | new Date(2020, 0, 1, 0, 0, 0), |
| | | new Date(2020, 11, 31, 23, 59, 59), |
| | |
| | | curTabPage: 1, |
| | | curTablePage: 1, |
| | | tabPageSize: 8, |
| | | pageSizes: [ 8, 12, 24], |
| | | pageSizes: [8, 12, 24], |
| | | tabTotal: 0, |
| | | tablePageSize: 8, |
| | | tableTotal: 0, |
| | |
| | | shortcuts: [ |
| | | { |
| | | text: "今天", |
| | | onClick (picker) { |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setHours(0, 0, 0); |
| | |
| | | }, |
| | | { |
| | | text: "昨天", |
| | | onClick (picker) { |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24); |
| | |
| | | }, |
| | | { |
| | | text: "近三天", |
| | | onClick (picker) { |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 3); |
| | |
| | | }, |
| | | { |
| | | text: "近一周", |
| | | onClick (picker) { |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); |
| | |
| | | settle: "", |
| | | IsOperate: "", |
| | | 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", |
| | | // }, |
| | | ], |
| | | tabData: [ |
| | | { |
| | | 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, |
| | | }, |
| | | ], |
| | | tableData: [], |
| | | tabData: [], |
| | | videoDialogVisible: false, |
| | | hiddenDanger: 1, |
| | | labelDialogVisible: false, |
| | | selectedVideo: {}, |
| | | eventDialogVisible: false, |
| | | curEvName: '', |
| | | eventVideoArr: [] |
| | | curEvName: "", |
| | | eventVideoArr: [], |
| | | }; |
| | | }, |
| | | watch: { |
| | | checkedConfigs: { |
| | | handler (n, o) { |
| | | handler(n, o) { |
| | | this.filterSearchData(); |
| | | }, |
| | | deep: true, |
| | | }, |
| | | }, |
| | | mounted () { |
| | | mounted() { |
| | | this.init(); |
| | | }, |
| | | methods: { |
| | | checkEventVideo (label) { |
| | | checkEventVideo(label) { |
| | | this.eventDialogVisible = true; |
| | | this.curEventDetail = label; |
| | | let _this = this; |
| | | getEventVideo({ Event: label.Event, LkgID: label.ParentID }).then(res => { |
| | | _this.eventVideoArr = res.data; |
| | | _this.curEvName = label.Event; |
| | | }) |
| | | getEventVideo({ Event: label.Event, LkgID: label.ParentID }).then( |
| | | (res) => { |
| | | _this.eventVideoArr = res.data; |
| | | _this.curEvName = label.Event; |
| | | } |
| | | ); |
| | | }, |
| | | handleTabSizeChange (size) { |
| | | handleTabSizeChange(size) { |
| | | this.tabPageSize = size; |
| | | this.filterSearchData(); |
| | | }, |
| | | handleTableSizeChange (size) { |
| | | handleTableSizeChange(size) { |
| | | this.tablePageSize = size; |
| | | this.filterSearchData(); |
| | | }, |
| | | handleCurrentChange () { |
| | | handleCurrentChange() { |
| | | this.filterSearchData(); |
| | | }, |
| | | //二级查询 |
| | | filterSearchData () { |
| | | filterSearchData() { |
| | | let _this = this; |
| | | let isFollow = ""; |
| | | if (this.IsFollow === "") { |
| | |
| | | _this.tabTotal = res.total; |
| | | _this.tabData = res.data; |
| | | _this.tabData = _this.tabData.map(function (item) { |
| | | const set = new Set() |
| | | const set = new Set(); |
| | | item.LableLst.forEach(function (label) { |
| | | label.Desc.split(",").forEach(function (d) { |
| | | set.add(d) |
| | | }) |
| | | }) |
| | | const lblst = [] |
| | | set.add(d); |
| | | }); |
| | | }); |
| | | const lblst = []; |
| | | set.forEach(function (d) { |
| | | lblst.push({ Desc: d }) |
| | | }) |
| | | item.LableLst = lblst |
| | | return item |
| | | }) |
| | | lblst.push({ Desc: d }); |
| | | }); |
| | | item.LableLst = lblst; |
| | | return item; |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | //一级查询 |
| | | init () { |
| | | init() { |
| | | let _this = this; |
| | | let query = { |
| | | KeyWord: this.keyword, |
| | |
| | | _this.tabTotal = res.total; |
| | | _this.tabData = res.data; |
| | | _this.tabData = _this.tabData.map(function (item) { |
| | | const set = new Set() |
| | | const set = new Set(); |
| | | item.LableLst.forEach(function (label) { |
| | | label.Desc.split(",").forEach(function (d) { |
| | | set.add(d) |
| | | }) |
| | | }) |
| | | const lblst = [] |
| | | set.add(d); |
| | | }); |
| | | }); |
| | | const lblst = []; |
| | | set.forEach(function (d) { |
| | | lblst.push({ Desc: d }) |
| | | }) |
| | | item.LableLst = lblst |
| | | return item |
| | | }) |
| | | lblst.push({ Desc: d }); |
| | | }); |
| | | item.LableLst = lblst; |
| | | return item; |
| | | }); |
| | | } |
| | | |
| | | res.filterlst.forEach((config) => { |
| | |
| | | }); |
| | | }); |
| | | }, |
| | | toggleFollow (data) { |
| | | toggleFollow(data) { |
| | | data.IsFollow = !data.IsFollow; |
| | | this.updataVideo(data); |
| | | if (data.IsFollow) { |
| | |
| | | }); |
| | | } |
| | | }, |
| | | updataVideo (data) { |
| | | updataVideo(data) { |
| | | let _this = this; |
| | | updateVideoAnalyze(data).then((res) => { |
| | | //二级查询 |
| | | }); |
| | | }, |
| | | |
| | | checkVideoDetail (data) { |
| | | checkVideoDetail(data) { |
| | | let _this = this; |
| | | _this.selectedVideo = data; |
| | | _this.videoDialogVisible = true; |
| | | }, |
| | | checkFollow () { }, |
| | | checkType (type) { |
| | | checkFollow() {}, |
| | | checkType(type) { |
| | | this.showType = type; |
| | | this.filterSearchData(); |
| | | }, |
| | | clearCheckedConfigs () { |
| | | clearCheckedConfigs() { |
| | | this.checkedConfigs.forEach((config) => { |
| | | config.isShow = true; |
| | | config.data.forEach((d) => { |
| | |
| | | this.checkedConfigs = []; |
| | | this.showAdvance = true; |
| | | }, |
| | | removeCheckedConfig (config) { |
| | | removeCheckedConfig(config) { |
| | | config.isShow = true; |
| | | if (config.IsAdvanced) { |
| | | this.showAdvance = true; |
| | |
| | | let index = this.checkedConfigs.findIndex((one) => one.id == config.id); |
| | | this.checkedConfigs.splice(index, 1); |
| | | }, |
| | | checkOption (config, option) { |
| | | checkOption(config, option) { |
| | | if (option) { |
| | | option.isChecked = true; |
| | | } |
| | |
| | | // }) |
| | | }, |
| | | |
| | | cancleMultCheck (config) { |
| | | cancleMultCheck(config) { |
| | | config.isMultCheck = false; |
| | | config.data.forEach((opt) => { |
| | | opt.isChecked = false; |
| | | }); |
| | | }, |
| | | handleSelect (key, keyPath) { }, |
| | | showMore (config) { |
| | | 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) { |
| | | toggleMultCheck(config) { |
| | | config.isMultCheck = !config.isMultCheck; |
| | | this.optionalConfigs.forEach((conf) => { |
| | | if (conf.id == config.id) { |
| | |
| | | conf.isMultCheck = false; |
| | | }); |
| | | }, |
| | | dataSearch () { |
| | | dataSearch() { |
| | | console.log(this.checkedConfigs); |
| | | this.$forceUpdate(); |
| | | }, |
| | | }, |
| | | directives: { |
| | | drag(el, binding) { |
| | | const dialogHeaderEl = el.querySelector(".el-dialog__header"); |
| | | const dragDom = el.querySelector(".el-dialog"); |
| | | dialogHeaderEl.style.cursor = "move"; |
| | | const sty = |
| | | dragDom.currentStyle || window.getComputedStyle(dragDom, null); |
| | | dialogHeaderEl.onmousedown = (e) => { |
| | | const disX = e.clientX - dialogHeaderEl.offsetLeft; |
| | | const disY = e.clientY - dialogHeaderEl.offsetTop; |
| | | let styL, styT; |
| | | |
| | | if (sty.left.includes("%")) { |
| | | styL = |
| | | +document.body.clientWidth * (+sty.left.replace(/\%/g, "") / 100); |
| | | styT = |
| | | +document.body.clientHeight * (+sty.top.replace(/\%/g, "") / 100); |
| | | } else { |
| | | styL = +sty.left.replace(/\px/g, ""); |
| | | styT = +sty.top.replace(/\px/g, ""); |
| | | } |
| | | document.onmousemove = function (e) { |
| | | const l = e.clientX - disX; |
| | | const t = e.clientY - disY; |
| | | dragDom.style.left = `${l + styL}px`; |
| | | dragDom.style.top = `${t + styT}px`; |
| | | }; |
| | | document.onmouseup = function (e) { |
| | | document.onmousemove = null; |
| | | document.onmouseup = null; |
| | | }; |
| | | }; |
| | | }, |
| | | resize(el, binding, vnode) { |
| | | const dragDom = el.querySelector('.el-dialog') |
| | | dragDom.style.overflow = 'hidden' |
| | | let minWidth = 400 |
| | | let minHeight = 300 // |
| | | |
| | | // 拉伸 |
| | | let resizeEl = document.createElement('div') |
| | | dragDom.appendChild(resizeEl) // 在弹窗右下角加上一个10-10px的控制块 |
| | | resizeEl.style.cursor = 'nwse-resize' |
| | | // resizeEl.style.cursor = 'se-resize' |
| | | resizeEl.style.position = 'absolute' |
| | | resizeEl.style.height = '12px' |
| | | resizeEl.style.width = '12px' |
| | | resizeEl.style.right = '0px' |
| | | resizeEl.style.bottom = '0px' //鼠标拉伸弹窗 |
| | | resizeEl.style.background = 'url("/images/desktop/resize.png") no-repeat' //鼠标拉伸弹窗 |
| | | |
| | | resizeEl.onmousedown = (e) => { |
| | | // 记录初始x位置 |
| | | const clientX = e.clientX // 鼠标按下,计算当前元素距离可视区的距离 |
| | | const disX = e.clientX - resizeEl.offsetLeft |
| | | const disY = e.clientY - resizeEl.offsetTop |
| | | |
| | | document.onmousemove = function(e) { |
| | | e.preventDefault() // 移动时禁用默认事件 // 通过事件委托,计算移动的距离 |
| | | |
| | | const x = e.clientX - disX + (e.clientX - clientX) //这里 由于elementUI的dialog控制居中的,所以水平拉伸效果是双倍 |
| | | const y = e.clientY - disY //比较是否小于最小宽高 |
| | | dragDom.style.width = x > minWidth ? `${x}px` : minWidth + 'px' |
| | | dragDom.style.height = |
| | | y > minHeight ? `${y}px` : minHeight + 'px' |
| | | } //拉伸结束 |
| | | document.onmouseup = function(e) { |
| | | document.onmousemove = null |
| | | document.onmouseup = null |
| | | } |
| | | } |
| | | }, |
| | | }, |
| | | }; |
| | |
| | | // display: flex; |
| | | // flex-wrap: wrap; |
| | | // } |
| | | .el-table__row{ |
| | | .el-table__row { |
| | | cursor: pointer; |
| | | } |
| | | .el-row { |
| | |
| | | } |
| | | .operation { |
| | | cursor: pointer; |
| | | .star{ |
| | | .star { |
| | | color: #ccc; |
| | | } |
| | | .follow{ |
| | | .follow { |
| | | color: #409eff; |
| | | } |
| | | } |
| | |
| | | background: #f5f5f5; |
| | | } |
| | | } |
| | | .el-dialog__wrapper{ |
| | | top: -22px; |
| | | } |
| | | .dialog-video { |
| | | // z-index: 2020 !important; |
| | | .el-dialog { |
| | | width: 1180px; |
| | | height: 901px; |
| | | // height: 893px; |
| | | } |
| | | .el-dialog__body { |
| | | background: #f5f5f5; |
| | | background: #eaeaea; |
| | | padding: 0; |
| | | // height: 100%; |
| | | height: inherit; |
| | | |
| | | } |
| | | .el-dialog__header { |
| | | padding: 3px; |
| | | .el-dialog__headerbtn { |
| | | top: 6px; |
| | | } |
| | | } |
| | | } |
| | | .title-partment { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | |
| | | } |
| | | } |
| | | } |
| | | .window-view { |
| | | .window-view { |
| | | width: 100%; |
| | | height: auto; |
| | | // height: 100%; |
| | | // min-height: 684px; |
| | | overflow: auto; |
| | | z-index: 2000; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | </div> |
| | | <div class="video-list"> |
| | | <el-checkbox-group v-model="trainNochecked"> |
| | | <!-- <el-collapse v-model="actCollapseName"> |
| | | <el-collapse v-model="actCollapseName"> |
| | | <el-collapse-item |
| | | :name="trainNo.no" |
| | | v-for="trainNo in trainNoList" |
| | | :key="trainNo.id" |
| | | :name="vkey" |
| | | v-for="(v,vkey,i) in videoPackageList" |
| | | :key="i" |
| | | > |
| | | <template slot="title"> |
| | | <div> |
| | | <el-checkbox |
| | | :label="trainNo.videos[0]['UniqeID']" |
| | | :label="i" |
| | | style="padding-right:10px;" |
| | | ></el-checkbox> |
| | | <span>{{trainNo.no}}({{trainNo.videos.length}})</span> |
| | | <span>{{vkey}}({{v.length}})</span> |
| | | </div> |
| | | </template> |
| | | <div class="video-detail" v-for="video in trainNo.videos" :key="video.ID"> |
| | | <div class="video-detail" v-for="video in v" :key="video.ID"> |
| | | <i class="el-icon-film" style="margin-left: 20px;"></i> |
| | | <span style="padding-left: 10px;">{{video.VideoName}}</span> |
| | | </div> |
| | | </el-collapse-item> |
| | | </el-collapse> --> |
| | | </el-collapse> |
| | | </el-checkbox-group> |
| | | <!-- <el-pagination |
| | | @size-change="handleTrainNoSizeChange" |
| | |
| | | }] |
| | | }, |
| | | isShowUndistributedOnly: false, |
| | | trainNoList: [], |
| | | videoPackageList: {}, |
| | | trainNochecked: [], |
| | | // trainNoCurPage: 1, |
| | | // trainNoPageSize: 8, |
| | |
| | | notAssignedOnly: this.notAssignedOnly, |
| | | }; |
| | | getVideoListBySearch(params).then(res => { |
| | | // let arr = []; |
| | | // for (var key in res.data) { |
| | | // let obj = {}; |
| | | // obj['no'] = key; |
| | | // obj['videos'] = res.data[key]; |
| | | // obj.checked = false; |
| | | // arr.push(obj); |
| | | // } |
| | | // debugger |
| | | _this.trainNoList = res; |
| | | _this.videoPackageList = res.data |
| | | _this.trainNoTotal = res.total; |
| | | }); |
| | | }, |
| | |
| | | <div class="video-analyze-content"> |
| | | <div class="content-top"> |
| | | <div class="grid-check"> |
| | | |
| | | <el-dropdown trigger="click" :popper-append-to-body="false" @command="handleCommand" v-show="showLocChoise"> |
| | | <span class="el-dropdown-link"> |
| | | {{curCamera}}<i class="el-icon-arrow-down el-icon--right"></i> |
| | | </span> |
| | | <el-dropdown-menu slot="dropdown"> |
| | | <el-dropdown-item v-for="(item,index) in popDownArr" :key="index" :command="item">{{item.Camera}}</el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </el-dropdown> |
| | | |
| | | <el-dropdown |
| | | trigger="click" |
| | | :popper-append-to-body="false" |
| | | @command="handleCommand" |
| | | v-show="showLocChoise" |
| | | > |
| | | <span class="el-dropdown-link"> |
| | | {{ curCamera }}<i class="el-icon-arrow-down el-icon--right"></i> |
| | | </span> |
| | | <el-dropdown-menu slot="dropdown"> |
| | | <el-dropdown-item |
| | | v-for="(item, index) in popDownArr" |
| | | :key="index" |
| | | :command="item" |
| | | >{{ item.Camera }}</el-dropdown-item |
| | | > |
| | | </el-dropdown-menu> |
| | | </el-dropdown> |
| | | |
| | | <span |
| | | :class=" |
| | | guid === 1 |
| | |
| | | <p class="title-partment">相关视频</p> |
| | | <div class="v-name-block"> |
| | | <div |
| | | class="video-name" |
| | | :class="{ current: curVideo.ID == video.ID }" |
| | | @click="checkVideo(video, index)" |
| | | v-for="(video, index) in curRoomVideos" |
| | | :key="video.ID" |
| | | > |
| | | <i class="el-icon-film"></i> |
| | | <span>{{ video.VideoDate }}</span> |
| | | </div> |
| | | class="video-name" |
| | | :class="{ current: curVideo.ID == video.ID }" |
| | | @click="checkVideo(video, index)" |
| | | v-for="(video, index) in curRoomVideos" |
| | | :key="video.ID" |
| | | > |
| | | <i class="el-icon-film"></i> |
| | | <span>{{ video.VideoDate }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="players" ref="playerWrap"> |
| | |
| | | v-for="(item, index) in videoWrapArr" |
| | | :key="index" |
| | | > |
| | | <div style="display: none"></div> |
| | | <div class="currentPlayer"> |
| | | <!-- {{curVideo.ID}} --> |
| | | <!-- <img :src="curVideo.VideoCover" style="width:100px" /> --> |
| | | <ali-player |
| | | @playing="getPlayStatus" |
| | | @pause="isStop = true" |
| | | @play="isStop = false" |
| | | @timeupdate="timeUpdate" |
| | | :source="curVideo.VideoPath" |
| | | :markers="curVideo.marks" |
| | | :ref="`player_${curVideo.ID}`" |
| | |
| | | v-for="(item, index) in videoWrapArr" |
| | | :key="index" |
| | | @click="checkCurVideo(index)" |
| | | style="position: relative;" |
| | | style="position: relative" |
| | | @mouseenter.stop.prevent="videoMouseEnter($event)" |
| | | @mouseleave="videoMouseLeave($event)" |
| | | > |
| | | <!-- --> |
| | | <template v-if="index <= videoArrs.length - 1"> |
| | | <div class="video-box-top"> |
| | | <b>{{ videoArrs[index].Camera }}</b> |
| | | </div> |
| | | <div |
| | | :class="{ currentPlayer: curVideo.ID == videoArrs[index].ID,videoZone:true }" |
| | | @mouseover="overShowLoc(index)" |
| | | :class="{ |
| | | currentPlayer: curVideo.ID == videoArrs[index].ID, |
| | | }" |
| | | > |
| | | <!-- @mouseover="" --> |
| | | <!-- {{videoArrs[index].ID}} --> |
| | | <!-- <img |
| | | :src="videoArrs[index].VideoCover" |
| | | style="width:100px" |
| | | />--> |
| | | <div class="pos-desc" style="position: absolute;top: 5px;left: 10px;color: #fff;z-index: 1;height: fit-content;background-color: black;">{{videoArrs[index].Camera}}</div> |
| | | <ali-player |
| | | @timeupdate="timeUpdate(e, index)" |
| | | :source="videoArrs[index].VideoPath" |
| | | :markers="videoArrs[index].marks" |
| | | @pause="isStop = true" |
| | | @play="isStop = false" |
| | | :ref="`player_${videoArrs[index].ID}`" |
| | | @ready="videoReady" |
| | | /> |
| | | </div> |
| | | </template> |
| | | </div> |
| | | </template> |
| | | <div class="player-control"> |
| | | <!-- <div class="progress-bar"></div> --> |
| | | <!-- |
| | | |
| | | --> |
| | | <div class="progress-bar"> |
| | | <el-tooltip |
| | | placement="top" |
| | | v-for="(item, index) in eventMarks" |
| | | :key="index" |
| | | > |
| | | <div slot="content"> |
| | | {{ getTimeStr(item.offset) }}<br />{{ item.text }} |
| | | </div> |
| | | <div |
| | | class="self-dot" |
| | | :style="{ |
| | | left: (item.offset / maxSecond) * 100 + '%', |
| | | }" |
| | | @click="dotJump(item.offset)" |
| | | ></div> |
| | | </el-tooltip> |
| | | <!-- :marks="marks" --> |
| | | <el-slider |
| | | v-model="curTime" |
| | | :format-tooltip="formatTooltip" |
| | | :max="maxSecond" |
| | | @change="progressChange" |
| | | @input="inTimeChange" |
| | | ></el-slider> |
| | | </div> |
| | | <div class="control-zone"> |
| | | <span class="time">{{ curPlayTime }} / {{ maxVideoTime }}</span> |
| | | <div class="play-btn" @click="playAll" v-if="showPlayBtn"></div> |
| | | <div class="stop-btn" @click="pauseAll" v-else></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="content-bottom"> |
| | | <div class="bot-left "> |
| | | <div class="bot-left"> |
| | | <!-- <p class="title-partment">快速标注</p> --> |
| | | <el-tabs v-model="activeName" @tab-click="handleClick"> |
| | | <el-tab-pane label="快速标注" name="first"> <div class="flex-box" style="height: 28px"> |
| | | <label style="padding-right: 10px">隐患问题:</label> |
| | | <el-radio-group v-model="isUnusual"> |
| | | <el-radio :label="0">无异常</el-radio> |
| | | <el-radio :label="1">有异常</el-radio> |
| | | </el-radio-group> |
| | | <el-button |
| | | icon="el-icon-plus" |
| | | size="mini" |
| | | v-show="isUnusual == 1" |
| | | type="primary" |
| | | @click="addLabel(curVideo)" |
| | | >添加标注</el-button |
| | | > |
| | | </div> |
| | | <div class="flex-box fixed-height-box"> |
| | | <label v-if="!showTable">标注信息:</label> |
| | | <div class="mark-list" v-if="!showTable"> |
| | | <div class="mark" v-for="mark in curVideo.LableLst" :key="mark.ID"> |
| | | <div class="time"> |
| | | <span |
| | | >{{ zeroize(Math.floor(mark.Time / 60)) }}:{{ |
| | | zeroize(mark.Time % 60) |
| | | }}</span |
| | | > |
| | | <i class="el-icon-edit" @click="editCurLabel(mark)"></i> |
| | | <i class="el-icon-delete" @click="removeCurLabel(mark)"></i> |
| | | </div> |
| | | <div class="label-content"> |
| | | <span>{{ mark.Desc }}</span> |
| | | </div> |
| | | <el-tabs v-model="activeName" @tab-click="handleClick"> |
| | | <el-tab-pane label="快速标注" name="first"> |
| | | <div class="flex-box" style="height: 28px"> |
| | | <label style="padding-right: 10px">隐患问题:</label> |
| | | <el-radio-group v-model="isUnusual"> |
| | | <el-radio :label="0">无异常</el-radio> |
| | | <el-radio :label="1">有异常</el-radio> |
| | | </el-radio-group> |
| | | <el-button |
| | | icon="el-icon-plus" |
| | | size="mini" |
| | | v-show="isUnusual == 1" |
| | | type="primary" |
| | | @click="addLabel(curVideo)" |
| | | >添加标注</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </div></el-tab-pane> |
| | | <!-- <div class="flex-box fixed-height-box2"></div> --> |
| | | <dataset-chart style="width:100%" v-if="showTable"></dataset-chart> |
| | | <div class="flex-box fixed-height-box"> |
| | | <label v-if="!showTable">标注信息:</label> |
| | | <div class="mark-list" v-if="!showTable"> |
| | | <div |
| | | class="mark" |
| | | v-for="mark in curVideo.LableLst" |
| | | :key="mark.ID" |
| | | > |
| | | <div class="time"> |
| | | <span |
| | | >{{ zeroize(Math.floor(mark.Time / 60)) }}:{{ |
| | | zeroize(mark.Time % 60) |
| | | }}</span |
| | | > |
| | | <i class="el-icon-edit" @click="editCurLabel(mark)"></i> |
| | | <i class="el-icon-delete" @click="removeCurLabel(mark)"></i> |
| | | </div> |
| | | <div class="label-content"> |
| | | <span>{{ mark.Desc }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div></el-tab-pane |
| | | > |
| | | <!-- <div class="flex-box fixed-height-box2"></div> --> |
| | | <dataset-chart style="width: 100%" v-if="showTable"></dataset-chart> |
| | | |
| | | |
| | | <el-tab-pane label="里程标" name="second"> |
| | | |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="里程标" name="second"> </el-tab-pane> |
| | | </el-tabs> |
| | | |
| | | </div> |
| | | <div class="bot-right block"> |
| | | <p class="title-partment">视频详情</p> |
| | |
| | | :visible="labelDialogVisible" |
| | | @close="labelDialogVisible = false" |
| | | :append-to-body="false" |
| | | :modal="false" |
| | | |
| | | :modal="false" |
| | | > |
| | | <!-- <div class="label-radio"> |
| | | <p class="label">选择将要标注的视频:</p> |
| | |
| | | delLabel, |
| | | editLabel, |
| | | } from "@/api/shuohuang"; |
| | | import DatasetChart from './charts/datasetForVideo'; |
| | | import DatasetChart from "./charts/datasetForVideo"; |
| | | import AliPlayer from "./aliPlayer/index"; |
| | | |
| | | export default { |
| | |
| | | isUnusual: "", |
| | | videoArrs: [], |
| | | relativeVideos: [], |
| | | allCurVideos:[], |
| | | allCurVideos: [], |
| | | labelCheckedList: [], |
| | | videoWrapArr: [], |
| | | labelOptions: [], |
| | | selectedLabelId: "", |
| | | setLabelTime: 0, |
| | | isCheckAllVideo: 1, |
| | | curRoomVideos:[], |
| | | popDownArr:[], |
| | | curCamera:"", |
| | | showTable:false, |
| | | showLocChoise:true, |
| | | activeName:"first", |
| | | curRoomVideos: [], |
| | | popDownArr: [], |
| | | curCamera: "", |
| | | showTable: false, |
| | | showLocChoise: true, |
| | | activeName: "first", |
| | | curTime: 0, |
| | | showPlayBtn: true, |
| | | eventMarks: [], |
| | | marks: { |
| | | 45: {}, |
| | | 373: {}, |
| | | }, |
| | | labelMarks: [], |
| | | maxDuration: 0, |
| | | maxVideoTime: "", |
| | | curPlayTime: "00:00", |
| | | maxSecond: 0, |
| | | isStop: false, |
| | | }; |
| | | }, |
| | | watch: { |
| | |
| | | this.renderLabelOpts(); |
| | | this.setGuid(1); |
| | | this.getCurVideos(this.videoDetails); |
| | | this.getRelatedVideos(this.videoDetails) |
| | | this.getRelatedVideos(this.videoDetails); |
| | | }, |
| | | methods: { |
| | | handleClick(instance){ |
| | | if (instance.name=="second") { |
| | | this.showTable=true |
| | | }else{ |
| | | this.showTable=false |
| | | getPlayStatus(e) { |
| | | console.log(e, 1111); |
| | | }, |
| | | videoReady(a, b) {}, |
| | | playAll() { |
| | | this.showPlayBtn = false; |
| | | if (this.guid == 1) { |
| | | this.$refs[`player_${this.curVideo.ID}`][0].play(); |
| | | this.maxDuration = this.$refs[ |
| | | `player_${this.curVideo.ID}` |
| | | ][0].getDuration(); |
| | | } else { |
| | | this.videoArrs.forEach((v) => { |
| | | this.$refs[`player_${v.ID}`][0].play(); |
| | | }); |
| | | } |
| | | }, |
| | | handleCommand(cmd){ |
| | | this.curCamera = cmd.Camera |
| | | this.curRoomVideos = this.allCurVideos.filter(item=>{ |
| | | return item.Camera == cmd.Camera |
| | | }) |
| | | this.curVideo= this.curRoomVideos.find(item=>{ |
| | | return item.UniqeID == this.curVideo.UniqeID |
| | | }) |
| | | this.$nextTick(() => { |
| | | _this.$refs[`player_${_this.curVideo.ID}`][0].init(); |
| | | pauseAll() { |
| | | this.showPlayBtn = true; |
| | | if (this.guid == 1) { |
| | | this.$refs[`player_${this.curVideo.ID}`][0].pause(); |
| | | } else { |
| | | this.videoArrs.forEach((v) => { |
| | | this.$refs[`player_${v.ID}`][0].pause(); |
| | | }); |
| | | } |
| | | }, |
| | | inTimeChange(val) {}, |
| | | progressChange(val) { |
| | | console.log(val); |
| | | this.showPlayBtn = false; |
| | | this.curPlayTime = this.getTimeStr(val); |
| | | let that = this; |
| | | if (this.guid == 1) { |
| | | this.$refs[`player_${this.curVideo.ID}`][0].pause(); |
| | | this.$refs[`player_${this.curVideo.ID}`][0].seek(val); |
| | | this.$refs[`player_${this.curVideo.ID}`][0].play(); |
| | | setTimeout(() => { |
| | | let curT = that.$refs[ |
| | | `player_${that.curVideo.ID}` |
| | | ][0].getCurrentTime(); |
| | | that.barRolling(curT); |
| | | }, 600); |
| | | } else { |
| | | this.videoArrs.forEach((v, i) => { |
| | | this.$refs[`player_${v.ID}`][0].seek(val); |
| | | this.$refs[`player_${v.ID}`][0].play(); |
| | | if (i == 0) { |
| | | let curT = this.$refs[`player_${v.ID}`][0].getCurrentTime(); |
| | | this.barRolling(curT); |
| | | } |
| | | }); |
| | | } |
| | | }, |
| | | getTimeStr(sec) { |
| | | return `${ |
| | | Math.floor(sec / 60) < 10 |
| | | ? "0" + Math.floor(sec / 60) |
| | | : Math.floor(sec / 60) |
| | | }:${ |
| | | Math.floor(sec % 60) < 10 |
| | | ? "0" + Math.floor(sec % 60) |
| | | : Math.floor(sec % 60) |
| | | }`; |
| | | }, |
| | | barRolling(curT) {}, |
| | | timeUpdate(e, index) { |
| | | if (this.isStop) { |
| | | return; |
| | | } |
| | | let curT; |
| | | if (this.guid == 1) { |
| | | curT = Math.floor( |
| | | this.$refs[`player_${this.curVideo.ID}`][0].getCurrentTime() |
| | | ); |
| | | } else { |
| | | curT = Math.floor( |
| | | this.$refs[`player_${this.videoArrs[index].ID}`][0].getCurrentTime() |
| | | ); |
| | | } |
| | | if (curT <= this.curTime) { |
| | | return; |
| | | } else { |
| | | this.curTime = curT; |
| | | } |
| | | this.curPlayTime = this.getTimeStr(this.curTime); |
| | | }, |
| | | formatTooltip(val) { |
| | | return this.curPlayTime; |
| | | }, |
| | | videoMouseEnter(e) { |
| | | let target = e.target; |
| | | if (target.children.length > 1) { |
| | | target.children[0].style.display = "block"; |
| | | } |
| | | }, |
| | | videoMouseLeave(e) { |
| | | let target = e.target; |
| | | if ( |
| | | target.children.length == 2 && |
| | | target.children[0].className == "video-box-top" |
| | | ) { |
| | | target.children[0].style.display = "none"; |
| | | } |
| | | }, |
| | | handleClick(instance) { |
| | | if (instance.name == "second") { |
| | | this.showTable = true; |
| | | } else { |
| | | this.showTable = false; |
| | | } |
| | | }, |
| | | handleCommand(cmd) { |
| | | let _this = this; |
| | | this.curCamera = cmd.Camera; |
| | | this.curRoomVideos = this.allCurVideos.filter((item) => { |
| | | return item.Camera == cmd.Camera; |
| | | }); |
| | | this.curVideo = this.curRoomVideos.find((item) => { |
| | | return item.UniqeID == this.curVideo.UniqeID; |
| | | }); |
| | | this.$nextTick(() => { |
| | | _this.$refs[`player_${_this.curVideo.ID}`][0].init(); |
| | | }); |
| | | }, |
| | | zeroize(val) { |
| | | return val < 10 ? "0" + val : val; |
| | |
| | | this.refreshCurVideoLabel(this.curVideo); |
| | | } |
| | | }, |
| | | getCurVideos(v){ |
| | | getCurVideos(v) { |
| | | let _this = this; |
| | | getCarVideos({ |
| | | TrainNumber:v.TrainNumber, |
| | | CarNumber:v.CarNumber, |
| | | Driver1:v.Driver1, |
| | | }).then(res=>{ |
| | | res.data.forEach(item=>{ |
| | | item.marks = _this.mergeMarks(item) |
| | | }) |
| | | _this.curVideo=res.data.find((item) => item.ID == v.ID) |
| | | // debugger |
| | | _this.videoArrs = res.data.filter(item=> v.UniqeID== item.UniqeID); |
| | | _this.allCurVideos = res.data; |
| | | _this.curRoomVideos = _this.allCurVideos.filter(item=>{ |
| | | return item.Camera == "司机室" |
| | | }) |
| | | this.$nextTick(() => { |
| | | _this.$refs[`player_${_this.curVideo.ID}`][0].init(); |
| | | TrainNumber: v.TrainNumber, |
| | | CarNumber: v.CarNumber, |
| | | Driver1: v.Driver1, |
| | | }).then((res) => { |
| | | res.data.forEach((item) => { |
| | | item.marks = _this.mergeMarks(item); |
| | | }); |
| | | }) |
| | | _this.curVideo = res.data.find((item) => item.ID == v.ID); |
| | | console.log(_this.curVideo); |
| | | let map = {}, |
| | | map2 = {}; |
| | | let arr1 = [], |
| | | arr2 = []; |
| | | _this.curVideo.marks.forEach((item) => { |
| | | if (item.type == 0) { |
| | | map[item.offset] = { |
| | | style: { |
| | | color: "white", |
| | | }, |
| | | label: item.text, |
| | | }; |
| | | } else { |
| | | map[+item.offset] = { |
| | | style: { |
| | | color: "yellow", |
| | | }, |
| | | label: item.text, |
| | | }; |
| | | } |
| | | }); |
| | | // _this.eventMarks = map |
| | | _this.labelMarks = map2; |
| | | |
| | | // videoInfo.EventLst.forEach((item) => { |
| | | // map[item.SecondsInVideo] = { |
| | | // style:{ |
| | | // color: 'black' |
| | | // }, |
| | | // label: item.Event + (item.Desc == "" ? "" : ": " + item.Desc) |
| | | // } |
| | | // }); |
| | | |
| | | if (this.guid == 1) { |
| | | this.maxVideoTime = this.curVideo.VideoTime; |
| | | } |
| | | _this.videoArrs = res.data.filter((item) => v.UniqeID == item.UniqeID); |
| | | _this.allCurVideos = res.data; |
| | | _this.curRoomVideos = _this.allCurVideos.filter((item) => { |
| | | return item.Camera == "司机室"; |
| | | }); |
| | | |
| | | this.$nextTick(() => { |
| | | _this.$refs[`player_${_this.curVideo.ID}`][0].init(); |
| | | let arr = this.maxVideoTime.split(":"); |
| | | let min = +arr[0], |
| | | sec = +arr[1]; |
| | | this.maxSecond = min * 60 + sec; |
| | | }); |
| | | }); |
| | | }, |
| | | getRelatedVideos(video) { |
| | | let _this = this; |
| | | getRelatedVideoInfo({ UniqeID: video.UniqeID }).then((res) => { |
| | | let arr = [] |
| | | let map = {} |
| | | res.data.forEach(item=>{ |
| | | this.popDownArr.push(item) |
| | | }) |
| | | let arr = []; |
| | | let map = {}; |
| | | res.data.forEach((item) => { |
| | | this.popDownArr.push(item); |
| | | }); |
| | | if (this.popDownArr.length) { |
| | | this.curCamera=this.popDownArr[0].Camera |
| | | this.curCamera = this.popDownArr[0].Camera; |
| | | } |
| | | }); |
| | | }, |
| | |
| | | if (d.ID === video.ID) { |
| | | video.LableLst = d.LableLst; |
| | | } |
| | | // let someVideo = _this.videoArrs.find(video => video.ID === d.ID); |
| | | // someVideo.LableLst = d.LableLst |
| | | }); |
| | | }); |
| | | }, |
| | | checkVideo(video, index) { |
| | | // debugger |
| | | this.refreshCurVideoLabel(video); |
| | | this.curVideo = video; |
| | | this.videoArrs = this.allCurVideos.filter(item=> video.UniqeID== item.UniqeID); |
| | | |
| | | this.videoArrs = this.allCurVideos.filter( |
| | | (item) => video.UniqeID == item.UniqeID |
| | | ); |
| | | this.$nextTick(() => { |
| | | this.$refs[`player_${this.curVideo.ID}`][0].init(); |
| | | }); |
| | | }, |
| | | |
| | | setGuid(guid) { |
| | | let _this = this; |
| | | this.guid = guid; |
| | | if (guid==1) { |
| | | this.showLocChoise=true |
| | | }else{ |
| | | this.showLocChoise=false |
| | | if (guid == 1) { |
| | | this.showLocChoise = true; |
| | | } else { |
| | | this.showLocChoise = false; |
| | | this.$refs[`player_${this.curVideo.ID}`][0].pause(); |
| | | this.$refs[`player_${this.curVideo.ID}`][0].seek(0); |
| | | } |
| | | // for(var i = 0; i < Math.pow(guid,2); i++){ |
| | | // if(i>this.videoArrs.length-1){ |
| | | // this.videoWrapArr[i] = this.videoArrs[i] |
| | | // }else{ |
| | | // this.videoWrapArr[i] = {} |
| | | // } |
| | | // } |
| | | this.videoWrapArr = Math.pow(guid, 2); |
| | | this.$nextTick(() => { |
| | | for (var i = 0; i < Math.pow(guid, 2); i++) { |
| | | console.log(`calc(` + 100 / guid + `% -10px)`); |
| | | this.$refs[`gridVideoItem_${i}`][0].style.width = |
| | | this.$refs["playerWrap"].offsetWidth / guid + "px"; |
| | | `calc(` + 100 / guid + `%)`; |
| | | // this.$refs["playerWrap"].offsetWidth / guid + "px"; |
| | | this.$refs[`gridVideoItem_${i}`][0].style.height = |
| | | this.$refs["playerWrap"].offsetHeight / guid + "px"; |
| | | `calc(` + 100 / guid + `%)`; |
| | | // this.$refs["playerWrap"].offsetHeight / guid + "px"; |
| | | } |
| | | console.log(this.$refs[`player_${this.videoArrs[index].ID}`]); |
| | | }); |
| | | }, |
| | | |
| | | cancelLabelChecked() { |
| | | this.labelDialogVisible = false; |
| | | }, |
| | | dotJump(offset){ |
| | | this.curTime = offset |
| | | this.progressChange(offset) |
| | | }, |
| | | submitLabelChecked() { |
| | | let _this = this; |
| | | let tempArr = []; |
| | | // if (this.isCheckAllVideo == 1) { |
| | | tempArr = this.videoArrs.map((video) => video.ID); |
| | | // } |
| | | tempArr = this.videoArrs.map((video) => video.ID); |
| | | let desc = this.labelCheckedList.map((lableId) => { |
| | | for (let label of this.labelOptions) { |
| | | if (label.ID == lableId) { |
| | |
| | | |
| | | let query = { |
| | | ID: this.selectedLabelId, |
| | | ParentID: tempArr.join(","), |
| | | ParentID: tempArr.join(","), |
| | | ParentUniqID: this.curVideo.UniqeID + "", |
| | | Time: Math.round(this.setLabelTime) + "", |
| | | Codes: this.labelCheckedList.join(","), |
| | |
| | | }); |
| | | }, |
| | | mergeMarks(videoInfo) { |
| | | const eMarks = videoInfo.EventLst.map(function (item) { |
| | | return { |
| | | offset: item.SecondsInVideo + "", |
| | | const eMarks = videoInfo.EventLst.map((item) => { |
| | | let obj = { |
| | | offset: item.SecondsInVideo, |
| | | text: item.Event + (item.Desc == "" ? "" : ": " + item.Desc), |
| | | type: 0, |
| | | }; |
| | | this.eventMarks.push(obj); |
| | | return obj; |
| | | }); |
| | | const labMarks = videoInfo.LableLst.map((lable) => { |
| | | return { |
| | | let obj = { |
| | | offset: lable.Time, |
| | | text: lable.Desc, |
| | | type: 1, |
| | | }; |
| | | this.labelMarks.push(obj); |
| | | return obj; |
| | | }); |
| | | |
| | | return eMarks.concat(labMarks); |
| | | }, |
| | | setMarks(video) { |
| | |
| | | <style lang="scss" > |
| | | .video-analyze-content { |
| | | margin: 0; |
| | | padding: 6px 15px 15px 15px; |
| | | padding: 6px 15px 15px 15px; |
| | | height: 100%; |
| | | |
| | | text-align: left; |
| | | .content-top { |
| | | margin-bottom: 10px; |
| | | margin-bottom: 15px; |
| | | |
| | | // height: calc(60% + -16px); |
| | | |
| | | .grid-check { |
| | | text-align: right; |
| | | margin-bottom: 3px; |
| | | margin-bottom: 3px; |
| | | position: relative; |
| | | .el-dropdown{ |
| | | .el-dropdown { |
| | | position: absolute; |
| | | top: -4px; |
| | | left: 200px; |
| | | } |
| | | .el-dropdown-link { |
| | | cursor: pointer; |
| | | color: #409EFF; |
| | | color: #409eff; |
| | | } |
| | | .el-icon-arrow-down { |
| | | font-size: 12px; |
| | | } |
| | | span { |
| | | font-size: 17px; |
| | | font-size: 17px; |
| | | |
| | | color: #cacaca; |
| | | padding-left: 12px; |
| | |
| | | } |
| | | .video-area { |
| | | display: flex; |
| | | .info-list { |
| | | width: 180px; |
| | | height: 100%; |
| | | |
| | | .info-list { |
| | | width: 180px; |
| | | min-width: 180px; |
| | | margin-right: 10px; |
| | | .v-name-block{ |
| | | .v-name-block { |
| | | height: 484px; |
| | | |
| | | overflow: auto; |
| | | overflow: auto; |
| | | } |
| | | .video-name { |
| | | cursor: pointer; |
| | |
| | | } |
| | | } |
| | | .players { |
| | | width: 940px; |
| | | |
| | | height: 530px; |
| | | width: 100%; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | height: 455px; |
| | | .video-item { |
| | | background: black; |
| | | border: 1px solid #fff; |
| | | box-sizing: border-box; |
| | | |
| | | & > div { |
| | | height: 100%; |
| | | & > div { |
| | | height: 100%; |
| | | } |
| | | } |
| | | .video-box-top { |
| | | color: white; |
| | | display: none; |
| | | width: 100%; |
| | | height: 32px; |
| | | line-height: 32px; |
| | | padding: 0px 20px; |
| | | box-sizing: border-box; |
| | | background: #27293190; |
| | | position: absolute; |
| | | top: 0px; |
| | | z-index: 2; |
| | | b { |
| | | float: left; |
| | | } |
| | | } |
| | | .currentPlayer { |
| | |
| | | } |
| | | } |
| | | } |
| | | .player-control { |
| | | background-color: black; |
| | | height: 75px; |
| | | width: 100%; |
| | | .progress-bar { |
| | | margin: 0px 30px; |
| | | position: relative; |
| | | .self-dot { |
| | | top: 16px; |
| | | position: absolute; |
| | | height: 6px; |
| | | width: 3px; |
| | | z-index: 1; |
| | | background-color: lightcoral; |
| | | border-radius: 60%; |
| | | // pointer-events: none; |
| | | cursor: pointer; |
| | | -webkit-transform: translateX(-50%); |
| | | transform: translateX(-50%); |
| | | } |
| | | .el-slider__button { |
| | | width: 12px; |
| | | height: 12px; |
| | | } |
| | | .el-slider__stop { |
| | | background-color: lightcoral; |
| | | } |
| | | } |
| | | .control-zone { |
| | | .time { |
| | | float: left; |
| | | margin-left: 23px; |
| | | color: #fff; |
| | | } |
| | | .play-btn { |
| | | width: 24px; |
| | | height: 24px; |
| | | cursor: pointer; |
| | | background: url(/apps/shuohuangMonitorAnalyze/img/bigplay.png) |
| | | no-repeat; |
| | | background-size: contain; |
| | | margin: 0 auto; |
| | | } |
| | | .stop-btn { |
| | | width: 24px; |
| | | height: 24px; |
| | | cursor: pointer; |
| | | background: url(/apps/shuohuangMonitorAnalyze/img/smallpause.png) |
| | | no-repeat; |
| | | background-size: contain; |
| | | margin: 0 auto; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .content-bottom { |
| | | display: flex; |
| | | |
| | | .bot-left { |
| | | flex: 1; |
| | | padding: 0px 15px 8px 15px; |
| | | background: #fff; |
| | | border-radius: 3px; |
| | | .el-tabs__header { |
| | | padding: 0; |
| | | position: relative; |
| | | margin: 0 0 10px; |
| | | } |
| | | border-radius: 3px; |
| | | min-width: 400px; |
| | | height: 343px; |
| | | .el-tabs__header { |
| | | padding: 0; |
| | | position: relative; |
| | | margin: 0 0 10px; |
| | | } |
| | | .flex-box { |
| | | align-items: baseline; |
| | | label { |
| | |
| | | .bot-right { |
| | | width: 210px; |
| | | margin-left: 10px; |
| | | min-width: 210px; |
| | | |
| | | label { |
| | | color: #999; |
| | | padding-right: 8px; |
| | |
| | | .label-dialog { |
| | | .el-dialog { |
| | | width: 700px !important; |
| | | height: 558px !important; |
| | | height: 558px !important; |
| | | .el-dialog__header { |
| | | height: 20px; |
| | | } |