StationManagement.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032
  1. <template>
  2. <Layout>
  3. <template #left>
  4. <div class="left">
  5. <Box
  6. :width="665"
  7. :height="396"
  8. :name="'区域分布'"
  9. style="margin-bottom: 25px;"
  10. >
  11. <div class="body">
  12. <div class="total">
  13. <img
  14. src="../../../../assets/img/1-1.png"
  15. alt=""
  16. >
  17. <p>{{ region.total }}</p>
  18. <div>总量</div>
  19. </div>
  20. <Echart :option="region.option" />
  21. </div>
  22. </Box>
  23. <Box
  24. v-for="item in leftTitle"
  25. :key="item.name"
  26. :width="665"
  27. :height="396"
  28. :name="item.name"
  29. style="margin-bottom: 25px;"
  30. >
  31. <div class="body">
  32. <div
  33. v-if="item.name === '类型分布'"
  34. class="text"
  35. >
  36. 站场总数
  37. <p>{{ typeTotal }}</p>
  38. </div>
  39. <Echart
  40. v-if="item.option"
  41. :option="item.option"
  42. />
  43. </div>
  44. </Box>
  45. <Box
  46. :width="665"
  47. :height="396"
  48. :name="'使用情况'"
  49. >
  50. <div class="usage">
  51. <div
  52. v-for="item, index in useData"
  53. :key="index"
  54. class="list"
  55. >
  56. <img
  57. src="../../../../assets/img/1-1.png"
  58. alt=""
  59. >
  60. <div class="value">
  61. {{ item.number }}
  62. </div>
  63. <p> {{ item.useType }}</p>
  64. </div>
  65. </div>
  66. </Box>
  67. </div>
  68. </template>
  69. <template #right>
  70. <div class="right">
  71. <Box
  72. :width="1340"
  73. :height="393"
  74. :name="'运营保障'"
  75. style="margin-bottom: 23px;"
  76. >
  77. <div class="commercial">
  78. <div
  79. v-for="item in operateData"
  80. :key="item.type"
  81. class="commercial-vehicles"
  82. >
  83. <div class="title">
  84. {{ item.type === 1 ? '营运车' : '非营运车' }}
  85. </div>
  86. <div class="top">
  87. <div class="list">
  88. <div>{{ item.inNum }} <span>辆/次</span></div>
  89. <p>进场车次</p>
  90. </div>
  91. <div class="list">
  92. <div>{{ item.outNum }} <span>辆/次</span></div>
  93. <p>出场车次</p>
  94. </div>
  95. <div class="list">
  96. <div>{{ item.parkingNum }} <span>辆/次</span></div>
  97. <p>泊车车次</p>
  98. </div>
  99. </div>
  100. <div class="bottom">
  101. <div class="list">
  102. <div>{{ item.amParkingNum }} <span>辆/次</span></div>
  103. <p>凌晨两点泊车</p>
  104. </div>
  105. <div class="list">
  106. <div style="color: #E73D41;">
  107. {{ item.retentionNum }} <span>辆/次</span>
  108. </div>
  109. <p>长期滞留车辆(大于7天)</p>
  110. </div>
  111. </div>
  112. </div>
  113. </div>
  114. </Box>
  115. <div class="chart-box">
  116. <Box
  117. :width="665"
  118. :height="396"
  119. :name="'充电趋势'"
  120. >
  121. <div class="contet">
  122. <div class="title">
  123. 充电量\kw.h
  124. </div>
  125. <div class="chart">
  126. <Echart :option="powerChart" />
  127. </div>
  128. </div>
  129. </Box>
  130. <Box
  131. :width="665"
  132. :height="396"
  133. :name="'机场装机容量'"
  134. >
  135. <div class="airport">
  136. <div class="text">
  137. 站场总数
  138. <p>{{ installedCapacityTotal }}</p>
  139. </div>
  140. <Echart :option="airportChart" />
  141. </div>
  142. </Box>
  143. </div>
  144. <div class="chart-box">
  145. <Box
  146. :width="665"
  147. :height="396"
  148. :name="'充电桩服务情况'"
  149. >
  150. <ul class="hd">
  151. <li
  152. v-for="item, index in chargingStatus"
  153. :key="index"
  154. >
  155. <img
  156. src="../../../../assets/img/1-1.png"
  157. alt=""
  158. >
  159. <div class="txt">
  160. <p>{{ item.number }}</p>
  161. <div>{{ item.chargingStatus }}</div>
  162. </div>
  163. </li>
  164. </ul>
  165. <ul class="percentage">
  166. <li>
  167. <div class="tt">
  168. <p>今日充电车次</p>
  169. <div>
  170. {{ chargingStatistics.chargingNum }} <span> /{{ chargingStatistics.totalChargingNum }}</span>
  171. </div>
  172. </div>
  173. <n-progress
  174. type="line"
  175. :percentage="+(chargingStatistics.chargingNum / chargingStatistics.totalChargingNum * 100).toFixed(2)"
  176. :show-indicator="false"
  177. :indicator-placement="'inside'"
  178. processing
  179. :stroke-width="15"
  180. />
  181. </li>
  182. <li>
  183. <div class="tt">
  184. <p>今日充电电量 kw.h</p>
  185. <div>
  186. {{ chargingStatistics.electricityNum }} <span> /{{ chargingStatistics.totalElectricityNum }}</span>
  187. </div>
  188. </div>
  189. <n-progress
  190. type="line"
  191. :percentage="+(chargingStatistics.electricityNum / chargingStatistics.totalElectricityNum * 100).toFixed(2)"
  192. :show-indicator="false"
  193. :indicator-placement="'inside'"
  194. processing
  195. :stroke-width="15"
  196. />
  197. </li>
  198. </ul>
  199. </Box>
  200. <Box
  201. :width="665"
  202. :height="396"
  203. :name="'资源使用率'"
  204. >
  205. <ul class="btn">
  206. <li
  207. v-for="item,key in typeMap"
  208. :key="key"
  209. :class="{active:type === key}"
  210. @click="type = key"
  211. >
  212. {{ item }}
  213. </li>
  214. </ul>
  215. <n-data-table
  216. :columns="columns"
  217. :data="tableData"
  218. max-height="200"
  219. />
  220. </Box>
  221. </div>
  222. </div>
  223. </template>
  224. </Layout>
  225. </template>
  226. <script setup lang='ts'>
  227. import Layout from '@/components/layout.vue'
  228. import Box from '@/components/box.vue'
  229. import {
  230. Ref, computed, h, ref
  231. } from 'vue'
  232. import Echart from '@/components/chart.vue'
  233. import StationManagementService from '../services/stationManagement.service'
  234. const leftTitle: Ref<any[]> = ref([ {
  235. name: '类型分布',
  236. option: {
  237. color: [ 'rgb(86,137,239)', 'rgb(85,206,160)', 'rgb(88,107,141)', 'rgb(234,181,23)' ],
  238. tooltip: {
  239. formatter: '{b}: {c}个 ,占比: {d}%'
  240. },
  241. legend: {
  242. orient: 'horizontal',
  243. bottom: '0',
  244. icon: 'circle',
  245. textStyle: {
  246. color: '#fff',
  247. fontSize: 16
  248. }
  249. },
  250. series: {
  251. type: 'pie',
  252. radius: [ '45%', '60%' ],
  253. label: {
  254. show: true,
  255. color: '#fff',
  256. formatter: '{b}: {c}个',
  257. fontSize: 14
  258. },
  259. data: [
  260. { value: 1048, name: '首末班' },
  261. { value: 735, name: '枢纽站' },
  262. { value: 580, name: '停车场' },
  263. { value: 580, name: '保养场' }
  264. ]
  265. }
  266. }
  267. },
  268. {
  269. name: '面积分布',
  270. option: {
  271. color: [ 'rgb(86,137,239)', 'rgb(85,206,160)', 'rgb(88,107,141)', 'rgb(234,181,23)' ],
  272. tooltip: {
  273. formatter: '{b}: {c}个 ,占比: {d}%'
  274. },
  275. legend: {
  276. orient: 'horizontal',
  277. bottom: '0',
  278. icon: 'circle',
  279. textStyle: {
  280. color: '#fff',
  281. fontSize: 16
  282. }
  283. },
  284. series: {
  285. type: 'pie',
  286. radius: '70%',
  287. label: {
  288. show: true,
  289. color: '#fff',
  290. formatter: '{b}: {c}个',
  291. fontSize: 14
  292. },
  293. data: [
  294. { value: 1048, name: '<=500㎡' },
  295. { value: 735, name: '500~2000㎡' },
  296. { value: 580, name: '2000~5000㎡' },
  297. { value: 580, name: '5000~10000㎡' }
  298. ]
  299. }
  300. }
  301. },
  302. {
  303. name: '场站权属情况',
  304. option: {
  305. color: [ 'rgb(86,137,239)', 'rgb(85,206,160)', 'rgb(88,107,141)', 'rgb(234,181,23)' ],
  306. tooltip: {
  307. formatter: '{b}: {c}个 ,占比: {d}%'
  308. },
  309. legend: {
  310. orient: 'horizontal',
  311. bottom: '0',
  312. icon: 'circle',
  313. textStyle: {
  314. color: '#fff',
  315. fontSize: 16
  316. }
  317. },
  318. series: {
  319. type: 'pie',
  320. radius: '70%',
  321. label: {
  322. show: true,
  323. color: '#fff',
  324. formatter: '{b}: {c}个',
  325. fontSize: 14
  326. },
  327. data: [
  328. { value: 1048, name: '自有' },
  329. { value: 735, name: '临时使用' },
  330. { value: 580, name: '先借后租' },
  331. { value: 580, name: '租用' }
  332. ]
  333. }
  334. }
  335. },
  336. {
  337. name: '建设时间',
  338. option: {
  339. tooltip: {
  340. trigger: 'axis',
  341. formatter: '{b} <br/>数量: {c}个',
  342. axisPointer: {
  343. type: 'shadow'
  344. }
  345. },
  346. grid: {
  347. left: '1%',
  348. right: '4%',
  349. bottom: '3%',
  350. containLabel: true
  351. },
  352. legend: {
  353. show: true,
  354. textStyle: {
  355. color: '#fff'
  356. }
  357. },
  358. xAxis: {
  359. type: 'category',
  360. data: [ '超过十年', '5-7年', '近3年', '3-5年' ],
  361. axisLabel: {
  362. color: '#fff',
  363. fontSize: 16
  364. },
  365. axisTick: {
  366. alignWithLabel: true
  367. },
  368. splitLine: {
  369. show: false
  370. }
  371. },
  372. yAxis: {
  373. type: 'value',
  374. axisLabel: {
  375. color: '#fff'
  376. },
  377. splitLine: {
  378. show: true,
  379. lineStyle: {
  380. color: 'rgb(34,43,57)'
  381. }
  382. }
  383. },
  384. series: {
  385. name: '数量',
  386. type: 'bar',
  387. barMaxWidth: '40',
  388. itemStyle: {
  389. color: {
  390. type: 'linear',
  391. x: 0,
  392. y: 0,
  393. x2: 0,
  394. y2: 1,
  395. colorStops: [ {
  396. offset: 0, color: '#00fdff' // 0% 处的颜色
  397. }, {
  398. offset: 1, color: '#00aaff08' // 100% 处的颜色
  399. } ],
  400. global: false // 缺省为 false
  401. }
  402. },
  403. data: [ 10, 52, 200, 334, 390, 330, 220 ]
  404. }
  405. }
  406. } ])
  407. // 区域分布
  408. const region = ref({
  409. total: 40,
  410. option: {
  411. tooltip: {
  412. trigger: 'axis',
  413. axisPointer: {
  414. type: 'shadow'
  415. }
  416. },
  417. grid: {
  418. left: '1%',
  419. right: '4%',
  420. bottom: '3%',
  421. containLabel: true
  422. },
  423. legend: {
  424. show: false,
  425. textStyle: {
  426. color: '#fff'
  427. }
  428. },
  429. yAxis: {
  430. type: 'category',
  431. data: [ '吊挂式', '独立式', '嵌入式' ],
  432. axisLabel: {
  433. color: '#fff',
  434. fontSize: 16
  435. },
  436. axisTick: {
  437. alignWithLabel: true
  438. },
  439. splitLine: {
  440. show: false
  441. }
  442. },
  443. xAxis: {
  444. type: 'value',
  445. axisLabel: {
  446. color: '#fff'
  447. },
  448. splitLine: {
  449. show: true,
  450. lineStyle: {
  451. color: 'rgb(34,43,57)'
  452. }
  453. }
  454. },
  455. series: {
  456. name: '客流量',
  457. type: 'bar',
  458. barMaxWidth: '40',
  459. itemStyle: {
  460. color: 'rgb(86,137,239)',
  461. borderRadius: [ 0, 20, 20, 0 ]
  462. },
  463. label: {
  464. show: true,
  465. position: 'inside',
  466. color: '#fff'
  467. },
  468. data: [ 10, 52, 200, 334, 390, 330, 220 ]
  469. }
  470. }
  471. })
  472. const powerChart = ref({
  473. grid: {
  474. left: '3%',
  475. right: '6%',
  476. bottom: '20%',
  477. containLabel: true
  478. },
  479. tooltip: {
  480. trigger: 'axis',
  481. formatter: '今日{b} <br/>充电量: {c}kw·h'
  482. },
  483. xAxis: {
  484. type: 'category',
  485. boundaryGap: false,
  486. axisLabel: {
  487. color: '#fff',
  488. fontSize: 16
  489. },
  490. data: [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
  491. },
  492. yAxis: {
  493. type: 'value',
  494. splitLine: {
  495. show: true,
  496. lineStyle: {
  497. color: 'rgb(34,43,57)'
  498. }
  499. },
  500. axisLabel: {
  501. color: '#fff',
  502. formatter: '{value} kw·h',
  503. fontSize: 16
  504. }
  505. },
  506. dataZoom: {
  507. show: true,
  508. type: 'slider'
  509. },
  510. series: {
  511. data: [ 820, 932, 901, 934, 1290, 1330, 1320 ],
  512. type: 'line',
  513. areaStyle: {
  514. color: {
  515. type: 'linear',
  516. x: 0,
  517. y: 0,
  518. x2: 0,
  519. y2: 1,
  520. colorStops: [ {
  521. offset: 0, color: '#FFD35D ' // 0% 处的颜色
  522. }, {
  523. offset: 0.5, color: '#7ec2f3 ' // 100% 处的颜色
  524. }, {
  525. offset: 1, color: '#1890ff ' // 100% 处的颜色
  526. } ],
  527. global: false // 缺省为 false
  528. }
  529. }
  530. }
  531. })
  532. const airportChart = ref({
  533. color: [ 'rgb(86,137,239)', 'rgb(85,206,160)', 'rgb(88,107,141)', 'rgb(234,181,23)' ],
  534. tooltip: {
  535. trigger: 'item',
  536. formatter: '{b}: {c}个 ,占比: {d}%'
  537. },
  538. legend: {
  539. orient: 'horizontal',
  540. bottom: '0',
  541. icon: 'circle',
  542. textStyle: {
  543. color: '#fff',
  544. fontSize: 16
  545. }
  546. },
  547. series: {
  548. type: 'pie',
  549. radius: [ '45%', '60%' ],
  550. label: {
  551. show: true,
  552. color: '#fff',
  553. formatter: '{b}: {c}个',
  554. fontSize: 14
  555. },
  556. data: [
  557. { value: 1048, name: '<=500m' },
  558. { value: 735, name: '500~2000' },
  559. { value: 580, name: '2000~5000' },
  560. { value: 580, name: '5000~10000' }
  561. ]
  562. }
  563. })
  564. const originData = ref([ {
  565. admissionRate: 0,
  566. stationName: 'xxx'
  567. } ])
  568. const type = ref('admissionRate')
  569. const typeMap = {
  570. admissionRate: '各场站入场率',
  571. chargingCapacity: '各充电场站充电量',
  572. maintenanceNum: '各维保场维修保养车辆数',
  573. usageRate: '运维驿站使用率'
  574. }
  575. const tableData = computed(() => originData.value.map((item:any) => ({
  576. stationName: item.stationName,
  577. rate: item[type.value]
  578. })))
  579. const columns = [
  580. {
  581. title: '序号',
  582. render: (_: any, rowIndex: number) => h('span', rowIndex + 1)
  583. },
  584. {
  585. title: '场站',
  586. key: 'stationName'
  587. },
  588. {
  589. title: '入场率',
  590. key: 'rate'
  591. } ]
  592. const stationManagementService = new StationManagementService()
  593. async function getStationRegion() {
  594. const res = await stationManagementService.getStationRegion()
  595. const yData = []
  596. const seriesData = []
  597. let total = 0
  598. for (let i = 0; i < res.length; i++) {
  599. const item = res[i]
  600. yData.push(item.region)
  601. seriesData.push(item.passengerFlow)
  602. total += item.passengerFlow
  603. }
  604. region.value.option.yAxis.data = yData
  605. region.value.option.series.data = seriesData
  606. region.value.total = total
  607. }
  608. getStationRegion()
  609. const typeTotal = ref(0)
  610. async function getStationTypes() {
  611. const res = await stationManagementService.getStationTypes()
  612. const seriesData = []
  613. let total = 0
  614. for (let i = 0; i < res.length; i++) {
  615. const item = res[i]
  616. seriesData.push({
  617. name: item.type,
  618. value: item.number
  619. })
  620. total += item.number
  621. }
  622. leftTitle.value[0].option.series.data = seriesData
  623. typeTotal.value = total
  624. }
  625. getStationTypes()
  626. async function getStationArea() {
  627. const res = await stationManagementService.getStationArea()
  628. const seriesData = []
  629. let total = 0
  630. for (let i = 0; i < res.length; i++) {
  631. const item = res[i]
  632. seriesData.push({
  633. name: item.areaType,
  634. value: item.number
  635. })
  636. total += item.number
  637. }
  638. leftTitle.value[1].option.series.data = seriesData
  639. typeTotal.value = total
  640. }
  641. getStationArea()
  642. async function getStationOwnership() {
  643. const res = await stationManagementService.getStationOwnership()
  644. const seriesData = []
  645. let total = 0
  646. for (let i = 0; i < res.length; i++) {
  647. const item = res[i]
  648. seriesData.push({
  649. name: item.ownership,
  650. value: item.number
  651. })
  652. total += item.number
  653. }
  654. leftTitle.value[2].option.series.data = seriesData
  655. typeTotal.value = total
  656. }
  657. getStationOwnership()
  658. async function getStationConstruct() {
  659. const res = await stationManagementService.getStationConstruct()
  660. const xData = []
  661. const seriesData = []
  662. for (let i = 0; i < res.length; i++) {
  663. const item = res[i]
  664. xData.push(item.constructSituation)
  665. seriesData.push(item.number)
  666. }
  667. leftTitle.value[3].option.xAxis.data = seriesData
  668. leftTitle.value[3].option.series.data = seriesData
  669. }
  670. getStationConstruct()
  671. const useData = ref([] as any[])
  672. async function getStationUse() {
  673. useData.value = await stationManagementService.getStationUse()
  674. }
  675. getStationUse()
  676. const operateData = ref([] as any[])
  677. async function getStationOperate() {
  678. operateData.value = await stationManagementService.getStationOperate()
  679. }
  680. getStationOperate()
  681. async function getStationChargingTrends() {
  682. const res = await stationManagementService.getStationChargingTrends()
  683. const xData = []
  684. const seriesData = []
  685. for (let i = 0; i < res.length; i++) {
  686. const item = res[i]
  687. xData.push(item.time.slice(11))
  688. seriesData.push(item.number)
  689. }
  690. powerChart.value.xAxis.data = xData
  691. powerChart.value.series.data = seriesData
  692. }
  693. getStationChargingTrends()
  694. const installedCapacityTotal = ref(0)
  695. async function getStationInstalledCapacity() {
  696. const res = await stationManagementService.getStationInstalledCapacity()
  697. const seriesData = []
  698. let total = 0
  699. for (let i = 0; i < res.length; i++) {
  700. const item = res[i]
  701. seriesData.push({
  702. name: item.type,
  703. value: item.number
  704. })
  705. total += item.number
  706. }
  707. airportChart.value.series.data = seriesData
  708. installedCapacityTotal.value = total
  709. }
  710. getStationInstalledCapacity()
  711. const chargingStatus = ref([
  712. { chargingStatus: '空闲', number: 0 },
  713. { chargingStatus: '充满', number: 0 },
  714. { chargingStatus: '在充', number: 0 },
  715. { chargingStatus: '故障', number: 0 }
  716. ])
  717. async function getStationChargingStatus() {
  718. const res = await stationManagementService.getStationChargingStatus()
  719. }
  720. getStationChargingStatus()
  721. const chargingStatistics = ref({
  722. chargingNum: 1,
  723. totalChargingNum: 2,
  724. electricityNum: 1,
  725. totalElectricityNum: 1
  726. })
  727. async function getStationChargingStatistics() {
  728. chargingStatistics.value = await stationManagementService.getStationChargingStatistics()
  729. }
  730. getStationChargingStatistics()
  731. async function getStationResourceRate() {
  732. originData.value = await stationManagementService.getStationResourceRate()
  733. }
  734. getStationResourceRate()
  735. </script>
  736. <style lang="scss" scoped>
  737. .left {
  738. color: #fff;
  739. display: flex;
  740. justify-content: space-between;
  741. flex-wrap: wrap;
  742. .usage {
  743. width: 100%;
  744. height: 100%;
  745. display: flex;
  746. padding: 0 120px;
  747. justify-content: space-between;
  748. align-items: center;
  749. .list {
  750. text-align: center;
  751. img {
  752. width: 80px;
  753. height: 80px;
  754. }
  755. .value {
  756. color: #00FFFF;
  757. font-size: 50px;
  758. }
  759. p {
  760. font-size: 24px;
  761. }
  762. }
  763. }
  764. .body {
  765. width: 100%;
  766. height: 100%;
  767. display: flex;
  768. position: relative;
  769. .total {
  770. width: 136px;
  771. text-align: center;
  772. img {
  773. margin-top: 80px;
  774. width: 100px;
  775. height: 100px;
  776. }
  777. p {
  778. font-size: 60px;
  779. }
  780. div {
  781. font-size: 24px;
  782. }
  783. }
  784. .plot {
  785. flex: 1;
  786. }
  787. .text {
  788. position: absolute;
  789. left: 42%;
  790. top: 40%;
  791. font-size: 28px;
  792. text-align: center;
  793. }
  794. }
  795. }
  796. .right {
  797. width: 1340px;
  798. color: #fff;
  799. ul {
  800. margin: 0;
  801. padding: 0;
  802. li {
  803. list-style: none;
  804. }
  805. }
  806. .commercial {
  807. display: flex;
  808. justify-content: space-between;
  809. .commercial-vehicles {
  810. width: 49%;
  811. .title {
  812. color: #F59A23;
  813. font-size: 24px;
  814. line-height: 74px;
  815. text-indent: 10px;
  816. }
  817. .list {
  818. width: 33.33333%;
  819. border: 1px solid rgba(0, 255, 255, 0.298);
  820. height: 137px;
  821. text-align: center;
  822. display: flex;
  823. flex-direction: column;
  824. justify-content: center;
  825. div {
  826. font-size: 50px;
  827. display: flex;
  828. align-items: center;
  829. justify-content: center;
  830. span {
  831. font-size: 20px;
  832. line-height: 50px;
  833. margin-left: 10px;
  834. color: #fff;
  835. }
  836. }
  837. p {
  838. color: #80FFFF;
  839. }
  840. }
  841. .top {
  842. display: flex;
  843. }
  844. .bottom {
  845. display: flex;
  846. .list {
  847. width: 50%;
  848. }
  849. }
  850. }
  851. }
  852. .chart-box {
  853. display: flex;
  854. justify-content: space-between;
  855. .airport {
  856. width: 100%;
  857. height: 100%;
  858. position: relative;
  859. .text {
  860. position: absolute;
  861. left: 42%;
  862. top: 40%;
  863. font-size: 28px;
  864. text-align: center;
  865. }
  866. }
  867. .contet {
  868. width: 100%;
  869. height: 100%;
  870. display: flex;
  871. .title {
  872. font-size: 16px;
  873. writing-mode: vertical-lr;
  874. /* 从上到下排列,默认为从左到右 */
  875. text-orientation: sideways;
  876. transform: rotate(180deg);
  877. text-align: center;
  878. height: 100%;
  879. }
  880. .chart {
  881. flex: 1;
  882. }
  883. }
  884. .hd {
  885. display: flex;
  886. margin-top: 18px;
  887. li {
  888. display: flex;
  889. width: 25%;
  890. height: 137px;
  891. border: 1px solid rgba(0, 255, 255, 0.298);
  892. display: flex;
  893. justify-content: center;
  894. align-items: center;
  895. img {
  896. width: 40px;
  897. height: 40px;
  898. }
  899. .txt {
  900. margin-left: 10px;
  901. p {
  902. font-size: 26px;
  903. line-height: 40px;
  904. }
  905. div {
  906. font-size: 18px;
  907. color: #80FFFF;
  908. }
  909. }
  910. }
  911. }
  912. .percentage {
  913. padding-right: 40px;
  914. li {
  915. margin-top: 30px;
  916. .tt {
  917. display: flex;
  918. justify-content: space-between;
  919. line-height: 40px;
  920. font-size: 20px;
  921. margin-bottom: 10px;
  922. div {
  923. font-size: 34px;
  924. color: #80FFFF;
  925. span {
  926. font-size: 24px;
  927. color: #fff;
  928. }
  929. }
  930. }
  931. }
  932. }
  933. .btn {
  934. display: flex;
  935. flex-wrap: wrap;
  936. // justify-content: space-between;
  937. li {
  938. line-height: 33px;
  939. border-radius: 100px;
  940. border: 1px solid #80FFFF;
  941. padding: 0 10px;
  942. margin: 10px;
  943. font-size: 20px;
  944. cursor: pointer;
  945. &.active{
  946. background: #2f64aa;
  947. }
  948. }
  949. }
  950. }
  951. }
  952. </style>