right.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <template>
  2. <el-aside class="right">
  3. <div class="right_top">
  4. <div class="title">
  5. <div class="text">物联设备统计</div>
  6. </div>
  7. <div class="content">
  8. <div class="logo">
  9. <span>{{ equipmentTotal.total }}</span>
  10. <img class="animate" :src="d1img" alt="">
  11. <img :src="d12img" alt="">
  12. <span><b>总数</b>(个)</span>
  13. </div>
  14. <div class="list">
  15. <div class="item_r">
  16. <img :src="d2img" alt="">
  17. <div class="percent">
  18. 在线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ equipmentTotal.online }}
  19. <span>(个)</span>
  20. </div>
  21. </div>
  22. <div class="item_r">
  23. <img :src="d3img" alt="">
  24. <div class="percent">
  25. 离线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {{ equipmentTotal.underline }}
  26. <span>(个)</span>
  27. </div>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. <div class="right_center">
  33. <div class="title">
  34. <div class="text">物联设备类型统计</div>
  35. </div>
  36. <div class="contentwrap">
  37. <div class="count" v-for="(item, index) in interDevice" :key="index">
  38. <CircleProgress :target-value="item.number" :color="item.color" text-position="top">
  39. <img :src="deviceImg + item.icon + '.png'" alt="">
  40. <!-- <img :src="'src/assets/img/' + item.icon + '.png'" alt=""> -->
  41. </CircleProgress>
  42. <div class="text">{{ item.text }}</div>
  43. </div>
  44. </div>
  45. </div>
  46. <div class="right_bottom">
  47. <div class="title">
  48. <div class="text">智慧教室实时监控</div>
  49. </div>
  50. <div class="monitorContent">
  51. <el-carousel class="monitor">
  52. <el-carousel-item v-for="(item, index) in carouselData" :key="index">
  53. <p>{{ item.activeMonitor.title }}</p>
  54. <div class="interactclass">
  55. <div class="room" v-for="(item, index) in item.activeMonitor.array" :key="index">
  56. <span>{{ item.title }}</span>
  57. <img :src="deviceImg + 'rb2.png'" alt="" @click="lookVideo(item)">
  58. </div>
  59. </div>
  60. <p style="margin-top: 5px;">{{ item.activeMonitor.title1 }}</p>
  61. <div class="interactclass">
  62. <div class="room" v-for="(item, index) in item.activeMonitor.array1" :key="index">
  63. <span>{{ item.title }}</span>
  64. <img :src="deviceImg + 'rb2.png'" alt="" @click="lookVideo(item.src)">
  65. </div>
  66. </div>
  67. </el-carousel-item>
  68. </el-carousel>
  69. </div>
  70. </div>
  71. </el-aside>
  72. <!-- 视频播放弹框 -->
  73. <el-dialog class="videoDialog" v-model="videoDialog" :title="dialogTitle" width="60%" align="center" top="4%">
  74. <videoPlay v-bind="videoData" />
  75. <!-- {{ videoData.src }} -->
  76. </el-dialog>
  77. </template>
  78. <script >
  79. import { reactive, onMounted, ref, } from 'vue';
  80. import { ElCarousel, ElCarouselItem } from "element-plus";
  81. import "vue3-video-play/dist/style.css";
  82. import { videoPlay } from "vue3-video-play";
  83. import CircleProgress from './CircleProgress.vue';
  84. import { getDevice, getVideoUrl } from '../request/api';
  85. export default ({
  86. name: 'Histogram',
  87. components: { videoPlay, ElCarousel, ElCarouselItem, CircleProgress },
  88. setup() {
  89. // 视频数据
  90. const videoData = reactive({
  91. width: "100%", //播放器高度
  92. height: "100%", //播放器高度
  93. color: "red", //主题色
  94. // title: "互动教室", //视频名称
  95. // src: "https://cdn.jsdelivr.net/gh/xdlumia/files/video-play/IronMan.mp4", //视频源
  96. src: "",
  97. type: "m3u8",
  98. muted: false, //静音
  99. webFullScreen: false,
  100. // speedRate: ["0.75", "1.0", "1.25", "1.5", "2.0"], //播放倍速
  101. autoPlay: false, //自动播放
  102. loop: false, //循环播放
  103. mirror: false, //镜像画面
  104. ligthOff: false, //关灯模式
  105. volume: 0.3, //默认音量大小
  106. control: true, //是否显示控制
  107. currentTime: 0,//跳转到固定播放时间
  108. controlBtns: [
  109. "audioTrack",
  110. "quality",
  111. "speedRate",
  112. "volume",
  113. "setting",
  114. "pip",
  115. "pageFullScreen",
  116. "fullScreen",
  117. ], //显示所有按钮,
  118. });
  119. //视频播放弹框
  120. const videoDialog = ref(false)
  121. const dialogTitle = ref("")
  122. // 播放视频
  123. const lookVideo = function (item) {
  124. videoDialog.value = true;
  125. dialogTitle.value = item.title
  126. console.log("点击了播放视频", 12312312, "播放路径", item)
  127. getVideoUrl({ "rtsp": item.src }).then((res) => {
  128. console.log("视频处理", res);
  129. videoData.src = res.data.httpFlv
  130. })
  131. // videoData.src = src
  132. }
  133. // 播放视频
  134. const onPlay = function () {
  135. console.log("播放视频")
  136. }
  137. // 物联设备
  138. let equipmentTotal = ref({})
  139. // 物联设备类型统计
  140. let interDevice = ref([])
  141. // 智慧教室
  142. let carouselData = ref([])
  143. //获取页面数据
  144. const getDeviceData = async () => {
  145. let res = await getDevice()
  146. console.log('s12312123',res);
  147. if (res.code !== 200) {
  148. ElMessage.error("数据请求出错");
  149. }
  150. let { category, monitor, status } = res.data
  151. // 物联设备类型数据
  152. console.log('sadui12u31',category);
  153. //截取数组前6项
  154. interDevice.value = category.slice(0,6);
  155. // 互动教室
  156. carouselData.value = monitor
  157. //物联设备统计
  158. equipmentTotal.value = status
  159. }
  160. onMounted(() => {
  161. getDeviceData()
  162. })
  163. const d1img = ref('./img/d1_1.png');
  164. const d12img = ref('./img/d1_2.png');
  165. const d2img = ref('./img/d2.png');
  166. const d3img = ref('./img/d3.png')
  167. const deviceImg = ref('./img/')
  168. return {
  169. interDevice,
  170. videoData,
  171. onPlay,
  172. videoDialog,
  173. lookVideo,
  174. carouselData,
  175. equipmentTotal,
  176. d1img,
  177. d12img,
  178. d2img,
  179. d3img,
  180. deviceImg,
  181. dialogTitle
  182. }
  183. },
  184. })
  185. </script>
  186. <style scoped lang="scss">
  187. @import '../assets/css/right.scss';
  188. </style>
  189. <style lang="scss">
  190. .videoDialog {
  191. .el-dialog__header {
  192. height: 49px;
  193. line-height: 49px;
  194. padding: 0;
  195. background-color: #1B67D9;
  196. margin-right: 0;
  197. .el-dialog__title {
  198. color: #FFF;
  199. font-family: Inter;
  200. }
  201. .el-dialog__headerbtn {
  202. top: 0px;
  203. i {
  204. color: #fff;
  205. font-size: 20px;
  206. font-weight: bold;
  207. }
  208. }
  209. }
  210. .el-dialog__body {
  211. padding: 0 !important;
  212. }
  213. }
  214. </style>