rankList.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  1. <!--
  2. [报名] 样式1 - 排名列表
  3. http://localhost:5173/card/#/pages/bm/style1/rankList
  4. https://oss-mbh5.colormaprun.com/card/#/pages/bm/style1/rankList
  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="topbar-color" :showMessage="popupMessageList.length > 0"
  11. @btnBackClick="btnBack" @btnInfoClick="btnInfo" @btnMessageClick="btnMessage"></my-topbar>
  12. <view class="topcontent uni-column">
  13. <view>
  14. <text class="toptext">{{coiName}}</text>
  15. <text class="toptext" v-if="teamNum > 0">{{getTeamName(teamType, teamNum)}}</text>
  16. </view>
  17. <view class="top-countdown uni-row">
  18. <image mode="aspectFit" class="cal" src="/static/default/cal.png"></image>
  19. <text>{{countdown}}</text>
  20. </view>
  21. </view>
  22. <view class="topbtm uni-column">
  23. <view class="topbtm-content uni-row">
  24. <text class="topbtm-sspm" v-if="mcState==1 && allowMcSignUp"></text>
  25. <text class="topbtm-sspm">实时排名</text>
  26. <view class="btnReGroup" v-if="mcState==1 && allowMcSignUp" @click="btnReGroup">重新分组</view>
  27. </view>
  28. </view>
  29. <!-- <text class="mcName">{{ecId}} - {{mcId}} - {{token}}</text> -->
  30. </view>
  31. <view class="main uni-column">
  32. <uni-segmented-control class="main-tab" :current="tabCurrent" :values="tabItems"
  33. @clickItem="onClickTabItem" styleType="button" :activeColor="tabActiveColor"></uni-segmented-control>
  34. <view class="tab-view uni-column">
  35. <!-- 总排名 -->
  36. <my-ranklist v-show="tabCurrent === 0" :rankRs="rankList.totalRankRs"></my-ranklist>
  37. <!-- 队伍排名 -->
  38. <my-ranklist v-show="tabCurrent === 1" v-if="teamType==0" :rankRs="rankList.teamRankRs" :teamType="this.teamType"></my-ranklist>
  39. <!-- 队内排名 -->
  40. <my-ranklist v-show="tabCurrent === 2" v-if="teamType==0" :rankRs="rankList.inTeamRs"></my-ranklist>
  41. <!-- 学生排名 -->
  42. <my-ranklist v-show="tabCurrent === 1" v-if="teamType==1" :rankRs="teamNum==1 ? rankList.inTeamRs : rankList.otherRs[1]"></my-ranklist>
  43. <!-- 家长排名 -->
  44. <my-ranklist v-show="tabCurrent === 2" v-if="teamType==1" :rankRs="teamNum==2 ? rankList.inTeamRs : rankList.otherRs[2]"></my-ranklist>
  45. </view>
  46. <button class="btnStart btnStart-disable" v-if="mcState==0">活动尚未开始</button>
  47. <button class="btnStart btnStart-enable" v-if="mcState==1" @click="btnStart">开始比赛</button>
  48. <button class="btnStart btnStart-disable" v-if="mcState==2">活动已结束</button>
  49. </view>
  50. <my-popup ref="mypopup" :dataList="popupDataList" :acttime="acttime"></my-popup>
  51. <my-popup ref="mypopupMessage" :dataList="popupMessageList"></my-popup>
  52. </view>
  53. </view>
  54. </template>
  55. <script>
  56. import tools from '/common/tools';
  57. import { teamName, defaultPopUpDataList } from '/common/define';
  58. import {
  59. token,
  60. apiCardDetailQuery,
  61. apiCardRankDetailQuery,
  62. apiCardConfigQuery,
  63. apiUserCurrentRankNumQuery,
  64. apiIsAllowMcSignUp,
  65. apiUnReadMessageQuery,
  66. apiReadMessage,
  67. checkResCode
  68. } from '/common/api';
  69. export default {
  70. data() {
  71. return {
  72. pageName: "rankList",
  73. firstEnterKey: 'firstEnter-bm',
  74. rankKey: "rank-bm-style1",
  75. messageKey: "message-bm-style1",
  76. queryObj: {},
  77. queryString: "",
  78. token: "",
  79. ecId: 0, // 卡片id
  80. mcId: 0, // 赛事id
  81. mcType: 0, // 赛事类型 1 普通活动 2 线下赛 3 线上赛
  82. mcName: "", // 赛事名称
  83. acttime: "", // 活动时间
  84. beginSecond: null, // 活动或赛事开始时间戳,单位秒
  85. endSecond: null, // 活动或赛事结束时间戳,单位秒
  86. coiName: "", // 已报名单位名称,可为空
  87. ocaId: 0, // 关联id,带入到App活动详情页面
  88. teamNum: 0, // 已报名队伍编号,可为0
  89. mcState: 0 , // 赛事/活动状态 0: 未开始 1: 进行中 2: 已结束
  90. allowMcSignUp: false, // 是否允许重新分组
  91. countdown: "", // 倒计时
  92. rankList: { // 排名列表
  93. totalRankRs: [],
  94. teamRankRs: [],
  95. inTeamRs: [],
  96. otherRs: []
  97. },
  98. interval: null,
  99. teamType: 0, // 队伍类型
  100. dispArrStr: "", // 要显示的集合范围 (total,team,in,other)
  101. tabItems: [],
  102. tabCurrent: 0,
  103. tabActiveColor: "#2e85ec",
  104. cssTop: "",
  105. popupDataList: [],
  106. popupMessageList: [],
  107. // mqIdListStr: "", // 已读消息id列表 逗号分隔
  108. }
  109. },
  110. computed: {},
  111. onLoad(query) { // 类型非必填,可自动推导
  112. // console.log(query);
  113. this.queryObj = query;
  114. this.queryString = tools.objectToQueryString(this.queryObj);
  115. // console.log(queryString);
  116. this.token = query["token"] ?? token;
  117. this.ecId = query["id"] ?? 0;
  118. this.firstEnterKey += "-" + this.ecId;
  119. console.log("firstEnterKey:", this.firstEnterKey);
  120. this.rankKey += "-" + this.ecId;
  121. console.log("rankKey:", this.rankKey);
  122. this.messageKey += "-" + this.ecId;
  123. console.log("messageKey:", this.messageKey);
  124. tools.removeCssCode();
  125. this.getCardConfigQuery();
  126. this.getUserCurrentRankNumQuery();
  127. this.isAllowMcSignUp();
  128. },
  129. // 页面初次渲染完成,此时组件已挂载完成,DOM 树($el)已可用
  130. onReady() {
  131. // this.dealFirstEnter();
  132. },
  133. onUnload() {
  134. this.clear();
  135. },
  136. methods: {
  137. dealNotice(rank) {
  138. // console.log('[dealFirstEnter]');
  139. let that = this;
  140. uni.getStorage({
  141. key: that.rankKey,
  142. success: (res) => {
  143. console.log('[getStorage]', that.rankKey, res.data);
  144. const oldRank = res.data;
  145. if (oldRank != rank) {
  146. // that.notice = true;
  147. that.setRankValue(rank);
  148. }
  149. },
  150. fail: (e) => {
  151. console.log('[getStorage] fail', that.rankKey, e);
  152. // that.notice = false;
  153. that.setRankValue(rank);
  154. },
  155. })
  156. },
  157. setRankValue(data) {
  158. let that = this;
  159. uni.setStorage({
  160. key: that.rankKey,
  161. data: data,
  162. success: () => {
  163. console.log('[setStorage] success', that.rankKey, data);
  164. },
  165. fail: (e) => {
  166. console.log('[setStorage] fail', that.rankKey, e);
  167. },
  168. })
  169. },
  170. dealFirstEnter() {
  171. // console.log('[dealFirstEnter]');
  172. let that = this;
  173. uni.getStorage({
  174. key: that.firstEnterKey,
  175. success: (res) => {
  176. console.log('[getStorage]', that.firstEnterKey, res.data);
  177. },
  178. fail: (e) => {
  179. console.log('[getStorage] fail', that.firstEnterKey, e);
  180. that.btnInfo();
  181. that.setFirstEnterValue(true);
  182. },
  183. })
  184. },
  185. setFirstEnterValue(data) {
  186. let that = this;
  187. uni.setStorage({
  188. key: that.firstEnterKey,
  189. data: data,
  190. success: () => {
  191. console.log('[setStorage] success', that.firstEnterKey, data);
  192. },
  193. fail: (e) => {
  194. console.log('[setStorage] fail', that.firstEnterKey, e);
  195. },
  196. })
  197. },
  198. clear() {
  199. if (this.interval != null) {
  200. clearInterval(this.interval);
  201. this.interval = null;
  202. }
  203. },
  204. loadConfig(config) {
  205. // console.log("config", config);
  206. // 加载CSS样式
  207. const css = config.css;
  208. if (css != undefined && css.length > 0) {
  209. tools.loadCssCode(css);
  210. if (css.indexOf(".top{") >= 0) {
  211. this.cssTop = "top";
  212. }
  213. }
  214. if (this.cssTop == "") {
  215. this.cssTop = "top-default";
  216. }
  217. console.log("[loadConfig] cssTop:", this.cssTop);
  218. const tabActiveColor = config.tabActiveColor;
  219. if (tabActiveColor != undefined && tabActiveColor.length > 0) {
  220. this.tabActiveColor = tabActiveColor;
  221. }
  222. // 加载队伍类型 0: 红黄蓝紫 1: 学生/家长
  223. if (config.teamType != undefined && config.teamType >= 0) {
  224. this.teamType = config.teamType;
  225. }
  226. if (this.teamType == 0) {
  227. this.dispArrStr = "total,team,in", // 要显示的集合范围 (total,team,in,other)
  228. this.tabItems = ['总排名', '队伍排名', '队内排名'];
  229. } else if (this.teamType == 1) {
  230. this.dispArrStr = "total,in,other", // 要显示的集合范围 (total,team,in,other)
  231. this.tabItems = ['总排名', '学生排名', '家长排名'];
  232. }
  233. // 加载弹窗数据
  234. const popupDataList = config.popupDataList;
  235. // console.log("[loadConfig] popupDataList:", popupDataList);
  236. if (popupDataList != undefined && popupDataList.length > 0) {
  237. for (var i = 0; i < popupDataList.length; i++) {
  238. // console.log("[loadConfig] popupDataList", i, popupDataList[i]);
  239. if (popupDataList[i] == 'default') {
  240. for (var j = 0; j < defaultPopUpDataList.length; j++) {
  241. this.popupDataList.push(defaultPopUpDataList[j]);
  242. }
  243. } else {
  244. this.popupDataList.push(popupDataList[i]);
  245. }
  246. }
  247. } else {
  248. this.popupDataList = defaultPopUpDataList;
  249. console.log("[loadConfig] popupDataList 加载默认列表");
  250. }
  251. // console.log("[loadConfig] popupDataList:", this.popupDataList);
  252. },
  253. // 获取倒计时
  254. getCountdown() {
  255. // console.log(this.endSecond)
  256. if (this.endSecond > 0) {
  257. const now = Date.now() / 1000;
  258. const dif = this.endSecond - now;
  259. // const dif = 3600*24 - 60;
  260. if (dif > 0) {
  261. this.countdown = '距结束 ' + tools.convertSecondsToDHM(dif);
  262. } else {
  263. this.countdown = "活动已结束";
  264. }
  265. // this.countdown = tools.convertSecondsToHMS(dif);
  266. } else {
  267. this.countdown = "距结束 --天--小时";
  268. }
  269. },
  270. fmtMcTime(timestamp) {
  271. return tools.fmtMcTime(timestamp);
  272. },
  273. // 获取活动时间
  274. getActtime() {
  275. this.acttime = tools.getActtime(this.beginSecond, this.endSecond);
  276. },
  277. getTeamName(teamType, teamIndex) {
  278. return teamName[teamType][teamIndex];
  279. },
  280. getCardConfigQuery() {
  281. uni.request({
  282. url: apiCardConfigQuery,
  283. header: {
  284. "Content-Type": "application/x-www-form-urlencoded",
  285. "token": this.token,
  286. },
  287. method: "POST",
  288. data: {
  289. ecId: this.ecId,
  290. pageName: this.pageName
  291. },
  292. success: (res) => {
  293. // console.log("getCardConfigQuery", res)
  294. const data = res.data.data;
  295. // console.log("configJson", data.configJson);
  296. const config = data.configJson != "" ? JSON.parse(data.configJson) : "";
  297. // console.log("configJson", data.configJson);
  298. /* const config = {
  299. "css": `
  300. .top{
  301. width: 100%;
  302. height: 26vh;
  303. padding-top: 30px;
  304. justify-content: space-between;
  305. background-image: url('static/backgroud/top_run.png'), url('static/backgroud/top_colorbar.png'), linear-gradient(180deg,#178bff 0%,#004d9b 100%);
  306. background-repeat: no-repeat;
  307. background-position: 45px 25px, center, 0px 0px;
  308. background-size: auto 27vh, auto 22vh , cover;
  309. }
  310. `,
  311. "tabActiveColor": "#ff870d",
  312. "popupDataList": [
  313. {
  314. "type": 1,
  315. "data": {
  316. "title": "山青活动",
  317. "img": "/static/logo/sqsj.png",
  318. "content": "山青世界为广大青少年提供了亲近自然、劳动实践、拓展培训、军事教育、科普体验、自然探索的平台和机会,也为企事业单位青年团队提供会议培训、拓展训练等服务",
  319. }
  320. },
  321. "default"
  322. ],
  323. "teamType": 1
  324. }; */
  325. this.loadConfig(config);
  326. this.getUnReadMessageQuery();
  327. this.getCardDetailQuery();
  328. setTimeout(this.dealFirstEnter, 500);
  329. },
  330. fail: (err) => {
  331. console.log("getCardConfigQuery err", err)
  332. },
  333. });
  334. },
  335. // 卡片对应活动或赛事详情查询
  336. getCardDetailQuery() {
  337. uni.request({
  338. url: apiCardDetailQuery,
  339. header: {
  340. "Content-Type": "application/x-www-form-urlencoded",
  341. "token": this.token,
  342. },
  343. method: "POST",
  344. data: {
  345. ecId: this.ecId
  346. },
  347. success: (res) => {
  348. // console.log("getCardDetailQuery", res)
  349. const data = res.data.data;
  350. this.mcType = data.mcType;
  351. this.mcId = data.mcId;
  352. this.mcName = data.mcName;
  353. this.beginSecond = data.beginSecond;
  354. this.endSecond = data.endSecond;
  355. this.coiName = data.coiName;
  356. this.teamNum = data.teamNum;
  357. this.ocaId = data.ocaId;
  358. this.mcState = tools.checkMcState(this.beginSecond, this.endSecond);
  359. this.getCountdown();
  360. this.getActtime();
  361. this.getCardRankDetailQuery();
  362. this.clear();
  363. this.interval = setInterval(this.getCountdown, 60000);
  364. },
  365. fail: (err) => {
  366. console.log("getCardDetailQuery err", err)
  367. },
  368. });
  369. },
  370. // 排名查询
  371. getCardRankDetailQuery() {
  372. uni.request({
  373. url: apiCardRankDetailQuery,
  374. header: {
  375. "Content-Type": "application/x-www-form-urlencoded",
  376. "token": this.token,
  377. },
  378. method: "POST",
  379. data: {
  380. mcIdListStr: this.mcId,
  381. mcType: this.mcType,
  382. dispArrStr: this.dispArrStr
  383. },
  384. success: (res) => {
  385. // console.log("getCardRankDetailQuery", res)
  386. const rankdata = res.data.data;
  387. this.rankList.totalRankRs = rankdata.totalRankRs;
  388. this.rankList.teamRankRs = rankdata.teamRankRs;
  389. this.rankList.inTeamRs = rankdata.inTeamRs;
  390. this.rankList.otherRs = rankdata.otherRs;
  391. },
  392. fail: (err) => {
  393. console.log("getCardRankDetailQuery err", err)
  394. },
  395. });
  396. },
  397. // 卡片用户当前排名查询
  398. getUserCurrentRankNumQuery() {
  399. uni.request({
  400. url: apiUserCurrentRankNumQuery,
  401. header: {
  402. "Content-Type": "application/x-www-form-urlencoded",
  403. "token": this.token,
  404. },
  405. method: "POST",
  406. data: {
  407. ecId: this.ecId
  408. },
  409. success: (res) => {
  410. // console.log("getUserCurrentRankNumQuery", res)
  411. if (res.data.code == 0) {
  412. const data = res.data.data;
  413. const rankNum = data.rankNum;
  414. this.dealNotice(rankNum);
  415. }
  416. },
  417. fail: (err) => {
  418. console.log("getUserCurrentRankNumQuery err", err)
  419. },
  420. });
  421. },
  422. // 是否允许重新分组(报名)
  423. isAllowMcSignUp() {
  424. uni.request({
  425. url: apiIsAllowMcSignUp,
  426. header: {
  427. "Content-Type": "application/x-www-form-urlencoded",
  428. "token": this.token,
  429. },
  430. method: "POST",
  431. data: {
  432. ecId: this.ecId
  433. },
  434. success: (res) => {
  435. // console.log("isAllowMcSignUp", res)
  436. if (res.data.code == 0) {
  437. const data = res.data.data;
  438. this.allowMcSignUp = data.allowSignUp;
  439. }
  440. },
  441. fail: (err) => {
  442. console.log("isAllowMcSignUp err", err)
  443. },
  444. });
  445. },
  446. // 未读消息列表查询
  447. getUnReadMessageQuery() {
  448. uni.request({
  449. url: apiUnReadMessageQuery,
  450. header: {
  451. "Content-Type": "application/x-www-form-urlencoded",
  452. "token": this.token,
  453. },
  454. method: "POST",
  455. data: {
  456. relationType: 2, // 类型 1 成就 2 卡片
  457. relationId: this.ecId
  458. },
  459. success: (res) => {
  460. // console.log("getUnReadMessageQuery", res);
  461. if (checkResCode(res)) {
  462. const unReadMessageRs = res.data.data;
  463. this.popupMessageList.length = 0;
  464. this.mqIdListStr = "";
  465. for (var i = 0; i < unReadMessageRs.length; i++) {
  466. let popupData = {
  467. type: 6, // 6: 通知
  468. data: {}
  469. };
  470. this.messageKey += "-" + unReadMessageRs[i].mqId;
  471. popupData.data.mqType = unReadMessageRs[i].mqType;
  472. popupData.data.title = unReadMessageRs[i].mqTitle;
  473. popupData.data.message = unReadMessageRs[i].mqMessage;
  474. this.popupMessageList.push(popupData);
  475. // this.mqIdListStr += this.unReadMessageRs[i].mqId;
  476. // if (i < this.unReadMessageRs.length - 1) {
  477. // this.mqIdListStr += ",";
  478. // }
  479. }
  480. if (this.popupMessageList.length > 0) {
  481. const messageValue = uni.getStorageSync(this.messageKey);
  482. console.log("messageValue:", messageValue);
  483. if (!messageValue) {
  484. this.$refs.mypopupMessage.popupOpen();
  485. uni.setStorageSync(this.messageKey, true);
  486. }
  487. }
  488. }
  489. },
  490. fail: (err) => {
  491. console.log("getUnReadMessageQuery err", err);
  492. },
  493. });
  494. },
  495. // 标记消息已读
  496. readMessage() {
  497. uni.request({
  498. url: apiReadMessage,
  499. header: {
  500. "Content-Type": "application/x-www-form-urlencoded",
  501. "token": this.token,
  502. },
  503. method: "POST",
  504. data: {
  505. "mqIdListStr": this.mqIdListStr
  506. },
  507. success: (res) => {
  508. // console.log("readMessage", res);
  509. },
  510. fail: (err) => {
  511. console.log("readMessage err", err);
  512. },
  513. });
  514. },
  515. btnBack() {
  516. // window.history.back();
  517. const url = `action://to_home/`;
  518. tools.appAction(url);
  519. },
  520. btnReGroup() {
  521. this.queryObj.from = "rankList";
  522. this.queryString = tools.objectToQueryString(this.queryObj);
  523. // uni.navigateTo({
  524. // url: '/pages/bm/style1/signup?' + this.queryString
  525. // });
  526. const url = '/pages/bm/style1/signup?' + this.queryString;
  527. tools.appAction(url, "uni.navigateTo");
  528. },
  529. btnStart() {
  530. const url = `action://to_detail/?id=${this.ocaId}&matchType=${this.mcType}`;
  531. tools.appAction(url);
  532. },
  533. btnInfo() {
  534. // console.log(this.$refs.mypopup);
  535. this.$refs.mypopup.popupOpen();
  536. },
  537. btnMessage() {
  538. // console.log(this.$refs.mypopup);
  539. this.$refs.mypopupMessage.popupOpen();
  540. },
  541. onClickTabItem(e) {
  542. if (this.tabCurrent != e.currentIndex) {
  543. this.tabCurrent = e.currentIndex;
  544. }
  545. }
  546. }
  547. }
  548. </script>
  549. <style scoped>
  550. .content {
  551. width: 100vw;
  552. height: 100vh;
  553. }
  554. .top-default {
  555. width: 100%;
  556. height: 24.6vh;
  557. padding-top: 36px;
  558. justify-content: space-between;
  559. background-image: url("/static/backgroud/top_run.png"), url("/static/backgroud/top_colorbar.png"), linear-gradient(180deg,#f8a95a 0%,#d25f11 100%);
  560. /* background-image: url("/static/backgroud/top_run.png"), url("/static/backgroud/top_colorbar.png"), linear-gradient(180deg,#7aedff 0%,#047200 100%); */
  561. /* background-image: url("/static/backgroud/top_run.png"), url("/static/backgroud/top_colorbar.png"), linear-gradient(180deg,#178bff 0%,#004d9b 100%); */
  562. background-repeat: no-repeat;
  563. background-position: 45px 25px, center, 0px 0px;
  564. /* background-position-x: center; */
  565. /* background-position-y: center; */
  566. background-size: auto 27vh, auto 22vh , cover;
  567. }
  568. .topbar-color {
  569. color: white;
  570. }
  571. .topcontent {
  572. /* height: 1300rpx; */
  573. /* background-color: #2e85ec; */
  574. margin-top: 50rpx;
  575. justify-content: center;
  576. }
  577. .top-countdown {
  578. height: 90rpx;
  579. color: #ffdc51;
  580. font-size: 28rpx;
  581. }
  582. .cal {
  583. width: 46rpx;
  584. height: 46rpx;
  585. margin-right: 20rpx;
  586. }
  587. .toptext {
  588. margin: 0 10rpx;
  589. color: #ffffff;
  590. font-size: 35rpx;
  591. font-weight: 500;
  592. line-height: 60rpx;
  593. }
  594. .btnReGroup {
  595. width: 130rpx;
  596. height: 36rpx;
  597. margin-top: 15rpx;
  598. margin-bottom: 15rpx;
  599. background: #ffcb00;
  600. border-radius: 15px;
  601. color: #000000;
  602. font-size: 24rpx;
  603. text-align: center;
  604. line-height: 36rpx;
  605. }
  606. .topbtm {
  607. width: 100%;
  608. height: 60rpx;
  609. margin-bottom: 10rpx;
  610. justify-content: space-evenly;
  611. }
  612. .topbtm-content {
  613. width: 100%;
  614. justify-content: space-around;
  615. /* justify-content: space-between; */
  616. }
  617. .topbtm-sspm {
  618. width: 120rpx;
  619. color: #ffee00;
  620. font-size: 24rpx;
  621. text-align: center;
  622. }
  623. .main {
  624. width: 100%;
  625. /* height: 70vh; */
  626. flex-grow: 1;
  627. justify-content: space-around;
  628. /* justify-content: space-between; */
  629. }
  630. .main-tab {
  631. width: 90%;
  632. margin-top: 20rpx;
  633. }
  634. .tab-view {
  635. width: 100%;
  636. /* height: 69vh; */
  637. flex-grow: 1;
  638. }
  639. .btnStart {
  640. width: 70%;
  641. /* height: 6vh; */
  642. height: 80rpx;
  643. /* margin-bottom: 1vh; */
  644. margin-bottom: 20rpx;
  645. /* font-weight: bold; */
  646. color: white;
  647. font-size: 32rpx;
  648. line-height: 80rpx;
  649. border-radius: 27px;
  650. }
  651. .btnStart-enable {
  652. background-color: #ffb40b;
  653. }
  654. .btnStart-disable {
  655. background-color: #c3c3c3;
  656. }
  657. </style>