rankOverview.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. <!--
  2. [报名] 样式3 - 排名总览
  3. http://localhost:5173/card/#/pages/bm/style3/rankOverview
  4. https://oss-mbh5.colormaprun.com/card/#/pages/bm/style3/rankOverview
  5. -->
  6. <template>
  7. <view class="body">
  8. <view class="content uni-column">
  9. <view class="uni-column" :class="cssTop">
  10. <my-topbar :mcName="mcName" :class="cssTopbarColor"
  11. @btnBackClick="btnBack" @btnInfoClick="btnInfo"></my-topbar>
  12. </view>
  13. <view class="mid uni-column">
  14. <view class="mid-1 uni-row uni-jcsb">
  15. <text class="mid-1-name">{{nickName}}</text>
  16. <text>总场次:{{totalNum}}</text>
  17. </view>
  18. <view class="mid-2 uni-row uni-jcsa">
  19. <view class="uni-column">
  20. <text class="mid-2-value" style="color: #ff0045;">{{totalSysPoint}}</text>
  21. <text class="mid-2-text">百味豆(个)</text>
  22. </view>
  23. <view class="mid-line"></view>
  24. <view class="uni-column">
  25. <text class="mid-2-value">{{fmtDistanct(totalDistanct)}}</text>
  26. <text class="mid-2-text">总里程km</text>
  27. </view>
  28. <view class="mid-line"></view>
  29. <view class="uni-column">
  30. <text class="mid-2-value">{{totalCp}}</text>
  31. <text class="mid-2-text">打点数(个)</text>
  32. </view>
  33. <view class="mid-line"></view>
  34. <view class="uni-column">
  35. <text class="mid-2-value">{{fmtPace(fastPace)}}</text>
  36. <text class="mid-2-text">最快配速</text>
  37. </view>
  38. </view>
  39. </view>
  40. <view class="main uni-column">
  41. <text class="main-title">选择比赛路线</text>
  42. <my-pathList :style="pathListStyle.style" :pathList="pathList" :mcState="mcState" :showLine="pathListStyle.showLine"></my-pathList>
  43. </view>
  44. <my-popup ref="mypopup" :config="popupRuleConfig" :dataList="popupDataList" :acttime="acttime"></my-popup>
  45. <!-- <my-popup-map ref="mypopupmap" :point="navPoint"></my-popup-map> -->
  46. </view>
  47. </view>
  48. </template>
  49. <script>
  50. import tools from '/common/tools';
  51. import {
  52. defaultPopUpDataList
  53. } from '/common/define';
  54. import {
  55. token,
  56. apiMatchRsDetailQuery,
  57. apiCardConfigQuery,
  58. checkResCode
  59. } from '/common/api';
  60. export default {
  61. data() {
  62. return {
  63. // audioSrc: "/static/audio/2.mp3",
  64. // audioSrc: "https://oss-mbh5.colormaprun.com/card/static/audio/2.mp3",
  65. // audioSrc: "http://t-oss-mbh5.colormaprun.com/card/static/audio/2.mp3",
  66. pageName: "rankOverview",
  67. firstEnterKey: 'firstEnter-bm-style3',
  68. rankKey: "rank-bm-style3",
  69. queryObj: {},
  70. queryString: "",
  71. token: "",
  72. ecId: 0, // 卡片id
  73. mcId: 0, // 赛事id
  74. mcType: 0, // 赛事类型 1 普通活动 2 线下赛 3 线上赛
  75. mcName: "", // 赛事名称
  76. acttime: "", // 活动时间
  77. beginSecond: null, // 活动或赛事开始时间戳,单位秒
  78. endSecond: null, // 活动或赛事结束时间戳,单位秒
  79. nickName: "", // 昵称
  80. totalNum: null, // 总场次
  81. totalDistanct: null, // 总距离,单位米
  82. totalDistanctRankNum: null, // 总距离排名
  83. totalCp: null, // 总打点数
  84. totalCpRankNum: null, // 总打点数排名
  85. totalSysPoint: null, // 总百味豆
  86. totalSysPointRankNum: null, // 总百味豆排名
  87. fastPace: null, // 个人最快配速
  88. fastPaceRankNum: null, // 个人最快配速排名
  89. ocaRs: [], // 卡片对应活动集合
  90. interval: null,
  91. mcState: 0, // 赛事/活动状态 0: 未开始 1: 进行中 2: 已结束
  92. cssTop: "",
  93. cssTopbarColor: "",
  94. pathList: {},
  95. pathListStyle: {},
  96. popupRuleConfig: {}, // 规则弹窗配置
  97. popupDataList: [],
  98. navPoint: {},
  99. }
  100. },
  101. computed: {
  102. pathListLen() {
  103. return Object.keys(this.pathList).length;
  104. }
  105. },
  106. onLoad(query) { // 类型非必填,可自动推导
  107. // console.log("query:", query);
  108. this.queryObj = query;
  109. this.queryString = tools.objectToQueryString(this.queryObj);
  110. // console.log(queryString);
  111. this.token = query["token"] ?? token;
  112. this.ecId = query["id"] ?? 0;
  113. this.firstEnterKey += "-" + this.ecId;
  114. console.log("firstEnterKey:", this.firstEnterKey);
  115. this.rankKey += "-" + this.ecId;
  116. console.log("rankKey:", this.rankKey);
  117. tools.removeCssCode();
  118. this.getCardConfigQuery();
  119. },
  120. // 页面初次渲染完成,此时组件已挂载完成,DOM 树($el)已可用
  121. onReady() {
  122. // this.dealFirstEnter();
  123. // this.playMusic();
  124. },
  125. onShow() {
  126. // uni.showToast({
  127. // icon: "none",
  128. // title: "[rankOverview] onShow"
  129. // })
  130. // if (this.$audio.audioStatus == 2 && this.$audio.audioSrc == this.audioSrc) {
  131. // this.$audio.play();
  132. // }
  133. },
  134. onUnload() {
  135. this.clear();
  136. },
  137. methods: {
  138. playMusic() {
  139. return;
  140. // uni.showToast({
  141. // title: 'playMusic',
  142. // icon: 'none',
  143. // duration: 2000
  144. // });
  145. // if (this.$audio.audioStatus == 0 || this.$audio.audioSrc != this.audioSrc) {
  146. // this.$audio.playAudio(this.audioSrc);
  147. // }
  148. },
  149. dealNotice(rank) {
  150. // console.log('[dealFirstEnter]');
  151. let that = this;
  152. uni.getStorage({
  153. key: that.rankKey,
  154. success: (res) => {
  155. console.log('[getStorage]', that.rankKey, res.data);
  156. const oldRank = res.data;
  157. if (oldRank != rank) {
  158. // that.notice = true;
  159. that.setRankValue(rank);
  160. }
  161. },
  162. fail: (e) => {
  163. console.log('[getStorage] fail', that.rankKey, e);
  164. // that.notice = false;
  165. that.setRankValue(rank);
  166. },
  167. })
  168. },
  169. setRankValue(data) {
  170. let that = this;
  171. uni.setStorage({
  172. key: that.rankKey,
  173. data: data,
  174. success: () => {
  175. console.log('[setStorage] success', that.rankKey, data);
  176. },
  177. fail: (e) => {
  178. console.log('[setStorage] fail', that.rankKey, e);
  179. },
  180. })
  181. },
  182. dealFirstEnter() {
  183. // console.log('[dealFirstEnter]');
  184. let that = this;
  185. uni.getStorage({
  186. key: that.firstEnterKey,
  187. success: (res) => {
  188. console.log('[getStorage]', that.firstEnterKey, res.data);
  189. },
  190. fail: (e) => {
  191. console.log('[getStorage] fail', that.firstEnterKey, e);
  192. that.btnInfo();
  193. that.setFirstEnterValue(true);
  194. },
  195. })
  196. },
  197. setFirstEnterValue(data) {
  198. let that = this;
  199. uni.setStorage({
  200. key: that.firstEnterKey,
  201. data: data,
  202. success: () => {
  203. console.log('[setStorage] success', that.firstEnterKey, data);
  204. },
  205. fail: (e) => {
  206. console.log('[setStorage] fail', that.firstEnterKey, e);
  207. },
  208. })
  209. },
  210. clear() {
  211. if (this.interval != null) {
  212. clearInterval(this.interval);
  213. this.interval = null;
  214. }
  215. },
  216. loadConfig(config) {
  217. // console.log("config", config);
  218. // 加载CSS样式
  219. const css = config.css;
  220. if (css != undefined && css.length > 0) {
  221. tools.loadCssCode(css);
  222. if (css.indexOf(".top{") >= 0) {
  223. this.cssTop = "top";
  224. }
  225. if (css.indexOf(".topbar-color{") >= 0) {
  226. this.cssTopbarColor = "topbar-color";
  227. }
  228. }
  229. if (this.cssTop == "") {
  230. this.cssTop = "top-default";
  231. }
  232. if (this.cssTopbarColor == "") {
  233. this.cssTopbarColor = "topbar-color-default";
  234. }
  235. console.log("[loadConfig] cssTop:", this.cssTop);
  236. console.log("[loadConfig] cssTopbarColor:", this.cssTopbarColor);
  237. // 加载比赛路线数据
  238. const pathList = config.pathList;
  239. // console.log("[loadConfig] pathList:", pathList);
  240. if (pathList != undefined) {
  241. this.pathList = pathList;
  242. }
  243. // 加载比赛路线样式
  244. const pathListStyle = config.pathListStyle;
  245. // console.log("[loadConfig] pathList:", pathList);
  246. if (pathListStyle != undefined) {
  247. this.pathListStyle = pathListStyle;
  248. }
  249. // 加载规则弹窗配置
  250. const popupRuleConfig = config.popupRuleConfig;
  251. if (popupRuleConfig != undefined) {
  252. this.popupRuleConfig = popupRuleConfig;
  253. }
  254. // console.log("[loadConfig] popupRuleConfig:", this.popupRuleConfig);
  255. // 加载弹窗数据
  256. const popupDataList = config.popupDataList;
  257. // console.log("[loadConfig] popupDataList:", popupDataList);
  258. if (popupDataList != undefined && popupDataList.length > 0) {
  259. for (var i = 0; i < popupDataList.length; i++) {
  260. // console.log("[loadConfig] popupDataList", i, popupDataList[i]);
  261. if (popupDataList[i] == 'default') {
  262. for (var j = 0; j < defaultPopUpDataList.length; j++) {
  263. this.popupDataList.push(defaultPopUpDataList[j]);
  264. }
  265. } else {
  266. this.popupDataList.push(popupDataList[i]);
  267. }
  268. }
  269. } else {
  270. this.popupDataList = defaultPopUpDataList;
  271. console.log("[loadConfig] popupDataList 加载默认列表");
  272. }
  273. // console.log("[loadConfig] popupDataList:", this.popupDataList);
  274. },
  275. // 获取倒计时
  276. getCountdown() {
  277. // console.log(this.endSecond)
  278. if (this.endSecond > 0) {
  279. const now = Date.now() / 1000;
  280. const dif = this.endSecond - now;
  281. // const dif = 3600*24 - 60;
  282. if (dif > 0) {
  283. this.countdown = '距结束 ' + tools.convertSecondsToDHM(dif);
  284. } else {
  285. this.countdown = "活动已结束";
  286. }
  287. // this.countdown = tools.convertSecondsToHMS(dif);
  288. } else {
  289. this.countdown = "距结束 --天--小时";
  290. }
  291. },
  292. // 格式化 距离
  293. fmtDistanct(val) {
  294. if (val < 1000)
  295. return Math.round(val * 10 / 1000) / 10;
  296. else
  297. return Math.round(val / 1000);
  298. },
  299. // 格式化 配速
  300. fmtPace(val) {
  301. return tools.convertSecondsToHMS(val, 2);
  302. },
  303. fmtMcTime(timestamp) {
  304. return tools.fmtMcTime(timestamp);
  305. },
  306. // 获取活动时间
  307. getActtime() {
  308. this.acttime = tools.getActtime(this.beginSecond, this.endSecond);
  309. },
  310. getCardConfigQuery() {
  311. uni.request({
  312. url: apiCardConfigQuery,
  313. header: {
  314. "Content-Type": "application/x-www-form-urlencoded",
  315. "token": this.token,
  316. },
  317. method: "POST",
  318. data: {
  319. ecId: this.ecId,
  320. pageName: this.pageName
  321. },
  322. success: (res) => {
  323. // console.log("getCardConfigQuery", res)
  324. const data = res.data.data;
  325. // console.log("configJson", data.configJson);
  326. const config = data.configJson != "" ? JSON.parse(data.configJson) : "";
  327. // console.log("configJson", data.configJson);
  328. /* const config = {
  329. "css": `
  330. .top{
  331. position: relative;
  332. z-index: 10;
  333. width: 100%;
  334. height: 270px;
  335. padding-top: 36px;
  336. justify-content: space-between;
  337. background-image: url('static/backgroud/top_bg_guoqing.png');
  338. background-repeat: no-repeat;
  339. background-position-x: center;
  340. background-position-y: -8px;
  341. background-size: 100% 100%;
  342. }
  343. .topbar-color{
  344. color: #ffffff;
  345. }
  346. `,
  347. "pathList": {
  348. "row1": [{
  349. "type": 3,
  350. "pathImg": "/static/common/领秀城A区.png",
  351. "path": {
  352. "ocaId": 1,
  353. "mcType": 3
  354. },
  355. "navImg": "/static/common/nav.png",
  356. "point": {
  357. "longitude": 117.022194,
  358. "latitude": 36.661612,
  359. "name": "领秀城A区起始点"
  360. }
  361. },
  362. {
  363. "type": 3,
  364. "pathImg": "/static/common/领秀城B区.png",
  365. "path": {
  366. "ocaId": 1,
  367. "mcType": 3
  368. },
  369. "navImg": "/static/common/nav.png",
  370. "point": {
  371. "longitude": 117.022194,
  372. "latitude": 36.661612,
  373. "name": "领秀城B区起始点"
  374. }
  375. }
  376. ],
  377. "row2": [{
  378. "type": 3,
  379. "pathImg": "/static/common/领秀城C区.png",
  380. "path": {
  381. "ocaId": 1,
  382. "mcType": 3
  383. },
  384. "navImg": "/static/common/nav.png",
  385. "point": {
  386. "longitude": 117.022194,
  387. "latitude": 36.661612,
  388. "name": "领秀城C区起始点"
  389. }
  390. },
  391. {
  392. "type": 3,
  393. "pathImg": "/static/common/领秀城D区.png",
  394. "path": {
  395. "ocaId": 1,
  396. "mcType": 3
  397. },
  398. "navImg": "/static/common/nav.png",
  399. "point": {
  400. "longitude": 117.022194,
  401. "latitude": 36.661612,
  402. "name": "领秀城D区起始点"
  403. }
  404. }
  405. ],
  406. "row3": [{
  407. "type": 3,
  408. "pathImg": "/static/common/领秀城E区.png",
  409. "path": {
  410. "ocaId": 1,
  411. "mcType": 3
  412. },
  413. "navImg": "/static/common/nav.png",
  414. "point": {
  415. "longitude": 117.022194,
  416. "latitude": 36.661612,
  417. "name": "领秀城E区起始点"
  418. }
  419. },
  420. {
  421. "type": 3,
  422. "pathImg": "/static/common/领秀城F区.png",
  423. "path": {
  424. "ocaId": 1,
  425. "mcType": 3
  426. },
  427. "navImg": "/static/common/nav.png",
  428. "point": {
  429. "longitude": 117.022194,
  430. "latitude": 36.661612,
  431. "name": "领秀城F区起始点"
  432. }
  433. }
  434. ],
  435. "row4": [{
  436. "type": 3,
  437. "pathImg": "/static/common/贵和购物中心.png",
  438. "path": {
  439. "ocaId": 1,
  440. "mcType": 3
  441. },
  442. "navImg": "/static/common/nav.png",
  443. "point": {
  444. "longitude": 117.022194,
  445. "latitude": 36.661612,
  446. "name": "贵和购物中心起始点"
  447. }
  448. },
  449. {
  450. "type": 3,
  451. "pathImg": "/static/common/中心花园.png",
  452. "path": {
  453. "ocaId": 1,
  454. "mcType": 3
  455. },
  456. "navImg": "/static/common/nav.png",
  457. "point": {
  458. "longitude": 117.022194,
  459. "latitude": 36.661612,
  460. "name": "中心花园起始点"
  461. }
  462. }
  463. ]
  464. },
  465. "pathListStyle" : {
  466. "showLine" : true,
  467. "style": "justify-content: flex-start;"
  468. },
  469. "popupDataList": [
  470. {
  471. "type": 2,
  472. "data": {
  473. "title": "基本图例",
  474. "img": "/static/common/jbtl.png"
  475. }
  476. }, {
  477. "type": 2,
  478. "data": {
  479. "title": "基本标识",
  480. "img": "/static/common/jbbs2.png"
  481. }
  482. },
  483. {
  484. "type": 7,
  485. "data": {
  486. "title": "活动规则",
  487. "content": "<li>赛期内随时参赛、不限完赛次数、起点任选、实时排名 <li>起点-各途经点-结束点完整打卡为1次有效完赛 <li>赛事如有疑问,请咨询微信客服",
  488. "imageList": [
  489. {
  490. "src": "/static/common/qrcode_wxkf.png",
  491. "width": "100px",
  492. "height": "100px"
  493. }
  494. ]
  495. }
  496. },
  497. {
  498. "type": 7,
  499. "data": {
  500. "title": "活动奖励",
  501. "content": "<li>途经点打卡1次,获1个百味豆<br><li>每次正确答题,再获1个百味豆<br><li>20个百味豆兑换1个鸡蛋<br><li>上不封顶!随时兑换!<br><text style='font-size:12px;color:#999999;'>(限本次活动百味豆,兑换以“蛋叔券”为准)</text><br><li>健身又能“薅羊毛”~",
  502. "imageList": [
  503. {
  504. "src": "/static/common/jidanquan.png",
  505. "width": "80px",
  506. "height": "80px"
  507. }
  508. ]
  509. }
  510. },
  511. {
  512. "type": 5,
  513. "data": {
  514. "title": "兑换地点",
  515. "img": "/static/common/wslgwcs.png",
  516. "point": {
  517. "longitude": 117.022194,
  518. "latitude": 36.661612,
  519. "name": "万盛隆购物超市"
  520. }
  521. }
  522. }
  523. ]
  524. }; */
  525. this.loadConfig(config);
  526. this.matchRsDetailQuery();
  527. setTimeout(this.dealFirstEnter, 500);
  528. },
  529. fail: (err) => {
  530. console.log("getCardConfigQuery err", err)
  531. },
  532. });
  533. },
  534. // 卡片对应线上赛多个活动查询
  535. matchRsDetailQuery() {
  536. uni.request({
  537. url: apiMatchRsDetailQuery,
  538. header: {
  539. "Content-Type": "application/x-www-form-urlencoded",
  540. "token": this.token,
  541. },
  542. method: "POST",
  543. data: {
  544. ecId: this.ecId
  545. },
  546. success: (res) => {
  547. console.log("matchRsDetailQuery", res);
  548. if (checkResCode(res)) {
  549. const data = res.data.data;
  550. this.mcType = data.mcType;
  551. this.mcId = data.mcId;
  552. this.mcName = data.mcName;
  553. this.beginSecond = data.beginSecond;
  554. this.endSecond = data.endSecond;
  555. this.nickName = data.nickName;
  556. this.totalNum = data.totalNum;
  557. this.totalDistanct = data.totalDistanct;
  558. this.totalDistanctRankNum = data.totalDistanctRankNum;
  559. this.totalCp = data.totalCp;
  560. this.totalCpRankNum = data.totalCpRankNum;
  561. this.totalSysPoint = data.totalSysPoint;
  562. this.totalSysPointRankNum = data.totalSysPointRankNum;
  563. this.fastPace = data.fastPace;
  564. this.fastPaceRankNum = data.fastPaceRankNum;
  565. this.ocaRs = data.ocaRs;
  566. this.mcState = tools.checkMcState(this.beginSecond, this.endSecond);
  567. const rank = JSON.stringify(data);
  568. this.dealNotice(rank);
  569. this.getCountdown();
  570. this.getActtime();
  571. this.clear();
  572. this.interval = setInterval(this.getCountdown, 60000);
  573. }
  574. },
  575. fail: (err) => {
  576. console.log("matchRsDetailQuery err", err)
  577. },
  578. });
  579. },
  580. btnBack() {
  581. // const url = `action://to_home/`;
  582. // tools.appAction(url);
  583. // uni.navigateTo({
  584. // url: "/pages/bm/style3/rankList?" + this.queryString
  585. // });
  586. const url = "/pages/bm/style3/rankList?" + this.queryString;
  587. tools.appAction(url, "uni.navigateTo");
  588. },
  589. btnInfo() {
  590. // console.log(this.$refs.mypopup);
  591. this.$refs.mypopup.popupOpen();
  592. },
  593. onOverviewClick(ovtype) {
  594. this.queryObj.ovtype = ovtype;
  595. this.queryString = tools.objectToQueryString(this.queryObj);
  596. // uni.navigateTo({
  597. // url: "/pages/bm/style3/rankList?" + this.queryString
  598. // });
  599. const url = "/pages/bm/style3/rankList?" + this.queryString;
  600. tools.appAction(url, "uni.navigateTo");
  601. },
  602. }
  603. }
  604. </script>
  605. <style scoped>
  606. .content {
  607. width: 100vw;
  608. /* height: 100vh; */
  609. overflow-x: scroll;
  610. }
  611. .top-default {
  612. position: relative;
  613. z-index: 10;
  614. width: 100%;
  615. height: 270px;
  616. padding-top: 36px;
  617. justify-content: space-between;
  618. background-image: url("/static/backgroud/top_bg_egg2.png");
  619. background-repeat: no-repeat;
  620. background-position-x: center;
  621. background-position-y: -8px;
  622. background-size: 100% 100%;
  623. /* background-size: cover; */
  624. }
  625. /* .top-oval {
  626. position: relative;
  627. z-index: 0;
  628. margin-top: -180px;
  629. margin-left: -10%;
  630. width: 120%;
  631. height: 280px;
  632. background: linear-gradient(180deg, #ffffff 12.18%, #eeeeee 100%);
  633. border-radius: 50%;
  634. text-align: center;
  635. }
  636. .top-oval-text {
  637. color: #333333;
  638. font-size: 13px;
  639. line-height: 386px;
  640. pointer-events: auto;
  641. }
  642. */
  643. .topbar-color-default {
  644. color: #333333;
  645. }
  646. .topbtm {
  647. width: 100%;
  648. /* height: 60rpx; */
  649. margin-bottom: 40px;
  650. justify-content: space-evenly;
  651. }
  652. .topbtm-name {
  653. /* width: 320rpx; */
  654. /* height: 28px; */
  655. padding: 5px 12px;
  656. background-color: #9fda39;
  657. border-radius: 5px;
  658. /* backdrop-filter: blur(30px); */
  659. text-align: center;
  660. font-weight: 500;
  661. color: #497400;
  662. font-size: 14px;
  663. }
  664. .mid {
  665. width: 90%;
  666. height: 120px;
  667. position: relative;
  668. z-index: 20;
  669. margin-top: -100px;
  670. background: #ffffff;
  671. border-radius: 9px;
  672. box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
  673. font-family: Source Han Sans CN;
  674. }
  675. .mid-1 {
  676. width: 90%;
  677. margin: 12px;
  678. font-weight: 500;
  679. color: #8e8e8e;
  680. font-size: 14px;
  681. }
  682. .mid-1-name {
  683. max-width: 360rpx;
  684. white-space: nowrap;
  685. overflow: hidden;
  686. text-overflow: ellipsis;
  687. }
  688. .mid-2 {
  689. width: 92%;
  690. /* margin: 0 10px; */
  691. }
  692. .mid-2-value {
  693. font-weight: 900;
  694. font-size: 22px;
  695. }
  696. .mid-2-text {
  697. color: #989898;
  698. font-size: 12px;
  699. }
  700. .mid-line {
  701. width: 0px;
  702. height: 45.04px;
  703. border: 1px solid;
  704. border-color: #e6e6e6;
  705. }
  706. .overview-1 {
  707. width: 111px;
  708. height: 54px;
  709. background: #ffb40b;
  710. border-radius: 50%;
  711. box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
  712. pointer-events: auto;
  713. }
  714. .overview-2 {
  715. margin-top: -43px;
  716. color: #ffffff;
  717. font-size: 18px;
  718. pointer-events: auto;
  719. }
  720. .overview-3 {
  721. width: 111px;
  722. height: 54px;
  723. background: #f39509;
  724. border-radius: 50%;
  725. box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
  726. pointer-events: auto;
  727. }
  728. .overview-4 {
  729. width: 111px;
  730. height: 54px;
  731. background: #81cd00;
  732. border-radius: 50%;
  733. box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
  734. pointer-events: auto;
  735. }
  736. .overview-5 {
  737. width: 111px;
  738. height: 54px;
  739. background: #64cbb0;
  740. border-radius: 50%;
  741. box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
  742. pointer-events: auto;
  743. }
  744. .ovline1 {
  745. margin-top: 9px;
  746. color: #ffffff;
  747. font-size: 12px;
  748. }
  749. .ovline2 {
  750. color: #ffffff;
  751. font-size: 16px;
  752. }
  753. .main {
  754. width: 100%;
  755. margin-top: 20px;
  756. margin-bottom: 10px;
  757. /* height: 70vh; */
  758. justify-content: space-around;
  759. /* justify-content: space-between; */
  760. }
  761. .main-title {
  762. margin-bottom: 10px;
  763. font-weight: 550;
  764. color: #333333;
  765. font-size: 16px;
  766. }
  767. </style>