wzx 11 месяцев назад
Родитель
Сommit
9ef5b95046

+ 3 - 0
card/common/api.js

@@ -25,6 +25,9 @@ export const apiUserCurrentRankNumQuery = apiServer + 'UserCurrentRankNumQuery';
 // 用户是否已经报名卡片对应赛事查询
 export const apiUserJoinCardQuery = apiServer + 'UserJoinCardQuery';
 
+// 用户在卡片对应赛事是否新用户
+export const apiIsNewUserInCardComp = apiServer + 'IsNewUserInCardComp';
+
 // 线上赛报名页面信息详情
 export const apiOnlineMcSignUpDetail = apiServer + 'OnlineMcSignUpDetail';
 

+ 31 - 0
card/common/cardfunc.js

@@ -3,6 +3,7 @@ import {
 	apiCardConfigQuery,
 	apiWarnMessageQuery,
 	apiUnReadMessageQuery,
+	apiIsNewUserInCardComp,
 	checkResCode
 } from '/common/api';
 
@@ -15,6 +16,7 @@ var cardfunc = {
 	caller: null,
 	token: "",
 	ecId: 0, // 卡片id
+	isNewUser: false,	// 是否新用户
 	
 	cardConfigData: {
 		tabActiveColor: "#81cd00",
@@ -305,6 +307,35 @@ var cardfunc = {
 			},
 		});
 	},
+	
+	// 用户是否新用户
+	isNewUserQuery(callback=null) {
+		uni.request({
+			url: apiIsNewUserInCardComp,
+			header: {
+				"Content-Type": "application/x-www-form-urlencoded",
+				"token": this.token,
+			},
+			method: "POST",
+			data: {
+				// ecId: this.ecId
+				ecId: 0	// 0 全部赛事活动
+			},
+			success: (res) => {
+				// console.log("isNewUserInCardComp", res);
+				if (checkResCode(res)) {
+					this.isNewUser = res.data.data.isNew;
+					// this.isNewUser = true;	// test
+					if (callback != null) {
+						callback(this.isNewUser);
+					}
+				}
+			},
+			fail: (err) => {
+				console.log("isNewUserInCardComp err", err);
+			},
+		});
+	},
 
 }
 

+ 131 - 0
card/components/my-guide/my-guide.vue

@@ -0,0 +1,131 @@
+<template>
+	<uni-popup ref="popup" :mask-click="false" maskBackgroundColor="rgba(0, 0, 0, 0.6)">
+		<view class="body">
+			<view class="content content-bg" :style="getGuideStyle('bg')">
+				<view class="mask uni-column" :style="getGuideStyle('mask')">
+					<view class="btnBox uni-column">
+						<button v-if="guideSn < guide.length-1" class="btn btnNext" @click="btnNext"></button>
+						<button v-if="guideSn == guide.length-1" class="btn btnReplay" @click="btnReplay"></button>
+						<button v-if="guideSn == guide.length-1" class="btn btnClose" @click="btnClose"></button>
+					</view>
+				</view>
+			</view>
+		</view>
+	</uni-popup>
+</template>
+
+<script>
+	export default {
+		name: "my-guide",
+		emits: ['popup-close'],
+		data() {
+			return {
+				isOpen: false,
+				guideSn: 0,
+				guide: [
+					{
+						bg: "static/help/guide1_bg.png",
+						mask: "static/help/guide1_1.png"
+					},
+					{
+						bg: "static/help/guide1_bg.png",
+						mask: "static/help/guide1_2.png"
+					},
+					{
+						bg: "static/help/guide1_bg.png",
+						mask: "static/help/guide1_3.png"
+					},
+					{
+						bg: "static/help/guide1_bg.png",
+						mask: "static/help/guide1_4.png"
+					},
+					{
+						bg: "static/help/guide1_bg.png",
+						mask: "static/help/guide1_5.png"
+					},
+				]
+			};
+		},
+		methods: {
+			getGuideStyle(item) {
+				const bgurl = this.guide[this.guideSn][item]
+				return `background-image: url("${bgurl}")`;
+			},
+			btnNext() {
+				if (this.guideSn < this.guide.length-1) {
+					this.guideSn++;
+				}
+			},
+			btnReplay() {
+				this.guideSn = 0;
+			},
+			btnClose() {
+				this.popupClose();
+			},
+			popupOpen() {
+				this.$refs.popup.open();
+				this.isOpen = true;
+			},
+			popupClose() {
+				this.$refs.popup.close();
+				this.guideSn = 0;
+				this.isOpen = false;
+				this.$emit('popup-close');
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100vw;
+		height: 100vh;
+		background: #000000;
+	}
+
+	.content-bg {
+		/* background: url('../../static/help/guide1_bg.png'); */
+		background-repeat: no-repeat;
+		background-position-x: center;
+		background-position-y: center;
+		background-size: contain;
+	}
+
+	.mask {
+		position: relative;
+		width: 100%;
+		height: 100%;
+		/* background: url('../../static/help/guide1_4.png'); */
+		background-repeat: no-repeat;
+		background-position-x: center;
+		background-position-y: center;
+		background-size: contain;
+	}
+
+	.btnBox {
+		position: absolute;
+		left: 16%;
+		bottom: 13.6%;
+	}
+
+	.btn {
+		width: 200rpx;
+		height: 60rpx;
+		margin-top: 20px;
+	}
+
+	.btnNext {
+		background: url('../../static/help/btn_next.png') no-repeat center;
+		background-size: contain;
+	}
+
+	.btnReplay {
+		background: url('../../static/help/btn_replay.png') no-repeat center;
+		background-size: contain;
+	}
+
+	.btnClose {
+		background: url('../../static/help/btn_close.png') no-repeat center;
+		background-size: contain;
+	}
+</style>

+ 16 - 7
card/components/my-pathList/my-pathList.vue

@@ -47,9 +47,10 @@
 			mcState: 0, // 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
 			selectedPath: 0, // 用户已选择的路线(ocaId)
 			showLine: false, // 是否显示线条
-			style: ""
+			style: "",
+			isNewUser: false // 是否新用户
 		},
-		emits: ['onPathClick'],
+		emits: ['onPathClick', 'onNewUserPathClick'],
 		data() {
 			return {
 				navPoint: {},
@@ -90,9 +91,7 @@
 						this.alertDialog.data = item;
 						this.$refs.alertDialog.open();
 					} else {
-						const url = `action://to_detail/?id=${item.path.ocaId}&matchType=${item.path.mcType}`;
-						tools.appAction(url);
-						this.$emit('onPathClick', item);
+						this.startGame(item);
 					}
 				} else if (this.mcState == 0) {
 					uni.showToast({
@@ -118,12 +117,22 @@
 			},
 			dialogConfirm() {
 				const item = this.alertDialog.data;
+				this.startGame(item);
+			},
+			dialogClose() {
+			},
+			startGame(item) {
+				if (this.isNewUser) {
+					this.$emit('onNewUserPathClick', item);
+				} else {
+					this.to_detail(item);
+				}
+			},
+			to_detail(item) {
 				const url = `action://to_detail/?id=${item.path.ocaId}&matchType=${item.path.mcType}`;
 				tools.appAction(url);
 				this.$emit('onPathClick', item);
 			},
-			dialogClose() {
-			}
 		}
 	}
 </script>

+ 49 - 0
card/components/my-popup/my-popup.vue

@@ -229,6 +229,24 @@
 					<button v-else class="swiper-item-button" @click="popupClose">确 定</button>
 				</view>
 				
+				<!-- 视频 -->
+				<view v-if="item.type == 10" class="swiper-item-view uni-column">
+					<text class="swiper-item-title" v-html="item.data.title"></text>
+
+					<view class="swiper-item-main uni-column uni-jct">
+						<video id="myVideo" class="swiper-item-video" :style="getVideoStyle(item.data.video)" :src="item.data.video.src" :poster="item.data.video.poster" :http-cache="true"
+							@error="videoErrorCallback" :danmu-list="item.data.video.danmuList" enable-danmu danmu-btn>
+						</video>
+						<view class="swiper-item-content5">
+							<view v-if="item.data.content" v-html="item.data.content"></view>
+						</view>
+					</view>
+				
+					<button v-if="index < dataList.length - 1" class="swiper-item-button" @click="swiperNext">继
+						续</button>
+					<button v-else class="swiper-item-button" @click="popupClose">确 定</button>
+				</view>
+				
 			</swiper-item>
 		</swiper>
 	</uni-popup>
@@ -338,12 +356,38 @@
 				styleStr = `height: ${height}; margin-top: 15px; margin-bottom: 25px;`;
 				return styleStr;
 			},
+			getVideoStyle(item) {
+				let styleStr = "";
+				let width = "100%";
+				let height = "270px";
+				
+				if (item != undefined && item.width != undefined) {
+					width = item.width;
+				}
+				if (item != undefined && item.height != undefined) {
+					height = item.height;
+				}
+				
+				// const width = item.width ?? "90px";
+				// const height = item.height ?? "90px";
+				styleStr = `width: ${width}; height: ${height};`;
+				return styleStr;
+			},
 			getSponsorsLogoStyle(bgurl) {
 				return `background-image: url("${bgurl}")`;
 			},
 			onNoMoreRemindersClick() {
 				this.$emit('noMoreRemindersClick');
 			},
+			videoErrorCallback: function(e) {
+				console.log('视频错误信息:', e);
+				// console.log(e.target.errMsg);
+				uni.showToast({
+					title: '视频加载出错了',
+					icon: 'none',
+					duration: 3000
+				});
+			},
 			// getTeamName(teamType, teamIndex) {
 			// 	return teamName[teamType][teamIndex];
 			// },
@@ -498,6 +542,11 @@
 		overflow-y: scroll;
 	}
 	
+	.swiper-item-video {
+		margin-top: 10px;
+		margin-bottom: 10px;
+	}
+	
 	.swiper-item-pointName {
 		font-size: 13px;
 		font-weight: 500;

+ 10 - 0
card/components/my-ranklist/my-ranklist.vue

@@ -12,7 +12,11 @@
 							<text class="item-additionalName">({{item.additionalName}})</text>
 						</view>
 						<text v-else class="item-userName">{{ teamType >= 0 ? getTeamName(teamType, item.userName) : item.userName}}</text>
+						<!-- isInGame 是否正在比赛中 0 不在 1 在 -->
 						<image class="item-inGame" v-if="item.isInGame == 1" mode="aspectFit" src="/static/common/ingame.gif"></image>
+						<!-- isTodayFinishGame 当日完赛 0 没有比赛 1 非正常完赛 2 正常完赛 -->
+						<!-- <image class="item-todayFinish" v-else-if="item.isTodayFinishGame == 1" mode="aspectFit" src="/static/common/unfinishgame.png"></image> -->
+						<image class="item-todayFinish" v-else-if="item.isTodayFinishGame == 2" mode="aspectFit" src="/static/common/finishgame.png"></image>
 						<text v-if="item.isDispInGameUserNum == 1 && item.inGameUserNum > 0" class="item-inGameNum">x {{item.inGameUserNum}}</text>
 					</view>
 					<text class="item-totalTime" v-if="rankType == 'totalDistance'">{{fmtDistanct(item.inRankNum)}} km</text>
@@ -325,6 +329,12 @@
 		margin-left: 3px;
 	}
 	
+	.item-todayFinish {
+		width: 18px;
+		height: 25px;
+		margin-left: 3px;
+	}
+	
 	.item-inGameNum {
 		margin-top: 8px;
 		font-size: 10px;

+ 28 - 18
card/index.html

@@ -1,20 +1,30 @@
 <!DOCTYPE html>
 <html lang="en">
-  <head>
-    <meta charset="UTF-8" />
-    <script>
-      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
-        CSS.supports('top: constant(a)'))
-      document.write(
-        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
-        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
-    </script>
-    <title></title>
-    <!--preload-links-->
-    <!--app-context-->
-  </head>
-  <body>
-    <div id="app"><!--app-html--></div>
-    <script type="module" src="/main.js"></script>
-  </body>
-</html>
+	<head>
+		<meta charset="UTF-8" />
+		
+		<!-- 设置 meta 不缓存 -->
+		
+		<!-- 设置HTTP响应头中的Cache-Control属性,告诉浏览器不要缓存页面的任何部分,包括图片、脚本等。同时,要求浏览器在每次请求时都必须向服务器验证资源的新鲜度。 -->
+		<!-- <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> -->
+		<!-- 设置HTTP响应头中的Pragma属性,它与Cache-Control类似,但主要用于HTTP/1.0协议。同样表示不缓存页面的任何部分。 -->
+		<!-- <meta http-equiv="Pragma" content="no-cache" /> -->
+		<!-- 设置HTTP响应头中的Expires属性,它指定了页面的过期时间。设置为0表示页面立即过期,即每次都需要重新从服务器获取。 -->
+		<!-- <meta http-equiv="Expires" content="0" /> -->
+
+		<script>
+			var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+				CSS.supports('top: constant(a)'))
+			document.write(
+				'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+				(coverSupport ? ', viewport-fit=cover' : '') + '" />')
+		</script>
+		<title></title>
+		<!--preload-links-->
+		<!--app-context-->
+	</head>
+	<body>
+		<div id="app"><!--app-html--></div>
+		<script type="module" src="/main.js"></script>
+	</body>
+</html>

+ 2 - 2
card/manifest.json

@@ -2,8 +2,8 @@
     "name" : "card",
     "appid" : "__UNI__A61F96B",
     "description" : "",
-    "versionName" : "2.0.1",
-    "versionCode" : 201,
+    "versionName" : "2.0.3",
+    "versionCode" : 203,
     "transformPx" : false,
     /* 5+App特有相关 */
     "app-plus" : {

+ 24 - 1
card/pages/tpl/style1/rankOverview.vue

@@ -47,10 +47,13 @@ https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style1/rankOverview
 
 			<view class="main uni-column">
 				<text class="main-title">选择比赛路线</text>
-				<my-pathList :style="pathListStyle.style" :pathList="pathList" :mcState="mcState" :showLine="pathListStyle.showLine"></my-pathList>
+				<my-pathList ref="myPathList" :style="pathListStyle.style" :pathList="pathList" :mcState="mcState" 
+					:showLine="pathListStyle.showLine" :isNewUser="isNewUser" @onNewUserPathClick="onNewUserPathClick"></my-pathList>
+				<!-- <button class="btnGuide" @click="btnGuide">新手引导</button> -->
 			</view>
 
 			<my-popup ref="mypopup" :config="cardConfigData.popupRuleConfig" :dataList="cardConfigData.popupRuleList" :acttime="acttime"></my-popup>
+			<my-guide ref="myGuide" @popup-close="onGuideClose"></my-guide>
 			<!-- <my-popup-map ref="mypopupmap" :point="navPoint"></my-popup-map> -->
 		</view>
 	</view>
@@ -80,6 +83,7 @@ https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style1/rankOverview
 				queryObj: {},
 				queryString: "",
 				token: "",
+				isNewUser: false,
 
 				ecId: 0, // 卡片id
 				mcId: 0, // 赛事id
@@ -104,6 +108,7 @@ https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style1/rankOverview
 				mcState: 0, // 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
 				pathList: {},
 				pathListStyle: {},
+				selectedPath: null,
 				navPoint: {},
 			}
 		},
@@ -128,6 +133,7 @@ https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style1/rankOverview
 
 			cardfunc.init(this, this.token, this.ecId);
 			cardfunc.getCardConfig(this.cardConfigQueryCallback, localCardConfig);
+			cardfunc.isNewUserQuery(this.isNewUserQueryCallback);
 		},
 		// 页面初次渲染完成,此时组件已挂载完成,DOM 树($el)已可用
 		onReady() {
@@ -211,6 +217,9 @@ https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style1/rankOverview
 				this.matchRsDetailQuery();
 				setTimeout(this.dealFirstEnter, 500);
 			},
+			isNewUserQueryCallback(isNewUser) {
+				this.isNewUser = isNewUser;
+			},
 			loadConfig(cardconfig) {
 				cardconfig = cardfunc.parseCardConfig(cardconfig);
 				// console.log("[loadCardConfig] cardconfig:", cardconfig);
@@ -341,12 +350,26 @@ https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style1/rankOverview
 				// console.log(this.$refs.mypopup);
 				this.$refs.mypopup.popupOpen();
 			},
+			// btnGuide() {
+			// 	this.$refs.myGuide.popupOpen();
+			// },
 			onOverviewClick(ovtype) {
 				this.queryObj.ovtype = ovtype;
 				this.queryString = tools.objectToQueryString(this.queryObj);
 				const url = "/pages/tpl/style1/rankList?" + this.queryString;
 				tools.appAction(url, "uni.navigateTo");
 			},
+			onNewUserPathClick(data) {
+				// console.log("onNewUserPathClick:", data);
+				this.selectedPath = data;
+				this.$refs.myGuide.popupOpen();
+			},
+			onGuideClose() {
+				if (this.isNewUser && this.selectedPath != null) {
+					this.$refs.myPathList.to_detail(this.selectedPath);
+					this.selectedPath = null;
+				}
+			}
 		}
 	}
 </script>

+ 24 - 0
card/pages/tpl/style2/cardconfig/test.js

@@ -35,6 +35,30 @@ export const localCardConfig = `{
 			"height": "530px"
 		},
 		"popupRuleList": [{
+				"type": 10,
+				"data": {
+					"title": "领秀城社区定向赛",
+					"video": {
+						"src": "https://oss-mbh5.colormaprun.com/video/领秀城社区定向赛.mp4",
+						"poster": "static/common/jbbs2.png",
+						"width": "100%",
+						"height": "280px",
+						"danmuList2": [{
+								"text": "第 1s 出现的弹幕",
+								"color": "#ff0000",
+								"time": 1
+							},
+							{
+								"text": "第 3s 出现的弹幕",
+								"color": "#ff00ff",
+								"time": 3
+							}
+						]
+					},
+					"content": "济南奥体中心“一场三馆”包括体育场、体育馆、网球馆和游泳馆,呈现出“东荷西柳”的总体布局。 体育场以济南的“市树”柳树为母题,将垂柳柔美飘逸的形态固化为建筑语言。"
+				}
+			},
+			{
 				"type": 1,
 				"data": {
 					"title": "小飞龙定向赛",

+ 934 - 909
card/pages/tpl/style2/rankOverview.vue

@@ -1,910 +1,935 @@
-<!-- 
-[模板] 样式2 - 排名总览
-http://localhost:5173/card/#/pages/tpl/style2/rankOverview
-https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style2/rankOverview
- -->
-<template>
-	<view class="body">
-		<view v-if="pageReady" class="content uni-column">
-			<view class="uni-column page-top">
-				<my-topbar :mcName="mcName" class="topbar-color"
-					@btnBackClick="btnBack" @btnInfoClick="btnInfo"></my-topbar>
-				
-				<view class="topcontent uni-column uni-jcsa">
-					<view class="logo"></view>
-					<text v-if="configParam.subTitle.length > 0" class="top-acttime">{{configParam.subTitle}}</text>
-					<text v-else class="top-acttime">{{fmtMcTime2(beginSecond, endSecond)}}</text>
-				</view>
-			</view>
-			<view v-if="configParam.midType == 0" class="midType0 uni-column">
-				<view class="mid-0 uni-row uni-jcc">
-					<view class="mid-0-select">
-						<e-select v-model="ocaId" :options="mapList" :search="false" :inputClick="true"
-							maxHeight="300px" :clearable="false" @change="eSelectChange"></e-select>
-					</view>
-					<text v-if="cardConfigData.popupHelpList.length > 0" class="mid-0-help" @click="btnHelp">帮助</text>
-				</view>
-				<view class="midType0-mid-1 uni-row uni-jcc">
-					<view class="uni-row">
-						<image v-if="cardConfigData.popupWarnList.length > 0" class="mid-1-yellowCard" mode="aspectFit" 
-						 @click="btnWarn" src="/static/common/card_yellow.gif"></image>
-						<text class="mid-1-text">{{nickName}}</text>
-					</view>
-					<!-- <text class="mid-1-text">{{coiName}}</text> -->
-					<text class="mid-1-text" style="color: #aaaaaa; margin-left: 20px;" v-if="mcState==1 && allowMcSignUp"
-						@click="btnReGroup">修改</text>
-				</view>
-				<view class="mid-2 uni-row uni-jcsa">
-					<view class="uni-column">
-						<text class="mid-2-value">{{regionTotalNum}}</text>
-						<text class="mid-2-text">场次</text>
-					</view>
-
-					<view class="mid-line"></view>
-					<view class="uni-column">
-						<text class="mid-2-value">{{regionTotalCp}}</text>
-						<text class="mid-2-text">打点数</text>
-					</view>
-
-					<view class="mid-line"></view>
-					<view class="uni-column">
-						<text class="mid-2-value">{{regionTotalCpRankNum}}</text>
-						<text class="mid-2-text">个人排名</text>
-					</view>
-
-				</view>
-			</view>
-			
-			<view v-if="configParam.midType == 1" class="midType1 uni-column">
-				<view class="mid-0 uni-row uni-jcc">
-					<view class="mid-0-select">
-						<e-select v-model="ocaId" :options="mapList" :search="false" :inputClick="true"
-							maxHeight="300px" :clearable="false" @change="eSelectChange"></e-select>
-					</view>
-					<view class="mid-0-right uni-row uni-jcsa">
-						<text class="" style="" v-if="mcState==1 && allowMcSignUp"
-							@click="btnReGroup">修改</text>
-						<text v-if="cardConfigData.popupHelpList.length > 0" class="" @click="btnHelp">帮助</text>
-					</view>
-				</view>
-				<view class="midType1-mid-1 uni-row uni-jcse">
-					<view class="uni-row">
-						<image v-if="cardConfigData.popupWarnList.length > 0" class="mid-1-yellowCard" mode="aspectFit" 
-						 @click="btnWarn" src="/static/common/card_yellow.gif"></image>
-						<text class="mid-1-name">{{nickName}}</text>
-					</view>
-					<!-- <text class="mid-1-name">{{coiName}}</text> -->
-					<text class="uni-nowrap">场次:{{regionTotalNum}}</text>
-				</view>
-				<view class="mid-2 uni-row uni-jcsa">
-					<view class="uni-column">
-						<text class="mid-2-value" style="color: #ff0045;">{{regionTotalSysPoint}}</text>
-						<text class="mid-2-text">百味豆</text>
-					</view>
-			
-					<view class="mid-line"></view>
-			
-					<view class="uni-column">
-						<text class="mid-2-value">{{fmtDistanct(regionTotalDictance)}}</text>
-						<text class="mid-2-text">里程 km</text>
-					</view>
-			
-					<view class="mid-line"></view>
-					<view class="uni-column">
-						<text class="mid-2-value">{{regionTotalCp}}</text>
-						<text class="mid-2-text">打点数</text>
-					</view>
-			
-					<view class="mid-line"></view>
-			
-					<view class="uni-column">
-						<text class="mid-2-value">{{fmtPace(regionFastPace)}}</text>
-						<text class="mid-2-text">最快配速</text>
-					</view>
-				</view>
-			</view>
-
-			<view class="main uni-column">
-				<text class="main-title">选择比赛路线</text>
-				<my-pathList :style="pathListStyle.style" :pathList="pathList"
-					:selectedPath="ocaId" :mcState="mcState" :showLine="pathListStyle.showLine"
-					@onPathClick="onPathClick"></my-pathList>
-			</view>
-			
-			<view class="bottom uni-column">
-				<button class="btnStartGame bgcolor-main" @click="btnStartGame">开始比赛</button>
-			</view>
-			
-			<my-popup ref="mypopup" :config="cardConfigData.popupRuleConfig" :dataList="cardConfigData.popupRuleList" :acttime="acttime"></my-popup>
-			<my-popup ref="mypopupHelp" :config="cardConfigData.popupHelpConfig" :dataList="cardConfigData.popupHelpList"></my-popup>
-			<my-popup ref="mypopupWarn" :config="cardConfigData.popupWarnConfig" :dataList="cardConfigData.popupWarnList"></my-popup>
-			<!-- <my-popup-map ref="mypopupmap" :point="navPoint"></my-popup-map> -->
-		</view>
-	</view>
-</template>
-
-<script>
-	import tools from '/common/tools';
-	import cardfunc from '../../../common/cardfunc';
-	import { localCardConfig } from "./cardconfig/test.js";
-	import {
-		token,
-		apiMapListQuery,
-		apiMatchRsDetailQuery,
-		apiIsAllowMcSignUp,
-		checkResCode
-	} from '/common/api';
-
-	export default {
-		data() {
-			return {
-				cardConfigData: cardfunc.cardConfigData,
-				pageReady: false,
-				pageName: "rankOverview",
-				firstEnterKey: 'firstEnter-tpl-style2',
-				rankKey: "rank-tpl-style2",
-				mapKey: "rank-tpl-style2-map",
-				queryObj: {},
-				queryString: "",
-				token: "",
-
-				ecId: 0, // 卡片id
-				mcId: 0, // 赛事id
-				mcType: 0, // 赛事类型 1 普通活动 2 线下赛 3 线上赛
-				mcName: "", // 赛事名称
-				coiName: "", // 已报名单位名称
-				acttime: "", // 活动时间
-				beginSecond: null, // 活动或赛事开始时间戳,单位秒
-				endSecond: null, // 活动或赛事结束时间戳,单位秒
-				ocaId: 0, // 关联id,带入到App活动详情页面
-				nickName: "", // 昵称
-
-				totalNum: null, // 总场次
-				totalDistanct: null, // 总距离,单位米
-				totalDistanctRankNum: null, // 总距离排名
-				totalCp: null, // 总打点数
-				totalCpRankNum: null, // 总打点数排名
-				totalSysPoint: null, // 总百味豆
-				totalSysPointRankNum: null, // 总百味豆排名
-				fastPace: null, // 个人最快配速
-				fastPaceRankNum: null, // 个人最快配速排名
-				regionTotalNum: null, // 地图内总场次
-				regionTotalCp: null, // 地图内打点数
-				regionTotalCpRankNum: null, // 地图内个人打点排名
-				regionTotalSysPoint: null, // 地图内积分(百味豆)
-				regionTotalDictance: null, // 地图内里程(单位米)
-				regionFastPace: null, // 地图内最快配速
-				ocaRs: [], // 卡片对应活动集合
-
-				mapList: [], // 地图列表
-
-				interval: null,
-				mcState: 0, // 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
-				allowMcSignUp: false, // 是否允许重新分组
-				pathList: {},
-				pathListStyle: {},
-				navPoint: {},
-				configParam: {
-					subTitle: "",
-					midType: 0
-				},
-			}
-		},
-		computed: {
-			pathListLen() {
-				return Object.keys(this.pathList).length;
-			}
-		},
-		onLoad(query) { // 类型非必填,可自动推导
-			// uni.showLoading({
-			// 	title: '加载中'
-			// });
-			
-			// console.log("query:", query);
-			this.queryObj = query;
-			this.queryString = tools.objectToQueryString(this.queryObj);
-			// console.log(queryString);
-			this.token = query["token"] ?? token;
-			this.ecId = query["id"] ?? 0;
-
-			this.firstEnterKey += "-" + this.ecId;
-			console.log("firstEnterKey:", this.firstEnterKey);
-
-			this.rankKey += "-" + this.ecId;
-			console.log("rankKey:", this.rankKey);
-
-			this.mapKey += "-" + this.ecId;
-			console.log("mapKey:", this.mapKey);
-
-			const mapValue = uni.getStorageSync(this.mapKey);
-			if (mapValue) {
-				console.log("mapValue:", mapValue);
-				this.ocaId = mapValue;
-			}
-
-			cardfunc.init(this, this.token, this.ecId);
-			cardfunc.getCardConfig(this.cardConfigQueryCallback, localCardConfig);
-		},
-		// 页面初次渲染完成,此时组件已挂载完成,DOM 树($el)已可用
-		onReady() {
-			// this.dealFirstEnter();
-		},
-		onShow() {
-		},
-		onUnload() {
-			this.clear();
-		},
-		methods: {
-			dealNotice(rank) {
-				// console.log('[dealFirstEnter]');
-				let that = this;
-				uni.getStorage({
-					key: that.rankKey,
-					success: (res) => {
-						// console.log('[getStorage]', that.rankKey, res.data);
-						const oldRank = res.data;
-						if (oldRank != rank) {
-							// that.notice = true;
-							that.setRankValue(rank);
-						}
-					},
-					fail: (e) => {
-						console.log('[getStorage] fail', that.rankKey, e);
-						// that.notice = false;
-						that.setRankValue(rank);
-					},
-				})
-			},
-			setRankValue(data) {
-				let that = this;
-				uni.setStorage({
-					key: that.rankKey,
-					data: data,
-					success: () => {
-						console.log('[setStorage] success', that.rankKey, data);
-					},
-					fail: (e) => {
-						console.log('[setStorage] fail', that.rankKey, e);
-					},
-				})
-			},
-			dealFirstEnter() {
-				// console.log('[dealFirstEnter]');
-				let that = this;
-				uni.getStorage({
-					key: that.firstEnterKey,
-					success: (res) => {
-						console.log('[getStorage]', that.firstEnterKey, res.data);
-					},
-					fail: (e) => {
-						console.log('[getStorage] fail', that.firstEnterKey, e);
-						that.btnInfo();
-						that.setFirstEnterValue(true);
-					},
-				})
-			},
-			setFirstEnterValue(data) {
-				let that = this;
-				uni.setStorage({
-					key: that.firstEnterKey,
-					data: data,
-					success: () => {
-						console.log('[setStorage] success', that.firstEnterKey, data);
-					},
-					fail: (e) => {
-						console.log('[setStorage] fail', that.firstEnterKey, e);
-					},
-				})
-			},
-			clear() {
-				if (this.interval != null) {
-					clearInterval(this.interval);
-					this.interval = null;
-				}
-			},
-			cardConfigQueryCallback(cardconfig) {
-				this.loadConfig(cardconfig);
-				this.matchRsDetailQuery();
-				cardfunc.warnMessageQuery();
-				setTimeout(this.dealFirstEnter, 500);
-			},
-			loadConfig(cardconfig) {
-				cardconfig = cardfunc.parseCardConfig(cardconfig);
-				// console.log("[loadCardConfig] cardconfig:", cardconfig);
-				
-				// 加载卡片通用配置
-				if (cardconfig.common != undefined) {
-					cardfunc.loadCardCommonConfig(cardconfig.common);
-				}
-				
-				// -------- 加载当前页面的配置 --------
-				
-				const config = cardfunc.parseCardConfig(cardconfig[this.pageName]);
-				// console.log("[loadConfig] config_page:", config);
				if (config == undefined || config == null) {
-					this.pageReady = true;
					return;
				}
-				
-				// 加载CSS样式
-				const css = config.css;
-				if (css != undefined && css.length > 0) {
-					tools.loadCssCode(css);
-				}
-
-				// 加载比赛路线数据
-				const pathList = config.pathList;
-				// console.log("[loadConfig] pathList:", pathList);
-				if (pathList != undefined) {
-					this.pathList = pathList;
-				}
-
-				// 加载比赛路线样式
-				const pathListStyle = config.pathListStyle;
-				// console.log("[loadConfig] pathList:", pathList);
-				if (pathListStyle != undefined) {
-					this.pathListStyle = pathListStyle;
-				}
-				
-				// 加载页面参数
-				const param = config.param;
-				if (param != undefined) {
-					if (param.subTitle != undefined && param.subTitle.length > 0) {
-						this.configParam.subTitle = param.subTitle;
-					}
-					if (param.midType != undefined && param.midType >= 0) {
-						this.configParam.midType = param.midType;
-					}
-				}
-				// console.log("[loadConfig] param:", this.configParam);
-
-				this.pageReady = true;
-				// uni.hideLoading();
-			},
-			// 获取倒计时
-			getCountdown() {
-				// console.log(this.endSecond)
-				if (this.endSecond > 0) {
-					const now = Date.now() / 1000;
-					const dif = this.endSecond - now;
-					// const dif = 3600*24 - 60;
-					if (dif > 0) {
-						this.countdown = '距结束 ' + tools.convertSecondsToDHM(dif);
-					} else {
-						this.countdown = "活动已结束";
-					}
-					// this.countdown = tools.convertSecondsToHMS(dif);
-				} else {
-					this.countdown = "距结束 --天--小时";
-				}
-			},
-			// 格式化 距离
-			fmtDistanct(val) {
-				if (val >= 0) {
-					return Math.round(val * 100 / 1000) / 100;
-				} else {
-					return '--';
-				}
-				/* if (val < 1000)
-					return Math.round(val * 10 / 1000) / 10;
-				else
-					return Math.round(val / 1000); */
-			},
-			// 格式化 配速
-			fmtPace(val) {
-				if (val >= 0) {
-					return tools.convertSecondsToHMS(val, 2);
-				} else {
-					return '--';
-				}
-			},
-			fmtMcTime(timestamp) {
-				return tools.fmtMcTime(timestamp);
-			},
-			// 获取活动时间
-			getActtime() {
-				this.acttime = tools.getActtime(this.beginSecond, this.endSecond);
-			},
-			fmtMcTime2(timestamp1, timestamp2) {
-				return tools.fmtMcTime2(timestamp1, timestamp2);
-			},
-			// 卡片对应地图列表详情查询
-			mapListQuery() {
-				uni.request({
-					url: apiMapListQuery,
-					header: {
-						"Content-Type": "application/x-www-form-urlencoded",
-						"token": this.token,
-					},
-					method: "POST",
-					data: {
-						mcId: this.mcId
-					},
-					success: (res) => {
-						// console.log("mapListQuery", res);
-						if (res.data.code == 0) {
-							const data = res.data.data;
-							this.mapList = data;
-
-							let mapItems = [];
-							for (var i = 0; i < data.length; i++) {
-								let map = {};
-								map.text = data[i].mapName;
-								map.value = data[i].ocaId;
-								mapItems.push(map);
-								if (i == 0 && this.ocaId == 0) {
-									this.ocaId = data[i].ocaId;
-									this.matchRsDetailQuery();
-									uni.setStorageSync(this.mapKey, this.ocaId);
-								}
-							}
-							this.mapList = mapItems;
-							// console.log("mapList", this.mapList);
-						}
-					},
-					fail: (err) => {
-						console.log("mapListQuery err", err);
-					},
-				});
-			},
-			// 卡片对应线上赛多个活动查询
-			matchRsDetailQuery() {
-				uni.request({
-					url: apiMatchRsDetailQuery,
-					header: {
-						"Content-Type": "application/x-www-form-urlencoded",
-						"token": this.token,
-					},
-					method: "POST",
-					data: {
-						ecId: this.ecId,
-						ocaId: this.ocaId
-					},
-					success: (res) => {
-						// console.log("matchRsDetailQuery", res);
-						if (checkResCode(res)) {
-							const data = res.data.data;
-							this.mcType = data.mcType;
-							this.mcId = data.mcId;
-							this.mcName = data.mcName;
-							this.coiName = data.coiName;
-							this.beginSecond = data.beginSecond;
-							this.endSecond = data.endSecond;
-							this.nickName = data.nickName;
-							this.totalNum = data.totalNum;
-							this.totalDistanct = data.totalDistanct;
-							this.totalDistanctRankNum = data.totalDistanctRankNum;
-							this.totalCp = data.totalCp;
-							this.totalCpRankNum = data.totalCpRankNum;
-							this.totalSysPoint = data.totalSysPoint;
-							this.totalSysPointRankNum = data.totalSysPointRankNum;
-							this.fastPace = data.fastPace;
-							this.fastPaceRankNum = data.fastPaceRankNum;
-							this.regionTotalNum = data.regionTotalNum;
-							this.regionTotalCp = data.regionTotalCp;
-							this.regionTotalCpRankNum = data.regionTotalCpRankNum;
-							this.regionTotalSysPoint = data.regionTotalSysPoint;
-							this.regionTotalDictance = data.regionTotalDictance;
-							this.regionFastPace = data.regionFastPace;
-							this.ocaRs = data.ocaRs;
-
-							this.mcState = tools.checkMcState(this.beginSecond, this.endSecond);
-
-							const rank = JSON.stringify(data);
-							this.dealNotice(rank);
-
-							this.getCountdown();
-							this.getActtime();
-
-							this.isAllowMcSignUp();
-							this.mapListQuery();
-
-							this.clear();
-							this.interval = setInterval(this.getCountdown, 60000);
-						}
-					},
-					fail: (err) => {
-						console.log("matchRsDetailQuery err", err)
-					},
-				});
-			},
-			// 是否允许重新分组(报名)
-			isAllowMcSignUp() {
-				uni.request({
-					url: apiIsAllowMcSignUp,
-					header: {
-						"Content-Type": "application/x-www-form-urlencoded",
-						"token": this.token,
-					},
-					method: "POST",
-					data: {
-						ecId: this.ecId
-					},
-					success: (res) => {
-						// console.log("isAllowMcSignUp", res)
-						if (res.data.code == 0) {
-							const data = res.data.data;
-							this.allowMcSignUp = data.allowSignUp;
-						}
-					},
-					fail: (err) => {
-						console.log("isAllowMcSignUp err", err)
-					},
-				});
-			},
-			btnBack() {
-				// const url = `action://to_home/`;
-				const url = "/pages/tpl/style2/rankList?" + this.queryString;
-				tools.appAction(url, "uni.navigateTo");
-			},
-			btnInfo() {
-				// console.log(this.$refs.mypopup);
-				this.$refs.mypopup.popupOpen();
-			},
-			btnHelp() {
-				this.$refs.mypopupHelp.popupOpen();
-			},
-			btnWarn() {
-				this.$refs.mypopupWarn.popupOpen();
-			},
-			btnReGroup() {
-				this.queryObj.from = "rankOverview";
-				this.queryString = tools.objectToQueryString(this.queryObj);
-
-				const url = '/pages/tpl/style2/signup?' + this.queryString;
-				tools.appAction(url, "uni.navigateTo");
-			},
-			onOverviewClick(ovtype) {
-				this.queryObj.ovtype = ovtype;
-				this.queryString = tools.objectToQueryString(this.queryObj);
-
-				const url = "/pages/tpl/style2/rankList?" + this.queryString;
-				tools.appAction(url, "uni.navigateTo");
-			},
-			eSelectChange(data) {
-				// console.log("eSelectChange:", data);
-				this.ocaId = data.value;
-				this.matchRsDetailQuery();
-				uni.setStorageSync(this.mapKey, this.ocaId);
-			},
-			onPathClick(data) {
-				console.log("onPathClick:", data);
-				if (this.ocaId != data.path.ocaId) {
-					this.ocaId = data.path.ocaId;
-					this.matchRsDetailQuery();
-					uni.setStorageSync(this.mapKey, data.path.ocaId);
-				}
-			},
-			btnStartGame() {
-				// 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
-				if (this.mcState == 1) {
-					const url = `action://to_detail/?id=${this.ocaId}&matchType=${this.mcType}`;
-					tools.appAction(url);
-				} else if (this.mcState == 0) {
-					uni.showToast({
-						title: '比赛尚未开始',
-						icon: 'none',
-						duration: 3000
-					});
-				} else if (this.mcState == 2) {
-					uni.showToast({
-						title: '比赛已结束',
-						icon: 'none',
-						duration: 3000
-					});
-				}
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.content {
-		width: 100vw;
-		min-height: 100vh;
-		overflow-x: scroll;
-	}
-
-	.page-top {
-		position: relative;
-		z-index: 10;
-		width: 100%;
-		height: 270px;
-		padding-top: 36px;
-		justify-content: space-between;
-		background-image: url("/static/backgroud/top_bg_egg2.png");
-		background-repeat: no-repeat;
-		background-position-x: center;
-		background-position-y: center;
-		background-size: cover;
-		/* background-size: 100% 100%; */
-	}
-
-	.topbar-color {
-		color: #333333;
-	}
-
-	.topcontent {
-		height: 90%;
-		margin-bottom: 50px;
-	}
-
-	.logo {
-		width: 80px;
-		height: 80px;
-		margin-top: 10px;
-		/* background-image: url('/static/logo/sddx.png'); */
-		background-repeat: no-repeat;
-		background-position-x: center;
-		background-position-y: center;
-		background-size: contain;
-	}
-
-	.top-acttime {
-		display: none;
-		text-shadow: 3px 3px 0px #640008;
-		font-family: YouSheBiaoTiHei;
-		/* font-family: Arial, Helvetica, sans-serif; */
-		font-weight: bold;
-		color: #ffee0b;
-		font-size: 26px;
-	}
-
-	.topbtm {
-		width: 100%;
-		/* height: 60rpx; */
-		margin-bottom: 40px;
-		justify-content: space-evenly;
-	}
-
-	.topbtm-name {
-		/* width: 320rpx; */
-		/* height: 28px; */
-		padding: 5px 12px;
-		background-color: #9fda39;
-		border-radius: 5px;
-		/* backdrop-filter: blur(30px); */
-		text-align: center;
-		font-weight: 500;
-		color: #497400;
-		font-size: 14px;
-	}
-
-	.midType0 {
-		width: 90%;
-		height: 150px;
-		position: relative;
-		z-index: 20;
-		margin-top: -40px;
-		background: #ffffff;
-		border-radius: 9px;
-		box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
-		font-family: Source Han Sans CN;
-	}
-
-	.midType1 {
-		width: 90%;
-		/* height: 112px; */
-		height: 150px;
-		position: relative;
-		z-index: 20;
-		margin-top: -70px;
-		background: #ffffff;
-		border-radius: 9px;
-		box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
-		font-family: Source Han Sans CN;
-	}
-	
-	.mid-0 {
-		width: 90%;
-		margin: 12px;
-	}
-	
-	.mid-0-select {
-		width: 60%;
-		font-weight: 500;
-		color: #8e8e8e;
-		font-size: 14px;
-	}
-	
-	.mid-0-help {
-		position: absolute;
-		right: 30px;
-		font-size: 12px;
-		font-weight: 500;
-		color: #992900;
-	}
-
-	.mid-0-right {
-		position: absolute;
-		width: 60px;
-		/* background-color: #81cd00; */
-		right: 10px;
-		font-size: 12px;
-		font-weight: 500;
-		color: #992900;
-	}
-	
-	.midType0-mid-1 {
-		width: 90%;
-		margin-bottom: 12px;
-	}
-	
-	.midType1-select {
-		/* width: 46%; */
-		min-width: 46%;
-		max-width: 50%;
-		margin: 0 5px;
-		font-weight: 500;
-		color: #8e8e8e;
-		font-size: 14px;
-	}
-	
-	.midType1-mid-1 {
-		width: 90%;
-		margin-bottom: 12px;
-		font-weight: 500;
-		color: #8e8e8e;
-		font-size: 14px;
-	}
-	
-	.mid-1-yellowCard {
-		width: 15px;
-		height: 20px;
-		margin-right: 10px;
-	}
-
-	.mid-1-name {
-		max-width: 360rpx;
-		white-space: nowrap;
-		overflow: hidden;
-		text-overflow: ellipsis;
-	}
-	
-	.mid-1-text {
-		/* min-width: 60px; */
-		font-weight: 500;
-		color: #9a300e;
-		font-size: 12px;
-	}
-
-	.mid-2 {
-		width: 92%;
-		/* margin: 0 10px; */
-	}
-
-	.mid-2-value {
-		font-weight: 900;
-		font-size: 22px;
-		line-height: 25px;
-	}
-
-	.mid-2-text {
-		color: #989898;
-		font-size: 12px;
-	}
-
-	.mid-line {
-		width: 0px;
-		height: 40px;
-		border: 1px solid;
-		border-color: #e6e6e6;
-	}
-
-	.overview-1 {
-		width: 111px;
-		height: 54px;
-		background: #ffb40b;
-		border-radius: 50%;
-		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
-		pointer-events: auto;
-	}
-
-	.overview-2 {
-		margin-top: -43px;
-		color: #ffffff;
-		font-size: 18px;
-		pointer-events: auto;
-	}
-
-	.overview-3 {
-		width: 111px;
-		height: 54px;
-		background: #f39509;
-		border-radius: 50%;
-		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
-		pointer-events: auto;
-	}
-
-	.overview-4 {
-		width: 111px;
-		height: 54px;
-		background: #81cd00;
-		border-radius: 50%;
-		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
-		pointer-events: auto;
-	}
-
-	.overview-5 {
-		width: 111px;
-		height: 54px;
-		background: #64cbb0;
-		border-radius: 50%;
-		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
-		pointer-events: auto;
-	}
-
-	.ovline1 {
-		margin-top: 9px;
-		color: #ffffff;
-		font-size: 12px;
-	}
-
-	.ovline2 {
-		color: #ffffff;
-		font-size: 16px;
-	}
-
-	.main {
-		width: 100%;
-		margin-top: 20px;
-		margin-bottom: 20px;
-		/* height: 70vh; */
-		justify-content: space-around;
-		/* justify-content: space-between; */
-	}
-
-	.main-title {
-		margin-bottom: 10px;
-		font-weight: 550;
-		color: #333333;
-		font-size: 16px;
-	}
-
-	.bottom {
-		width: 100%;
-		flex-grow: 1;
-		justify-content: flex-end;
-	}
-
-	.btnStartGame {
-		width: 70%;
-		height: 80rpx;
-		/* margin-top: 50rpx; */
-		margin-bottom: 20rpx;
-		/* font-weight: bold; */
-		color: white;
-		font-size: 32rpx;
-		line-height: 80rpx;
-		border-radius: 27px;
-		background-color: #2e85ec;
-	}
-	
-	/deep/ .e-select {
-		/* width: 60%; */
-		height: 60rpx;
-		background: #2e85ec;
-		color: #ffffff;
-		border-radius: 18px;
-		justify-content: space-around;
-
-		font-size: 16px;
-		font-weight: 500;
-		line-height: 60rpx;
-		text-align: center;
-		border: none !important;
-	}
-
-	/deep/ .e-select-input-text {
-		color: inherit !important;
-	}
-
-	/deep/ .e-select-selector-item {
-		color: #818181;
-	}
-
-	/deep/ .uni-icons {
-		color: inherit !important;
-	}
-
-	/deep/ .e-select-icon {
-		width: 26px !important;
-	}
+<!-- 
+[模板] 样式2 - 排名总览
+http://localhost:5173/card/#/pages/tpl/style2/rankOverview
+https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style2/rankOverview
+ -->
+<template>
+	<view class="body">
+		<view v-if="pageReady" class="content uni-column">
+			<view class="uni-column page-top">
+				<my-topbar :mcName="mcName" class="topbar-color" @btnBackClick="btnBack"
+					@btnInfoClick="btnInfo"></my-topbar>
+
+				<view class="topcontent uni-column uni-jcsa">
+					<view class="logo"></view>
+					<text v-if="configParam.subTitle.length > 0" class="top-acttime">{{configParam.subTitle}}</text>
+					<text v-else class="top-acttime">{{fmtMcTime2(beginSecond, endSecond)}}</text>
+				</view>
+			</view>
+			<view v-if="configParam.midType == 0" class="midType0 uni-column">
+				<view class="mid-0 uni-row uni-jcc">
+					<view class="mid-0-select">
+						<e-select v-model="ocaId" :options="mapList" :search="false" :inputClick="true"
+							maxHeight="300px" :clearable="false" @change="eSelectChange"></e-select>
+					</view>
+					<text v-if="cardConfigData.popupHelpList.length > 0" class="mid-0-help" @click="btnHelp">帮助</text>
+				</view>
+				<view class="midType0-mid-1 uni-row uni-jcc">
+					<view class="uni-row">
+						<image v-if="cardConfigData.popupWarnList.length > 0" class="mid-1-yellowCard" mode="aspectFit"
+							@click="btnWarn" src="/static/common/card_yellow.gif"></image>
+						<text class="mid-1-text">{{nickName}}</text>
+					</view>
+					<!-- <text class="mid-1-text">{{coiName}}</text> -->
+					<text class="mid-1-text" style="color: #aaaaaa; margin-left: 20px;"
+						v-if="mcState==1 && allowMcSignUp" @click="btnReGroup">修改</text>
+				</view>
+				<view class="mid-2 uni-row uni-jcsa">
+					<view class="uni-column">
+						<text class="mid-2-value">{{regionTotalNum}}</text>
+						<text class="mid-2-text">场次</text>
+					</view>
+
+					<view class="mid-line"></view>
+					<view class="uni-column">
+						<text class="mid-2-value">{{regionTotalCp}}</text>
+						<text class="mid-2-text">打点数</text>
+					</view>
+
+					<view class="mid-line"></view>
+					<view class="uni-column">
+						<text class="mid-2-value">{{regionTotalCpRankNum}}</text>
+						<text class="mid-2-text">个人排名</text>
+					</view>
+
+				</view>
+			</view>
+
+			<view v-if="configParam.midType == 1" class="midType1 uni-column">
+				<view class="mid-0 uni-row uni-jcc">
+					<view class="mid-0-select">
+						<e-select v-model="ocaId" :options="mapList" :search="false" :inputClick="true"
+							maxHeight="300px" :clearable="false" @change="eSelectChange"></e-select>
+					</view>
+					<view class="mid-0-right uni-row uni-jcsa">
+						<text class="" style="" v-if="mcState==1 && allowMcSignUp" @click="btnReGroup">修改</text>
+						<text v-if="cardConfigData.popupHelpList.length > 0" class="" @click="btnHelp">帮助</text>
+					</view>
+				</view>
+				<view class="midType1-mid-1 uni-row uni-jcse">
+					<view class="uni-row">
+						<image v-if="cardConfigData.popupWarnList.length > 0" class="mid-1-yellowCard" mode="aspectFit"
+							@click="btnWarn" src="/static/common/card_yellow.gif"></image>
+						<text class="mid-1-name">{{nickName}}</text>
+					</view>
+					<!-- <text class="mid-1-name">{{coiName}}</text> -->
+					<text class="uni-nowrap">场次:{{regionTotalNum}}</text>
+				</view>
+				<view class="mid-2 uni-row uni-jcsa">
+					<view class="uni-column">
+						<text class="mid-2-value" style="color: #ff0045;">{{regionTotalSysPoint}}</text>
+						<text class="mid-2-text">百味豆</text>
+					</view>
+
+					<view class="mid-line"></view>
+
+					<view class="uni-column">
+						<text class="mid-2-value">{{fmtDistanct(regionTotalDictance)}}</text>
+						<text class="mid-2-text">里程 km</text>
+					</view>
+
+					<view class="mid-line"></view>
+					<view class="uni-column">
+						<text class="mid-2-value">{{regionTotalCp}}</text>
+						<text class="mid-2-text">打点数</text>
+					</view>
+
+					<view class="mid-line"></view>
+
+					<view class="uni-column">
+						<text class="mid-2-value">{{fmtPace(regionFastPace)}}</text>
+						<text class="mid-2-text">最快配速</text>
+					</view>
+				</view>
+			</view>
+
+			<view class="main uni-column">
+				<text class="main-title">选择比赛路线</text>
+				<my-pathList ref="myPathList" :style="pathListStyle.style" :pathList="pathList" :selectedPath="ocaId"
+					:mcState="mcState" :showLine="pathListStyle.showLine" :isNewUser="isNewUser"
+					@onNewUserPathClick="onNewUserPathClick" @onPathClick="onPathClick"></my-pathList>
+			</view>
+
+			<view class="bottom uni-column">
+				<button class="btnStartGame bgcolor-main" @click="btnStartGame">开始比赛</button>
+			</view>
+
+			<my-popup ref="mypopup" :config="cardConfigData.popupRuleConfig" :dataList="cardConfigData.popupRuleList"
+				:acttime="acttime"></my-popup>
+			<my-popup ref="mypopupHelp" :config="cardConfigData.popupHelpConfig"
+				:dataList="cardConfigData.popupHelpList"></my-popup>
+			<my-popup ref="mypopupWarn" :config="cardConfigData.popupWarnConfig"
+				:dataList="cardConfigData.popupWarnList"></my-popup>
+			<my-guide ref="myGuide" @popup-close="onGuideClose"></my-guide>
+			<!-- <my-popup-map ref="mypopupmap" :point="navPoint"></my-popup-map> -->
+		</view>
+	</view>
+</template>
+
+<script>
+	import tools from '/common/tools';
+	import cardfunc from '../../../common/cardfunc';
+	import {
+		localCardConfig
+	} from "./cardconfig/test.js";
+	import {
+		token,
+		apiMapListQuery,
+		apiMatchRsDetailQuery,
+		apiIsAllowMcSignUp,
+		checkResCode
+	} from '/common/api';
+
+	export default {
+		data() {
+			return {
+				cardConfigData: cardfunc.cardConfigData,
+				pageReady: false,
+				pageName: "rankOverview",
+				firstEnterKey: 'firstEnter-tpl-style2',
+				rankKey: "rank-tpl-style2",
+				mapKey: "rank-tpl-style2-map",
+				queryObj: {},
+				queryString: "",
+				token: "",
+				isNewUser: false,
+
+				ecId: 0, // 卡片id
+				mcId: 0, // 赛事id
+				mcType: 0, // 赛事类型 1 普通活动 2 线下赛 3 线上赛
+				mcName: "", // 赛事名称
+				coiName: "", // 已报名单位名称
+				acttime: "", // 活动时间
+				beginSecond: null, // 活动或赛事开始时间戳,单位秒
+				endSecond: null, // 活动或赛事结束时间戳,单位秒
+				ocaId: 0, // 关联id,带入到App活动详情页面
+				nickName: "", // 昵称
+
+				totalNum: null, // 总场次
+				totalDistanct: null, // 总距离,单位米
+				totalDistanctRankNum: null, // 总距离排名
+				totalCp: null, // 总打点数
+				totalCpRankNum: null, // 总打点数排名
+				totalSysPoint: null, // 总百味豆
+				totalSysPointRankNum: null, // 总百味豆排名
+				fastPace: null, // 个人最快配速
+				fastPaceRankNum: null, // 个人最快配速排名
+				regionTotalNum: null, // 地图内总场次
+				regionTotalCp: null, // 地图内打点数
+				regionTotalCpRankNum: null, // 地图内个人打点排名
+				regionTotalSysPoint: null, // 地图内积分(百味豆)
+				regionTotalDictance: null, // 地图内里程(单位米)
+				regionFastPace: null, // 地图内最快配速
+				ocaRs: [], // 卡片对应活动集合
+
+				mapList: [], // 地图列表
+
+				interval: null,
+				mcState: 0, // 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
+				allowMcSignUp: false, // 是否允许重新分组
+				pathList: {},
+				pathListStyle: {},
+				selectedPath: null,
+				navPoint: {},
+				configParam: {
+					subTitle: "",
+					midType: 0
+				},
+			}
+		},
+		computed: {
+			pathListLen() {
+				return Object.keys(this.pathList).length;
+			}
+		},
+		onLoad(query) { // 类型非必填,可自动推导
+			// uni.showLoading({
+			// 	title: '加载中'
+			// });
+
+			// console.log("query:", query);
+			this.queryObj = query;
+			this.queryString = tools.objectToQueryString(this.queryObj);
+			// console.log(queryString);
+			this.token = query["token"] ?? token;
+			this.ecId = query["id"] ?? 0;
+
+			this.firstEnterKey += "-" + this.ecId;
+			console.log("firstEnterKey:", this.firstEnterKey);
+
+			this.rankKey += "-" + this.ecId;
+			console.log("rankKey:", this.rankKey);
+
+			this.mapKey += "-" + this.ecId;
+			console.log("mapKey:", this.mapKey);
+
+			const mapValue = uni.getStorageSync(this.mapKey);
+			if (mapValue) {
+				console.log("mapValue:", mapValue);
+				this.ocaId = mapValue;
+			}
+
+			cardfunc.init(this, this.token, this.ecId);
+			cardfunc.getCardConfig(this.cardConfigQueryCallback, localCardConfig);
+			cardfunc.isNewUserQuery(this.isNewUserQueryCallback);
+		},
+		// 页面初次渲染完成,此时组件已挂载完成,DOM 树($el)已可用
+		onReady() {
+			// this.dealFirstEnter();
+		},
+		onShow() {},
+		onUnload() {
+			this.clear();
+		},
+		methods: {
+			dealNotice(rank) {
+				// console.log('[dealFirstEnter]');
+				let that = this;
+				uni.getStorage({
+					key: that.rankKey,
+					success: (res) => {
+						// console.log('[getStorage]', that.rankKey, res.data);
+						const oldRank = res.data;
+						if (oldRank != rank) {
+							// that.notice = true;
+							that.setRankValue(rank);
+						}
+					},
+					fail: (e) => {
+						console.log('[getStorage] fail', that.rankKey, e);
+						// that.notice = false;
+						that.setRankValue(rank);
+					},
+				})
+			},
+			setRankValue(data) {
+				let that = this;
+				uni.setStorage({
+					key: that.rankKey,
+					data: data,
+					success: () => {
+						console.log('[setStorage] success', that.rankKey, data);
+					},
+					fail: (e) => {
+						console.log('[setStorage] fail', that.rankKey, e);
+					},
+				})
+			},
+			dealFirstEnter() {
+				// console.log('[dealFirstEnter]');
+				let that = this;
+				uni.getStorage({
+					key: that.firstEnterKey,
+					success: (res) => {
+						console.log('[getStorage]', that.firstEnterKey, res.data);
+					},
+					fail: (e) => {
+						console.log('[getStorage] fail', that.firstEnterKey, e);
+						that.btnInfo();
+						that.setFirstEnterValue(true);
+					},
+				})
+			},
+			setFirstEnterValue(data) {
+				let that = this;
+				uni.setStorage({
+					key: that.firstEnterKey,
+					data: data,
+					success: () => {
+						console.log('[setStorage] success', that.firstEnterKey, data);
+					},
+					fail: (e) => {
+						console.log('[setStorage] fail', that.firstEnterKey, e);
+					},
+				})
+			},
+			clear() {
+				if (this.interval != null) {
+					clearInterval(this.interval);
+					this.interval = null;
+				}
+			},
+			cardConfigQueryCallback(cardconfig) {
+				this.loadConfig(cardconfig);
+				this.matchRsDetailQuery();
+				cardfunc.warnMessageQuery();
+				setTimeout(this.dealFirstEnter, 500);
+			},
+			isNewUserQueryCallback(isNewUser) {
+				this.isNewUser = isNewUser;
+			},
+			loadConfig(cardconfig) {
+				cardconfig = cardfunc.parseCardConfig(cardconfig);
+				// console.log("[loadCardConfig] cardconfig:", cardconfig);
+
+				// 加载卡片通用配置
+				if (cardconfig.common != undefined) {
+					cardfunc.loadCardCommonConfig(cardconfig.common);
+				}
+
+				// -------- 加载当前页面的配置 --------
+
+				const config = cardfunc.parseCardConfig(cardconfig[this.pageName]);
+				// console.log("[loadConfig] config_page:", config);
+				if (config == undefined || config == null) {
+					this.pageReady = true;
+					return;
+				}
+
+				// 加载CSS样式
+				const css = config.css;
+				if (css != undefined && css.length > 0) {
+					tools.loadCssCode(css);
+				}
+
+				// 加载比赛路线数据
+				const pathList = config.pathList;
+				// console.log("[loadConfig] pathList:", pathList);
+				if (pathList != undefined) {
+					this.pathList = pathList;
+				}
+
+				// 加载比赛路线样式
+				const pathListStyle = config.pathListStyle;
+				// console.log("[loadConfig] pathList:", pathList);
+				if (pathListStyle != undefined) {
+					this.pathListStyle = pathListStyle;
+				}
+
+				// 加载页面参数
+				const param = config.param;
+				if (param != undefined) {
+					if (param.subTitle != undefined && param.subTitle.length > 0) {
+						this.configParam.subTitle = param.subTitle;
+					}
+					if (param.midType != undefined && param.midType >= 0) {
+						this.configParam.midType = param.midType;
+					}
+				}
+				// console.log("[loadConfig] param:", this.configParam);
+
+				this.pageReady = true;
+				// uni.hideLoading();
+			},
+			// 获取倒计时
+			getCountdown() {
+				// console.log(this.endSecond)
+				if (this.endSecond > 0) {
+					const now = Date.now() / 1000;
+					const dif = this.endSecond - now;
+					// const dif = 3600*24 - 60;
+					if (dif > 0) {
+						this.countdown = '距结束 ' + tools.convertSecondsToDHM(dif);
+					} else {
+						this.countdown = "活动已结束";
+					}
+					// this.countdown = tools.convertSecondsToHMS(dif);
+				} else {
+					this.countdown = "距结束 --天--小时";
+				}
+			},
+			// 格式化 距离
+			fmtDistanct(val) {
+				if (val >= 0) {
+					return Math.round(val * 100 / 1000) / 100;
+				} else {
+					return '--';
+				}
+				/* if (val < 1000)
+					return Math.round(val * 10 / 1000) / 10;
+				else
+					return Math.round(val / 1000); */
+			},
+			// 格式化 配速
+			fmtPace(val) {
+				if (val >= 0) {
+					return tools.convertSecondsToHMS(val, 2);
+				} else {
+					return '--';
+				}
+			},
+			fmtMcTime(timestamp) {
+				return tools.fmtMcTime(timestamp);
+			},
+			// 获取活动时间
+			getActtime() {
+				this.acttime = tools.getActtime(this.beginSecond, this.endSecond);
+			},
+			fmtMcTime2(timestamp1, timestamp2) {
+				return tools.fmtMcTime2(timestamp1, timestamp2);
+			},
+			// 卡片对应地图列表详情查询
+			mapListQuery() {
+				uni.request({
+					url: apiMapListQuery,
+					header: {
+						"Content-Type": "application/x-www-form-urlencoded",
+						"token": this.token,
+					},
+					method: "POST",
+					data: {
+						mcId: this.mcId
+					},
+					success: (res) => {
+						// console.log("mapListQuery", res);
+						if (res.data.code == 0) {
+							const data = res.data.data;
+							this.mapList = data;
+
+							let mapItems = [];
+							for (var i = 0; i < data.length; i++) {
+								let map = {};
+								map.text = data[i].mapName;
+								map.value = data[i].ocaId;
+								mapItems.push(map);
+								if (i == 0 && this.ocaId == 0) {
+									this.ocaId = data[i].ocaId;
+									this.matchRsDetailQuery();
+									uni.setStorageSync(this.mapKey, this.ocaId);
+								}
+							}
+							this.mapList = mapItems;
+							// console.log("mapList", this.mapList);
+						}
+					},
+					fail: (err) => {
+						console.log("mapListQuery err", err);
+					},
+				});
+			},
+			// 卡片对应线上赛多个活动查询
+			matchRsDetailQuery() {
+				uni.request({
+					url: apiMatchRsDetailQuery,
+					header: {
+						"Content-Type": "application/x-www-form-urlencoded",
+						"token": this.token,
+					},
+					method: "POST",
+					data: {
+						ecId: this.ecId,
+						ocaId: this.ocaId
+					},
+					success: (res) => {
+						// console.log("matchRsDetailQuery", res);
+						if (checkResCode(res)) {
+							const data = res.data.data;
+							this.mcType = data.mcType;
+							this.mcId = data.mcId;
+							this.mcName = data.mcName;
+							this.coiName = data.coiName;
+							this.beginSecond = data.beginSecond;
+							this.endSecond = data.endSecond;
+							this.nickName = data.nickName;
+							this.totalNum = data.totalNum;
+							this.totalDistanct = data.totalDistanct;
+							this.totalDistanctRankNum = data.totalDistanctRankNum;
+							this.totalCp = data.totalCp;
+							this.totalCpRankNum = data.totalCpRankNum;
+							this.totalSysPoint = data.totalSysPoint;
+							this.totalSysPointRankNum = data.totalSysPointRankNum;
+							this.fastPace = data.fastPace;
+							this.fastPaceRankNum = data.fastPaceRankNum;
+							this.regionTotalNum = data.regionTotalNum;
+							this.regionTotalCp = data.regionTotalCp;
+							this.regionTotalCpRankNum = data.regionTotalCpRankNum;
+							this.regionTotalSysPoint = data.regionTotalSysPoint;
+							this.regionTotalDictance = data.regionTotalDictance;
+							this.regionFastPace = data.regionFastPace;
+							this.ocaRs = data.ocaRs;
+
+							this.mcState = tools.checkMcState(this.beginSecond, this.endSecond);
+
+							const rank = JSON.stringify(data);
+							this.dealNotice(rank);
+
+							this.getCountdown();
+							this.getActtime();
+
+							this.isAllowMcSignUp();
+							this.mapListQuery();
+
+							this.clear();
+							this.interval = setInterval(this.getCountdown, 60000);
+						}
+					},
+					fail: (err) => {
+						console.log("matchRsDetailQuery err", err)
+					},
+				});
+			},
+			// 是否允许重新分组(报名)
+			isAllowMcSignUp() {
+				uni.request({
+					url: apiIsAllowMcSignUp,
+					header: {
+						"Content-Type": "application/x-www-form-urlencoded",
+						"token": this.token,
+					},
+					method: "POST",
+					data: {
+						ecId: this.ecId
+					},
+					success: (res) => {
+						// console.log("isAllowMcSignUp", res)
+						if (res.data.code == 0) {
+							const data = res.data.data;
+							this.allowMcSignUp = data.allowSignUp;
+						}
+					},
+					fail: (err) => {
+						console.log("isAllowMcSignUp err", err)
+					},
+				});
+			},
+			btnBack() {
+				// const url = `action://to_home/`;
+				const url = "/pages/tpl/style2/rankList?" + this.queryString;
+				tools.appAction(url, "uni.navigateTo");
+			},
+			btnInfo() {
+				// console.log(this.$refs.mypopup);
+				this.$refs.mypopup.popupOpen();
+			},
+			btnHelp() {
+				this.$refs.mypopupHelp.popupOpen();
+			},
+			btnWarn() {
+				this.$refs.mypopupWarn.popupOpen();
+			},
+			btnReGroup() {
+				this.queryObj.from = "rankOverview";
+				this.queryString = tools.objectToQueryString(this.queryObj);
+
+				const url = '/pages/tpl/style2/signup?' + this.queryString;
+				tools.appAction(url, "uni.navigateTo");
+			},
+			onOverviewClick(ovtype) {
+				this.queryObj.ovtype = ovtype;
+				this.queryString = tools.objectToQueryString(this.queryObj);
+
+				const url = "/pages/tpl/style2/rankList?" + this.queryString;
+				tools.appAction(url, "uni.navigateTo");
+			},
+			eSelectChange(data) {
+				// console.log("eSelectChange:", data);
+				this.ocaId = data.value;
+				this.matchRsDetailQuery();
+				uni.setStorageSync(this.mapKey, this.ocaId);
+			},
+			onNewUserPathClick(data) {
+				// console.log("onNewUserPathClick:", data);
+				this.selectedPath = data;
+				this.$refs.myGuide.popupOpen();
+			},
+			onPathClick(data) {
+				// console.log("onPathClick:", data);
+				if (this.ocaId != data.path.ocaId) {
+					this.ocaId = data.path.ocaId;
+					this.matchRsDetailQuery();
+					uni.setStorageSync(this.mapKey, data.path.ocaId);
+				}
+			},
+			onGuideClose() {
+				if (this.isNewUser && this.selectedPath != null) {
+					this.$refs.myPathList.to_detail(this.selectedPath);
+					this.selectedPath = null;
+				}
+			},
+			btnStartGame() {
+				// 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
+				if (this.mcState == 1) {
+					const url = `action://to_detail/?id=${this.ocaId}&matchType=${this.mcType}`;
+					tools.appAction(url);
+				} else if (this.mcState == 0) {
+					uni.showToast({
+						title: '比赛尚未开始',
+						icon: 'none',
+						duration: 3000
+					});
+				} else if (this.mcState == 2) {
+					uni.showToast({
+						title: '比赛已结束',
+						icon: 'none',
+						duration: 3000
+					});
+				}
+			},
+		}
+	}
+</script>
+
+<style scoped>
+	.content {
+		width: 100vw;
+		min-height: 100vh;
+		overflow-x: scroll;
+	}
+
+	.page-top {
+		position: relative;
+		z-index: 10;
+		width: 100%;
+		height: 270px;
+		padding-top: 36px;
+		justify-content: space-between;
+		background-image: url("/static/backgroud/top_bg_egg2.png");
+		background-repeat: no-repeat;
+		background-position-x: center;
+		background-position-y: center;
+		background-size: cover;
+		/* background-size: 100% 100%; */
+	}
+
+	.topbar-color {
+		color: #333333;
+	}
+
+	.topcontent {
+		height: 90%;
+		margin-bottom: 50px;
+	}
+
+	.logo {
+		width: 80px;
+		height: 80px;
+		margin-top: 10px;
+		/* background-image: url('/static/logo/sddx.png'); */
+		background-repeat: no-repeat;
+		background-position-x: center;
+		background-position-y: center;
+		background-size: contain;
+	}
+
+	.top-acttime {
+		display: none;
+		text-shadow: 3px 3px 0px #640008;
+		font-family: YouSheBiaoTiHei;
+		/* font-family: Arial, Helvetica, sans-serif; */
+		font-weight: bold;
+		color: #ffee0b;
+		font-size: 26px;
+	}
+
+	.topbtm {
+		width: 100%;
+		/* height: 60rpx; */
+		margin-bottom: 40px;
+		justify-content: space-evenly;
+	}
+
+	.topbtm-name {
+		/* width: 320rpx; */
+		/* height: 28px; */
+		padding: 5px 12px;
+		background-color: #9fda39;
+		border-radius: 5px;
+		/* backdrop-filter: blur(30px); */
+		text-align: center;
+		font-weight: 500;
+		color: #497400;
+		font-size: 14px;
+	}
+
+	.midType0 {
+		width: 90%;
+		height: 150px;
+		position: relative;
+		z-index: 20;
+		margin-top: -40px;
+		background: #ffffff;
+		border-radius: 9px;
+		box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
+		font-family: Source Han Sans CN;
+	}
+
+	.midType1 {
+		width: 90%;
+		/* height: 112px; */
+		height: 150px;
+		position: relative;
+		z-index: 20;
+		margin-top: -70px;
+		background: #ffffff;
+		border-radius: 9px;
+		box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
+		font-family: Source Han Sans CN;
+	}
+
+	.mid-0 {
+		width: 90%;
+		margin: 12px;
+	}
+
+	.mid-0-select {
+		width: 60%;
+		font-weight: 500;
+		color: #8e8e8e;
+		font-size: 14px;
+	}
+
+	.mid-0-help {
+		position: absolute;
+		right: 30px;
+		font-size: 12px;
+		font-weight: 500;
+		color: #992900;
+	}
+
+	.mid-0-right {
+		position: absolute;
+		width: 60px;
+		/* background-color: #81cd00; */
+		right: 10px;
+		font-size: 12px;
+		font-weight: 500;
+		color: #992900;
+	}
+
+	.midType0-mid-1 {
+		width: 90%;
+		margin-bottom: 12px;
+	}
+
+	.midType1-select {
+		/* width: 46%; */
+		min-width: 46%;
+		max-width: 50%;
+		margin: 0 5px;
+		font-weight: 500;
+		color: #8e8e8e;
+		font-size: 14px;
+	}
+
+	.midType1-mid-1 {
+		width: 90%;
+		margin-bottom: 12px;
+		font-weight: 500;
+		color: #8e8e8e;
+		font-size: 14px;
+	}
+
+	.mid-1-yellowCard {
+		width: 15px;
+		height: 20px;
+		margin-right: 10px;
+	}
+
+	.mid-1-name {
+		max-width: 360rpx;
+		white-space: nowrap;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+
+	.mid-1-text {
+		/* min-width: 60px; */
+		font-weight: 500;
+		color: #9a300e;
+		font-size: 12px;
+	}
+
+	.mid-2 {
+		width: 92%;
+		/* margin: 0 10px; */
+	}
+
+	.mid-2-value {
+		font-weight: 900;
+		font-size: 22px;
+		line-height: 25px;
+	}
+
+	.mid-2-text {
+		color: #989898;
+		font-size: 12px;
+	}
+
+	.mid-line {
+		width: 0px;
+		height: 40px;
+		border: 1px solid;
+		border-color: #e6e6e6;
+	}
+
+	.overview-1 {
+		width: 111px;
+		height: 54px;
+		background: #ffb40b;
+		border-radius: 50%;
+		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
+		pointer-events: auto;
+	}
+
+	.overview-2 {
+		margin-top: -43px;
+		color: #ffffff;
+		font-size: 18px;
+		pointer-events: auto;
+	}
+
+	.overview-3 {
+		width: 111px;
+		height: 54px;
+		background: #f39509;
+		border-radius: 50%;
+		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
+		pointer-events: auto;
+	}
+
+	.overview-4 {
+		width: 111px;
+		height: 54px;
+		background: #81cd00;
+		border-radius: 50%;
+		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
+		pointer-events: auto;
+	}
+
+	.overview-5 {
+		width: 111px;
+		height: 54px;
+		background: #64cbb0;
+		border-radius: 50%;
+		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
+		pointer-events: auto;
+	}
+
+	.ovline1 {
+		margin-top: 9px;
+		color: #ffffff;
+		font-size: 12px;
+	}
+
+	.ovline2 {
+		color: #ffffff;
+		font-size: 16px;
+	}
+
+	.main {
+		width: 100%;
+		margin-top: 20px;
+		margin-bottom: 20px;
+		/* height: 70vh; */
+		justify-content: space-around;
+		/* justify-content: space-between; */
+	}
+
+	.main-title {
+		margin-bottom: 10px;
+		font-weight: 550;
+		color: #333333;
+		font-size: 16px;
+	}
+
+	.bottom {
+		width: 100%;
+		flex-grow: 1;
+		justify-content: flex-end;
+	}
+
+	.btnStartGame {
+		display: none;
+		width: 70%;
+		height: 80rpx;
+		/* margin-top: 50rpx; */
+		margin-bottom: 20rpx;
+		/* font-weight: bold; */
+		color: white;
+		font-size: 32rpx;
+		line-height: 80rpx;
+		border-radius: 27px;
+		background-color: #2e85ec;
+	}
+
+	/deep/ .e-select {
+		/* width: 60%; */
+		height: 60rpx;
+		background: #2e85ec;
+		color: #ffffff;
+		border-radius: 18px;
+		justify-content: space-around;
+
+		font-size: 16px;
+		font-weight: 500;
+		line-height: 60rpx;
+		text-align: center;
+		border: none !important;
+	}
+
+	/deep/ .e-select-input-text {
+		color: inherit !important;
+	}
+
+	/deep/ .e-select-selector-item {
+		color: #818181;
+	}
+
+	/deep/ .uni-icons {
+		color: inherit !important;
+	}
+
+	/deep/ .e-select-icon {
+		width: 26px !important;
+	}
 </style>

+ 934 - 909
card/pages/tpl/style3/rankOverview.vue

@@ -1,910 +1,935 @@
-<!-- 
-[模板] 样式2 - 排名总览
-http://localhost:5173/card/#/pages/tpl/style3/rankOverview
-https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style3/rankOverview
- -->
-<template>
-	<view class="body">
-		<view v-if="pageReady" class="content uni-column">
-			<view class="uni-column page-top">
-				<my-topbar :mcName="mcName" class="topbar-color"
-					@btnBackClick="btnBack" @btnInfoClick="btnInfo"></my-topbar>
-				
-				<view class="topcontent uni-column uni-jcsa">
-					<view class="logo"></view>
-					<text v-if="configParam.subTitle.length > 0" class="top-acttime">{{configParam.subTitle}}</text>
-					<text v-else class="top-acttime">{{fmtMcTime2(beginSecond, endSecond)}}</text>
-				</view>
-			</view>
-			<view v-if="configParam.midType == 0" class="midType0 uni-column">
-				<view class="mid-0 uni-row uni-jcc">
-					<view class="mid-0-select">
-						<e-select v-model="ocaId" :options="mapList" :search="false" :inputClick="true"
-							maxHeight="300px" :clearable="false" @change="eSelectChange"></e-select>
-					</view>
-					<text v-if="cardConfigData.popupHelpList.length > 0" class="mid-0-help" @click="btnHelp">帮助</text>
-				</view>
-				<view class="midType0-mid-1 uni-row uni-jcsa">
-					<view class="uni-row">
-						<image v-if="cardConfigData.popupWarnList.length > 0" class="mid-1-yellowCard" mode="aspectFit" 
-						 @click="btnWarn" src="/static/common/card_yellow.gif"></image>
-						<text class="mid-1-text">{{nickName}}</text>
-					</view>
-					<text class="mid-1-text">{{coiName}}</text>
-					<text class="mid-1-text" style="color: #aaaaaa;" v-if="mcState==1 && allowMcSignUp"
-						@click="btnReGroup">修改</text>
-				</view>
-				<view class="mid-2 uni-row uni-jcsa">
-					<view class="uni-column">
-						<text class="mid-2-value">{{regionTotalNum}}</text>
-						<text class="mid-2-text">场次</text>
-					</view>
-
-					<view class="mid-line"></view>
-					<view class="uni-column">
-						<text class="mid-2-value">{{regionTotalCp}}</text>
-						<text class="mid-2-text">打点数</text>
-					</view>
-
-					<view class="mid-line"></view>
-					<view class="uni-column">
-						<text class="mid-2-value">{{regionTotalCpRankNum}}</text>
-						<text class="mid-2-text">个人排名</text>
-					</view>
-
-				</view>
-			</view>
-			
-			<view v-if="configParam.midType == 1" class="midType1 uni-column">
-				<view class="mid-0 uni-row uni-jcc">
-					<view class="mid-0-select">
-						<e-select v-model="ocaId" :options="mapList" :search="false" :inputClick="true"
-							maxHeight="300px" :clearable="false" @change="eSelectChange"></e-select>
-					</view>
-					<view class="mid-0-right uni-row uni-jcsa">
-						<text class="" style="" v-if="mcState==1 && allowMcSignUp"
-							@click="btnReGroup">修改</text>
-						<text v-if="cardConfigData.popupHelpList.length > 0" class="" @click="btnHelp">帮助</text>
-					</view>
-				</view>
-				<view class="midType1-mid-1 uni-row uni-jcsb">
-					<view class="uni-row">
-						<image v-if="cardConfigData.popupWarnList.length > 0" class="mid-1-yellowCard" mode="aspectFit" 
-						 @click="btnWarn" src="/static/common/card_yellow.gif"></image>
-						<text class="mid-1-name">{{nickName}}</text>
-					</view>
-					<text class="mid-1-name">{{coiName}}</text>
-					<text class="uni-nowrap">场次:{{regionTotalNum}}</text>
-				</view>
-				<view class="mid-2 uni-row uni-jcsa">
-					<view class="uni-column">
-						<text class="mid-2-value" style="color: #ff0045;">{{regionTotalSysPoint}}</text>
-						<text class="mid-2-text">百味豆</text>
-					</view>
-			
-					<view class="mid-line"></view>
-			
-					<view class="uni-column">
-						<text class="mid-2-value">{{fmtDistanct(regionTotalDictance)}}</text>
-						<text class="mid-2-text">里程 km</text>
-					</view>
-			
-					<view class="mid-line"></view>
-					<view class="uni-column">
-						<text class="mid-2-value">{{regionTotalCp}}</text>
-						<text class="mid-2-text">打点数</text>
-					</view>
-			
-					<view class="mid-line"></view>
-			
-					<view class="uni-column">
-						<text class="mid-2-value">{{fmtPace(regionFastPace)}}</text>
-						<text class="mid-2-text">最快配速</text>
-					</view>
-				</view>
-			</view>
-
-			<view class="main uni-column">
-				<text class="main-title">选择比赛路线</text>
-				<my-pathList :style="pathListStyle.style" :pathList="pathList"
-					:selectedPath="ocaId" :mcState="mcState" :showLine="pathListStyle.showLine"
-					@onPathClick="onPathClick"></my-pathList>
-			</view>
-			
-			<view class="bottom uni-column">
-				<button class="btnStartGame bgcolor-main" @click="btnStartGame">开始比赛</button>
-			</view>
-			
-			<my-popup ref="mypopup" :config="cardConfigData.popupRuleConfig" :dataList="cardConfigData.popupRuleList" :acttime="acttime"></my-popup>
-			<my-popup ref="mypopupHelp" :config="cardConfigData.popupHelpConfig" :dataList="cardConfigData.popupHelpList"></my-popup>
-			<my-popup ref="mypopupWarn" :config="cardConfigData.popupWarnConfig" :dataList="cardConfigData.popupWarnList"></my-popup>
-			<!-- <my-popup-map ref="mypopupmap" :point="navPoint"></my-popup-map> -->
-		</view>
-	</view>
-</template>
-
-<script>
-	import tools from '/common/tools';
-	import cardfunc from '../../../common/cardfunc';
-	import { localCardConfig } from "./cardconfig/test.js";
-	import {
-		token,
-		apiMapListQuery,
-		apiMatchRsDetailQuery,
-		apiIsAllowMcSignUp,
-		checkResCode
-	} from '/common/api';
-
-	export default {
-		data() {
-			return {
-				cardConfigData: cardfunc.cardConfigData,
-				pageReady: false,
-				pageName: "rankOverview",
-				firstEnterKey: 'firstEnter-tpl-style3',
-				rankKey: "rank-tpl-style3",
-				mapKey: "rank-tpl-style3-map",
-				queryObj: {},
-				queryString: "",
-				token: "",
-
-				ecId: 0, // 卡片id
-				mcId: 0, // 赛事id
-				mcType: 0, // 赛事类型 1 普通活动 2 线下赛 3 线上赛
-				mcName: "", // 赛事名称
-				coiName: "", // 已报名单位名称
-				acttime: "", // 活动时间
-				beginSecond: null, // 活动或赛事开始时间戳,单位秒
-				endSecond: null, // 活动或赛事结束时间戳,单位秒
-				ocaId: 0, // 关联id,带入到App活动详情页面
-				nickName: "", // 昵称
-
-				totalNum: null, // 总场次
-				totalDistanct: null, // 总距离,单位米
-				totalDistanctRankNum: null, // 总距离排名
-				totalCp: null, // 总打点数
-				totalCpRankNum: null, // 总打点数排名
-				totalSysPoint: null, // 总百味豆
-				totalSysPointRankNum: null, // 总百味豆排名
-				fastPace: null, // 个人最快配速
-				fastPaceRankNum: null, // 个人最快配速排名
-				regionTotalNum: null, // 地图内总场次
-				regionTotalCp: null, // 地图内打点数
-				regionTotalCpRankNum: null, // 地图内个人打点排名
-				regionTotalSysPoint: null, // 地图内积分(百味豆)
-				regionTotalDictance: null, // 地图内里程(单位米)
-				regionFastPace: null, // 地图内最快配速
-				ocaRs: [], // 卡片对应活动集合
-
-				mapList: [], // 地图列表
-
-				interval: null,
-				mcState: 0, // 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
-				allowMcSignUp: false, // 是否允许重新分组
-				pathList: {},
-				pathListStyle: {},
-				navPoint: {},
-				configParam: {
-					subTitle: "",
-					midType: 0
-				},
-			}
-		},
-		computed: {
-			pathListLen() {
-				return Object.keys(this.pathList).length;
-			}
-		},
-		onLoad(query) { // 类型非必填,可自动推导
-			// uni.showLoading({
-			// 	title: '加载中'
-			// });
-			
-			// console.log("query:", query);
-			this.queryObj = query;
-			this.queryString = tools.objectToQueryString(this.queryObj);
-			// console.log(queryString);
-			this.token = query["token"] ?? token;
-			this.ecId = query["id"] ?? 0;
-
-			this.firstEnterKey += "-" + this.ecId;
-			console.log("firstEnterKey:", this.firstEnterKey);
-
-			this.rankKey += "-" + this.ecId;
-			console.log("rankKey:", this.rankKey);
-
-			this.mapKey += "-" + this.ecId;
-			console.log("mapKey:", this.mapKey);
-
-			const mapValue = uni.getStorageSync(this.mapKey);
-			if (mapValue) {
-				console.log("mapValue:", mapValue);
-				this.ocaId = mapValue;
-			}
-
-			cardfunc.init(this, this.token, this.ecId);
-			cardfunc.getCardConfig(this.cardConfigQueryCallback, localCardConfig);
-		},
-		// 页面初次渲染完成,此时组件已挂载完成,DOM 树($el)已可用
-		onReady() {
-			// this.dealFirstEnter();
-		},
-		onShow() {
-		},
-		onUnload() {
-			this.clear();
-		},
-		methods: {
-			dealNotice(rank) {
-				// console.log('[dealFirstEnter]');
-				let that = this;
-				uni.getStorage({
-					key: that.rankKey,
-					success: (res) => {
-						// console.log('[getStorage]', that.rankKey, res.data);
-						const oldRank = res.data;
-						if (oldRank != rank) {
-							// that.notice = true;
-							that.setRankValue(rank);
-						}
-					},
-					fail: (e) => {
-						console.log('[getStorage] fail', that.rankKey, e);
-						// that.notice = false;
-						that.setRankValue(rank);
-					},
-				})
-			},
-			setRankValue(data) {
-				let that = this;
-				uni.setStorage({
-					key: that.rankKey,
-					data: data,
-					success: () => {
-						console.log('[setStorage] success', that.rankKey, data);
-					},
-					fail: (e) => {
-						console.log('[setStorage] fail', that.rankKey, e);
-					},
-				})
-			},
-			dealFirstEnter() {
-				// console.log('[dealFirstEnter]');
-				let that = this;
-				uni.getStorage({
-					key: that.firstEnterKey,
-					success: (res) => {
-						console.log('[getStorage]', that.firstEnterKey, res.data);
-					},
-					fail: (e) => {
-						console.log('[getStorage] fail', that.firstEnterKey, e);
-						that.btnInfo();
-						that.setFirstEnterValue(true);
-					},
-				})
-			},
-			setFirstEnterValue(data) {
-				let that = this;
-				uni.setStorage({
-					key: that.firstEnterKey,
-					data: data,
-					success: () => {
-						console.log('[setStorage] success', that.firstEnterKey, data);
-					},
-					fail: (e) => {
-						console.log('[setStorage] fail', that.firstEnterKey, e);
-					},
-				})
-			},
-			clear() {
-				if (this.interval != null) {
-					clearInterval(this.interval);
-					this.interval = null;
-				}
-			},
-			cardConfigQueryCallback(cardconfig) {
-				this.loadConfig(cardconfig);
-				this.matchRsDetailQuery();
-				cardfunc.warnMessageQuery();
-				setTimeout(this.dealFirstEnter, 500);
-			},
-			loadConfig(cardconfig) {
-				cardconfig = cardfunc.parseCardConfig(cardconfig);
-				// console.log("[loadCardConfig] cardconfig:", cardconfig);
-				
-				// 加载卡片通用配置
-				if (cardconfig.common != undefined) {
-					cardfunc.loadCardCommonConfig(cardconfig.common);
-				}
-				
-				// -------- 加载当前页面的配置 --------
-				
-				const config = cardfunc.parseCardConfig(cardconfig[this.pageName]);
-				// console.log("[loadConfig] config_page:", config);
				if (config == undefined || config == null) {
-					this.pageReady = true;
					return;
				}
-				
-				// 加载CSS样式
-				const css = config.css;
-				if (css != undefined && css.length > 0) {
-					tools.loadCssCode(css);
-				}
-
-				// 加载比赛路线数据
-				const pathList = config.pathList;
-				// console.log("[loadConfig] pathList:", pathList);
-				if (pathList != undefined) {
-					this.pathList = pathList;
-				}
-
-				// 加载比赛路线样式
-				const pathListStyle = config.pathListStyle;
-				// console.log("[loadConfig] pathList:", pathList);
-				if (pathListStyle != undefined) {
-					this.pathListStyle = pathListStyle;
-				}
-				
-				// 加载页面参数
-				const param = config.param;
-				if (param != undefined) {
-					if (param.subTitle != undefined && param.subTitle.length > 0) {
-						this.configParam.subTitle = param.subTitle;
-					}
-					if (param.midType != undefined && param.midType >= 0) {
-						this.configParam.midType = param.midType;
-					}
-				}
-				// console.log("[loadConfig] param:", this.configParam);
-
-				this.pageReady = true;
-				// uni.hideLoading();
-			},
-			// 获取倒计时
-			getCountdown() {
-				// console.log(this.endSecond)
-				if (this.endSecond > 0) {
-					const now = Date.now() / 1000;
-					const dif = this.endSecond - now;
-					// const dif = 3600*24 - 60;
-					if (dif > 0) {
-						this.countdown = '距结束 ' + tools.convertSecondsToDHM(dif);
-					} else {
-						this.countdown = "活动已结束";
-					}
-					// this.countdown = tools.convertSecondsToHMS(dif);
-				} else {
-					this.countdown = "距结束 --天--小时";
-				}
-			},
-			// 格式化 距离
-			fmtDistanct(val) {
-				if (val >= 0) {
-					return Math.round(val * 100 / 1000) / 100;
-				} else {
-					return '--';
-				}
-				/* if (val < 1000)
-					return Math.round(val * 10 / 1000) / 10;
-				else
-					return Math.round(val / 1000); */
-			},
-			// 格式化 配速
-			fmtPace(val) {
-				if (val >= 0) {
-					return tools.convertSecondsToHMS(val, 2);
-				} else {
-					return '--';
-				}
-			},
-			fmtMcTime(timestamp) {
-				return tools.fmtMcTime(timestamp);
-			},
-			// 获取活动时间
-			getActtime() {
-				this.acttime = tools.getActtime(this.beginSecond, this.endSecond);
-			},
-			fmtMcTime2(timestamp1, timestamp2) {
-				return tools.fmtMcTime2(timestamp1, timestamp2);
-			},
-			// 卡片对应地图列表详情查询
-			mapListQuery() {
-				uni.request({
-					url: apiMapListQuery,
-					header: {
-						"Content-Type": "application/x-www-form-urlencoded",
-						"token": this.token,
-					},
-					method: "POST",
-					data: {
-						mcId: this.mcId
-					},
-					success: (res) => {
-						// console.log("mapListQuery", res);
-						if (res.data.code == 0) {
-							const data = res.data.data;
-							this.mapList = data;
-
-							let mapItems = [];
-							for (var i = 0; i < data.length; i++) {
-								let map = {};
-								map.text = data[i].mapName;
-								map.value = data[i].ocaId;
-								mapItems.push(map);
-								if (i == 0 && this.ocaId == 0) {
-									this.ocaId = data[i].ocaId;
-									this.matchRsDetailQuery();
-									uni.setStorageSync(this.mapKey, this.ocaId);
-								}
-							}
-							this.mapList = mapItems;
-							// console.log("mapList", this.mapList);
-						}
-					},
-					fail: (err) => {
-						console.log("mapListQuery err", err);
-					},
-				});
-			},
-			// 卡片对应线上赛多个活动查询
-			matchRsDetailQuery() {
-				uni.request({
-					url: apiMatchRsDetailQuery,
-					header: {
-						"Content-Type": "application/x-www-form-urlencoded",
-						"token": this.token,
-					},
-					method: "POST",
-					data: {
-						ecId: this.ecId,
-						ocaId: this.ocaId
-					},
-					success: (res) => {
-						// console.log("matchRsDetailQuery", res);
-						if (checkResCode(res)) {
-							const data = res.data.data;
-							this.mcType = data.mcType;
-							this.mcId = data.mcId;
-							this.mcName = data.mcName;
-							this.coiName = data.coiName;
-							this.beginSecond = data.beginSecond;
-							this.endSecond = data.endSecond;
-							this.nickName = data.nickName;
-							this.totalNum = data.totalNum;
-							this.totalDistanct = data.totalDistanct;
-							this.totalDistanctRankNum = data.totalDistanctRankNum;
-							this.totalCp = data.totalCp;
-							this.totalCpRankNum = data.totalCpRankNum;
-							this.totalSysPoint = data.totalSysPoint;
-							this.totalSysPointRankNum = data.totalSysPointRankNum;
-							this.fastPace = data.fastPace;
-							this.fastPaceRankNum = data.fastPaceRankNum;
-							this.regionTotalNum = data.regionTotalNum;
-							this.regionTotalCp = data.regionTotalCp;
-							this.regionTotalCpRankNum = data.regionTotalCpRankNum;
-							this.regionTotalSysPoint = data.regionTotalSysPoint;
-							this.regionTotalDictance = data.regionTotalDictance;
-							this.regionFastPace = data.regionFastPace;
-							this.ocaRs = data.ocaRs;
-
-							this.mcState = tools.checkMcState(this.beginSecond, this.endSecond);
-
-							const rank = JSON.stringify(data);
-							this.dealNotice(rank);
-
-							this.getCountdown();
-							this.getActtime();
-
-							this.isAllowMcSignUp();
-							this.mapListQuery();
-
-							this.clear();
-							this.interval = setInterval(this.getCountdown, 60000);
-						}
-					},
-					fail: (err) => {
-						console.log("matchRsDetailQuery err", err)
-					},
-				});
-			},
-			// 是否允许重新分组(报名)
-			isAllowMcSignUp() {
-				uni.request({
-					url: apiIsAllowMcSignUp,
-					header: {
-						"Content-Type": "application/x-www-form-urlencoded",
-						"token": this.token,
-					},
-					method: "POST",
-					data: {
-						ecId: this.ecId
-					},
-					success: (res) => {
-						// console.log("isAllowMcSignUp", res)
-						if (res.data.code == 0) {
-							const data = res.data.data;
-							this.allowMcSignUp = data.allowSignUp;
-						}
-					},
-					fail: (err) => {
-						console.log("isAllowMcSignUp err", err)
-					},
-				});
-			},
-			btnBack() {
-				// const url = `action://to_home/`;
-				const url = "/pages/tpl/style3/rankList?" + this.queryString;
-				tools.appAction(url, "uni.navigateTo");
-			},
-			btnInfo() {
-				// console.log(this.$refs.mypopup);
-				this.$refs.mypopup.popupOpen();
-			},
-			btnHelp() {
-				this.$refs.mypopupHelp.popupOpen();
-			},
-			btnWarn() {
-				this.$refs.mypopupWarn.popupOpen();
-			},
-			btnReGroup() {
-				this.queryObj.from = "rankOverview";
-				this.queryString = tools.objectToQueryString(this.queryObj);
-
-				const url = '/pages/tpl/style3/signup?' + this.queryString;
-				tools.appAction(url, "uni.navigateTo");
-			},
-			onOverviewClick(ovtype) {
-				this.queryObj.ovtype = ovtype;
-				this.queryString = tools.objectToQueryString(this.queryObj);
-
-				const url = "/pages/tpl/style3/rankList?" + this.queryString;
-				tools.appAction(url, "uni.navigateTo");
-			},
-			eSelectChange(data) {
-				// console.log("eSelectChange:", data);
-				this.ocaId = data.value;
-				this.matchRsDetailQuery();
-				uni.setStorageSync(this.mapKey, this.ocaId);
-			},
-			onPathClick(data) {
-				console.log("onPathClick:", data);
-				if (this.ocaId != data.path.ocaId) {
-					this.ocaId = data.path.ocaId;
-					this.matchRsDetailQuery();
-					uni.setStorageSync(this.mapKey, data.path.ocaId);
-				}
-			},
-			btnStartGame() {
-				// 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
-				if (this.mcState == 1) {
-					const url = `action://to_detail/?id=${this.ocaId}&matchType=${this.mcType}`;
-					tools.appAction(url);
-				} else if (this.mcState == 0) {
-					uni.showToast({
-						title: '比赛尚未开始',
-						icon: 'none',
-						duration: 3000
-					});
-				} else if (this.mcState == 2) {
-					uni.showToast({
-						title: '比赛已结束',
-						icon: 'none',
-						duration: 3000
-					});
-				}
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.content {
-		width: 100vw;
-		min-height: 100vh;
-		overflow-x: scroll;
-	}
-
-	.page-top {
-		position: relative;
-		z-index: 10;
-		width: 100%;
-		height: 270px;
-		padding-top: 36px;
-		justify-content: space-between;
-		background-image: url("/static/backgroud/top_bg_egg2.png");
-		background-repeat: no-repeat;
-		background-position-x: center;
-		background-position-y: center;
-		background-size: cover;
-		/* background-size: 100% 100%; */
-	}
-
-	.topbar-color {
-		color: #333333;
-	}
-
-	.topcontent {
-		height: 90%;
-		margin-bottom: 50px;
-	}
-
-	.logo {
-		width: 80px;
-		height: 80px;
-		margin-top: 10px;
-		/* background-image: url('/static/logo/sddx.png'); */
-		background-repeat: no-repeat;
-		background-position-x: center;
-		background-position-y: center;
-		background-size: contain;
-	}
-
-	.top-acttime {
-		display: none;
-		text-shadow: 3px 3px 0px #640008;
-		font-family: YouSheBiaoTiHei;
-		/* font-family: Arial, Helvetica, sans-serif; */
-		font-weight: bold;
-		color: #ffee0b;
-		font-size: 26px;
-	}
-
-	.topbtm {
-		width: 100%;
-		/* height: 60rpx; */
-		margin-bottom: 40px;
-		justify-content: space-evenly;
-	}
-
-	.topbtm-name {
-		/* width: 320rpx; */
-		/* height: 28px; */
-		padding: 5px 12px;
-		background-color: #9fda39;
-		border-radius: 5px;
-		/* backdrop-filter: blur(30px); */
-		text-align: center;
-		font-weight: 500;
-		color: #497400;
-		font-size: 14px;
-	}
-
-	.midType0 {
-		width: 90%;
-		height: 150px;
-		position: relative;
-		z-index: 20;
-		margin-top: -40px;
-		background: #ffffff;
-		border-radius: 9px;
-		box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
-		font-family: Source Han Sans CN;
-	}
-
-	.midType1 {
-		width: 90%;
-		/* height: 112px; */
-		height: 150px;
-		position: relative;
-		z-index: 20;
-		margin-top: -70px;
-		background: #ffffff;
-		border-radius: 9px;
-		box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
-		font-family: Source Han Sans CN;
-	}
-	
-	.mid-0 {
-		width: 90%;
-		margin: 12px;
-	}
-	
-	.mid-0-select {
-		width: 60%;
-		font-weight: 500;
-		color: #8e8e8e;
-		font-size: 14px;
-	}
-	
-	.mid-0-help {
-		position: absolute;
-		right: 30px;
-		font-size: 12px;
-		font-weight: 500;
-		color: #992900;
-	}
-
-	.mid-0-right {
-		position: absolute;
-		width: 60px;
-		/* background-color: #81cd00; */
-		right: 10px;
-		font-size: 12px;
-		font-weight: 500;
-		color: #992900;
-	}
-	
-	.midType0-mid-1 {
-		width: 90%;
-		margin-bottom: 12px;
-	}
-	
-	.midType1-select {
-		/* width: 46%; */
-		min-width: 46%;
-		max-width: 50%;
-		margin: 0 5px;
-		font-weight: 500;
-		color: #8e8e8e;
-		font-size: 14px;
-	}
-	
-	.midType1-mid-1 {
-		width: 90%;
-		margin-bottom: 12px;
-		font-weight: 500;
-		color: #8e8e8e;
-		font-size: 14px;
-	}
-	
-	.mid-1-yellowCard {
-		width: 15px;
-		height: 20px;
-		margin-right: 10px;
-	}
-
-	.mid-1-name {
-		max-width: 360rpx;
-		white-space: nowrap;
-		overflow: hidden;
-		text-overflow: ellipsis;
-	}
-	
-	.mid-1-text {
-		/* min-width: 60px; */
-		font-weight: 500;
-		color: #9a300e;
-		font-size: 12px;
-	}
-
-	.mid-2 {
-		width: 92%;
-		/* margin: 0 10px; */
-	}
-
-	.mid-2-value {
-		font-weight: 900;
-		font-size: 22px;
-		line-height: 25px;
-	}
-
-	.mid-2-text {
-		color: #989898;
-		font-size: 12px;
-	}
-
-	.mid-line {
-		width: 0px;
-		height: 40px;
-		border: 1px solid;
-		border-color: #e6e6e6;
-	}
-
-	.overview-1 {
-		width: 111px;
-		height: 54px;
-		background: #ffb40b;
-		border-radius: 50%;
-		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
-		pointer-events: auto;
-	}
-
-	.overview-2 {
-		margin-top: -43px;
-		color: #ffffff;
-		font-size: 18px;
-		pointer-events: auto;
-	}
-
-	.overview-3 {
-		width: 111px;
-		height: 54px;
-		background: #f39509;
-		border-radius: 50%;
-		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
-		pointer-events: auto;
-	}
-
-	.overview-4 {
-		width: 111px;
-		height: 54px;
-		background: #81cd00;
-		border-radius: 50%;
-		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
-		pointer-events: auto;
-	}
-
-	.overview-5 {
-		width: 111px;
-		height: 54px;
-		background: #64cbb0;
-		border-radius: 50%;
-		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
-		pointer-events: auto;
-	}
-
-	.ovline1 {
-		margin-top: 9px;
-		color: #ffffff;
-		font-size: 12px;
-	}
-
-	.ovline2 {
-		color: #ffffff;
-		font-size: 16px;
-	}
-
-	.main {
-		width: 100%;
-		margin-top: 20px;
-		margin-bottom: 20px;
-		/* height: 70vh; */
-		justify-content: space-around;
-		/* justify-content: space-between; */
-	}
-
-	.main-title {
-		margin-bottom: 10px;
-		font-weight: 550;
-		color: #333333;
-		font-size: 16px;
-	}
-
-	.bottom {
-		width: 100%;
-		flex-grow: 1;
-		justify-content: flex-end;
-	}
-
-	.btnStartGame {
-		width: 70%;
-		height: 80rpx;
-		/* margin-top: 50rpx; */
-		margin-bottom: 20rpx;
-		/* font-weight: bold; */
-		color: white;
-		font-size: 32rpx;
-		line-height: 80rpx;
-		border-radius: 27px;
-		background-color: #2e85ec;
-	}
-	
-	/deep/ .e-select {
-		/* width: 60%; */
-		height: 60rpx;
-		background: #2e85ec;
-		color: #ffffff;
-		border-radius: 18px;
-		justify-content: space-around;
-
-		font-size: 16px;
-		font-weight: 500;
-		line-height: 60rpx;
-		text-align: center;
-		border: none !important;
-	}
-
-	/deep/ .e-select-input-text {
-		color: inherit !important;
-	}
-
-	/deep/ .e-select-selector-item {
-		color: #818181;
-	}
-
-	/deep/ .uni-icons {
-		color: inherit !important;
-	}
-
-	/deep/ .e-select-icon {
-		width: 26px !important;
-	}
+<!-- 
+[模板] 样式2 - 排名总览
+http://localhost:5173/card/#/pages/tpl/style3/rankOverview
+https://oss-mbh5.colormaprun.com/card/#/pages/tpl/style3/rankOverview
+ -->
+<template>
+	<view class="body">
+		<view v-if="pageReady" class="content uni-column">
+			<view class="uni-column page-top">
+				<my-topbar :mcName="mcName" class="topbar-color" @btnBackClick="btnBack"
+					@btnInfoClick="btnInfo"></my-topbar>
+
+				<view class="topcontent uni-column uni-jcsa">
+					<view class="logo"></view>
+					<text v-if="configParam.subTitle.length > 0" class="top-acttime">{{configParam.subTitle}}</text>
+					<text v-else class="top-acttime">{{fmtMcTime2(beginSecond, endSecond)}}</text>
+				</view>
+			</view>
+			<view v-if="configParam.midType == 0" class="midType0 uni-column">
+				<view class="mid-0 uni-row uni-jcc">
+					<view class="mid-0-select">
+						<e-select v-model="ocaId" :options="mapList" :search="false" :inputClick="true"
+							maxHeight="300px" :clearable="false" @change="eSelectChange"></e-select>
+					</view>
+					<text v-if="cardConfigData.popupHelpList.length > 0" class="mid-0-help" @click="btnHelp">帮助</text>
+				</view>
+				<view class="midType0-mid-1 uni-row uni-jcsa">
+					<view class="uni-row">
+						<image v-if="cardConfigData.popupWarnList.length > 0" class="mid-1-yellowCard" mode="aspectFit"
+							@click="btnWarn" src="/static/common/card_yellow.gif"></image>
+						<text class="mid-1-text">{{nickName}}</text>
+					</view>
+					<text class="mid-1-text">{{coiName}}</text>
+					<text class="mid-1-text" style="color: #aaaaaa;" v-if="mcState==1 && allowMcSignUp"
+						@click="btnReGroup">修改</text>
+				</view>
+				<view class="mid-2 uni-row uni-jcsa">
+					<view class="uni-column">
+						<text class="mid-2-value">{{regionTotalNum}}</text>
+						<text class="mid-2-text">场次</text>
+					</view>
+
+					<view class="mid-line"></view>
+					<view class="uni-column">
+						<text class="mid-2-value">{{regionTotalCp}}</text>
+						<text class="mid-2-text">打点数</text>
+					</view>
+
+					<view class="mid-line"></view>
+					<view class="uni-column">
+						<text class="mid-2-value">{{regionTotalCpRankNum}}</text>
+						<text class="mid-2-text">个人排名</text>
+					</view>
+
+				</view>
+			</view>
+
+			<view v-if="configParam.midType == 1" class="midType1 uni-column">
+				<view class="mid-0 uni-row uni-jcc">
+					<view class="mid-0-select">
+						<e-select v-model="ocaId" :options="mapList" :search="false" :inputClick="true"
+							maxHeight="300px" :clearable="false" @change="eSelectChange"></e-select>
+					</view>
+					<view class="mid-0-right uni-row uni-jcsa">
+						<text class="" style="" v-if="mcState==1 && allowMcSignUp" @click="btnReGroup">修改</text>
+						<text v-if="cardConfigData.popupHelpList.length > 0" class="" @click="btnHelp">帮助</text>
+					</view>
+				</view>
+				<view class="midType1-mid-1 uni-row uni-jcsb">
+					<view class="uni-row">
+						<image v-if="cardConfigData.popupWarnList.length > 0" class="mid-1-yellowCard" mode="aspectFit"
+							@click="btnWarn" src="/static/common/card_yellow.gif"></image>
+						<text class="mid-1-name">{{nickName}}</text>
+					</view>
+					<text class="mid-1-name">{{coiName}}</text>
+					<text class="uni-nowrap">场次:{{regionTotalNum}}</text>
+				</view>
+				<view class="mid-2 uni-row uni-jcsa">
+					<view class="uni-column">
+						<text class="mid-2-value" style="color: #ff0045;">{{regionTotalSysPoint}}</text>
+						<text class="mid-2-text">百味豆</text>
+					</view>
+
+					<view class="mid-line"></view>
+
+					<view class="uni-column">
+						<text class="mid-2-value">{{fmtDistanct(regionTotalDictance)}}</text>
+						<text class="mid-2-text">里程 km</text>
+					</view>
+
+					<view class="mid-line"></view>
+					<view class="uni-column">
+						<text class="mid-2-value">{{regionTotalCp}}</text>
+						<text class="mid-2-text">打点数</text>
+					</view>
+
+					<view class="mid-line"></view>
+
+					<view class="uni-column">
+						<text class="mid-2-value">{{fmtPace(regionFastPace)}}</text>
+						<text class="mid-2-text">最快配速</text>
+					</view>
+				</view>
+			</view>
+
+			<view class="main uni-column">
+				<text class="main-title">选择比赛路线</text>
+				<my-pathList ref="myPathList" :style="pathListStyle.style" :pathList="pathList" :selectedPath="ocaId"
+					:mcState="mcState" :showLine="pathListStyle.showLine" :isNewUser="isNewUser"
+					@onNewUserPathClick="onNewUserPathClick" @onPathClick="onPathClick"></my-pathList>
+			</view>
+
+			<view class="bottom uni-column">
+				<button class="btnStartGame bgcolor-main" @click="btnStartGame">开始比赛</button>
+			</view>
+
+			<my-popup ref="mypopup" :config="cardConfigData.popupRuleConfig" :dataList="cardConfigData.popupRuleList"
+				:acttime="acttime"></my-popup>
+			<my-popup ref="mypopupHelp" :config="cardConfigData.popupHelpConfig"
+				:dataList="cardConfigData.popupHelpList"></my-popup>
+			<my-popup ref="mypopupWarn" :config="cardConfigData.popupWarnConfig"
+				:dataList="cardConfigData.popupWarnList"></my-popup>
+			<my-guide ref="myGuide" @popup-close="onGuideClose"></my-guide>
+			<!-- <my-popup-map ref="mypopupmap" :point="navPoint"></my-popup-map> -->
+		</view>
+	</view>
+</template>
+
+<script>
+	import tools from '/common/tools';
+	import cardfunc from '../../../common/cardfunc';
+	import {
+		localCardConfig
+	} from "./cardconfig/test.js";
+	import {
+		token,
+		apiMapListQuery,
+		apiMatchRsDetailQuery,
+		apiIsAllowMcSignUp,
+		checkResCode
+	} from '/common/api';
+
+	export default {
+		data() {
+			return {
+				cardConfigData: cardfunc.cardConfigData,
+				pageReady: false,
+				pageName: "rankOverview",
+				firstEnterKey: 'firstEnter-tpl-style3',
+				rankKey: "rank-tpl-style3",
+				mapKey: "rank-tpl-style3-map",
+				queryObj: {},
+				queryString: "",
+				token: "",
+				isNewUser: false,
+
+				ecId: 0, // 卡片id
+				mcId: 0, // 赛事id
+				mcType: 0, // 赛事类型 1 普通活动 2 线下赛 3 线上赛
+				mcName: "", // 赛事名称
+				coiName: "", // 已报名单位名称
+				acttime: "", // 活动时间
+				beginSecond: null, // 活动或赛事开始时间戳,单位秒
+				endSecond: null, // 活动或赛事结束时间戳,单位秒
+				ocaId: 0, // 关联id,带入到App活动详情页面
+				nickName: "", // 昵称
+
+				totalNum: null, // 总场次
+				totalDistanct: null, // 总距离,单位米
+				totalDistanctRankNum: null, // 总距离排名
+				totalCp: null, // 总打点数
+				totalCpRankNum: null, // 总打点数排名
+				totalSysPoint: null, // 总百味豆
+				totalSysPointRankNum: null, // 总百味豆排名
+				fastPace: null, // 个人最快配速
+				fastPaceRankNum: null, // 个人最快配速排名
+				regionTotalNum: null, // 地图内总场次
+				regionTotalCp: null, // 地图内打点数
+				regionTotalCpRankNum: null, // 地图内个人打点排名
+				regionTotalSysPoint: null, // 地图内积分(百味豆)
+				regionTotalDictance: null, // 地图内里程(单位米)
+				regionFastPace: null, // 地图内最快配速
+				ocaRs: [], // 卡片对应活动集合
+
+				mapList: [], // 地图列表
+
+				interval: null,
+				mcState: 0, // 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
+				allowMcSignUp: false, // 是否允许重新分组
+				pathList: {},
+				pathListStyle: {},
+				selectedPath: null,
+				navPoint: {},
+				configParam: {
+					subTitle: "",
+					midType: 0
+				},
+			}
+		},
+		computed: {
+			pathListLen() {
+				return Object.keys(this.pathList).length;
+			}
+		},
+		onLoad(query) { // 类型非必填,可自动推导
+			// uni.showLoading({
+			// 	title: '加载中'
+			// });
+
+			// console.log("query:", query);
+			this.queryObj = query;
+			this.queryString = tools.objectToQueryString(this.queryObj);
+			// console.log(queryString);
+			this.token = query["token"] ?? token;
+			this.ecId = query["id"] ?? 0;
+
+			this.firstEnterKey += "-" + this.ecId;
+			console.log("firstEnterKey:", this.firstEnterKey);
+
+			this.rankKey += "-" + this.ecId;
+			console.log("rankKey:", this.rankKey);
+
+			this.mapKey += "-" + this.ecId;
+			console.log("mapKey:", this.mapKey);
+
+			const mapValue = uni.getStorageSync(this.mapKey);
+			if (mapValue) {
+				console.log("mapValue:", mapValue);
+				this.ocaId = mapValue;
+			}
+
+			cardfunc.init(this, this.token, this.ecId);
+			cardfunc.getCardConfig(this.cardConfigQueryCallback, localCardConfig);
+			cardfunc.isNewUserQuery(this.isNewUserQueryCallback);
+		},
+		// 页面初次渲染完成,此时组件已挂载完成,DOM 树($el)已可用
+		onReady() {
+			// this.dealFirstEnter();
+		},
+		onShow() {},
+		onUnload() {
+			this.clear();
+		},
+		methods: {
+			dealNotice(rank) {
+				// console.log('[dealFirstEnter]');
+				let that = this;
+				uni.getStorage({
+					key: that.rankKey,
+					success: (res) => {
+						// console.log('[getStorage]', that.rankKey, res.data);
+						const oldRank = res.data;
+						if (oldRank != rank) {
+							// that.notice = true;
+							that.setRankValue(rank);
+						}
+					},
+					fail: (e) => {
+						console.log('[getStorage] fail', that.rankKey, e);
+						// that.notice = false;
+						that.setRankValue(rank);
+					},
+				})
+			},
+			setRankValue(data) {
+				let that = this;
+				uni.setStorage({
+					key: that.rankKey,
+					data: data,
+					success: () => {
+						console.log('[setStorage] success', that.rankKey, data);
+					},
+					fail: (e) => {
+						console.log('[setStorage] fail', that.rankKey, e);
+					},
+				})
+			},
+			dealFirstEnter() {
+				// console.log('[dealFirstEnter]');
+				let that = this;
+				uni.getStorage({
+					key: that.firstEnterKey,
+					success: (res) => {
+						console.log('[getStorage]', that.firstEnterKey, res.data);
+					},
+					fail: (e) => {
+						console.log('[getStorage] fail', that.firstEnterKey, e);
+						that.btnInfo();
+						that.setFirstEnterValue(true);
+					},
+				})
+			},
+			setFirstEnterValue(data) {
+				let that = this;
+				uni.setStorage({
+					key: that.firstEnterKey,
+					data: data,
+					success: () => {
+						console.log('[setStorage] success', that.firstEnterKey, data);
+					},
+					fail: (e) => {
+						console.log('[setStorage] fail', that.firstEnterKey, e);
+					},
+				})
+			},
+			clear() {
+				if (this.interval != null) {
+					clearInterval(this.interval);
+					this.interval = null;
+				}
+			},
+			cardConfigQueryCallback(cardconfig) {
+				this.loadConfig(cardconfig);
+				this.matchRsDetailQuery();
+				cardfunc.warnMessageQuery();
+				setTimeout(this.dealFirstEnter, 500);
+			},
+			isNewUserQueryCallback(isNewUser) {
+				this.isNewUser = isNewUser;
+			},
+			loadConfig(cardconfig) {
+				cardconfig = cardfunc.parseCardConfig(cardconfig);
+				// console.log("[loadCardConfig] cardconfig:", cardconfig);
+
+				// 加载卡片通用配置
+				if (cardconfig.common != undefined) {
+					cardfunc.loadCardCommonConfig(cardconfig.common);
+				}
+
+				// -------- 加载当前页面的配置 --------
+
+				const config = cardfunc.parseCardConfig(cardconfig[this.pageName]);
+				// console.log("[loadConfig] config_page:", config);
+				if (config == undefined || config == null) {
+					this.pageReady = true;
+					return;
+				}
+
+				// 加载CSS样式
+				const css = config.css;
+				if (css != undefined && css.length > 0) {
+					tools.loadCssCode(css);
+				}
+
+				// 加载比赛路线数据
+				const pathList = config.pathList;
+				// console.log("[loadConfig] pathList:", pathList);
+				if (pathList != undefined) {
+					this.pathList = pathList;
+				}
+
+				// 加载比赛路线样式
+				const pathListStyle = config.pathListStyle;
+				// console.log("[loadConfig] pathList:", pathList);
+				if (pathListStyle != undefined) {
+					this.pathListStyle = pathListStyle;
+				}
+
+				// 加载页面参数
+				const param = config.param;
+				if (param != undefined) {
+					if (param.subTitle != undefined && param.subTitle.length > 0) {
+						this.configParam.subTitle = param.subTitle;
+					}
+					if (param.midType != undefined && param.midType >= 0) {
+						this.configParam.midType = param.midType;
+					}
+				}
+				// console.log("[loadConfig] param:", this.configParam);
+
+				this.pageReady = true;
+				// uni.hideLoading();
+			},
+			// 获取倒计时
+			getCountdown() {
+				// console.log(this.endSecond)
+				if (this.endSecond > 0) {
+					const now = Date.now() / 1000;
+					const dif = this.endSecond - now;
+					// const dif = 3600*24 - 60;
+					if (dif > 0) {
+						this.countdown = '距结束 ' + tools.convertSecondsToDHM(dif);
+					} else {
+						this.countdown = "活动已结束";
+					}
+					// this.countdown = tools.convertSecondsToHMS(dif);
+				} else {
+					this.countdown = "距结束 --天--小时";
+				}
+			},
+			// 格式化 距离
+			fmtDistanct(val) {
+				if (val >= 0) {
+					return Math.round(val * 100 / 1000) / 100;
+				} else {
+					return '--';
+				}
+				/* if (val < 1000)
+					return Math.round(val * 10 / 1000) / 10;
+				else
+					return Math.round(val / 1000); */
+			},
+			// 格式化 配速
+			fmtPace(val) {
+				if (val >= 0) {
+					return tools.convertSecondsToHMS(val, 2);
+				} else {
+					return '--';
+				}
+			},
+			fmtMcTime(timestamp) {
+				return tools.fmtMcTime(timestamp);
+			},
+			// 获取活动时间
+			getActtime() {
+				this.acttime = tools.getActtime(this.beginSecond, this.endSecond);
+			},
+			fmtMcTime2(timestamp1, timestamp2) {
+				return tools.fmtMcTime2(timestamp1, timestamp2);
+			},
+			// 卡片对应地图列表详情查询
+			mapListQuery() {
+				uni.request({
+					url: apiMapListQuery,
+					header: {
+						"Content-Type": "application/x-www-form-urlencoded",
+						"token": this.token,
+					},
+					method: "POST",
+					data: {
+						mcId: this.mcId
+					},
+					success: (res) => {
+						// console.log("mapListQuery", res);
+						if (res.data.code == 0) {
+							const data = res.data.data;
+							this.mapList = data;
+
+							let mapItems = [];
+							for (var i = 0; i < data.length; i++) {
+								let map = {};
+								map.text = data[i].mapName;
+								map.value = data[i].ocaId;
+								mapItems.push(map);
+								if (i == 0 && this.ocaId == 0) {
+									this.ocaId = data[i].ocaId;
+									this.matchRsDetailQuery();
+									uni.setStorageSync(this.mapKey, this.ocaId);
+								}
+							}
+							this.mapList = mapItems;
+							// console.log("mapList", this.mapList);
+						}
+					},
+					fail: (err) => {
+						console.log("mapListQuery err", err);
+					},
+				});
+			},
+			// 卡片对应线上赛多个活动查询
+			matchRsDetailQuery() {
+				uni.request({
+					url: apiMatchRsDetailQuery,
+					header: {
+						"Content-Type": "application/x-www-form-urlencoded",
+						"token": this.token,
+					},
+					method: "POST",
+					data: {
+						ecId: this.ecId,
+						ocaId: this.ocaId
+					},
+					success: (res) => {
+						// console.log("matchRsDetailQuery", res);
+						if (checkResCode(res)) {
+							const data = res.data.data;
+							this.mcType = data.mcType;
+							this.mcId = data.mcId;
+							this.mcName = data.mcName;
+							this.coiName = data.coiName;
+							this.beginSecond = data.beginSecond;
+							this.endSecond = data.endSecond;
+							this.nickName = data.nickName;
+							this.totalNum = data.totalNum;
+							this.totalDistanct = data.totalDistanct;
+							this.totalDistanctRankNum = data.totalDistanctRankNum;
+							this.totalCp = data.totalCp;
+							this.totalCpRankNum = data.totalCpRankNum;
+							this.totalSysPoint = data.totalSysPoint;
+							this.totalSysPointRankNum = data.totalSysPointRankNum;
+							this.fastPace = data.fastPace;
+							this.fastPaceRankNum = data.fastPaceRankNum;
+							this.regionTotalNum = data.regionTotalNum;
+							this.regionTotalCp = data.regionTotalCp;
+							this.regionTotalCpRankNum = data.regionTotalCpRankNum;
+							this.regionTotalSysPoint = data.regionTotalSysPoint;
+							this.regionTotalDictance = data.regionTotalDictance;
+							this.regionFastPace = data.regionFastPace;
+							this.ocaRs = data.ocaRs;
+
+							this.mcState = tools.checkMcState(this.beginSecond, this.endSecond);
+
+							const rank = JSON.stringify(data);
+							this.dealNotice(rank);
+
+							this.getCountdown();
+							this.getActtime();
+
+							this.isAllowMcSignUp();
+							this.mapListQuery();
+
+							this.clear();
+							this.interval = setInterval(this.getCountdown, 60000);
+						}
+					},
+					fail: (err) => {
+						console.log("matchRsDetailQuery err", err)
+					},
+				});
+			},
+			// 是否允许重新分组(报名)
+			isAllowMcSignUp() {
+				uni.request({
+					url: apiIsAllowMcSignUp,
+					header: {
+						"Content-Type": "application/x-www-form-urlencoded",
+						"token": this.token,
+					},
+					method: "POST",
+					data: {
+						ecId: this.ecId
+					},
+					success: (res) => {
+						// console.log("isAllowMcSignUp", res)
+						if (res.data.code == 0) {
+							const data = res.data.data;
+							this.allowMcSignUp = data.allowSignUp;
+						}
+					},
+					fail: (err) => {
+						console.log("isAllowMcSignUp err", err)
+					},
+				});
+			},
+			btnBack() {
+				// const url = `action://to_home/`;
+				const url = "/pages/tpl/style3/rankList?" + this.queryString;
+				tools.appAction(url, "uni.navigateTo");
+			},
+			btnInfo() {
+				// console.log(this.$refs.mypopup);
+				this.$refs.mypopup.popupOpen();
+			},
+			btnHelp() {
+				this.$refs.mypopupHelp.popupOpen();
+			},
+			btnWarn() {
+				this.$refs.mypopupWarn.popupOpen();
+			},
+			btnReGroup() {
+				this.queryObj.from = "rankOverview";
+				this.queryString = tools.objectToQueryString(this.queryObj);
+
+				const url = '/pages/tpl/style3/signup?' + this.queryString;
+				tools.appAction(url, "uni.navigateTo");
+			},
+			onOverviewClick(ovtype) {
+				this.queryObj.ovtype = ovtype;
+				this.queryString = tools.objectToQueryString(this.queryObj);
+
+				const url = "/pages/tpl/style3/rankList?" + this.queryString;
+				tools.appAction(url, "uni.navigateTo");
+			},
+			eSelectChange(data) {
+				// console.log("eSelectChange:", data);
+				this.ocaId = data.value;
+				this.matchRsDetailQuery();
+				uni.setStorageSync(this.mapKey, this.ocaId);
+			},
+			onNewUserPathClick(data) {
+				// console.log("onNewUserPathClick:", data);
+				this.selectedPath = data;
+				this.$refs.myGuide.popupOpen();
+			},
+			onPathClick(data) {
+				// console.log("onPathClick:", data);
+				if (this.ocaId != data.path.ocaId) {
+					this.ocaId = data.path.ocaId;
+					this.matchRsDetailQuery();
+					uni.setStorageSync(this.mapKey, data.path.ocaId);
+				}
+			},
+			onGuideClose() {
+				if (this.isNewUser && this.selectedPath != null) {
+					this.$refs.myPathList.to_detail(this.selectedPath);
+					this.selectedPath = null;
+				}
+			},
+			btnStartGame() {
+				// 赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
+				if (this.mcState == 1) {
+					const url = `action://to_detail/?id=${this.ocaId}&matchType=${this.mcType}`;
+					tools.appAction(url);
+				} else if (this.mcState == 0) {
+					uni.showToast({
+						title: '比赛尚未开始',
+						icon: 'none',
+						duration: 3000
+					});
+				} else if (this.mcState == 2) {
+					uni.showToast({
+						title: '比赛已结束',
+						icon: 'none',
+						duration: 3000
+					});
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.content {
+		width: 100vw;
+		min-height: 100vh;
+		overflow-x: scroll;
+	}
+
+	.page-top {
+		position: relative;
+		z-index: 10;
+		width: 100%;
+		height: 270px;
+		padding-top: 36px;
+		justify-content: space-between;
+		background-image: url("/static/backgroud/top_bg_egg2.png");
+		background-repeat: no-repeat;
+		background-position-x: center;
+		background-position-y: center;
+		background-size: cover;
+		/* background-size: 100% 100%; */
+	}
+
+	.topbar-color {
+		color: #333333;
+	}
+
+	.topcontent {
+		height: 90%;
+		margin-bottom: 50px;
+	}
+
+	.logo {
+		width: 80px;
+		height: 80px;
+		margin-top: 10px;
+		/* background-image: url('/static/logo/sddx.png'); */
+		background-repeat: no-repeat;
+		background-position-x: center;
+		background-position-y: center;
+		background-size: contain;
+	}
+
+	.top-acttime {
+		display: none;
+		text-shadow: 3px 3px 0px #640008;
+		font-family: YouSheBiaoTiHei;
+		/* font-family: Arial, Helvetica, sans-serif; */
+		font-weight: bold;
+		color: #ffee0b;
+		font-size: 26px;
+	}
+
+	.topbtm {
+		width: 100%;
+		/* height: 60rpx; */
+		margin-bottom: 40px;
+		justify-content: space-evenly;
+	}
+
+	.topbtm-name {
+		/* width: 320rpx; */
+		/* height: 28px; */
+		padding: 5px 12px;
+		background-color: #9fda39;
+		border-radius: 5px;
+		/* backdrop-filter: blur(30px); */
+		text-align: center;
+		font-weight: 500;
+		color: #497400;
+		font-size: 14px;
+	}
+
+	.midType0 {
+		width: 90%;
+		height: 150px;
+		position: relative;
+		z-index: 20;
+		margin-top: -40px;
+		background: #ffffff;
+		border-radius: 9px;
+		box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
+		font-family: Source Han Sans CN;
+	}
+
+	.midType1 {
+		width: 90%;
+		/* height: 112px; */
+		height: 150px;
+		position: relative;
+		z-index: 20;
+		margin-top: -70px;
+		background: #ffffff;
+		border-radius: 9px;
+		box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.13);
+		font-family: Source Han Sans CN;
+	}
+
+	.mid-0 {
+		width: 90%;
+		margin: 12px;
+	}
+
+	.mid-0-select {
+		width: 60%;
+		font-weight: 500;
+		color: #8e8e8e;
+		font-size: 14px;
+	}
+
+	.mid-0-help {
+		position: absolute;
+		right: 30px;
+		font-size: 12px;
+		font-weight: 500;
+		color: #992900;
+	}
+
+	.mid-0-right {
+		position: absolute;
+		width: 60px;
+		/* background-color: #81cd00; */
+		right: 10px;
+		font-size: 12px;
+		font-weight: 500;
+		color: #992900;
+	}
+
+	.midType0-mid-1 {
+		width: 90%;
+		margin-bottom: 12px;
+	}
+
+	.midType1-select {
+		/* width: 46%; */
+		min-width: 46%;
+		max-width: 50%;
+		margin: 0 5px;
+		font-weight: 500;
+		color: #8e8e8e;
+		font-size: 14px;
+	}
+
+	.midType1-mid-1 {
+		width: 90%;
+		margin-bottom: 12px;
+		font-weight: 500;
+		color: #8e8e8e;
+		font-size: 14px;
+	}
+
+	.mid-1-yellowCard {
+		width: 15px;
+		height: 20px;
+		margin-right: 10px;
+	}
+
+	.mid-1-name {
+		max-width: 360rpx;
+		white-space: nowrap;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+
+	.mid-1-text {
+		/* min-width: 60px; */
+		font-weight: 500;
+		color: #9a300e;
+		font-size: 12px;
+	}
+
+	.mid-2 {
+		width: 92%;
+		/* margin: 0 10px; */
+	}
+
+	.mid-2-value {
+		font-weight: 900;
+		font-size: 22px;
+		line-height: 25px;
+	}
+
+	.mid-2-text {
+		color: #989898;
+		font-size: 12px;
+	}
+
+	.mid-line {
+		width: 0px;
+		height: 40px;
+		border: 1px solid;
+		border-color: #e6e6e6;
+	}
+
+	.overview-1 {
+		width: 111px;
+		height: 54px;
+		background: #ffb40b;
+		border-radius: 50%;
+		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
+		pointer-events: auto;
+	}
+
+	.overview-2 {
+		margin-top: -43px;
+		color: #ffffff;
+		font-size: 18px;
+		pointer-events: auto;
+	}
+
+	.overview-3 {
+		width: 111px;
+		height: 54px;
+		background: #f39509;
+		border-radius: 50%;
+		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
+		pointer-events: auto;
+	}
+
+	.overview-4 {
+		width: 111px;
+		height: 54px;
+		background: #81cd00;
+		border-radius: 50%;
+		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
+		pointer-events: auto;
+	}
+
+	.overview-5 {
+		width: 111px;
+		height: 54px;
+		background: #64cbb0;
+		border-radius: 50%;
+		box-shadow: 3px 3px 0px rgba(140, 140, 140, 1);
+		pointer-events: auto;
+	}
+
+	.ovline1 {
+		margin-top: 9px;
+		color: #ffffff;
+		font-size: 12px;
+	}
+
+	.ovline2 {
+		color: #ffffff;
+		font-size: 16px;
+	}
+
+	.main {
+		width: 100%;
+		margin-top: 20px;
+		margin-bottom: 20px;
+		/* height: 70vh; */
+		justify-content: space-around;
+		/* justify-content: space-between; */
+	}
+
+	.main-title {
+		margin-bottom: 10px;
+		font-weight: 550;
+		color: #333333;
+		font-size: 16px;
+	}
+
+	.bottom {
+		width: 100%;
+		flex-grow: 1;
+		justify-content: flex-end;
+	}
+
+	.btnStartGame {
+		display: none;
+		width: 70%;
+		height: 80rpx;
+		/* margin-top: 50rpx; */
+		margin-bottom: 20rpx;
+		/* font-weight: bold; */
+		color: white;
+		font-size: 32rpx;
+		line-height: 80rpx;
+		border-radius: 27px;
+		background-color: #2e85ec;
+	}
+
+	/deep/ .e-select {
+		/* width: 60%; */
+		height: 60rpx;
+		background: #2e85ec;
+		color: #ffffff;
+		border-radius: 18px;
+		justify-content: space-around;
+
+		font-size: 16px;
+		font-weight: 500;
+		line-height: 60rpx;
+		text-align: center;
+		border: none !important;
+	}
+
+	/deep/ .e-select-input-text {
+		color: inherit !important;
+	}
+
+	/deep/ .e-select-selector-item {
+		color: #818181;
+	}
+
+	/deep/ .uni-icons {
+		color: inherit !important;
+	}
+
+	/deep/ .e-select-icon {
+		width: 26px !important;
+	}
 </style>

BIN
card/static/common/circle_green.png


BIN
card/static/common/circle_orange.png


BIN
card/static/common/finishgame.png


BIN
card/static/common/ingame.png


BIN
card/static/common/unfinishgame.png


BIN
card/static/help/btn_close.png


BIN
card/static/help/btn_next.png


BIN
card/static/help/btn_replay.png


BIN
card/static/help/guide1_1.png


BIN
card/static/help/guide1_2.png


BIN
card/static/help/guide1_3.png


BIN
card/static/help/guide1_4.png


BIN
card/static/help/guide1_5.png


BIN
card/static/help/guide1_bg.png