monitor.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <template>
  2. <div class="work-monitor">
  3. <div class="yui-tree-box">
  4. <div class="hui-left-tree">
  5. <div class="hui-left-tree-title">
  6. <svg-icon name="zhuangshi" width="16" height="20"></svg-icon>
  7. <span class="hui-left-tree-sub">摄像列表</span>
  8. </div>
  9. <div class="hui-left-tree-content">
  10. <el-collapse v-model="activeName">
  11. <el-collapse-item v-for="item in treeData" :key="item.id" :name="item.id">
  12. <template slot="title">
  13. <i class="iconfont huifont-shuzhuangcaidantubiao"></i>
  14. <span class="el-collapse-name">{{item.name}}</span>
  15. </template>
  16. <div>
  17. <el-tree :data="item.projectItemTargetList" :props="defaultProps"
  18. @node-click="selectItem">
  19. <div :class="'tree-node' + (data.id == nowItem.id ? ' active':'')"
  20. slot-scope="{ node, data }">
  21. <span class="tree-node-label">{{ node.label }}</span>
  22. <i class="iconfont huifont-shexiangtou"></i>
  23. </div>
  24. </el-tree>
  25. </div>
  26. </el-collapse-item>
  27. </el-collapse>
  28. </div>
  29. </div>
  30. <div class="hui-tree-content">
  31. <model type="monitor" fileId="10000786668235" @tipClick="tipClick"></model>
  32. </div>
  33. <div class="placeholder"></div>
  34. </div>
  35. <div :class="'monitor-box' + (isOpen?' open':'')">
  36. <div class="monitor-tag" @click="isOpen = !isOpen">
  37. <div class="iconfont-box">
  38. <i class="iconfont huifont-a-zhankaishousuo"></i>
  39. </div>
  40. </div>
  41. <div class="hui-flex box-background">
  42. <div class="monitor-box-title">
  43. 二号楼 / 二层
  44. </div>
  45. <div class="monitor-list hui-flex-box">
  46. <div class="monitor-item">
  47. <div class="monitor-item-box">
  48. <play-video :width="352" :height="198"></play-video>
  49. <!-- <div class="monitor-date">2023-12-22 04:12:32</div>
  50. <div class="monitor-space">1号楼-3层-设备间-摄像头001</div>
  51. <div class="monitor-operation"></div>
  52. <div class="monitor-download">
  53. <i class="iconfont huifont-xiazai"></i>
  54. </div> -->
  55. </div>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. <el-dialog title="摄像头" custom-class="monitor-dialog" :visible.sync="visible" width="900px" height="500px"
  61. :append-to-body="true">
  62. <div class="hui-dialog">
  63. <play-video :width="900" :height="445"></play-video>
  64. </div>
  65. </el-dialog>
  66. </div>
  67. </template>
  68. <script>
  69. import {
  70. getProjectDetailById,
  71. } from '@/httpApi/space'
  72. import playVideo from '@/components/work/common/playVideo'
  73. import model from '@/components/work/common/model'
  74. import {
  75. roomList
  76. } from '@/uitls';
  77. export default {
  78. data() {
  79. return {
  80. type: 'device',
  81. treeData: [],
  82. nowItem: {},
  83. defaultProps: {
  84. label: 'name'
  85. },
  86. activeName: [],
  87. isOpen: false,
  88. visible: false
  89. }
  90. },
  91. created() {
  92. this.initList();
  93. },
  94. components: {
  95. playVideo,
  96. model
  97. },
  98. methods: {
  99. initList() {
  100. getProjectDetailById(this.$store.getters.project.id).then(res => {
  101. if (res.state) {
  102. this.treeData = res.data.projectItemList;
  103. this.activeName = this.treeData.map(node => node.id);
  104. }
  105. })
  106. },
  107. selectItem(item) {
  108. if (item.projectItemTargetId) this.nowItem = item;
  109. },
  110. tipClick() {
  111. this.visible = true;
  112. }
  113. },
  114. }
  115. </script>
  116. <style lang="scss">
  117. .el-dialog.monitor-dialog {
  118. height: 500px;
  119. margin-top: 20vh !important;
  120. }
  121. .work-monitor {
  122. position: relative;
  123. width: 100%;
  124. height: 100%;
  125. .yui-tree-box {
  126. width: 100%;
  127. height: 100%;
  128. }
  129. .tree-node {
  130. display: flex;
  131. align-items: center;
  132. .tree-node-label {
  133. flex: 1;
  134. width: 0;
  135. }
  136. i {
  137. opacity: 0.5;
  138. }
  139. }
  140. .active {
  141. color: $--color-primary;
  142. i {
  143. opacity: 1;
  144. }
  145. }
  146. .placeholder {
  147. width: 400px;
  148. }
  149. .monitor-box {
  150. position: absolute;
  151. right: 0;
  152. top: 0;
  153. bottom: 0;
  154. width: 412px;
  155. padding-left: 12px;
  156. background: #11131B;
  157. .monitor-tag {
  158. position: absolute;
  159. top: 50%;
  160. left: 0px;
  161. width: 12px;
  162. line-height: 70px;
  163. opacity: 0.8;
  164. text-align: center;
  165. cursor: pointer;
  166. .iconfont-box {
  167. display: inline-block;
  168. }
  169. i {
  170. position: relative;
  171. font-size: 12px;
  172. }
  173. }
  174. .monitor-tag::before {
  175. content: '';
  176. position: absolute;
  177. top: 0;
  178. left: 0;
  179. right: 0;
  180. bottom: 0;
  181. border-right: 12px solid #303848;
  182. border-top: 6px solid transparent;
  183. border-bottom: 6px solid transparent;
  184. }
  185. .monitor-box-title {
  186. padding: 20px;
  187. padding-bottom: 10px;
  188. }
  189. .monitor-list {
  190. padding: 10px 5px 5px 20px;
  191. display: flex;
  192. flex-wrap: wrap;
  193. align-content: flex-start;
  194. }
  195. .monitor-item {
  196. padding-bottom: 15px;
  197. padding-right: 15px;
  198. font-size: 12px;
  199. cursor: pointer;
  200. width: 100%;
  201. .monitor-item-box {
  202. width: 100%;
  203. height: 100%;
  204. border: 1px solid #607182;
  205. position: relative;
  206. height: 200px;
  207. overflow: hidden;
  208. }
  209. img {
  210. width: 100%;
  211. height: 100%;
  212. }
  213. .monitor-date {
  214. position: absolute;
  215. top: 8px;
  216. left: 14px;
  217. text-shadow: 0px 1px 2px #000000;
  218. }
  219. .monitor-space {
  220. position: absolute;
  221. bottom: 0;
  222. width: 100%;
  223. font-size: 12px;
  224. padding: 5px 18px;
  225. }
  226. .monitor-operation {
  227. width: 100%;
  228. position: absolute;
  229. height: 30px;
  230. background: #000000;
  231. bottom: -30px;
  232. transition: all 200ms linear;
  233. }
  234. .monitor-download {
  235. width: 24px;
  236. height: 24px;
  237. background: #000000;
  238. border-radius: 2px;
  239. opacity: 0.79;
  240. position: absolute;
  241. top: 8px;
  242. right: 8px;
  243. text-align: center;
  244. line-height: 24px;
  245. top: -24px;
  246. transition: all 200ms linear;
  247. padding-right: 1px;
  248. }
  249. }
  250. .monitor-item:hover {
  251. .monitor-item-box {
  252. border: 1px solid $--color-primary;
  253. }
  254. .monitor-operation {
  255. bottom: 0px;
  256. }
  257. .monitor-download {
  258. opacity: 1;
  259. top: 8px;
  260. }
  261. }
  262. }
  263. .open.monitor-box {
  264. width: 100%;
  265. .monitor-item {
  266. width: 25%;
  267. min-width: 360px;
  268. }
  269. .monitor-tag {
  270. .iconfont-box {
  271. transform: rotate(180deg);
  272. }
  273. }
  274. }
  275. }
  276. </style>