wzx před 11 měsíci
rodič
revize
19c4a7ab84
3 změnil soubory, kde provedl 534 přidání a 324 odebrání
  1. 508 316
      custom/common/tools.js
  2. 2 2
      custom/manifest.json
  3. 24 6
      custom/pages/tpl/challenge/success.uvue

+ 508 - 316
custom/common/tools.js

@@ -1,317 +1,509 @@
-var tools = {
-	
-	// 导航到彩图奔跑APP内的某个页面或执行APP内部的某些功能
-	appAction(url) {
-		console.log("appAction", url);
-		// console.log("getApp", getApp());
-		// getApp().$audio.destroy();
-		// getApp().$audio.pause();
-		window.location.href = url;
-	},
-	
-	// 秒数转换成时分秒
-	convertSecondsToHMS(seconds) {
-		var hours = Math.floor(seconds / 3600);
-		var minutes = Math.floor((seconds % 3600) / 60);
-		var remainingSeconds = seconds % 60;
-		// return hours + ":" + minutes + ":" + remainingSeconds;
-		return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;
-	},
-
-	// 计算(中英文混合)字符串长度
-	calStrLen(str) {
-		var length = 0;
-		for (var i = 0; i < str.length; i++) {
-			// 将字符转换为 Unicode 编码
-			var charCode = str.charCodeAt(i);
-			if (charCode >= 0 && charCode <= 128) {
-				length++;
-			} else {
-				length += 2;
-			}
-		}
-
-		return length;
-	},
-
-	// 集合对象去重
-	unique(arr, field) {
-		var map = {};
-		var res = [];
-		for (var i = 0; i < arr.length; i++) {
-			if (!map[arr[i][field]]) {
-				map[arr[i][field]] = 1;
-				res.push(arr[i]);
-			}
-		}
-		return res;
-	},
-
-	// 正则取出html标签
-	repalceHtml(str) {
-		var dd = str.replace(/<\/?.+?>/g, "");
-		var dds = dd.replace(/ /g, ""); //dds为得到后的内容
-		return dds;
-	},
-
-	// 判断身份证号    
-	isSfz(idcard) {
-		var id =
-			/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}([0-9]|x|X)$/
-		if (idcard === '') {
-			uni.showToast({
-				title: '请输入身份证号',
-				icon: 'none'
-			})
-		} else if (!id.test(idcard)) {
-			uni.showToast({
-				title: '身份证号格式不正确!',
-				icon: 'none'
-			})
-			return false
-		} else {
-			return false
-		}
-	},
-
-	// 判断是否是手机号   
-	isPhone(val) {
-		var patrn = /^(((1[3456789][0-9]{1})|(15[0-9]{1}))+\d{8})$/
-		if (!patrn.test(val) || val === '') {
-			uni.showToast({
-				title: '手机号格式不正确',
-				icon: 'none'
-			})
-			return false
-		} else {
-			return true
-		}
-	},
-
-	// 判断邮箱
-	isEmail(email) {
-		if (email.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
-			return true;
-		else
-			return false;
-	},
-
-	//获取随机数
-	getSuiji() {
-		var Range = Max - Min;
-		var Rand = Math.random();
-		return (Min + Math.round(Rand * Range));
-	},
-
-	//计算多长时间前
-	getDateDiff(dateTimeStamp) {
-		var minute = 1000 * 60;
-		var hour = minute * 60;
-		var day = hour * 24;
-		var halfamonth = day * 15;
-		var month = day * 30;
-		var year = day * 365;
-		var now = new Date().getTime();
-		var diffValue = now - dateTimeStamp;
-		if (diffValue < 0) {
-			return;
-		}
-		var yearC = diffValue / year;
-		var monthC = diffValue / month;
-		var weekC = diffValue / (7 * day);
-		var dayC = diffValue / day;
-		var hourC = diffValue / hour;
-		var minC = diffValue / minute;
-		if (yearC >= 1) {
-			result = "" + parseInt(yearC) + "年前";
-		}
-		if (monthC >= 1) {
-			result = "" + parseInt(monthC) + "月前";
-		} else if (weekC >= 1) {
-			result = "" + parseInt(weekC) + "周前";
-		} else if (dayC >= 1) {
-			result = "" + parseInt(dayC) + "天前";
-		} else if (hourC >= 1) {
-			result = "" + parseInt(hourC) + "小时前";
-		} else if (minC >= 1) {
-			result = "" + parseInt(minC) + "分钟前";
-		} else
-			result = "刚刚";
-		return result;
-	},
-
-	// 时间戳转时间
-	timestampToTime(timestamp, i) {
-		var date = new Date(timestamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
-		// console.log(date, timestamp)
-		var Y = date.getFullYear() + '-';
-		var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
-		var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
-		var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
-		var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
-		var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
-		if (i == 1) {
-			return Y + M + D;
-		}
-		return Y + M + D + h + m + s;
-	},
-
-	// 是否是汉字
-	isHanzi(str) {
-		let reg = /\p{Unified_Ideograph}/ug;
-		return reg.test(str);
-	},
-
-	// 是否是字母数字
-	isStringAndNumber(str) {
-		let regNumber = new RegExp(/^[0-9A-Za-z]+$/);
-		return regNumber.test(str)
-	},
-
-	// var arr3 = [30,10,111,35,1899,50,45];
-	// 集合排序  元素数字
-	listSort(list) {
-		arr3.sort(function(a, b) {
-			return a - b;
-		})
-	},
-
-	// var arr5 = [{id:10},{id:5},{id:6},{id:9},{id:2},{id:3}];
-	// 元素  对象
-	listObjectSort(arr) {
-		arr.sort(function(a, b) {
-			return a.id - b.id
-		})
-		return arr;
-	},
-
-	/*
-	 * 忽略大小写判断字符串是否相同
-	 * @param str1
-	 * @param str2
-	 * @returns {Boolean}
-	 */
-	isEqualsIgnorecase: function(str1, str2) {
-		if (str1.toUpperCase() == str2.toUpperCase()) {
-			return true;
-		} else {
-			return false;
-		}
-	},
-
-	/**
-	 * 判断是否是数字
-	 * @param value
-	 * @returns {Boolean}
-	 */
-	isNum: function(value) {
-		if (value != null && value.length > 0 && isNaN(value) == false) {
-			return true;
-		} else {
-			return false;
-		}
-	},
-
-	/**
-	 * 判断是否是中文
-	 * @param str
-	 * @returns {Boolean}
-	 */
-	isChine: function(str) {
-		var reg = /^([u4E00-u9FA5]|[uFE30-uFFA0])*$/;
-		if (reg.test(str)) {
-			return false;
-		}
-		return true;
-	},
-
-	/*验证是否为图片*/
-	tmCheckImage: function(fileName) {
-		return /(gif|jpg|jpeg|png|GIF|JPG|PNG)$/ig.test(fileName);
-	},
-
-	/*验证是否为视频*/
-	tmCheckVideo: function(fileName) {
-		return /(mp4|mp3|flv|wav)$/ig.test(fileName);
-	},
-
-	/**
-	 * 去除字符串两边的空格
-	 * @param str
-	 * @returns {number|Number}
-	 * 调用方法:var str = utils.trim("abcd")
-	 */
-	trim: function(str) {
-		String.prototype.trim = function() {
-			return str.replace(/(^\s*)|(\s*$)/g, "");
-		}
-	},
-
-	// 判断密码是否符合 至少6位,包括大小写字母、数字、特殊字符
-	isPassword(val) {
-		var reg = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$)^.{8,16}$/;
-		if (val === '') {
-			uni.showToast({
-				title: '请输入密码',
-				icon: 'none'
-			})
-		} else if (!reg.test(val)) {
-			uni.showToast({
-				title: '至少6位,包括大小写字母、数字、特殊字符',
-				icon: 'none'
-			})
-			return false
-		} else {
-			return true
-		}
-	},
-
-	// 电话匿名
-	noPassByMobile(str) {
-		if (null != str && str != undefined) {
-			var pat = /(\d{3})\d*(\d{4})/;
-			return str.replace(pat, '$1****$2');
-		} else {
-			return "";
-		}
-	},
-
-	// 获取两点间的距离
-	//进行经纬度转换为距离的计算
-	Rad(d) {
-		return d * Math.PI / 180.0; //经纬度转换成三角函数中度分表形式。
-	},
-
-	/*
-	 计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
-	 默认单位km
-	*/
-	getMapDistance(lat1, lat2, lng1, lng2) {
-		lat1 = lat1 || 0;
-		lng1 = lng1 || 0;
-		lat2 = lat2 || 0;
-		lng2 = lng2 || 0;
-
-		var rad1 = lat1 * Math.PI / 180.0;
-		var rad2 = lat2 * Math.PI / 180.0;
-		var a = rad1 - rad2;
-		var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
-		var r = 6378137;
-		var distance = r * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rad1) * Math.cos(rad2) *
-			Math.pow(Math.sin(b / 2), 2)));
-		console.log(lat1, lng1, lat2, lng2);
-		console.log(distance);
-		return Math.round(distance) / 1000;
-	},
-
-	// 预览图片
-	yulanImg(item) {
-		let arr = [item]
-		uni.previewImage({
-			urls: arr,
-		});
-	},
-
-}
-
+var tools = {
+	
+	// 对url追加项目版本号,用于页面更新后用户端的强制刷新
+	// 每次页面变更必须更新项目版本号
+	urlAddVer(url) {
+		let newUrl = url;
+		
+		// 获取当前app的版本
+		const systemInfo = uni.getSystemInfoSync();
+		
+		// #ifdef H5
+		const version_number = systemInfo.appVersion;
+		// console.log('版本号:', version_number);
+		
+		if (newUrl.indexOf('_v=') !== -1) {
+			return newUrl;
+		}
+		
+		if (newUrl.indexOf('?') !== -1) {
+			newUrl += "&_v=" + version_number;
+		} else {
+			newUrl += "?_v=" + version_number;
+		}
+		// #endif
+		
+		console.log("[urlAddVer] newUrl", newUrl);
+		return newUrl;
+	},
+	
+	// 导航到彩图奔跑APP内的某个页面或执行APP内部的某些功能
+	appAction(url, actType="") {
+		console.log("appAction", url);
+		// console.log("getApp", getApp());
+		// getApp().$audio.destroy();
+		// getApp().$audio.pause();
+		
+		if (url.indexOf('http') !== -1) {	// http 或 https 开头的网址
+			window.location.href = this.urlAddVer(url);
+		} else if (url == "reload") {
+			window.location.reload();
+		} else if (actType == "uni.navigateTo") {
+			uni.navigateTo({
+				url: this.urlAddVer(url)
+			});
+		} else {
+			window.location.href = url;
+		}
+	},
+	
+	// 格式化赛事时间 09-09 16:48
+	fmtMcTime(timestamp) {
		var date = new Date(timestamp * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+		// var Y = date.getFullYear() + '-';
+		var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+		var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
+		var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
+		var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
+		// var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
+
+		const timeStr = M + D + h + m;
+		// console.log("timeStr", timeStr);
+		return timeStr;
+	},
+	
+	// 获取活动时间 09-09 16:48 至 09-30 16:48
+	getActtime(beginSecond, endSecond) {
+		const acttime = this.fmtMcTime(beginSecond) + " 至 " + this.fmtMcTime(endSecond);
+		// console.log("acttime:", acttime);
+		return acttime;
+	},
+	
+	// 格式化赛事时间 2024.9.9-30 2024.9.9-10.30 2024.9.9-2025.10.30
+	fmtMcTime2(timestamp1, timestamp2) {
+		const date1 = new Date(timestamp1 * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+		const date2 = new Date(timestamp2 * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+	
+		const Y1 = date1.getFullYear();
+		const Y2 = date2.getFullYear();
+		const M1 = date1.getMonth() + 1;
+		const M2 = date2.getMonth() + 1;
+		const D1 = date1.getDate();
+		const D2 = date2.getDate();
+	
+		var timeStr1 = Y1 + '.' + M1 + '.' + D1;
+		var timeStr2 = '';
+	
+		if (Y2 != Y1) {
+			timeStr2 += Y2 + '.' + M2 + '.' + D2;
+		} else if (M2 != M1) {
+			timeStr2 += M2 + '.' + D2;
+		} else if (D2 != D1) {
+			timeStr2 += D2;
+		}
+	
+		var timeStr = timeStr1;
+		if (timeStr2.length > 0) {
+			timeStr += '-' + timeStr2;
+		}
+		// console.log("timeStr", timeStr);
+		return timeStr;
+	},
+	
+	// 判断赛事/活动状态 0: 未开始  1: 进行中  2: 已结束
+	checkMcState(beginSecond, endSecond) {
+		let mcState = 0;	// 未开始
+		if (beginSecond > 0 && endSecond > 0) {
+			const now = Date.now() / 1000;
+			const dif1 = beginSecond - now;
+			const dif2 = endSecond - now;
+			// const dif = 3600*24 - 60;
+			if (dif1 > 0) {
+				console.log("活动未开始");
+				mcState = 0;	// 未开始
+			} else if (dif2 > 0) {
+				console.log("活动进行中");
+				mcState = 1;	// 进行中
+			} else {
+				console.log("活动已结束");
+				mcState = 2;	// 已结束
+			}
+		}
+		return mcState;
+	},
+
+	// 动态创建<style>标签,将CSS代码插入到文档中
+	loadCssCode(cssCode, styleId="css-custom") {
+		this.removeCssCode(styleId);
+		
+		// const styleId = "css-custom";
+		var style = window.document.createElement("style");
+		style.type = "text/css";
+		style.id = styleId;
+		if (style.styleSheet) {
+			// This is required for IE8 and below.
+			style.styleSheet.cssText = cssCode;
+		} else {
+			style.appendChild(document.createTextNode(cssCode));
+		}
+		document.getElementsByTagName("head")[0].appendChild(style);
+		// console.log("head:", document.getElementsByTagName("head")[0]);
+		// console.log("head:", document.getElementById(styleId));
+		// console.log("style:", style);
+	},
+	
+	// 删除之前动态创建的<style>标签
+	removeCssCode(styleId="css-custom") {
+		// const styleId = "css-custom";
+		var oldCss = document.getElementById(styleId);
+		// console.log("oldCss:", oldCss);
+		if (oldCss != null) {
+			document.getElementsByTagName("head")[0].removeChild(oldCss);
+			console.log(styleId + " 已移除");
+		}
+	},
+
+	// uni-data-select 组件,根据选中的值获取对应的文本
+	getSelectedText(obj, value) {
+		const selectedOption = obj.find(option => option.value === value);
+		return selectedOption ? selectedOption.text : '';
+	},
+
+	objectToQueryString(obj) {
+		return Object.keys(obj).map(k => k + '=' + obj[k]).join('&');
+	},
+
+	// 秒数转换成 XX天XX小时
+	convertSecondsToDHM(seconds) {
+		var days = Math.floor(seconds / (3600 * 24));
+		var hours = Math.floor((seconds % (3600 * 24)) / 3600);
+		var minutes = Math.floor((seconds % (3600 * 24)) % 3600 / 60);
+		if (days > 0)
+			// return `${days.toString().padStart(2, '0')}天${hours.toString().padStart(2, '0')}小时`;
+			return `${days}天${hours.toString().padStart(2, '0')}小时`;
+		else
+			return `${hours.toString().padStart(2, '0')}小时${minutes.toString().padStart(2, '0')}分钟`;
+	},
+
+	// 秒数转换成时分秒
+	// style:  0 [01:02:03]  1 [1h:02'3"]
+	convertSecondsToHMS(seconds, style = 0) {
+		if (!(seconds > 0)) {
+			return '--';
+		}
+		var hours = Math.floor(seconds / 3600);
+		var minutes = Math.floor((seconds % 3600) / 60);
+		var remainingSeconds = Math.floor(seconds % 60);
+		// return hours + ":" + minutes + ":" + remainingSeconds;
+		if (style == 0)
+			return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;
+		else if (style == 1) {
+			if (hours > 0)
+				return `${hours}h${minutes}′${remainingSeconds.toString().padStart(2, '0')}″`;
+			else
+				return `${minutes}′${remainingSeconds.toString().padStart(2, '0')}″`;
+		}
+		else if (style == 2) {
+			if (hours > 0)
+				return `${hours*60+minutes}′${remainingSeconds.toString().padStart(2, '0')}″`;
+			else
+				return `${minutes}′${remainingSeconds.toString().padStart(2, '0')}″`;
+		}
+	},
+
+	// 计算(中英文混合)字符串长度
+	calStrLen(str) {
+		var length = 0;
+		for (var i = 0; i < str.length; i++) {
+			// 将字符转换为 Unicode 编码
+			var charCode = str.charCodeAt(i);
+			if (charCode >= 0 && charCode <= 128) {
+				length++;
+			} else {
+				length += 2;
+			}
+		}
+
+		return length;
+	},
+
+	// 集合对象去重
+	unique(arr, field) {
+		var map = {};
+		var res = [];
+		for (var i = 0; i < arr.length; i++) {
+			if (!map[arr[i][field]]) {
+				map[arr[i][field]] = 1;
+				res.push(arr[i]);
+			}
+		}
+		return res;
+	},
+
+	// 正则取出html标签
+	repalceHtml(str) {
+		var dd = str.replace(/<\/?.+?>/g, "");
+		var dds = dd.replace(/ /g, ""); //dds为得到后的内容
+		return dds;
+	},
+
+	// 判断身份证号    
+	isSfz(idcard) {
+		var id =
+			/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}([0-9]|x|X)$/
+		if (idcard === '') {
+			uni.showToast({
+				title: '请输入身份证号',
+				icon: 'none'
+			})
+		} else if (!id.test(idcard)) {
+			uni.showToast({
+				title: '身份证号格式不正确!',
+				icon: 'none'
+			})
+			return false
+		} else {
+			return false
+		}
+	},
+
+	// 判断是否是手机号   
+	isPhone(val) {
+		var patrn = /^(((1[3456789][0-9]{1})|(15[0-9]{1}))+\d{8})$/
+		if (!patrn.test(val) || val === '') {
+			uni.showToast({
+				title: '手机号格式不正确',
+				icon: 'none'
+			})
+			return false
+		} else {
+			return true
+		}
+	},
+
+	// 判断邮箱
+	isEmail(email) {
+		if (email.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
+			return true;
+		else
+			return false;
+	},
+
+	//获取随机数
+	getSuiji() {
+		var Range = Max - Min;
+		var Rand = Math.random();
+		return (Min + Math.round(Rand * Range));
+	},
+
+	//计算多长时间前
+	getDateDiff(dateTimeStamp) {
+		var minute = 1000 * 60;
+		var hour = minute * 60;
+		var day = hour * 24;
+		var halfamonth = day * 15;
+		var month = day * 30;
+		var year = day * 365;
+		var now = new Date().getTime();
+		var diffValue = now - dateTimeStamp;
+		if (diffValue < 0) {
+			return;
+		}
+		var yearC = diffValue / year;
+		var monthC = diffValue / month;
+		var weekC = diffValue / (7 * day);
+		var dayC = diffValue / day;
+		var hourC = diffValue / hour;
+		var minC = diffValue / minute;
+		if (yearC >= 1) {
+			result = "" + parseInt(yearC) + "年前";
+		}
+		if (monthC >= 1) {
+			result = "" + parseInt(monthC) + "月前";
+		} else if (weekC >= 1) {
+			result = "" + parseInt(weekC) + "周前";
+		} else if (dayC >= 1) {
+			result = "" + parseInt(dayC) + "天前";
+		} else if (hourC >= 1) {
+			result = "" + parseInt(hourC) + "小时前";
+		} else if (minC >= 1) {
+			result = "" + parseInt(minC) + "分钟前";
+		} else
+			result = "刚刚";
+		return result;
+	},
+
+	// 时间戳转时间
+	timestampToTime(timestamp, i) {
+		var date = null;
+		if (timestamp > 0) {
+			date = new Date(timestamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+		} else {
+			date = new Date();
+		}
+		// console.log(date, timestamp)
+		
+		var Y = date.getFullYear();
+		var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
+		var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
+		var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours());
+		var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
+		var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
+		if (i == 1) {
+			return Y + '-' + M + '-' + D;
+		} else if (i == 2) {
+			return Y + '年' + M + '月' + D + '日';
+		} else if (i == 3) {
+			return Y + '-' + M + '-' + D + ' ' + h + ':' + m;
+		}
+		return Y + '-' + M + '-' + D + ' ' + h + ':' + m + ':' + s;
+	},
+
+	// 是否是汉字
+	isHanzi(str) {
+		let reg = /\p{Unified_Ideograph}/ug;
+		return reg.test(str);
+	},
+
+	// 是否是字母数字
+	isStringAndNumber(str) {
+		let regNumber = new RegExp(/^[0-9A-Za-z]+$/);
+		return regNumber.test(str)
+	},
+
+	// var arr3 = [30,10,111,35,1899,50,45];
+	// 集合排序  元素数字
+	listSort(list) {
+		arr3.sort(function(a, b) {
+			return a - b;
+		})
+	},
+
+	// var arr5 = [{id:10},{id:5},{id:6},{id:9},{id:2},{id:3}];
+	// 元素  对象
+	listObjectSort(arr) {
+		arr.sort(function(a, b) {
+			return a.id - b.id
+		})
+		return arr;
+	},
+
+	/*
+	 * 忽略大小写判断字符串是否相同
+	 * @param str1
+	 * @param str2
+	 * @returns {Boolean}
+	 */
+	isEqualsIgnorecase: function(str1, str2) {
+		if (str1.toUpperCase() == str2.toUpperCase()) {
+			return true;
+		} else {
+			return false;
+		}
+	},
+
+	/**
+	 * 判断是否是数字
+	 * @param value
+	 * @returns {Boolean}
+	 */
+	isNum: function(value) {
+		if (value != null && value.length > 0 && isNaN(value) == false) {
+			return true;
+		} else {
+			return false;
+		}
+	},
+
+	/**
+	 * 判断是否是中文
+	 * @param str
+	 * @returns {Boolean}
+	 */
+	isChine: function(str) {
+		var reg = /^([u4E00-u9FA5]|[uFE30-uFFA0])*$/;
+		if (reg.test(str)) {
+			return false;
+		}
+		return true;
+	},
+
+	/*验证是否为图片*/
+	tmCheckImage: function(fileName) {
+		return /(gif|jpg|jpeg|png|GIF|JPG|PNG)$/ig.test(fileName);
+	},
+
+	/*验证是否为视频*/
+	tmCheckVideo: function(fileName) {
+		return /(mp4|mp3|flv|wav)$/ig.test(fileName);
+	},
+
+	/**
+	 * 去除字符串两边的空格
+	 * @param str
+	 * @returns {number|Number}
+	 * 调用方法:var str = utils.trim("abcd")
+	 */
+	trim: function(str) {
+		String.prototype.trim = function() {
+			return str.replace(/(^\s*)|(\s*$)/g, "");
+		}
+	},
+
+	// 判断密码是否符合 至少6位,包括大小写字母、数字、特殊字符
+	isPassword(val) {
+		var reg = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$)^.{8,16}$/;
+		if (val === '') {
+			uni.showToast({
+				title: '请输入密码',
+				icon: 'none'
+			})
+		} else if (!reg.test(val)) {
+			uni.showToast({
+				title: '至少6位,包括大小写字母、数字、特殊字符',
+				icon: 'none'
+			})
+			return false
+		} else {
+			return true
+		}
+	},
+
+	// 电话匿名
+	noPassByMobile(str) {
+		if (null != str && str != undefined) {
+			var pat = /(\d{3})\d*(\d{4})/;
+			return str.replace(pat, '$1****$2');
+		} else {
+			return "";
+		}
+	},
+
+	// 获取两点间的距离
+	//进行经纬度转换为距离的计算
+	Rad(d) {
+		return d * Math.PI / 180.0; //经纬度转换成三角函数中度分表形式。
+	},
+
+	/*
+	 计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
+	 默认单位km
+	*/
+	getMapDistance(lat1, lat2, lng1, lng2) {
+		lat1 = lat1 || 0;
+		lng1 = lng1 || 0;
+		lat2 = lat2 || 0;
+		lng2 = lng2 || 0;
+
+		var rad1 = lat1 * Math.PI / 180.0;
+		var rad2 = lat2 * Math.PI / 180.0;
+		var a = rad1 - rad2;
+		var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
+		var r = 6378137;
+		var distance = r * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rad1) * Math.cos(rad2) *
+			Math.pow(Math.sin(b / 2), 2)));
+		// console.log(lat1, lng1, lat2, lng2);
+		// console.log(distance);
+		return Math.round(distance) / 1000;
+	},
+
+	// 预览图片
+	yulanImg(item) {
+		let arr = [item]
+		uni.previewImage({
+			urls: arr,
+		});
+	},
+
+}
+
 export default tools;

+ 2 - 2
custom/manifest.json

@@ -2,8 +2,8 @@
     "name" : "custom",
     "appid" : "__UNI__F860CDD",
     "description" : "彩图奔跑APP内客户定制样式页面",
-    "versionName" : "1.2.0",
-    "versionCode" : 120,
+    "versionName" : "1.2.1",
+    "versionCode" : 121,
     "uni-app-x" : {},
     /* 快应用特有相关 */
     "quickapp" : {},

+ 24 - 6
custom/pages/tpl/challenge/success.uvue

@@ -54,7 +54,10 @@ https://oss-mbh5.colormaprun.com/custom/#/pages/tpl/challenge/index?pagetype=cha
 						<text class="name">{{nameSub}}</text>
 					</view>
 				</view>
-				<view class="btnRankList btnRankListBg" @click="btnRankList">点击查看排行榜</view>
+				<view class="btnBox uni-row uni-jcsa">
+					<view class="btn btnBg" @click="btnExchange">查看奖励</view>
+					<view class="btn btnBg" @click="btnRankList">查看排行榜</view>
+				</view>
 			</view>
 
 			<my-fab></my-fab>
@@ -66,6 +69,7 @@ https://oss-mbh5.colormaprun.com/custom/#/pages/tpl/challenge/index?pagetype=cha
 	import tools from '/common/tools';
 	import {
 		token,
+		ossUrl,
 		apiCardUrlQuery,
 		checkResCode
 	} from '/common/api';
@@ -198,7 +202,17 @@ https://oss-mbh5.colormaprun.com/custom/#/pages/tpl/challenge/index?pagetype=cha
 						duration: 3000
 					});
 				}
-			}
+			},
+			btnExchange() {
+				const queryObj = {
+					token: this.token,
+					tabCurrent: 2
+				};
+				const queryString = tools.objectToQueryString(queryObj);
+				// console.log("queryString", queryString);
+				const url = `${ossUrl}#/pages/achievement/index2?${queryString}`;
+				tools.appAction(url);
+			},
 		}
 	}
 </script>
@@ -221,7 +235,7 @@ https://oss-mbh5.colormaprun.com/custom/#/pages/tpl/challenge/index?pagetype=cha
 			background-image: url("/static/tpl/challenge/orange_rank_bg.png");
 		}
 
-		.btnRankListBg {
+		.btnBg {
 			background: #FFFFFF;
 			color: #E05200;
 		}
@@ -231,7 +245,7 @@ https://oss-mbh5.colormaprun.com/custom/#/pages/tpl/challenge/index?pagetype=cha
 		width: 100vw;
 		min-height: 100vh;
 	}
-	
+
 	.content {
 		width: 750rpx;
 		min-height: 100vh;
@@ -342,10 +356,14 @@ https://oss-mbh5.colormaprun.com/custom/#/pages/tpl/challenge/index?pagetype=cha
 		color: #ffffff;
 		padding-left: 10rpx;
 	}
+	
+	.btnBox {
+		width: 70%;
+	}
 
-	.btnRankList {
+	.btn {
 		// opacity: 30%;
-		width: 194px;
+		width: 45%;
 		height: 35px;
 		margin-top: 10rpx;
 		margin-bottom: 60rpx;