index.vue 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. <template>
  2. <div class="dashboard-container">
  3. <div class="head">
  4. <div class="left">
  5. <div class="item">
  6. <div class="number">
  7. {{ countFee.expendGas }}
  8. </div>
  9. <div class="title">
  10. 支出/气体
  11. </div>
  12. </div>
  13. <div class="verticalLine"/>
  14. <div class="item">
  15. <div class="number">
  16. {{countFee.principalBalance}}
  17. </div>
  18. <div class="title">
  19. 剩余本金
  20. </div>
  21. </div>
  22. <div class="verticalLine"/>
  23. <div class="item">
  24. <div class="number">
  25. {{countFee.predictTotalCost}}
  26. </div>
  27. <div class="title">
  28. 预计支出总费用
  29. </div>
  30. </div>
  31. <!-- <div class="verticalLine"/>-->
  32. <!-- <div class="item">-->
  33. <!-- <div class="number">-->
  34. <!-- 88222-->
  35. <!-- </div>-->
  36. <!-- <div class="title">-->
  37. <!-- 预计空投价值-->
  38. <!-- </div>-->
  39. <!-- </div>-->
  40. </div>
  41. <div class="right" @click="drawerFinance = true">
  42. <img src="../../assets/dashboard/upload.svg" alt="upload">
  43. 导出财务报表
  44. </div>
  45. </div>
  46. <div class="main">
  47. <div class="left">
  48. <div class="expenseAndInput">
  49. <div class="expense">
  50. <div class="head">
  51. <div class="title">
  52. 支出趋势
  53. </div>
  54. <div style="width: 300px;display: flex;justify-content: space-between;z-index: 10">
  55. <div @click='changeActive(index)' :class='isActive === index ? "myWallet-text2" : "myWallet-text3"'
  56. v-for="(item,index) in day">
  57. {{ item }}
  58. </div>
  59. <el-popover placement="right" trigger="click">
  60. <div slot="reference" class="myWallet-text4">
  61. Custom
  62. </div>
  63. <el-date-picker
  64. v-model="datePicker"
  65. type="daterange"
  66. align="center"
  67. range-separator="To"
  68. start-placeholder="开始时间"
  69. end-placeholder="结束时间"
  70. :disabled-date="disabledDate"
  71. @change="datePickerChange"
  72. />
  73. </el-popover>
  74. </div>
  75. </div>
  76. <div class="emissionBonus" id="expense">
  77. </div>
  78. </div>
  79. <div class="input">
  80. <div class="title">
  81. 预计投入/USDT
  82. </div>
  83. <div class="emissionBonus" id="input">
  84. </div>
  85. <div class="expected">
  86. <div class="text">
  87. 预期投入
  88. </div>
  89. <div class="amount">
  90. 888232
  91. </div>
  92. </div>
  93. <div class="info">
  94. 共{{echartsInputData.totalCount}}项
  95. </div>
  96. <div class="info">
  97. 总支出:{{echartsInputData.totalCost}}
  98. </div>
  99. <div class="progress">
  100. <div class="progress">
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. <div class="missionAndAddress">
  106. <div class="mission">
  107. <div class="title">
  108. 交互任务进度
  109. </div>
  110. <div style="margin-top: 20px;height: 230px;overflow: hidden" id="progressViewBox" @mouseenter="rollStop()" @mouseleave="rollStart(60)">
  111. <div class="progressBox" id="progressBoxOne">
  112. <div class="item" v-for="(item,index) in progressData">
  113. <div class="name">
  114. {{ item.taskName }}
  115. </div>
  116. <div class="progress">
  117. <div class="progress" :style="{width:(item.finishCount/item.totalCount*100)+'%'}"></div>
  118. </div>
  119. </div>
  120. </div>
  121. <div class="progressBox" id="progressBoxTwo">
  122. </div>
  123. </div>
  124. </div>
  125. <div class="address">
  126. <div class="title">
  127. 地址统计
  128. </div>
  129. <div class="emissionBonus" id="address">
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. <div class="right">
  135. <div class="title">
  136. 燃气报价(单位:元)
  137. </div>
  138. <div class="base">
  139. 当前基数:38基于以太坊交易内存池预测
  140. </div>
  141. <div class="gasBox">
  142. <div class="top">
  143. <div class="item">
  144. <img src="../../assets/dashboard/Vector.svg" alt="Vector">
  145. <div class="info">
  146. <div class="speed">
  147. Top 40
  148. </div>
  149. <div class="price">
  150. $1.57 | for 15 seconds
  151. </div>
  152. </div>
  153. </div>
  154. </div>
  155. <div class="high">
  156. <div class="item">
  157. <img src="../../assets/dashboard/Vector-1.svg" alt="Vector">
  158. <div class="info">
  159. <div class="speed">
  160. High speed 40
  161. </div>
  162. <div class="price">
  163. $1.53 | 1 minute
  164. </div>
  165. </div>
  166. </div>
  167. </div>
  168. <div class="general">
  169. <div class="item">
  170. <img src="../../assets/dashboard/Vector-2.svg" alt="Vector">
  171. <div class="info">
  172. <div class="speed">
  173. General 40
  174. </div>
  175. <div class="price">
  176. $1.49 | 3 minutes
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. <div class="slow">
  182. <div class="item">
  183. <img src="../../assets/dashboard/Vector-3.svg" alt="Vector">
  184. <div class="info">
  185. <div class="speed">
  186. Slow 40
  187. </div>
  188. <div class="price">
  189. $1.49 | > 10 minutes
  190. </div>
  191. </div>
  192. </div>
  193. </div>
  194. </div>
  195. <div class="logo">
  196. <img src="../../assets/dashboard/image.svg" alt="image">
  197. </div>
  198. </div>
  199. </div>
  200. <el-drawer
  201. :visible.sync="drawerFinance"
  202. :with-header="false">
  203. <div class="drawerAddress-container">
  204. <div class="drawerAddress-container-head">
  205. <div class="drawerAddress-container-head-left">
  206. <div class="drawerAddress-container-title">
  207. 邮件通知
  208. </div>
  209. <div class="drawerAddress-container-tip">
  210. 总计邮件: 2
  211. </div>
  212. </div>
  213. <div class="drawerAddress-container-head-right">
  214. <div class="complete" @click="exportingReports">
  215. <img src="../../assets/address/done_all.svg" alt="done_all">
  216. 确认导出
  217. </div>
  218. </div>
  219. </div>
  220. <div class="drawerAddress-container-main">
  221. <div class="moduleBox">
  222. <div class="title">
  223. 导出项目
  224. </div>
  225. <div class="input">
  226. <el-select style="width: 100%" v-model="project" placeholder="选择导出项目">
  227. <el-option
  228. v-for="item in optionsProject"
  229. :key="item.value"
  230. :label="item.label"
  231. :value="item.value">
  232. </el-option>
  233. </el-select>
  234. </div>
  235. </div>
  236. <div class="timeBox">
  237. <div class="title">
  238. 导出内容
  239. </div>
  240. <div class="input">
  241. <el-select style="width: 100%" v-model="project" placeholder="选择导出内容">
  242. <el-option
  243. v-for="item in optionsProject"
  244. :key="item.value"
  245. :label="item.label"
  246. :value="item.value">
  247. </el-option>
  248. </el-select>
  249. </div>
  250. </div>
  251. <div class="emailBox">
  252. <div class="title">
  253. 时间范围
  254. </div>
  255. <div class="block">
  256. <el-date-picker
  257. v-model="time"
  258. type="daterange"
  259. align="right"
  260. unlink-panels
  261. style="width: 100%"
  262. range-separator="至"
  263. start-placeholder="开始日期"
  264. end-placeholder="结束日期"
  265. :picker-options="pickerOptions">
  266. </el-date-picker>
  267. </div>
  268. </div>
  269. </div>
  270. </div>
  271. </el-drawer>
  272. </div>
  273. </template>
  274. <script>
  275. import * as echarts from 'echarts';
  276. import {addressGroup, countFee, dailyCost, expectedInput, taskProgress} from "@/api/statistics";
  277. export default {
  278. name: "Dashboard",
  279. data() {
  280. return {
  281. progressData: [],
  282. isActive: 0,
  283. day: ['7D', '30D', 'All'],
  284. visible: false,
  285. datePicker: [],
  286. drawerFinance:false,
  287. project:'',
  288. optionsProject: [
  289. {
  290. value: '1',
  291. label: 'zkSync'
  292. }
  293. ],
  294. pickerOptions: {
  295. shortcuts: [{
  296. text: '最近一周',
  297. onClick(picker) {
  298. const end = new Date();
  299. const start = new Date();
  300. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  301. picker.$emit('pick', [start, end]);
  302. }
  303. }, {
  304. text: '最近一个月',
  305. onClick(picker) {
  306. const end = new Date();
  307. const start = new Date();
  308. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  309. picker.$emit('pick', [start, end]);
  310. }
  311. }, {
  312. text: '最近三个月',
  313. onClick(picker) {
  314. const end = new Date();
  315. const start = new Date();
  316. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  317. picker.$emit('pick', [start, end]);
  318. }
  319. }]
  320. },
  321. time:'',
  322. countFee:{
  323. expendGas:0,
  324. predictTotalCost:0,
  325. principalBalance:0,
  326. },
  327. echartsInputData:{
  328. totalCost:0,
  329. totalCount:0,
  330. predicts:[]
  331. },
  332. echartsExpenseData:{
  333. timeData:[],
  334. seriesDataGas:[],
  335. seriesDataP:[]
  336. },
  337. echartsAddressData:{
  338. xAxisData:[],
  339. seriesData:[]
  340. },
  341. timer:null
  342. };
  343. },
  344. mounted() {
  345. this.getExpectedInput()
  346. this.getCountFee()
  347. this.getDailyCost()
  348. this.getTaskProgress()
  349. this.getAddressGroup()
  350. this.roll(60)
  351. },
  352. beforeDestroy() {
  353. if(this.timer) clearInterval(this.timer)
  354. },
  355. methods: {
  356. initEchartsAddress() {
  357. let chartDom = document.getElementById('address');
  358. let myChart = echarts.init(chartDom, undefined, {
  359. renderer: 'svg'
  360. });
  361. let option;
  362. option = {
  363. textStyle: {
  364. fontFamily: 'Quicksand'
  365. },
  366. tooltip: {
  367. trigger: 'axis',
  368. },
  369. xAxis: {
  370. offset: 20,
  371. type: 'category',
  372. data: this.echartsAddressData.xAxisData,
  373. axisLabel: {
  374. color: '#ABABAB'
  375. },
  376. axisTick: {
  377. show: false
  378. },
  379. axisPointer: {
  380. type: 'shadow'
  381. }
  382. },
  383. yAxis: {
  384. offset: 20,
  385. type: 'value',
  386. axisLabel: {
  387. color: '#ABABAB'
  388. },
  389. },
  390. dataZoom: [
  391. {
  392. type: 'inside'
  393. }
  394. ],
  395. series: [
  396. {
  397. data: this.echartsAddressData.seriesData,
  398. type: 'bar',
  399. barWidth: '15%',
  400. itemStyle: {
  401. color: '#27AE60',
  402. borderRadius: [30, 30, 0, 0]
  403. }
  404. }
  405. ]
  406. };
  407. option && myChart.setOption(option);
  408. },
  409. initEchartsInput() {
  410. let chartDom = document.getElementById('input');
  411. let myChart = echarts.init(chartDom, undefined, {
  412. renderer: 'svg'
  413. });
  414. let option;
  415. option = {
  416. tooltip: {
  417. trigger: 'item'
  418. },
  419. series: [
  420. {
  421. type: 'pie',
  422. radius: ['40%', '70%'],
  423. avoidLabelOverlap: false,
  424. label: {
  425. show: false,
  426. position: 'center'
  427. },
  428. labelLine: {
  429. show: false
  430. },
  431. data: this.echartsInputData.predicts
  432. }
  433. ]
  434. };
  435. option && myChart.setOption(option);
  436. },
  437. initEchartsExpense(){
  438. let chartDom = document.getElementById('expense');
  439. let myChart = echarts.init(chartDom, undefined, {
  440. renderer: 'svg'
  441. });
  442. let option;
  443. option = {
  444. dataZoom: [
  445. {
  446. type: 'inside'
  447. }
  448. ],
  449. tooltip: {
  450. trigger: 'axis',
  451. axisPointer: {
  452. type: 'cross',
  453. label: {
  454. backgroundColor: '#6a7985'
  455. }
  456. }
  457. },
  458. legend: {
  459. icon: 'circle',
  460. },
  461. xAxis: [
  462. {
  463. offset: 10,
  464. type: 'category',
  465. axisLabel: {
  466. color: '#ABABAB',
  467. fontWeight: 500
  468. },
  469. axisTick: {
  470. show: false
  471. },
  472. data: this.echartsExpenseData.timeData
  473. }
  474. ],
  475. yAxis: [
  476. {
  477. offset: 10,
  478. axisLabel: {
  479. color: '#181818',
  480. fontWeight: 700
  481. },
  482. type: 'value'
  483. }
  484. ],
  485. series: [
  486. {
  487. name: 'Gas',
  488. type: 'bar',
  489. stack: 'Total',
  490. color: '#2980FF',
  491. barMaxWidth: '25px',
  492. emphasis: {
  493. focus: 'series'
  494. },
  495. data: this.echartsExpenseData.seriesDataGas
  496. },
  497. {
  498. name: '本金',
  499. type: 'bar',
  500. stack: 'Total',
  501. color: '#FFD428',
  502. barMaxWidth: '25px',
  503. itemStyle: {
  504. borderRadius: [100, 100, 0, 0]
  505. },
  506. emphasis: {
  507. focus: 'series'
  508. },
  509. data: this.echartsExpenseData.seriesDataP
  510. },
  511. ]
  512. };
  513. option && myChart.setOption(option);
  514. },
  515. changeActive(index) {
  516. this.isActive = index
  517. },
  518. changeInitCalendarPage() {
  519. let element = document.querySelector(".el-picker-panel__icon-btn.arrow-left");
  520. if (element) {
  521. element.click()
  522. }
  523. },
  524. disabledDate(time) {
  525. return time.getTime() > Date.now()
  526. },
  527. datePickerChange() {
  528. this.visible = false
  529. if (this.datePicker) {
  530. console.log(this.datePicker);
  531. } else {
  532. // changeActive(0)
  533. }
  534. },
  535. exportingReports(){
  536. },
  537. getExpectedInput(){
  538. expectedInput().then(res=>{
  539. this.echartsInputData = res
  540. this.echartsInputData.predicts.forEach(item=>{
  541. item.value = item.estimatedCost
  542. item.name = item.projectName
  543. })
  544. this.initEchartsInput()
  545. })
  546. },
  547. getCountFee(){
  548. countFee().then(res=>{
  549. this.countFee = res
  550. })
  551. },
  552. getDailyCost(){
  553. dailyCost().then(res=>{
  554. this.echartsExpenseData = {
  555. timeData:[],
  556. seriesDataGas:[],
  557. seriesDataP:[]
  558. }
  559. res.forEach(item=>{
  560. this.echartsExpenseData.timeData.push(item.date)
  561. this.echartsExpenseData.seriesDataGas.push(item.gas)
  562. this.echartsExpenseData.seriesDataP.push(item.principal)
  563. })
  564. this.initEchartsExpense()
  565. })
  566. },
  567. getTaskProgress(){
  568. taskProgress().then(res=>{
  569. this.progressData = res
  570. })
  571. },
  572. getAddressGroup(){
  573. addressGroup().then(res=>{
  574. res.forEach(item=>{
  575. this.echartsAddressData.xAxisData.push(item.groupName)
  576. this.echartsAddressData.seriesData.push(item.addressCount)
  577. })
  578. this.initEchartsAddress()
  579. })
  580. },
  581. roll(t) {
  582. let ul1 = document.getElementById('progressBoxOne')
  583. let ul2 = document.getElementById('progressBoxTwo')
  584. let ulbox = document.getElementById('progressViewBox')
  585. ul2.innerHTML = ul1.innerHTML
  586. ulbox.scrollTop = 0
  587. this.rollStart(t)
  588. },
  589. rollStart(t) {
  590. let ul1 = document.getElementById('progressBoxOne')
  591. let ul2 = document.getElementById('progressBoxTwo')
  592. let ulbox = document.getElementById('progressViewBox')
  593. this.rollStop();
  594. this.timer = setInterval(()=>{
  595. if(ulbox.scrollTop >= ul1.scrollHeight) {
  596. ulbox.scrollTop = 0
  597. } else {
  598. ulbox.scrollTop++
  599. }
  600. },t)
  601. },
  602. rollStop(){
  603. clearInterval(this.timer)
  604. }
  605. },
  606. };
  607. </script>
  608. <style lang="scss" scoped>
  609. .dashboard-container {
  610. .title {
  611. font-weight: 700;
  612. font-size: 21px;
  613. line-height: 26px;
  614. color: #181818;
  615. }
  616. .head {
  617. display: flex;
  618. align-items: center;
  619. justify-content: space-between;
  620. .left {
  621. display: flex;
  622. gap: 60px;
  623. .item {
  624. display: flex;
  625. flex-direction: column;
  626. gap: 8px;
  627. .number {
  628. font-weight: 700;
  629. font-size: 21px;
  630. line-height: 28px;
  631. color: #181818;
  632. }
  633. .title {
  634. font-weight: 700;
  635. font-size: 12px;
  636. line-height: 16px;
  637. color: #8e8f91;
  638. }
  639. }
  640. .verticalLine {
  641. width: 1px;
  642. height: 50px;
  643. border-right: 1px solid #e4e6ea;
  644. }
  645. }
  646. .right {
  647. width: 178px;
  648. height: 52px;
  649. display: flex;
  650. align-items: center;
  651. justify-content: center;
  652. gap: 4px;
  653. border: 1px solid #2980FF;
  654. border-radius: 10px;
  655. font-weight: 700;
  656. font-size: 15px;
  657. line-height: 20px;
  658. color: #2980FF;
  659. cursor: pointer;
  660. }
  661. }
  662. .main {
  663. display: flex;
  664. justify-content: space-between;
  665. margin-top: 40px;
  666. .left {
  667. display: flex;
  668. flex-direction: column;
  669. gap: 40px;
  670. .expenseAndInput {
  671. display: flex;
  672. gap: 28px;
  673. .expense {
  674. width: 736px;
  675. height: 342px;
  676. background: #fcfdff;
  677. border: 1px solid #F1F2F6;
  678. border-radius: 10px;
  679. padding: 36px;
  680. .head {
  681. display: flex;
  682. align-items: center;
  683. justify-content: space-between;
  684. .myWallet-text2 {
  685. width: 50px;
  686. height: 34px;
  687. background: #F1F1F1;
  688. border: 1px solid #F1F1F1;
  689. border-radius: 36px;
  690. font-weight: 700;
  691. font-size: 14px;
  692. line-height: 18px;
  693. color: #2A2E39;
  694. display: flex;
  695. justify-content: center;
  696. align-items: center;
  697. cursor: pointer;
  698. }
  699. .myWallet-text3 {
  700. width: 50px;
  701. height: 34px;
  702. color: #8F9297;
  703. border-radius: 36px;
  704. font-weight: 500;
  705. font-size: 14px;
  706. line-height: 18px;
  707. display: flex;
  708. justify-content: center;
  709. align-items: center;
  710. cursor: pointer;
  711. }
  712. .myWallet-text4 {
  713. width: 84px;
  714. height: 34px;
  715. background: linear-gradient(135deg, #FEF380 0%, #E8FFC7 100%);
  716. border-radius: 36px;
  717. font-weight: 700;
  718. font-size: 14px;
  719. line-height: 18px;
  720. color: #2A2E39;
  721. display: flex;
  722. justify-content: center;
  723. align-items: center;
  724. cursor: pointer;
  725. }
  726. }
  727. .emissionBonus{
  728. margin-top: 20px;
  729. width: 100%;
  730. height: 260px;
  731. }
  732. }
  733. .input {
  734. width: 300px;
  735. height: 342px;
  736. background: #fcfdff;
  737. border: 1px solid #F1F2F6;
  738. border-radius: 10px;
  739. padding: 36px;
  740. text-align: center;
  741. position: relative;
  742. .emissionBonus {
  743. width: 100%;
  744. height: 180px;
  745. }
  746. .expected {
  747. display: flex;
  748. flex-direction: column;
  749. position: absolute;
  750. top: 136px;
  751. left: 0;
  752. right: 0;
  753. margin: 0 auto;
  754. .text {
  755. font-weight: 500;
  756. font-size: 13px;
  757. line-height: 16px;
  758. color: #7e7f80;
  759. }
  760. .amount {
  761. font-weight: 700;
  762. font-size: 16px;
  763. line-height: 20px;
  764. color: #000000;
  765. }
  766. }
  767. .info {
  768. text-align: center;
  769. font-weight: 400;
  770. font-size: 14px;
  771. line-height: 18px;
  772. color: #222222;
  773. }
  774. .progress {
  775. width: 100%;
  776. height: 6px;
  777. background: #d2e4ff;
  778. border-radius: 10px;
  779. margin-top: 8px;
  780. .progress {
  781. width: 70%;
  782. height: 6px;
  783. background: #6FCF97;
  784. border-radius: 10px;
  785. }
  786. }
  787. }
  788. }
  789. .missionAndAddress {
  790. display: flex;
  791. gap: 40px;
  792. .mission {
  793. width: 335px;
  794. height: 338px;
  795. background: #fcfdff;
  796. border: 1px solid #F1F2F6;
  797. border-radius: 10px;
  798. padding: 36px;
  799. .progressBox {
  800. margin-top: 28px;
  801. display: flex;
  802. flex-direction: column;
  803. gap: 24px;
  804. .item {
  805. display: flex;
  806. justify-content: space-between;
  807. align-items: center;
  808. .name {
  809. font-weight: 700;
  810. font-size: 11px;
  811. line-height: 14px;
  812. color: #181818;
  813. }
  814. .progress {
  815. width: 160px;
  816. height: 20px;
  817. background: #222222;
  818. border-radius: 0 20px 20px 0;
  819. .progress {
  820. height: 20px;
  821. background: #6FCF97;
  822. border-radius: 0 20px 20px 0;
  823. }
  824. }
  825. }
  826. }
  827. }
  828. .address {
  829. width: 689px;
  830. height: 338px;
  831. background: #fcfdff;
  832. border: 1px solid #F1F2F6;
  833. border-radius: 10px;
  834. padding: 36px;
  835. .emissionBonus {
  836. width: 689px;
  837. height: 280px
  838. }
  839. }
  840. }
  841. }
  842. .right {
  843. width: 348px;
  844. height: 720px;
  845. background: #FFFFFF;
  846. border-radius: 10px;
  847. padding: 28px;
  848. .base {
  849. font-weight: 400;
  850. font-size: 12px;
  851. line-height: 16px;
  852. color: #ABABAB;
  853. margin-top: 8px;
  854. margin-bottom: 20px;
  855. }
  856. .gasBox {
  857. display: flex;
  858. flex-direction: column;
  859. gap: 28px;
  860. .item {
  861. display: flex;
  862. align-items: center;
  863. gap: 24px;
  864. .info {
  865. display: flex;
  866. flex-direction: column;
  867. gap: 8px;
  868. .speed {
  869. font-weight: 700;
  870. font-size: 17px;
  871. line-height: 22px;
  872. color: #181818;
  873. }
  874. .price {
  875. font-weight: 400;
  876. font-size: 14px;
  877. line-height: 18px;
  878. color: #919191;
  879. }
  880. }
  881. }
  882. .top {
  883. width: 100%;
  884. height: 104px;
  885. background: #FFFFFF;
  886. border: 1px solid #EB5757;
  887. border-radius: 10px;
  888. display: flex;
  889. align-items: center;
  890. justify-content: center;
  891. }
  892. .high {
  893. width: 100%;
  894. height: 104px;
  895. background: #FFFFFF;
  896. border: 1px solid #2980FF;
  897. border-radius: 10px;
  898. display: flex;
  899. align-items: center;
  900. justify-content: center;
  901. }
  902. .general {
  903. width: 100%;
  904. height: 104px;
  905. background: #6FCF97;
  906. border: 1px solid #6FCF97;
  907. border-radius: 10px;
  908. display: flex;
  909. align-items: center;
  910. justify-content: center;
  911. }
  912. .slow {
  913. width: 100%;
  914. height: 104px;
  915. background: #FFFFFF;
  916. border: 1px solid #F2C94C;
  917. border-radius: 10px;
  918. display: flex;
  919. align-items: center;
  920. justify-content: center;
  921. }
  922. }
  923. .logo {
  924. margin-top: 72px;
  925. display: flex;
  926. justify-content: center;
  927. }
  928. }
  929. }
  930. .drawerAddress-container{
  931. display: flex;
  932. flex-direction: column;
  933. height: 100vh;
  934. overflow: auto;
  935. .drawerAddress-container-head{
  936. padding: 56px 40px;
  937. background: #FFFFFF;
  938. display: flex;
  939. align-items: center;
  940. justify-content: space-between;
  941. .drawerAddress-container-head-left{
  942. .drawerAddress-container-title{
  943. font-weight: 700;
  944. font-size: 21px;
  945. line-height: 28px;
  946. color: #181818;
  947. margin-bottom: 8px;
  948. }
  949. .drawerAddress-container-tip{
  950. font-weight: 700;
  951. font-size: 12px;
  952. line-height: 16px;
  953. color: #919191;
  954. }
  955. }
  956. .drawerAddress-container-head-right{
  957. display: flex;
  958. align-items: center;
  959. gap:48px;
  960. .cancellation{
  961. width: 118px;
  962. height: 52px;
  963. background: #E0E0E0;
  964. border-radius: 10px;
  965. gap: 4px;
  966. display: flex;
  967. align-items: center;
  968. justify-content: center;
  969. font-weight: 700;
  970. font-size: 15px;
  971. line-height: 20px;
  972. color: #828282;
  973. }
  974. .complete{
  975. width: 118px;
  976. height: 52px;
  977. border: 2px solid #4A76FF;
  978. border-radius: 10px;
  979. gap:4px;
  980. display: flex;
  981. align-items: center;
  982. justify-content: center;
  983. font-weight: 700;
  984. font-size: 15px;
  985. line-height: 20px;
  986. color: #2980FF;
  987. cursor: pointer;
  988. }
  989. }
  990. }
  991. .drawerAddress-container-main{
  992. padding: 36px 40px;
  993. background: #f9fbff;
  994. flex-grow: 1;
  995. display: flex;
  996. flex-direction: column;
  997. gap:20px;
  998. .title{
  999. font-weight: 700;
  1000. font-size: 17px;
  1001. line-height: 20px;
  1002. color: #222222;
  1003. margin-bottom: 16px;
  1004. }
  1005. .emailBox{
  1006. display: flex;
  1007. flex-direction: column;
  1008. .item{
  1009. display: flex;
  1010. flex-direction: column;
  1011. margin-bottom: 20px;
  1012. .title{
  1013. display: flex;
  1014. align-items: center;
  1015. justify-content: space-between;
  1016. .name{
  1017. font-weight: 400;
  1018. font-size: 12px;
  1019. line-height: 22px;
  1020. color: #181818;
  1021. }
  1022. .delete{
  1023. display: flex;
  1024. align-items: center;
  1025. gap:4px;
  1026. font-weight: 700;
  1027. font-size: 15px;
  1028. line-height: 20px;
  1029. color: #EB5757;
  1030. cursor: pointer;
  1031. }
  1032. }
  1033. .input{
  1034. display: flex;
  1035. align-items: center;
  1036. gap:24px;
  1037. }
  1038. }
  1039. .addAddress{
  1040. display: flex;
  1041. align-items: center;
  1042. gap:12px;
  1043. font-weight: 700;
  1044. font-size: 17px;
  1045. line-height: 22px;
  1046. color: #2980FF;
  1047. cursor: pointer;
  1048. }
  1049. }
  1050. }
  1051. }
  1052. }
  1053. </style>