index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887
  1. <template>
  2. <div class="content" :style="{ 'background': `#F5FAFF` }" v-show="home_show" v-if="detail">
  3. <div class="logo">
  4. <img src="/svg/icon-logo.svg" alt />
  5. </div>
  6. <!-- 未开始 -->
  7. <div class="not-open" v-show="status == 'not-open'">
  8. <img src="/subject/001.gif">
  9. </div>
  10. <!-- 红包打开 -->
  11. <div class="redPacket" v-show="status != 'not-open'" :class="{ redPacket2: status != 'open', key_packet: status == 'open' }">
  12. <!-- 内容 -->
  13. <div class="head">
  14. <div class="head-title">
  15. <img :src="detail.postBizData.postUserInfo.avatarUrl" alt />
  16. <span>{{ detail.postBizData.postUserInfo.nickName }}</span>
  17. </div>
  18. <!-- <div class="head-txt" v-if="status == 'open' || status == 'opened'">Awesome! You Will Get</div> -->
  19. <!-- <div class="head-area" v-else-if="status == 'opened'">opened!</div> -->
  20. <!-- 红包被领完了 -->
  21. <div class="head-area" v-if="status == 'nothing'">
  22. <div class="txt">Better luck next time!</div>
  23. </div>
  24. <!-- 过期 -->
  25. <div class="head-area expire" v-if="status == 'expire'">
  26. <div class="txt">This Giveaways</div>
  27. <div class="titme">expired on {{ formatTime(detail.postBizData.endTimestamp, 'MM-DD') }}</div>
  28. </div>
  29. <!-- 非chrome浏览器 -->
  30. <div class="head-area expire" v-if="status == 'no-chrome'">
  31. <div class="txt">Get Giveaways</div>
  32. <div class="titme">with chrome</div>
  33. </div>
  34. <!-- 领取成功 -->
  35. <div class="head-area head-money" v-if="status == 'open' || status == 'opened'">
  36. <div class="txt">AWESOME! YOU Will GET</div>
  37. <div class="head-money-area">
  38. <img :src="currencyIconUrl" alt />
  39. <span class="money-txt">{{ receiveAmount / 100 }}</span>
  40. </div>
  41. </div>
  42. </div>
  43. <!-- 领取列表 -->
  44. <div class="luck-list-title">
  45. <div>{{ detail.postBizData.receiveCount || 0 }}/{{ detail.postBizData.totalCount || 0 }} Got</div>
  46. <div> {{ detail.postBizData.receiveAmountValue / 100 }} / {{
  47. detail.postBizData.amountValue / 100 || ''
  48. }} {{
  49. detail.postBizData.amountCurrencyCode || ''
  50. }}</div>
  51. </div>
  52. <div class="luck-list" @scroll="handleScroll($event)">
  53. <div class="luck-item" v-for="item, i in luck_list" v-bind:key="i">
  54. <img v-if="item.simpleUserInfoVO.avatarUrl" :src="item.simpleUserInfoVO.avatarUrl" alt />
  55. <img v-else src="/svg/icon-twitter.svg" alt />
  56. <div class="luck-content">
  57. <div class="luck-title">{{ item.simpleUserInfoVO.nickName || 'Twitter User' }}</div>
  58. <div class="luck-time">{{ formatTime(item.receiveTimestamp) }}</div>
  59. </div>
  60. <div class="luck-money">
  61. <img :src="item.currencyIconUrl" alt />
  62. <div class="luck-money-txt">{{ item.amountValue / 100 || 0 }}</div>
  63. </div>
  64. <div class="luck-king" v-if="item.maxAmount">
  65. <img src="/svg/icon-king-hat.svg" alt />
  66. <span>Luckiest Draw</span>
  67. </div>
  68. </div>
  69. </div>
  70. </div>
  71. <!-- 安装 -->
  72. <div class="install" v-if="status == 'open' || status == 'opened'" :class="{ key_install: status == 'open' }">
  73. <div class="title">Withdraw to Wallet</div>
  74. <div class="validity">
  75. <template v-if="validity_state">
  76. <span>Validity</span>
  77. <span style="color: red;">{{ validity }}</span>
  78. </template>
  79. <template v-else>
  80. <span style="color: red;">Giveaways Validity</span>
  81. </template>
  82. </div>
  83. <div class="flow">
  84. <div class="line"></div>
  85. <div class="area_num">
  86. <div class="num">1</div>
  87. <span>Install DeNet</span>
  88. </div>
  89. <div class="tip">Used for Task Verification and Giveaways Withdrawal</div>
  90. <div class="install_btn" @click="installExtension">Install</div>
  91. <div class="area_num">
  92. <div class="num">2</div>
  93. <span>Complete Tasks by {{ detail.postBizData.postUserInfo.nickName }}</span>
  94. </div>
  95. <div class="tip">Follow、Like tweet、Retweet (Just 1-3 minutes)</div>
  96. </div>
  97. </div>
  98. <!-- 过期 -->
  99. <div class="install install-error" v-if="status == 'nothing' || status == 'expire'">
  100. <div class="title">Install DeNet</div>
  101. <div class="title">Don't miss the next Giveaway</div>
  102. <div class="tip">Used for Task Verification and Giveaways Withdrawal</div>
  103. <div class="install_btn" @click="installExtension">Install</div>
  104. </div>
  105. <!-- 非chrome 浏览器状态 -->
  106. <div class="install install-error" v-if="status == 'no-chrome'">
  107. <div class="title">Open Giveaways</div>
  108. <div class="title">with chrome</div>
  109. <div class="tip">Only supports getting Giveaways through chrome</div>
  110. <div class="install_chrome">
  111. <img src="/svg/icon-chrome.svg" alt />
  112. Install Chrome
  113. </div>
  114. </div>
  115. <div v-if="status == 'error'"></div>
  116. </div>
  117. </template>
  118. <script>
  119. import axios from 'axios';
  120. import Cookies from 'js-cookie'
  121. import { isBrowser } from '../utils/help.js'
  122. var moment = require('moment');
  123. const api = {
  124. prod: 'https://api.denetme.net',
  125. pre: 'https://preapi.denetme.net',
  126. test: 'https://testapi.denetme.net'
  127. }
  128. const page = {
  129. prod: "https://h5.denetme.net",
  130. pre: "https://preh5.denetme.net",
  131. test: 'https://testh5.denetme.net'
  132. }
  133. const jumpUrl = page[process.env.NUXT_ENV.MODE] + '/'
  134. const baseURL = api[process.env.NUXT_ENV.MODE]
  135. export default {
  136. name: "index",
  137. data() {
  138. return {
  139. appVersionCode: 1,
  140. mid: '',
  141. area_show: true,
  142. home_show: false,
  143. validity: '',
  144. receiveAmount: 0,
  145. validity_state: true,
  146. detail: {
  147. postId: '',
  148. postBizData: {
  149. imagePath: '',
  150. postUserInfo: {
  151. }
  152. }
  153. },
  154. currencyIconUrl: '',
  155. title: '',
  156. twitterTitle: 'deNet',
  157. jumpUrl: jumpUrl,
  158. status: '',
  159. page_index: 1,
  160. page_size: 20,
  161. luck_list: [],
  162. luck_list_end: false
  163. }
  164. },
  165. head() {
  166. return {
  167. type: '',
  168. title: this.title,
  169. appVersionCode: 1,
  170. meta: [
  171. {
  172. name: 'twitter:card',
  173. content: 'summary_large_image'
  174. },
  175. {
  176. name: 'twitter:url',
  177. content: this.jumpUrl + this.detail.postId
  178. },
  179. {
  180. name: 'twitter:title',
  181. content: this.twitterTitle
  182. },
  183. {
  184. name: 'twitter:image',
  185. content: this.detail.postBizData.imagePath || ''
  186. },
  187. {
  188. name: 'twitter:image:width',
  189. content: '1280'
  190. },
  191. {
  192. name: 'twitter:image:height',
  193. content: '720'
  194. },
  195. ]
  196. }
  197. },
  198. methods: {
  199. installExtension() {
  200. let url = 'https://d3d9wvhy948gxx.cloudfront.net/extensions/chrome/denet.zip'
  201. location.href = url;
  202. this.$router.push({
  203. path: '/install'
  204. })
  205. },
  206. formatTime(time, _type = 'MM-DD HH:mm:ss') {
  207. return moment(time).format(_type)
  208. },
  209. guid() {
  210. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
  211. var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
  212. return v.toString(16);
  213. });
  214. },
  215. handleScroll(e) {
  216. e = e.target
  217. if (this.luck_list_end) {
  218. return
  219. }
  220. if ((e.clientHeight + e.scrollTop) / e.scrollHeight > .8) {
  221. this.luck_list_end = false
  222. this.page_index++
  223. this.getReceivedList()
  224. }
  225. },
  226. setCookieMid() {
  227. let _cookie_mid_arr = Cookies.get('mid') || []
  228. if (_cookie_mid_arr.length > 0) {
  229. this.mid = JSON.parse(_cookie_mid_arr)[0].mid
  230. } else {
  231. this.mid = this.guid()
  232. Cookies.set('mid', JSON.stringify([{ mid: this.mid }]), { expires: 1000 })
  233. }
  234. },
  235. async getRedPacket() {
  236. let { data } = await axios.post(`${baseURL}/denet/post/luckdrop/receiveLuckdrop`, {
  237. baseInfo: {
  238. appVersionCode: this.appVersionCode,
  239. mid: this.mid
  240. },
  241. params: {
  242. postId: this.detail.postId || ''
  243. }
  244. })
  245. this.home_show = true
  246. switch (data.code.toString()) {
  247. case '0':
  248. if (data.data.newReceived) {
  249. this.status = 'not-open'
  250. setTimeout(() => {
  251. this.status = 'open'
  252. }, 3000)
  253. this.receiveAmount = data.data.receiveAmount
  254. } else {
  255. this.status = 'opened'
  256. }
  257. this.getValidity(data.data.endTimestamp)
  258. this.receiveAmount = data.data.receiveAmount
  259. break;
  260. case '2003':
  261. this.status = 'expire'
  262. break
  263. // 红包被领完了
  264. case '2008':
  265. this.status = 'nothing'
  266. break
  267. case '2029':
  268. // 推文未发布
  269. this.status = 'error'
  270. break
  271. default:
  272. console.log('getRedPacket', data)
  273. this.home_show = false
  274. break;
  275. }
  276. // 领取列表分页
  277. this.getReceivedList()
  278. },
  279. async getReceivedList() {
  280. let { data } = await axios.post(`${baseURL}/denet/post/luckdrop/getReceivedList`, {
  281. baseInfo: {
  282. appVersionCode: this.appVersionCode,
  283. mid: this.mid
  284. },
  285. params: {
  286. pageNum: this.page_index,
  287. pageSize: this.page_size,
  288. postId: this.detail.postId || ''
  289. }
  290. })
  291. if (data.code == 0) {
  292. if (data.data.length > 0) {
  293. this.luck_list = this.luck_list.concat(data.data)
  294. this.luck_list_end = false
  295. } else {
  296. this.luck_list_end = true
  297. }
  298. } else {
  299. console.log('getReceivedList', data)
  300. }
  301. },
  302. getValidity(end_time) {
  303. let _d1, _d2, _d3, _h, _m, _s
  304. let timer = setInterval(() => {
  305. let _time = new Date().getTime()
  306. _d3 = end_time - _time
  307. if (_d3 > 0) {
  308. _d1 = moment(end_time)
  309. _d2 = moment(_time)
  310. _h = moment.duration(_d1.diff(_d2)).hours()
  311. _m = moment.duration(_d1.diff(_d2)).minutes()
  312. _s = moment.duration(_d1.diff(_d2)).seconds()
  313. this.validity = `${_h}:${_m}:${_s}`
  314. } else {
  315. clearInterval(timer)
  316. }
  317. }, 1000)
  318. },
  319. setPickupInfo() {
  320. let pickupInfo = {
  321. srcContentId: this.detail.srcContentId,
  322. postNickName: this.detail.postBizData.postUserInfo.nickName
  323. };
  324. Cookies.set('pickup_info', JSON.stringify(pickupInfo), { expires: 100 });
  325. }
  326. },
  327. async asyncData(params) {
  328. let { route } = params;
  329. let { data } = await axios.post(`${baseURL}/denet/post/getDetail`, {
  330. baseInfo: {
  331. mid: function () {
  332. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
  333. var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
  334. return v.toString(16);
  335. });
  336. }()
  337. },
  338. params: {
  339. postId: route.params.id || ''
  340. }
  341. })
  342. if (data.code == 0) {
  343. if (data.data && data.data.postBizData && typeof data.data.postBizData == 'string') {
  344. data.data.postBizData = JSON.parse(data.data.postBizData)
  345. }
  346. return {
  347. detail: data.data,
  348. }
  349. }
  350. },
  351. mounted() {
  352. if (!this.detail.postId) {
  353. return
  354. }
  355. //改变font-size
  356. (function (doc, win) {
  357. var docEI = doc.documentElement,
  358. resizeEvt = 'orientationchange' in window ? 'orientataionchange' : 'resize',
  359. recalc = function () {
  360. var clientWidth = docEI.clientWidth;
  361. if (!clientWidth) return;
  362. //100是字体大小,1510是开发时浏览器窗口的宽度,等比计算
  363. docEI.style.fontSize = 10 * (clientWidth / 1510) + 'px';
  364. }
  365. if (!doc.addEventListener) return;
  366. win.addEventListener(resizeEvt, recalc, false);
  367. doc.addEventListener('DOMContentLoaded', recalc, false);
  368. })(document, window);
  369. if (isBrowser() == 'chrome') {
  370. // 领取任务红包
  371. this.setCookieMid()
  372. this.getRedPacket()
  373. this.setPickupInfo()
  374. } else {
  375. this.home_show = true
  376. this.status = 'no-chrome'
  377. }
  378. }
  379. }
  380. </script>
  381. <style lang="scss" >
  382. html,
  383. body,
  384. #__nuxt,
  385. #__layout {
  386. width: 100%;
  387. height: 100%;
  388. padding: 0;
  389. margin: 0;
  390. }
  391. .content {
  392. width: 100%;
  393. height: 100%;
  394. background-size: 100%;
  395. background-repeat: no-repeat;
  396. position: relative;
  397. font-family: "SF Pro Display";
  398. font-style: normal;
  399. font-weight: 600;
  400. .not-open {
  401. display: flex;
  402. align-items: center;
  403. justify-content: center;
  404. width: 100%;
  405. height: 100%;
  406. img {
  407. width: 20rem;
  408. height: 20rem;
  409. }
  410. }
  411. .logo {
  412. position: absolute;
  413. left: 4rem;
  414. top: 1.5rem;
  415. img {
  416. width: 10.7rem;
  417. height: 4rem;
  418. }
  419. }
  420. .key_packet {
  421. animation: key_packet 3s;
  422. animation-delay: 0s;
  423. animation-fill-mode: forwards;
  424. }
  425. .redPacket {
  426. display: flex;
  427. justify-content: flex-start;
  428. flex-direction: column;
  429. position: absolute;
  430. top: 9rem;
  431. left: 50%;
  432. width: 37.5rem;
  433. margin-left: -18rem;
  434. height: 65rem;
  435. border-radius: 2rem;
  436. // background: red;
  437. overflow: hidden;
  438. box-shadow: 0 0 5px #888888;
  439. background: #fff;
  440. .top {
  441. top: 0;
  442. position: absolute;
  443. width: 100%;
  444. z-index: 12;
  445. }
  446. .down {
  447. bottom: 0;
  448. position: absolute;
  449. height: 32.3rem;
  450. z-index: 11;
  451. }
  452. .head {
  453. position: relative;
  454. .head-title {
  455. position: absolute;
  456. top: 0;
  457. width: 100%;
  458. display: flex;
  459. align-items: center;
  460. justify-content: center;
  461. height: 3.6rem;
  462. background: rgba(255, 255, 255, .1);
  463. img {
  464. width: 1.8rem;
  465. height: 1.8rem;
  466. border-radius: 50%;
  467. border: 1px solid #fff;
  468. }
  469. span {
  470. margin-left: .8rem;
  471. font-size: 1.2rem;
  472. color: #fff;
  473. }
  474. }
  475. .head-txt {
  476. margin-top: 4.7rem;
  477. font-size: 2rem;
  478. text-align: center;
  479. color: #fff;
  480. }
  481. .head-area {
  482. height: 19rem;
  483. text-align: center;
  484. letter-spacing: 0.3px;
  485. font-size: 2rem;
  486. text-align: center;
  487. color: #fff;
  488. background: #389AFF;
  489. border-radius: 0 586px 586px/0 0 104px 104px;
  490. .txt {
  491. padding-top: 8.5rem;
  492. }
  493. }
  494. .head-money {
  495. .txt {
  496. padding-top: 6.8rem;
  497. font-weight: 800;
  498. font-size: 1.5rem;
  499. text-align: center;
  500. letter-spacing: 0.3px;
  501. }
  502. .head-money-area {
  503. display: flex;
  504. width: 100%;
  505. justify-content: center;
  506. align-items: center;
  507. img {
  508. width: 4rem;
  509. height: 4rem;
  510. border: 2px solid #FFFFFF;
  511. border-radius: 100px;
  512. }
  513. span {
  514. margin-left: 1.3rem;
  515. font-size: 4.6rem;
  516. }
  517. }
  518. }
  519. }
  520. .luck-list-title {
  521. /* margin-top: 47px;*/
  522. margin: 0 16px;
  523. padding: 14px 0 11px 0;
  524. background: #fff;
  525. display: flex;
  526. justify-content: space-between;
  527. color: #B0B0B0;
  528. border-bottom: 1px solid #D1D1D1;
  529. }
  530. .luck-list {
  531. background: #fff;
  532. overflow: auto;
  533. .luck-item {
  534. display: flex;
  535. padding: 12px 0;
  536. margin: 0 16px;
  537. border-bottom: 1px solid #d1d1d1;
  538. justify-content: space-between;
  539. position: relative;
  540. img:first-child {
  541. border-radius: 50%;
  542. }
  543. .luck-king {
  544. position: absolute;
  545. top: 36px;
  546. right: 0px;
  547. display: flex;
  548. align-items: center;
  549. img {
  550. width: 22px;
  551. height: 19px;
  552. margin: 0;
  553. }
  554. span {
  555. font-weight: 500;
  556. font-size: 12px;
  557. line-height: 14px;
  558. letter-spacing: 0.3px;
  559. color: #f5b945;
  560. }
  561. }
  562. img {
  563. width: 42px;
  564. height: 42px;
  565. margin-right: 12px;
  566. }
  567. .luck-content {
  568. flex: auto;
  569. .luck-title {
  570. font-weight: 500;
  571. font-size: 16px;
  572. letter-spacing: 0.3px;
  573. color: #444444;
  574. }
  575. .luck-time {
  576. font-weight: 400;
  577. font-size: 12px;
  578. line-height: 14px;
  579. color: #9b9b9b;
  580. }
  581. }
  582. .luck-money {
  583. display: flex;
  584. height: 17px;
  585. align-items: center;
  586. img {
  587. width: 14px;
  588. height: 14px;
  589. margin-right: 6px;
  590. }
  591. .luck-money-txt {
  592. font-weight: 500;
  593. font-size: 14px;
  594. /* identical to box height */
  595. text-align: right;
  596. letter-spacing: 0.3px;
  597. color: #444444;
  598. }
  599. }
  600. }
  601. .luck-item:last-child {
  602. border: 0;
  603. }
  604. }
  605. .area {
  606. position: absolute;
  607. z-index: 112;
  608. width: 100%;
  609. .title {
  610. z-index: 11;
  611. margin-top: 8.5rem;
  612. text-align: center;
  613. img {
  614. width: 3.6rem;
  615. height: 3.6rem;
  616. border: 2px solid #fff4db;
  617. border-radius: 50%;
  618. }
  619. span {
  620. letter-spacing: 0.3px;
  621. font-size: 1.6rem;
  622. color: #fff2d3;
  623. }
  624. }
  625. .txt {
  626. font-size: 4rem;
  627. text-align: center;
  628. letter-spacing: 0.03rem;
  629. color: #fff2d3;
  630. }
  631. }
  632. .key_area {
  633. animation: key_area 1s;
  634. animation-delay: 1s;
  635. animation-fill-mode: forwards;
  636. }
  637. }
  638. .redPacket2 {
  639. left: 30.6rem;
  640. margin-left: -18rem;
  641. }
  642. .key_install {
  643. opacity: 0;
  644. animation: key_install 2s;
  645. animation-delay: 0s;
  646. animation-fill-mode: forwards;
  647. }
  648. .install {
  649. position: absolute;
  650. top: 20rem;
  651. left: 78.5rem;
  652. .title {
  653. font-size: 4.8rem;
  654. color: #000000;
  655. letter-spacing: 0.3px;
  656. }
  657. .validity {
  658. margin-top: 1rem;
  659. color: #FF0000;
  660. width: 40rem;
  661. height: 3.3rem;
  662. line-height: 3.3rem;
  663. span {
  664. font-size: 1.4rem;
  665. }
  666. }
  667. .flow {
  668. position: absolute;
  669. margin-top: 4rem;
  670. .line {
  671. position: absolute;
  672. height: 16rem;
  673. border: 1px solid #e0e0e0;
  674. top: 3rem;
  675. left: 1.2rem;
  676. }
  677. .area_num {
  678. display: flex;
  679. align-items: center;
  680. .num {
  681. width: 2.4rem;
  682. height: 2.4rem;
  683. background-color: rgba(56, 154, 255, 1);
  684. border-radius: 50%;
  685. color: #fff;
  686. text-align: center;
  687. line-height: 2.4rem;
  688. font-size: 1.4rem;
  689. }
  690. span {
  691. margin-left: 1.5rem;
  692. color: #000000;
  693. font-size: 1.8rem;
  694. }
  695. }
  696. .tip {
  697. margin-left: 4rem;
  698. margin-top: 0.7rem;
  699. font-size: 1.4rem;
  700. color: #a4a4a4;
  701. }
  702. .install_btn {
  703. cursor: pointer;
  704. margin-left: 4rem;
  705. margin-top: 2rem;
  706. margin-bottom: 6.7rem;
  707. width: 23rem;
  708. height: 5.8rem;
  709. background: #389aff;
  710. border-radius: 10rem;
  711. color: #fff;
  712. line-height: 5.8rem;
  713. text-align: center;
  714. font-size: 2rem;
  715. }
  716. }
  717. .tip {
  718. margin-top: 0.7rem;
  719. font-size: 1.4rem;
  720. color: #a4a4a4;
  721. }
  722. .install_btn {
  723. cursor: pointer;
  724. margin-top: 2rem;
  725. margin-bottom: 6.7rem;
  726. width: 23rem;
  727. height: 5.8rem;
  728. background: #389aff;
  729. border-radius: 10rem;
  730. color: #fff;
  731. line-height: 5.8rem;
  732. text-align: center;
  733. font-size: 2rem;
  734. }
  735. }
  736. .install-error {
  737. left: 78.5rem;
  738. .install_chrome {
  739. cursor: pointer;
  740. width: 24.3rem;
  741. height: 5.8rem;
  742. font-size: 2rem;
  743. font-weight: 500;
  744. letter-spacing: 0.3px;
  745. display: flex;
  746. align-items: center;
  747. background: #FFFFFF;
  748. border: 1px solid #e8e8e8;
  749. border-radius: 10rem;
  750. margin-top: 3.3rem;
  751. img {
  752. width: 3.2rem;
  753. height: 3.2rem;
  754. margin-left: 3.3rem;
  755. }
  756. span {
  757. margin-left: 1.2rem;
  758. }
  759. }
  760. }
  761. }
  762. @keyframes key_area {
  763. 0% {
  764. opacity: 1;
  765. }
  766. 100% {
  767. opacity: 0;
  768. }
  769. }
  770. @keyframes key_install {
  771. 0% {
  772. opacity: 0;
  773. }
  774. 100% {
  775. opacity: 1;
  776. }
  777. }
  778. @keyframes key_packet {
  779. 0% {}
  780. 100% {
  781. left: 30.6rem;
  782. margin-left: -18rem;
  783. }
  784. }
  785. </style>