status.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. <template>
  2. <view class="container">
  3. <view style=";position: relative;height: 250px;margin-top:2vh;">
  4. <view class="dtop">
  5. <view class="can" style="background-image: url(/static/images/new/quan.png);">
  6. <view class="box">
  7. <!--view class="top_ball one"></view-->
  8. <!--view class="top_ball two"></view-->
  9. <view class="three">
  10. <view class="four"></view>
  11. <view class="five"></view>
  12. <view class="six"></view>
  13. </view>
  14. <view class="dot"></view>
  15. <view class="dot"></view>
  16. <view class="dot"></view>
  17. <view class="dot"></view>
  18. <view class="dot"></view>
  19. </view>
  20. <!-- <canvas id="c">-->
  21. <!-- </canvas>-->
  22. <view class="stip">
  23. <view class="p0" st="">{{ deviceInfo.qrcode}}</view>
  24. <view class="p1">
  25. <view v-if="portDetail.portStatus == 2">
  26. {{$t('charge.charging')}}
  27. </view>
  28. <view v-else-if="portDetail.portStatus == 6">
  29. {{$t('charge.planed')}}
  30. </view>
  31. <view v-else-if="portDetail.portStatus == 5">
  32. {{$t('charge.connected')}}
  33. </view>
  34. <view v-else>
  35. {{$t('charge.nocharge')}}
  36. </view>
  37. </view>
  38. </view>
  39. </view>
  40. </view>
  41. </view>
  42. <view class="dstatus">
  43. <view class="ditem">
  44. <image class="itemimg" src="/static/images/new/tmp.png"/>
  45. <view class="item-value">{{portDetail.dev_temper}}℃</view>
  46. <span class="item-text">{{$t('charge.devtemper')}}</span>
  47. </view>
  48. <view class="ditem">
  49. <image class="itemimg" src="/static/images/new/dianya.png"/>
  50. <view class="item-value">{{ portDetail.voltage }}V</view>
  51. <span class="item-text">{{$t('charge.voltage')}}</span>
  52. </view>
  53. <view class="ditem">
  54. <image class="itemimg" src="/static/images/new/dianliu.png"/>
  55. <view class="item-value" v-if="portDetail.voltage == 0">0A</view>
  56. <view class="item-value" v-else>{{portDetail.POWER/portDetail.voltage}}A</view>
  57. <span class="item-text">{{$t('charge.current')}}</span>
  58. </view>
  59. <view class="ditem">
  60. <image class="itemimg" src="/static/images/new/shjian.png"/>
  61. <view class="item-value">{{ portDetail.time }}{{ i18('分钟') }}</view>
  62. <span class="item-text">{{$t('charge.chargetime')}}</span>
  63. </view>
  64. <view class="ditem">
  65. <image class="itemimg" src="/static/images/new/gonglv.png"/>
  66. <view class="item-value">{{ portDetail.power }}W</view>
  67. <span class="item-text">{{$t('charge.power')}}</span>
  68. </view>
  69. <view class="ditem">
  70. <image class="itemimg" src="/static/images/new/dianliang.png"/>
  71. <view class="item-value">{{ portDetail.elec }} {{ i18('度') }}</view>
  72. <span class="item-text">{{$t('charge.elec')}}</span>
  73. </view>
  74. </view>
  75. <view class="dbtns">
  76. <view class="start" @click="toPage">
  77. <image style="width:25px;height: 25px;margin-right: 5px;" src="/static/images/new/start.png"/>
  78. <span>{{$t('charge.startcharge')}}</span>
  79. </view>
  80. <view class="get" @click="getInfo">
  81. <image style="width:25px;height: 25px;margin-right: 5px;" src="/static/images/new/get.png"/>
  82. <span>{{$t('charge.getinfo')}}</span>
  83. </view>
  84. </view>
  85. <view class="dtip">
  86. <view style="margin:10px 0px;color: #1A87FF;"><img style="width: 13px;height: 13px" src="/static/images/new/tip.png">{{i18('温馨提示')}}</view>
  87. <view>1,{{i18('桩控制最大输出电流,当功率没有达到请检查车的状态或者车的设置')}};</view>
  88. <view>2,{{i18('启动充电-&gt;设备管理->可设置设备最大输出电流')}}</view>
  89. <view>3,{{i18('为保障您远程启动正常充电,请确保枪头完全连接充电口,同时确认您的爱车处于立即充电状态下')}};</view>
  90. <view>4,{{i18('注意规范安全充电,停好车,锁好车。')}}</view>
  91. </view>
  92. </view>
  93. </template>
  94. <script>
  95. import {getDeviceInfo,getPortDetail,startCharge,stopCharge,sendPortDetailCmd,checkStatusChange,getPlanInfo,cancelPlan} from "@/api/device/device";
  96. import websocket from '@/utils/websocket'
  97. import i18 from '@/utils/i18.js'
  98. export default {
  99. data() {
  100. return {
  101. deviceInfo:{},
  102. visitTime:"",
  103. timer:null,
  104. showPort:false,
  105. portDetail:{portStatus:0,POWER:0,voltage:0},
  106. statusTimer:"",
  107. connected:false,
  108. scriptTask:null,
  109. choosePort:1,
  110. portList:[[{port:1,text:"端口一"}]],
  111. planInfo:null,
  112. days:["","周一","周二","周三","周四","周五","周六","周日"]
  113. }
  114. },
  115. computed: {
  116. imgUrl() {
  117. return getApp().globalData.config.imgUrl;
  118. }
  119. },
  120. onLoad(opt) {
  121. this.deviceInfo.deviceId = opt.id;
  122. this.deviceInfo.ccid = opt.ccid;
  123. this.deviceInfo.qrcode = opt.qrcode;
  124. },
  125. onShow(){
  126. this.getInfo();
  127. this.getPlanInfo();
  128. },
  129. onUnload (){
  130. this.closeSocket();
  131. },
  132. methods: {
  133. toPage(){
  134. let imei = this.deviceInfo.deviceId;
  135. let ccid = this.deviceInfo.ccid;
  136. this.closeSocket();
  137. uni.navigateTo({
  138. url: '/pages/weitiandi/device/index?id='+imei+'&ccid='+ccid
  139. });
  140. },
  141. i18(text){
  142. return i18(text)
  143. },
  144. planCharge(){
  145. if(this.planInfo != null){
  146. this.$modal.confirm("确认取消预约?").then(res=>{
  147. this.cancelPlan();
  148. })
  149. }else{
  150. this.toPlan()
  151. }
  152. },
  153. cancelPlan(){
  154. cancelPlan(this.planInfo.id).then(res=>{
  155. this.$modal.msg("取消成功");
  156. this.planInfo = null;
  157. this.getPlanInfo();
  158. })
  159. },
  160. getPlanInfo(){
  161. getPlanInfo(this.deviceInfo.deviceId,this.choosePort).then(res=>{
  162. let data = res.data;
  163. if(data != null){
  164. let planType = data.planType;
  165. if(planType == 1){//单次预约
  166. let planInfo = {};
  167. planInfo.runTime = data.runTime;
  168. this.planInfo = planInfo;
  169. this.planInfo.id = data.id;
  170. }else{
  171. let planInfo = {};
  172. planInfo.runTime = data.runTime;
  173. let repeatDays = data.repeatDays;
  174. let days = repeatDays.split(",")
  175. let strs = "";
  176. for (let i = 0; i < days.length; i++) {
  177. if(strs.length>0){
  178. strs+=",";
  179. }
  180. strs +=this.days[days[i]];
  181. }
  182. this.planInfo = planInfo;
  183. this.planInfo.runTime = strs+" "+data.repeatTime;
  184. this.planInfo.id = data.id;
  185. }
  186. }
  187. })
  188. },
  189. confirmPort(e){
  190. let value = e.value[0]
  191. this.choosePort = value.port;
  192. this.showPort = false;
  193. this.getInfo()
  194. },
  195. initSocket(key){
  196. let self = this;
  197. let socketUrl = getApp().globalData.config.socketUrl
  198. this.scriptTask = websocket({
  199. url:"/"+key+"/",
  200. });
  201. let scriptTask = this.scriptTask;
  202. scriptTask.onOpen(function (res) {
  203. console.log('WebSocket连接已打开!');
  204. self.connected = true;
  205. });
  206. scriptTask.onError(function (res) {
  207. self.connected = false;
  208. console.log(res);
  209. });
  210. scriptTask.onMessage(function (res) {
  211. let data = JSON.parse(res.data);
  212. let type = data.type;
  213. let real_data = data.real_data;
  214. if(type == 103){
  215. self.portDetail = real_data
  216. self.portList = [[]];
  217. let port_first_status = self.portDetail["port_first_status"];
  218. let port_second_status = self.portDetail["port_second_status"]
  219. if(port_first_status){
  220. self.portList[0].push({port:1,text:"端口一"});
  221. }
  222. if(port_second_status){
  223. self.portList[0].push({port:2,text:"端口二"});
  224. }
  225. let choosePort = self.choosePort
  226. if(choosePort == 1){
  227. self.portDetail.portStatus = port_first_status;
  228. }else if(choosePort == 2){
  229. self.portDetail.portStatus = port_second_status;
  230. }
  231. self.$modal.closeLoading();
  232. }
  233. if(type == 116){
  234. self.$modal.closeLoading();
  235. self.getInfo();
  236. }
  237. if(type == 113){
  238. self.$modal.closeLoading();
  239. self.getInfo();
  240. }
  241. if(type == 96){
  242. self.mainBoardInfo = real_data;
  243. self.formatMainboardData();
  244. self.$modal.closeLoading();
  245. }
  246. self.$forceUpdate();
  247. console.log('收到服务器内容:' + JSON.stringify(data));
  248. });
  249. scriptTask.onClose(function (res) {
  250. console.log('WebSocket 已关闭!');
  251. });
  252. },
  253. toSet(){
  254. this.closeSocket();
  255. uni.navigateTo({
  256. url: '/pages/weitiandi/device/setting?id='+this.deviceInfo.deviceId+"&ccid="+this.deviceInfo.ccid
  257. });
  258. },
  259. toPlan(){
  260. uni.navigateTo({
  261. url: '/pages/weitiandi/device/plan?port='+this.choosePort+'&id='+this.deviceInfo.deviceId+"&ccid="+this.deviceInfo.ccid
  262. });
  263. },
  264. trigger(){
  265. let portStatus = this.portDetail.portStatus;
  266. if(portStatus == 2){//需要停止充电
  267. this.$modal.confirm("需要停止充电么?").then(res=>{
  268. this.stopCharge();
  269. })
  270. }else{
  271. if(portStatus == 1){
  272. this.$modal.msg("请先将充电枪插入后再点击充电");
  273. }
  274. if(portStatus == 5){
  275. this.$modal.confirm("确认开始充电么?").then(res=>{
  276. this.startCharge();
  277. })
  278. }
  279. }
  280. },
  281. getInfo() {
  282. this.$modal.loading("正在获取状态,请稍等...");
  283. sendPortDetailCmd(this.deviceInfo).then(res => {
  284. this.$modal.loading("正在获取状态,请稍等...");
  285. this.visitTime = res.msg;
  286. if(!this.visitTime){
  287. this.$modal.msg("请重新进入页面");
  288. return;
  289. }
  290. if(!this.scriptTask){
  291. this.initSocket(this.deviceInfo.deviceId);
  292. }
  293. // this.getPortInfo()
  294. })
  295. },
  296. stopCharge(){
  297. let self = this;
  298. this.deviceInfo.port = this.choosePort;
  299. stopCharge(this.deviceInfo).then(()=>{
  300. self.$modal.loading("停止成功");
  301. setTimeout((()=>{
  302. self.getInfo();
  303. }),1000);
  304. })
  305. },
  306. startCharge(){
  307. let self = this;
  308. this.deviceInfo.port = this.choosePort;
  309. startCharge(this.deviceInfo).then(res=>{
  310. self.$modal.loading("启动成功");
  311. setTimeout((()=>{
  312. self.getInfo();
  313. }),1000);
  314. })
  315. },
  316. getPortInfo(){
  317. this.startPortDetailTimer();
  318. },
  319. startPortDetailTimer(){
  320. let self = this;
  321. this.timer = setTimeout(function (){
  322. getPortDetail(self.deviceInfo,self.visitTime).then(res=>{
  323. let data = res.data;
  324. if(data != null){
  325. self.portDetail = data;
  326. self.checkStatusCheck();
  327. self.$modal.closeLoading();
  328. }else{
  329. self.startPortDetailTimer();
  330. }
  331. });
  332. },1000);
  333. },
  334. checkStatusCheck(){
  335. this.statusChangeTimer();
  336. },
  337. checkOnPage(){
  338. var pages = getCurrentPages() // 获取栈实例
  339. let currentRoute = pages[pages.length - 1].route; // 获取当前页面路由
  340. if("pages/weitiandi/device/index" != currentRoute){
  341. return false;
  342. }
  343. return true;
  344. },
  345. closeSocket(){
  346. this.scriptTask.close();
  347. this.scriptTask = null;
  348. },
  349. statusChangeTimer(){
  350. let self = this;
  351. this.statusTimer = setTimeout(function(){
  352. if(!this.checkOnPage()){
  353. return;
  354. }
  355. checkStatusChange(self.deviceInfo,self.visitTime).then(res=>{
  356. let data = res.data;
  357. if(data != null){
  358. self.getInfo();
  359. }else{
  360. self.statusChangeTimer();
  361. }
  362. });
  363. },3000);
  364. }
  365. }
  366. }
  367. </script>
  368. <style>
  369. .container {
  370. background: rgb(249, 252, 255);
  371. inset: 0;
  372. position: absolute;
  373. }
  374. .header {
  375. position: relative;
  376. margin-top:4vw;
  377. }
  378. .header-status-desc {
  379. position: absolute;
  380. text-align: center;
  381. width: 100%;
  382. bottom:1vh;
  383. font-size: 5vw;
  384. font-weight: bold;
  385. color: #0E9F9B;
  386. margin-bottom: 5vw;
  387. }
  388. .header-status {
  389. font-weight: bold;
  390. text-align: center;
  391. }
  392. .chong-active {
  393. color: #0E9F9B
  394. }
  395. .header-img {
  396. width: 100%;
  397. padding: 5% 10%;
  398. text-align: center;
  399. }
  400. .header-img image {
  401. width: 100%;
  402. height: 23vh;
  403. }
  404. .info-body{
  405. background: #0E9F9B;
  406. height: 20vh;
  407. margin: 0 2%;
  408. border-radius: 1vw;
  409. margin-top:2vh;
  410. color: #F8FCFF;
  411. line-height: 3vh;
  412. }
  413. .info-content{
  414. display: inline-block;
  415. width: 23%;
  416. text-align: center;
  417. margin: 1%;
  418. margin-top:2.5vh;
  419. }
  420. .info-content-value{
  421. font-weight: bold;
  422. }
  423. .info-content-text{
  424. }
  425. .info-summary{
  426. display: flex;
  427. flex-direction: row;
  428. text-align: center;
  429. margin:3vh 0;
  430. }
  431. .summary{
  432. width: 33%;
  433. line-height: 2.5vh;
  434. }
  435. .charge-num{
  436. color: #0E9F9B;
  437. font-weight: bold;
  438. font-size: 4.5vw;
  439. }
  440. .charge-title{
  441. color: #B2B2B2;
  442. font-weight: 400;
  443. }
  444. .btn-image{
  445. width: 90%;
  446. height: 100%;
  447. }
  448. .info-bottom-btn{
  449. display: flex;
  450. flex-direction: row;
  451. text-align: center;
  452. position: relative;
  453. margin-top: 10vh
  454. ;
  455. }
  456. .btn-area{
  457. width: 50%;
  458. height: 50px;
  459. }
  460. .left{
  461. position: relative;
  462. left: 10px;
  463. text-align: right;
  464. }
  465. .right{
  466. text-align: left;
  467. position: relative;
  468. right: 10px;
  469. }
  470. .info-plan{
  471. text-align: center;
  472. color: #0E9F9B;
  473. margin-top:1vh;
  474. font-weight: 400;
  475. }
  476. .setting{
  477. position: fixed;
  478. right: -1px;
  479. top: 10vh;
  480. z-index: 999;
  481. background: rgb(227,243,245);
  482. color: #0E9F9B;
  483. font-size: 10px;
  484. border-radius: 5px;
  485. padding: 3px;
  486. }
  487. .port{
  488. height: 70px;
  489. background: #F8FCFF;
  490. border: 0px solid #F8FCFF;
  491. box-shadow: 0px 0px 6px 1px rgba(101,101,101,0.29);
  492. border-radius: 4px;
  493. margin:0 10px;
  494. position: relative;
  495. margin-top:10px;
  496. }
  497. .plan{
  498. height: 70px;
  499. background: #F8FCFF;
  500. border: 0px solid #F8FCFF;
  501. box-shadow: 0px 0px 6px 1px rgba(101,101,101,0.29);
  502. border-radius: 4px;
  503. margin:0 10px;
  504. position: relative;
  505. margin-top:15px;
  506. }
  507. .port-image{
  508. height: 40px;
  509. width: 40px;
  510. position: absolute;
  511. top:15px;
  512. left:20px;
  513. }
  514. .port-text{
  515. position: absolute;
  516. top:13px;
  517. left:75px;
  518. font-weight: bold;
  519. }
  520. .port-num{
  521. position: absolute;
  522. top:38px;
  523. left:75px;
  524. color: #B2B2B2;
  525. }
  526. .port-icon{
  527. position: absolute;
  528. top:30px;
  529. right:5px;
  530. width: 10px;
  531. height: 16px;
  532. }
  533. .port-icon image{
  534. width: 90%;
  535. }
  536. .body-bottom{
  537. padding:0 22px;
  538. }
  539. .body-bottom .info-content{
  540. width: 30%;
  541. }
  542. .bottom-control{
  543. height: 22vh;
  544. margin: 0 2%;
  545. margin-top:2vh;
  546. line-height: 3vh;
  547. background: #F8FCFF;
  548. border: 0px solid #F8FCFF;
  549. box-shadow: 0px 0px 6px 1px rgba(101,101,101,0.29);
  550. border-radius: 4px;
  551. padding:3%;
  552. }
  553. .control-btn{
  554. display: inline-block;;
  555. height: 60px;
  556. width: 25%;
  557. padding:10px 20px;
  558. text-align: center;
  559. font-size: 12px;
  560. color: black;
  561. }
  562. .control-btn .btn-image{
  563. }
  564. #box {
  565. /* width: 300px; */
  566. height: 280px;
  567. position: relative;
  568. /* 背景色 */
  569. /* background: #f7f6f6; */
  570. overflow: hidden;
  571. /* padding: 50px 0; */
  572. box-sizing: border-box;
  573. ;
  574. }
  575. .box {
  576. width: 100%;
  577. height: 100%;
  578. position: absolute;
  579. display: flex;
  580. justify-content: center;
  581. /* 此处尽量不要设置背景色,可以选择在父标签上设置背景色,否则没有黏黏的效果 */
  582. filter: url("#goo");
  583. }
  584. /* 电量文字 */
  585. .text {
  586. font-weight: 200;
  587. font-size: 20px;
  588. margin-top: 5px;
  589. text-align: center;
  590. color: #ff6600;
  591. }
  592. /* 电量文字 */
  593. .text span {
  594. font-size: 15px;
  595. }
  596. /* 顶部的两个旋转小球 */
  597. .top_ball {
  598. width: 200px;
  599. height: 200px;
  600. border-radius: 35%;
  601. opacity: 0.5;
  602. position: absolute;
  603. top: 20px;
  604. z-index: 10;
  605. /* 从中心向外剪切圆,相当于掏空 */
  606. -webkit-mask: radial-gradient(transparent 95px, white 0px);
  607. }
  608. /* 顶部的两个旋转小球 */
  609. .top_ball.one {
  610. background: var(--c);
  611. animation: ballZhuan 5s linear infinite;
  612. }
  613. /* 顶部的两个旋转小球 */
  614. .top_ball.two {
  615. background: var(--c);
  616. animation: ballZhuan 8s linear infinite;
  617. }
  618. .three {
  619. width: 170px;
  620. height: 170px;
  621. border-radius: 300px;
  622. opacity: 1;
  623. position: absolute;
  624. top: 20px;
  625. z-index: 10;
  626. /* 从中心向外剪切圆,相当于掏空 */
  627. /* -webkit-mask: radial-gradient(transparent 95px, white 0px); */
  628. background: #ffffff;
  629. /* animation: ballZhuan 9s linear infinite; */
  630. overflow: hidden;
  631. box-shadow: 0px 0px 19px 1px #2196f3;
  632. }
  633. .four {
  634. width: 200px;
  635. height: 200px;
  636. border-radius: 80px;
  637. opacity: 0.3;
  638. position: absolute;
  639. top: 10px;
  640. z-index: 10;
  641. /* 从中心向外剪切圆,相当于掏空 */
  642. /* -webkit-mask: radial-gradient(transparent 95px, white 0px); */
  643. background: #2196f3;
  644. animation: ballZhuan1 linear infinite;
  645. animation-duration: 11s;
  646. }
  647. .five {
  648. width: 270px;
  649. height: 270px;
  650. border-radius: 99px;
  651. opacity: 0.6;
  652. position: absolute;
  653. top: 30px;
  654. z-index: 10;
  655. /* 从中心向外剪切圆,相当于掏空 */
  656. /* -webkit-mask: radial-gradient(transparent 95px, white 0px); */
  657. background: #2196f3;
  658. animation: ballZhuan1 linear infinite;
  659. /* transform: rotate(120deg); */
  660. animation-duration: 9s;
  661. left: -67px;
  662. }
  663. .six {
  664. width: 270px;
  665. height: 270px;
  666. border-radius: 99px;
  667. opacity: 0.6;
  668. position: absolute;
  669. top:30px;
  670. z-index: 10;
  671. /* 从中心向外剪切圆,相当于掏空 */
  672. /* -webkit-mask: radial-gradient(transparent 95px, white 0px); */
  673. background: #2196f3;
  674. animation: ballZhuan1 7s linear infinite;
  675. /* transform: rotate(120deg); */
  676. right: -67px;
  677. }
  678. @keyframes ballZhuan {
  679. 100% {
  680. transform: rotate(360deg);
  681. }
  682. }
  683. @keyframes ballZhuan1 {
  684. 100% {
  685. transform: rotate(360deg);
  686. }
  687. }
  688. /* 底部的小球 */
  689. .dot {
  690. display: block;
  691. width: 20px;
  692. height: 20px;
  693. border-radius: 50%;
  694. background: rgba(101,192,255,0.28);
  695. position: absolute;
  696. z-index: 1000;
  697. bottom: -50px;
  698. }
  699. .dot:nth-of-type(1) {
  700. width: 40px;
  701. height: 40px;
  702. right: 116px;
  703. animation: dotMove 5s linear infinite;
  704. }
  705. .dot:nth-of-type(2) {
  706. width: 50px;
  707. height: 50px;
  708. left: 120px;
  709. animation: dotMove 4s linear infinite;
  710. }
  711. .dot:nth-of-type(3) {
  712. animation: dotMove 2s linear infinite;
  713. }
  714. .dot:nth-of-type(4) {
  715. width: 15px;
  716. height: 15px;
  717. left: 130px;
  718. animation: dotMove 2s linear infinite;
  719. }
  720. .dot:nth-of-type(5) {
  721. width: 30px;
  722. height: 30px;
  723. animation: dotMove 3s linear infinite;
  724. }
  725. @keyframes dotMove {
  726. 0% {
  727. transform: translateY(0px);
  728. opacity: 1;
  729. }
  730. 98% {
  731. opacity: 1;
  732. }
  733. 100% {
  734. transform: translateY(-260px);
  735. opacity: 0;
  736. }
  737. }
  738. .w-flex {
  739. display: -webkit-box;
  740. display: -webkit-flex;
  741. display: flex;
  742. padding: 0px 25px;
  743. }
  744. .w-flex__item {
  745. -webkit-box-flex: 1;
  746. -webkit-flex: 1;
  747. flex: 1;
  748. }
  749. .w-item{
  750. text-align: center;
  751. padding: 5px;
  752. }
  753. .w-item-tit{
  754. font-size: 14px;
  755. color: #888;
  756. }
  757. .w-item-num{
  758. font-size: 18px;
  759. color: #111;
  760. }
  761. .can{
  762. position: relative;
  763. z-index: 0;
  764. width: 211px;
  765. height: 211px;
  766. background-size: cover;
  767. display: flex;
  768. justify-content: center;
  769. align-items: center;
  770. }
  771. .dtop{
  772. background: url(/static/images/new/box1.png);
  773. background-size: cover;
  774. width: 260px;
  775. height: 236px;
  776. display: flex;
  777. justify-content: center;
  778. align-items: center;
  779. left: 15%;
  780. position: relative;
  781. }
  782. .dstatus{
  783. margin-top: 0.1rem;
  784. display: flex;
  785. flex-wrap: wrap;
  786. justify-content: space-evenly;
  787. align-content: center;
  788. }
  789. .ditem{
  790. width: 30%;
  791. display: flex;
  792. flex-direction: column;
  793. align-items: center;
  794. margin-bottom: 0.3rem;
  795. margin-top: 10px;
  796. }
  797. .itemimg{
  798. width: 50px;
  799. height: 50px;
  800. }
  801. .item-value{
  802. font-weight: bold;
  803. font-size: 19px;
  804. margin:4px 0;
  805. }
  806. .item-text{
  807. font-size: 13px;
  808. margin:1px 0;
  809. color: #999999;
  810. }
  811. .start{
  812. background: #1A87FF;
  813. color: #fff;
  814. width: 45%;
  815. height: 50px;
  816. min-height: 40px;
  817. border-radius: 50px;
  818. display: flex;
  819. justify-content: center;
  820. align-items: center;
  821. font-size: 20px;
  822. font-weight: bold;
  823. }
  824. .dbtns{
  825. display: flex;
  826. margin-top:10px;
  827. justify-content: space-between;
  828. padding: 0 30px;
  829. }
  830. .get{
  831. background: #fff;
  832. border: 1px solid #1A87FF;
  833. color: #1A87FF;
  834. width: 45%;
  835. height: 50px;
  836. min-height: 40px;
  837. border-radius: 50px;
  838. display: flex;
  839. justify-content: center;
  840. align-items: center;
  841. font-size: 20px;
  842. font-weight: bold;
  843. }
  844. .dtip{
  845. margin: 20px 20px;
  846. padding: 10px;
  847. background: rgba(127,200,251,0.1);
  848. border: 1px solid #7FC8FB;
  849. box-shadow: 0 2px 8px 0 rgba(0,0,0,0.19);
  850. border-radius: 5px;
  851. font-size: 17px;
  852. font-weight: 400;
  853. color: #B8B9BA;
  854. margin-bottom: 10px;
  855. }
  856. .p1{
  857. font-size: 20px;
  858. color: white;
  859. font-weight: bold;
  860. margin-top:10px;
  861. }
  862. .stip{
  863. text-align: center;
  864. z-index: 9999;
  865. }
  866. </style>