App.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. <!--
  2. * @Date: 2023-06-18 10:09:15
  3. * @LastEditors: zhubj
  4. * @LastEditTime: 2023-06-19 17:04:11
  5. * @Description: 头部注释
  6. * @FilePath: \own-vue3-vuecli-template\src\App.vue
  7. -->
  8. <template>
  9. <div class="windLife" :class="!swichTheme ? 'themeDark' : 'themeLight'">
  10. <common-header v-if="showHeader" @headerName="headerName" @swichFn="swichFn"></common-header>
  11. <!-- :class="!fixed ? 'menuBs' : ''" v-if="isShowMenu" -->
  12. <div class="menu-body" @mouseenter="showMenu" v-if="isShowMenu" @mouseleave="hideMenu">
  13. <ul class="menu-list">
  14. <li class="menu-item" v-for="(menu, index) in showMenuData" :key="index"
  15. @click="handleNodeClick(menu.index)">
  16. <router-link :to="menu.index" v-if="menu.children">
  17. <!-- <el-tooltip class="item" effect="dark" :content="menu.name" placement="right"
  18. :enterable="false">
  19. <img :src="menu.img" alt="">
  20. </el-tooltip> -->
  21. <el-popover placement="right-end" :width="200" trigger="hover" effect="dark">
  22. <template #reference>
  23. <img :src="menu.img" alt="">
  24. </template>
  25. <div class="menuChildren">
  26. <p v-for="(it, index) in menu.children" :key="index"
  27. @click="openReportDetail(it.index, it.nameEn)">{{it.name}}</p>
  28. </div>
  29. </el-popover>
  30. </router-link>
  31. <router-link :to="menu.index" v-else>
  32. <el-tooltip class="item" effect="dark" :content="menu.name" placement="right"
  33. :enterable="false">
  34. <!-- <component :is="menu.icon">
  35. </component> -->
  36. <img :src="menu.img" alt="">
  37. </el-tooltip>
  38. </router-link>
  39. </li>
  40. <!-- <el-icon v-if="fixed" style="width:25px;height:25px">
  41. <Lock />
  42. </el-icon>
  43. <el-icon v-else style="width:25px;height:25px">
  44. <Unlock />
  45. </el-icon> -->
  46. <!-- <li class="lockpage" @click="handleClickFixed">
  47. <img :src="proJie" v-if="fixed" alt="">
  48. <img :src="proSuo" v-else alt="">
  49. </li> -->
  50. </ul>
  51. </div>
  52. <!-- :style="{ paddingLeft: fixed ? '65px' : 0 }" -->
  53. <div :style="{ paddingLeft: isShowMenu ? '65px' : 0 }">
  54. <router-view />
  55. </div>
  56. </div>
  57. </template>
  58. <script>
  59. import commonHeader from '@/components/commonHeaders.vue'
  60. // 发电能力分析
  61. import gener_agcfx from '@/assets/menuImg/gener_agcfx.png'
  62. import gener_dfpcfx from '@/assets/menuImg/gener_dfpcfx.png'
  63. import gener_fdsjcl from '@/assets/menuImg/gener_fdsjcl.png'
  64. import gener_fdsjzb from '@/assets/menuImg/gener_fdsjzb.png'
  65. import gener_fxbg from '@/assets/menuImg/gener_fxbg.png'
  66. import gener_glqxnhfx from '@/assets/menuImg/gener_glqxnhfx.png'
  67. import gener_jjjfx from '@/assets/menuImg/gener_jjjfx.png'
  68. import gener_mrlfx from '@/assets/menuImg/gener_mrlfx.png'
  69. import gener_qxpclfx from '@/assets/menuImg/gener_qxpclfx.png'
  70. import gener_ssdlfx from '@/assets/menuImg/gener_ssdlfx.png'
  71. import gener_wdyglfx from '@/assets/menuImg/gener_wdyglfx.png'
  72. import gener_wgxzfx from '@/assets/menuImg/gener_wgxzfx.png'
  73. // 功率预测
  74. import power_dlyc from '@/assets/menuImg/power_dlyc.png'
  75. import power_glyc from '@/assets/menuImg/power_glyc.png'
  76. import power_gy from '@/assets/menuImg/power_gy.png'
  77. import power_qjgl from '@/assets/menuImg/power_qjgl.png'
  78. import power_tjhz from '@/assets/menuImg/power_tjhz.png'
  79. import power_tqyb from '@/assets/menuImg/power_tqyb.png'
  80. // 智能报表
  81. import report_bbjb from '@/assets/menuImg/report_bbjb.png'
  82. import report_bbsb from '@/assets/menuImg/report_bbsb.png'
  83. import report_czzybb from '@/assets/menuImg/report_czzybb.png'
  84. import report_erp from '@/assets/menuImg/report_erp.png'
  85. import report_gkjlb from '@/assets/menuImg/report_gkjlb.png'
  86. // 锁
  87. import pro_suo from '@/assets/menuImg/pro_suo.png'
  88. import pro_jie from '@/assets/menuImg/pro_jie.png'
  89. export default {
  90. components: {
  91. commonHeader,
  92. },
  93. data() {
  94. return {
  95. showHeader: false,
  96. isShowMenu: false,
  97. showMenuData: [],
  98. proSuo: pro_suo,
  99. proJie: pro_jie,
  100. powerPreDatas: [{
  101. index: '/powerPrediction/index',
  102. icon: 'Coin',
  103. img: power_gy,
  104. name: '概要'
  105. },
  106. {
  107. index: '/powerPrediction/panoramicPower',
  108. icon: 'DataBoard',
  109. img: power_qjgl,
  110. name: '全景功率'
  111. },
  112. {
  113. index: '/powerPrediction/power',
  114. icon: 'DataAnalysis',
  115. img: power_glyc,
  116. name: '功率预测'
  117. },
  118. {
  119. index: '/powerPrediction/batteryDiviner',
  120. icon: 'DataLine',
  121. img: power_dlyc,
  122. name: '电量预测'
  123. },
  124. {
  125. index: '/powerPrediction/weather',
  126. icon: 'Sunrise',
  127. img: power_tqyb,
  128. name: '天气预报'
  129. },
  130. {
  131. index: '/powerPrediction/statisticalSummary',
  132. icon: 'Tickets',
  133. img: power_tjhz,
  134. name: '统计汇总'
  135. },
  136. ],
  137. intelligentReportDatas: [{
  138. icon: 'ScaleToOriginal',
  139. index: '/intelligentReport/gkjlb',
  140. img: report_gkjlb,
  141. name: '关口计量表',
  142. children: [{
  143. name: '新庄风电场',
  144. nameEn: 'xinzhuang',
  145. index: '/intelligentReport/gkjlb',
  146. }, {
  147. name: '吉山梁风电场',
  148. nameEn: 'jiliangshan',
  149. index: '/intelligentReport/gkjlb',
  150. }, {
  151. name: '左庄风电场',
  152. nameEn: 'zuozhuang',
  153. index: '/intelligentReport/gkjlb',
  154. }, {
  155. name: '繁食沟风电场',
  156. nameEn: 'fanshigou',
  157. index: '/intelligentReport/gkjlb',
  158. }, {
  159. name: '草山梁风电场',
  160. nameEn: 'caoshanliang',
  161. index: '/intelligentReport/gkjlb',
  162. }, {
  163. name: '雷家山风电场',
  164. nameEn: 'leijiashan',
  165. index: '/intelligentReport/gkjlb',
  166. }]
  167. },
  168. {
  169. icon: 'Eleme',
  170. index: '/intelligentReport/erp',
  171. img: report_erp,
  172. name: 'ERP',
  173. children: [{
  174. name: '新庄风电场',
  175. nameEn: 'xinzhuang',
  176. index: '/intelligentReport/erp',
  177. }, {
  178. name: '吉山梁风电场',
  179. nameEn: 'jiliangshan',
  180. index: '/intelligentReport/erp',
  181. }, {
  182. name: '左庄风电场',
  183. nameEn: 'zuozhuang',
  184. index: '/intelligentReport/erp',
  185. }, {
  186. name: '繁食沟风电场',
  187. nameEn: 'fanshigou',
  188. index: '/intelligentReport/erp',
  189. }, {
  190. name: '草山梁风电场',
  191. nameEn: 'caoshanliang',
  192. index: '/intelligentReport/erp',
  193. }, {
  194. name: '雷家山风电场',
  195. nameEn: 'leijiashan',
  196. index: '/intelligentReport/erp',
  197. }]
  198. },
  199. {
  200. icon: 'Memo',
  201. index: '/intelligentReport/czzyb',
  202. img: report_czzybb,
  203. name: '场站自由报表'
  204. },
  205. {
  206. icon: 'Finished',
  207. index: '/intelligentReport/reporting',
  208. img: report_bbsb,
  209. name: '报表上报'
  210. },
  211. {
  212. icon: 'Odometer',
  213. index: '/intelligentReport/scriptgeneration',
  214. img: report_bbjb,
  215. name: '报表脚本'
  216. },
  217. ],
  218. generatingCapDatas: [{
  219. icon: 'Coin',
  220. index: '/generatingCap/dataFilter/prepare',
  221. img: gener_fdsjzb,
  222. name: '风电数据准备'
  223. }, {
  224. icon: 'DataAnalysis',
  225. index: '/generatingCap/dataFilter/process',
  226. img: gener_fdsjcl,
  227. name: '风电数据处理'
  228. }, {
  229. icon: 'Operation',
  230. index: '/generatingCap/dataAnalysis/combine',
  231. img: gener_glqxnhfx,
  232. name: '功率曲线拟合分析'
  233. }, {
  234. icon: 'ScaleToOriginal',
  235. index: '/generatingCap/dataAnalysis/rateAnalysis',
  236. img: gener_dfpcfx,
  237. name: '对风偏差分析'
  238. }, {
  239. icon: 'DataLine',
  240. index: '/generatingCap/dataAnalysis/lineAnalysis',
  241. img: gener_qxpclfx,
  242. name: '曲线偏差率分析'
  243. }, {
  244. icon: 'Odometer',
  245. index: '/generatingCap/dataAnalysis/hotAnalysis',
  246. img: gener_wdyglfx,
  247. name: '温度与功率分析'
  248. }, {
  249. icon: 'Finished',
  250. index: '/generatingCap/dataAnalysis/windAnalysis',
  251. img: gener_ssdlfx,
  252. name: '损失电量分析'
  253. }, {
  254. icon: 'Coordinate',
  255. index: '/generatingCap/dataAnalysis/posAnalysis',
  256. img: gener_wgxzfx,
  257. name: '微观选址分析'
  258. }, {
  259. icon: 'SetUp',
  260. index: '/generatingCap/dataAnalysis/spaceAnalysis',
  261. img: gener_mrlfx,
  262. name: '毛容量分析'
  263. },
  264. // {
  265. // icon: 'Suitcase',
  266. // index: '/generatingCap/dataAnalysis/angleAnalysis',
  267. // img: gener_jjjfx,
  268. // name: '浆距角分析'
  269. // }, {
  270. // icon: 'Monitor',
  271. // index: '/generatingCap/dataAnalysis/agcAnalysis',
  272. // img: gener_agcfx,
  273. // name: 'AGC曲线偏差分析'
  274. // },
  275. {
  276. icon: 'Files',
  277. index: '/generatingCap/dataAnalysis/analysisReport',
  278. img: gener_fxbg,
  279. name: '分析报告'
  280. },
  281. ],
  282. memuCloseTimeout: null,
  283. fixed: false,
  284. swichTheme: false,
  285. // swichTheme: true // 默认白色版本
  286. }
  287. },
  288. watch: {
  289. $route: {
  290. handler: function (route) {
  291. this.showHeader = route.path === '/login' ? false : true
  292. this.isShowMenu = route.path === '/login' || route.path === '/home' ? false : true
  293. },
  294. immediate: true
  295. }
  296. },
  297. mounted() {
  298. if (!JSON.parse(window.sessionStorage.getItem('theme'))) {
  299. document.getElementById('app').style.background = '#040c0b'
  300. } else {
  301. this.swichTheme = JSON.parse(window.sessionStorage.getItem('theme'))
  302. if (!this.swichTheme) {
  303. document.getElementById('app').style.background = '#040c0b'
  304. } else {
  305. document.getElementById('app').style.background =
  306. '-webkit-gradient(linear, 0% 0%, 0% 100%, from(#373590), to(#373590), color-stop(0.2, #645fef), color-stop(0.8, #645fef))'
  307. }
  308. this.$emit('swichFn', this.switchTheme)
  309. }
  310. this.fixed = window.sessionStorage.getItem('menufixed')
  311. this.isShowMenu = window.sessionStorage.getItem('isShowMenu')
  312. // if (window.sessionStorage.getItem('headerRoute')) {
  313. // let str = window.sessionStorage.getItem('headerRoute')
  314. let str = window.location.href
  315. if (str.indexOf('powerPrediction') > -1) {
  316. this.showMenuData = this.powerPreDatas
  317. } else if (str.indexOf('intelligentReport') > -1) {
  318. this.showMenuData = this.intelligentReportDatas
  319. } else if (str.indexOf('generatingCap') > -1) {
  320. this.showMenuData = this.generatingCapDatas
  321. } else {
  322. this.showMenuData = this.generatingCapDatas
  323. }
  324. // }
  325. },
  326. methods: {
  327. headerName(name) {
  328. this.showMenuData = []
  329. if (name === '功率预测') {
  330. this.showMenuData = this.powerPreDatas
  331. } else if (name === '智能报表') {
  332. this.showMenuData = this.intelligentReportDatas
  333. } else if (name === '发电能力分析') {
  334. this.showMenuData = this.generatingCapDatas
  335. }
  336. },
  337. swichFn(val) {
  338. this.swichTheme = val
  339. if (!this.swichTheme) {
  340. document.getElementById('app').style.background = '#040c0b'
  341. } else {
  342. document.getElementById('app').style.background =
  343. '-webkit-gradient(linear, 0% 0%, 0% 100%, from(#373590), to(#373590), color-stop(0.2, #645fef), color-stop(0.8, #645fef))'
  344. }
  345. // this.$router.go(0);
  346. },
  347. openReportDetail(index, name) {
  348. this.$router.push({
  349. // path: "/home"
  350. path: index,
  351. query: {
  352. name: name
  353. }
  354. })
  355. },
  356. showMenu() {
  357. if (!this.fixed) {
  358. this.isShowMenu = true;
  359. window.sessionStorage.setItem('isShowMenu', this.isShowMenu)
  360. clearTimeout(this.memuCloseTimeout);
  361. this.memuCloseTimeout = null;
  362. }
  363. },
  364. hideMenu() {
  365. if (!this.fixed) {
  366. this.memuCloseTimeout = setTimeout(() => {
  367. this.isShowMenu = true;
  368. window.sessionStorage.setItem('isShowMenu', this.isShowMenu)
  369. }, 500);
  370. }
  371. },
  372. handleNodeClick(index, indexPath) {
  373. this.$router.push({
  374. path: index
  375. })
  376. },
  377. handleClickFixed() {
  378. this.fixed = !this.fixed
  379. window.sessionStorage.setItem('menufixed', JSON.stringify(this.fixed))
  380. if (this.fixed) {
  381. this.isShowMenu = true
  382. window.sessionStorage.setItem('isShowMenu', this.isShowMenu)
  383. }
  384. }
  385. }
  386. }
  387. </script>
  388. <style lang="less" scoped>
  389. .el-popover {
  390. .menuChildren {
  391. p {
  392. line-height: 40px;
  393. cursor: pointer;
  394. // :hover {
  395. // color: #4b55ae;
  396. // }
  397. }
  398. }
  399. }
  400. </style>
  401. <style lang="less">
  402. .windLife {
  403. height: 100%;
  404. .menu-body {
  405. position: absolute;
  406. display: flex;
  407. flex-direction: column;
  408. align-items: center;
  409. justify-content: space-between;
  410. flex: 0 0 63px;
  411. width: 63px;
  412. height: calc(100% - 60px);
  413. top: 60px;
  414. background-color: fade(#21192a, 75%);
  415. z-index: 2002;
  416. &:hover {
  417. opacity: 1;
  418. transition: opacity 0.2s;
  419. transition-timing-function: ease-out;
  420. transform: translate(0);
  421. }
  422. .menu-list {
  423. margin: 0;
  424. padding: 0;
  425. list-style: none;
  426. img {
  427. width: 25px;
  428. height: 25px;
  429. }
  430. .menu-item {
  431. display: flex;
  432. text-align: center;
  433. line-height: 2;
  434. padding: 12px 0;
  435. width: 25px;
  436. height: 25px;
  437. .el-tooltip__trigger {
  438. color: #fff;
  439. }
  440. a {
  441. display: flex;
  442. width: 100%;
  443. height: 100%;
  444. font-size: 14px;
  445. text-decoration: unset;
  446. white-space: nowrap;
  447. }
  448. &.active {
  449. background: #323e70;
  450. }
  451. &+.menu-item {
  452. border-top: 1px solid fade(#606769, 40);
  453. }
  454. }
  455. }
  456. .lockpage {
  457. position: absolute;
  458. bottom: 20px;
  459. .el-icon {
  460. color: #fff;
  461. svg {
  462. width: 25px;
  463. height: 25px;
  464. }
  465. }
  466. }
  467. }
  468. .menuBs {
  469. opacity: 0;
  470. transition: opacity 0.2s;
  471. transition-timing-function: ease-in;
  472. }
  473. }
  474. @import "./assets/css/main.css";
  475. @import "./assets/css/eleCss/index.less";
  476. @import "./assets/css/eleCss/el-popper.less";
  477. .themeDark {
  478. @import "./assets/css/eleCss/el-dialogB.less";
  479. @import "./assets/css/eleCss/el-tableB.less";
  480. @import "./assets/css/eleCss/el-inputB.less";
  481. @import "./assets/css/eleCss/el-treeB.less";
  482. }
  483. .themeLight {
  484. @import "./assets/css/eleCss/el-dialogW.less";
  485. @import "./assets/css/eleCss/el-treeW.less";
  486. }
  487. // #app {
  488. // background: #040c0b;
  489. // }
  490. </style>