index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. <template>
  2. <div class="data-overview">
  3. <el-row :gutter="15" class="home-card-one mb15">
  4. <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-for="(v, k) in dataOne" :key="k" :class="{ 'home-media home-media-lg': k > 1, 'home-media-sm': k === 1 }">
  5. <div class="home-card-item">
  6. <div class="item-header">
  7. <img :src="isIsDark ? v.iconDark : v.icon" alt="">
  8. <span>{{ v.title }}</span>
  9. </div>
  10. <div class="item-content w100" :class="` home-one-animation${k}`">
  11. <p>
  12. <span>{{ v.contentTitle1 }}</span>
  13. <span>{{ v.val1 + v.unit1 }}</span>
  14. </p>
  15. <p>
  16. <span>{{ v.contentTitle2 }}</span>
  17. <span>{{ v.val2 + v.unit2 }}</span>
  18. </p>
  19. </div>
  20. </div>
  21. </el-col>
  22. </el-row>
  23. <el-row :gutter="15" class="home-card-two mb15">
  24. <el-col :xs="24" :sm="10" :md="14" :lg="16" :xl="16">
  25. <div class="home-card-item">
  26. <div class="home-card-item-title" style="display: flex;justify-content:space-between;">
  27. <span>热网总能耗</span>
  28. </div>
  29. <el-tabs v-model="tabName" @tab-click="tabChange">
  30. <el-tab-pane label="总热耗" name="homeLineRef1">
  31. <div style="height: 380px" ref="homeLineRef1"></div>
  32. </el-tab-pane>
  33. <el-tab-pane label="总电耗" name="homeLineRef2">
  34. <div style="height: 380px" ref="homeLineRef2"></div>
  35. </el-tab-pane>
  36. <el-tab-pane label="总失水量" name="homeLineRef3">
  37. <div style="height: 380px" ref="homeLineRef3"></div>
  38. </el-tab-pane>
  39. </el-tabs>
  40. </div>
  41. </el-col>
  42. <el-col :xs="24" :sm="10" :md="10" :lg="8" :xl="8" class="home-media">
  43. <div class="home-card-item">
  44. <div class="bar-header">
  45. <p class='home-card-item-title'>环路回温/热用户室温占比</p>
  46. <!-- <div class="lable-group1">
  47. <div @click="changePieType('1')" :class="pieType == '1' ? 'active' : ''">环路</div>
  48. <div @click="changePieType('2')" :class="pieType == '2' ? 'active' : ''">热用户</div>
  49. </div> -->
  50. </div>
  51. <div style="height: 90%" ref="homePieRef"></div>
  52. </div>
  53. </el-col>
  54. </el-row>
  55. <el-row :gutter="15" class="home-card-three mb15">
  56. <el-col>
  57. <div class="home-card-item">
  58. <div style="height: 100%" ref="homeBarRef"></div>
  59. </div>
  60. </el-col>
  61. </el-row>
  62. <el-row :gutter="15" class="home-card-four">
  63. <el-col>
  64. <div class="home-card-item">
  65. <div style="height: 100%" ref="homeFourBarRef"></div>
  66. </div>
  67. </el-col>
  68. </el-row>
  69. </div>
  70. </template>
  71. <script lang="ts">
  72. import { toRefs, reactive, defineComponent, onMounted, ref, watch, nextTick, onActivated } from 'vue';
  73. import * as echarts from 'echarts';
  74. import { useStore } from '/@/store/index';
  75. import ele from '/@/assets/img/ele.svg';
  76. import ele1 from '/@/assets/img/ele1.svg';
  77. import fire from '/@/assets/img/fire.svg';
  78. import fire1 from '/@/assets/img/fire1.svg';
  79. import map from '/@/assets/img/map.svg';
  80. import map1 from '/@/assets/img/map1.svg';
  81. import water from '/@/assets/img/water.svg';
  82. import water1 from '/@/assets/img/water1.svg';
  83. import api from '/@/api/datahub';
  84. let global: any = {
  85. homeChartOne: null,
  86. homeChartTwo: null,
  87. homeCharThree: null,
  88. homeCharFour: null,
  89. dispose: [null, '', undefined],
  90. };
  91. export default defineComponent({
  92. name: 'heating-home',
  93. setup() {
  94. const tabName = ref('homeLineRef1');
  95. const homeLineRef1 = ref();
  96. const homeLineRef2 = ref();
  97. const homeLineRef3 = ref();
  98. const homePieRef = ref();
  99. const homeBarRef = ref();
  100. const homeFourBarRef = ref();
  101. const store = useStore();
  102. const state = reactive({
  103. checkList: ['一网供水温度'],
  104. rangeValue: 10,
  105. isIsDark: false,
  106. dataOne: [
  107. {
  108. icon: map,
  109. iconDark: map1,
  110. title: '供热面积',
  111. contentTitle1: '供热面积',
  112. val1: '',
  113. unit1: '万㎡',
  114. contentTitle2: '总面积',
  115. val2: '',
  116. unit2: '万㎡',
  117. },
  118. {
  119. icon: fire,
  120. iconDark: fire1,
  121. title: '热量',
  122. contentTitle1: '总耗热',
  123. val1: '',
  124. unit1: 'GJ',
  125. contentTitle2: '总单耗',
  126. val2: '',
  127. unit2: 'GJ/㎡',
  128. },
  129. {
  130. icon: ele,
  131. iconDark: ele1,
  132. title: '电量',
  133. contentTitle1: '总耗电',
  134. val1: '',
  135. unit1: 'KW.h',
  136. contentTitle2: '总单耗',
  137. val2: '',
  138. unit2: 'KW.h/㎡',
  139. },
  140. {
  141. icon: water,
  142. iconDark: water1,
  143. title: '水量',
  144. contentTitle1: '总耗水',
  145. val1: '',
  146. unit1: 'T',
  147. contentTitle2: '总单耗',
  148. val2: '',
  149. unit2: 'T/㎡',
  150. },
  151. ],
  152. myCharts: [],
  153. charts: {
  154. theme: '',
  155. bgColor: '',
  156. color: '#303133',
  157. },
  158. statisticsChartXAxisData: [],
  159. inTemperature: [],
  160. outTemperature: [],
  161. diffTemperature: [],
  162. chartXAxisData: [],
  163. flowLossData: [],
  164. elctricConsumptionData: [],
  165. unitConsumptionData: [],
  166. pieData: [],
  167. pieType: '1',
  168. pressureXAxisData: [],
  169. inPressureData: [],
  170. outPressureData: [],
  171. diffPressureData: []
  172. });
  173. // 获取顶部总数据
  174. const getStatisticsTotalData = () => {
  175. api.statistics.getStatisticsOverview({ queryType: 'num' }).then((res: any) => {
  176. const {
  177. elctricConsumption,
  178. elctricConsumptionTotal,
  179. flowLoss,
  180. flowLossTotal,
  181. forRealArea,
  182. heatingArea,
  183. unitConsumption,
  184. unitConsumptionTotal
  185. } = res.data;
  186. state.dataOne[0].val1 = forRealArea;
  187. state.dataOne[0].val2 = heatingArea;
  188. state.dataOne[1].val1 = unitConsumptionTotal;
  189. state.dataOne[1].val2 = unitConsumption;
  190. state.dataOne[2].val1 = elctricConsumptionTotal;
  191. state.dataOne[2].val2 = elctricConsumption;
  192. state.dataOne[3].val1 = flowLossTotal;
  193. state.dataOne[3].val2 = flowLoss;
  194. });
  195. };
  196. // 获取温度监测数据
  197. const getStatisticsChartData = () => {
  198. api.statistics.getStatisticsOverview({ queryType: 'temperature' }).then((res: any) => {
  199. const data = res.data
  200. state.statisticsChartXAxisData = [];
  201. state.inTemperature = [];
  202. state.outTemperature = [];
  203. state.diffTemperature = [];
  204. Object.values(data).forEach((i: object) => {
  205. state.statisticsChartXAxisData.push(i.name);
  206. state.inTemperature.push(i.inTemperature);
  207. state.outTemperature.push(i.outTemperature);
  208. state.diffTemperature.push(i.diff);
  209. });
  210. nextTick(() => {
  211. initBarChart();
  212. });
  213. });
  214. };
  215. // 获取压力监测数据
  216. const getStatisticsPressureChartData = () => {
  217. api.statistics.getStatisticsOverview({ queryType: 'pressure' }).then((res: any) => {
  218. const data = res.data
  219. state.pressureXAxisData = [];
  220. state.inPressureData = [];
  221. state.outPressureData = [];
  222. state.diffPressureData = [];
  223. Object.values(data).forEach((i: object) => {
  224. state.pressureXAxisData.push(i.name);
  225. state.inPressureData.push(i.inPressure);
  226. state.outPressureData.push(i.outPressure);
  227. state.diffPressureData.push(i.diff);
  228. });
  229. nextTick(() => {
  230. initBarFourChart();
  231. });
  232. });
  233. };
  234. // 温度检测
  235. const initBarChart = () => {
  236. if (!global.dispose.some((b: any) => b === global.homeChartOne)) global.homeChartOne.dispose();
  237. global.homeChartOne = <any>echarts.init(homeBarRef.value, state.charts.theme);
  238. const option = {
  239. tooltip: {
  240. trigger: 'axis'
  241. },
  242. title: {
  243. text: '温度监测',
  244. x: 'left',
  245. textStyle: { fontSize: '15', color: state.charts.color },
  246. },
  247. legend: {
  248. data: ['二网供水温度', '二网回水温度', '二网供回水温差'],
  249. top: 35,
  250. textStyle: {
  251. color: state.charts.color
  252. },
  253. },
  254. grid: { top: 80, bottom: 30 },
  255. // calculable: true,
  256. xAxis: [
  257. { data: state.statisticsChartXAxisData }
  258. ],
  259. yAxis: [
  260. {
  261. name: '℃',
  262. type: 'value'
  263. }
  264. ],
  265. series: [
  266. {
  267. name: '二网供水温度',
  268. type: 'bar',
  269. data: state.inTemperature
  270. },
  271. {
  272. name: '二网回水温度',
  273. type: 'bar',
  274. data: state.outTemperature
  275. },
  276. {
  277. name: '二网供回水温差',
  278. type: 'bar',
  279. data: state.diffTemperature
  280. }
  281. ]
  282. };
  283. (<any>global.homeChartOne).setOption(option);
  284. (<any>state.myCharts).push(global.homeChartOne);
  285. };
  286. // 柱状图
  287. const initBarFourChart = () => {
  288. if (!global.dispose.some((b: any) => b === global.homeCharFour)) global.homeCharFour.dispose();
  289. global.homeCharFour = <any>echarts.init(homeFourBarRef.value, state.charts.theme);
  290. const option = {
  291. tooltip: {
  292. trigger: 'axis'
  293. },
  294. title: {
  295. text: '压力监测',
  296. x: 'left',
  297. textStyle: { fontSize: '15', color: state.charts.color },
  298. },
  299. legend: {
  300. data: ['二网供水压力', '二网回水压力', '二网供回水压差'],
  301. top: 35,
  302. textStyle: {
  303. color: state.charts.color
  304. },
  305. },
  306. grid: { top: 80, bottom: 30 },
  307. xAxis: [
  308. { data: state.pressureXAxisData }
  309. ],
  310. yAxis: [
  311. {
  312. type: 'value'
  313. }
  314. ],
  315. series: [
  316. {
  317. name: '二网供水压力',
  318. type: 'bar',
  319. data: state.inPressureData
  320. },
  321. {
  322. name: '二网回水压力',
  323. type: 'bar',
  324. data: state.outPressureData
  325. },
  326. {
  327. name: '二网供回水压差',
  328. type: 'bar',
  329. data: state.diffPressureData
  330. }
  331. ]
  332. };
  333. (<any>global.homeCharFour).setOption(option);
  334. (<any>state.myCharts).push(global.homeCharFour);
  335. };
  336. // 获取环路回温占比数据数据
  337. const getStatisticsPieData = () => {
  338. api.statistics.getStatisticsOverview({ queryType: 'ratio' }).then((res: any) => {
  339. const data = res.data
  340. const arr = Object.values(data)
  341. let sum = 0
  342. arr.forEach(item => {
  343. sum += item
  344. })
  345. Object.keys(data).forEach((key: string) => {
  346. state.pieData.push({ name: key, value: (data[key] / sum).toFixed(2) * 1, num: data[key] });
  347. });
  348. nextTick(() => {
  349. initPieChart();
  350. });
  351. });
  352. };
  353. // 饼图
  354. const initPieChart = () => {
  355. if (!global.dispose.some((b: any) => b === global.homeChartTwo)) global.homeChartTwo.dispose();
  356. global.homeChartTwo = <any>echarts.init(homePieRef.value, state.charts.theme);
  357. // var getname = ['提示', '建议', '警告', '严重警告', '故障'];
  358. // var getvalue = [34.2, 38.87, 17.88, 9.05, 2.05];
  359. // var data = [];
  360. // for (var i = 0; i < getname.length; i++) {
  361. // data.push({ name: getname[i], value: getvalue[i] });
  362. // }
  363. const colorList = ['#51A3FC', '#36C78B', '#FEC279', '#968AF5', '#FF0000'];
  364. const option = {
  365. backgroundColor: state.charts.bgColor,
  366. grid: { top: 80, bottom: 10 },
  367. tooltip: { trigger: 'item', formatter: '{b} <br/> {d}% <br/>' },
  368. legend: {
  369. top: 35,
  370. color: state.charts.color,
  371. textStyle: {
  372. color: state.charts.color,
  373. },
  374. },
  375. series: [
  376. {
  377. type: 'pie',
  378. radius: [60, 100],
  379. center: ['50%', '65%'],
  380. itemStyle: {
  381. borderRadius: 8,
  382. },
  383. label: {
  384. show: true,
  385. color: state.charts.color,
  386. formatter: '{b} {d}%'
  387. },
  388. data: state.pieData,
  389. },
  390. ],
  391. };
  392. (<any>global.homeChartTwo).setOption(option);
  393. (<any>state.myCharts).push(global.homeChartTwo);
  394. };
  395. // 获取热网总能耗数据
  396. const getStatisticsLineChartData = () => {
  397. if (!state.rangeValue) return;
  398. api.statistics.getStatisticsOverview({ queryType: 'energy' }).then((res: any) => {
  399. const { flowLoss, elctricConsumption, unitConsumption } = res.data
  400. // calorie:总热耗 electric:总电耗 water:总失水量
  401. state.chartXAxisData = [];
  402. state.flowLossData = [];
  403. state.elctricConsumptionData = [];
  404. state.unitConsumptionData = [];
  405. flowLoss.forEach((i: any) => {
  406. state.chartXAxisData.push(i.date)
  407. state.flowLossData.push(i.total)
  408. });
  409. elctricConsumption.forEach((i: any) => {
  410. state.elctricConsumptionData.push(i.total)
  411. });
  412. unitConsumption.forEach((i: any) => {
  413. state.unitConsumptionData.push(i.total)
  414. });
  415. if (state.rangeValue == 10) return
  416. nextTick(() => {
  417. initLineChart();
  418. });
  419. });
  420. };
  421. // 折线图
  422. const initLineChart = () => {
  423. if (!global.dispose.some((b: any) => b === global.homeCharThree)) global.homeCharThree.dispose();
  424. let dom: any
  425. let data: any
  426. if (tabName.value === 'homeLineRef1') {
  427. dom = homeLineRef1.value
  428. data = state.flowLossData
  429. } else if (tabName.value === 'homeLineRef2') {
  430. dom = homeLineRef2.value
  431. data = state.elctricConsumptionData
  432. } else {
  433. dom = homeLineRef3.value
  434. data = state.unitConsumptionData
  435. }
  436. global.homeCharThree = <any>echarts.init(dom, state.charts.theme);
  437. const common = {
  438. type: 'line',
  439. smooth: true,
  440. showSymbol: true,
  441. symbolSize: 12,
  442. yAxisIndex: 0,
  443. // areaStyle: {
  444. // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  445. // { offset: 0, color: 'rgba(22,132,252,0.3)' },
  446. // { offset: 1, color: 'rgba(22,132,252,0)' },
  447. // ]),
  448. // shadowColor: 'rgba(22,132,252,0.2)',
  449. // shadowBlur: 20,
  450. // },
  451. // itemStyle: { color: 'rgba(22, 132, 252, 1)' },
  452. }
  453. const option = {
  454. backgroundColor: state.charts.bgColor,
  455. tooltip: { trigger: 'axis' },
  456. // legend: {
  457. // data: ['总热耗', '总电耗', '总失水量'],
  458. // top: 30, textStyle: { color: state.charts.color }
  459. // },
  460. grid: { top: 30, right: 20, bottom: 20, left: 20, containLabel: true },
  461. xAxis: [
  462. {
  463. type: 'category',
  464. data: state.chartXAxisData,
  465. boundaryGap: true,
  466. axisTick: { show: false }
  467. },
  468. ],
  469. yAxis: [
  470. {
  471. type: 'value'
  472. }
  473. ],
  474. series: [
  475. {
  476. ...common,
  477. data,
  478. },
  479. // {
  480. // name: '总电耗',
  481. // ...common,
  482. // data: state.elctricConsumptionData,
  483. // },
  484. // {
  485. // name: '总失水量',
  486. // ...common,
  487. // data: state.unitConsumptionData,
  488. // }
  489. ],
  490. };
  491. (<any>global.homeCharThree).setOption(option);
  492. (<any>state.myCharts).push(global.homeCharThree);
  493. };
  494. // 切换图形
  495. const tabChange = (data: any) => {
  496. setTimeout(() => {
  497. initLineChart(data.paneName);
  498. }, 100)
  499. };
  500. // 切换饼图类型
  501. const changePieType = (type: string, name: string) => {
  502. state.pieType = type;
  503. nextTick(() => {
  504. initPieChart();
  505. });
  506. };
  507. // 批量设置 echarts resize
  508. const initEchartsResizeFun = () => {
  509. nextTick(() => {
  510. for (let i = 0; i < state.myCharts.length; i++) {
  511. setTimeout(() => {
  512. (<any>state.myCharts[i]).resize();
  513. }, i * 1000);
  514. }
  515. });
  516. };
  517. // 批量设置 echarts resize
  518. const initEchartsResize = () => {
  519. window.addEventListener('resize', initEchartsResizeFun);
  520. };
  521. // 页面加载时
  522. onMounted(() => {
  523. initEchartsResize();
  524. getStatisticsTotalData();
  525. getStatisticsChartData();
  526. getStatisticsPressureChartData();
  527. getStatisticsLineChartData();
  528. getStatisticsPieData();
  529. // 获取布局配置信息
  530. state.isIsDark = store.state.themeConfig.themeConfig.isIsDark;
  531. });
  532. // 由于页面缓存原因,keep-alive
  533. onActivated(() => {
  534. initEchartsResizeFun();
  535. });
  536. // 监听 vuex 中的 tagsview 开启全屏变化,重新 resize 图表,防止不出现/大小不变等
  537. watch(
  538. () => store.state.tagsViewRoutes.isTagsViewCurrenFull,
  539. () => {
  540. initEchartsResizeFun();
  541. }
  542. );
  543. // 监听 vuex 中是否开启深色主题
  544. watch(
  545. () => store.state.themeConfig.themeConfig.isIsDark,
  546. () => {
  547. state.isIsDark = store.state.themeConfig.themeConfig.isIsDark
  548. },
  549. {
  550. deep: true,
  551. immediate: true,
  552. }
  553. );
  554. // 监听 vuex 中是否开启深色主题
  555. watch(
  556. () => store.state.themeConfig.themeConfig.isIsDark,
  557. (isIsDark) => {
  558. nextTick(() => {
  559. // if(!isIsDark) return
  560. state.charts.theme = isIsDark ? 'transparent' : '';
  561. state.charts.bgColor = isIsDark ? 'transparent' : '';
  562. state.charts.color = isIsDark ? '#dadada' : '#303133';
  563. setTimeout(() => {
  564. initLineChart();
  565. initPieChart();
  566. initBarChart();
  567. initBarFourChart();
  568. }, 1000);
  569. });
  570. },
  571. {
  572. deep: true,
  573. immediate: true,
  574. }
  575. );
  576. return {
  577. tabName,
  578. homeLineRef1,
  579. homeLineRef2,
  580. homeLineRef3,
  581. tabChange,
  582. homePieRef,
  583. homeBarRef,
  584. homeFourBarRef,
  585. changePieType,
  586. getStatisticsLineChartData,
  587. ...toRefs(state),
  588. };
  589. },
  590. });
  591. </script>
  592. <style scoped lang="scss">
  593. $homeNavLengh: 8;
  594. .data-overview {
  595. overflow: hidden;
  596. // .home-card-one,
  597. .home-card-two,
  598. .home-card-three,
  599. .home-card-four {
  600. .home-card-item,
  601. .home-card-top {
  602. width: 100%;
  603. height: 130px;
  604. border-radius: 4px;
  605. transition: all ease 0.3s;
  606. padding: 20px;
  607. overflow: hidden;
  608. background: var(--el-color-white);
  609. color: var(--el-text-color-primary);
  610. border: 1px solid var(--next-border-color-light);
  611. &:hover {
  612. box-shadow: 0 2px 12px var(--next-color-dark-hover);
  613. transition: all ease 0.3s;
  614. }
  615. &-icon {
  616. width: 70px;
  617. height: 70px;
  618. border-radius: 100%;
  619. flex-shrink: 1;
  620. i {
  621. color: var(--el-text-color-placeholder);
  622. }
  623. }
  624. &-title {
  625. font-size: 15px;
  626. font-weight: bold;
  627. height: 30px;
  628. }
  629. }
  630. }
  631. .home-card-one {
  632. @for $i from 0 through 3 {
  633. .home-one-animation#{$i} {
  634. opacity: 0;
  635. animation-name: error-num;
  636. animation-duration: 0.5s;
  637. animation-fill-mode: forwards;
  638. animation-delay: calc($i/10) + s;
  639. }
  640. }
  641. }
  642. .home-card-one .home-card-item {
  643. width: 100%;
  644. border-radius: 4px;
  645. transition: all ease 0.3s;
  646. overflow: hidden;
  647. background: var(--el-color-white);
  648. color: var(--el-text-color-primary);
  649. border: 1px solid var(--next-border-color-light);
  650. &:hover {
  651. box-shadow: 0 2px 12px var(--next-color-dark-hover);
  652. transition: all ease 0.3s;
  653. }
  654. .item-header {
  655. display: flex;
  656. justify-content: center;
  657. align-content: center;
  658. color: #101010;
  659. padding: 10px 0;
  660. border-bottom: 1px solid var(--next-border-color-light);
  661. font-size: 20px;
  662. font-weight: bold;
  663. img {
  664. margin-right: 32px;
  665. width: 24px;
  666. height: 24px;
  667. margin-top: 3px;
  668. }
  669. }
  670. .item-content {
  671. padding: 26px;
  672. p {
  673. display: flex;
  674. justify-content: space-between;
  675. align-content: center;
  676. span:nth-child(1) {
  677. line-height: 33px;
  678. font-size: 14px;
  679. flex: 0 0 60px;
  680. }
  681. span:nth-child(2) {
  682. color: #101010;
  683. font-weight: bold;
  684. font-size: 22px;
  685. word-wrap: break-word;
  686. word-break: break-all;
  687. }
  688. }
  689. p:nth-child(2) {
  690. margin-top: 26px;
  691. }
  692. }
  693. }
  694. .home-card-two,
  695. .home-card-three,
  696. .home-card-four {
  697. .home-card-item {
  698. height: 500px;
  699. }
  700. .home-card-top {
  701. height: 250px;
  702. .box-card {
  703. padding: 15px 20px 20px 20px;
  704. p {
  705. margin-bottom: 10px;
  706. }
  707. &-item {
  708. margin-bottom: 20px;
  709. }
  710. }
  711. }
  712. .home-card-item,
  713. .home-card-top {
  714. width: 100%;
  715. overflow: hidden;
  716. .home-monitor {
  717. height: 100%;
  718. .flex-warp-item {
  719. width: 25%;
  720. height: 111px;
  721. display: flex;
  722. .flex-warp-item-box {
  723. margin: auto;
  724. text-align: center;
  725. color: var(--el-text-color-primary);
  726. display: flex;
  727. border-radius: 5px;
  728. background: var(--next-bg-color);
  729. cursor: pointer;
  730. transition: all 0.3s ease;
  731. &:hover {
  732. background: var(--el-color-primary-light-9);
  733. transition: all 0.3s ease;
  734. }
  735. }
  736. @for $i from 0 through $homeNavLengh {
  737. .home-animation#{$i} {
  738. opacity: 0;
  739. animation-name: error-num;
  740. animation-duration: 0.5s;
  741. animation-fill-mode: forwards;
  742. animation-delay: calc($i/10) + s;
  743. }
  744. }
  745. }
  746. }
  747. }
  748. }
  749. .text-info {
  750. color: #23c6c8;
  751. }
  752. .text-danger {
  753. color: #ed5565;
  754. }
  755. .git-res {
  756. margin-top: 20px;
  757. }
  758. .git-res .el-link {
  759. margin-right: 30px;
  760. }
  761. ul,
  762. li {
  763. padding: 0;
  764. margin: 0;
  765. list-style: none;
  766. }
  767. .product {
  768. margin-top: 50px;
  769. h3 {
  770. margin-bottom: 15px;
  771. }
  772. }
  773. .product li {
  774. margin-bottom: 20px;
  775. float: left;
  776. width: 150px;
  777. }
  778. .box-card.xx {
  779. margin-top: 20px;
  780. }
  781. }
  782. .lable-group,
  783. .lable-group1 {
  784. // background-color: pink;
  785. display: flex;
  786. width: 100%;
  787. margin-top: 20px;
  788. border: 1px solid rgba(22, 132, 252, 1);
  789. > div {
  790. cursor: pointer;
  791. width: 33%;
  792. text-align: center;
  793. padding: 6px 0;
  794. color: rgba(22, 132, 252, 1);
  795. }
  796. div:nth-child(2) {
  797. border-left: 1px solid rgba(22, 132, 252, 1);
  798. border-right: 1px solid rgba(22, 132, 252, 1);
  799. }
  800. .active {
  801. background-color: rgba(22, 132, 252, 1);
  802. color: #fff;
  803. }
  804. }
  805. .lable-group1 > div {
  806. width: 50%;
  807. }
  808. </style>