rightSafe.vue 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051
  1. <template>
  2. <div class="right_safe">
  3. <!-- 景区防火监控标题区域 -->
  4. <div class="safe_title top"></div>
  5. <!-- 景区防火监控内容区域 -->
  6. <div class="safe_video">
  7. <!-- 左边边框线区域 -->
  8. <div class="video_line left"></div>
  9. <!-- 右边边框线区域 -->
  10. <div class="video_line right"></div>
  11. <!-- 每一个监控区域 -->
  12. <div class="video_item" v-for="(item, index) in videoList" :key="index">
  13. <div class="item_noSignal">无信号</div>
  14. <div class="item_box" :id="item.id" v-show="item.isShow"></div>
  15. <div class="item_mask">{{ item.name }}</div>
  16. </div>
  17. </div>
  18. <!-- 景区防火统计标题区域 -->
  19. <div class="safe_title center"></div>
  20. <!-- 景区防火统计内容区域 -->
  21. <div class="safe_fire">
  22. <!-- 当前防火等级提示区域 -->
  23. <div class="fire_left">
  24. <div class="left_title">当前防火等级提示</div>
  25. <div class="left_content">
  26. <div class="content_level">
  27. {{
  28. fireLevel == "1"
  29. ? "I"
  30. : fireLevel == "2"
  31. ? "II"
  32. : fireLevel == "3"
  33. ? "III"
  34. : "IV"
  35. }}
  36. </div>
  37. <div class="content_text">防火等级</div>
  38. <div class="content_type">
  39. {{
  40. fireLevel == "1"
  41. ? "极其危险"
  42. : fireLevel == "2"
  43. ? "高度危险"
  44. : fireLevel == "3"
  45. ? "中度危险"
  46. : "低度危险"
  47. }}
  48. </div>
  49. </div>
  50. </div>
  51. <!-- 处置情况区域 -->
  52. <div class="fire_center">
  53. <div class="center_title">处置情况</div>
  54. <div class="center_content">
  55. <!-- 每一个盒子区域 -->
  56. <div
  57. class="content_box"
  58. :title="item.name"
  59. :class="{ click: item.name === '冒烟警告' }"
  60. v-for="item in iconList"
  61. :key="item.id"
  62. @click="handleClickFire(item)"
  63. >
  64. <div class="box_img">
  65. <img :src="item.url" />
  66. </div>
  67. <div class="box_info">
  68. <div class="info_name">
  69. {{ item.name }}
  70. </div>
  71. <div class="info_num">
  72. <div ref="infoNum" :data-value="item.num">{{ item.num }}</div>
  73. <span>次</span>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. <!-- 防火记录区域 -->
  80. <div class="fire_right">
  81. <div class="right_title">防火记录</div>
  82. <div class="right_table">
  83. <el-table :data="tableData" style="width: 100%">
  84. <el-table-column
  85. type="index"
  86. label="序号"
  87. width="70"
  88. align="center"
  89. />
  90. <el-table-column
  91. prop="publishTime"
  92. label="发现时间"
  93. align="center"
  94. />
  95. <el-table-column
  96. prop="place"
  97. label="地点"
  98. show-overflow-tooltip
  99. align="center"
  100. />
  101. <el-table-column label="处置情况" align="center">
  102. <template #default="{ row }">
  103. {{ row.handleStatus == 1 ? "处置中" : "已处置" }}
  104. </template>
  105. </el-table-column>
  106. <el-table-column label="操作" align="center">
  107. <template #default="{ row }">
  108. <div class="table_btn" @click="handleClickDetail(row)">
  109. 查看详情
  110. </div>
  111. </template>
  112. </el-table-column>
  113. </el-table>
  114. </div>
  115. </div>
  116. </div>
  117. <!-- 应急广播标题区域 -->
  118. <div class="safe_title bottom"></div>
  119. <!-- 应急广播内容区域 -->
  120. <div class="safe_broadcast">
  121. <!-- 播发时间区域 -->
  122. <div class="broadcast_left">
  123. <div class="left_title">播发时间</div>
  124. <div class="left_container">
  125. <div class="container_box">
  126. <!-- 每一个时间段区域 -->
  127. <div
  128. class="box_time"
  129. v-for="(item, index) in timeList"
  130. :key="index"
  131. >
  132. {{ item[0].slice(0, 5) }}-{{ item[1].slice(0, 5) }}
  133. </div>
  134. </div>
  135. </div>
  136. </div>
  137. <!-- 调度统计区域 -->
  138. <div class="broadcast_center">
  139. <div class="center_title">调度统计</div>
  140. <div class="center_container">
  141. <!-- 每一个统计区域 -->
  142. <div class="container_item" v-for="item in list" :key="item.id">
  143. <div class="item_icon">
  144. <img src="@/assets/images/26.png" />
  145. </div>
  146. <div class="item_msg">
  147. <div class="msg_box"></div>
  148. <div class="msg_line"></div>
  149. <div class="msg_text">{{ item.name }}</div>
  150. <div class="msg_border"></div>
  151. <div class="msg_num" ref="msgNum" :data-value="item.num">
  152. {{ item.num }}
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. <!-- 播发记录区域 -->
  159. <div class="broadcast_right">
  160. <div class="right_title">
  161. <div>
  162. 播发记录
  163. <span
  164. style="
  165. margin-left: 20px;
  166. font-size: 20px;
  167. color: #2493f1;
  168. cursor: pointer;
  169. "
  170. @click="goPage"
  171. >
  172. 点击进入
  173. </span>
  174. </div>
  175. <div class="icon_box" @click="handleClickMore">
  176. 查看更多
  177. <img src="@/assets/images/right.png" />
  178. </div>
  179. </div>
  180. <div class="right_table">
  181. <el-table :data="broadcastData" style="width: 100%">
  182. <el-table-column
  183. prop="title"
  184. label="播发内容"
  185. show-overflow-tooltip
  186. align="center"
  187. />
  188. <el-table-column
  189. prop="address"
  190. label="播发地点"
  191. show-overflow-tooltip
  192. align="center"
  193. /><el-table-column
  194. prop="broadcastType"
  195. label="广播类型"
  196. show-overflow-tooltip
  197. align="center"
  198. />
  199. <el-table-column
  200. prop="messageType"
  201. label="消息类型"
  202. show-overflow-tooltip
  203. align="center"
  204. />
  205. <el-table-column
  206. prop="playTime"
  207. label="播出时间"
  208. show-overflow-tooltip
  209. align="center"
  210. width="150"
  211. />
  212. </el-table>
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. <!-- 防火记录查看详情弹窗区域 -->
  218. <Transition name="fade">
  219. <FireDetailDialog v-if="showDetail" :showObj="showObj" @close="close" />
  220. </Transition>
  221. <!-- 冒烟警告列表弹窗区域 -->
  222. <Transition name="fade">
  223. <SmokeList v-if="showSmoke" @closeDialog="closeDialog" />
  224. </Transition>
  225. <!-- 播发记录列表弹窗区域 -->
  226. <Transition name="fade">
  227. <BroadcastList v-if="showBroadcast" @closeDialog="closeDialog" />
  228. </Transition>
  229. </template>
  230. <script setup lang="ts">
  231. import { ref, onMounted, onUnmounted, nextTick } from "vue";
  232. import FireDetailDialog from "./fireDetailDialog.vue";
  233. import BroadcastList from "./broadcastList.vue";
  234. import SmokeList from "./smokeList.vue";
  235. import img from "@/assets/images/23.png";
  236. import img2 from "@/assets/images/76.png";
  237. import img3 from "@/assets/images/77.png";
  238. import img4 from "@/assets/images/78.png";
  239. import { countUpNum } from "@/utils/countUpNum.ts";
  240. // 引入监控相关的数据接口
  241. import { getVedio } from "@/api/video/index";
  242. // 引入广播相关的数据接口
  243. import { reqBroadcastInfo, reqBroadcastList } from "@/api/broadcast/index";
  244. // 引入防火相关的数据接口
  245. import { reqFireLevel, reqDisposeMsg, reqFireData } from "@/api/fire/index";
  246. // @ts-ignore
  247. import WasmPlayer from "@easydarwin/easywasmplayer";
  248. import { changeArray } from "@/utils/changeArray";
  249. // 防火记录查看详情弹窗显示隐藏控制
  250. const showDetail = ref(false);
  251. // 冒烟警告列表弹窗显示隐藏控制
  252. const showSmoke = ref(false);
  253. // 播发记录列表弹窗显示隐藏控制
  254. const showBroadcast = ref(false);
  255. // DOM标识
  256. const infoNum = ref();
  257. const msgNum = ref();
  258. // 监控实例数组
  259. const playerList = ref<any>([]);
  260. // 播发时间列表
  261. const timeList = ref<any>([]);
  262. // 防火等级
  263. const fireLevel = ref("");
  264. // 延时器实例数组
  265. const timerList = ref<any>([]);
  266. // 监控列表
  267. const videoList = ref<any>([
  268. {
  269. id: "4",
  270. name: "宝峰小湾森林防火",
  271. rtspaddr: "rtsp://admin:hik12345@6.205.67.206:554/Streaming/Channels/102",
  272. isShow: false,
  273. timer: null,
  274. },
  275. {
  276. id: "5",
  277. name: "三爪仑虎啸峡森林防火",
  278. rtspaddr: "rtsp://admin:hik12345@6.205.67.207:554/Streaming/Channels/102",
  279. isShow: false,
  280. timer: null,
  281. },
  282. {
  283. id: "6",
  284. name: "中源景区防火",
  285. rtspaddr: "rtsp://admin:hik12345@6.205.67.208:554/Streaming/Channels/102",
  286. isShow: false,
  287. timer: null,
  288. },
  289. ]);
  290. // 防火记录列表
  291. const tableData = ref([]);
  292. // 处置情况列表
  293. const iconList = ref([
  294. {
  295. id: 1,
  296. name: "扑救火灾",
  297. num: 0,
  298. url: img,
  299. },
  300. {
  301. id: 2,
  302. name: "转移安置人员",
  303. num: 0,
  304. url: img2,
  305. },
  306. {
  307. id: 3,
  308. name: "救治负伤",
  309. num: 0,
  310. url: img3,
  311. },
  312. {
  313. id: 4,
  314. name: "保护重要目标",
  315. num: 0,
  316. url: img4,
  317. },
  318. {
  319. id: 5,
  320. name: "维护社会治安",
  321. num: 0,
  322. url: img,
  323. },
  324. {
  325. id: 6,
  326. name: "发布信息",
  327. num: 0,
  328. url: img,
  329. },
  330. {
  331. id: 7,
  332. name: "稍后处置",
  333. num: 0,
  334. url: img,
  335. },
  336. {
  337. id: 8,
  338. name: "火场清理",
  339. num: 0,
  340. url: img,
  341. },
  342. {
  343. id: 9,
  344. name: "冒烟警告",
  345. num: 1,
  346. url: img,
  347. },
  348. ]);
  349. // 播发记录列表
  350. const broadcastData = ref([]);
  351. // 调度统计数据
  352. const list = ref([
  353. {
  354. id: 1,
  355. name: "设备总数",
  356. num: 0,
  357. },
  358. {
  359. id: 2,
  360. name: "播发统计",
  361. num: 0,
  362. },
  363. {
  364. id: 3,
  365. name: "设备在线数",
  366. num: 0,
  367. },
  368. ]);
  369. // 防火记录详情弹窗数据
  370. const showObj = ref({});
  371. onMounted(() => {
  372. // 获取监控视频地址
  373. getVideosData();
  374. // 获取当前防火等级
  375. getFireLevel();
  376. // 获取处置情况信息
  377. getDisposeMsg();
  378. // 获取防火记录列表
  379. getFireData();
  380. // 获取应急广播信息
  381. getBroadcastInfo();
  382. // 获取播发记录列表
  383. getBroadcastList();
  384. });
  385. onUnmounted(() => {
  386. // 销毁WasmPlayer实例
  387. destroyVideos();
  388. // 销毁延时器实例
  389. destroyTimers();
  390. });
  391. // 获取监控视频地址
  392. const getVideosData = () => {
  393. videoList.value.forEach(async (ele: any) => {
  394. const res = await getVedio(ele.rtspaddr);
  395. let player = new WasmPlayer(null, ele.id, (a: any) => {
  396. // a表示当前播放的状态
  397. if (a === "videoTimestamp") {
  398. ele.isShow = true;
  399. } else {
  400. // 开启一个延时20秒的延时器
  401. if (!ele.timer) {
  402. ele.timer = setTimeout(() => {
  403. // 如果isShow为false表示播放失败,此时断开连接节约性能
  404. if (!ele.isShow) {
  405. player.destroy();
  406. }
  407. // 收集延时器实例方便后面销毁
  408. timerList.value.push(ele.timer);
  409. }, 20000);
  410. }
  411. }
  412. });
  413. player.play(res, 1);
  414. playerList.value.push(player);
  415. });
  416. };
  417. // 获取当前防火等级
  418. const getFireLevel = async () => {
  419. const res = await reqFireLevel();
  420. // console.log(res);
  421. fireLevel.value = res.data.level;
  422. };
  423. // 获取处置情况信息
  424. const getDisposeMsg = async () => {
  425. const res = await reqDisposeMsg();
  426. // console.log(res);
  427. // 扑救火灾次数
  428. iconList.value[0].num = res.data.numOfPutOutTheFire;
  429. // 转移安置人员
  430. iconList.value[1].num = res.data.numOfTransfer;
  431. // 救治负伤
  432. iconList.value[2].num = res.data.numOfCure;
  433. // 保护重要目标
  434. iconList.value[3].num = res.data.numOfImportantTarget;
  435. // 维护社会治安
  436. iconList.value[4].num = res.data.numOfPublicSecurity;
  437. // 发布信息
  438. iconList.value[5].num = res.data.numOfInfo;
  439. // 稍后处置
  440. iconList.value[6].num = res.data.numOfAftermath;
  441. // 火场清理
  442. iconList.value[7].num = res.data.numOfFireClean;
  443. // 冒烟警告
  444. iconList.value[8].num = res.data.numOfSmoke;
  445. // 让数字跳动
  446. nextTick(() => {
  447. infoNum.value.forEach((ele: any) => {
  448. countUpNum(ele, ele.dataset.value);
  449. });
  450. });
  451. };
  452. // 获取防火记录列表
  453. const getFireData = async () => {
  454. const res = await reqFireData({
  455. cur: 1,
  456. pageSize: 4,
  457. });
  458. // console.log(res);
  459. tableData.value = res.data.list;
  460. };
  461. // 获取应急广播信息
  462. const getBroadcastInfo = async () => {
  463. const res = await reqBroadcastInfo();
  464. // console.log(res);
  465. // 把时间数据变成一个数组
  466. let arr = res.data.broadcastTime.split(",");
  467. // 转变成二维数组
  468. timeList.value = changeArray(arr, 2);
  469. // 设备总数
  470. list.value[0].num = res.data.numOfDevice;
  471. // 播发条数统计
  472. list.value[1].num = res.data.numOfBroadcasts;
  473. // 设备在线数
  474. list.value[2].num = res.data.numOfDevice * (res.data.rateOfInline * 0.01);
  475. // 让数字跳动
  476. nextTick(() => {
  477. msgNum.value.forEach((ele: any) => {
  478. countUpNum(ele, ele.dataset.value);
  479. });
  480. });
  481. };
  482. // 获取播发记录列表
  483. const getBroadcastList = async () => {
  484. const res = await reqBroadcastList({
  485. curPage: 1,
  486. pageSize: 4,
  487. });
  488. // console.log(res);
  489. broadcastData.value = res.data.recordPage.list;
  490. };
  491. // 销毁WasmPlayer实例
  492. const destroyVideos = () => {
  493. playerList.value.forEach((ele: any) => {
  494. ele.destroy();
  495. });
  496. };
  497. // 销毁延时器实例
  498. const destroyTimers = () => {
  499. timerList.value.forEach((ele: any) => {
  500. clearTimeout(ele);
  501. });
  502. };
  503. // 点击查看详情按钮回调
  504. const handleClickDetail = (row: any) => {
  505. showDetail.value = true;
  506. showObj.value = row;
  507. };
  508. // 点击冒烟告警回调
  509. const handleClickFire = (item: any) => {
  510. if (item.name === "冒烟警告") {
  511. // console.log(item);
  512. showSmoke.value = true;
  513. }
  514. };
  515. // 播发记录点击查看更多回调
  516. const handleClickMore = () => {
  517. showBroadcast.value = true;
  518. };
  519. // 自定义事件
  520. const close = (data: boolean) => {
  521. showDetail.value = data;
  522. };
  523. const closeDialog = (data: boolean) => {
  524. showSmoke.value = data;
  525. showBroadcast.value = data;
  526. };
  527. const goPage = () => {
  528. window.open("http://6.200.0.4/admin/auth/login");
  529. };
  530. </script>
  531. <style lang="scss" scoped>
  532. .right_safe {
  533. padding-right: 132px;
  534. width: 2000px;
  535. height: 100%;
  536. .safe_title {
  537. width: 100%;
  538. height: 96px;
  539. background-size: contain;
  540. background-repeat: no-repeat;
  541. }
  542. .top {
  543. background-image: url(@/assets/images/16.png);
  544. }
  545. .safe_video {
  546. position: relative;
  547. display: flex;
  548. justify-content: space-between;
  549. padding: 0 96px;
  550. margin: 32px 0;
  551. width: 100%;
  552. height: 377px;
  553. .video_line {
  554. position: absolute;
  555. top: 20px;
  556. width: 32px;
  557. height: 356px;
  558. background-image: url(@/assets/images/19.png);
  559. background-size: 100% 100%;
  560. }
  561. .left {
  562. left: 0;
  563. }
  564. .right {
  565. right: 0;
  566. transform: rotateY(180deg);
  567. }
  568. .video_item {
  569. position: relative;
  570. width: 548px;
  571. height: 377px;
  572. border-radius: 10px 10px 0 0;
  573. overflow: hidden;
  574. .item_noSignal {
  575. position: absolute;
  576. top: 0;
  577. width: 100%;
  578. height: 100%;
  579. display: flex;
  580. justify-content: center;
  581. align-items: center;
  582. font-size: 30px;
  583. background-color: #000;
  584. }
  585. .item_box {
  586. width: 100%;
  587. height: 100%;
  588. }
  589. .item_mask {
  590. position: absolute;
  591. left: 0;
  592. bottom: 0;
  593. padding: 11px 0 0 24px;
  594. width: 548px;
  595. height: 70px;
  596. font-size: 26px;
  597. background-color: rgba(52, 77, 94, 0.8);
  598. }
  599. }
  600. }
  601. .center {
  602. background-image: url(@/assets/images/17.png);
  603. }
  604. .safe_fire {
  605. display: flex;
  606. justify-content: space-between;
  607. width: 100%;
  608. height: 483px;
  609. .fire_left {
  610. width: 450px;
  611. height: 100%;
  612. .left_title {
  613. padding-left: 44px;
  614. margin-top: 32px;
  615. width: 100%;
  616. height: 48px;
  617. font-size: 28px;
  618. font-family: "庞门正道标题体";
  619. background-image: url(@/assets/images/20.png);
  620. background-size: 100% 100%;
  621. }
  622. .left_content {
  623. position: relative;
  624. margin-top: 22px;
  625. width: 100%;
  626. height: 346px;
  627. background-image: url(@/assets/images/29.png);
  628. background-size: 100% 100%;
  629. .content_level {
  630. position: absolute;
  631. top: 100px;
  632. left: 150px;
  633. width: 120px;
  634. text-align: center;
  635. font-size: 50px;
  636. font-family: "庞门正道标题体";
  637. }
  638. .content_text {
  639. position: absolute;
  640. top: 161px;
  641. left: 150px;
  642. width: 120px;
  643. text-align: center;
  644. font-size: 16px;
  645. }
  646. .content_type {
  647. position: absolute;
  648. top: 254px;
  649. left: 83px;
  650. width: 260px;
  651. height: 51px;
  652. line-height: 51px;
  653. text-align: center;
  654. color: #00cfff;
  655. font-size: 24px;
  656. font-family: "庞门正道标题体";
  657. }
  658. }
  659. }
  660. .fire_center {
  661. width: 700px;
  662. height: 100%;
  663. .center_title {
  664. padding-left: 44px;
  665. margin-top: 32px;
  666. width: 100%;
  667. height: 48px;
  668. font-size: 28px;
  669. font-family: "庞门正道标题体";
  670. background-image: url(@/assets/images/21.png);
  671. background-size: 100% 100%;
  672. }
  673. .center_content {
  674. display: grid;
  675. gap: 30px;
  676. grid-template-columns: repeat(3, 1fr);
  677. grid-template-rows: repeat(3, 1fr);
  678. margin-top: 36px;
  679. margin-left: 10px;
  680. width: 100%;
  681. height: 335px;
  682. .content_box {
  683. display: flex;
  684. align-items: center;
  685. .box_img {
  686. width: 78px;
  687. height: 78px;
  688. img {
  689. width: 100%;
  690. height: 100%;
  691. }
  692. }
  693. .box_info {
  694. display: flex;
  695. flex-direction: column;
  696. justify-content: space-between;
  697. margin-left: 17.5px;
  698. width: 120px;
  699. height: 78px;
  700. overflow: hidden;
  701. .info_name {
  702. font-size: 20px;
  703. overflow: hidden;
  704. text-overflow: ellipsis;
  705. white-space: nowrap;
  706. }
  707. .info_num {
  708. display: flex;
  709. font-size: 25px;
  710. color: #99ceff;
  711. span {
  712. align-self: flex-end;
  713. margin-left: 5px;
  714. font-size: 12px;
  715. }
  716. }
  717. }
  718. }
  719. .click {
  720. color: #57b9ff;
  721. cursor: pointer;
  722. }
  723. }
  724. }
  725. .fire_right {
  726. width: 640px;
  727. height: 100%;
  728. .right_title {
  729. padding-left: 44px;
  730. margin-top: 32px;
  731. width: 100%;
  732. height: 48px;
  733. font-size: 28px;
  734. font-family: "庞门正道标题体";
  735. background-image: url(@/assets/images/22.png);
  736. background-size: 100% 100%;
  737. }
  738. .right_table {
  739. margin-top: 40px;
  740. width: 100%;
  741. height: 345px;
  742. overflow-y: auto;
  743. .table_btn {
  744. color: #2493f1;
  745. cursor: pointer;
  746. }
  747. }
  748. }
  749. }
  750. .bottom {
  751. background-image: url(@/assets/images/18.png);
  752. }
  753. .safe_broadcast {
  754. display: flex;
  755. justify-content: space-between;
  756. width: 100%;
  757. height: 438px;
  758. .broadcast_left {
  759. width: 450px;
  760. height: 100%;
  761. .left_title {
  762. padding-left: 44px;
  763. margin-top: 32px;
  764. width: 100%;
  765. height: 48px;
  766. font-size: 28px;
  767. font-family: "庞门正道标题体";
  768. background-image: url(@/assets/images/20.png);
  769. background-size: 100% 100%;
  770. }
  771. .left_container {
  772. display: flex;
  773. justify-content: center;
  774. align-items: center;
  775. margin-top: 22px;
  776. width: 100%;
  777. height: 275px;
  778. border-radius: 10px;
  779. border: 1px solid rgba(255, 255, 255, 0.2);
  780. .container_box {
  781. padding: 25px 36px;
  782. width: 96%;
  783. height: 255px;
  784. border-radius: 10px;
  785. background-color: rgba(142, 207, 250, 0.1);
  786. .box_time {
  787. display: flex;
  788. justify-content: center;
  789. align-items: center;
  790. margin-bottom: 16.5px;
  791. width: 357px;
  792. height: 57px;
  793. font-size: 24px;
  794. border-left: 3px solid #8eb2fa;
  795. box-shadow: 0 0 15px 15px rgb(2, 2, 28, 0.8);
  796. background-image: url(@/assets/images/24.png);
  797. background-size: 100% 100%;
  798. }
  799. }
  800. }
  801. }
  802. .broadcast_center {
  803. width: 700px;
  804. height: 100%;
  805. .center_title {
  806. padding-left: 44px;
  807. margin-top: 32px;
  808. width: 100%;
  809. height: 48px;
  810. font-size: 28px;
  811. font-family: "庞门正道标题体";
  812. background-image: url(@/assets/images/21.png);
  813. background-size: 100% 100%;
  814. }
  815. .center_container {
  816. display: flex;
  817. justify-content: space-between;
  818. margin-top: 56px;
  819. width: 100%;
  820. height: 242px;
  821. .container_item {
  822. display: flex;
  823. flex-direction: column;
  824. align-items: center;
  825. width: 210px;
  826. height: 242px;
  827. .item_icon {
  828. width: 120px;
  829. height: 103px;
  830. text-align: center;
  831. background-image: url(@/assets/images/25.png);
  832. background-size: 100% 100%;
  833. animation: float2 3s linear infinite;
  834. img {
  835. width: 63px;
  836. height: 60px;
  837. }
  838. }
  839. .item_msg {
  840. position: relative;
  841. width: 100%;
  842. height: 139px;
  843. .msg_box {
  844. position: absolute;
  845. top: 46px;
  846. left: 30px;
  847. width: 14px;
  848. height: 14px;
  849. background-color: #ede27b;
  850. }
  851. .msg_line {
  852. position: absolute;
  853. top: 60px;
  854. left: 37px;
  855. width: 13.5px;
  856. height: 47.5px;
  857. background-image: url(@/assets/images/27.png);
  858. background-size: 100% 100%;
  859. }
  860. .msg_text {
  861. position: absolute;
  862. top: 30px;
  863. left: 57px;
  864. font-size: 24px;
  865. }
  866. .msg_border {
  867. position: absolute;
  868. top: 54px;
  869. left: 50px;
  870. width: 156px;
  871. height: 6px;
  872. background-image: url(@/assets/images/28.png);
  873. background-size: 100% 100%;
  874. }
  875. .msg_num {
  876. position: absolute;
  877. top: 87px;
  878. left: 55px;
  879. font-size: 40px;
  880. font-weight: bold;
  881. }
  882. }
  883. }
  884. }
  885. }
  886. .broadcast_right {
  887. width: 640px;
  888. height: 100%;
  889. .right_title {
  890. display: flex;
  891. justify-content: space-between;
  892. padding-left: 44px;
  893. margin-top: 32px;
  894. width: 100%;
  895. height: 48px;
  896. font-size: 28px;
  897. font-family: "庞门正道标题体";
  898. background-image: url(@/assets/images/22.png);
  899. background-size: 100% 100%;
  900. .icon_box {
  901. display: flex;
  902. font-size: 18px;
  903. font-family: "";
  904. color: #a8d5ff;
  905. cursor: pointer;
  906. img {
  907. margin-right: 28px;
  908. margin-left: 12px;
  909. width: 21px;
  910. height: 21px;
  911. }
  912. }
  913. }
  914. .right_table {
  915. margin-top: 39px;
  916. width: 100%;
  917. height: 320px;
  918. overflow-y: auto;
  919. }
  920. }
  921. }
  922. }
  923. /*最外层透明*/
  924. .right_table ::v-deep(.el-table),
  925. .right_table ::v-deep(.el-table__expanded-cell) {
  926. background-color: transparent;
  927. color: white;
  928. border: none;
  929. }
  930. /* 表格内背景颜色 */
  931. .right_table ::v-deep(.el-table th),
  932. .right_table ::v-deep(.el-table tr),
  933. .right_table ::v-deep(.el-table td) {
  934. background-color: transparent !important;
  935. color: white;
  936. font-size: 20px;
  937. border-color: rgba(255, 255, 255, 0.1);
  938. }
  939. // 表格底部白线清除
  940. ::v-deep(.el-table__inner-wrapper::before) {
  941. height: 0;
  942. }
  943. // 修改表头背景颜色
  944. ::v-deep(.el-table__header) {
  945. background-color: rgba(52, 70, 94, 0.2);
  946. }
  947. // 清除表格默认padding
  948. ::v-deep(.el-table .el-table__body-wrapper .el-table__cell) {
  949. // padding: 0;
  950. height: 52px;
  951. }
  952. </style>