housecamer.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. <template>
  2. <div class="in_house" v-if="showHouse">
  3. <div><span class="returnback" @click="closeDlg"></span><span class="close" @click="closeDlg"></span></div>
  4. <div class="content">
  5. <div class="left">
  6. <div class="top">
  7. <el-select v-model="provinceValue" :popper-append-to-body="false">
  8. <el-option
  9. v-for="item in provinceList"
  10. :label="item.label"
  11. :value="item.id"
  12. />
  13. </el-select>
  14. <el-select v-model="cityValue"><el-option v-for="item in cityList" :label="item.label" :value="item.id"/></el-select>
  15. <el-select v-model="countryeValue"><el-option v-for="item in countryeList" :label="item.label" :value="item.id"/></el-select>
  16. <div class="houselist">
  17. <div v-for="item in houselist" :class="item.active==true ?'house-item active' : 'house-item'" @click="selectedHouse(item)">{{ item.name }}</div>
  18. </div>
  19. </div>
  20. <div class="middle">
  21. <div class="title"><span class="line"></span><span>流程督办</span><span class="stat_rate">(月)</span></div>
  22. <div class="toolsbtn">
  23. <div :class="currFlowType=='total'?'toolsbtn_item active':'toolsbtn_item'" @click="switchFlow('total')">总量</div>
  24. <div :class="currFlowType=='closed'?'toolsbtn_item active':'toolsbtn_item'" @click="switchFlow('closed')">闭单量</div>
  25. <div :class="currFlowType=='unclosed'?'toolsbtn_item active':'toolsbtn_item'" @click="switchFlow('unclosed')">未闭单量</div>
  26. </div>
  27. <div class="echartsdiv" ref="echarts03"></div>
  28. </div>
  29. </div>
  30. <div class="right">
  31. <div class="top">
  32. <span class="housename">{{ selectHouse.name }}</span>
  33. <span class="iotstat"><img src="/images/icon_iot_01.png"> 排风正常</span>
  34. <span class="iotstat"><img src="/images/icon_iot_02.png"> 烟感正常</span>
  35. <span class="countstat alarm_list">
  36. <span class="alarm_list_item" v-for="item in alarm_curr"><img :src="alarm_type[item.code].icon"/><span>{{ alarm_type[item.code].name }}</span><span class="alarm_item_brager" :style="{'background-color':alarm_type[item.code].bg}">{{ item.value }}</span></span>
  37. </span>
  38. <span class="videocount">
  39. <span :class="videocount_type=='4' ?'videocount_item active':'videocount_item'">四分屏</span>
  40. <span :class="videocount_type=='9' ?'videocount_item active':'videocount_item'">九分屏</span>
  41. <span :class="videocount_type=='16' ?'videocount_item active':'videocount_item'">十六分屏</span>
  42. </span>
  43. </div>
  44. <div class="middle">
  45. <div v-for="item in video_list" :class="item.contrlset ? 'video contrlset type'+videocount_type : 'video type'+videocount_type" @click="videocontrl(item)">
  46. <div class="video-title"><img src="/images/ico-video.png"><span>{{ item.name }}</span><span style="float: right;margin-right: 42px;">{{ item.statedesc }}</span></div>
  47. <div class="video-play">
  48. <Player :ref="(el)=>handleSetTempMap(el,item)"/>
  49. </div>
  50. <div class="cloudset" v-if="item.contrlset==true">
  51. <div><span class="close" @click.stop="closeCloudset(item)" style="top:2px"></span></div>
  52. <div class="camername">{{ item.name }}摄像头</div>
  53. <div class="cc">
  54. <div class="cc_bg"></div>
  55. <div class="cc_01" @click="ccMove(1,5)"></div>
  56. <div class="cc_02" @click="ccMove(2,5)"></div>
  57. <div class="cc_03" @click="ccMove(3,5)"></div>
  58. <div class="cc_04" @click="ccMove(4,5)"></div>
  59. </div>
  60. <div class="cc_params"><span class="span1">变倍</span><img src="/images/cc_sub.png" @click="ccParamsSet(1,-1)"><span class="span2">|</span><span class="span3"><span class="span31" :style="{'width':cc_params1+'%'}"></span><span class="span32" :style="{'left':(cc_params1-8)+'px'}"></span></span><span class="span4">|</span><img src="/images/cc_add.png" @click="ccParamsSet(1,1)"></div>
  61. <div class="cc_params"><span class="span1">变焦</span><img src="/images/cc_sub.png" @click="ccParamsSet(2,-1)"><span class="span2">|</span><span class="span3"><span class="span31" :style="{'width':cc_params2+'%'}"></span><span class="span32" :style="{'left':(cc_params2-8)+'px'}"></span></span><span class="span4">|</span><img src="/images/cc_add.png" @click="ccParamsSet(2,1)"></div>
  62. <div class="cc_params"><span class="span1">光圈</span><img src="/images/cc_sub.png" @click="ccParamsSet(3,-1)"><span class="span2">|</span><span class="span3"><span class="span31" :style="{'width':cc_params3+'%'}"></span><span class="span32" :style="{'left':(cc_params3-8)+'px'}"></span></span><span class="span4">|</span><img src="/images/cc_add.png" @click="ccParamsSet(3,1)"></div>
  63. <div class="audio">
  64. <img v-if="cc_params4>0" src="/images/cc_a.png" @click="cc_params4=0">
  65. <img v-else src="/images/cc_b.png" @click="cc_params4=50">
  66. </div>
  67. <div class="cc_params"><span class="span1">音量</span><img src="/images/cc_sub.png" @click="ccParamsSet(4,-10)"><span class="span2">|</span><span class="span3"><span class="span31" :style="{'width':cc_params4+'%'}"></span><span class="span32" :style="{'left':(cc_params4-8)+'px'}"></span></span><span class="span4">|</span><img src="/images/cc_add.png" @click="ccParamsSet(4,10)"></div>
  68. </div>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. </div>
  74. </template>
  75. <script setup>
  76. import {shallowRef,onMounted,defineExpose} from "vue";
  77. import request from '@/utils/request';
  78. import {
  79. deptTreeSelect,
  80. } from "@/api/biz/houseConfig";
  81. import * as echarts from "echarts";
  82. import Player from './player.vue'
  83. const {proxy} = getCurrentInstance();
  84. const showHouse=ref(false);
  85. const provinceValue = ref('')
  86. const cityValue = ref('');
  87. const countryeValue=ref('');
  88. const provinceList=ref(null);//省列表
  89. const cityList=ref([]);//地市列表
  90. const countryeList=ref([]);//区县列表
  91. const houselist = ref(null);
  92. const selectHouse = ref({});
  93. const echarts03 = ref(null);
  94. const echars03data = ref(null);
  95. const alarm_type = ref(null);
  96. const alarm_curr = ref([]);
  97. const videocount_type = ref('4');
  98. const video_list=ref([]);
  99. const cc_params1=ref(0);
  100. const cc_params2=ref(0);
  101. const cc_params3=ref(0);
  102. const cc_params4=ref(50);
  103. // 存储动态 ref 的对象
  104. const tempPlayerRefs = ref({});
  105. const channelIdList = ref([]);
  106. const currFlowType = ref('total');
  107. const eventFlowData = ref([]);
  108. const deptOptions = ref([]);
  109. const typeMapping={
  110. "0":"none",
  111. "201":"smoke",
  112. "195":"fire",
  113. "189":"person",
  114. "191":"temp"
  115. }
  116. const alarm_list = ref([{
  117. code:"none",
  118. count:0
  119. },{
  120. code:"smoke",
  121. count:0
  122. },{
  123. code:"fire",
  124. count:0
  125. },{
  126. code:"temp",
  127. count:0
  128. },{
  129. code:"person",
  130. count:0
  131. }]);
  132. const load=(hostlist, houseinfo,v_alarm_type)=>{
  133. alarm_type.value = v_alarm_type
  134. showHouse.value = true;
  135. houselist.value=hostlist;
  136. for (let index = 0; index < houselist.value.length; index++) {
  137. const element = houselist.value[index];
  138. if(element.code==houseinfo.value.code){
  139. houselist.value[index]["active"] = true;
  140. selectHouse.value = element;
  141. }else{
  142. houselist.value[index]["active"] = false;
  143. }
  144. }
  145. getchannel();
  146. loadEvent();
  147. deptTreeSelect().then(response => {
  148. deptOptions.value = response.data;
  149. getprovinceList();
  150. getcityList();
  151. getcountyList();
  152. });
  153. }
  154. const getprovinceList=()=>{
  155. let lv= [];
  156. for(let i=0;i<deptOptions.value.length;i++){
  157. lv.push(deptOptions.value[i])
  158. }
  159. provinceList.value = lv;
  160. }
  161. const getcityList=()=>{
  162. let lv= [];
  163. for(let i=0;i<deptOptions.value.length;i++){
  164. if(deptOptions.value[i].children.length>0){
  165. lv.push(...deptOptions.value[i].children)
  166. lv.map(item=>{
  167. item.id = deptOptions.value[i].id+"-"+item.id;
  168. })
  169. }
  170. }
  171. cityList.value = lv;
  172. }
  173. const getcountyList=()=>{
  174. let lv= [{label:"全部区县",id:""}];
  175. for(let i=0;i<deptOptions.value.length;i++){
  176. if(deptOptions.value[i].children.length>0){
  177. for (let index = 0; index < deptOptions.value[i].children.length; index++) {
  178. const element = deptOptions.value[i].children[index];
  179. if(element.children.length>0){
  180. element.children.map(item=>{
  181. item.id = deptOptions.value[i].id+"-"+element.id+"-"+item.id;
  182. })
  183. lv.push(...element.children)
  184. }
  185. }
  186. }
  187. }
  188. countryeList.value = lv;
  189. }
  190. const loadEvent=()=>{
  191. request({
  192. url: '/index/events/'+selectHouse.value.houseId,
  193. method: 'get',
  194. data: null
  195. }).then(res=>{
  196. eventFlowData.value = res.flow;
  197. let vl=[];
  198. for (let k in typeMapping) {
  199. vl.push({id:k, code:typeMapping[k],name:alarm_type.value[typeMapping[k]].name,value:res.curr[k]*1});
  200. }
  201. alarm_curr.value = vl;
  202. loadEchars03();
  203. })
  204. }
  205. const getchannel=()=>{
  206. if(tempPlayerRefs.value!=null && tempPlayerRefs.value.length>0){
  207. for(let k in tempPlayerRefs.value){
  208. tempPlayerRefs.value[k].destroy();
  209. }
  210. }
  211. request({
  212. url: '/index/device/'+selectHouse.value.houseId,
  213. method: 'get',
  214. data: null
  215. }).then(res=>{
  216. channelIdList.value = res;
  217. initvideodata();
  218. })
  219. }
  220. const switchFlow=(key)=> {
  221. currFlowType.value = key;
  222. loadEchars03();
  223. }
  224. const closeDlg=() =>{
  225. //销毁资源
  226. for(let k in tempPlayerRefs.value){
  227. tempPlayerRefs.value[k].destroy();
  228. }
  229. showHouse.value = false;
  230. }
  231. const selectedHouse=(item)=>{
  232. selectHouse.value = item;
  233. for (let index = 0; index < houselist.value.length; index++) {
  234. const element = houselist.value[index];
  235. if(element.code==item.code){
  236. houselist.value[index]["active"] = true;
  237. }else{
  238. houselist.value[index]["active"] = false;
  239. }
  240. }
  241. getchannel();
  242. loadEvent();
  243. }
  244. const loadEchars03=()=>{
  245. let vl=[];
  246. for (let index = 0; index < eventFlowData.value.length; index++) {
  247. const element = eventFlowData.value[index];
  248. vl.push({date:element.date.substr(5),value:element[currFlowType.value]})
  249. }
  250. echars03data.value = vl;
  251. var gain = 0.9;
  252. var gap = 0;
  253. let maxvalue=0;
  254. //柱子数据
  255. var data = [];
  256. var dataX = [];
  257. echars03data.value.map(item=>{
  258. dataX.push(item.date);
  259. data.push(item.value);
  260. if (maxvalue.length>1){
  261. maxvalue = Math.max(maxvalue,item.value);
  262. }
  263. })
  264. maxvalue =maxvalue+2;
  265. var option = {
  266. backgroundColor: '',
  267. tooltip: {
  268. trigger: 'axis',
  269. axisPointer: {
  270. type: 'shadow',
  271. label: {
  272. show: true
  273. }
  274. }
  275. },
  276. grid: {
  277. left: '3%',
  278. top: '10%',
  279. right: '2%',
  280. bottom: '5%',
  281. containLabel: true
  282. },
  283. xAxis: [
  284. {
  285. type: 'category',
  286. axisTick: {
  287. show: false
  288. },
  289. axisLine: {
  290. lineStyle: {
  291. color: 'rgba(160,160,160,0.3)'
  292. }
  293. },
  294. axisLabel: {
  295. textStyle:{
  296. fontSize:12,
  297. color:'#5a6268'
  298. }
  299. },
  300. data: dataX
  301. },
  302. {
  303. type: 'category',
  304. axisLine: {
  305. show: false
  306. },
  307. axisTick: {
  308. show: false
  309. },
  310. axisLabel: {
  311. show: true,
  312. textStyle:{
  313. fontSize:12,
  314. color:'#fff'
  315. }
  316. },
  317. splitArea: {
  318. show: false
  319. },
  320. splitLine: {
  321. show: false
  322. },
  323. data: []
  324. }
  325. ],
  326. yAxis: {
  327. type: 'value',
  328. nameTextStyle: {
  329. color: '#ffffff',
  330. fontSize: 12
  331. },
  332. axisTick: {
  333. show: false
  334. },
  335. axisLine: {
  336. show: false
  337. },
  338. splitLine: {
  339. lineStyle: {
  340. color: '#575f66', // 分割线的颜色
  341. type: 'dashed',
  342. }
  343. },
  344. axisLabel: {
  345. textStyle: {
  346. color: '#5a6268',
  347. fontSize: 12
  348. }
  349. }
  350. },
  351. series: [
  352. {
  353. type: 'bar',
  354. xAxisIndex: 1,
  355. itemStyle: {
  356. normal: {
  357. show: true,
  358. color: "#2186fd00",
  359. barBorderRadius: 50,
  360. borderWidth: 0,
  361. borderColor: '#333'
  362. }
  363. },
  364. barWidth: '30%',
  365. data: [maxvalue, maxvalue, maxvalue, maxvalue,maxvalue, maxvalue, maxvalue, maxvalue,maxvalue, maxvalue, maxvalue, maxvalue]
  366. },
  367. {
  368. type: 'bar',
  369. itemStyle: {
  370. normal: {
  371. show: true,
  372. color: "#2186fd",
  373. barBorderRadius: 50,
  374. borderWidth: 0,
  375. borderColor: '#333'
  376. }
  377. },
  378. label: {
  379. normal: {
  380. show: true,
  381. position: 'top',
  382. textStyle: {
  383. fontSize: 12
  384. }
  385. }
  386. },
  387. barWidth: '30%',
  388. data: data
  389. }
  390. ]
  391. };
  392. setTimeout(() => {
  393. echarts.init(echarts03.value).setOption(option);
  394. }, 300);
  395. }
  396. const initvideodata=()=>{
  397. let tmp = [];
  398. for (let index = 0; index < Math.min(videocount_type.value*1,channelIdList.value.length); index++) {
  399. let ele = channelIdList.value[index];
  400. let video_url = window.VideoServerUrl+"/flv/"+ele.deviceCode+"/"+ele.channelId;
  401. tmp.push({name:ele.channelName,code:ele.deviceCode,contrlset:false,state:ele.status,statedesc:ele.status=='ON'?'在线':'离线',url:video_url});
  402. }
  403. video_list.value = tmp;
  404. setTimeout(() => {
  405. for(let i=0;i<tmp.length;i++){
  406. //tempPlayerRefs.value[tmp[i].code].play(tmp[i].url);
  407. }
  408. }, 200);
  409. }
  410. // 动态设置 ref 的函数
  411. const handleSetTempMap = (el, item) => {
  412. if (el) {
  413. tempPlayerRefs.value[item.code] = el;
  414. }
  415. };
  416. const videocontrl=(item)=>{
  417. item['contrlset'] = true
  418. }
  419. const closeCloudset=(item)=>{
  420. item['contrlset'] = false
  421. }
  422. //旋转
  423. //1:向上 ptzcmd=A50F0108007D003A 2:向下 ptzcmd=A50F0104007D0036 3:向右 ptzcmd=A50F01017D000033 4:向左 ptzcmd=A50F01027D000034
  424. //Bearer monibuca
  425. //停止指令:ptzcmd=A50F0100000000B5
  426. const ccMove=(dir,v)=>{
  427. let cmd = "";
  428. //http://47.108.159.150:8080/gb28181/api/ptz/34020000001180000003/34020000001310000051?ptzcmd=A50F0108007D003A
  429. if(dir==1){
  430. cmd = "A50F0108007D003A"
  431. }else if(dir==2){
  432. cmd = "A50F0104007D0036"
  433. }else if(dir==3){
  434. cmd = "A50F01017D000033"
  435. }else if(dir==4){
  436. cmd = "A50F01027D000034"
  437. }
  438. request({
  439. url: window.VideoServerUrl+'/gb28181/api/ptz/34020000001180000003/34020000001310000051?ptzcmd='+cmd,
  440. headers: {
  441. authorization: 'Bearer monibuca',
  442. },
  443. method: 'get',
  444. data: null
  445. }).then(res=>{
  446. if(res.code==0){
  447. cmd='A50F0100000000B5';
  448. request({
  449. url: window.VideoServerUrl+'/gb28181/api/ptz/34020000001180000003/34020000001310000051?ptzcmd='+cmd,
  450. headers: {
  451. authorization: 'Bearer monibuca',
  452. },
  453. method: 'get',
  454. data: null
  455. }).then(res=>{});
  456. }
  457. });
  458. }
  459. const ccParamsSet=(type,value)=>{
  460. if(type==1){
  461. cc_params1.value += value;
  462. if(cc_params1.value>100) cc_params1.value=100
  463. if(cc_params1.value<0) cc_params1.value=0
  464. } else if(type==2) {
  465. cc_params2.value += value;
  466. if(cc_params2.value>100) cc_params2.value=100
  467. if(cc_params2.value<0) cc_params2.value=0
  468. } else if(type==3) {
  469. cc_params3.value += value;
  470. if(cc_params3.value>100) cc_params3.value=100
  471. if(cc_params3.value<0) cc_params3.value=0
  472. } else if(type==4) {
  473. //音量
  474. cc_params4.value += value;
  475. if(cc_params4.value>100) cc_params4.value=100
  476. if(cc_params4.value<0) cc_params4.value=0
  477. tempPlayerRefs.value[selectHouse.value.code].volumeChange(cc_params4.value);
  478. }
  479. }
  480. onMounted(() => {
  481. })
  482. defineExpose({
  483. load
  484. })
  485. </script>
  486. <style lang='scss' scoped>
  487. ::v-deep .el-select__wrapper {
  488. /* 你的样式 */
  489. background-color: #303740;
  490. box-shadow: 0 0 0 1px #4f555c inset;
  491. .el-select__placeholder{
  492. color: #fff;
  493. font-size: 14px;
  494. }
  495. .el-select__placeholder.is-transparent{
  496. color: #ffffff94;
  497. }
  498. }
  499. .in_house{
  500. background-color: #18202a;
  501. position: absolute;
  502. left: 60px;
  503. top: 0;
  504. width: calc(100% - 60px);
  505. height: 100%;
  506. z-index: 100;
  507. .close{
  508. position: absolute;
  509. right: 15px;
  510. top: 10px;
  511. background-image: url(/images/close.png);
  512. cursor: pointer;
  513. width: 16px;
  514. height: 16px;
  515. background-size: 55%;
  516. background-repeat: no-repeat;
  517. background-position-x: center;
  518. background-position-y: center;
  519. border: 1px solid #ccc;
  520. }
  521. .returnback{
  522. position: absolute;
  523. left: 20px;
  524. top: 10px;
  525. background-image: url(/images/return.png);
  526. cursor: pointer;
  527. width: 16px;
  528. height: 16px;
  529. background-size: contain;
  530. border: 1px solid #ccc;
  531. }
  532. .content{
  533. margin-top: 38px;
  534. height: calc(100% - 38px);
  535. width: 100%;
  536. display: flex;
  537. .left{
  538. width: 18%;
  539. height: 100%;
  540. margin-right: 2%;
  541. padding-left: 20px;
  542. .el-select{
  543. margin-bottom: 5px;
  544. }
  545. .top{
  546. width: 100%;
  547. height: 60%;
  548. .houselist{
  549. height: 70%;
  550. width: 100%;
  551. overflow-y: auto;
  552. background-color: #303740;
  553. border: 1px solid #4f555c;
  554. border-radius: 3px;
  555. .house-item{
  556. color: #fff;
  557. font-size: 12px;
  558. padding: 5px;
  559. }
  560. .house-item.active,.house-item:hover{
  561. background-color: #4f555c;
  562. }
  563. }
  564. }
  565. .middle{
  566. width: 100%;
  567. height: 39%;
  568. .title{
  569. background-color: #192733;
  570. font-size: 14px;
  571. font-weight: bold;
  572. color: #fff;
  573. height: 35px;
  574. line-height: 15px;
  575. padding: 10px;
  576. display: flex;
  577. .line{
  578. width: 5px;
  579. height: 15px;
  580. background-color: #fff;
  581. border-radius: 5px;
  582. margin-right: 10px;
  583. }
  584. }
  585. .toolsbtn{
  586. height: 24px;
  587. width: 100%;
  588. display: flex;
  589. margin-top: 10px;
  590. margin-left: 10px;
  591. line-height: 15px;
  592. margin-right: 2px;
  593. cursor: pointer;
  594. .toolsbtn_item{
  595. display: inline-block;
  596. padding: 5px 10px;
  597. background-color: #262f38;
  598. color: #686f75;
  599. font-size: 12px;
  600. }
  601. .toolsbtn_item.active,.toolsbtn_item:hover{
  602. background-color: #2184fa;
  603. color: #fff;
  604. }
  605. }
  606. .echartsdiv{
  607. height: calc(100% - 66px);
  608. width: 100%;
  609. }
  610. }
  611. }
  612. .right{
  613. width: 80%;
  614. height: 100%;
  615. .top{
  616. height: 30px;
  617. line-height: 30px;
  618. margin-bottom: 10px;
  619. width: 100%;
  620. display: flex;
  621. .housename{
  622. font-weight: bold;
  623. color: #fff;
  624. width:200px;
  625. display: inline-block;
  626. text-overflow: hidden;
  627. }
  628. .iotstat{
  629. font-size: 12px;
  630. color: #fff;
  631. background-image: url('/images/iot_stat_bg.png');
  632. background-repeat: no-repeat;
  633. padding: 0 10px;
  634. background-size: contain;
  635. margin: 0 10px;
  636. display: inline-block;
  637. img{
  638. width: 16px;
  639. height: 16px;
  640. vertical-align: sub;
  641. }
  642. }
  643. .countstat{
  644. width: 58%;
  645. }
  646. .alarm_list{
  647. z-index: 10;
  648. font-size: 12px;
  649. text-align: center;
  650. .alarm_list_item{
  651. position: relative;
  652. margin: 0 5px;
  653. padding: 6px 10px;
  654. border-radius: 30px;
  655. color: #fff;
  656. background-color: #455b6d;
  657. img{
  658. width: 20px;
  659. height: 20px;
  660. vertical-align: middle;
  661. }
  662. .alarm_item_brager{
  663. position: absolute;
  664. font-weight: bold;
  665. width: 20px;
  666. height: 20px;
  667. border-radius: 50%;
  668. text-align: center;
  669. line-height: 20px;
  670. top: -13px;
  671. right: 0;
  672. font-size: 10px;
  673. }
  674. }
  675. }
  676. .videocount{
  677. height: 20px;
  678. width: 13%;
  679. line-height: 20px;
  680. margin-right: 2px;
  681. cursor: pointer;
  682. .videocount_item{
  683. display: inline-block;
  684. padding: 5px 10px;
  685. background-color: #262f38;
  686. color: #686f75;
  687. font-size: 12px;
  688. }
  689. .videocount_item.active,.videocount_item:hover{
  690. background-color: #2184fa;
  691. color: #fff;
  692. }
  693. }
  694. }
  695. .middle{
  696. height: calc(100% - 40px);
  697. width: 100%;
  698. display: flex;
  699. flex-wrap: wrap;
  700. .video{
  701. background-image: url('/images/video_bg.png');
  702. background-size: contain;
  703. .video-title{
  704. background-color: #ffffff45;
  705. font-size: 12px;
  706. height: 20px;
  707. line-height: 20px;
  708. color: #fff;
  709. img{
  710. width: 24px;
  711. height: 14px;
  712. vertical-align: text-top;
  713. margin: 0 5px;
  714. }
  715. }
  716. .video-play{
  717. width: 100%;
  718. height: calc(100% - 20px);
  719. }
  720. }
  721. .contrlset{
  722. position: absolute;
  723. width: 1288px !important;
  724. height: 760px !important;
  725. z-index: 1000;
  726. left: 50%;
  727. top: 50%;
  728. margin-top: -380px !important;
  729. margin-left: -644px !important;
  730. border-radius: 10px;
  731. border: 1px solid #4f555c;
  732. .video-title{
  733. border-radius: 10px 10px 0 0 !important;
  734. }
  735. .cloudset{
  736. width: 258px !important;
  737. margin-left: 4px;
  738. background-color: #303740;
  739. border: 1px solid #4f555c;
  740. height: calc(100% - 20px);
  741. float: right;
  742. border-radius: 0 0 10px 0;
  743. .camername{
  744. color: #dadada;
  745. font-weight: bold;
  746. font-size: 20px;
  747. width: 100%;
  748. text-align: center;
  749. height: 100px;
  750. line-height: 100px;
  751. }
  752. .cc{
  753. position: relative;
  754. height: 260px;
  755. width: 100%;
  756. .cc_bg{
  757. background-image: url('/images/cc_bg.png');
  758. width: 150px;
  759. height: 150px;
  760. position: absolute;
  761. top: 50%;
  762. left: 50%;
  763. margin-left: -75px;
  764. margin-top: -75px;
  765. background-size: contain;
  766. }
  767. .cc_01{
  768. background-image: url('/images/cc_01.png');
  769. background-size: contain;
  770. width: 20px;
  771. height: 20px;
  772. position: absolute;
  773. top:75px;
  774. left:50%;
  775. margin-left: -10px;
  776. cursor: pointer;
  777. }
  778. .cc_02{
  779. background-image: url('/images/cc_02.png');
  780. background-size: contain;
  781. width: 20px;
  782. height: 20px;
  783. position: absolute;
  784. bottom:75px;
  785. left:50%;
  786. margin-left: -10px;
  787. cursor: pointer;
  788. }
  789. .cc_03{
  790. background-image: url('/images/cc_03.png');
  791. background-size: contain;
  792. width: 20px;
  793. height: 20px;
  794. position: absolute;
  795. top:50%;
  796. right:73px;
  797. margin-top: -10px;
  798. margin-left: -10px;
  799. cursor: pointer;
  800. }
  801. .cc_04{
  802. background-image: url('/images/cc_04.png');
  803. background-size: contain;
  804. width: 20px;
  805. height: 20px;
  806. position: absolute;
  807. top:50%;
  808. left:82px;
  809. margin-top: -10px;
  810. margin-left: -10px;
  811. cursor: pointer;
  812. }
  813. }
  814. .cc_params{
  815. color: #dadada;
  816. height: 40px;
  817. line-height: 40px;
  818. font-size: 12px;
  819. width: 100%;
  820. padding: 0 20px;
  821. display: flex;
  822. img{
  823. height: 32px;
  824. width: 32px;
  825. cursor: pointer;
  826. margin-top: 4px;
  827. }
  828. .span1{
  829. width:36px;
  830. }
  831. .span2{
  832. margin-left:5px;
  833. font-size: 10px;
  834. }
  835. .span3{
  836. font-size: 10px;
  837. display: inline-block;
  838. width: 100px;
  839. height: 2px;
  840. background: #ffffff33;
  841. margin: 20px 0;
  842. position: relative;
  843. .span31{
  844. position: absolute;
  845. height: 2px;
  846. background-color: #fff;
  847. left:0;
  848. top:0;
  849. width:0%;
  850. }
  851. .span32{
  852. background-image: url('/images/cc_p.png');
  853. background-size: contain;
  854. width: 20px;
  855. height: 20px;
  856. position: absolute;
  857. top:-9px;
  858. left:-8px;
  859. }
  860. }
  861. .span4{
  862. font-size: 10px;
  863. opacity: 0.2;
  864. margin-right:5px;
  865. }
  866. }
  867. .audio{
  868. position: relative;
  869. height: 100px;
  870. margin-top: 50px;
  871. width: 100%;
  872. img{
  873. width:48px;
  874. height: 48px;
  875. position: absolute;
  876. top: 50%;
  877. left: 50%;
  878. margin-left: -24px;
  879. margin-top: -24px;
  880. }
  881. }
  882. }
  883. .video-play{
  884. width: 1024px !important;
  885. float: left;
  886. }
  887. }
  888. .type4{
  889. width: calc(50% - 10px);
  890. height: calc(50% - 10px);
  891. margin: 5px;
  892. }
  893. }
  894. }
  895. }
  896. }
  897. </style>