rankList.vue 20 KB

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