index.vue 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553
  1. <template>
  2. <div class="app-container">
  3. <div class="app-container-head">
  4. <div class="app-container-head-left">
  5. <div class="app-container-head-left-item">
  6. <div class="app-container-head-left-item-count">
  7. {{ (count.batchCount + count.premiumCount) || 0 }}
  8. </div>
  9. <div class="app-container-head-left-item-name">
  10. 所有
  11. </div>
  12. </div>
  13. <div class="app-container-head-left-divider"/>
  14. <div class="app-container-head-left-item">
  15. <div class="app-container-head-left-item-count">
  16. {{ count.batchCount }}
  17. </div>
  18. <div class="app-container-head-left-item-name">
  19. 批处理账户
  20. </div>
  21. </div>
  22. <div class="app-container-head-left-divider"/>
  23. <div class="app-container-head-left-item">
  24. <div class="app-container-head-left-item-count">
  25. {{ count.premiumCount }}
  26. </div>
  27. <div class="app-container-head-left-item-name">
  28. 精品账户
  29. </div>
  30. </div>
  31. </div>
  32. <div class="app-container-head-right">
  33. <div class="app-container-head-right-button1" @click="exportAddress">
  34. 导出地址
  35. </div>
  36. <div class="app-container-head-right-button1" @click="downloadAddress()">
  37. 下载 KeyStore
  38. </div>
  39. <div class="app-container-head-right-button1" @click="drawerImport = true">
  40. <img src="../../assets/address/upload.svg" alt="upload">
  41. 导入
  42. </div>
  43. <div class="app-container-head-right-button2" @click="drawerAddress = true">
  44. <img src="../../assets/address/eyeglasses.svg" alt="eyeglasses">
  45. 观察地址
  46. </div>
  47. </div>
  48. </div>
  49. <div class="app-container-table">
  50. <div class="app-container-table-title">
  51. <div class="app-container-table-title-left">
  52. 地址列表
  53. </div>
  54. </div>
  55. <div class="app-container-table-select">
  56. <el-scrollbar>
  57. <div class="scrollbar-flex-content">
  58. <div @click="selectAddressGroup(index)" v-for="(item,index) in table.walletNameGroup" :class="index === table.walletNameGroupIndex ? 'app-container-table-select-item-active' : 'app-container-table-select-item'">
  59. {{item}}
  60. </div>
  61. </div>
  62. </el-scrollbar>
  63. </div>
  64. <div class="app-container-table-screening">
  65. <div class="app-container-table-screening-item">
  66. 时间
  67. <img src="../../assets/address/unfold_more.svg" alt="unfold_more">
  68. </div>
  69. <div class="app-container-table-screening-item">
  70. Gas消耗
  71. <img src="../../assets/address/unfold_more.svg" alt="unfold_more">
  72. </div>
  73. </div>
  74. <div class="app-container-table-main">
  75. <el-table
  76. :data="tableData"
  77. style="width: 100%">
  78. <el-table-column
  79. label="账户地址"
  80. width="600">
  81. <template v-slot="scope">
  82. <div class="accountAddress">
  83. <div class="img">
  84. </div>
  85. <div class="walletName" v-if="scope.row.addressType === 0">
  86. {{scope.row.groupName}}
  87. </div>
  88. <div class="walletName" v-if="scope.row.addressType === 1">
  89. {{scope.row.groupName}}-{{(scope.$index+1) + (table.page-1)*5}}
  90. </div>
  91. <div class="walletAddress">
  92. {{scope.row.address}}
  93. </div>
  94. </div>
  95. </template>
  96. </el-table-column>
  97. <el-table-column
  98. label="Gas消耗/USDT"
  99. width="250">
  100. <template v-slot="scope">
  101. <div class="gas">
  102. {{scope.row.totalGas}}
  103. </div>
  104. </template>
  105. </el-table-column>
  106. <el-table-column
  107. label="type"
  108. width="255">
  109. <template v-slot="scope">
  110. <div class="type">
  111. <div class="bulk" v-if="table.walletNameGroupIndex !== 0">
  112. <img src="../../assets/address/precision_manufacturing.svg" alt="precision_manufacturing">
  113. 批量
  114. </div>
  115. <div class="boutique" v-if="table.walletNameGroupIndex === 0">
  116. <img src="../../assets/address/award_star.svg" alt="award_star">
  117. 精品号
  118. </div>
  119. </div>
  120. </template>
  121. </el-table-column>
  122. <el-table-column
  123. label="最后操作时间"
  124. width="180">
  125. <template v-slot="scope">
  126. <div class="lastTime">
  127. {{scope.row.lastOperTime}}
  128. </div>
  129. </template>
  130. </el-table-column>
  131. <el-table-column align="right">
  132. <template v-slot="scope">
  133. <div class="view" @click="viewAddress(scope.row)">
  134. 查看
  135. </div>
  136. </template>
  137. </el-table-column>
  138. </el-table>
  139. <div class="pagination">
  140. <el-pagination
  141. small
  142. layout="prev, pager, next"
  143. :hide-on-single-page="false"
  144. :page-size="table.pageSize"
  145. :total="table.total"
  146. :current-page.sync="table.page"
  147. @current-change="pageChange">
  148. </el-pagination>
  149. </div>
  150. </div>
  151. </div>
  152. <el-drawer
  153. :visible.sync="drawerView"
  154. :with-header="false">
  155. <div class="drawerView-container">
  156. <div class="drawerView-container-head">
  157. <div class="drawerView-container-title">
  158. 钱包名称
  159. </div>
  160. <div class="drawerView-container-walletAddress">
  161. {{drawerViewData.address}}
  162. </div>
  163. <div class="drawerView-container-statistics">
  164. <div class="drawerView-container-statistics-item">
  165. <div class="drawerView-container-statistics-item-title">
  166. 累计花费
  167. </div>
  168. <div class="drawerView-container-statistics-item-amounts">
  169. <span class="number">{{drawerViewData.gas}}</span>
  170. <span class="currency">USDT</span>
  171. </div>
  172. </div>
  173. <div class="drawerView-container-statistics-item">
  174. <div class="drawerView-container-statistics-item-title">
  175. 剩余本金
  176. </div>
  177. <div class="drawerView-container-statistics-item-amounts">
  178. <span class="number">{{drawerViewData.balance}}</span>
  179. <span class="currency">USDT</span>
  180. </div>
  181. </div>
  182. </div>
  183. </div>
  184. <div class="drawerView-container-main">
  185. <div class="drawerView-container-title">
  186. 钱包活动
  187. </div>
  188. <div class="drawerView-container-total">
  189. 总计钱包: {{drawerViewData.total}}
  190. </div>
  191. <div class="drawerView-container-table-screening">
  192. <div class="drawerView-container-table-screening-item">
  193. 钱包活动
  194. <img src="../../assets/address/filter_list.svg" alt="filter_list">
  195. </div>
  196. <div class="drawerView-container-table-screening-item">
  197. 时间
  198. <img src="../../assets/address/filter_list.svg" alt="filter_list">
  199. </div>
  200. <div class="drawerView-container-table-screening-item" style="margin-left: 26px;margin-right: -10px">
  201. Gas
  202. <img src="../../assets/address/unfold_more.svg" alt="unfold_more">
  203. </div>
  204. <div class="drawerView-container-table-screening-item">
  205. 交易金额
  206. <img src="../../assets/address/unfold_more.svg" alt="unfold_more">
  207. </div>
  208. </div>
  209. <div class="drawerView-container-table-main">
  210. <div v-for="item in drawerViewData.table" class="drawerView-container-table-main-item">
  211. <div class="activity">
  212. <div class="activity-item" v-if="item.taskType !== 'SWAP'" style="background: #F2C94C;">
  213. {{item.taskName}}
  214. </div>
  215. <div class="activity-item" v-if="item.taskType === 'SWAP'" style="background: #6FCF97;">
  216. {{item.taskName}}
  217. </div>
  218. </div>
  219. <div class="time">
  220. {{item.createTime}}
  221. </div>
  222. <div class="gas">
  223. {{parseFloat(item.gas).toFixed(4)}}
  224. </div>
  225. <div class="balance">
  226. {{parseFloat(item.amount).toFixed(4)}}
  227. </div>
  228. <div class="link">
  229. 详情
  230. </div>
  231. </div>
  232. </div>
  233. </div>
  234. <div class="drawerView-container-footer">
  235. <div class="pagination">
  236. <el-pagination
  237. small
  238. layout="prev, pager, next"
  239. :page-size="10"
  240. :total="drawerViewData.total">
  241. </el-pagination>
  242. </div>
  243. <!-- <div class="manageAccount">-->
  244. <!-- <img src="../../assets/address/page_info.svg" alt="page_info">-->
  245. <!-- 管理账号-->
  246. <!-- </div>-->
  247. <!-- <div class="disassociation">-->
  248. <!-- <img src="../../assets/address/link_off.svg" alt="link_off">-->
  249. <!-- 取消关联-->
  250. <!-- </div>-->
  251. </div>
  252. </div>
  253. </el-drawer>
  254. <el-drawer
  255. :visible.sync="drawerAddress"
  256. :with-header="false">
  257. <div class="drawerAddress-container">
  258. <div class="drawerAddress-container-head">
  259. <div class="drawerAddress-container-head-left">
  260. <div class="drawerAddress-container-title">
  261. 添加地址
  262. </div>
  263. <div class="drawerAddress-container-tip">
  264. 添加观察地址
  265. </div>
  266. </div>
  267. <div class="drawerAddress-container-head-right">
  268. <div class="complete" @click="addBoutiqueAccount">
  269. <img src="../../assets/address/done_all.svg" alt="done_all">
  270. 完成
  271. </div>
  272. </div>
  273. </div>
  274. <div class="drawerAddress-container-main">
  275. <div class="item" v-for="(item,index) in addressArr">
  276. <div class="title">
  277. <div class="name">
  278. 钱包地址
  279. </div>
  280. <div class="delete" @click="addressArrDelete(index)">
  281. <img src="../../assets/address/delete.svg" alt="delete">
  282. 删除
  283. </div>
  284. </div>
  285. <div class="input">
  286. <el-select v-model="item.chainId" placeholder="选择公链">
  287. <el-option
  288. v-for="item in options"
  289. :key="item.value"
  290. :label="item.label"
  291. :value="item.value">
  292. </el-option>
  293. </el-select>
  294. <el-input v-model="item.groupName" placeholder="输入钱包名称"></el-input>
  295. </div>
  296. <div class="input">
  297. <el-input v-model="item.address" placeholder="输入钱包地址"></el-input>
  298. </div>
  299. </div>
  300. <div class="addAddress" @click="addressArrPush">
  301. <img src="../../assets/address/add_circle.svg" alt="add_circle">
  302. 新增观察地址
  303. </div>
  304. </div>
  305. </div>
  306. </el-drawer>
  307. <el-drawer
  308. :visible.sync="drawerImport"
  309. :with-header="false"
  310. @closed="completeGeneration = false">
  311. <div class="drawerImport-container">
  312. <div class="drawerImport-container-head">
  313. <div class="drawerImport-container-head-left">
  314. <div class="drawerImport-container-title">
  315. 导入钱包地址
  316. </div>
  317. <div class="drawerImport-container-tip">
  318. 仅支持Keystore导入
  319. </div>
  320. </div>
  321. </div>
  322. <div class="drawerImport-container-main" v-if="!completeGeneration">
  323. <div class="select">
  324. <div :class="drawerImportSelect === 0 ? 'select-item-active' : 'select-item'" @click="drawerImportSelect = 0">
  325. 导入钱包
  326. </div>
  327. <div :class="drawerImportSelect === 1 ? 'select-item-active' : 'select-item'" @click="drawerImportSelect = 1">
  328. 创建钱包
  329. </div>
  330. </div>
  331. <div class="importWallet" v-if="drawerImportSelect === 0">
  332. <div class="upload">
  333. <el-upload
  334. class="upload-demo"
  335. drag
  336. action="https://jsonplaceholder.typicode.com/posts/"
  337. multiple>
  338. <i class="el-icon-upload"></i>
  339. <div class="el-upload__text">将Keystore文件拖到此处,或<em>上传文件</em></div>
  340. </el-upload>
  341. </div>
  342. <div class="inputTitle">
  343. 批量钱包名称
  344. </div>
  345. <div class="batchWalletName">
  346. <el-input v-model="input" placeholder="选择/输入批量钱包名称"></el-input>
  347. <el-select v-model="value" placeholder="选择类型">
  348. <el-option
  349. v-for="item in options"
  350. :key="item.value"
  351. :label="item.label"
  352. :value="item.value">
  353. </el-option>
  354. </el-select>
  355. </div>
  356. <div class="inputTitle">
  357. 钱包密码
  358. </div>
  359. <el-input v-model="input" placeholder="设置钱包密码"></el-input>
  360. <div class="confirm">
  361. <img src="../../assets/address/file_download_done.svg" alt="file_download_done">
  362. 确认导入
  363. </div>
  364. </div>
  365. <div class="createWallet" v-if="drawerImportSelect === 1">
  366. <div class="inputTitle">
  367. 批量钱包名称
  368. </div>
  369. <el-input v-model="batchAddressObj.groupName" placeholder="输入批量钱包名称"></el-input>
  370. <div class="inputBox">
  371. <div>
  372. <div class="inputTitle">
  373. 选择公链
  374. </div>
  375. <el-select style="width: 280px" v-model="batchAddressObj.chainId" placeholder="选择类型">
  376. <el-option
  377. v-for="item in options"
  378. :key="item.value"
  379. :label="item.label"
  380. :value="item.value">
  381. </el-option>
  382. </el-select>
  383. </div>
  384. <div>
  385. <div class="inputTitle">
  386. 生成数量
  387. </div>
  388. <el-input style="width: 230px" v-model="batchAddressObj.numWallet" placeholder="输入生成数量"></el-input>
  389. </div>
  390. </div>
  391. <div class="inputBox">
  392. <div>
  393. <div class="inputTitle">
  394. 钱包密码
  395. </div>
  396. <el-input style="width: 280px" auto-complete="new-password" v-model="batchAddressObj.password" placeholder="设置钱包密码" show-password></el-input>
  397. </div>
  398. <div>
  399. <div class="inputTitle">
  400. 确认钱包密码
  401. </div>
  402. <el-input style="width: 230px" auto-complete="new-password" v-model="batchAddressObj.verifyPassword" placeholder="设置钱包密码" show-password></el-input>
  403. </div>
  404. </div>
  405. <div class="confirm" @click="addBatchAddress">
  406. <img v-if="!confirmLoading" src="../../assets/address/Stroke-2.svg" alt="Stroke">
  407. <div v-if="confirmLoading" style="width: 20px;height: 20px;margin-top: -2px">
  408. <Loading/>
  409. </div>
  410. 开始生成
  411. </div>
  412. <div class="tip">
  413. <div class="title">
  414. <img src="../../assets/address/tips_and_updates.svg" alt="tips_and_updates">
  415. 提示
  416. </div>
  417. <div class="description">
  418. 此密码为您账户钱包的 Keystore 密码,请妥善保管,
  419. 系统无法为您找回。
  420. </div>
  421. </div>
  422. </div>
  423. </div>
  424. <div class="drawerImport-container-main" v-if="completeGeneration">
  425. <div class="completeTip">
  426. <img src="../../assets/address/Rectangle.png" alt="Rectangle">
  427. <div class="description">
  428. <div class="address">
  429. 成功生成 {{addressList.length}} 个钱包地址
  430. </div>
  431. <div class="tip">
  432. 请牢记您的 Keystore 文件及密码,系统无法帮你找回
  433. </div>
  434. </div>
  435. </div>
  436. <div class="addressListBox">
  437. <div class="addressList">
  438. <div class="addressList-item" v-for="(item,index) in addressList">
  439. <div class="name">
  440. Address-{{index+1}}
  441. </div>
  442. <div class="address" @click="copyAddress(item)">
  443. {{item}}
  444. <img src="../../assets/address/content_copy.svg" alt="content_copy">
  445. </div>
  446. </div>
  447. <div class="pagination">
  448. <el-pagination
  449. small
  450. layout="prev, pager, next"
  451. :total="addressList.length">
  452. </el-pagination>
  453. </div>
  454. </div>
  455. </div>
  456. </div>
  457. <div class="drawerImport-container-footer" v-if="completeGeneration">
  458. <div class="exportAddress">
  459. <img src="../../assets/address/upload.svg" alt="upload">
  460. 导出地址
  461. </div>
  462. <div class="download" @click="downloadAddress(batchAddressObj.groupName)">
  463. <img src="../../assets/address/download.svg" alt="download">
  464. 下载Keystore
  465. </div>
  466. </div>
  467. </div>
  468. </el-drawer>
  469. </div>
  470. </template>
  471. <script>
  472. import {
  473. addPremiumAddress,
  474. batchAddress,
  475. getCountAddress, getEventRecord,
  476. getGroupList,
  477. pageAddress
  478. } from '@/api/adress'
  479. import Axios from "axios";
  480. import Loading from "@/components/Loading";
  481. import {saveAs} from 'file-saver';
  482. import Web3 from "web3";
  483. import CryptoJS from "crypto-js";
  484. export default {
  485. components: {Loading},
  486. data() {
  487. return {
  488. table:{
  489. page:1,
  490. pageSize:5,
  491. walletNameGroup:['精品号'],
  492. walletNameGroupIndex:0,
  493. total:0
  494. },
  495. count:{
  496. batchCount:0,
  497. premiumCount:0
  498. },
  499. tableData: [],
  500. exportTableData:[],
  501. drawerView:false,
  502. drawerViewData:{
  503. address:'',
  504. table:[],
  505. gas:0,
  506. balance:0,
  507. total:0
  508. },
  509. drawerAddress:false,
  510. addressArr:[
  511. {
  512. chainId:'',
  513. address:'',
  514. groupName:''
  515. }
  516. ],
  517. batchAddressObj:{
  518. chainId:'',
  519. groupName:'',
  520. numWallet:1,
  521. password:'',
  522. verifyPassword:''
  523. },
  524. options: [{
  525. value: '1',
  526. label: 'ETH'
  527. }],
  528. value: '',
  529. input: '',
  530. drawerImport:false,
  531. drawerImportSelect:1,
  532. completeGeneration:false,
  533. addressList:[],
  534. confirmLoading:false,
  535. url: process.env.VUE_APP_BASE_API,
  536. }
  537. },
  538. created() {
  539. this.getAddressGroupList();
  540. this.getCount()
  541. },
  542. methods: {
  543. getAddressGroupList(){
  544. getGroupList().then(res=>{
  545. this.table.walletNameGroup.push(...res)
  546. this.getAddressGroupAddress()
  547. })
  548. },
  549. getAddressGroupAddress(){
  550. let params
  551. if(this.table.walletNameGroupIndex === 0){
  552. params = {
  553. page:this.table.page,
  554. pageSize:this.table.pageSize,
  555. addressType:0
  556. }
  557. }else {
  558. params = {
  559. page:this.table.page,
  560. pageSize:this.table.pageSize,
  561. groupName:this.table.walletNameGroup[this.table.walletNameGroupIndex]
  562. }
  563. }
  564. pageAddress(params).then(res=>{
  565. this.tableData = res.records
  566. this.table.total = res.total
  567. })
  568. },
  569. selectAddressGroup(index){
  570. this.table.walletNameGroupIndex = index
  571. this.table.page = 1
  572. this.getAddressGroupAddress()
  573. },
  574. viewAddress(row){
  575. let params = {
  576. page:1,
  577. pageSize:10,
  578. queryValue:row.address
  579. }
  580. getEventRecord(params).then(res=>{
  581. this.drawerViewData.address = row.address
  582. this.drawerViewData.gas = row.totalGas
  583. this.drawerViewData.total = res.total
  584. this.drawerViewData.table = res.records
  585. this.drawerView = true
  586. })
  587. },
  588. addBoutiqueAccount(){
  589. let params = this.addressArr
  590. addPremiumAddress(params).then(()=>{
  591. this.success('添加地址成功')
  592. this.drawerAddress = false
  593. let obj = {
  594. chainId:'',
  595. address:'',
  596. groupName:''
  597. }
  598. this.addressArr = [obj]
  599. this.getAddressGroupAddress()
  600. })
  601. },
  602. addressArrPush(){
  603. let obj = {
  604. chainId:'',
  605. address:'',
  606. groupName:''
  607. }
  608. this.addressArr.push(obj)
  609. },
  610. addressArrDelete(index){
  611. this.addressArr.splice(index,1)
  612. },
  613. getCount(){
  614. getCountAddress().then(res=>{
  615. this.count.batchCount = res.batchCount
  616. this.count.premiumCount = res.premiumCount
  617. })
  618. },
  619. pageChange(page){
  620. this.table.page = page
  621. this.getAddressGroupAddress()
  622. },
  623. addBatchAddress(){
  624. if(this.batchAddressObj.password !== this.batchAddressObj.verifyPassword){
  625. this.error('密码不一致')
  626. return
  627. }
  628. // 要加密的数据
  629. const dataToEncrypt = JSON.parse(JSON.stringify(this.batchAddressObj.password));
  630. // console.log('输入的密码:', dataToEncrypt);
  631. // 获取当前北京时间
  632. const beijingDate = this.getCurrentBeijingTime();
  633. // 生成keyByte;
  634. const keyByte = this.generateKeyByteArray(beijingDate);
  635. // console.log('生成的toHex:', keyByte);
  636. // 加密数据
  637. const encryptedData = this.encryptData(dataToEncrypt, keyByte);
  638. // console.log('加密后的数据:', encryptedData);
  639. let params = {
  640. chainId : this.batchAddressObj.chainId,
  641. groupName : this.batchAddressObj.groupName,
  642. numWallet : this.batchAddressObj.numWallet,
  643. password : encryptedData
  644. }
  645. this.confirmLoading = true
  646. batchAddress(params).then(res=>{
  647. this.addressList = res
  648. this.completeGeneration = true
  649. this.confirmLoading = false
  650. })
  651. },
  652. // 获取当前北京时间并格式化为 YYYYMMDD
  653. getCurrentBeijingTime() {
  654. const localDate = new Date();
  655. const localTime = localDate.getTime(); // 获取当前本地时间的时间戳
  656. const localOffset = localDate.getTimezoneOffset() * 60000; // 本地时区偏移的毫秒数
  657. const utcTime = localTime + localOffset; // 转换为 UTC 时间
  658. const beijingOffset = 8 * 60 * 60000; // 北京时区偏移的毫秒数
  659. const beijingTime = utcTime + beijingOffset; // 加上北京时区偏移
  660. const beijingDate = new Date(beijingTime);
  661. const year = beijingDate.getFullYear();
  662. const month = (beijingDate.getMonth() + 1).toString().padStart(2, '0');
  663. const day = beijingDate.getDate().toString().padStart(2, '0');
  664. return `${year}${month}${day}${year}${month}${day}`;
  665. },
  666. // 生成
  667. generateKeyByteArray(content) {
  668. let bytes = [];
  669. let len, c;
  670. len = content.length;
  671. for (let i = 0; i < len; i++) {
  672. c = content[i];
  673. bytes.push(parseInt(c))
  674. }
  675. // console.log('当前北京时间的数组',bytes);
  676. return Web3.utils.bytesToHex(bytes).substring(2);
  677. },
  678. // 加密函数
  679. encryptData(word, keyStr) {
  680. let key = CryptoJS.enc.Hex.parse(keyStr)
  681. // console.log('CryptoJS生成的key',key);
  682. let encrypted = CryptoJS.AES.encrypt(word, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7}) // 加密模式为ECB,补码方式为PKCS5Padding(也就是PKCS7)
  683. return encrypted.toString()
  684. },
  685. downloadAddress(el) {
  686. let groupName = this.table.walletNameGroup[this.table.walletNameGroupIndex]
  687. if(el){
  688. groupName = el
  689. }
  690. Axios.post(
  691. this.url + "ams/address/download/batch-keystore",
  692. {
  693. groupName: groupName,
  694. },
  695. {
  696. responseType: "arraybuffer",
  697. headers: {
  698. "Conntent-Type": "application/json; application/octet-stream;",
  699. },
  700. }
  701. )
  702. .then((response) => {
  703. let buffer = response.data;
  704. let view = new DataView(buffer);
  705. let str = "";
  706. for (let i = 0; i < view.byteLength; i++) {
  707. str += String.fromCharCode(view.getUint8(i));
  708. }
  709. if (str.includes(".json")) {
  710. this.downloadFile(response.data,groupName);
  711. } else {
  712. const data = JSON.parse(str);
  713. this.$message.error(data.message);
  714. }
  715. })
  716. .catch((e) => {
  717. this.$message.error(e);
  718. });
  719. },
  720. downloadFile(data,groupName) {
  721. let blob = new Blob([data], { type: "application/zip" });
  722. let url = window.URL.createObjectURL(blob);
  723. const link = document.createElement("a"); // 创建a标签
  724. link.href = url;
  725. link.download = groupName + ".zip";
  726. link.click();
  727. URL.revokeObjectURL(url); // 释放内存
  728. this.downloadModal = false;
  729. },
  730. exportAddress() {
  731. let params
  732. if(this.table.walletNameGroupIndex === 0){
  733. params = {
  734. page:1,
  735. pageSize:1000,
  736. addressType:0
  737. }
  738. }else {
  739. params = {
  740. page:1,
  741. pageSize:1000,
  742. groupName:this.table.walletNameGroup[this.table.walletNameGroupIndex]
  743. }
  744. }
  745. pageAddress(params).then(res=>{
  746. this.exportTableData = res.records
  747. this.exportTableData.forEach(item=>{
  748. })
  749. })
  750. },
  751. copyAddress(el){
  752. let address = el
  753. if (navigator.clipboard) {
  754. navigator.clipboard.writeText(address);
  755. this.success('复制成功')
  756. } else {
  757. let textarea = document.createElement('textarea');
  758. document.body.appendChild(textarea);
  759. // 隐藏此输入框
  760. textarea.style.position = 'fixed';
  761. textarea.style.clip = 'rect(0 0 0 0)';
  762. textarea.style.top = '10px';
  763. // 赋值
  764. textarea.value = address;
  765. // 选中
  766. textarea.select();
  767. // 复制
  768. document.execCommand('copy', true);
  769. // 移除输入框
  770. document.body.removeChild(textarea);
  771. this.success('复制成功')
  772. }
  773. },
  774. success(message) {
  775. this.$notify({
  776. title: '成功',
  777. message: message,
  778. type: 'success'
  779. });
  780. },
  781. error(message) {
  782. this.$notify.error({
  783. title: '错误',
  784. message: message
  785. });
  786. },
  787. }
  788. }
  789. </script>
  790. <style lang="scss" scoped>
  791. .app-container{
  792. .app-container-head{
  793. display: flex;
  794. justify-content: space-between;
  795. align-items: center;
  796. .app-container-head-left{
  797. display: flex;
  798. justify-content: space-between;
  799. align-items: center;
  800. gap:60px;
  801. .app-container-head-left-item{
  802. display: flex;
  803. flex-direction: column;
  804. gap:8px;
  805. .app-container-head-left-item-count{
  806. font-weight: 700;
  807. font-size: 21px;
  808. line-height: 28px;
  809. color: #181818;
  810. }
  811. .app-container-head-left-item-name{
  812. font-weight: 700;
  813. font-size: 12px;
  814. line-height: 16px;
  815. color: #8e8f91;
  816. }
  817. }
  818. .app-container-head-left-divider{
  819. width: 1px;
  820. height: 50px;
  821. border-right:1px solid #e4e6ea;
  822. }
  823. }
  824. .app-container-head-right{
  825. display: flex;
  826. align-items: center;
  827. gap:24px;
  828. .app-container-head-right-button1{
  829. width: 148px;
  830. height: 52px;
  831. display: flex;
  832. flex-direction: row;
  833. justify-content: center;
  834. align-items: center;
  835. gap: 4px;
  836. background: #f9fbff;
  837. border-radius: 10px;
  838. font-weight: 700;
  839. font-size: 15px;
  840. line-height: 20px;
  841. color: #2980ff;
  842. border: 1px solid #2980FF;
  843. cursor: pointer;
  844. }
  845. .app-container-head-right-button2{
  846. width: 148px;
  847. height: 52px;
  848. display: flex;
  849. flex-direction: row;
  850. justify-content: center;
  851. align-items: center;
  852. gap: 4px;
  853. background: #4A76FF;
  854. border-radius: 10px;
  855. font-weight: 700;
  856. font-size: 15px;
  857. line-height: 20px;
  858. color: #FFFFFF;
  859. cursor: pointer;
  860. }
  861. }
  862. }
  863. .app-container-table{
  864. margin-top: 80px;
  865. .app-container-table-title{
  866. display: flex;
  867. align-items: center;
  868. justify-content: space-between;
  869. .app-container-table-title-left{
  870. font-weight: 700;
  871. font-size: 21px;
  872. line-height: 28px;
  873. color: #181818;
  874. }
  875. }
  876. .app-container-table-select{
  877. display: flex;
  878. align-items: center;
  879. gap:56px;
  880. //border-bottom: 4px solid #f2f4f7;
  881. width: 100%;
  882. margin-top: 28px;
  883. .scrollbar-flex-content {
  884. display: flex;
  885. gap:56px;
  886. }
  887. .app-container-table-select-item{
  888. font-weight: 400;
  889. font-size: 17px;
  890. line-height: 22px;
  891. color: #ABABAB;
  892. padding-bottom: 16px;
  893. //margin-bottom: -4px;
  894. border-bottom: 4px solid #f9fbff;
  895. cursor: pointer;
  896. white-space:nowrap;
  897. margin-bottom: 20px;
  898. }
  899. .app-container-table-select-item-active{
  900. font-weight: 700;
  901. font-size: 17px;
  902. line-height: 22px;
  903. color: #2980FF;
  904. padding-bottom: 16px;
  905. //margin-bottom: -4px;
  906. border-bottom: 4px solid #2980FF;
  907. cursor: pointer;
  908. white-space:nowrap;
  909. margin-bottom: 20px;
  910. }
  911. }
  912. .app-container-table-screening{
  913. display: flex;
  914. align-items: center;
  915. gap:100px;
  916. padding: 20px 0;
  917. margin: 20px 0;
  918. border-top: 1px solid #f5f5f5;
  919. border-bottom: 1px solid #f5f5f5;
  920. .app-container-table-screening-item{
  921. display: flex;
  922. align-items: center;
  923. gap:6px;
  924. font-weight: 400;
  925. font-size: 15px;
  926. line-height: 20px;
  927. color: #4d4d4e;
  928. }
  929. }
  930. .app-container-table-main {
  931. .accountAddress{
  932. display: flex;
  933. align-items: center;
  934. gap:12px;
  935. margin-left: 14px;
  936. .img{
  937. width: 26px;
  938. height: 26px;
  939. background: black;
  940. border-radius: 50%;
  941. }
  942. .walletName{
  943. font-weight: 700;
  944. font-size: 15px;
  945. line-height: 20px;
  946. color: #181818;
  947. }
  948. .walletAddress{
  949. font-weight: 400;
  950. font-size: 15px;
  951. line-height: 20px;
  952. color: #181818;
  953. }
  954. }
  955. .gas{
  956. font-weight: 700;
  957. font-size: 17px;
  958. line-height: 22px;
  959. color: #2980FF;
  960. }
  961. .type{
  962. .bulk{
  963. width: fit-content;
  964. display: flex;
  965. align-items: center;
  966. justify-content: center;
  967. gap:4px;
  968. padding: 5px 10px;
  969. border: 1px solid #E0E0E0;
  970. border-radius: 30px;
  971. background: #edf2ff;
  972. font-weight: 400;
  973. font-size: 12px;
  974. line-height: 16px;
  975. color: #222222;
  976. }
  977. .boutique {
  978. width: fit-content;
  979. display: flex;
  980. align-items: center;
  981. justify-content: center;
  982. gap:4px;
  983. padding: 5px 10px;
  984. border-radius: 30px;
  985. background: #222222;
  986. font-weight: 700;
  987. font-size: 12px;
  988. line-height: 16px;
  989. color: #F2C94C;
  990. }
  991. }
  992. .lastTime{
  993. font-weight: 400;
  994. font-size: 14px;
  995. line-height: 18px;
  996. color: #898a8c;
  997. }
  998. .view{
  999. font-weight: 700;
  1000. font-size: 14px;
  1001. line-height: 18px;
  1002. color: #2980FF;
  1003. margin-right: 14px;
  1004. cursor: pointer;
  1005. }
  1006. .pagination{
  1007. position: fixed;
  1008. bottom:36px
  1009. }
  1010. }
  1011. }
  1012. .drawerView-container{
  1013. display: flex;
  1014. flex-direction: column;
  1015. height: 100vh;
  1016. .drawerView-container-head{
  1017. padding: 56px 40px;
  1018. background: #FFFFFF;
  1019. .drawerView-container-title{
  1020. font-weight: 700;
  1021. font-size: 21px;
  1022. line-height: 28px;
  1023. color: #181818;
  1024. margin-bottom: 8px;
  1025. }
  1026. .drawerView-container-walletAddress{
  1027. font-weight: 400;
  1028. font-size: 12px;
  1029. line-height: 16px;
  1030. color: #94c0ff;
  1031. margin-bottom: 24px;
  1032. }
  1033. .drawerView-container-statistics{
  1034. display: flex;
  1035. align-items: center;
  1036. gap:80px;
  1037. .drawerView-container-statistics-item{
  1038. display: flex;
  1039. flex-direction: column;
  1040. gap: 4px;
  1041. .drawerView-container-statistics-item-title{
  1042. font-weight: 400;
  1043. font-size: 15px;
  1044. line-height: 20px;
  1045. color: #8c8c8c;
  1046. }
  1047. .drawerView-container-statistics-item-amounts{
  1048. font-weight: 700;
  1049. color: #222222;
  1050. .number{
  1051. font-size: 17px;
  1052. line-height: 22px;
  1053. }
  1054. .currency{
  1055. font-size: 12px;
  1056. line-height: 16px;
  1057. }
  1058. }
  1059. }
  1060. }
  1061. }
  1062. .drawerView-container-main{
  1063. padding: 36px 40px;
  1064. background: #f9fbff;
  1065. flex-grow: 1;
  1066. .drawerView-container-title{
  1067. font-weight: 700;
  1068. font-size: 21px;
  1069. line-height: 28px;
  1070. color: #181818;
  1071. margin-bottom: 8px;
  1072. }
  1073. .drawerView-container-total{
  1074. font-weight: 700;
  1075. font-size: 12px;
  1076. line-height: 16px;
  1077. color: #8e8f91;
  1078. }
  1079. .drawerView-container-table-screening{
  1080. margin-top: 28px;
  1081. margin-bottom: 24px;
  1082. height: 52px;
  1083. display: flex;
  1084. align-items: center;
  1085. gap:60px;
  1086. border-bottom: 1px solid #f5f5f5;
  1087. border-top: 1px solid #f5f5f5;
  1088. .drawerView-container-table-screening-item{
  1089. display: flex;
  1090. align-items: center;
  1091. gap:6px;
  1092. font-weight: 400;
  1093. font-size: 15px;
  1094. line-height: 20px;
  1095. color: #4d4d4e;
  1096. white-space: nowrap;
  1097. }
  1098. }
  1099. .drawerView-container-table-main{
  1100. display: flex;
  1101. flex-direction: column;
  1102. gap:16px;
  1103. .drawerView-container-table-main-item{
  1104. display: flex;
  1105. align-items: center;
  1106. height: 30px;
  1107. .activity{
  1108. width: 120px;
  1109. .activity-item{
  1110. width: 72px;
  1111. height: 30px;
  1112. border-radius: 30px;
  1113. font-weight: 700;
  1114. font-size: 14px;
  1115. line-height: 18px;
  1116. color: #222222;
  1117. display: flex;
  1118. justify-content: center;
  1119. align-items: center;
  1120. }
  1121. }
  1122. .time{
  1123. font-weight: 400;
  1124. font-size: 15px;
  1125. line-height: 20px;
  1126. color: #ABABAB;
  1127. width: 200px;
  1128. }
  1129. .link{
  1130. font-weight: 400;
  1131. font-size: 15px;
  1132. line-height: 20px;
  1133. color: #2980FF;
  1134. white-space: nowrap;
  1135. }
  1136. .balance{
  1137. font-weight: 700;
  1138. font-size: 15px;
  1139. line-height: 20px;
  1140. color: #222222;
  1141. width: 120px;
  1142. }
  1143. .gas{
  1144. font-weight: 700;
  1145. font-size: 15px;
  1146. line-height: 20px;
  1147. color: #222222;
  1148. width: 120px;
  1149. }
  1150. }
  1151. }
  1152. }
  1153. .drawerView-container-footer {
  1154. height: 84px;
  1155. padding: 30px 10px;
  1156. display: flex;
  1157. align-items: center;
  1158. //justify-content: space-around;
  1159. .pagination{
  1160. width: 250px;
  1161. }
  1162. .manageAccount{
  1163. display: flex;
  1164. align-items: center;
  1165. gap:12px;
  1166. font-weight: 700;
  1167. font-size: 17px;
  1168. line-height: 22px;
  1169. color: #222222;
  1170. }
  1171. .disassociation{
  1172. display: flex;
  1173. align-items: center;
  1174. gap:12px;
  1175. font-weight: 700;
  1176. font-size: 17px;
  1177. line-height: 22px;
  1178. color: #EB5757;
  1179. }
  1180. }
  1181. }
  1182. .drawerAddress-container{
  1183. display: flex;
  1184. flex-direction: column;
  1185. height: 100vh;
  1186. overflow: auto;
  1187. .drawerAddress-container-head{
  1188. padding: 56px 40px;
  1189. background: #FFFFFF;
  1190. display: flex;
  1191. align-items: center;
  1192. justify-content: space-between;
  1193. .drawerAddress-container-head-left{
  1194. .drawerAddress-container-title{
  1195. font-weight: 700;
  1196. font-size: 21px;
  1197. line-height: 28px;
  1198. color: #181818;
  1199. margin-bottom: 8px;
  1200. }
  1201. .drawerAddress-container-tip{
  1202. font-weight: 700;
  1203. font-size: 12px;
  1204. line-height: 16px;
  1205. color: #919191;
  1206. }
  1207. }
  1208. .drawerAddress-container-head-right{
  1209. display: flex;
  1210. align-items: center;
  1211. gap:48px;
  1212. .cancellation{
  1213. width: 118px;
  1214. height: 52px;
  1215. background: #E0E0E0;
  1216. border-radius: 10px;
  1217. gap: 4px;
  1218. display: flex;
  1219. align-items: center;
  1220. justify-content: center;
  1221. font-weight: 700;
  1222. font-size: 15px;
  1223. line-height: 20px;
  1224. color: #828282;
  1225. }
  1226. .complete{
  1227. width: 118px;
  1228. height: 52px;
  1229. border: 2px solid #4A76FF;
  1230. border-radius: 10px;
  1231. gap:4px;
  1232. display: flex;
  1233. align-items: center;
  1234. justify-content: center;
  1235. font-weight: 700;
  1236. font-size: 15px;
  1237. line-height: 20px;
  1238. color: #2980FF;
  1239. cursor: pointer;
  1240. }
  1241. }
  1242. }
  1243. .drawerAddress-container-main{
  1244. padding: 36px 40px;
  1245. background: #f9fbff;
  1246. flex-grow: 1;
  1247. display: flex;
  1248. flex-direction: column;
  1249. gap:20px;
  1250. .item{
  1251. display: flex;
  1252. flex-direction: column;
  1253. gap:12px;
  1254. .title{
  1255. display: flex;
  1256. align-items: center;
  1257. justify-content: space-between;
  1258. .name{
  1259. font-weight: 400;
  1260. font-size: 17px;
  1261. line-height: 22px;
  1262. color: #181818;
  1263. }
  1264. .delete{
  1265. display: flex;
  1266. align-items: center;
  1267. gap:4px;
  1268. font-weight: 700;
  1269. font-size: 15px;
  1270. line-height: 20px;
  1271. color: #EB5757;
  1272. cursor: pointer;
  1273. }
  1274. }
  1275. .input{
  1276. display: flex;
  1277. align-items: center;
  1278. gap:24px;
  1279. }
  1280. }
  1281. .addAddress{
  1282. display: flex;
  1283. align-items: center;
  1284. gap:12px;
  1285. font-weight: 700;
  1286. font-size: 17px;
  1287. line-height: 22px;
  1288. color: #2980FF;
  1289. cursor: pointer;
  1290. }
  1291. }
  1292. }
  1293. .drawerImport-container{
  1294. display: flex;
  1295. flex-direction: column;
  1296. height: 100vh;
  1297. .drawerImport-container-head{
  1298. padding: 56px 40px;
  1299. background: #FFFFFF;
  1300. display: flex;
  1301. align-items: center;
  1302. justify-content: space-between;
  1303. .drawerImport-container-head-left{
  1304. .drawerImport-container-title{
  1305. font-weight: 700;
  1306. font-size: 21px;
  1307. line-height: 28px;
  1308. color: #181818;
  1309. margin-bottom: 8px;
  1310. }
  1311. .drawerImport-container-tip{
  1312. font-weight: 400;
  1313. font-size: 12px;
  1314. line-height: 16px;
  1315. color: #919191;
  1316. }
  1317. }
  1318. }
  1319. .drawerImport-container-main{
  1320. padding: 36px 40px;
  1321. background: #f9fbff;
  1322. flex-grow: 1;
  1323. .select{
  1324. display: flex;
  1325. align-items: center;
  1326. gap:56px;
  1327. border-bottom: 4px solid #f2f4f7;
  1328. margin-bottom: 40px;
  1329. .select-item{
  1330. font-weight: 400;
  1331. font-size: 17px;
  1332. line-height: 22px;
  1333. color: #ABABAB;
  1334. padding-bottom: 16px;
  1335. margin-bottom: -4px;
  1336. border-bottom: 4px solid #f2f4f7;
  1337. cursor: pointer;
  1338. }
  1339. .select-item-active{
  1340. font-weight: 700;
  1341. font-size: 17px;
  1342. line-height: 22px;
  1343. color: #2980FF;
  1344. padding-bottom: 16px;
  1345. margin-bottom: -4px;
  1346. border-bottom: 4px solid #2980FF;
  1347. cursor: pointer;
  1348. }
  1349. }
  1350. .inputTitle{
  1351. font-weight: 500;
  1352. font-size: 14px;
  1353. line-height: 18px;
  1354. color: #383838;
  1355. margin-bottom: 12px;
  1356. }
  1357. .confirm{
  1358. width: 100%;
  1359. height: 53px;
  1360. background: #2980FF;
  1361. display: flex;
  1362. align-items: center;
  1363. justify-content: center;
  1364. gap:8px;
  1365. margin-top: 28px;
  1366. cursor: pointer;
  1367. font-weight: 700;
  1368. font-size: 16px;
  1369. line-height: 21px;
  1370. color: #FFFFFF;
  1371. }
  1372. .importWallet{
  1373. .upload{
  1374. display: flex;
  1375. justify-content: center;
  1376. margin-bottom: 40px;
  1377. }
  1378. .batchWalletName{
  1379. display: flex;
  1380. align-items: center;
  1381. gap:20px;
  1382. margin-bottom: 28px;
  1383. }
  1384. }
  1385. .createWallet{
  1386. .inputBox{
  1387. display: flex;
  1388. gap:20px;
  1389. margin-top: 28px;
  1390. width: 100%;
  1391. }
  1392. .tip{
  1393. display: flex;
  1394. flex-direction: column;
  1395. gap:9px;
  1396. margin-top: 36px;
  1397. .title{
  1398. display: flex;
  1399. align-items: center;
  1400. gap:4px;
  1401. font-weight: 700;
  1402. font-size: 17px;
  1403. line-height: 22px;
  1404. color: #EB5757;
  1405. }
  1406. .description{
  1407. font-weight: 400;
  1408. font-size: 14px;
  1409. line-height: 18px;
  1410. color: #EB5757;
  1411. }
  1412. }
  1413. }
  1414. .completeTip{
  1415. display: flex;
  1416. align-items: center;
  1417. justify-content: center;
  1418. gap:8px;
  1419. .description{
  1420. display: flex;
  1421. flex-direction: column;
  1422. gap:8px;
  1423. .address{
  1424. font-weight: 700;
  1425. font-size: 21px;
  1426. line-height: 28px;
  1427. color: #181818;
  1428. }
  1429. .tip{
  1430. font-weight: 400;
  1431. font-size: 14px;
  1432. line-height: 18px;
  1433. color: #8e8f91;
  1434. }
  1435. }
  1436. }
  1437. .addressListBox{
  1438. display: flex;
  1439. flex-direction: column;
  1440. align-items: center;
  1441. justify-content: center;
  1442. margin-top: 20px;
  1443. .addressList{
  1444. width: 402px;
  1445. background: #FFFFFF;
  1446. border: 1px solid #F5F5F5;
  1447. border-radius: 6px;
  1448. padding: 20px 34px;
  1449. display: flex;
  1450. flex-direction: column;
  1451. gap:8px;
  1452. .addressList-item{
  1453. display: flex;
  1454. flex-direction: column;
  1455. gap:4px;
  1456. .name{
  1457. font-weight: 400;
  1458. font-size: 12px;
  1459. line-height: 16px;
  1460. color: #9c9c9c;
  1461. }
  1462. .address{
  1463. display: flex;
  1464. align-items: center;
  1465. justify-content: space-between;
  1466. font-weight: 500;
  1467. font-size: 12px;
  1468. line-height: 16px;
  1469. color: #212121;
  1470. cursor: pointer;
  1471. }
  1472. }
  1473. .pagination{
  1474. display: flex;
  1475. justify-content: center;
  1476. margin-top: 20px;
  1477. }
  1478. }
  1479. }
  1480. }
  1481. .drawerImport-container-footer{
  1482. width: 100%;
  1483. height: 84px;
  1484. display: flex;
  1485. align-items: center;
  1486. justify-content: flex-end;
  1487. padding: 0 40px;
  1488. gap:60px;
  1489. .exportAddress{
  1490. display: flex;
  1491. align-items: center;
  1492. gap:12px;
  1493. font-weight: 700;
  1494. font-size: 17px;
  1495. line-height: 22px;
  1496. color: #2980FF;
  1497. }
  1498. .download{
  1499. display: flex;
  1500. align-items: center;
  1501. gap:12px;
  1502. font-weight: 700;
  1503. font-size: 17px;
  1504. line-height: 22px;
  1505. color: #222222;
  1506. cursor: pointer;
  1507. }
  1508. }
  1509. }
  1510. }
  1511. ::v-deep .el-table__body{
  1512. -webkit-border-vertical-spacing: 20px;
  1513. background: #f9fbff;
  1514. }
  1515. ::v-deep .el-table__row{
  1516. border-radius: 10px;
  1517. background: white;
  1518. height: 58px;
  1519. }
  1520. ::v-deep .el-table__row>td{
  1521. border: none;
  1522. }
  1523. ::v-deep .el-table th.is-leaf{
  1524. border: none;
  1525. font-weight: 400;
  1526. font-size: 14px;
  1527. line-height: 18px;
  1528. color: #4d4d4e ;
  1529. }
  1530. ::v-deep .el-table::before{
  1531. height: 0;
  1532. }
  1533. </style>