index.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. <template>
  2. <div class="app-container page-nesting" style="position: relative">
  3. <!-- 树形组件start -->
  4. <div class="grid-content treeDom">
  5. <div style="text-align: center" class="mb-20">
  6. <el-button v-if="this.treeLevel == 3" disabled @click="addGroup()">
  7. 添加分组
  8. </el-button>
  9. <el-button type="primary" v-else @click="addGroup()">
  10. 添加分组
  11. </el-button>
  12. <el-button v-if="this.treeLevel == 3" disabled @click="addSite()">
  13. 添加站点
  14. </el-button>
  15. <el-button type="primary" v-else @click="addSite()">添加站点</el-button>
  16. </div>
  17. <el-input
  18. placeholder="输入关键字进行过滤"
  19. v-model="filterText"
  20. class="mb-20 searchInput"
  21. >
  22. <template>
  23. <i class="el-icon-search el-input__icon"></i>
  24. </template>
  25. </el-input>
  26. <el-tree
  27. class="filter-tree siteTree"
  28. :data="data"
  29. node-key="id"
  30. :props="defaultProps"
  31. :expand-on-click-node="false"
  32. default-expand-all
  33. @node-click="handleNodeClick"
  34. :filter-node-method="filterNode"
  35. ref="tree"
  36. >
  37. <template #default="{ node, data }">
  38. <span
  39. class="custom-tree-node"
  40. style="width: 100%"
  41. @mouseenter="mouseenter(data)"
  42. @mouseleave="mouseleave(data)"
  43. >
  44. <span>{{ node.label }}</span>
  45. <span>
  46. <a
  47. class="deleteLink"
  48. v-show="data.show"
  49. @click="remove(node, data)"
  50. >
  51. <i size="mini" class="el-icon-delete"></i>
  52. </a>
  53. </span>
  54. </span>
  55. </template>
  56. </el-tree>
  57. </div>
  58. <!-- 树形组件end -->
  59. <!-- 站点主题start -->
  60. <div class="grid-content nestingDom" style="width: calc(100% - 300px);">
  61. <el-tabs
  62. v-if="this.treeLevel == 3"
  63. v-model="activeName"
  64. type="card"
  65. >
  66. <el-tab-pane label="基本信息" name="first">
  67. <basic-info class="basicInfo"></basic-info>
  68. </el-tab-pane>
  69. <el-tab-pane label="监控设备" name="second">
  70. <watch-dog
  71. v-on:success="success(res)"
  72. :avtiveName="activeName"
  73. @func="getMsgFormSon"
  74. ></watch-dog>
  75. </el-tab-pane>
  76. <el-tab-pane label="变量列表" name="third">
  77. <variable-list :activeName="activeName"></variable-list>
  78. </el-tab-pane>
  79. <el-tab-pane label="摄像头" name="five">
  80. <camera></camera>
  81. </el-tab-pane>
  82. <el-tab-pane label="电能质量评分配置" name="six">
  83. <power-Score></power-Score>
  84. </el-tab-pane>
  85. </el-tabs>
  86. <!-- 分组信息start -->
  87. <group-info-com
  88. v-if="this.treeLevel == 2 || this.treeLevel == 1"
  89. ></group-info-com>
  90. <!-- 分组信息end -->
  91. <!-- 新建分组start -->
  92. <add-group-com
  93. :dialogTitle="dialogTitle"
  94. :itemInfo="tableItem"
  95. @closeDialog="closeDialog"
  96. :flag="showDialog"
  97. ></add-group-com>
  98. <!-- 新建分组end -->
  99. <!-- 新建站点start -->
  100. <add-site-com
  101. :dialogTitle="dialogTitle"
  102. :itemInfo="tableItem"
  103. @closeDialog="closeDialog"
  104. :flag="showDialog2"
  105. ></add-site-com>
  106. <!-- 新建站点end -->
  107. </div>
  108. <!-- 站点主题end -->
  109. </div>
  110. </template>
  111. <script>
  112. import { defineComponent, ref,reactive,watch,onMounted} from 'vue'
  113. import basicInfo from './basicInfo'
  114. import WatchDog from './watchDog'
  115. import variableList from './variableList'
  116. import camera from './camera'
  117. import PowerScore from './powerScore'
  118. import groupInfoCom from './groupInfoCom'
  119. import addGroupCom from './addGroupCom'
  120. import addSiteCom from './addSiteCom'
  121. import * as api from '@/api/siteManage/index'
  122. import { ElMessage } from 'element-plus'
  123. export default defineComponent({
  124. components: {
  125. basicInfo,
  126. WatchDog,
  127. variableList,
  128. camera,
  129. PowerScore,
  130. groupInfoCom,
  131. addGroupCom,
  132. addSiteCom,
  133. },
  134. setup() {
  135. const showDialog = ref(false)
  136. const showDialog2 = ref(false)
  137. const dialogTitle = ref('')
  138. const treeLevel = ref(3)
  139. const activeName = ref('first')
  140. const filterText = ref('')
  141. const data = ref([
  142. {
  143. label: '所有站点',
  144. children: [
  145. {
  146. label: '分组一',
  147. children: [
  148. {
  149. label: '站点 1-1',
  150. show: false,
  151. },
  152. {
  153. label: '站点 1-2',
  154. show: false,
  155. },
  156. {
  157. label: '站点 1-3',
  158. show: false,
  159. },
  160. {
  161. label: '站点 1-4',
  162. show: false,
  163. },
  164. ],
  165. },
  166. {
  167. label: '分组二',
  168. children: [
  169. {
  170. label: '站点 2-1',
  171. show: false,
  172. },
  173. {
  174. label: '站点 2-2',
  175. show: false,
  176. },
  177. {
  178. label: '站点 2-3',
  179. show: false,
  180. },
  181. {
  182. label: '站点 2-4',
  183. show: false,
  184. },
  185. ],
  186. },
  187. {
  188. label: '其他分组',
  189. children: [
  190. {
  191. label: '其他 3-1',
  192. show: false,
  193. },
  194. {
  195. label: '其他 3-2',
  196. show: false,
  197. },
  198. {
  199. label: '其他 3-3',
  200. show: false,
  201. },
  202. {
  203. label: '其他 3-4',
  204. show: false,
  205. },
  206. ],
  207. },
  208. ],
  209. },
  210. ])
  211. const defaultProps = ref({
  212. children: 'children',
  213. label: 'label',
  214. })
  215. const getMsgFormSon=()=> {
  216. activeName.value = 'third';
  217. }
  218. function mouseenter(data) {
  219. data.show = true
  220. }
  221. function mouseleave(data) {
  222. data.show = false
  223. }
  224. function filterNode(value, data) {
  225. if (!value) return true
  226. return data.label.indexOf(value) !== -1
  227. }
  228. const handleNodeClick=(data, obj, node)=> {
  229. data, node
  230. treeLevel.value = obj.level
  231. }
  232. const tree = ref(null)
  233. watch(filterText, (val) => { //直接监听
  234. val
  235. console.log(tree)
  236. // tree.value.filter(val)
  237. })
  238. // 关闭操作
  239. const closeDialog=()=> {
  240. showDialog.value = false
  241. showDialog2.value = false
  242. }
  243. //新建分组
  244. const tableItem = reactive([])
  245. const addGroup=() =>{
  246. tableItem.value = {
  247. id: "",
  248. stationName: "",
  249. xh: "",
  250. userName: "",
  251. siteList: [],
  252. done: "",
  253. guaZai: "",
  254. checked: true,
  255. };
  256. dialogTitle.value = '新建分组'
  257. showDialog.value = true
  258. }
  259. //新建站点
  260. const addSite=()=> {
  261. tableItem.value = {
  262. id: "",
  263. stationName: "",
  264. xh: "",
  265. userName: "",
  266. siteList: [],
  267. done: "",
  268. guaZai: "",
  269. checked: true,
  270. };
  271. dialogTitle.value = '新建站点'
  272. showDialog2.value = true
  273. }
  274. const remove=(node, data)=> {
  275. const parent = node.parent
  276. const children = parent.data.children || parent.data
  277. const index = children.findIndex((d) => d.id === data.id)
  278. children.splice(index, 1)
  279. this.dataSource = [...this.dataSource]
  280. }
  281. //电力监测设备列表
  282. function siteTreeList() {
  283. api.siteTreeList({}).then((requset) => {
  284. if (requset.status === 'SUCCESS') {
  285. console.log(requset.data)
  286. // tableData.value = requset.data
  287. // store.state.siteList = tableData
  288. } else {
  289. ElMessage.error(requset.msg)
  290. }
  291. })
  292. }
  293. onMounted(() => {
  294. siteTreeList()
  295. })
  296. return {
  297. showDialog,
  298. showDialog2,
  299. treeLevel,
  300. activeName,
  301. filterText,
  302. dialogTitle,
  303. data,
  304. defaultProps,
  305. tableItem,
  306. getMsgFormSon,
  307. mouseenter,
  308. mouseleave,
  309. filterNode,
  310. handleNodeClick,
  311. closeDialog,
  312. addGroup,
  313. addSite,
  314. remove
  315. }
  316. },
  317. })
  318. </script>
  319. <style scoped lang="scss">
  320. .app-container.page-nesting {
  321. padding: 0;
  322. background: rgba(0, 0, 0, 0);
  323. }
  324. .grid-content {
  325. background: #fff;
  326. height: calc(100vh - 130px);
  327. overflow-y: auto;
  328. }
  329. .el-input__inner {
  330. border-radius: 20px !important;
  331. }
  332. .treeDom {
  333. width: 270px;
  334. position: absolute;
  335. left: 0;
  336. // margin-left: 20px;
  337. padding: 20px;
  338. min-height: calc(100vh - 130px);
  339. .el-icon-search {
  340. color: #409eff;
  341. }
  342. .el-button {
  343. width: 100px;
  344. }
  345. }
  346. .nestingDom {
  347. margin-left: 300px;
  348. }
  349. </style>
  350. <style lang="scss">
  351. // tab重置样式
  352. .el-tabs--card > .el-tabs__header .el-tabs__item {
  353. line-height: 50px;
  354. height: 50px;
  355. font-size: 16px;
  356. }
  357. .el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
  358. border-bottom: 2px solid #409eff;
  359. color: #409eff;
  360. }
  361. .el-tabs--card .el-tabs__header:hover,
  362. .el-tabs__item:hover {
  363. color: #409eff !important;
  364. }
  365. .el-tabs__header {
  366. margin-bottom: 0;
  367. }
  368. .el-tabs--card > .el-tabs__header .el-tabs__item,
  369. .el-tabs--card > .el-tabs__header .el-tabs__nav {
  370. border: none;
  371. }
  372. </style>