plan.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. <template>
  2. <view class="nv-work">
  3. <view style="position: fixed;z-index: 99;">
  4. <image class="banner" src="../../static/bg.png"></image>
  5. <picker class="selectTap" mode="selector" :value="pickeIndex" range-key="robotName" :range="robotList"
  6. @change="changePicker">
  7. <view style="flex: 1;display: flex;align-items: center;justify-content: center;">
  8. <text class="icon iconfont icon-jifang" style="font-size: 16px;color: #fff;"></text>
  9. <text class="t1">{{robotName}}</text>
  10. </view>
  11. <uni-icons style="text-align: right;padding-right: 25rpx;" color="#fff" type="bottom" size="16"></uni-icons>
  12. </picker>
  13. <!-- <view class="selectTap" @click="showSelect">
  14. <view style="flex: 1;display: flex;align-items: center;justify-content: center;">
  15. <text class="icon iconfont icon-jifang" style="font-size: 16px;color: #fff;"></text>
  16. <text class="t1">{{robotName}}</text>
  17. </view>
  18. <uni-icons style="text-align: right;padding-right: 25rpx;" color="#fff" type="bottom" size="16"></uni-icons>
  19. </view>
  20. <view :class="[{secHeight:isSelect}]" :style="{height:heiIndex}" class="selcontent">
  21. <view class="vv">
  22. <view class="v1" v-for="(item,index) in robotList" :key="index" @click="changePicker(index)">
  23. <text class="vt1">{{item.robotName}}</text>
  24. </view>
  25. </view>
  26. </view> -->
  27. <view class="nv-header-list">
  28. <view class="h-l-li">
  29. <text class="icon iconfont icon-jizhan-copy-copy-copy"
  30. :style="{color:robotStatus.wifiCom == 1?'#23E274':'#ffffff'}"></text>
  31. <text v-if="robotStatus.wifiCom == 1" class="h-l-li-t">在线</text>
  32. <text v-if="robotStatus.wifiCom != 1" class="h-l-li-t">离线</text>
  33. </view>
  34. <view class="h-l-li" v-if="robotStatus.wifiCom == 1">
  35. <text class="icon iconfont icon-dianchi-gaodianliang"
  36. :style="{color:robotStatus.cap && robotStatus.cap >50 ?'#23E274':'#E8A71C'}"></text>
  37. <text class="h-l-li-t">电量{{robotStatus.cap}}%</text>
  38. </view>
  39. <view class="h-l-li" v-if="robotStatus.wifiCom != 1">
  40. <text class="icon iconfont icon-dianchi-gaodianliang"
  41. style="color:#ffffff"></text>
  42. <text class="h-l-li-t">电量未知</text>
  43. </view>
  44. <view class="h-l-li" v-if="robotStatus.wifiCom == 1">
  45. <text class="icon iconfont icon-weichongdian"
  46. style="color:#ffffff" v-if="!robotStatus.chargingtfStatus"></text>
  47. <text class="icon iconfont icon-dianchi-chongdian"
  48. style="color:#23E274" v-if="robotStatus.chargingtfStatus"></text>
  49. <text class="h-l-li-t" v-if="robotStatus.chargingtfStatus">正在充电</text>
  50. <text class="h-l-li-t" v-if="!robotStatus.chargingtfStatus">未充电</text>
  51. </view>
  52. <view class="h-l-li" v-if="robotStatus.wifiCom != 1">
  53. <text class="icon iconfont icon-dianchi-chongdian"
  54. style="color:#ffffff"></text>
  55. <text class="h-l-li-t">充电未知</text>
  56. </view>
  57. <view class="h-l-li" v-if="robotStatus.wifiCom == 1">
  58. <text class="icon iconfont icon-luzhang"
  59. :style="{color:robotStatus.openRadarStatus == false?'#23E274':'#FB4925'}"></text>
  60. <text v-if="robotStatus.openRadarStatus" class="h-l-li-t">有障碍</text>
  61. <text v-if="!robotStatus.openRadarStatus" class="h-l-li-t">无障碍</text>
  62. </view>
  63. <view class="h-l-li" v-if="robotStatus.wifiCom != 1">
  64. <text class="icon iconfont icon-luzhang"
  65. style="color:#ffffff"></text>
  66. <text class="h-l-li-t">障碍未知</text>
  67. </view>
  68. </view>
  69. <view class="nv-top" elevation="3px">
  70. <view class="left bg1">
  71. <view class="left-l">
  72. <text class="left-l-t1">{{robotStatus.workTime && robotStatus.workTime.toFixed(0) }} <text
  73. class="t1-1">小时</text></text>
  74. <text class="left-l-t2">运行时长</text>
  75. </view>
  76. <view class="left-r icon iconfont icon-gongyezujian-yibiaopan"
  77. style="font-size: 50px;color: #fff;opacity: 0.6;">
  78. </view>
  79. </view>
  80. <view class="left bg2">
  81. <view class="left-l">
  82. <text class="left-l-t1">{{robotStatus.workMile && robotStatus.workMile.toFixed(0)}} <text
  83. class="t1-1">公里</text></text>
  84. <text class="left-l-t2">运行里程</text>
  85. </view>
  86. <view class="left-r icon iconfont icon-lichengduihuanx"
  87. style="font-size: 50px;color: #fff;opacity: 0.6;">
  88. </view>
  89. </view>
  90. </view>
  91. </view>
  92. <view class="nv-list-box">
  93. <scroll-view class='left' scroll-y @scrolltolower="scroll" style="height: calc(100vh - 360rpx);">
  94. <view class="nv-list" elevation="3px" v-for="(item,index) in taskList" :key="index"
  95. :style="{marginTop:index== 0 ? '80rpx' :'0'}">
  96. <view @click="changeType(item)">
  97. <view class="top">
  98. <text class="icon iconfont icon-xunjianguanlix" style="color: #0581FD;"></text>
  99. <text class="t2 ">{{item.taskName}}</text>
  100. </view>
  101. <view class="nv-done" :style="{background:item.taskStatus == 0 ? '#E8A71C' : item.taskStatus == 1 ? '#EA743B' :item.taskStatus == 2?
  102. '#959595' : item.taskStatus == 3 ? '#3FBC4E' :item.taskStatus == 4 ? '#0581FD' :'#5CC2B0' }">
  103. <text class="d-t1">{{taskStatus(item.taskStatus)}}</text>
  104. </view>
  105. </view>
  106. <view class="center">
  107. <view class="c-v0">
  108. <view class="c-v0-d1" @click="jumpDetail(0,item)">
  109. <view class="d1-t">
  110. <text class="icon iconfont icon-xunjianrenwuguanli"
  111. style="color: #5FB23A;font-size: 14px;margin-right:10rpx"></text>
  112. <text>正常点</text>
  113. </view>
  114. <view class="d1-b">
  115. <text style="color: #5FB23A;">{{item.normalPointNum}}</text>
  116. <text class="icon iconfont icon-xiangyoujiantou"
  117. style="color: #B4B4B4;font-size: 12px;"></text>
  118. </view>
  119. </view>
  120. <view class="c-v0-d1" @click="jumpDetail(1,item)">
  121. <view class="d1-t">
  122. <text class="icon iconfont icon-xunjianrenwuguanli"
  123. style="color: #E95C2B;font-size: 14px;margin-right:10rpx"></text>
  124. <text>异常点</text>
  125. </view>
  126. <view class="d1-b">
  127. <text style="color: #E95C2B">{{item.warningPointNum}}</text>
  128. <text class="icon iconfont icon-xiangyoujiantou"
  129. style="color: #B4B4B4;font-size: 12px;"></text>
  130. </view>
  131. </view>
  132. <view class="c-v0-d1">
  133. <view class="d1-t">
  134. <text class="icon iconfont icon-shijian"
  135. style="color: #0581FD;font-size: 14px;margin-right:10rpx"></text>
  136. <text>更新时间</text>
  137. </view>
  138. <view class="d1-b">
  139. <text style="color: #666;font-size: 12px;">{{item.updateTime.substr(5,18)}}</text>
  140. </view>
  141. </view>
  142. </view>
  143. <view :class="[{activeHeight:item.show},{nomalHeight:true}]">
  144. <view class="c-v2">
  145. <view class="v2-1">
  146. <view class="v2-top">
  147. <text class="v2-t1">{{item.startTime.substr(5,18)}}</text>
  148. </view>
  149. <view class="v2-bottom">
  150. <text class="icon iconfont text icon-shijian-"></text>
  151. <text style="color: #31B643;padding-left: 5rpx;" class="text">开始时间</text>
  152. </view>
  153. </view>
  154. <view class="v2-1">
  155. <view class="v2-top">
  156. <text class="v2-t1">{{item.endTime.substr(5,18)}}</text>
  157. </view>
  158. <view class="v2-bottom">
  159. <text style="color: #3F9BF1;" class="icon iconfont text icon-shijian-"></text>
  160. <text style="color: #3F9BF1;padding-left: 5rpx;" class="text">结束时间</text>
  161. </view>
  162. </view>
  163. </view>
  164. <view class="c-v3" style="position: relative;z-index: 2;">
  165. <view class="v3-1">
  166. <text class="v3-1-t1">进度:</text>
  167. <view class="v3-1-1"><text class="v3-1-t2">{{item.checkedPointNum}}</text><text
  168. class="v3-1-t3">/{{item.totalPointNum}}</text></view>
  169. </view>
  170. <ProgressBar :Width="item.taskProgress" Type="aqua" :Vice="false"></ProgressBar>
  171. </view>
  172. </view>
  173. </view>
  174. </view>
  175. <view class="creatView" v-if="noData">
  176. <text class="icon iconfont icon-zanwu"></text>
  177. <text class="tx1">暂无任务</text>
  178. <button class="btn1" type="primary" @click="openDialog">创建任务</button>
  179. </view>
  180. <view class="loadingView" v-if="loading">
  181. <view class="lds-hourglass"></view>
  182. </view>
  183. <view class="empty" v-if="onOff">
  184. <text class="t1">没有更多了...</text>
  185. </view>
  186. <view class="moreView" v-if="!onOff && !loading && !noData">
  187. <view class="lds-ellipsis">
  188. <view></view>
  189. <view></view>
  190. <view></view>
  191. <view></view>
  192. </view>
  193. </view>
  194. </scroll-view>
  195. </view>
  196. <uni-popup ref="popup" :mask-click="false">
  197. <view style="background: #ffffff;">
  198. <text style="padding: 40rpx;padding-top: 60rpx;padding-bottom: 60rpx;font-size: 22rpx;color: #666666;display: block;">无数据,请先关注机器人</text>
  199. <button type="primary" size="mini" @click="confirmGo" style="color: #ffffff;background: #0581FD;border: none;border-radius: 0;display: block;">去关注</button>
  200. </view>
  201. </uni-popup>
  202. </view>
  203. </template>
  204. <script>
  205. import ProgressBar from '@/components/Progress-Bar/Progress-Bar';
  206. import {
  207. BeforeNavigateTo
  208. } from '../../common/utils.js'
  209. import {
  210. mapGetters
  211. } from 'vuex'
  212. import {
  213. getRobotStauts,
  214. currentTask,
  215. getRobotList,
  216. addTask
  217. } from '@/common/api.js'
  218. export default {
  219. data() {
  220. return {
  221. show: true,
  222. robotName: null,
  223. pickeIndex: 0,
  224. loading: true,
  225. robotList: [],
  226. isSelect: false,
  227. robotData: {},
  228. pageIndex: 1,
  229. noData: false,
  230. heiIndex:0,
  231. robotStatus: {
  232. },
  233. taskList: [],
  234. onOff: false
  235. }
  236. },
  237. components: {
  238. ProgressBar,
  239. },
  240. onNavigationBarButtonTap(e) {
  241. uni.navigateTo({
  242. url:'/pages/webview/homeSelect'
  243. })
  244. },
  245. onReady(){
  246. this.getRobot()
  247. },
  248. onShow() {
  249. // console.log("______________________________+++++++++++_____________________")
  250. uni.$off('HpopLog1');
  251. uni.$on('HpopLog1', (data) => {
  252. addTask({
  253. robotId: this.robotData.robotId
  254. }).then(res => {
  255. this.onOff = false
  256. this.loading = true
  257. this.noData = false
  258. this.taskList = []
  259. this.pageIndex = 1
  260. this.currentTask()
  261. }).catch(e => {
  262. console.log(e)
  263. })
  264. });
  265. uni.$off('backhome');
  266. uni.$on("backhome", () => {console.log("plan++++++++++++++++++++++++")
  267. this.onOff = false
  268. this.loading = true
  269. this.noData = false
  270. this.getRobot()
  271. })
  272. },
  273. async onPullDownRefresh() {
  274. this.onOff = false
  275. this.loading = true
  276. this.noData = false
  277. this.taskList = []
  278. this.pageIndex = 1
  279. this.getRobotStauts()
  280. this.currentTask()
  281. setTimeout(() => {
  282. uni.stopPullDownRefresh();
  283. }, 1000);
  284. },
  285. onReachBottom() {
  286. if (this.onOff) {
  287. return
  288. }
  289. ++this.pageIndex
  290. this.currentTask()
  291. },
  292. computed: {
  293. ...mapGetters([
  294. 'Token'
  295. ]),
  296. },
  297. methods: {
  298. scroll(){
  299. if (this.onOff) {
  300. return
  301. }
  302. ++this.pageIndex
  303. this.currentTask()
  304. },
  305. confirmGo(value) {
  306. this.$refs.popup.close()
  307. uni.navigateTo({
  308. url:'/pages/native/robot'
  309. })
  310. },
  311. showSelect() {
  312. let index = this.robotList.length * 70 +60
  313. this.isSelect ? this.heiIndex = `0rpx` :this.heiIndex = `${index}rpx`
  314. this.isSelect = !this.isSelect
  315. },
  316. jumpDetail(index, item) {
  317. uni.setStorageSync("xjapptaskId", {
  318. flag: index,
  319. taskId: item.taskId,
  320. runTimes: item.runTimes
  321. })
  322. uni.navigateTo({
  323. url: '/pages/native/datalist/inProcess'
  324. })
  325. },
  326. openDialog() {
  327. uni.navigateTo({
  328. url:'/pages/webview/popupTask',
  329. })
  330. },
  331. async getRobot() {
  332. this.taskList = []
  333. this.pageIndex = 1
  334. let res = await getRobotList()
  335. this.robotList = res.filter(item => {
  336. return item.followed == 1
  337. }) || []
  338. if(this.robotList.length >0){
  339. this.robotName = this.robotList[0].robotName
  340. this.robotData = this.robotList[0]
  341. this.getRobotStauts()
  342. this.currentTask()
  343. this.$refs.popup.close()
  344. }
  345. else{
  346. this.robotName = null
  347. this.robotData = {}
  348. this.robotStatus = {}
  349. this.$refs.popup.open()
  350. }
  351. },
  352. taskStatus(type) {
  353. switch (type) {
  354. case 0:
  355. return '等待中'
  356. case 1:
  357. return '正在执行'
  358. case 2:
  359. return '已终止'
  360. case 3:
  361. return '已完成'
  362. case 4:
  363. return '已超期'
  364. case 5:
  365. return '暂停中'
  366. }
  367. },
  368. changeType(item) {
  369. item.show = item.show == undefined ? false : !item.show
  370. },
  371. changePicker(e) {
  372. // console.log(e)
  373. this.heiIndex = `0rpx`
  374. this.isSelect = false
  375. let data = this.robotList[e.target.value]
  376. // console.log(data.robotId)
  377. this.loading = true
  378. this.pickeIndex = e.target.value
  379. this.robotData = data
  380. this.robotName = data.robotName
  381. this.pageIndex = 1
  382. this.noData = false
  383. this.onOff = false
  384. this.taskList = []
  385. this.getRobotStauts()
  386. this.currentTask()
  387. },
  388. currentTask() {
  389. currentTask({
  390. robotId: this.robotData.robotId,
  391. pageIndex: this.pageIndex,
  392. pageSize: 10
  393. }).then(res => {
  394. res.map(item => {
  395. item.show = false
  396. })
  397. this.taskList = this.taskList.concat(res)
  398. if (res.length < 10) this.onOff = true
  399. if (this.taskList.length == 0) {
  400. this.noData = true, this.onOff = false
  401. }else{
  402. this.noData = false
  403. this.onOff = false
  404. }
  405. this.loading = false
  406. }).catch(e => {
  407. this.loading = false
  408. if (this.taskList.length == 0) {
  409. this.noData = true, this.onOff = false
  410. }else{
  411. this.noData = false
  412. this.onOff = true
  413. }
  414. console.log(e)
  415. })
  416. },
  417. getRobotStauts() {
  418. getRobotStauts({
  419. robotId: this.robotData.robotId
  420. }).then(res => {
  421. console.log(res)
  422. this.robotStatus = res
  423. }).catch(e => {
  424. console.log(e)
  425. this.robotStatus = {}
  426. })
  427. }
  428. }
  429. }
  430. </script>
  431. <style scoped lang="scss">
  432. @import '@/components/p-loading/loading10';
  433. @import '@/components/p-loading/loading8';
  434. .creatView {
  435. display: flex;
  436. justify-content: center;
  437. align-items: center;
  438. flex-direction: column;
  439. margin-top: 230rpx;
  440. .icon-zanwu {
  441. font-size: 90px;
  442. color: #86B5E2;
  443. }
  444. .tx1 {
  445. font-size: 30rpx;
  446. padding: 15rpx;
  447. color: #86B5E2;
  448. }
  449. .btn1 {
  450. width: 260rpx;
  451. margin-top: 93rpx;
  452. font-size: 28rpx;
  453. line-height: 80rpx;
  454. height: 80rpx;
  455. border-radius: 40rpx;
  456. }
  457. }
  458. .loadingView {
  459. margin-top: 300rpx;
  460. display: flex;
  461. justify-content: center;
  462. align-items: center;
  463. }
  464. .icon {
  465. font-size: 22px;
  466. color: #23E274;
  467. }
  468. .moreView {
  469. display: flex;
  470. justify-content: center;
  471. align-items: center;
  472. }
  473. .empty {
  474. display: flex;
  475. justify-content: center;
  476. align-items: center;
  477. .t1 {
  478. font-size: 28rpx;
  479. color: #999;
  480. padding-bottom: 20rpx;
  481. }
  482. }
  483. .activeHeight {
  484. height: 330rpx !important;
  485. transition: height 0.3s;
  486. }
  487. .secHeight{
  488. transition: height 0.3s;
  489. }
  490. .nomalHeight {
  491. height: 0rpx;
  492. overflow: hidden;
  493. }
  494. .nv-work {
  495. .banner {
  496. width: 750rpx;
  497. height: 348rpx;
  498. background: #0581FD;
  499. }
  500. .nv-header-list {
  501. display: flex;
  502. position: absolute;
  503. text-align: center;
  504. left: 20rpx;
  505. right: 20rpx;
  506. top: 120rpx;
  507. .h-l-li {
  508. flex: 1;
  509. display: flex;
  510. flex-direction: column;
  511. justify-content: center;
  512. align-items: center;
  513. .h-l-li-t {
  514. font-size: 22rpx;
  515. padding-top: 5rpx;
  516. color: #fff;
  517. }
  518. }
  519. }
  520. .nv-top {
  521. position: absolute;
  522. background-color: #FFFFFF;
  523. border-radius: 18rpx;
  524. box-shadow: 1px 2px 10px 0px #E5E5E5;
  525. top: 250rpx;
  526. left: 20rpx;
  527. right: 20rpx;
  528. align-items: center;
  529. padding: 0 10rpx 20rpx 10rpx;
  530. display: flex;
  531. .bg1 {
  532. background: linear-gradient(-83deg, #5B6EFF, #AFB9FF);
  533. }
  534. .bg2 {
  535. background: linear-gradient(-83deg, #1FAEB3, #90E6E9);
  536. }
  537. .left {
  538. width: 300rpx;
  539. margin: 25rpx 10rpx;
  540. border-radius: 15rpx;
  541. height: 100rpx;
  542. padding: 20rpx;
  543. display: flex;
  544. justify-content: space-between;
  545. .left-l {
  546. display: flex;
  547. flex-direction: column;
  548. .left-l-t1 {
  549. font-size: 40rpx;
  550. font-weight: bold;
  551. color: #fff;
  552. .t1-1 {
  553. font-size: 22rpx;
  554. font-weight: normal;
  555. margin-left: 25rpx;
  556. }
  557. }
  558. .left-l-t2 {
  559. font-size: 26rpx;
  560. margin-top: 18rpx;
  561. color: #fff;
  562. }
  563. }
  564. .left-r {}
  565. }
  566. }
  567. .selcontent {
  568. position: absolute;
  569. top: 80rpx;
  570. left: 20rpx;
  571. right: 20rpx;
  572. z-index: 9999999999;
  573. display: block;
  574. overflow: scroll;
  575. background-color: #46A0F9;
  576. height: 0;
  577. border-radius: 15rpx;
  578. border-bottom-right-radius: 15rpx;
  579. .vv{
  580. padding: 30rpx 0;
  581. align-items: center;
  582. text-align: center;
  583. width: 100%;
  584. }
  585. .v1 {
  586. padding: 13rpx;
  587. display: block;
  588. .vt1 {
  589. display: block;
  590. color: #fff;
  591. font-size:30rpx;
  592. }
  593. .active{
  594. color: #46A0F9;
  595. }
  596. }
  597. }
  598. .selectTap {
  599. position: absolute;
  600. top: 20rpx;
  601. height: 53rpx;
  602. border-radius: 6px;
  603. background: #46A0F9;
  604. left: 20rpx;
  605. right: 20rpx;
  606. align-items: center;
  607. text-align: center;
  608. display: flex;
  609. flex-direction: row;
  610. .t1 {
  611. color: #fff;
  612. font-size: 28rpx;
  613. padding: 0 10rpx 0 5rpx;
  614. }
  615. }
  616. .nv-list-box{
  617. position: absolute;
  618. width: calc(100% - 4rpx);
  619. height: calc(100% - 360rpx);
  620. overflow: auto;
  621. top: 400rpx;
  622. z-index: 1;
  623. }
  624. .nv-list {
  625. position: relative;
  626. overflow: hidden;
  627. z-index: 99999;
  628. margin: -50rpx 20rpx 30rpx 20rpx;
  629. background-color: #FFFFFF;
  630. border-radius: 18rpx;
  631. box-shadow: 1px 2px 10px 0px #E5E5E5;
  632. .nv-done {
  633. position: absolute;
  634. top: 5rpx;
  635. right: -35rpx;
  636. display: flex;
  637. align-items: center;
  638. justify-content: center;
  639. width: 150rpx;
  640. height: 40rpx;
  641. line-height: 40rpx;
  642. background: #3FBC4E;
  643. text-align: center;
  644. transform: rotate(30deg);
  645. .d-t1 {
  646. color: #fff;
  647. font-size: 20rpx;
  648. }
  649. }
  650. .top {
  651. display: flex;
  652. flex-direction: row;
  653. align-items: center;
  654. padding: 20rpx 0;
  655. margin: 0rpx 22rpx 0 22rpx;
  656. .t2 {
  657. color: #333;
  658. font-size: 30rpx;
  659. font-weight: bold;
  660. padding-left: 10rpx;
  661. }
  662. }
  663. .center {
  664. padding: 20rpx 20rpx;
  665. .c-v0 {
  666. padding: 10rpx 10rpx;
  667. overflow: hidden;
  668. flex-direction: row;
  669. display: flex;
  670. justify-content: space-between;
  671. .c-v0-d1 {
  672. text-align: left;
  673. .d1-t {
  674. color: #000000;
  675. font-size: 24rpx;
  676. margin-bottom: 10rpx;
  677. }
  678. .di-b {
  679. text-align: right;
  680. font-size: 28rpx;
  681. }
  682. }
  683. }
  684. .ct-1 {
  685. color: #666;
  686. font-size: 30rpx;
  687. }
  688. .c-v1 {
  689. margin-top: 50rpx;
  690. display: flex;
  691. justify-content: space-between;
  692. align-items: center;
  693. .left {
  694. .ct-2 {
  695. color: #F76424;
  696. font-size: 44rpx;
  697. font-weight: bold;
  698. }
  699. .ct-3 {
  700. color: #F76424;
  701. font-size: 24rpx;
  702. }
  703. }
  704. .right {
  705. display: flex;
  706. align-items: center;
  707. .r-t1 {
  708. font-size: 26rpx;
  709. color: #5B5B5B;
  710. }
  711. }
  712. }
  713. .c-v2 {
  714. display: flex;
  715. margin-top: 30rpx;
  716. justify-content: space-between;
  717. .v2-1 {
  718. width: 325rpx;
  719. height: 100rpx;
  720. background: #EEEEEE;
  721. padding: 15rpx;
  722. border-radius: 15rpx;
  723. margin: 0 10rpx;
  724. .v2-bottom {
  725. margin-top: 10rpx;
  726. .text {
  727. font-size: 26rpx;
  728. }
  729. }
  730. .v2-top {
  731. .v2-t1 {
  732. color: #000000;
  733. font-size: 30rpx;
  734. font-weight: bold;
  735. }
  736. .v2-t2 {
  737. color: #000000;
  738. font-weight: bold;
  739. font-size: 30rpx;
  740. padding-left: 10rpx;
  741. }
  742. }
  743. }
  744. }
  745. .c-v3 {
  746. width: 640rpx;
  747. margin: 30rpx 0rpx 30rpx 0;
  748. .v3-1 {
  749. display: flex;
  750. padding: 0 15rpx;
  751. align-items: center;
  752. .v3-1-t1 {
  753. font-size: 30rpx;
  754. color: #000000;
  755. padding-right: 5rpx;
  756. }
  757. .v3-1-1 {
  758. .v3-1-t2 {
  759. color: #3F9BF1;
  760. font-size: 30rpx;
  761. }
  762. .v3-1-t3 {
  763. color: #000000;
  764. font-size: 30rpx;
  765. }
  766. }
  767. }
  768. }
  769. .c-bottom {
  770. display: flex;
  771. align-items: center;
  772. padding-bottom: 30rpx;
  773. justify-content: space-around;
  774. .c-b-l {
  775. background: linear-gradient(40deg, #87C589, #208E51);
  776. }
  777. .c-b-r {
  778. background: linear-gradient(45deg, #FA7839, #DDBE6A);
  779. }
  780. .c-cle {
  781. align-items: center;
  782. text-align: center;
  783. width: 150rpx;
  784. height: 150rpx;
  785. border-radius: 50%;
  786. display: flex;
  787. justify-content: center;
  788. .c-cle-n {
  789. width: 100rpx;
  790. height: 100rpx;
  791. border-radius: 50%;
  792. display: flex;
  793. flex-direction: column;
  794. align-items: center;
  795. justify-content: center;
  796. }
  797. .c-cle-l {
  798. background: #D7F0E1;
  799. .c-cle-n-t1 {
  800. font-size: 22rpx;
  801. color: #2F9659;
  802. }
  803. .c-cle-n-t2 {
  804. font-size: 26rpx;
  805. color: #2F9659;
  806. font-weight: bold;
  807. }
  808. }
  809. .c-cle-r {
  810. background: #FEECD6;
  811. .c-cle-n-t1 {
  812. font-size: 22rpx;
  813. color: #F97C3B;
  814. }
  815. .c-cle-n-t2 {
  816. font-size: 26rpx;
  817. color: #F97C3B;
  818. font-weight: bold;
  819. }
  820. }
  821. }
  822. }
  823. }
  824. }
  825. }
  826. </style>