App.vue 20 KB

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