HomeView.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. <script setup lang="ts">
  2. //@ts-ignore
  3. import MetaMaskSDK from '../utils/metamask-sdk.js'
  4. //@ts-ignore
  5. import getZksEra from '../utils/getZksEra.js'
  6. //@ts-ignore
  7. import getZksLite from '../utils/getZksLite.js'
  8. //@ts-ignore
  9. import getZkSyncBridge from '../utils/getZkSyncBridge.js'
  10. import * as echarts from 'echarts';
  11. import {onMounted, ref} from 'vue';
  12. import balancerBg from '../project/balancer/balancerBg.png'
  13. import balancerAv from '../project/balancer/balancerAv.png'
  14. import argentBg from '../project/argent/argentBg.png'
  15. import argentAv from '../project/argent/argentAv.png'
  16. import ontoBg from '../project/onto/ontoBg.png'
  17. import ontoAv from '../project/onto/ontoAv.png'
  18. import zerionBg from '../project/zerion/zerionBg.png'
  19. import zerionAv from '../project/zerion/zerionAv.png'
  20. import zksEraBridgeAv from '../project/zksEraBridge/zksEraBridgeAv.png'
  21. import zksEraBridgeBg from '../project/zksEraBridge/zksEraBridgeBg.png'
  22. import zksLiteBridgeBg from '../project/zksLiteBridge/zksLiteBridgeBg.png'
  23. import zksLiteBridgeAv from '../project/zksLiteBridge/zksLiteBridgeAv.png'
  24. import orbiterAv from '../project/orbiter/orbiterAv.png'
  25. import orbiterBg from '../project/orbiter/orbiterBg.png'
  26. import muteAv from '../project/mute/muteAv.png'
  27. import muteBg from '../project/mute/muteBg.png'
  28. import syncswapBg from '../project/syncswap/syncswapBg.png'
  29. import syncswapAv from '../project/syncswap/syncswapAv.png'
  30. import getcoinBg from '../project/getcoin/getcoinBg.png'
  31. import getcoinAv from '../project/getcoin/getcoinAv.png'
  32. import dmailAv from '../project/dmail/dmailAv.png'
  33. import dmailBg from '../project/dmail/dmailBg.png'
  34. import tiktokFiAv from '../project/tiktokFi/tiktokFiAv.png'
  35. import tiktokFiBg from '../project/tiktokFi/tiktokFiBg.png'
  36. import karatDAOAv from '../project/karatDAO/karatDAOAv.png'
  37. import karatDAOBg from '../project/karatDAO/karatDAOBg.png'
  38. //@ts-ignore
  39. import {getAllZksSyncData} from "@/utils/getZksyncData/index.js";
  40. type EChartsOption = echarts.EChartsOption;
  41. onMounted(() => {
  42. checkWalletAddress()
  43. listeningDisconnect()
  44. })
  45. type dataArrType = {
  46. name: string,
  47. type: string[],
  48. BG: string,
  49. avatar: string,
  50. url:string
  51. }[]
  52. let dataArr: dataArrType = [
  53. {
  54. name: 'zks-era bridge',
  55. type: ['OFFICAL','BRIDGE'],
  56. BG: zksEraBridgeBg,
  57. avatar: zksEraBridgeAv,
  58. url:'https://bridge.zksync.io/'
  59. },
  60. {
  61. name:'TiktokFi',
  62. type: ['NFT'],
  63. BG:tiktokFiBg,
  64. avatar:tiktokFiAv,
  65. url:'https://zksync.tiktokfi.xyz/'
  66. },
  67. {
  68. name: 'zks-lite bridge',
  69. type: ['OFFICAL','BRIDGE'],
  70. BG: zksLiteBridgeBg,
  71. avatar: zksLiteBridgeAv,
  72. url:'https://lite.zksync.io/transaction/deposit'
  73. },
  74. {
  75. name: 'Orbiter',
  76. type: ['ERA', 'SWAP'],
  77. BG: orbiterBg,
  78. avatar: orbiterAv,
  79. url:'https://www.orbiter.finance/'
  80. },
  81. {
  82. name: 'Mute',
  83. type: ['ERA', 'DEFI', 'SWAP'],
  84. BG: muteBg,
  85. avatar: muteAv,
  86. url:'https://app.mute.io/swap'
  87. },
  88. {
  89. name: 'Syncswap',
  90. type: ['ERA', 'SWAP'],
  91. BG: syncswapBg,
  92. avatar: syncswapAv,
  93. url:'https://syncswap.xyz/'
  94. },
  95. {
  96. name:'Dmail',
  97. type: ['Dapp'],
  98. BG:dmailBg,
  99. avatar:dmailAv,
  100. url:'https://mail.dmail.ai/login?icode=393233'
  101. },
  102. {
  103. name: 'Gitcoin',
  104. type: ['DEFI', 'SWAP'],
  105. BG: getcoinBg,
  106. avatar: getcoinAv,
  107. url:'https://bounties.gitcoin.co/'
  108. },
  109. {
  110. name: 'KaratDAO',
  111. type: ['DAO', 'NFT'],
  112. BG: karatDAOBg,
  113. avatar: karatDAOAv,
  114. url:'https://karatdao.com/mint/claimer?lieutenantAddress=0x0870682e56A9069E7655afD728D91f3653Bff0bE&validatorId=117'
  115. },
  116. ]
  117. let MM = ref()//MetaMaskSDK
  118. let address = ref('')//钱包地址
  119. let chainId = '0x144'
  120. const MMSDK = new MetaMaskSDK()
  121. MM.value = MMSDK.getProvider()
  122. //监听连接断开(通过监听账号的变化判断是否断开连接)
  123. const listeningDisconnect = () => {
  124. MM.value.on('accountsChanged', (accounts: string[]) => {
  125. if (accounts.length >= 1) {
  126. address.value = accounts[0]
  127. connectWallet()
  128. } else {
  129. address.value = ''
  130. }
  131. })
  132. }
  133. //查询钱包地址
  134. const checkWalletAddress = async () => {
  135. let accounts: string[] = await MM.value.request({method: 'eth_accounts'});//不弹窗
  136. address.value = accounts[0]
  137. getMainTx()
  138. getLiteTx()
  139. getMoreInfo()
  140. await addChain()
  141. await switchEthereumChain()
  142. }
  143. //添加链
  144. const addChain = () => {
  145. MM.value.request({
  146. method: 'wallet_addEthereumChain',
  147. params: [{
  148. chainId: chainId,
  149. chainName: 'zkSync Era Mainnet',
  150. rpcUrls: ['https://mainnet.era.zksync.io'],
  151. blockExplorerUrls: ['https://explorer.zksync.io'],
  152. nativeCurrency: {
  153. name: 'ETH',
  154. symbol: 'ETH',
  155. decimals: 18,
  156. },
  157. }]
  158. })
  159. }
  160. //切换链
  161. const switchEthereumChain = () => {
  162. MM.value.request({
  163. method: 'wallet_switchEthereumChain',
  164. params: [{chainId: chainId}],
  165. }).then(() => {
  166. }).catch(() => {
  167. });
  168. }
  169. //连接钱包按钮
  170. const connectWallet = async () => {
  171. let accounts: string[] = await MM.value.request({method: 'eth_requestAccounts'});
  172. address.value = accounts[0]
  173. getMainTx()
  174. getLiteTx()
  175. getMoreInfo()
  176. await addChain()
  177. await switchEthereumChain()
  178. }
  179. //获取主网交易次数
  180. let mainTx = ref('-')
  181. const getMainTx = () => {
  182. getZksEra(address.value).then(({tx2}:{tx2:number}) => {
  183. mainTx.value = tx2.toString()
  184. })
  185. }
  186. //获取lite网交易次数
  187. let liteTx = ref('-')
  188. const getLiteTx = () => {
  189. getZksLite(address.value).then(({tx1}:{tx1:number}) => {
  190. liteTx.value = tx1.toString()
  191. })
  192. }
  193. //获取更多信息
  194. let amount = ref('-')
  195. let fee = ref('-')
  196. let contract = ref('-')
  197. let tradingTimeArr = ref()
  198. let l1Tol2Tx = ref('-')
  199. let l2Tol1Tx = ref('-')
  200. const getMoreInfo = () => {
  201. // getZkSyncBridge('0x555b07470647Cd159FF6595771054Aee7343e853').then((
  202. // {
  203. // totalExchangeAmount,
  204. // contractActivity,
  205. // overTimeArr,
  206. // l1Tol2Times,
  207. // l2Tol1Times
  208. // }:{
  209. // totalExchangeAmount:number
  210. // contractActivity:number
  211. // overTimeArr:any
  212. // l1Tol2Times:number
  213. // l2Tol1Times:number
  214. // }) => {
  215. // amount.value = totalExchangeAmount
  216. // contract.value = contractActivity
  217. // tradingTimeArr.value = overTimeArr
  218. // l1Tol2Tx.value = l1Tol2Times
  219. // l2Tol1Tx.value = l2Tol1Times
  220. // processTime()
  221. // })
  222. getAllZksSyncData(address.value).then((res:any)=>{
  223. amount.value = res.totalExchangeAmount
  224. fee.value = res.totalFee
  225. contract.value = res.contractActivity
  226. tradingTimeArr.value = res.overTimeArr
  227. l1Tol2Tx.value = res.l1Tol2Times
  228. l2Tol1Tx.value = res.l2Tol1Times
  229. processTime()
  230. })
  231. }
  232. //处理时间数据
  233. const monthArr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
  234. let showMonthNumberArr = ref([0,0,0,0,0,0,0,0,0,0,0,0])
  235. let showMonthArr = ref()
  236. const processTime = () => {
  237. let nowDate = new Date().toString()
  238. let nowDateArr = nowDate.split(' ')
  239. let nowMonth = nowDateArr[1]
  240. showMonthArr.value = []
  241. showMonthArr.value.push(nowMonth)
  242. let nowMonthIndex = monthArr.indexOf(nowMonth)
  243. const forLoop = () => {
  244. for (let i = 11; i !== nowMonthIndex ; i--) {
  245. showMonthArr.value.unshift(monthArr[i])
  246. }
  247. }
  248. for (let i = nowMonthIndex; i !== 0 ; i--) {
  249. showMonthArr.value.unshift(monthArr[i-1])
  250. if (i === 1) {
  251. forLoop()
  252. }
  253. }
  254. if (tradingTimeArr.value){
  255. tradingTimeArr.value.forEach((item:any) => {
  256. // if(item.balanceChanges[0].from && item.balanceChanges[0].from.toLowerCase() === address.value.toLowerCase()){
  257. let receivedAt = new Date(Date.parse(item.receivedAt)).toString();
  258. let strArr = receivedAt.split(' ')
  259. let month = strArr[1]
  260. let index = showMonthArr.value.indexOf(month)
  261. showMonthNumberArr.value[index]++
  262. // }
  263. })
  264. }
  265. initEcharts()
  266. }
  267. //初始化echarts
  268. const initEcharts = () => {
  269. let chartDom = document.getElementById('echartsBox')!
  270. let myChart = echarts.init(chartDom);
  271. let option: EChartsOption;
  272. option = {
  273. tooltip: {
  274. trigger: 'axis',
  275. axisPointer: {
  276. type: 'shadow'
  277. }
  278. },
  279. xAxis: {
  280. type: 'category',
  281. axisTick: {
  282. alignWithLabel: true
  283. },
  284. data: showMonthArr.value
  285. },
  286. yAxis: {
  287. type: 'value',
  288. },
  289. series: [
  290. {
  291. color: '#000000',
  292. data: showMonthNumberArr.value,
  293. type: 'bar'
  294. }
  295. ]
  296. };
  297. option && myChart.setOption(option);
  298. }
  299. //跳转网页
  300. const toLink = (url:string) => {
  301. window.open(url)
  302. }
  303. const toEmail = (email:string) => {
  304. const emailAddress = email; // 替换为你想发送邮件的收件人地址
  305. const subject = 'Hello'; // 替换为你想在邮件中设置的主题
  306. const body = 'This is the email body.'; // 替换为你想在邮件中设置的内容
  307. const mailtoUrl = `mailto:${emailAddress}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
  308. window.open(mailtoUrl);
  309. }
  310. let sun = ref(true)
  311. const sunAndMoon = () => {
  312. if (sun.value){
  313. document.documentElement.style.setProperty('--color-background','#181818')
  314. document.documentElement.style.setProperty('--color-text','#f2f2f2')
  315. }else {
  316. document.documentElement.style.setProperty('--color-background','#f2f2f2')
  317. document.documentElement.style.setProperty('--color-text','#181818')
  318. }
  319. sun.value = !sun.value
  320. }
  321. </script>
  322. <template>
  323. <main class="main">
  324. <div class="mainBG">
  325. <img src="../assets/BG.png" alt="BG">
  326. </div>
  327. <div class="topBar">
  328. <div class="left">
  329. <img v-show="!sun" src="../assets/bitflower-white.svg" alt="bitflower">
  330. <img v-show="sun" src="../assets/bitflower.svg" alt="logo">
  331. </div>
  332. <div class="mid">
  333. Blossom your Web3 Trip ✈
  334. </div>
  335. <div class="right">
  336. <img v-show="!sun" @click="sunAndMoon" src="../assets/sun-fill.svg" alt="sun-fill">
  337. <img v-show="sun" @click="sunAndMoon" src="../assets/moon-clear-fill.svg" alt="moon-clear-fill">
  338. <div class="button" v-show="!address" @click="connectWallet">
  339. <img src="../assets/git-commit-line.svg" alt="commit">
  340. Connect Wallet
  341. </div>
  342. <div class="connect" v-if="address">
  343. <img src="../assets/git-commit-line-black.svg" alt="commit">
  344. {{ address.slice(0, 8) }}...{{ address.slice(-4) }}
  345. </div>
  346. </div>
  347. </div>
  348. <div class="dataColumn">
  349. <div class="item">
  350. <div class="top">
  351. <div class="img">
  352. <img v-show="!sun" src="../assets/group1-white.svg" alt="group1">
  353. <img v-show="sun" src="../assets/group1.svg" alt="group1">
  354. </div>
  355. <div class="title">
  356. Protocols lnteraction
  357. <el-popover
  358. placement="bottom"
  359. :width="230"
  360. trigger="hover"
  361. effect="dark"
  362. >
  363. <template #reference>
  364. <img src="../assets/info.svg" alt="info">
  365. </template>
  366. <div class="popoverText">
  367. Number of protocolsinteracted
  368. </div>
  369. <div class="popoverText">
  370. with out of allavailable protocols
  371. </div>
  372. </el-popover>
  373. </div>
  374. </div>
  375. <div class="number">
  376. {{ contract }}
  377. </div>
  378. </div>
  379. <div class="item">
  380. <div class="top">
  381. <div class="img">
  382. <img v-show="!sun" class="img" src="../assets/group3-white.svg" alt="group2">
  383. <img v-show="sun" class="img" src="../assets/group3.svg" alt="group2">
  384. </div>
  385. <div class="title">
  386. Total Transactions
  387. <el-popover
  388. placement="bottom"
  389. :width="250"
  390. trigger="hover"
  391. effect="dark"
  392. >
  393. <template #reference>
  394. <img src="../assets/info.svg" alt="info">
  395. </template>
  396. <div class="popoverText">
  397. Total zkSync lite
  398. </div>
  399. <div class="popoverText">
  400. transactions issuedfrom the account
  401. </div>
  402. </el-popover>
  403. </div>
  404. </div>
  405. <div class="number">
  406. {{ liteTx }}
  407. <img @click="toLink('https://zkscan.io/')" style="cursor: pointer" src="../assets/arrow-right-up-line.svg" alt="arrow">
  408. </div>
  409. </div>
  410. <div class="item">
  411. <div class="top">
  412. <div class="img">
  413. <img v-show="!sun" class="img" src="../assets/group2-white.svg" alt="group2">
  414. <img v-show="sun" class="img" src="../assets/group2.svg" alt="group2">
  415. </div>
  416. <div class="title">
  417. Total Transactions
  418. <el-popover
  419. placement="bottom"
  420. :width="250"
  421. trigger="hover"
  422. effect="dark"
  423. >
  424. <template #reference>
  425. <img src="../assets/info.svg" alt="info">
  426. </template>
  427. <div class="popoverText">
  428. Total zkSync era
  429. </div>
  430. <div class="popoverText">
  431. transactions issuedfrom the account
  432. </div>
  433. </el-popover>
  434. </div>
  435. </div>
  436. <div class="number">
  437. {{ mainTx }}
  438. <img @click="toLink('https://explorer.zksync.io/')" style="cursor: pointer" src="../assets/arrow-right-up-line.svg" alt="arrow">
  439. </div>
  440. </div>
  441. <div class="item" style="height: 94px">
  442. <div class="top">
  443. <div class="img">
  444. <img v-show="!sun" class="img" src="../assets/official-bridge-white.svg" alt="group2">
  445. <img v-show="sun" class="img" src="../assets/official-bridge-black.svg" alt="group2">
  446. </div>
  447. <div style="display: flex;gap:40px">
  448. <div style="display: flex;flex-direction: column;gap:20px">
  449. <img v-show="!sun" src="../assets/L1-To-L2-white.svg" alt="To">
  450. <img v-show="sun" src="../assets/L1-To-L2.svg" alt="To">
  451. <div class="number">
  452. {{ l1Tol2Tx }}
  453. </div>
  454. </div>
  455. <div style="display: flex;flex-direction: column;gap:20px">
  456. <img v-show="!sun" src="../assets/L2-To-L1-white.svg" alt="To">
  457. <img v-show="sun" src="../assets/L2-To-L1.svg" alt="To">
  458. <div class="number">
  459. {{ l2Tol1Tx }}
  460. </div>
  461. </div>
  462. </div>
  463. </div>
  464. </div>
  465. <div class="item">
  466. <div class="top">
  467. <div class="img">
  468. <img class="img" src="../assets/group4.svg" alt="group2">USDT
  469. </div>
  470. <div class="title">
  471. <span style="width: 150px">Amount</span>
  472. <span>Fee</span>
  473. </div>
  474. </div>
  475. <div class="number">
  476. <span class="number" style="width: 150px">
  477. {{ amount }}
  478. </span>
  479. <span class="number">
  480. {{fee}}
  481. </span>
  482. </div>
  483. </div>
  484. </div>
  485. <div class="primary">
  486. <div class="left">
  487. <div class="echarts">
  488. <div class="title">
  489. Transactions Over Time
  490. <el-popover
  491. placement="right"
  492. :width="240"
  493. trigger="hover"
  494. effect="dark"
  495. >
  496. <template #reference>
  497. <img src="../assets/info.svg" alt="info">
  498. </template>
  499. <div class="popoverText">
  500. Number of transactions permonth
  501. </div>
  502. </el-popover>
  503. </div>
  504. <div class="echartsBox" id="echartsBox">
  505. </div>
  506. </div>
  507. <div class="disclaimer">
  508. <img v-show="!sun" src="../assets/disclaimer-white.svg" alt="disclaimer">
  509. <img v-show="sun" src="../assets/disclaimer.svg" alt="disclaimer">
  510. <div class="description">
  511. The list of dApps is for informational purposes only. It is not a testimony of the security or reliability
  512. of any dApp. Furthermore, most dApps are currently in alpha stage and their code is not audited. You are
  513. encouraged to do your own research (DYOR) before interacting with, or investing in any dApps. This should
  514. not be considered financial or investment advice.
  515. </div>
  516. <div class="contact">
  517. <div class="item" @click="toEmail('bitflower.web3@gmail.com')">
  518. <img src="../assets/mail-open-line.svg" alt="mail">
  519. E-mail
  520. </div>
  521. <div class="line"/>
  522. <div class="item" @click="toLink('https://t.me/bitflowersupport')">
  523. <img src="../assets/telegram-line.svg" alt="telegram">
  524. Telegram
  525. </div>
  526. </div>
  527. </div>
  528. </div>
  529. <div class="right">
  530. <div class="item" @click="toLink(item.url)" v-for="item in dataArr">
  531. <div class="BG">
  532. <img class="BG" :src="item.BG" alt="BG">
  533. </div>
  534. <div class="infoBox">
  535. <div class="avatar">
  536. <img class="avatar" :src="item.avatar" alt="avatar">
  537. </div>
  538. <div class="nameAndType">
  539. <div class="name">
  540. {{ item.name }}
  541. </div>
  542. <div class="typeBox">
  543. <div class="type" v-for="item1 in item.type">
  544. {{ item1 }}
  545. </div>
  546. </div>
  547. </div>
  548. </div>
  549. </div>
  550. </div>
  551. </div>
  552. </main>
  553. </template>
  554. <style lang="scss">
  555. .main {
  556. width: 1440px;
  557. height: 100vh;
  558. margin: auto;
  559. border: 1px solid #f7f7f7;
  560. border-top: none;
  561. border-bottom: none;
  562. padding: 30px 60px;
  563. .mainBG{
  564. position: absolute;
  565. top: 0;
  566. z-index: -1;
  567. }
  568. .topBar {
  569. display: flex;
  570. align-items: center;
  571. justify-content: space-between;
  572. .mid{
  573. font-weight: 400;
  574. font-size: 15px;
  575. line-height: 21px;
  576. font-family: 'Chillax';
  577. text-transform: uppercase;
  578. }
  579. .right {
  580. display: flex;
  581. align-items: center;
  582. gap:40px;
  583. cursor: pointer;
  584. .button {
  585. width: fit-content;
  586. height: 44px;
  587. display: flex;
  588. align-items: center;
  589. gap: 6px;
  590. background: #010101;
  591. padding: 0 24px;
  592. font-weight: 500;
  593. font-size: 15px;
  594. line-height: 20px;
  595. color: #FFFFFF;
  596. cursor: pointer;
  597. }
  598. .connect {
  599. width: fit-content;
  600. height: 44px;
  601. display: flex;
  602. align-items: center;
  603. gap: 6px;
  604. background: #FFFFFF;
  605. border: 1px solid #010101;
  606. border-radius: 30px;
  607. padding: 0 24px;
  608. font-weight: 500;
  609. font-size: 15px;
  610. line-height: 20px;
  611. color: #010101;
  612. }
  613. }
  614. }
  615. .dataColumn {
  616. display: flex;
  617. align-items: center;
  618. justify-content: space-between;
  619. padding: 75px 60px 60px 60px;
  620. border-bottom: 1px solid #f7f7f7;
  621. margin: 0 -60px;
  622. .item {
  623. width: 330px;
  624. display: flex;
  625. flex-direction: column;
  626. gap: 20px;
  627. .top {
  628. display: flex;
  629. flex-direction: column;
  630. gap: 6px;
  631. .img {
  632. height: 16px;
  633. display: flex;
  634. align-items: center;
  635. font-weight: 700;
  636. gap:4px
  637. }
  638. .title {
  639. display: flex;
  640. align-items: center;
  641. gap: 8px;
  642. font-weight: 400;
  643. font-size: 14px;
  644. line-height: 18px;
  645. //color: #010101;
  646. font-family: 'HONOR Sans CN';
  647. .popoverText{
  648. font-weight: 400;
  649. font-size: 12px;
  650. line-height: 24px;
  651. }
  652. }
  653. }
  654. .number {
  655. display: flex;
  656. align-items: center;
  657. gap: 8px;
  658. font-weight: 700;
  659. font-size: 26px;
  660. line-height: 34px;
  661. //color: #010101;
  662. }
  663. }
  664. }
  665. .primary {
  666. display: flex;
  667. gap: 60px;
  668. margin-top: 60px;
  669. .left {
  670. display: flex;
  671. flex-direction: column;
  672. .echarts {
  673. .title {
  674. display: flex;
  675. align-items: center;
  676. gap: 8px;
  677. font-weight: 700;
  678. font-size: 14px;
  679. line-height: 18px;
  680. //color: #010101;
  681. }
  682. .echartsBox {
  683. height: 360px;
  684. width: 560px;
  685. }
  686. }
  687. .disclaimer {
  688. width: 558px;
  689. height: 246px;
  690. border: 1px solid #010101;
  691. padding: 24px;
  692. .description {
  693. margin-top: 8px;
  694. margin-bottom: 28px;
  695. font-weight: 400;
  696. font-size: 12px;
  697. line-height: 24px;
  698. color: #808080;
  699. }
  700. .contact {
  701. width: fit-content;
  702. height: 44px;
  703. display: flex;
  704. align-items: center;
  705. gap: 24px;
  706. font-weight: 500;
  707. font-size: 14px;
  708. line-height: 18px;
  709. color: #FFFFFF;
  710. background: #010101;
  711. padding: 0 24px;
  712. .item{
  713. display: flex;
  714. align-items: center;
  715. gap:6px;
  716. cursor: pointer;
  717. }
  718. .line{
  719. width: 1px;
  720. height: 16px;
  721. border-right: 1px solid #4C4C4C;
  722. }
  723. }
  724. }
  725. }
  726. .right {
  727. display: flex;
  728. flex-wrap: wrap;
  729. overflow: auto;
  730. gap: 26px;
  731. width: 100%;
  732. height: 62vh;
  733. margin-right: -60px;
  734. .item {
  735. height: 256px;
  736. width: 336px;
  737. cursor: pointer;
  738. .BG {
  739. width: 100%;
  740. height: 175px;
  741. }
  742. .infoBox {
  743. display: flex;
  744. align-items: center;
  745. gap: 12px;
  746. padding: 0 24px;
  747. height: 80px;
  748. border: 1px solid #010101;
  749. border-top: none;
  750. background: #FFFFFF;
  751. .avatar {
  752. width: 40px;
  753. height: 40px;
  754. border-radius: 50%;
  755. }
  756. .nameAndType {
  757. display: flex;
  758. flex-direction: column;
  759. gap: 2px;
  760. .name {
  761. font-weight: 700;
  762. font-size: 17px;
  763. line-height: 22px;
  764. color: #010101;
  765. }
  766. .typeBox {
  767. display: flex;
  768. align-items: center;
  769. gap: 10px;
  770. .type {
  771. width: fit-content;
  772. border: 1px solid #b3b3b3;
  773. font-weight: 400;
  774. font-size: 12px;
  775. line-height: 16px;
  776. color: #b3b3b3;
  777. padding: 0 4px;
  778. }
  779. }
  780. }
  781. }
  782. }
  783. }
  784. }
  785. }
  786. ::-webkit-scrollbar {
  787. width: 4px; /* 滚动条宽度 */
  788. }
  789. // /* 滚动条轨道 */
  790. // ::-webkit-scrollbar-track {
  791. // background: #f1f1f1; /* 轨道背景色 */
  792. // }
  793. /* 滚动条滑块 */
  794. ::-webkit-scrollbar-thumb {
  795. background: #888; /* 滑块背景色 */
  796. }
  797. /* 滚动条滑块悬停状态 */
  798. ::-webkit-scrollbar-thumb:hover {
  799. background: #555; /* 悬停状态下滑块背景色 */
  800. }
  801. </style>