index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. <template>
  2. <div class="container">
  3. <svg-icon name="wallet-bg" class="bg-img" />
  4. <div class="user-info-body">
  5. <div class="user-info-lf">
  6. <van-image
  7. width="28px"
  8. height="28px"
  9. round
  10. :src="walletStore.avatar"
  11. />
  12. <div class="user-info">
  13. <div class="user-info-name" @click="showWallet = true">
  14. <div>{{ walletStore.username }}</div>
  15. <svg-icon style="width: 16px; height: 16px;margin-left: 3px;" name="down" />
  16. </div>
  17. <div class="user-info-key-body">
  18. <span class="user-info-key-body-text">{{ formatAddress(walletStore.account) }}</span>
  19. <svg-icon style="width: 16px; height: 16px;" name="copy" />
  20. </div>
  21. </div>
  22. </div>
  23. <div class="network">
  24. <van-image width="20px" height="20px" round :src="walletStore.accountIcon"/>
  25. <div class="network-name">{{ walletStore.username }}</div>
  26. </div>
  27. </div>
  28. <div class="amount">
  29. <div class="amount-item-box">
  30. <div>Total assets</div>
  31. <div class="amount-item">
  32. <div class="item-text">
  33. <svg-icon class="my" style="width: 28px; height: 28px;" name="my" />
  34. <div>{{isShow?totalMoney:'****'}}</div>
  35. </div>
  36. <svg-icon style="width: 16px; height: 16px;" :name="isShow?'eyes':'seyes'" @click="isShow = !isShow"/>
  37. </div>
  38. </div>
  39. <svg-icon style="width: 24px; height: 24px; margin-right: 27px;" name="right" @click="goToPageDetail"/>
  40. </div>
  41. <div class="card-box">
  42. <div class="box-cont" @click="goToPage('exchange')">
  43. <svg-icon class="box-cont-icon" style="width: 30px; height: 30px;" name="1" />
  44. <div>元宝兑换</div>
  45. </div>
  46. <div class="box-cont" @click="goToPage('proceeds')">
  47. <svg-icon class="box-cont-icon" style="width: 30px; height: 30px;" name="2" />
  48. <div>收款</div>
  49. </div>
  50. <div class="box-cont" @click="goToPage('transferDetail')">
  51. <svg-icon class="box-cont-icon" style="width: 30px; height: 30px;" name="3" />
  52. <div>转账</div>
  53. </div>
  54. <div class="box-cont">
  55. <svg-icon class="box-cont-icon" style="width: 30px; height: 30px;" name="4" />
  56. <div>竞赛</div>
  57. </div>
  58. <div class="box-cont">
  59. <svg-icon class="box-cont-icon" style="width: 30px; height: 30px;" name="5" />
  60. <div>区块浏览器</div>
  61. </div>
  62. </div>
  63. <div class="list-box">
  64. <div class="list-title">
  65. <div>代币</div>
  66. <svg-icon style="width: 24px; height: 24px;" name="add" @click="changePop(1)"/>
  67. </div>
  68. <div class="list-ul">
  69. <template v-for="(item,i) in walletStore.tokenList" :key="i">
  70. <div class="list-li" v-if="item.name == 'ACC' || !item.show" @click="changePop(2,item)">
  71. <div class="list-li-lf">
  72. <van-image width="30px" height="30px" round :src="item.logo"/>
  73. <div style="margin-left: 8px;">{{item.name}}</div>
  74. </div>
  75. <div class="list-li-ri">
  76. <div>{{item.balance}}</div>
  77. <div class="list-li-ri-num">${{item.money}}</div>
  78. </div>
  79. </div>
  80. </template>
  81. </div>
  82. </div>
  83. <van-popup v-model:show="showWallet" position="bottom" round>
  84. <div class="pop-content">
  85. <div class="pop-title">
  86. <svg-icon style="width: 24px; height: 24px;" name="left-arrow" @click="showWallet = false"/>
  87. <div class="title">选择钱包</div>
  88. </div>
  89. <div class="tree">
  90. <div class="tree-lf">
  91. <div class="tree-lf-icon" v-for="(item,i) in networkList" :class="netWorkIndex == i?'active-bg':''" @click="changeNetwork(i)">
  92. <van-image lazy-load class="network-item-icon" :src="item.icon" />
  93. </div>
  94. </div>
  95. <div class="tree-ri">
  96. <div class="tree-ri-title">{{networkList[netWorkIndex]?.name}}</div>
  97. <div class="tree-ul">
  98. <div class="tree-li"
  99. v-for="(item,i) in currentWallets"
  100. :class="item.id == walletStore.id?'tree-active':''" @click="changeWallet(item)">
  101. <van-image
  102. width="37px"
  103. height="37px"
  104. round
  105. :src="item.avatar"
  106. />
  107. <div class="tree-li-cont">
  108. <div class="tree-li-text">{{ item.username }}</div>
  109. <div class="tree-li-address">
  110. <span>{{ formatAddress(item.account) }}</span>
  111. <svg-icon style="width: 16px; height: 16px;margin-left: 2px;" name="copy" />
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. <div class="pop-btn" @click="addWallet">
  119. <van-button class="btn" type="primary" size="large" color="#4765DD">
  120. <svg-icon style="width: 24px; height: 24px;margin-right: 4px;" name="add1" />添加钱包
  121. </van-button>
  122. </div>
  123. </div>
  124. </van-popup>
  125. <van-popup v-model:show="showHistory" position="bottom" round style="height:500px">
  126. <div class="pop-content" style="height:500px">
  127. <div class="pop-title">
  128. <svg-icon style="width: 24px; height: 24px;" name="left-arrow" @click="showHistory = false"/>
  129. <div class="title">{{ type == 1?'添加代币':'历史记录' }}</div>
  130. </div>
  131. <!-- 1 -->
  132. <div class="pop-ul" v-if="type == 1">
  133. <div class="pop-li" v-for="(item,i) in walletStore.tokenList">
  134. <div class="pop-li-lf" v-if="item.name != 'ACC'">
  135. <van-image
  136. width="32px"
  137. height="32px"
  138. round
  139. :src="item.logo"
  140. />
  141. <div style="margin-left: 6px;">
  142. <div>{{item.name}}</div>
  143. <div class="pop-address">{{ formatAddress(item.address) }}</div>
  144. </div>
  145. </div>
  146. <svg-icon v-if="item.name != 'ACC'" style="width: 20px; height: 20px;" :name="item.show?'add-icon':'del-icon'" @click="tokensHandle(item)"/>
  147. </div>
  148. </div>
  149. <!-- 2 -->
  150. <div class="pop-list" v-if="type == 2">
  151. <div class="pop-list-box" v-for="(item,i) in historyList">
  152. <svg-icon style="width: 24px; height: 24px;color: #fff;" :name="item.from?.hash == walletStore.account?'fs':'js'" />
  153. <div class="pop-list-ul">
  154. <div class="pop-list-li">
  155. <div class="pop-list-li-title">{{item.from?.hash == walletStore.account?'发送':'接收'}}</div>
  156. <div class="pop-list-li-status">成功</div>
  157. </div>
  158. <div class="pop-list-li">
  159. <div>转账金额</div>
  160. <div>{{item.value}}{{selectUrl.name}}</div>
  161. </div>
  162. <div class="pop-list-li">
  163. <div>{{item.from?.hash == walletStore.account?'发送':'接收'}}时间</div>
  164. <div>{{item.timestamp}}</div>
  165. </div>
  166. <div class="pop-list-li">
  167. <div>收款地址</div>
  168. <div>{{formatAddress(item.to?.hash)}}<svg-icon style="width: 16px; height: 16px;" name="copy" /></div>
  169. </div>
  170. <div class="pop-list-li">
  171. <div>hash</div>
  172. <div>{{formatAddress(item.hash)}}<svg-icon style="width: 16px; height: 16px;" name="copy" /></div>
  173. </div>
  174. <div class="pop-list-li" v-if="selectUrl.name == 'ACC'">
  175. <div>矿工费</div>
  176. <div>{{item.gas_price}}ACC</div>
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. </div>
  182. </van-popup>
  183. </div>
  184. </template>
  185. <script setup>
  186. import { useRouter } from 'vue-router'
  187. import { getNetwork } from '@/api/path/login.api'
  188. import { useWalletStore } from "@/stores/modules/walletStore";
  189. import { useSystemStore } from "@/stores/modules/systemStore";
  190. import { transactions, tokenTransfers } from "@/api/path/backend.api";
  191. const router = useRouter();
  192. const walletStore = useWalletStore();
  193. const systemStore = useSystemStore();
  194. const isShow = ref(true);
  195. const showWallet = ref(false);
  196. const showHistory = ref(false);
  197. const networkList = ref([]);
  198. const netWorkIndex = ref(0);
  199. const type = ref('');
  200. const historyList = ref([]);
  201. const selectUrl = ref({});
  202. const goToPage = (url) => {
  203. router.push(url)
  204. }
  205. // 跳转详情
  206. const goToPageDetail = () => {
  207. router.push({
  208. path: 'walletDetail',
  209. query:{
  210. id:walletStore.id
  211. }
  212. })
  213. }
  214. const changePop = (val,item) => {
  215. type.value = val;
  216. if(val == 2){
  217. getDetail(item);
  218. selectUrl.value = item;
  219. return;
  220. };
  221. showHistory.value = true;
  222. }
  223. // 查看历史记录
  224. const getDetail = (item) => {
  225. if(item.name == 'ACC'){
  226. getList();
  227. }else{
  228. getDBList(item.address);
  229. }
  230. showHistory.value = true;
  231. }
  232. const getList = async () => {
  233. const res = await transactions(walletStore.account)
  234. if (res.status === 200) {
  235. const items = res.data.items || []
  236. if (items.length > 0) {
  237. items.forEach(val => {
  238. val.timestamp = getDateTime(val.timestamp)
  239. val.gas_price = getPrice(val.fee.value).toFixed(9)
  240. if (val.value !== '0') {
  241. val.value = getPrice(val.value).toFixed(6)
  242. }
  243. })
  244. historyList.value = items
  245. }
  246. }
  247. }
  248. const getDBList = async (DBaddress) => {
  249. const res = await tokenTransfers(walletStore.account,{
  250. params: {
  251. type: 'ERC-20,ERC-721,ERC-1155',
  252. filter: 'to | from',
  253. token: DBaddress
  254. }
  255. })
  256. if (res.status === 200) {
  257. const items = res.data.items || []
  258. if (items.length > 0) {
  259. items.forEach(val => {
  260. val.timestamp = getDateTime(val.timestamp)
  261. val.value = getPrice(val.total.value).toFixed(6)
  262. val.hash = val.transaction_hash
  263. })
  264. historyList.value = items
  265. }
  266. }
  267. }
  268. // 计算总和
  269. const totalMoney = computed(() => {
  270. const list = walletStore.tokenList
  271. if (!Array.isArray(list) || list.length === 0) return 0
  272. let total = Number(list[0].money || 0)
  273. for (let i = 1; i < list.length; i++) {
  274. if (!list[i].show) {
  275. total += Number(list[i].money || 0)
  276. }
  277. }
  278. return Number(total.toFixed(4))
  279. })
  280. // 添加钱包
  281. const addWallet = () => {
  282. walletStore.accountName = networkList.value[netWorkIndex.value].name
  283. walletStore.accountIcon = networkList.value[netWorkIndex.value].icon
  284. walletStore.rpcUrl = networkList.value[netWorkIndex.value].url
  285. router.push({
  286. path: '/login',
  287. query:{
  288. isFirst:false
  289. }
  290. })
  291. }
  292. // 网络数据
  293. const initNetwork = async () => {
  294. const { data } = await getNetwork({})
  295. networkList.value = data
  296. }
  297. const currentChainName = computed(() => networkList.value[netWorkIndex.value]?.name)
  298. // 当前链对应的钱包数组
  299. const currentWallets = computed(() => {
  300. return walletStore.walletList.filter(w => w.accountName === currentChainName.value)
  301. })
  302. // 切换网络
  303. const changeNetwork = (i) => {
  304. netWorkIndex.value = i;
  305. }
  306. // 切换钱包
  307. const changeWallet = (item) => {
  308. walletStore.switchWallet(item.id,item.account);
  309. showWallet.value = false;
  310. }
  311. // 代币显示隐藏
  312. const tokensHandle = (item)=>{
  313. walletStore.changeToten(item.name)
  314. }
  315. // 更新代币信息
  316. const gethotTokens = async () => {
  317. await walletStore.updateTokenVal();
  318. }
  319. const formatAddress = (address) => {
  320. if (!address) return '';
  321. return address.slice(0, 8) + '...' + address.slice(-6);
  322. };
  323. const getPrice = (price)=>{
  324. const num = (parseFloat(price) / Math.pow(10, 18));
  325. return num
  326. }
  327. const getDateTime=(isoString)=>{
  328. const date = new Date(isoString);
  329. const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;
  330. return formattedDate;
  331. }
  332. onMounted(async ()=>{
  333. initNetwork();
  334. gethotTokens();
  335. })
  336. </script>
  337. <style lang="less" scoped>
  338. .container{
  339. position: relative;
  340. display: flex;
  341. flex-direction: column;
  342. height: calc(100vh - 50px);
  343. .bg-img{
  344. height: 18.8rem;
  345. min-width: 100%;
  346. width: 100vw;
  347. position: absolute;
  348. top: -0.8rem;
  349. left: 0;
  350. z-index: -1;
  351. }
  352. .user-info-body{
  353. padding: 60px 17px 25px;
  354. display: flex;
  355. align-items: center;
  356. justify-content: space-between;
  357. .user-info-lf{
  358. display: flex;
  359. align-items: center;
  360. .user-info{
  361. margin-left: 11px;
  362. font-family: PingFang SC, PingFang SC;
  363. font-size: 10px;
  364. .user-info-name{
  365. font-weight: 500;
  366. color: #FFFFFF;
  367. display: flex;
  368. align-items: center;
  369. }
  370. .user-info-key-body{
  371. font-weight: 400;
  372. color: rgba(255,255,255,0.6);
  373. display: flex;
  374. align-items: center;
  375. .user-info-key-body-text{
  376. margin-right: 4px;
  377. }
  378. }
  379. }
  380. }
  381. .network{
  382. display: flex;
  383. align-items: center;
  384. border-radius: 27px;
  385. border: 1px solid rgba(255,255,255,0.6);
  386. padding: 0 5px;
  387. font-family: PingFang SC, PingFang SC;
  388. font-weight: 400;
  389. font-size: 15px;
  390. color: #FFFFFF;
  391. height: 25px;
  392. line-height: 25px;
  393. box-sizing: border-box;
  394. .network-name{
  395. margin-left: 5px;
  396. }
  397. }
  398. }
  399. .amount{
  400. height: 102px;
  401. background-color: rgba(242, 242, 242, 0.2);
  402. backdrop-filter: blur(3px);
  403. -webkit-backdrop-filter: blur(3px);
  404. border-radius: 15px;
  405. margin: 0 17px 20px 17px;
  406. box-shadow:0 7px 10px #15277031;
  407. box-sizing: border-box;
  408. display: flex;
  409. align-items: center;
  410. justify-content: space-between;
  411. font-family: PingFang SC, PingFang SC;
  412. font-weight: 400;
  413. font-size: 15px;
  414. color: #FFFFFF;
  415. &:before {
  416. height: calc(100% - 4px);
  417. width: calc(100% - 4px);
  418. content: "";
  419. position: absolute;
  420. inset: 0;
  421. z-index: -1;
  422. padding: 2px; /* 边框宽度 */
  423. background: linear-gradient(135deg, rgba(255, 255, 255, 0.6) 0%, rgba(255, 255, 255, 0.2) 25%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.2) 75%, rgba(255, 255, 255, 0.6) 100%);//linear-gradient(135deg, #ffffff64, #ffffff2e); /* 渐变方向可调 */
  424. -webkit-mask:
  425. linear-gradient(#fff 0 0) content-box,
  426. linear-gradient(#fff 0 0);
  427. -webkit-mask-composite: xor;
  428. mask-composite: exclude;
  429. border-radius: 15px; /* 必须和父元素一致 */
  430. pointer-events: none; /* 避免遮挡点击 */
  431. }
  432. .amount-item-box{
  433. margin: 21px 21px 27px 27px;
  434. }
  435. .amount-item{
  436. margin-top: 7px;
  437. font-weight: 600;
  438. font-size: 25px;
  439. display: flex;
  440. position: relative;
  441. .item-text{
  442. display: flex;
  443. align-items: center;
  444. margin-right: 2px;
  445. .my{
  446. position: relative;
  447. top:1px;
  448. }
  449. }
  450. }
  451. }
  452. .card-box{
  453. background: #FFFFFF;
  454. box-shadow: 0px 4px 8px -2px rgba(25,75,137,0.25);
  455. border-radius: 17px;
  456. height: 78px;
  457. margin: 0 17px;
  458. padding: 15px 10px;
  459. box-sizing: border-box;
  460. display: flex;
  461. align-items: center;
  462. font-family: PingFang SC, PingFang SC;
  463. font-weight: 400;
  464. font-size: 12px;
  465. color: #000000;
  466. .box-cont{
  467. width: calc(100% / 5);
  468. display: flex;
  469. flex-direction: column;
  470. align-items: center;
  471. .box-cont-icon{
  472. margin-bottom: 4px;
  473. color: #fff;
  474. }
  475. }
  476. }
  477. .list-box{
  478. background: #FFFFFF;
  479. border-radius: 12px;
  480. margin: 25px 17px;
  481. padding: 16px;
  482. box-sizing: border-box;
  483. display: flex;
  484. flex-direction: column;
  485. flex: 1;
  486. overflow: hidden;
  487. .list-title{
  488. display: flex;
  489. justify-content: space-between;
  490. align-items: center;
  491. font-family: PingFang SC, PingFang SC;
  492. font-weight: 500;
  493. font-size: 17px;
  494. color: #000000;
  495. margin-bottom: 23px;
  496. }
  497. .list-ul{
  498. flex: 1;
  499. display: flex;
  500. flex-direction: column;
  501. overflow: auto;
  502. .list-li{
  503. display: flex;
  504. align-items: center;
  505. justify-content: space-between;
  506. font-family: PingFang SC, PingFang SC;
  507. font-weight: 500;
  508. margin-bottom: 12px;
  509. .list-li-lf{
  510. display: flex;
  511. align-items: center;
  512. font-size: 15px;
  513. color: #000000;
  514. }
  515. .list-li-ri{
  516. font-size: 12px;
  517. color: @font-color2;
  518. text-align: right;
  519. .list-li-ri-num{
  520. font-weight: 400;
  521. font-size: 10px;
  522. color: #8D8D8D;
  523. }
  524. }
  525. }
  526. .list-li:last-child{
  527. margin-bottom: 0;
  528. }
  529. }
  530. .list-ul::-webkit-scrollbar{
  531. width: 0;
  532. }
  533. }
  534. .pop-content{
  535. display: flex;
  536. flex-direction: column;
  537. .pop-title{
  538. padding: 17px;
  539. border-bottom: 1px solid #F2F2F2;
  540. display: flex;
  541. align-items: center;
  542. font-family: PingFang SC, PingFang SC;
  543. font-weight: 500;
  544. font-size: 17px;
  545. color: #000000;
  546. .title{
  547. flex: 1;
  548. display: flex;
  549. justify-content: center;
  550. }
  551. }
  552. .tree{
  553. display: flex;
  554. height: 300px;
  555. overflow: hidden;
  556. .tree-lf{
  557. display: flex;
  558. flex-direction: column;
  559. width: 67px;
  560. overflow: auto;
  561. .tree-lf-icon{
  562. height: 67px;
  563. padding: 16px;
  564. box-sizing: border-box;
  565. display: flex;
  566. align-items: center;
  567. justify-content: center;
  568. }
  569. .active-bg{
  570. background: #ECEFFC;
  571. }
  572. }
  573. .tree-lf::-webkit-scrollbar{
  574. width: 0;
  575. }
  576. .tree-ri{
  577. margin-left: 10px;
  578. margin-right: 17px;
  579. flex: 1;
  580. overflow: auto;
  581. .tree-ri-title{
  582. margin: 10px 0 4px;
  583. font-family: PingFang SC, PingFang SC;
  584. font-weight: 500;
  585. font-size: 15px;
  586. color: #000000;
  587. }
  588. .tree-ul{
  589. .tree-li{
  590. background: #F2F2F2;
  591. border-radius: 8px;
  592. border: 1px solid #F2F2F2;
  593. padding: 14px 16px;
  594. display: flex;
  595. align-items: center;
  596. margin-bottom: 12px;
  597. .tree-li-cont{
  598. margin-left: 12px;
  599. font-family: PingFang SC, PingFang SC;
  600. font-weight: 400;
  601. font-size: 12px;
  602. color: #8D8D8D;
  603. .tree-li-text{
  604. font-weight: 500;
  605. font-size: 15px;
  606. color: @theme-color1;
  607. }
  608. .tree-li-address{
  609. display: flex;
  610. align-items: center;
  611. }
  612. }
  613. }
  614. .tree-active{
  615. background: #FAFBFF;
  616. border: 1px solid @theme-color1;
  617. }
  618. }
  619. }
  620. .tree-ri::-webkit-scrollbar{
  621. width: 0;
  622. }
  623. }
  624. .pop-btn{
  625. margin: 17px;
  626. .btn{
  627. height: 40px;
  628. border-radius: 50px;
  629. font-family: PingFang SC, PingFang SC;
  630. font-weight: 500;
  631. font-size: 15px;
  632. color: #FFFFFF;
  633. }
  634. :deep(.van-button__text) {
  635. display: flex;
  636. align-items: center;
  637. }
  638. }
  639. .pop-list{
  640. flex: 1;
  641. display: flex;
  642. flex-direction: column;
  643. overflow: auto;
  644. .pop-list-box{
  645. display: flex;
  646. padding: 17px 17px 0;
  647. .pop-list-ul{
  648. padding-bottom: 12px;
  649. flex: 1;
  650. margin-left: 8px;
  651. border-bottom: 1px solid #F2F2F2;
  652. box-sizing: border-box;
  653. .pop-list-li{
  654. display: flex;
  655. align-items: center;
  656. justify-content: space-between;
  657. font-family: PingFang SC, PingFang SC;
  658. margin-bottom: 4px;
  659. font-weight: 400;
  660. font-size: 12px;
  661. color: @font-color2;
  662. .pop-list-li-title{
  663. font-weight: 500;
  664. font-size: 15px;
  665. color: #000000;
  666. }
  667. .pop-list-li-status{
  668. font-weight: 500;
  669. font-size: 15px;
  670. color: @theme-color1 !important;
  671. }
  672. }
  673. .pop-list-li div:last-child{
  674. color: #8D8D8D;
  675. }
  676. }
  677. }
  678. }
  679. .pop-list::-webkit-scrollbar{
  680. width: 0;
  681. }
  682. .pop-ul{
  683. flex: 1;
  684. display: flex;
  685. flex-direction: column;
  686. overflow: auto;
  687. margin: 16px 16px 0;
  688. .pop-li{
  689. display: flex;
  690. align-items: center;
  691. justify-content: space-between;
  692. margin-bottom: 16px;
  693. .pop-li-lf{
  694. display: flex;
  695. align-items: center;
  696. font-family: PingFang SC, PingFang SC;
  697. font-weight: 400;
  698. font-size: 15px;
  699. color: #4F4F4F;
  700. .pop-address{
  701. font-size: 12px;
  702. color: #8D8D8D;
  703. }
  704. }
  705. }
  706. }
  707. }
  708. }
  709. </style>