index.vue 28 KB

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