deviceConfig.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. <template>
  2. <div class="container">
  3. <div class="left-pane">
  4. <el-input
  5. placeholder="告警类别"
  6. v-model="filterText"
  7. class="left-input"
  8. suffix-icon="el-icon-search"
  9. >
  10. </el-input>
  11. <div class="tree_container">
  12. <el-tree
  13. ref="tree"
  14. :data="deviceTypeList"
  15. :props="defaultProps"
  16. node-key="id"
  17. default-expand-all
  18. :filter-node-method="filterNode"
  19. @node-click="handleNodeClick"
  20. >
  21. <span slot-scope="{ node, data }">
  22. <!-- <el-image :src="data.url"></el-image> -->
  23. <span style="padding-left: 10px; vertical-align: text-bottom">{{
  24. node.label
  25. }}</span>
  26. <span class="operate_btns">
  27. <dropdown
  28. :events="data.id ? menuEvents : subMenuEvents"
  29. :data="{ node, data }"
  30. @itemClick="dropDownClick"
  31. ></dropdown>
  32. </span>
  33. </span>
  34. </el-tree>
  35. </div>
  36. <el-button
  37. class="newDevice"
  38. @click="newDeviceType()"
  39. ><i class="el-icon-s-order"></i>新建设备类别</el-button>
  40. </div>
  41. <div class="right-pane">
  42. <div class="right-pane-inner">
  43. <div class="top">
  44. <el-button
  45. @click="addDevice()"
  46. class="add-btn"
  47. >添加设备</el-button>
  48. <el-button
  49. @click="dataImport()"
  50. class="import-btn"
  51. >批量导入</el-button>
  52. <!-- <el-button @click="batchDelete" class="delete-btn"
  53. >批量删除</el-button
  54. > -->
  55. <el-input
  56. class="search-input"
  57. v-model="searchInput"
  58. placeholder="请输入搜索内容"
  59. >
  60. <template slot="append">
  61. <i
  62. class="el-icon-search"
  63. style="cursor: pointer"
  64. @click="searchTypeEvent"
  65. ></i>
  66. </template>
  67. </el-input>
  68. </div>
  69. <div class="center">
  70. <el-table
  71. ref="multipleTable"
  72. :data="tableData"
  73. tooltip-effect="dark"
  74. :header-cell-style="{ textAlign: 'center' }"
  75. :cell-style="{ textAlign: 'center' }"
  76. style="width: 100%"
  77. height="500"
  78. @selection-change="handleSelectionChange"
  79. >
  80. <el-table-column
  81. type="selection"
  82. width="50"
  83. > </el-table-column>
  84. <el-table-column
  85. type="index"
  86. width="80"
  87. label="序号"
  88. >
  89. </el-table-column>
  90. <el-table-column
  91. prop="deviceName"
  92. label="设备名称"
  93. >
  94. </el-table-column>
  95. <el-table-column
  96. prop="deviceID"
  97. label="设备ID"
  98. > </el-table-column>
  99. <el-table-column
  100. prop="deviceUse"
  101. label="设备用途"
  102. >
  103. </el-table-column>
  104. <el-table-column
  105. prop="devicePosition"
  106. label="设备位置"
  107. >
  108. </el-table-column>
  109. <el-table-column
  110. prop="deviceLife"
  111. label="设备使用年限"
  112. >
  113. </el-table-column>
  114. <el-table-column
  115. prop="company"
  116. label="设备单位"
  117. > </el-table-column>
  118. <el-table-column
  119. prop="deviceRespon"
  120. label="设备责任人"
  121. >
  122. </el-table-column>
  123. <el-table-column
  124. prop="operation"
  125. label="操作"
  126. >
  127. <template slot-scope="scope">
  128. <el-button
  129. v-show="scope.row.deviceID == null ? false : true"
  130. size="mini"
  131. type="text"
  132. @click="deviceEdit"
  133. style="color: #2ea8e6"
  134. >编辑</el-button>
  135. <el-button
  136. v-show="scope.row.deviceID == null ? false : true"
  137. size="mini"
  138. type="text"
  139. style="color: #2ea8e6"
  140. @click="deviceDelete(scope.row)"
  141. >删除</el-button>
  142. </template>
  143. </el-table-column>
  144. </el-table>
  145. </div>
  146. <div class="bottom">
  147. <page :paginationData="paginationData"></page>
  148. </div>
  149. </div>
  150. </div>
  151. <!--弹窗-->
  152. <NewDeviceType
  153. ref="newDevice"
  154. v-bind="{
  155. update:getDeviceTypeList
  156. }"
  157. ></NewDeviceType>
  158. <addDevice ref="addDevice"></addDevice>
  159. <dataImport ref="dataImport"></dataImport>
  160. <deviceEdit ref="deviceEdit"></deviceEdit>
  161. </div>
  162. </template>
  163. <script>
  164. import checkbox from "@/components/Checkbox/index";
  165. import page from "@/components/pagination/index";
  166. import NewDeviceType from "./messageDailog/newDeviceType";
  167. import dataImport from "./messageDailog/dataImport";
  168. import addDevice from "./messageDailog/addDevice";
  169. import deviceEdit from "./messageDailog/deviceEdit";
  170. import dropdown from "@/components/Dropdown/index";
  171. import api from "@/api/deviceManagement/api";
  172. export default {
  173. components: {
  174. checkbox,
  175. page,
  176. NewDeviceType,
  177. dataImport,
  178. addDevice,
  179. deviceEdit,
  180. dropdown,
  181. },
  182. data() {
  183. return {
  184. searchInput: "",
  185. filterText: "",
  186. filter: "",
  187. form: {
  188. typeName: "",
  189. },
  190. deviceTypeList: [
  191. // {
  192. // id: 1,
  193. // label: "A设备",
  194. // },
  195. // {
  196. // id: 2,
  197. // label: "B设备",
  198. // },
  199. ],
  200. defaultProps: {
  201. children: "children",
  202. label: "label",
  203. },
  204. menuEvents: [
  205. { label: "新建", funcName: "addNode" },
  206. { label: "上移", funcName: "moveUp" },
  207. { label: "下移", funcName: "moveDown" },
  208. { label: "编辑", funcName: "editNode" },
  209. { label: "删除", funcName: "removeNode" },
  210. ],
  211. subMenuEvents: [
  212. { label: "新建", funcName: "addNode" },
  213. { label: "上移", funcName: "moveUp" },
  214. { label: "下移", funcName: "moveDown" },
  215. { label: "编辑", funcName: "editNode" },
  216. { label: "删除", funcName: "removeNode" },
  217. ],
  218. tableData: [
  219. {
  220. deviceName: "摄像头",
  221. deviceID: "SXT-001",
  222. deviceUse: "监控摄像头",
  223. devicePosition: "1层101",
  224. deviceLife: "3年6个月",
  225. company: "北京电信规划院",
  226. deviceRespon: "张三",
  227. },
  228. {
  229. deviceName: "摄像头",
  230. deviceID: "SXT-001",
  231. deviceUse: "监控摄像头",
  232. devicePosition: "1层101",
  233. deviceLife: "3年6个月",
  234. company: "北京电信规划院",
  235. deviceRespon: "张三",
  236. },
  237. {
  238. deviceName: "摄像头",
  239. deviceID: "SXT-001",
  240. deviceUse: "监控摄像头",
  241. devicePosition: "1层101",
  242. deviceLife: "3年6个月",
  243. company: "北京电信规划院",
  244. deviceRespon: "张三",
  245. },
  246. ],
  247. multipleSelection: [],
  248. show: true,
  249. paginationData: {
  250. pageSize: 10,
  251. pagerCount: 5,
  252. currentPage: 1,
  253. pageSizes: [5, 10, 20, 30],
  254. total: 30,
  255. currentChange: (val) => {
  256. this.getTableData(val);
  257. },
  258. handleSizeChange: (val) => {
  259. this.handleSizeChange(val);
  260. },
  261. },
  262. };
  263. },
  264. mounted() {
  265. this.getDeviceTypeList();
  266. },
  267. watch: {
  268. filterText(val) {
  269. this.$refs.tree.filter(val);
  270. },
  271. },
  272. methods: {
  273. getDeviceTypeList() {
  274. let that = this;
  275. api
  276. .getDeviceTypeList()
  277. .then((result) => {
  278. that.deviceTypeList = result.data.data.map(function (item) {
  279. item.label = item.type_name;
  280. return item;
  281. });
  282. })
  283. .catch((err) => {});
  284. },
  285. searchTypeEvent() {},
  286. dropDownClick() {},
  287. getTableData(val) {},
  288. handleSizeChange(val) {},
  289. filterNode(value, data) {
  290. if (!value) return true;
  291. return data.label.indexOf(value) !== -1;
  292. },
  293. newDeviceType() {
  294. this.$refs.newDevice.dialogVisible = true;
  295. },
  296. dataImport() {
  297. this.$refs.dataImport.dialogVisible = true;
  298. },
  299. addDevice() {
  300. this.$refs.addDevice.dialogVisible = true;
  301. },
  302. deviceEdit() {
  303. this.$refs.deviceEdit.dialogVisible = true;
  304. },
  305. deviceDelete(data) {
  306. // this.tableData = this.tableData.filter(()=>{
  307. // })
  308. },
  309. handleSelectionChange() {
  310. //
  311. },
  312. handleNodeClick() {
  313. //
  314. },
  315. batchDelete() {},
  316. },
  317. };
  318. </script>
  319. <style lang="less" scoped>
  320. .container {
  321. width: 100%;
  322. height: 100%;
  323. background-color: rgba(255, 255, 255, 1);
  324. color: rgba(16, 16, 16, 1);
  325. font-size: 14px;
  326. // text-align: center;
  327. box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.15);
  328. display: flex;
  329. align-items: center;
  330. .left-pane {
  331. width: 300px;
  332. padding: 15px;
  333. height: calc(100% - 31px);
  334. .tree_container {
  335. height: calc(100% - 101px);
  336. margin-top: 10px;
  337. margin-bottom: 10px;
  338. overflow: hidden;
  339. overflow-y: auto;
  340. .el-tree {
  341. height: 100%;
  342. background-color: #fafafa;
  343. /deep/.el-tree-node__content {
  344. align-items: center;
  345. height: 30px;
  346. cursor: pointer;
  347. font-size: 16px;
  348. position: relative;
  349. color: #999999;
  350. padding-top: 10px;
  351. padding-left: 30px !important;
  352. .operate_btns {
  353. position: absolute;
  354. right: 20px;
  355. display: none;
  356. }
  357. &:hover,
  358. :focus-within {
  359. background-color: #f7fbff;
  360. .operate_btns {
  361. display: inline;
  362. }
  363. }
  364. }
  365. /deep/.el-tree-node__children {
  366. .el-tree-node__content {
  367. padding-left: 60px !important;
  368. }
  369. }
  370. }
  371. }
  372. .newDevice {
  373. position: relative;
  374. // bottom: 50px;
  375. width: 250px;
  376. text-align: center;
  377. font-size: 16px;
  378. color: #fff;
  379. background: #3da0d6;
  380. margin-left: 24px;
  381. color: #fff;
  382. }
  383. }
  384. .right-pane {
  385. width: calc(100% - 300px);
  386. height: 100%;
  387. display: flex;
  388. align-items: center;
  389. justify-content: center;
  390. &-inner {
  391. width: calc(100% - 15px);
  392. height: calc(100% - 15px);
  393. .top {
  394. height: 80px;
  395. width: 100%;
  396. position: relative;
  397. .add-btn,
  398. .import-btn,
  399. .delete-btn {
  400. color: #fff;
  401. }
  402. .add-btn {
  403. position: absolute;
  404. background: #2ea8e6;
  405. top: 20px;
  406. left: 20px;
  407. }
  408. .import-btn {
  409. position: absolute;
  410. background: #2ea8e6;
  411. top: 20px;
  412. left: 130px;
  413. }
  414. .delete-btn {
  415. position: absolute;
  416. background: #b3b3b3;
  417. top: 20px;
  418. left: 250px;
  419. }
  420. .search-input {
  421. position: absolute;
  422. top: 20px;
  423. right: 30px;
  424. width: 300px;
  425. }
  426. }
  427. .center {
  428. width: 100%;
  429. height: calc(100% - 150px);
  430. .el-table {
  431. // height: 100%;
  432. border: 1px solid #f0f2f2;
  433. margin-top: 10px;
  434. font-size: 0.95rem;
  435. font-family: PingFang SC;
  436. font-weight: 500;
  437. color: #b2b2b2;
  438. background: rgba(255, 255, 255, 0.8);
  439. /deep/th {
  440. background: #f7fbff;
  441. }
  442. /deep/.el-checkbox {
  443. color: #b2b2b2;
  444. .el-checkbox__input.is-checked + .el-checkbox__label {
  445. color: #2ea8e6;
  446. }
  447. .el-checkbox__input.is-checked .el-checkbox__inner::after {
  448. width: 70%;
  449. height: 70%;
  450. background: #2ea8e6;
  451. border-radius: 0;
  452. transform: rotate(0deg) scaleY(1);
  453. position: static;
  454. // border: 1px solid #8DD9FF;
  455. }
  456. .el-checkbox__inner {
  457. border: 1px solid #8dd9ff;
  458. background: rgba(0, 170, 255, 0);
  459. display: flex;
  460. align-items: center;
  461. justify-content: center;
  462. position: static;
  463. &::after {
  464. transition: 0ms;
  465. }
  466. }
  467. .el-checkbox__label {
  468. padding-left: 0;
  469. font-size: 15px;
  470. position: absolute;
  471. top: 1px;
  472. left: 25px;
  473. }
  474. }
  475. }
  476. }
  477. .bottom {
  478. height: 70px;
  479. width: 100%;
  480. position: relative;
  481. }
  482. }
  483. }
  484. .el-form {
  485. margin: 30px 0 0 0;
  486. .el-form-item {
  487. margin-inline: 20px;
  488. margin-bottom: 0;
  489. }
  490. /deep/.el-form-item__label {
  491. padding: 0;
  492. }
  493. /deep/.el-form-item__content {
  494. display: flex;
  495. }
  496. /deep/.el-input__inner {
  497. width: 300px;
  498. }
  499. }
  500. // /deep/.el-dialog__title {
  501. // margin-right: 330px;
  502. // }
  503. /deep/.el-dialog__headerbtn {
  504. font-size: 25px;
  505. }
  506. /deep/.el-dialog__body {
  507. padding: 0;
  508. }
  509. }
  510. </style>