Browse Source

修改 手机端 侧滑菜单 使用原生渲染方式 nvue。修改了部分样式,简化首页等

slambb 4 years ago
parent
commit
b0b1754283
51 changed files with 3862 additions and 916 deletions
  1. 21 15
      App.vue
  2. 11 1
      common/config.js
  3. 3 2
      components/LEDFont/LEDFont.vue
  4. 173 0
      components/modal-mask/js_sdk/bind-tip.js
  5. 171 0
      components/modal-mask/js_sdk/uni-image-menu.js
  6. 182 0
      components/modal-mask/modal-mask-nvue.nvue
  7. 104 0
      components/modal-mask/modal-mask.vue
  8. 42 30
      components/modal/action-jump/action-jump.vue
  9. 230 0
      components/round-fab-custom/fab-custom.nvue
  10. 126 56
      components/round-fab/round-fab.vue
  11. 2 2
      components/side-bar/side-bar.vue
  12. 62 55
      components/side-bar/sideBar.js
  13. 1 0
      components/u-charts/u-charts.js
  14. 11 6
      components/uni-count-down/uni-count-down.vue
  15. 214 127
      pages.json
  16. 3 1
      pages/Loading-page/Loading/Loading.vue
  17. 63 14
      pages/friend-page/main/main.vue
  18. 100 16
      pages/friend-page/search/search.vue
  19. 53 20
      pages/friend-page/select/select.vue
  20. 509 0
      pages/game-page/game-list/game-list.vue
  21. 501 0
      pages/game-page/game-video/game-video.vue
  22. 45 0
      pages/my-page/achievement/achievement.vue
  23. 119 68
      pages/my-page/homepage/homepage.vue
  24. 222 477
      pages/personal-page/personal/personal.vue
  25. 3 3
      pages/personal-page/plan/plan.vue
  26. 260 0
      platform/app-plus/subNVue/drawer.nvue
  27. 121 0
      platform/app-plus/subNVue/popup.nvue
  28. 114 0
      platform/app-plus/subNVue/video-mask.nvue
  29. BIN
      static/achievement/11-01@2x.png
  30. BIN
      static/achievement/11-02@2x.png
  31. BIN
      static/achievement/11-03@2x.png
  32. BIN
      static/achievement/11-04@2x.png
  33. BIN
      static/achievement/11-05@2x.png
  34. BIN
      static/achievement/11-06@2x.png
  35. BIN
      static/achievement/11-07@2x.png
  36. BIN
      static/achievement/11-08@2x.png
  37. BIN
      static/achievement/11-09@2x.png
  38. BIN
      static/achievement/11-10@2x.png
  39. BIN
      static/achievement/11-11@2x.png
  40. BIN
      static/achievement/11-12@2x.png
  41. BIN
      static/achievement/11-13@2x.png
  42. BIN
      static/achievement/11-14@2x.png
  43. BIN
      static/achievement/11-15@2x.png
  44. BIN
      static/achievement/11-16@2x.png
  45. BIN
      static/font/uni.ttf
  46. BIN
      static/modal/tip/bind-tip-bg.png
  47. BIN
      static/personal/connecting.png
  48. BIN
      static/personal/disconnect.png
  49. BIN
      static/signBoard@2x.png
  50. 316 0
      util/util-css/main-nvue.css
  51. 80 23
      util/util-js/store.js

+ 21 - 15
App.vue

@@ -6,36 +6,42 @@
 	export default {
 
 		methods: {
-			...mapMutations(['onLuanchLogin', 'getBLEDeviceList','getFinalUseDevice']),
+			...mapMutations(['onLuanchLogin', 'getBLEDeviceList', 'getFinalUseDevice']),
 
 		},
 		onLaunch: function() {
 			console.log('App Launch');
 			// 先判断 系统版本
-			uni.getSystemInfo({
-				success: (res) => {
-					console.log("系统信息:", res);
-					this.$store.state.clientName = res.model
-					this.$store.state.system = res.system
-					this.$store.state.platform = res.platform
-					
-				},
-				fail: (err) => {},
-				complete: () => {}
-			})
+			const _systemInfo = uni.getSystemInfoSync();
+			// uni.getSystemInfo({
+			// 	success: (res) => {
+			// 		console.log("系统信息:", res);
+			// 		this.$store.state.clientName = res.model;
+			// 		this.$store.state.system = res.system;
+			// 		this.$store.state.platform = res.platform;
+			// 		this.$store.state.systemInfo = res;
+			// 	},
+			// 	fail: (err) => {},
+			// 	complete: () => {}
+			// })
+			console.log("系统信息:", _systemInfo);
+			this.$store.state.clientName = _systemInfo.model;
+			this.$store.state.system = _systemInfo.system;
+			this.$store.state.platform = _systemInfo.platform;
+			this.$store.state.systemInfo = _systemInfo;
 			//获取记录的最后一次连接
 			this.getFinalUseDevice();
 			//获取记录的蓝牙列表数据
 			this.getBLEDeviceList();
 
 			// #ifdef APP-PLUS
-			plus.runtime.getProperty(plus.runtime.appid, (info)=> {
-				console.log("version:",info);
+			plus.runtime.getProperty(plus.runtime.appid, (info) => {
+				console.log("version:", info);
 				this.$store.state.version = info.version;
 				this.$store.state.versionCode = info.versionCode;
 				this.$store.state.appName = info.name;
 			});
-			
+
 			// 锁住屏幕正方向
 			plus.screen.lockOrientation('portrait-primary');
 			// 屏幕常亮

+ 11 - 1
common/config.js

@@ -11,6 +11,7 @@ const active = "dev";
 //测试地址,阿里云服务器
 const host="https://www.9527fun.cn/api_dev"
 //本地测试地址
+// const host = "http://192.168.1.7:9090/api_dev"
 // const host = "http://192.168.0.112:9090/api_dev"
 // const host = "http://47.104.216.192:9090/api_dev"
 // const host = "http://121.4.103.151:9090/api_prd"
@@ -70,7 +71,16 @@ const URL = {
 	FITNESSPROGRAM: `${host}/fitness_program/add`,
 
 	FITNESSPROGRAMGET: `${host}/fitness_program/get`,
-
+	
+	/**
+	 * 7-28 好友操作部分
+	 */
+	//获取体重列表
+	SEARCHFIRENDLIST: `${host}/user_info/friend_search_list`,
+	ADDFIRENDINFO: `${host}/user_info/friend_add`,
+	DELETEFIRENDINFO: `${host}/user_info/friend_delete`,
+	GETFRIENDLIST: `${host}/user_info/get_friend_list`,
+	
 	//游戏页面部分
 	//获取全部游戏
 	GAMELIST: `${host}/game/list`,

+ 3 - 2
components/LEDFont/LEDFont.vue

@@ -1,6 +1,6 @@
 <template>
 	<view>
-		<view class="uni__number" :style="{ color: color, 'font-size': size+'px' }"> {{currentValue}} </view>
+		<view class="uni__number" :style="{ color: color, 'font-size': size+'px' }"> {{currentValue}}</view>
 	</view>
 </template>
 
@@ -23,7 +23,9 @@
 		},
 		watch: {
 			showValue(val) {
+				// console.log('showValue:',val);
 				this.currentValue = val;
+				this.$forceUpdate()
 			},
 		},
 		created: function(e) {
@@ -49,7 +51,6 @@
 		/* #endif */
 		justify-content: center;
 		align-items: center;
-		width: 56rpx;
 		height: 56rpx;
 		line-height: 56rpx;
 		margin: 5rpx;

+ 173 - 0
components/modal-mask/js_sdk/bind-tip.js

@@ -0,0 +1,173 @@
+var nvMask,nvImageMenu;
+export default {
+	show({list,cancelText},callback){
+		if(!list){
+			list = [{
+				"img":"https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/9a952c80-6080-11eb-a16f-5b3e54966275.png",
+				"text":"图标文字"
+			}]
+		}
+		if(list.length>8){
+			return uni.showToast({
+				title: '目前版本最多支持8个图标',
+				icon: 'none'
+			});
+		}
+		//以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心
+		var screenWidth = plus.screen.resolutionWidth;
+		var screenHeight = plus.screen.resolutionHeight;
+		//以360px宽度屏幕为例,上下左右边距及2排按钮边距留25像素,图标宽度55像素,同行图标间的间距在360宽的屏幕是30px,但需要动态计算,以此原则计算4列图标分别的left位置
+		//图标下的按钮文字距离图标5像素,文字大小12像素
+		//底部取消按钮高度固定为44px
+		//TODO 未处理横屏和pad,这些情况6个图标应该一排即可
+		var margin = 20,
+			iconWidth = 60,
+			icontextSpace = 5,
+			textHeight = 12
+		var left1 = margin / 360 * screenWidth
+		var iconSpace = (screenWidth - (left1 * 2) - (iconWidth * 4)) / 3 //屏幕宽度减去左右留白间距,再减去4个图标的宽度,就是3个同行图标的间距
+		if (iconSpace <= 5) { //屏幕过窄时,缩小边距和图标大小,再算一次
+			margin = 15
+			iconWidth = 40
+			left1 = margin / 360 * screenWidth
+			iconSpace = (screenWidth - (left1 * 2) - (iconWidth * 4)) / 3 //屏幕宽度减去左右留白间距,再减去4个图标的宽度,就是3个同行图标的间距
+		}
+		var left2 = left1 + iconWidth + iconSpace
+		var left3 = left1 + (iconWidth + iconSpace) * 2
+		var left4 = left1 + (iconWidth + iconSpace) * 3
+		var top1 = left1
+		var top2 = top1 + iconWidth + icontextSpace + textHeight + left1
+		nvMask = new plus.nativeObj.View("nvMask", { //先创建遮罩层
+			top: '0px',
+			left: '0px',
+			height: '100%',
+			width: '100%',
+			backgroundColor: 'rgba(0,0,0,0.2)'
+		});
+		nvMask.addEventListener("click", function() { //处理遮罩层点击
+			nvMask.hide();
+			nvImageMenu.hide();
+		})
+		var menuHeight = screenHeight/2 - (iconWidth + textHeight + 2 * margin)*Math.ceil(list.length/4) +44;
+		nvImageMenu = new plus.nativeObj.View("nvImageMenu", { //创建底部图标菜单
+			top: menuHeight + 'px',
+			left: '0px',
+			height: (iconWidth + textHeight + 2 * margin)*Math.ceil(list.length/4) +44+'px',//'264px',
+			width: '100%',
+			backgroundColor: 'rgb(255,255,255)'
+		});
+		
+		let myList = []
+		list.forEach((item,i)=>{
+			myList.push({
+				tag: 'img',
+				src: item.img,
+				position: {
+					top: eval('top'+( parseInt(i/4) +1)),
+					left: eval('left'+(1+i%4)),
+					width: iconWidth,
+					height: iconWidth
+				}
+			})
+			myList.push({
+				tag: 'font',
+				text: item.text,
+				textStyles: {
+					size: textHeight
+				},
+				position: {
+					top: eval('top'+(parseInt(i/4)+1)) + iconWidth + icontextSpace,
+					left: eval('left'+(1+i%4)),
+					width: iconWidth,
+					height: textHeight
+				}
+			})
+		})
+		
+		//绘制底部图标菜单的内容
+		nvImageMenu.draw([
+			{
+				tag: 'rect',//菜单顶部的分割灰线
+				color: '#e7e7e7',
+				position: {
+					top: '0px',
+					height: '1px'
+				}
+			},
+			{
+				tag: 'font',
+				text: cancelText,//底部取消按钮的文字
+				textStyles: {
+					size: '14px'
+				},
+				position: {
+					bottom: '0px',
+					height: '44px'
+				}
+			},
+			{
+				tag: 'rect',//底部取消按钮的顶部边线
+				color: '#e7e7e7',
+				position: {
+					bottom: '45px',
+					height: '1px'
+				}
+			},
+			...myList
+		])
+		nvMask.show()
+		nvImageMenu.show() //5+应支持从底部向上弹出的动画
+		
+		
+		
+		nvImageMenu.addEventListener("click",e=>{ //处理底部图标菜单的点击事件,根据点击位置触发不同的逻辑
+			// console.log("click menu"+JSON.stringify(e));
+			if (e.screenY > plus.screen.resolutionHeight - 44) { //点击了底部取消按钮
+				nvMask.hide();
+				nvImageMenu.hide();
+			} else if (e.clientX < 5 || e.clientX > screenWidth - 5 || e.clientY < 5) {
+				//屏幕左右边缘5像素及菜单顶部5像素不处理点击
+			} else { //点击了图标按钮
+				var iClickIndex = -1 //点击的图标按钮序号,第一个图标按钮的index为0
+				var iRow = e.clientY < (top2 - (left1 / 2)) ? 0 : 1
+				var iCol = -1
+				if (e.clientX < (left2 - (iconSpace / 2))) {
+					iCol = 0
+				} else if (e.clientX < (left3 - (iconSpace / 2))) {
+					iCol = 1
+				} else if (e.clientX < (left4 - (iconSpace / 2))) {
+					iCol = 2
+				} else {
+					iCol = 3
+				}
+				if (iRow == 0) {
+					iClickIndex = iCol
+				} else {
+					iClickIndex = iCol + 4
+				}
+				// console.log("点击按钮的序号: " + iClickIndex);
+				// if (iClickIndex >= 0 && iClickIndex <= 5) { //处理具体的点击逻辑,此处也可以自行定义逻辑。如果增减了按钮,此处也需要跟着修改
+				// }
+				callback(iClickIndex)
+				this.hide()
+			}
+		})
+		/* nvImageMenu.addEventListener("touchstart", function(e) {
+			if (e.screenY > (plus.screen.resolutionHeight - 44)) {
+				//TODO 这里可以处理按下背景变灰的效果
+			}
+		})
+		nvImageMenu.addEventListener("touchmove", function(e) {
+			//TODO 这里可以处理按下背景变灰的效果
+			if (e.screenY > plus.screen.resolutionHeight - 44) {}
+		})
+		nvImageMenu.addEventListener("touchend", function(e) {
+			//TODO 这里可以处理释放背景恢复的效果
+		})
+		*/
+	},
+	hide(){
+		nvMask.hide()
+		nvImageMenu.hide()
+	}
+}

+ 171 - 0
components/modal-mask/js_sdk/uni-image-menu.js

@@ -0,0 +1,171 @@
+var nvMask,nvImageMenu;
+export default {
+	show({list,cancelText},callback){
+		if(!list){
+			list = [{
+				"img":"https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/9a952c80-6080-11eb-a16f-5b3e54966275.png",
+				"text":"图标文字"
+			}]
+		}
+		if(list.length>8){
+			return uni.showToast({
+				title: '目前版本最多支持8个图标',
+				icon: 'none'
+			});
+		}
+		//以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心
+		var screenWidth = plus.screen.resolutionWidth
+		//以360px宽度屏幕为例,上下左右边距及2排按钮边距留25像素,图标宽度55像素,同行图标间的间距在360宽的屏幕是30px,但需要动态计算,以此原则计算4列图标分别的left位置
+		//图标下的按钮文字距离图标5像素,文字大小12像素
+		//底部取消按钮高度固定为44px
+		//TODO 未处理横屏和pad,这些情况6个图标应该一排即可
+		var margin = 20,
+			iconWidth = 60,
+			icontextSpace = 5,
+			textHeight = 12
+		var left1 = margin / 360 * screenWidth
+		var iconSpace = (screenWidth - (left1 * 2) - (iconWidth * 4)) / 3 //屏幕宽度减去左右留白间距,再减去4个图标的宽度,就是3个同行图标的间距
+		if (iconSpace <= 5) { //屏幕过窄时,缩小边距和图标大小,再算一次
+			margin = 15
+			iconWidth = 40
+			left1 = margin / 360 * screenWidth
+			iconSpace = (screenWidth - (left1 * 2) - (iconWidth * 4)) / 3 //屏幕宽度减去左右留白间距,再减去4个图标的宽度,就是3个同行图标的间距
+		}
+		var left2 = left1 + iconWidth + iconSpace
+		var left3 = left1 + (iconWidth + iconSpace) * 2
+		var left4 = left1 + (iconWidth + iconSpace) * 3
+		var top1 = left1
+		var top2 = top1 + iconWidth + icontextSpace + textHeight + left1
+		nvMask = new plus.nativeObj.View("nvMask", { //先创建遮罩层
+			top: '0px',
+			left: '0px',
+			height: '100%',
+			width: '100%',
+			backgroundColor: 'rgba(0,0,0,0.2)'
+		});
+		nvMask.addEventListener("click", function() { //处理遮罩层点击
+			nvMask.hide();
+			nvImageMenu.hide();
+		})
+		nvImageMenu = new plus.nativeObj.View("nvImageMenu", { //创建底部图标菜单
+			bottom: '0px',
+			left: '0px',
+			height: (iconWidth + textHeight + 2 * margin)*Math.ceil(list.length/4) +44+'px',//'264px',
+			width: '100%',
+			backgroundColor: 'rgb(255,255,255)'
+		});
+		
+		let myList = []
+		list.forEach((item,i)=>{
+			myList.push({
+				tag: 'img',
+				src: item.img,
+				position: {
+					top: eval('top'+( parseInt(i/4) +1)),
+					left: eval('left'+(1+i%4)),
+					width: iconWidth,
+					height: iconWidth
+				}
+			})
+			myList.push({
+				tag: 'font',
+				text: item.text,
+				textStyles: {
+					size: textHeight
+				},
+				position: {
+					top: eval('top'+(parseInt(i/4)+1)) + iconWidth + icontextSpace,
+					left: eval('left'+(1+i%4)),
+					width: iconWidth,
+					height: textHeight
+				}
+			})
+		})
+		
+		//绘制底部图标菜单的内容
+		nvImageMenu.draw([
+			{
+				tag: 'rect',//菜单顶部的分割灰线
+				color: '#e7e7e7',
+				position: {
+					top: '0px',
+					height: '1px'
+				}
+			},
+			{
+				tag: 'font',
+				text: cancelText,//底部取消按钮的文字
+				textStyles: {
+					size: '14px'
+				},
+				position: {
+					bottom: '0px',
+					height: '44px'
+				}
+			},
+			{
+				tag: 'rect',//底部取消按钮的顶部边线
+				color: '#e7e7e7',
+				position: {
+					bottom: '45px',
+					height: '1px'
+				}
+			},
+			...myList
+		])
+		nvMask.show()
+		nvImageMenu.show() //5+应支持从底部向上弹出的动画
+		
+		
+		
+		nvImageMenu.addEventListener("click",e=>{ //处理底部图标菜单的点击事件,根据点击位置触发不同的逻辑
+			// console.log("click menu"+JSON.stringify(e));
+			if (e.screenY > plus.screen.resolutionHeight - 44) { //点击了底部取消按钮
+				nvMask.hide();
+				nvImageMenu.hide();
+			} else if (e.clientX < 5 || e.clientX > screenWidth - 5 || e.clientY < 5) {
+				//屏幕左右边缘5像素及菜单顶部5像素不处理点击
+			} else { //点击了图标按钮
+				var iClickIndex = -1 //点击的图标按钮序号,第一个图标按钮的index为0
+				var iRow = e.clientY < (top2 - (left1 / 2)) ? 0 : 1
+				var iCol = -1
+				if (e.clientX < (left2 - (iconSpace / 2))) {
+					iCol = 0
+				} else if (e.clientX < (left3 - (iconSpace / 2))) {
+					iCol = 1
+				} else if (e.clientX < (left4 - (iconSpace / 2))) {
+					iCol = 2
+				} else {
+					iCol = 3
+				}
+				if (iRow == 0) {
+					iClickIndex = iCol
+				} else {
+					iClickIndex = iCol + 4
+				}
+				// console.log("点击按钮的序号: " + iClickIndex);
+				// if (iClickIndex >= 0 && iClickIndex <= 5) { //处理具体的点击逻辑,此处也可以自行定义逻辑。如果增减了按钮,此处也需要跟着修改
+				// }
+				callback(iClickIndex)
+				this.hide()
+			}
+		})
+		/* nvImageMenu.addEventListener("touchstart", function(e) {
+			if (e.screenY > (plus.screen.resolutionHeight - 44)) {
+				//TODO 这里可以处理按下背景变灰的效果
+			}
+		})
+		nvImageMenu.addEventListener("touchmove", function(e) {
+			//TODO 这里可以处理按下背景变灰的效果
+			if (e.screenY > plus.screen.resolutionHeight - 44) {}
+		})
+		nvImageMenu.addEventListener("touchend", function(e) {
+			//TODO 这里可以处理释放背景恢复的效果
+		})
+		*/
+	},
+	hide(){
+		nvMask.hide()
+		nvImageMenu.hide()
+	}
+}

+ 182 - 0
components/modal-mask/modal-mask-nvue.nvue

@@ -0,0 +1,182 @@
+<template>
+    <view class="app-modal" ref="appModal">
+        <view class="app-modal__container">
+            <view class="app-modal__container__header" v-if="title">
+				<text class="app-modal__container__header__text">{{title}}</text>
+			</view>
+            <view class="app-modal__container__content">
+				<text class="app-modal__container__content__text" :style="{textAlign: align}">{{content}}</text>
+            </view>
+            <view class="app-modal__container__footer">
+                <view v-if="showCancel" style="width: 315rpx" class="app-modal__container__footer-left" hover-class="app-modal__container__footer-hover" :hover-start-time="20" :hover-stay-time="70" @click="clickLeft" >
+                    <text class="app-modal__container__footer-left__text" :style="{color:cancelColor}">{{cancelText}}</text>
+                </view>
+                <view :style="{width: showCancel?'315rpx':'630rpx'}" class="app-modal__container__footer-right" hover-class="app-modal__container__footer-hover" :hover-start-time="20" :hover-stay-time="70" @click="clickRight"  >
+                    <text class="app-modal__container__footer-right__text" :style="{color:confirmColor}">{{confirmText}}</text>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+	const animation = weex.requireModule('animation');
+	export default {
+		data() {
+			return {
+				title: "提示",
+				content: "", 
+				align: "center", // 对齐方式 left/center/right
+				cancelText: "取消", // 取消按钮的文字
+				cancelColor: "#8F8F8F", // 取消按钮颜色
+				confirmText: "确定", // 确认按钮颜色
+				confirmColor: "#FFAD15", // 确认按钮颜色 
+				showCancel: true, // 是否显示取消按钮,默认为 true
+			};
+		},
+		onBackPress(options) {
+			if (options.from === 'navigateBack') {
+				return false;  
+			}  
+			return true;  
+		},
+		onReady() {
+			// 添加动画,避免弹窗闪烁问题
+			animation.transition(this.$refs.appModal, {
+				styles: {
+					opacity: 1,
+				},
+				duration: 100,
+				timingFunction: 'ease-in'
+			});
+		},
+		onLoad(options) {
+			if (options.showCancel) {
+				options.showCancel = JSON.parse(options.showCancel)
+			}
+			Object.assign(this.$data, options)
+		},
+		methods: {
+			clickLeft() {
+				// 先关闭后发送事件
+				this.closeModal();
+				uni.$emit('AppModalCancel')
+			},
+			clickRight() {
+				// 先关闭后发送事件
+				this.closeModal();
+				uni.$emit('AppModalConfirm')
+			},
+			closeModal() {
+				uni.navigateBack();
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	// nvue页面只支持flex布局
+	.app-modal {
+		position: fixed;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		background-color: rgba(0, 0, 0, 0.4);
+		opacity: 0;
+		
+		&__container {
+			width: 630rpx;
+			border-radius: 24rpx;
+			background-color: #fff;
+			overflow: hidden;
+			
+			&__header {
+				/* #ifndef APP-NVUE */
+				display: flex;
+				/* #endif */
+				justify-content: center;
+				align-items: center;
+				height: 90rpx;
+				&__text {
+					font-size: 32rpx;  
+					color: #262626;
+				}
+			}
+			
+			&__content {
+				/* #ifndef APP-NVUE */
+				display: flex;
+				/* #endif */
+				justify-content: center;
+				align-items: center;
+				
+				padding: 0 30rpx 30rpx 30rpx;
+				&__text {
+					font-size: 30rpx;
+					color: #262626;
+					line-height: 50rpx;
+				}
+			}
+			
+			&__footer {
+				/* #ifndef APP-NVUE */
+				display: flex;
+				/* #endif */
+				justify-content: center;
+				align-items: center;
+				flex-direction: row;
+				height: 88rpx;
+				
+				&-left {
+					/* #ifndef APP-NVUE */
+					display: flex;
+					/* #endif */
+					justify-content: center;
+					align-items: center;
+					
+					border-top-width: 1rpx;
+					border-right-width: 1rpx;
+					border-color: #E6E6E6;
+					border-style: solid;
+					border-bottom-left-radius: 24rpx;
+					padding: 22rpx;
+					
+					&__text{
+						font-size: 34rpx;
+					}
+				}
+				
+				&-right {
+					/* #ifndef APP-NVUE */
+					display: flex;
+					/* #endif */
+					justify-content: center;
+					align-items: center;
+					
+					border-top-width: 1rpx;
+					border-right-width: 1rpx;
+					border-color: #E6E6E6;
+					border-style: solid;
+					border-bottom-right-radius: 24rpx;
+					padding: 22rpx;
+					
+					&__text{
+						font-size: 34rpx;
+					}
+				}
+				
+				&-hover {
+				    background-color: #f1f1f1;
+				}
+				
+			}
+		}
+		
+	}
+</style>

+ 104 - 0
components/modal-mask/modal-mask.vue

@@ -0,0 +1,104 @@
+<template>
+	<view>
+		<button type="default" @click="showImageMenu">显示底部图标菜单</button>
+		<view style="height: 100rpx;"></view>
+		<button type="primary" @click="confirm({showCancel:true})">confirm提示</button>
+		<view style="height: 100rpx;"></view>
+		<button type="warn" @click="alert({showCancel:false})">alert提示</button>
+	</view>
+</template>
+
+<script>
+	import uniImageMenu from './js_sdk/bind-tip.js';
+	export default {
+		methods: {
+			showImageMenu() {
+				uniImageMenu.show({
+					list: [{
+							"img": "https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/9a952c80-6080-11eb-a16f-5b3e54966275.png",
+							"text": "uni-app"
+						},
+						{
+							"img": "https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/9a952c80-6080-11eb-a16f-5b3e54966275.png",
+							"text": "uni-app"
+						},
+						{
+							"img": "https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/d84c6de0-6080-11eb-bdc1-8bd33eb6adaa.png",
+							"text": "unicloud"
+						},
+						{
+							"img": "https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/9a952c80-6080-11eb-a16f-5b3e54966275.png",
+							"text": "uni-app"
+						}
+					],
+					cancelText: "取消"
+				}, index => {
+					uni.showToast({
+						title: '你点了第' + (index + 1) + '个图标',
+						icon: 'none'
+					});
+				})
+			},
+
+			async alert(options) {
+				await this.showModal(options);
+				uni.showToast({
+					title: "你点击了确定按钮",
+					position: "bottom"
+				})
+			},
+			async confirm(options) {
+				try {
+					await this.showModal(options);
+					uni.showToast({
+						title: "你点击了确定按钮",
+						position: "bottom"
+					})
+				} catch (e) {
+					uni.showToast({
+						title: "你点击了取消按钮",
+						position: "bottom"
+					})
+				}
+			},
+			showModal(options) {
+				let params = {
+					title: "提示",
+					content: "自定义内容",
+					align: "center", // 对齐方式 left/center/right
+					cancelText: "取消", // 取消按钮的文字
+					cancelColor: "#8F8F8F", // 取消按钮颜色
+					confirmText: "确定", // 确认按钮颜色
+					confirmColor: "#FFAD15", // 确认按钮颜色 
+					showCancel: true, // 是否显示取消按钮,默认为 true
+				}
+
+				Object.assign(params, options)
+
+				let list = []
+				Object.keys(params).forEach(ele => {
+					list.push(ele + "=" + params[ele])
+				})
+				let paramsStr = list.join('&')
+				
+				console.log(1);
+				
+				uni.navigateTo({
+					url: "/components/modal-mask/modal-mask-nvue?" + paramsStr
+				})
+
+				return new Promise((resolve, reject) => {
+					uni.$once("AppModalCancel", () => {
+						reject()
+					})
+					uni.$once("AppModalConfirm", () => {
+						resolve()
+					})
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 42 - 30
components/modal/action-jump/action-jump.vue

@@ -1,7 +1,7 @@
 <template>
 	<view style="width: 750rpx;">
 
-		<view class="flex justify-center" style="height: 75px; margin-top: 46rpx;">
+		<view class="flex justify-center" style="margin-top: 32rpx;">
 			<!-- 计时器 -->
 			<!-- <view class="action-jump-timer flex justify-center">
 				<boxingCountDown ref="boxingCountDownRef" :show-day="false" :second="showTime" color="#FFFFFF"
@@ -30,10 +30,10 @@
 					</view>
 				</view>
 			</view>
-
-			<view class="flex justify-center align-center"
+			<!-- 居中绘制星星样式 -->
+			<!-- <view class="flex justify-center align-center"
 				style="height: 52rpx; width: 412rpx; background-color: rgba(255,255,255,0.11); border-radius: 12rpx;">
-				<!-- 居中绘制星星样式 -->
+		
 				<view class="text-14px text-white">
 					拉伸运动:
 				</view>
@@ -41,9 +41,13 @@
 					<image style="width: 34rpx;height: 32rpx;" src="../../../static/modal/action-jump/stars.png">
 					</image>
 				</view>
+			</view> -->
+			<view class="flex justify-center align-center" style="height: 100rpx; width: 444rpx; ">
+				<view class="text-12px text-white text-center">
+					本关卡是为了让用户开始放松,需要在两分钟内跳100下
+				</view>
 			</view>
 
-
 		</view>
 
 		<!-- 	<view class="action-jump-parent margin-bottom">
@@ -90,18 +94,16 @@
 			</view>
 		</view>
 
-		<view style="height: 41px;"></view>
+		<!-- <view style="height: 41px;"></view> -->
 
 		<!-- 测试按钮 -->
-		<view style="display: flex;justify-content: space-between;">
-			<!-- <button @click="startJumpGame">startGame</button> -->
-			<!-- <button @click="onClear">onClear</button> -->
+		<!-- <view style="display: flex;justify-content: space-between;">
 			<view>{{isY?'Y':'X'}}</view>
 			<button @click="onChangeY">Y为旋转轴</button>
 			<button @click="onChangeX">X为旋转轴</button>
 		</view>
 
-		<!-- <view style="display: flex;justify-content: space-between;" class="margin-top margin-bottom">
+		<view style="display: flex;justify-content: space-between;" class="margin-top margin-bottom">
 			<button @click="onJumpType(0)">jump</button>
 			<button @click="onJumpType(1)">left</button>
 			<button @click="onJumpType(2)">right</button>
@@ -109,11 +111,11 @@
 			<button @click="onJumpType(4)">rRight</button>
 		</view> -->
 
-		<view style="display: flex;justify-content: space-around;">
+		<!-- <view style="display: flex;justify-content: space-around; padding-bottom: 100rpx;">
 			<view style="font-size: 14px;">t:{{countdown}}</view>
 			<view style="font-size: 14px;">e:{{eliminationCount}}</view>
 			<view style="font-size: 14px;">f:{{faultCount}}</view>
-		</view>
+		</view> -->
 
 	</view>
 
@@ -289,7 +291,6 @@
 					src: "../../../static/modal/action-jump/midJump.png",
 					success: function(image) {
 						_self.midJump = image;
-						console.log("==============", image);
 					}
 				});
 				uni.getImageInfo({
@@ -309,7 +310,6 @@
 					src: "../../../static/modal/action-jump/midJumpWhite.png",
 					success: function(image) {
 						_self.midJumpWhite = image;
-						console.log("==============", image);
 					}
 				});
 				uni.getImageInfo({
@@ -330,8 +330,6 @@
 					src: "../../../static/modal/action-jump/jumpNormal.png",
 					success: function(image) {
 						_self.jumpNormalImage = image;
-
-						console.log('-------------------》宽度:', _self.canvasW);
 						_self.onDrawBg();
 					}
 				});
@@ -414,17 +412,17 @@
 				this.level++;
 
 				//倒计时
-				// this.countdownInterval = setInterval(() => {
-				// 	if (this.countdown <= 0) {
-				// 		clearInterval(this.countdownInterval);
-				// 		this.countdownInterval = null;
-				// 		//处理下一个关卡
-				// 		// console.warn('时间到,处理下一个关卡');
-				// 		this.startJumpGame();
-				// 		return;
-				// 	}
-				// 	this.setCountdown(1);
-				// }, 1000);
+				this.countdownInterval = setInterval(() => {
+					if (this.countdown <= 0) {
+						clearInterval(this.countdownInterval);
+						this.countdownInterval = null;
+						//处理下一个关卡
+						// console.warn('时间到,处理下一个关卡');
+						this.startJumpGame();
+						return;
+					}
+					this.setCountdown(1);
+				}, 1000);
 
 				this.onDraw();
 			},
@@ -655,19 +653,33 @@
 			setCountdown(value) {
 				this.countdown -= value;
 				// this.countdownLabel.string = '倒计时:' + this.countdown;
+				this.$emit('actionJumpCountDownUpdate', {
+					countDown: this.countdown
+				});
 			},
 			resetCountdown(value) {
 				this.countdown = value;
 				// this.countdownLabel.string = '倒计时:' + this.countdown;
+				this.$emit('actionJumpCountDownUpdate', {
+					countDown: this.countdown
+				});
 			},
 			//设置ui信息
 			setEliminationCount(value) {
 				this.eliminationCount += value;
 				// this.eliminationLabel.string = '消除数量:' + this.eliminationCount.toString();
+				this.$emit('actionJumpDataUpdate', {
+					eliminationCount: this.eliminationCount,
+					faultCount: this.faultCount
+				});
 			},
 			setFaultCount(value) {
 				this.faultCount += value;
 				// this.faultLabel.string = '失误:' + this.faultCount;
+				this.$emit('actionJumpDataUpdate', {
+					eliminationCount: this.eliminationCount,
+					faultCount: this.faultCount
+				});
 			},
 			//控制播放
 			onControllerPlay() {
@@ -677,7 +689,7 @@
 					this.onClear();
 					this.onClearData();
 					this._changePlay();
-					
+
 					this.$emit("actionJumpControllerPlay", false);
 				} else {
 
@@ -692,8 +704,8 @@
 					this.bJumpPlay = !this.bJumpPlay;
 				}
 			},
-			
-			onActionJumpPlay(){
+
+			onActionJumpPlay() {
 				this.onClear();
 				this.onClearData();
 				this.startJumpGame();

+ 230 - 0
components/round-fab-custom/fab-custom.nvue

@@ -0,0 +1,230 @@
+<template>
+	<view >
+		<!-- <view class="uni-padding-wrap">
+			<view class="word-btn" hover-class="word-btn--hover" :hover-start-time="20" :hover-stay-time="70" @click="switchBtn(0)"><text class="word-btn-white">切换菜单({{ directionStr }}显示)</text></view>
+			<view class="word-btn" hover-class="word-btn--hover" :hover-start-time="20" :hover-stay-time="70" @click="switchBtn('left', 'bottom')"><text class="word-btn-white">左下角显示</text></view>
+			<view class="word-btn" hover-class="word-btn--hover" :hover-start-time="20" :hover-stay-time="70" @click="switchBtn('right', 'bottom')"><text class="word-btn-white">右下角显示</text></view>
+			<view class="word-btn" hover-class="word-btn--hover" :hover-start-time="20" :hover-stay-time="70" @click="switchBtn('left', 'top')"><text class="word-btn-white">左上角显示</text></view>
+			<view class="word-btn" hover-class="word-btn--hover" :hover-start-time="20" :hover-stay-time="70" @click="switchBtn('right', 'top')"><text class="word-btn-white">右上角显示</text></view>
+		</view> -->
+		<uni-fab ref="fab" :pattern="pattern" :content="content" :horizontal="horizontal" :vertical="vertical" :direction="direction" @trigger="trigger" @fabClick="fabClick" />
+	</view>
+</template>
+
+<script>
+	import uniFab from '@/components/round-fab/round-fab.vue'
+	export default {
+		components: {
+			uniFab
+		},
+		data() {
+			return {
+				title: 'uni-fab',
+				directionStr: '垂直',
+				horizontal: 'right',
+				vertical: 'bottom',
+				direction: 'horizontal',
+				pattern: {
+					color: '#7A7E83',
+					backgroundColor: 'rgba(0,0,0,0)',
+					selectedColor: '#007AFF',
+					// buttonColor: '#007AFF'
+				}
+				,
+				content: [{
+						iconPath: '/static/component.png',
+						selectedIconPath: '/static/componentHL.png',
+						text: '组件',
+						active: false
+					},
+					{
+						iconPath: '/static/api.png',
+						selectedIconPath: '/static/apiHL.png',
+						text: 'API',
+						active: false
+					},
+					{
+						iconPath: '/static/template.png',
+						selectedIconPath: '/static/templateHL.png',
+						text: '模版',
+						active: false
+					}
+				]
+			}
+		},
+		onBackPress() {
+			if (this.$refs.fab.isShow) {
+				this.$refs.fab.close()
+				return true
+			}
+			return false
+		},
+		methods: {
+			trigger(e) {
+				console.log(e)
+				this.content[e.index].active = !e.item.active
+				uni.showModal({
+					title: '提示',
+					content: `您${this.content[e.index].active ? '选中了' : '取消了'}${e.item.text}`,
+					success: function(res) {
+						if (res.confirm) {
+							console.log('用户点击确定')
+						} else if (res.cancel) {
+							console.log('用户点击取消')
+						}
+					}
+				})
+			},
+			fabClick() {
+				console.log('fabClick');
+				uni.showToast({
+					title: '点击了悬浮按钮',
+					icon: 'none'
+				})
+			},
+			switchBtn(hor, ver) {
+				if (hor === 0) {
+					this.direction = this.direction === 'horizontal' ? 'vertical' : 'horizontal'
+					this.directionStr = this.direction === 'horizontal' ? '垂直' : '水平'
+				} else {
+					this.horizontal = hor
+					this.vertical = ver
+				}
+				this.$forceUpdate()
+			}
+		}
+	}
+</script>
+
+<style>
+	/* 头条小程序组件内不能引入字体 */
+	/* #ifdef MP-TOUTIAO */
+	@font-face {
+		font-family: uniicons;
+		font-weight: normal;
+		font-style: normal;
+		src: url('~@/static/uni.ttf') format('truetype');
+	}
+
+	/* #endif */
+
+	/* #ifndef APP-NVUE */
+	page {
+		display: flex;
+		flex-direction: column;
+		box-sizing: border-box;
+		background-color: #efeff4;
+		min-height: 100%;
+		height: auto;
+	}
+
+	view {
+		font-size: 14px;
+		line-height: inherit;
+	}
+
+	.example {
+		padding: 0 15px 15px;
+	}
+
+	.example-info {
+		padding: 15px;
+		color: #3b4144;
+		background: #ffffff;
+	}
+
+	.example-body {
+		flex-direction: row;
+		flex-wrap: wrap;
+		justify-content: center;
+		padding: 0;
+		font-size: 14px;
+		background-color: #ffffff;
+	}
+
+	/* #endif */
+	.example {
+		padding: 0 15px;
+	}
+
+	.example-info {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		padding: 15px;
+		color: #3b4144;
+		background-color: #ffffff;
+		font-size: 14px;
+		line-height: 20px;
+	}
+
+	.example-info-text {
+		font-size: 14px;
+		line-height: 20px;
+		color: #3b4144;
+	}
+
+
+	.example-body {
+		flex-direction: column;
+		padding: 15px;
+		background-color: #ffffff;
+	}
+
+	.word-btn-white {
+		font-size: 18px;
+		color: #FFFFFF;
+	}
+
+	.word-btn {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		border-radius: 6px;
+		height: 48px;
+		margin: 15px;
+		background-color: #007AFF;
+	}
+
+	.word-btn--hover {
+		background-color: #4ca2ff;
+	}
+
+
+
+	/* #ifndef APP-NVUE */
+	page {
+		height: 100vh;
+	}
+
+	/* #endif */
+
+	.uni-fab-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		position: absolute;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		right: 0;
+	}
+
+	.uni-padding-wrap {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.word-btn {
+		width: 250px;
+	}
+</style>

+ 126 - 56
components/round-fab/round-fab.vue

@@ -1,12 +1,11 @@
 <template>
 	<view>
-		<view v-if="leftBottom||rightBottom||leftTop||rightTop" :class="{
+		<view v-if="popMenu && (leftBottom||rightBottom||leftTop||rightTop)" :class="{
         'uni-fab--leftBottom': leftBottom,
         'uni-fab--rightBottom': rightBottom,
         'uni-fab--leftTop': leftTop,
         'uni-fab--rightTop': rightTop
-      }"
-		 class="uni-fab">
+      }" class="uni-fab">
 			<view :class="{
           'uni-fab__content--left': horizontal === 'left',
           'uni-fab__content--right': horizontal === 'right',
@@ -14,28 +13,32 @@
           'uni-fab__content--flexDirectionStart': flexDirectionStart,
           'uni-fab__content--flexDirectionEnd': flexDirectionEnd,
 		  'uni-fab__content--other-platform': !isAndroidNvue
-        }"
-			 :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }" class="uni-fab__content">
+        }" :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }"
+				class="uni-fab__content" elevation="5">
 				<view v-if="flexDirectionStart || horizontalLeft" class="uni-fab__item uni-fab__item--first" />
-				<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }" class="uni-fab__item"
-				 @click="_onItemClick(index, item)">
-					<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image" mode="widthFix" />
-					<text class="uni-fab__item-text" :style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
+				<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }"
+					class="uni-fab__item" @click="_onItemClick(index, item)">
+					<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image"
+						mode="widthFix" />
+					<text class="uni-fab__item-text"
+						:style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
 				</view>
 				<view v-if="flexDirectionEnd || horizontalRight" class="uni-fab__item uni-fab__item--first" />
 			</view>
-			<view :class="{
-          'uni-fab__circle--left': horizontal === 'left' && direction === 'horizontal',
-          'uni-fab__circle--top': vertical === 'top' && direction === 'vertical',
-          'uni-fab__circle--bottom': vertical === 'bottom' && direction === 'vertical',
-          'uni-fab__circle--right': horizontal === 'right' && direction === 'horizontal',
-		  'uni-fab__plus--active': isShow,
+		</view>
+		<view :class="{
+		  'uni-fab__circle--leftBottom': leftBottom,
+		  'uni-fab__circle--rightBottom': rightBottom,
+		  'uni-fab__circle--leftTop': leftTop,
+		  'uni-fab__circle--rightTop': rightTop,
 		  'uni-fab__content--other-platform': !isAndroidNvue
-        }"
-			 class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor }" @click="_onClick">
-				<view class="fab-circle-v"></view>
-				<view class="fab-circle-h"></view>
-			</view>
+		}" class="uni-fab__circle " @click="_onClick">
+			<!-- 父节点 uni-fab__plus   :style="{ 'background-color': styles.buttonColor }"-->
+			<!-- <view class="fab-circle-v" :class="{'uni-fab__plus--active': isShow}"></view>
+			<view class="fab-circle-h" :class="{'uni-fab__plus--active': isShow}"></view> -->
+			<image v-if="isConnect" style="width: 100%;height: 100%;" src="../../static/personal/connecting.png">
+			</image>
+			<image v-else style="width: 100%;height: 100%;" src="../../static/personal/disconnect.png"></image>
 		</view>
 	</view>
 </template>
@@ -45,6 +48,26 @@
 	// #ifdef APP-NVUE
 	platform = uni.getSystemInfoSync().platform
 	// #endif
+
+	/**
+	 * Fab 悬浮按钮
+	 * @description 点击可展开一个图形按钮菜单
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=144
+	 * @property {Object} pattern 可选样式配置项
+	 * @property {Object} horizontal = [left | right] 水平对齐方式
+	 * 	@value left 左对齐
+	 * 	@value right 右对齐
+	 * @property {Object} vertical = [bottom | top] 垂直对齐方式
+	 * 	@value bottom 下对齐
+	 * 	@value top 上对齐
+	 * @property {Object} direction = [horizontal | vertical] 展开菜单显示方式
+	 * 	@value horizontal 水平显示
+	 * 	@value vertical 垂直显示
+	 * @property {Array} content 展开菜单内容配置项
+	 * @property {Boolean} popMenu 是否使用弹出菜单
+	 * @event {Function} trigger 展开菜单点击事件,返回点击信息
+	 * @event {Function} fabClick 悬浮按钮点击事件
+	 */
 	export default {
 		name: 'UniFab',
 		props: {
@@ -56,7 +79,7 @@
 			},
 			horizontal: {
 				type: String,
-				default: 'left'
+				default: 'right'
 			},
 			vertical: {
 				type: String,
@@ -75,7 +98,15 @@
 			show: {
 				type: Boolean,
 				default: false
-			}
+			},
+			popMenu: {
+				type: Boolean,
+				default: true
+			},
+			connect: {
+				type: Boolean,
+				default: false
+			},
 		},
 		data() {
 			return {
@@ -85,9 +116,10 @@
 				styles: {
 					color: '#3c3e49',
 					selectedColor: '#007AFF',
-					backgroundColor: '#fff',
+					backgroundColor: 'rgba(0,0,0,0)',
 					buttonColor: '#3c3e49'
-				}
+				},
+				isConnect: false
 			}
 		},
 		computed: {
@@ -137,6 +169,9 @@
 			pattern(newValue, oldValue) {
 				//console.log(JSON.stringify(newValue))
 				this.styles = Object.assign({}, this.styles, newValue)
+			},
+			connect(newValue){
+				this.isConnect = newValue;
 			}
 		},
 		created() {
@@ -149,7 +184,11 @@
 		},
 		methods: {
 			_onClick() {
-				this.isShow = !this.isShow
+				this.$emit('fabClick')
+				if (!this.popMenu) {
+					return
+				}
+				// this.isShow = !this.isShow
 			},
 			open() {
 				this.isShow = true
@@ -195,63 +234,92 @@
 		z-index: 10;
 	}
 
-	.uni-fab--top {
-		width: 30px;
-		height: 30px;
-		right: 15px;
-		bottom: 30px;
-		border-style: solid;
-		border-width: 1px;
-		border-color: #5989b9;
-		border-radius: 5px;
-		transition: opacity 0.3;
-		opacity: 0;
-	}
-
 	.uni-fab--active {
 		opacity: 1;
 	}
 
 	.uni-fab--leftBottom {
-		left: 15px;
-		bottom: 30px;
+		left: 5px;
+		bottom: 20px;
+		/* #ifdef H5 */
+		bottom: calc(20px + var(--window-bottom));
+		/* #endif */
+		padding: 10px;
 	}
 
 	.uni-fab--leftTop {
-		left: 15px;
-		top: 40px;
+		left: 5px;
+		top: 30px;
 		/* #ifdef H5 */
-		top: calc(40px + var(--window-top));
+		top: calc(30px + var(--window-top));
 		/* #endif */
+		padding: 10px;
 	}
 
 	.uni-fab--rightBottom {
-		right: 15px;
-		bottom: 30px;
+		right: 5px;
+		bottom: 20px;
+		/* #ifdef H5 */
+		bottom: calc(20px + var(--window-bottom));
+		/* #endif */
+		padding: 10px;
 	}
 
 	.uni-fab--rightTop {
-		right: 15px;
-		top: 40px;
+		right: 5px;
+		top: 30px;
 		/* #ifdef H5 */
-		top: calc(40px + var(--window-top));
+		top: calc(30px + var(--window-top));
 		/* #endif */
+		padding: 10px;
 	}
 
 	.uni-fab__circle {
+		position: fixed;
 		/* #ifndef APP-NVUE */
 		display: flex;
 		/* #endif */
 		justify-content: center;
 		align-items: center;
-		position: absolute;
 		width: 55px;
 		height: 55px;
-		background-color: #3c3e49;
+		/* background-color: #3c3e49; */
 		border-radius: 55px;
 		z-index: 11;
 	}
 
+	.uni-fab__circle--leftBottom {
+		left: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+	}
+
+	.uni-fab__circle--leftTop {
+		left: 15px;
+		top: 40px;
+		/* #ifdef H5 */
+		top: calc(40px + var(--window-top));
+		/* #endif */
+	}
+
+	.uni-fab__circle--rightBottom {
+		right: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+	}
+
+	.uni-fab__circle--rightTop {
+		right: 15px;
+		top: 40px;
+		/* #ifdef H5 */
+		top: calc(40px + var(--window-top));
+		/* #endif */
+	}
+
 	.uni-fab__circle--left {
 		left: 0;
 	}
@@ -269,15 +337,9 @@
 	}
 
 	.uni-fab__plus {
-		transform: rotate(0deg);
-		transition: transform 0.3s;
 		font-weight: bold;
 	}
 
-	.uni-fab__plus--active {
-		transform: rotate(135deg);
-	}
-
 	.fab-circle-v {
 		position: absolute;
 		width: 3px;
@@ -285,6 +347,8 @@
 		left: 26px;
 		top: 12px;
 		background-color: white;
+		transform: rotate(0deg);
+		transition: transform 0.3s;
 	}
 
 	.fab-circle-h {
@@ -294,6 +358,12 @@
 		left: 12px;
 		top: 26px;
 		background-color: white;
+		transform: rotate(0deg);
+		transition: transform 0.3s;
+	}
+
+	.uni-fab__plus--active {
+		transform: rotate(135deg);
 	}
 
 	.uni-fab__content {

+ 2 - 2
components/side-bar/side-bar.vue

@@ -1,8 +1,8 @@
 <template>
-	<!-- @touchmove.stop.prevent="moveHandle" -->
+	<!-- @touchmove.stop.prevent="moveHandle"  @touchmove="side.touchmove" @touchstart="side.touchstart" @touchend="side.touchend"-->
 	<view class="content">
 		<view class="side-left" :data-position="pos" :prop="pos" :change:prop="side.sizeReady"
-			@touchstart="side.touchstart" @touchmove="side.touchmove" @touchend="side.touchend" @change="change">
+			 @change="change">
 			<!-- 侧边栏 bshow-->
 			<view class="side-mask" v-if="bshow" @tap="closeSide"></view>
 			<view class="side-handle">

+ 62 - 55
components/side-bar/sideBar.js

@@ -4,60 +4,67 @@
 export default {
 	//侧边栏对应列表
 	getSideBarList: [{
-		id: 0,
-		type: 'image',
-		url: '/static/item-my.png',
-		name: "我的",
-		page_type: "my",
-	}, {
-		id: 1,
-		type: 'image',
-		url: '/static/recently-playing.png',
-		name: "最近在玩",
-		page_type: "recently",
-	}, {
-		id: 2,
-		type: 'image',
-		url: '/static/watch-game.png',
-		name: '关注',
-		page_type: "watchGame",
-	},
-	// {
-	// 	id: 3,
-	// 	type: 'image',
-	// 	url: '/static/focus-video.png',
-	// 	name: '关注视频',
-	// 	page_type: "focusVideo",
-	// }, 
-	{
-		id: 4,
-		type: 'image',
-		url: '/static/ranking.png',
-		name: '排行榜',
-		page_type: "ranking",
-	}
-	 ,
-	 
-	 {
-	 	id: 7,
-	 	type: 'image',
-	 	url: '/static/friend.png',
-	 	name: '好友',
-	 	page_type: "friend",
-	 },
-	// {
-	// 	id: 5,
-	// 	type: 'image',
-	// 	url: '/static/qrscan.png',
-	// 	name: '扫一扫',
-	// 	page_type: "QRCode",
-	// },
-	{
-		id: 6,
-		type: 'image',
-		url: '/static/feedback@2x.png',
-		name: '意见反馈',
-		page_type: "feedback",
-	}
+			id: 8,
+			type: 'image',
+			url: '/static/signBoard@2x.png',
+			name: '每日签到',
+			page_type: "signBoard",
+		},
+		// 	{
+		// 	id: 0,
+		// 	type: 'image',
+		// 	url: '/static/item-my.png',
+		// 	name: "我的",
+		// 	page_type: "my",
+		// }, 
+		{
+			id: 1,
+			type: 'image',
+			url: '/static/recently-playing.png',
+			name: "最近在玩",
+			page_type: "recently",
+		}, {
+			id: 2,
+			type: 'image',
+			url: '/static/watch-game.png',
+			name: '关注',
+			page_type: "watchGame",
+		},
+		// {
+		// 	id: 3,
+		// 	type: 'image',
+		// 	url: '/static/focus-video.png',
+		// 	name: '关注视频',
+		// 	page_type: "focusVideo",
+		// }, 
+		{
+			id: 4,
+			type: 'image',
+			url: '/static/ranking.png',
+			name: '排行榜',
+			page_type: "ranking",
+		},
+
+		{
+			id: 7,
+			type: 'image',
+			url: '/static/friend.png',
+			name: '好友',
+			page_type: "friend",
+		},
+		// {
+		// 	id: 5,
+		// 	type: 'image',
+		// 	url: '/static/qrscan.png',
+		// 	name: '扫一扫',
+		// 	page_type: "QRCode",
+		// },
+		{
+			id: 6,
+			type: 'image',
+			url: '/static/feedback@2x.png',
+			name: '意见反馈',
+			page_type: "feedback",
+		}
 	]
 }

+ 1 - 0
components/u-charts/u-charts.js

@@ -4085,6 +4085,7 @@ function drawMyGradualChangeArcbarDataPoints(series, opts, config, context) {
 			x: opts.width / 2,
 			y: opts.height / 2
 		};
+		// console.log("=====================",centerPosition);
 	}
 
 	var radius;

+ 11 - 6
components/uni-count-down/uni-count-down.vue

@@ -2,11 +2,11 @@
 	<view class="uni-countdown">
 		<text v-if="showDay" :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ d }}</text>
 		<text v-if="showDay" :style="{ color: splitorColor }" class="uni-countdown__splitor">天</text>
-		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ h }}</text>
+		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor, 'font-size': size+'px' }" class="uni-countdown__number">{{ h }}</text>
 		<text :style="{ color: splitorColor }" class="uni-countdown__splitor">{{ showColon ? ':' : '时' }}</text>
-		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ i }}</text>
+		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor, 'font-size': size+'px' }" class="uni-countdown__number">{{ i }}</text>
 		<text :style="{ color: splitorColor }" class="uni-countdown__splitor">{{ showColon ? ':' : '分' }}</text>
-		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ s }}</text>
+		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor, 'font-size': size+'px' }" class="uni-countdown__number">{{ s }}</text>
 		<text v-if="!showColon" :style="{ color: splitorColor }" class="uni-countdown__splitor">秒</text>
 	</view>
 </template>
@@ -14,6 +14,10 @@
 	export default {
 		name: 'UniCountDown',
 		props: {
+			size: {
+				type: Number,
+				value: '24'
+			},
 			showDay: {
 				type: Boolean,
 				default: true
@@ -186,6 +190,7 @@
 		line-height: 48rpx;
 		padding: 8rpx 0 0 0;
 		font-size: 24rpx;
+		/* border: 1rpx solid #000000; */
 	}
 
 	.uni-countdown__number {
@@ -194,10 +199,10 @@
 		/* #endif */
 		justify-content: center;
 		align-items: center;
-		width: 56rpx;
-		height: 56rpx;
+		width: 50rpx;
+		height: 50rpx;
 		line-height: 56rpx;
-		margin: 5rpx;
+		margin: 5rpx 0rpx;
 		text-align: center;
 		font-size: 23px;
 		font-family: UnidreamLED;

+ 214 - 127
pages.json

@@ -15,7 +15,7 @@
 		//         "navigationBarTitleText": "",
 		//         "enablePullDownRefresh": false
 		//     }
-		    
+
 		// },
 		// #ifdef APP-PLUS || H5
 		{
@@ -67,7 +67,7 @@
 		{
 			"path": "pages/game-page/game/game",
 			"style": {
-				"navigationBarTitleText": "游戏" 
+				"navigationBarTitleText": "游戏"
 			}
 		},
 
@@ -140,11 +140,11 @@
 						"type": "popup",
 						"style": {
 							"width": "100%",
-							"position":"absolute"
+							"position": "absolute"
 						}
 					}]
 				}
-				
+
 			}
 		},
 		// #endif
@@ -169,90 +169,178 @@
 			"style": {}
 		}
 
-	    ,{
-            "path" : "pages/login-page/userAgreement/userAgreement",
-            "style" : {}
-        }
-        ,{
-            "path" : "pages/personal-page/devices-category/devices-category",
-            "style" : {}
-        }
-        ,{
-            "path" : "pages/personal-page/devices-hardware/devices-hardware",
-            "style" : {}
-        }
-        ,{
-            "path" : "pages/fc-page/fc/fc",
-            "style" : {}
-        }
-        ,{
-            "path" : "pages/fc-page/fc-list/fc-list",
-            "style" : {}
-        }
-        ,{
-            "path" : "pages/personal-page/devices-update/devices-update",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
-            }
-            
-        }
-        ,{
-            "path" : "pages/info-page/app-info/app-info",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
-            }
-            
-        }
-        ,{
-            "path" : "pages/my-page/firstPlan/firstPlan",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
-            }
-            
-        }
-        ,{
-            "path" : "pages/login-page/feedback/feedback",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
-            }
-            
-        }
-        ,{
-            "path" : "pages/friend-page/search/search",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
-            }
-            
-        }
-        ,{
-            "path" : "pages/friend-page/main/main",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
-            }
-            
-        }
-        ,{
-            "path" : "pages/friend-page/select/select",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
-            }
-            
-        }
-    ],
+		, {
+			"path": "pages/login-page/userAgreement/userAgreement",
+			"style": {}
+		}, {
+			"path": "pages/personal-page/devices-category/devices-category",
+			"style": {}
+		}, {
+			"path": "pages/personal-page/devices-hardware/devices-hardware",
+			"style": {}
+		}, {
+			"path": "pages/fc-page/fc/fc",
+			"style": {}
+		}, {
+			"path": "pages/fc-page/fc-list/fc-list",
+			"style": {}
+		}, {
+			"path": "pages/personal-page/devices-update/devices-update",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/info-page/app-info/app-info",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/my-page/firstPlan/firstPlan",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/login-page/feedback/feedback",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/friend-page/search/search",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/friend-page/main/main",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/friend-page/select/select",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/game-page/game-list/game-list",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/game-page/game-video/game-video",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/my-page/achievement/achievement",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		},
+		{
+			"path": "components/modal-mask/modal-mask-nvue",
+			"style": {
+				"navigationStyle": "custom",
+				"app-plus": {
+					"animationType": "fade-in",
+					"background": "transparent",
+					"backgroundColor": "rgba(0,0,0,0)",
+					"popGesture": "none"
+				}
+			}
+		}
+	],
+	"subPackages": [{
+		"root": "pages/personal-page",
+		"pages": [
+			// #ifdef APP-PLUS
+			{
+				"path": "personal/personal",
+				"style": {
+					// "navigationBarTitleText": "原生子窗体",
+					"titleNView": false,
+					"app-plus": {
+						"subNVues": [{
+							"id": "personal-drawer",
+							"path": "../../platform/app-plus/subNVue/drawer",
+							"type": "popup",
+							"style": {
+								"width": "89%"
+							}
+						}, {
+							"id": "personal-popup",
+							"path": "../../platform/app-plus/subNVue/popup",
+							"type": "popup",
+							"style": {
+								"margin": "auto",
+								"width": "80%",
+								"height": "600rpx"
+							}
+						}]
+					}
+				}
+			}
+			// #endif
+		]
+	}, {
+		"root": "pages/game-page",
+		"pages": [
+			// #ifdef APP-PLUS
+			{
+				"path": "game-list/game-list",
+				"style": {
+					// "navigationBarTitleText": "原生子窗体",
+					"titleNView": false,
+					"app-plus": {
+						"subNVues": [{
+							"id": "game-list-drawer",
+							"path": "../../platform/app-plus/subNVue/drawer",
+							"type": "popup",
+							"style": {
+								"width": "89%"
+							}
+						}]
+					}
+				}
+			},
+			{
+				"path": "game-video/game-video",
+				"style": {
+					// "navigationBarTitleText": "原生子窗体",
+					"titleNView": false,
+					"app-plus": {
+						"subNVues": [{
+							"id": "game-video-drawer",
+							"path": "../../platform/app-plus/subNVue/drawer",
+							"type": "popup",
+							"style": {
+								"width": "89%"
+							}
+						}]
+					}
+				}
+			}
+			// #endif
+		]
+	}],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
 		"navigationBarTitleText": "uni-app",
@@ -268,44 +356,43 @@
 			"query": "" //启动参数,在页面的onLoad函数里面得到
 		}]
 	},
-	"tabBar":{
-	        "color":"#AAABAD",
-	        "selectedColor":"#9797FF",
-	        "backgroundColor":"#FFFFFF",
-	        "borderStyle":"#eee",
-			"height":"75px",
-			"spacing":"6px",
-	        "list":[
-	            {
-	                "pagePath":"pages/personal-page/personal/personal",
-	                "text":"首页",
-	                "iconPath":"./static/common/navigationBar/nHome.png",
-	                "selectedIconPath":"static/common/navigationBar/nHomeB.png"
-	            },
-	            {
-	                "pagePath":"pages/personal-page/plan/plan",
-	                "text":"计划",
-	                "iconPath":"static/common/navigationBar/nPlan.png",
-	                "selectedIconPath":"static/common/navigationBar/nPlanB.png"
-	            },{
-	                "pagePath":"pages/game-page/game/game",
-	                "text":"游戏",
-	                "iconPath":"static/common/navigationBar/nGame.png",
-	                "selectedIconPath":"static/common/navigationBar/nGameB.png"
-	            },
-				{
-				    "pagePath":"pages/game-page/game/game",
-				    "text":"视频",
-				    "iconPath":"static/common/navigationBar/nVideo.png",
-				    "selectedIconPath":"static/common/navigationBar/nVideoB.png"
-				},
-	            {
-	                "pagePath":"pages/my-page/homepage/homepage",
-	                "text":"我的",
-	                "iconPath":"static/common/navigationBar/nMy.png",
-	                "selectedIconPath":"static/common/navigationBar/nMyB.png"
-	            }
-	        ]
-	    }
+	"tabBar": {
+		"color": "#AAABAD",
+		"selectedColor": "#9797FF",
+		"backgroundColor": "#FFFFFF",
+		"borderStyle": "#eee",
+		"height": "75px",
+		"spacing": "6px",
+		"list": [{
+				"pagePath": "pages/personal-page/personal/personal",
+				"text": "首页",
+				"iconPath": "./static/common/navigationBar/nHome.png",
+				"selectedIconPath": "static/common/navigationBar/nHomeB.png"
+			},
+			{
+				"pagePath": "pages/personal-page/plan/plan",
+				"text": "计划",
+				"iconPath": "static/common/navigationBar/nPlan.png",
+				"selectedIconPath": "static/common/navigationBar/nPlanB.png"
+			}, {
+				"pagePath": "pages/game-page/game-list/game-list",
+				"text": "游戏",
+				"iconPath": "static/common/navigationBar/nGame.png",
+				"selectedIconPath": "static/common/navigationBar/nGameB.png"
+			},
+			{
+				"pagePath": "pages/game-page/game-video/game-video",
+				"text": "视频",
+				"iconPath": "static/common/navigationBar/nVideo.png",
+				"selectedIconPath": "static/common/navigationBar/nVideoB.png"
+			},
+			{
+				"pagePath": "pages/my-page/homepage/homepage",
+				"text": "我的",
+				"iconPath": "static/common/navigationBar/nMy.png",
+				"selectedIconPath": "static/common/navigationBar/nMyB.png"
+			}
+		]
+	}
 
 }

+ 3 - 1
pages/Loading-page/Loading/Loading.vue

@@ -61,6 +61,8 @@
 				_self.onNavTo("login");
 			}
 			
+			//预加载
+			uni.preloadPage({url: "/pages/personal-page/personal/personal"});
 		},
 		methods: {
 			...mapMutations(['accountLogin']),
@@ -73,7 +75,7 @@
 					})
 				} else if (navType == "personal") {
 					// uni.redirectTo({
-					uni.redirectTo({
+					uni.switchTab({
 						url: "../../personal-page/personal/personal"
 					})
 				} else {

+ 63 - 14
pages/friend-page/main/main.vue

@@ -1,7 +1,7 @@
 <template>
 	<view>
-		<uni-nav-bar id="nav-bar" status-bar="true" @clickLeft="onBack()" @clickRight="onNavSearchFriend()" title="我的好友" color="#000000" fixed="true"
-			:border="false">
+		<uni-nav-bar id="nav-bar" status-bar="true" @clickLeft="onBack()" @clickRight="onNavSearchFriend()" title="我的好友"
+			color="#000000" fixed="true" :border="false">
 			<view slot="left">
 				<view class=" flex align-center margin-left">
 					<image class="p-left-arrow" src="../../../static/p-left-arrow.png"></image>
@@ -16,31 +16,36 @@
 
 
 
-		<view class="cu-list menu-avatar margin-top">
-			<view class="cu-item card-view" style="height: 180rpx;" v-for="(item, index) in 10" :key="index">
+		<view class="cu-list menu-avatar ">
+			<view class="cu-item card-view" style="height: 180rpx;" v-for="(item, index) in friends" :key="index">
 				<view class="cu-avatar round lg"
-					style="background-image:url(https://ossweb-img.qq.com/images/lol/web201310/skin/big10001.jpg);">
-					<view class="cu-tag badge">99+</view>
+					:style="[{ backgroundImage:'url('+item.avatarUrl+')' }]">
+					<view class="cu-tag badge-bottom" >
+						<image v-if="item.gender == 0" style="height: 32rpx;width: 32rpx;" src="../../../static/friend/boy.png"></image>
+						<image v-if="item.gender == 1" style="height: 32rpx;width: 32rpx;" src="../../../static/friend/girl.png"></image>
+					</view>
 				</view>
 				<view class="content" style="width: 360rpx;">
-					<view class="text-grey">凯尔</view>
+					<view class="text-grey">{{item.username}}</view>
 					<view class="text-gray text-sm flex">
 						<view class="text-cut">
 							<text class="cuIcon-infofill text-red  margin-right-xs"></text>
-							我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。
+							{{item.signature}}
 						</view>
 
 					</view>
-					<view class="text-gray text-sm flex">
+					<!-- <view class="text-gray text-sm flex">
 						<view class="text-cut">
 							<text class="cuIcon-infofill text-red  margin-right-xs"></text>
 							我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。
 						</view>
 
-					</view>
+					</view> -->
 				</view>
 				<view class="action" style="width: 160rpx; ">
-					<button class="cu-btn round lines-gray text-13px" style=" line-height: 26rpx; white-space: nowrap; width: 146rpx; right: 30rpx;">
+					<button class="cu-btn round lines-gray text-13px"
+						style=" line-height: 26rpx; white-space: nowrap; width: 146rpx; right: 30rpx;"
+						@click="onDeleteInfo(item)">
 						取消关注</button>
 				</view>
 			</view>
@@ -50,22 +55,66 @@
 </template>
 
 <script>
+	import config from '../../../common/config.js';
+	import reqUtil from '../../../util/util-js/requstUtil.js';
+
 	export default {
 		data() {
 			return {
-
+				friends: null
 			}
 		},
+		onShow() {
+			reqUtil.requestData(config.URL.GETFRIENDLIST, {}).then(
+				res => {
+					// console.log(JSON.stringify(res));
+					this.friends = res.data.friends;
+
+				},
+				e => {
+					console.log(e);
+				}
+			);
+		},
 		methods: {
 			onBack() {
 				uni.navigateBack({
 					delta: 1
 				})
 			},
-			onNavSearchFriend(){
+			onNavSearchFriend() {
 				uni.navigateTo({
-					url:"../search/search"
+					url: "../search/search"
+				})
+			},
+			onDeleteInfo(item) {
+				uni.showToast({
+					title: '删除中..',
+					duration: 1000,
+					icon: 'loading',
+					mask: true
 				})
+				reqUtil.requestData(config.URL.DELETEFIRENDINFO, {
+					id: item.friendId
+				}).then(
+					res => {
+						console.log(JSON.stringify(res));
+						var index0 = this.friends.findIndex(e => {
+							if (item.friendId == e.friendId) {
+								return true
+							}
+						})
+						this.friends.splice(index0, 1);
+						uni.showToast({
+							title: '删除成功',
+							duration: 1000,
+							mask: true
+						})
+					},
+					e => {
+						console.log(e);
+					}
+				);
 			}
 		}
 	}

+ 100 - 16
pages/friend-page/search/search.vue

@@ -1,45 +1,72 @@
 <template>
 	<view>
-		<view class="cu-bar search bg-white">
+		<uni-nav-bar  id="nav-bar" status-bar="true" backgroundColor="#FFF"
+			@clickLeft="onBack()" @clickRight="onSearch()"  fixed="true" :border="false">
+			<view slot="left" >
+				<view class="flex align-center " style="margin-left: 20rpx;">
+					<image class="p-left-arrow" src="/static/p-left-arrow.png"></image>
+				</view>
+			</view>
+			<view slot='middle'  style=" margin-left: -65rpx; flex: 1.5;">
+				<view class="cu-bar ">
+					<view class="search-form round" style="margin: 0 10rpx;">
+						<text class="cuIcon-search"></text>
+						<input @input="onKeyInput" @focus="InputFocus" @blur="InputBlur" :adjust-position="false" type="text"
+							placeholder="输入名字,搜索好友" confirm-type="search"></input>
+					</view>
+				</view>
+				
+			</view>
+			<!-- @clickRight="onNavFcGame()" -->
+			<view slot="right" >
+				<view style="position: relative; border: 1rpx solid #FFFFFF;">
+				<view class="text-16px make-text-bPurple" style="line-height: 32rpx;">搜索</view>
+				</view>
+			</view>
+		</uni-nav-bar>
+	<!-- 	<view class="cu-bar search bg-white">
 			<view class=" flex align-center margin-left" @click="onBack()">
 				<image class="p-left-arrow" src="/static/p-left-arrow.png"></image>
 			</view>
 			<view class="search-form round">
 				<text class="cuIcon-search"></text>
-				<input @focus="InputFocus" @blur="InputBlur" :adjust-position="false" type="text"
-					placeholder="搜索图片、文章、视频" confirm-type="search"></input>
+				<input @input="onKeyInput" @focus="InputFocus" @blur="InputBlur" :adjust-position="false" type="text"
+					placeholder="输入名字,搜索好友" confirm-type="search"></input>
 			</view>
 			<view class="action">
-				<view class="text-16px make-text-bPurple" style="line-height: 32rpx;">搜索</view>
+				<view class="text-16px make-text-bPurple" style="line-height: 32rpx;" @click="onSearch()">搜索</view>
 			</view>
-		</view>
+		</view> -->
 
-		<view class="cu-list menu-avatar margin-top">
-			<view class="cu-item card-view" style="height: 180rpx;" v-for="(item, index) in 5" :key="index">
+		<view class="cu-list menu-avatar ">
+			<view class="cu-item card-view" style="height: 180rpx;" v-for="(item, index) in friends" :key="index">
 				<view class="cu-avatar round lg"
-					style="background-image:url(https://ossweb-img.qq.com/images/lol/web201310/skin/big10001.jpg);">
-					<view class="cu-tag badge">99+</view>
+				:style="[{ backgroundImage:'url('+item.avatarUrl+')' }]">
+					<view class="cu-tag badge-bottom" >
+						<image v-if="item.gender == 0" style="height: 32rpx;width: 32rpx;" src="../../../static/friend/boy.png"></image>
+						<image v-if="item.gender == 1" style="height: 32rpx;width: 32rpx;" src="../../../static/friend/girl.png"></image>
+					</view>
 				</view>
 				<view class="content" style="width: 360rpx;">
-					<view class="text-grey">凯尔</view>
+					<view class="text-grey">{{item.username}}</view>
 					<view class="text-gray text-sm flex">
 						<view class="text-cut">
 							<text class="cuIcon-infofill text-red  margin-right-xs"></text>
-							我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。
+							{{item.signature}}
 						</view>
 
 					</view>
-					<view class="text-gray text-sm flex">
+					<!-- <view class="text-gray text-sm flex">
 						<view class="text-cut">
 							<text class="cuIcon-infofill text-red  margin-right-xs"></text>
 							我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。
 						</view>
 
-					</view>
+					</view> -->
 				</view>
 				<view class="action" style="width: 160rpx; ">
-					<button v-if="index%2==0" class="cu-btn round make-lines-bPurple"
-						style="width: 146rpx; right: 30rpx;">
+					<button v-if="!item.isFriend" class="cu-btn round make-lines-bPurple"
+						style="width: 146rpx; right: 30rpx;" @click="onAddFriend(item)">
 						添加</button>
 					<button v-else class="cu-btn round bg-grey" style="width: 146rpx; right: 30rpx;">
 						已关注</button>
@@ -51,10 +78,14 @@
 </template>
 
 <script>
+	import config from '../../../common/config.js';
+	import reqUtil from '../../../util/util-js/requstUtil.js';
+
 	export default {
 		data() {
 			return {
-
+				friends: [],
+				inputValue:''
 			}
 		},
 		methods: {
@@ -62,6 +93,59 @@
 				uni.navigateBack({
 					delta: 1
 				})
+			},
+			onKeyInput: function(event) {
+				this.inputValue = event.target.value
+			},
+			onSearch() {
+				if(this.inputValue.length < 1){
+					uni.showToast({
+						title:'请输入名字',
+						duration:1000,
+						icon:'none',
+						mask:true
+					})
+					return;
+				}
+				reqUtil.requestData(config.URL.SEARCHFIRENDLIST, {
+					username: this.inputValue
+				}).then(
+					res => {
+						// console.log(JSON.stringify(res));
+						this.friends = res.data.friends;
+
+					},
+					e => {
+						console.log(e);
+					}
+				);
+			},
+			onAddFriend(data) {
+				uni.showToast({
+					title: '添加中..',
+					duration: 1000,
+					icon: 'loading',
+					mask: true
+				})
+				reqUtil.requestData(config.URL.ADDFIRENDINFO, {
+					friendId: data.friendId
+				}).then(
+					res => {
+						console.log(JSON.stringify(res));
+						// this.friends = res.data.friends;
+						if (0 === res.code) {
+							data.isFriend = true;
+							uni.showToast({
+								title: '添加成功',
+								duration: 1000,
+								mask: true
+							})
+						}
+					},
+					e => {
+						console.log(e);
+					}
+				);
 			}
 		}
 	}

+ 53 - 20
pages/friend-page/select/select.vue

@@ -1,63 +1,97 @@
 <template>
-	<view>
+	<view >
 		<view class="friend-bg">
 			<image style="width: 750rpx;height: 406rpx;" src="../../../static/friend/friend-bg.png"></image>
 			<image style="position: absolute; left: 34rpx;top: 120rpx; width: 22rpx; height: 42rpx;"
 				src="../../../static/friend/back.png" @click="onBack()"></image>
 		</view>
-		<view style="padding-top: 230rpx;">
+		<view style="height: 100px;"></view>
+		<scroll-view :style="{ height: scrollviewHight + 'px' }" scroll-y="true">
 			<view class="cu-list menu-avatar margin-top">
-				<view class="cu-item card-view" :class=" index == selectIndex?' friend-select':''" style="height: 180rpx;" v-for="(item, index) in 4" :key="index" @click="onSelectIndex(index)">
+				<view class="cu-item card-view" :class=" index == selectIndex?' friend-select':''" style="height: 180rpx;" v-for="(item, index) in friends" :key="index" @click="onSelectIndex(index,item)">
 					<view class="cu-avatar round lg"
-						style="background-image:url(https://ossweb-img.qq.com/images/lol/web201310/skin/big10001.jpg);">
+						:style="[{ backgroundImage:'url('+item.avatarUrl+')' }]">
 						<view class="cu-tag badge-bottom" >
-							<image style="height: 32rpx;width: 32rpx;" src="../../../static/friend/girl.png"></image>
+							<image v-if="item.gender == 0" style="height: 32rpx;width: 32rpx;" src="../../../static/friend/boy.png"></image>
+							<image v-if="item.gender == 1" style="height: 32rpx;width: 32rpx;" src="../../../static/friend/girl.png"></image>
 						</view>
 					</view>
 					<view class="content" style="width: 360rpx;">
-						<view class="text-grey">凯尔</view>
+						<view class="text-grey">{{item.username}}</view>
 						<view class="text-gray text-sm flex">
 							<view class="text-cut">
 								<text class="cuIcon-infofill text-red  margin-right-xs"></text>
-								我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。
+								{{item.signature}}
 							</view>
-
+						
 						</view>
-						<view class="text-gray text-sm flex">
+			<!-- 			<view class="text-gray text-sm flex">
 							<view class="text-cut">
 								<text class="cuIcon-infofill text-red  margin-right-xs"></text>
 								我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。我已天理为凭,踏入这片荒芜,不再受凡人的枷锁遏制。
 							</view>
-
-						</view>
+						
+						</view> -->
 					</view>
 					<view class="action" style="width: 160rpx; ">
 						<image class=" make-lines-bPurple" style="width: 126rpx; height: 60rpx;"
 							src="../../../static/friend/pk-button.png"></image>
 					</view>
 				</view>
-
+						
 			</view>
-		</view>
+		</scroll-view>
+		
 
-		<view class="padding flex flex-direction" style="position: absolute;bottom: 34rpx; left: 0;right: 0;">
+		<!-- <view class="padding flex flex-direction" style="z-index: 10; position: absolute;bottom: 34rpx; left: 0;right: 0;">
 			<button class="cu-btn make-bg-bPurple text-white lg" style="border-radius: 20rpx;">健身模式</button>
-		</view>
+		</view> -->
 
 	</view>
 </template>
 
 <script>
+	import config from '../../../common/config.js';
+	import reqUtil from '../../../util/util-js/requstUtil.js';
+	
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex';
 	export default {
+		computed: mapState(['systemInfo']),
+		
 		data() {
 			return {
-				selectIndex:0,
+				selectIndex:-1,
+				scrollviewHight:0,
+				friends:[]
 			}
 		},
+		onReady() {
+			console.log(this.systemInfo);
+			// 计算组件的高度
+			this.scrollviewHight = this.systemInfo.windowHeight - 100;
+		},
+		onShow() {
+			reqUtil.requestData(config.URL.GETFRIENDLIST, {}).then(
+				res => {
+					// console.log(JSON.stringify(res));
+					this.friends = res.data.friends;
+			
+				},
+				e => {
+					console.log(e);
+				}
+			);
+		},
 		methods: {
-			onSelectIndex(data){
-				this.selectIndex = data;
-				console.log(data);
+			...mapMutations(['setFinallSelectFriendInfo'
+			]),
+			onSelectIndex(index,item){
+				this.selectIndex = index;
+				// console.log(item);
+				this.setFinallSelectFriendInfo(item);
 			},
 			onBack() {
 				uni.navigateBack({
@@ -79,7 +113,6 @@
 
 		width: 750rpx;
 		height: 406rpx;
-		background-color: #000000;
 	}
 
 	.friend-select {

+ 509 - 0
pages/game-page/game-list/game-list.vue

@@ -0,0 +1,509 @@
+<template>
+	<view>
+		<!--  rgba(116, 172, 240, 1) -->
+		<uni-nav-bar id="nav-bar" status-bar="true" backgroundColor="rgba(153, 150, 252, 255)"
+		<!-- #ifdef APP-PLUS -->
+		@clickLeft="showDrawer()" 
+		<!-- #endif -->
+		<!-- #ifdef H5 || MP-WEIXIN -->
+		@clickLeft="showClickEvent('DrawerModalL')"
+		<!-- #endif -->
+			@clickRight="onNavHome" title="游戏" color="#FFFFFF" fixed="true">
+			<view slot="left">
+				<view class=" flex align-center margin-left">
+					<image class="png-more" src="../../../static/more.png"></image>
+				</view>
+			</view>
+			<!-- <view slot="right">
+				<view class=" flex align-center " style="margin-right: 10rpx;">
+					<view class="cuIcon-home text-20px-before"></view>
+				</view>
+			</view> -->
+		</uni-nav-bar>
+
+
+		<scroll-view scroll-y="true" :style="{ height: scrollviewHight + 'px' }" @scrolltolower="lower">
+			<view v-if="(cIndex != -1 && gameShow)||ConnectBindingDevice" class="game-item card-view"
+				v-for="(item, index) in gameList" :key="index" :data-id="index">
+				<view @tap="onNavToWebviewGame(item)">
+					<view class="game-image-container">
+						<image mode="aspectFill" class="game-item-image" :src="item.gamePicture"></image>
+						<image class="head-image" :src="item.gameIcon"></image>
+
+						<view class="play-bg-image">
+							<image class="play-image" src="/static/play.png"></image>
+						</view>
+					</view>
+					<view class="cu-list menu-avatar">
+						<view class="cu-item">
+							<view class="content flex-sub">
+								<view>{{ item.gameName }}</view>
+								<view class='flex flex-wrap ' style="margin: 10rpx 0;">
+									<view style="padding-right:5rpx;" v-for="(item,index) in item.gameTags"
+										:key="index">
+										<view class='cu-tag line-purple radius'>{{item.tagName}}</view>
+									</view>
+								</view>
+								<!-- <view class="text-sm flex justify-between" style="color:rgba(201, 201, 201, 1);">{{item.createTime}}</view> -->
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="text-gray text-sm text-center padding flex flex-direction" style="width: 100%;">
+					<view @tap="onFavoriteAdd(item)">
+						<image class="margin-lr-xs right-png" style="margin: 25px 0;"
+							:src="item.gameFavorite?'/static/favorite_r.png':'/static/favorite_g.png'"
+							mode="aspectFill"></image>
+					</view>
+					<view style="margin-top: 30px;" @tap="onNavComment">
+						<!-- <image class="margin-lr-xs right-png" style="margin: 20px 0;" src="/static/info_g.png" mode="aspectFill"></image> -->
+					</view>
+					<view style="margin-top: 60px;" @tap="onNavDetail(item)">
+						<view class="cuIcon-moreandroid margin-lr-xs"
+							style="font-size: 20px; margin: 10px 0;  color: #d6d6d6;"></view>
+					</view>
+				</view>
+			</view>
+			<view v-if="(cIndex == -1 && !gameShow) || gameList.length == 0 || ConnectBindingDevice == null"
+				class="text-16px text-gray text-center margin">没有更多数据</view>
+			<view style="height: 17px;"></view>
+		</scroll-view>
+
+		<!-- <view class="float-png">
+			<image src="/static/conversion@2x.png" mode="aspectFit" @tap="onNavConver"></image>
+		</view> -->
+		<!-- <round-menu @trigger="onRoundTrigger"></round-menu> -->
+		<sideBar ref="sideBar"></sideBar>
+	</view>
+</template>
+
+<script>
+	import uniNavBar from '@/components/uni-nav-bar/uni-nav-bar.vue';
+	import sideBar from '@/components/side-bar/side-bar.vue';
+	import config from '../../../common/config.js';
+	import reqUtil from '../../../util/util-js/requstUtil.js';
+	// import roundMenu from "@/components/round-menu/round-menu.vue";
+
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex';
+
+	export default {
+		components: {
+			uniNavBar,
+			sideBar
+		},
+		computed: mapState(['ConnectBindingDevice', 'BLEConnectDevice', 'cIndex', 'versionCodeState', 'platform',
+			'gamePlatform','systemInfo','navHeight','tabbarHeight'
+		]),
+		data() {
+			return {
+				tabList: [],
+				TabCur: 0,
+				Category: 0,
+				scrollLeft: 0,
+				scrollviewHight: '',
+
+
+				bDontUpdate: false,
+
+				//游戏列表
+				gameList: [],
+				gamePage: 1,
+				gameSize: 10,
+
+				//默认显示
+				gameShow: true,
+				//编码的item
+				encodeItem: '',
+
+			};
+		},
+		onLoad(option) {
+			let _this = this;
+			let _index = 1;
+			//获得游戏类目
+			reqUtil.requestData(config.URL.GAMECATEGORY).then(
+				res => {
+					console.log('GAMECATEGORY =====', res);
+					if (res.code == 0) {
+						this.tabList = res.data;
+						this.TabCur = _index; //game
+						this.categoryType = this.tabList[_index].categoryType;
+						this.getGameList(this.categoryType);
+					}
+				},
+				e => {
+					console.log(e);
+				}
+			);
+
+		},
+		onReady() {
+			let phoneHeight = this.systemInfo.windowHeight;
+			// 计算组件的高度
+			this.scrollviewHight = phoneHeight - this.navHeight - this.tabbarHeight;
+		},
+		methods: {
+			...mapMutations(['glimitPlayGame']),
+			// 跳转转换页面
+			onNavConver() {
+				uni.reLaunch({
+					url: '../../conversion-page/conversion/conversion',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			//跳转回主页
+			onNavHome() {
+				uni.reLaunch({
+					url: '../../personal-page/personal/personal',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			tabSelect(e) {
+				if (this.TabCur != e.currentTarget.dataset.id) {
+					//重新设置参数
+					this.bDontUpdate = false;
+					this.gameList = [];
+					this.gamePage = 1;
+					this.gameSize = 10;
+					this.TabCur = e.currentTarget.dataset.id;
+					this.categoryType = e.currentTarget.dataset.category_id;
+					this.scrollLeft = (e.currentTarget.dataset.id - 1) * 60;
+					this.getGameList(this.categoryType);
+				}
+
+			},
+			showClickEvent() {
+				this.$refs.sideBar.showModal();
+			},
+			onNavSearch() {
+
+				uni.showToast({
+					title: '功能尚未开放',
+					icon: 'none'
+				})
+				return;
+
+				uni.navigateTo({
+					url: '../game-search/game-search',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			//收藏
+			onFavoriteAdd(item) {
+				//添加收藏
+				let favoritesTemp = {
+					'fObjectId': item.gameId,
+					'favoritesType': 0,
+				}
+
+				reqUtil.requestData(config.URL.FAVORITESMODIFY, favoritesTemp).then(res => {
+						console.log('FAVORITESMODIFY =====', res);
+						if (res.code == 0) {
+							if (!res.data.bHas) {
+								item.gameFavorite = false;
+								uni.showToast({
+									title: "取消收藏",
+									icon: "none"
+								})
+							} else {
+								uni.showToast({
+									title: "收藏成功",
+									icon: "none"
+								})
+								item.gameFavorite = true;
+							}
+						}
+
+					},
+					e => {
+						console.log(e)
+					});
+			},
+			onNavComment() {
+				uni.showToast({
+					title: '功能尚未开放',
+					icon: 'none'
+				})
+				return;
+				uni.navigateTo({
+					url: '../game-comment/game-comment',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			onNavDetail(item) {
+				// console.log(item);
+				let temItem = encodeURIComponent(JSON.stringify(item));
+				// return;
+				uni.navigateTo({
+					url: '../game-detail/game-detail?item=' + temItem,
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			onNavToWebviewGame(item) {
+				// console.log("====item == ",item);
+				// if (!this.BLEConnectDevice || this.cIndex == -1) {
+				// 	uni.showToast({
+				// 		title: "没有连接绑带,请连接后重试!",
+				// 		icon: "none"
+				// 	})
+				// 	return;
+				// }
+				//1.先判断模式
+				//如果都不存在,返回
+				this.glimitPlayGame({
+					gameTags: item.gameTags,
+					callback: () => {
+						reqUtil.requestData(config.URL.GAMEDETAIL, item).then(res => {
+								console.log('GAMEDETAIL =====', res);
+								if (res.code == 0) {
+									this.encodeItem = encodeURIComponent(JSON.stringify(res.data
+									.gameInfo));
+
+									// #ifdef APP-PLUS
+									uni.navigateTo({
+										url: '../game-play-sub/game-play-sub?item=' + this
+											.encodeItem,
+										success: res => {},
+										fail: () => {},
+										complete: () => {}
+									});
+									// #endif 
+									// #ifdef H5
+									uni.navigateTo({
+										url: '../game-play/game-play-web?item=' + this.encodeItem,
+										success: res => {},
+										fail: () => {},
+										complete: () => {}
+									});
+									// #endif
+								}
+
+							},
+							e => {
+								console.log(e)
+							});
+					}
+				});
+
+
+
+			},
+
+			getGameList(categoryType) {
+				uni.showToast({
+					icon: "loading",
+					title: "",
+					mask: true,
+					duration: 10000
+				})
+				//获得游戏列表
+				reqUtil.requestData(
+					config.URL.GAMELIST_FROM_CATEGORY_PLATFORM, {
+						categoryType: categoryType,
+						//endTime 可以不设置,服务器默认设置一个值
+						endTime: config.endTime,
+						page: this.gamePage,
+						size: this.gameSize
+					}
+				).then(res => {
+						console.log('GAMELIST_FROM_CATEGORY_PLATFORM =====', res);
+						if (res.code == 0) {
+							uni.hideToast();
+
+							if (res.data.length < this.gameSize) {
+								this.bDontUpdate = true;
+							}
+
+							if (res.data.length != 0) {
+								uni.showToast({
+									icon: "none",
+									title: "更新成功",
+								})
+							} else {
+								uni.showToast({
+									icon: "none",
+									title: "没数据啦",
+								})
+							}
+							this.gameList = this.gameList.concat(res.data);
+
+							if (categoryType == 1) {
+								//game
+								this.gameShow = this.versionCodeState.showGame;
+
+							} else if (categoryType == 2) {
+								//game
+								this.gameShow = this.versionCodeState.showVideo;
+							}
+						}
+					},
+					e => {
+						console.log(e);
+						uni.showToast({
+							icon: "none",
+							title: "更新出错",
+						})
+					}
+				);
+			},
+
+			onRoundTrigger(data) {
+				console.log("onRoundTrigger==", data);
+				// return;
+				let url = '';
+				switch (data.item.type) {
+					case "personal":
+						//个人中心页面
+						url = '../../personal-page/personal/personal';
+						break;
+					case "game":
+						url = '../../game-page/game/game';
+						break;
+					default:
+						url = '../../personal-page/personal/personal';
+						break;
+				}
+				uni.reLaunch({
+					url: url,
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			lower(e) {
+				if (this.bDontUpdate) return;
+				console.log(e);
+				this.gamePage++;
+				this.getGameList(this.categoryType);
+			},
+			showDrawer() {
+				uni.getSubNVueById('game-list-drawer').show('slide-in-left', 200);
+			}
+		}
+	};
+</script>
+
+<style>
+	page {
+		background-color: #fff;
+	}
+
+	.float-png {
+		position: absolute;
+		right: 15px;
+		bottom: 200px;
+		width: 56px;
+		height: 56px;
+	}
+
+	.png-search {
+		width: 50rpx;
+		height: 100%;
+		position: absolute;
+		right: 20px;
+		top: 0;
+		bottom: 0;
+		margin: auto;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		/* border: 1rpx solid #000000; */
+	}
+
+	.scrollX {
+		position: relative;
+		width: 100%;
+		height: 90upx;
+		/* border: 1rpx solid #000000; */
+	}
+
+	.scrollX-padding {
+		padding: 0 74px 0 20px;
+	}
+
+	.game-item {
+		display: flex;
+		justify-content: flex-start;
+		flex-direction: row;
+		background-color: white;
+
+		margin: 17px 14px 0 17px;
+		/* border-bottom: 1rpx solid rgba(240, 240, 240, 1); */
+	}
+
+	.game-item-image {
+		width: 542rpx;
+		height: 542rpx;
+		z-index: 99;
+	}
+
+	.head-image {
+		position: absolute;
+		bottom: -20px;
+		left: 0;
+		margin-left: 17px;
+		width: 80rpx;
+		height: 80rpx;
+		border: 2px solid white;
+		border-radius: 100px;
+		z-index: 100;
+	}
+
+	.play-bg-image {
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		top: 0;
+		right: 0;
+		width: 112rpx;
+		height: 112rpx;
+
+		margin: auto;
+		background: rgba(0, 0, 0, 0.25);
+		/* opacity: 0.25; */
+		border-radius: 100px;
+		z-index: 100;
+	}
+
+	.play-image {
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		top: 0;
+		right: 0;
+		width: 44rpx;
+		height: 54rpx;
+		margin: auto;
+		z-index: 100;
+	}
+
+	.game-image-container {
+		position: relative;
+	}
+
+	.game-index {
+		z-index: 300;
+	}
+
+	.cu-color {
+		color: rgba(191, 191, 193, 1);
+	}
+
+	.right-png {
+		width: 36rpx;
+		height: 32rpx;
+	}
+</style>

+ 501 - 0
pages/game-page/game-video/game-video.vue

@@ -0,0 +1,501 @@
+<template>
+	<view>
+		<!--  rgba(116, 172, 240, 1) showClickEvent('DrawerModalL')-->
+		<uni-nav-bar id="nav-bar" status-bar="true" backgroundColor="rgba(153, 150, 252, 255)"
+		<!-- #ifdef APP-PLUS -->
+		@clickLeft="showDrawer()" 
+		<!-- #endif -->
+		<!-- #ifdef H5 || MP-WEIXIN -->
+		@clickLeft="showClickEvent('DrawerModalL')"
+		<!-- #endif -->
+		 @clickRight="onNavHome" title="视频" color="#FFFFFF" fixed="true">
+			<view slot="left">
+				<view class=" flex align-center margin-left">
+					<image class="png-more" src="../../../static/more.png"></image>
+				</view>
+			</view>
+			<!-- <view slot="right">
+				<view class=" flex align-center " style="margin-right: 10rpx;">
+					<view class="cuIcon-home text-20px-before"></view>
+				</view>
+			</view> -->
+		</uni-nav-bar>
+
+		<scroll-view scroll-y="true" :style="{ height: scrollviewHight + 'px' }" @scrolltolower="lower">
+			<view v-if="(cIndex != -1 && gameShow)||ConnectBindingDevice" class="game-item card-view" v-for="(item, index) in gameList" :key="index" :data-id="index">
+				<view @tap="onNavToWebviewGame(item)">
+					<view class="game-image-container">
+						<image mode="aspectFill" class="game-item-image" :src="item.gamePicture"></image>
+						<image class="head-image" :src="item.gameIcon"></image>
+
+						<view class="play-bg-image">
+							<image class="play-image" src="/static/play.png"></image>
+						</view>
+					</view>
+					<view class="cu-list menu-avatar">
+						<view class="cu-item">
+							<view class="content flex-sub">
+								<view>{{ item.gameName }}</view>
+								<view class='flex flex-wrap ' style="margin: 10rpx 0;">
+									<view style="padding-right:5rpx;" v-for="(item,index) in item.gameTags" :key="index">
+										<view class='cu-tag line-purple radius'>{{item.tagName}}</view>
+									</view>
+								</view>
+								<!-- <view class="text-sm flex justify-between" style="color:rgba(201, 201, 201, 1);">{{item.createTime}}</view> -->
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="text-gray text-sm text-center padding flex flex-direction" style="width: 100%;">
+					<view @tap="onFavoriteAdd(item)">
+						<image class="margin-lr-xs right-png" style="margin: 25px 0;" :src="item.gameFavorite?'/static/favorite_r.png':'/static/favorite_g.png'"
+						 mode="aspectFill"></image>
+					</view>
+					<view style="margin-top: 30px;" @tap="onNavComment">
+						<!-- <image class="margin-lr-xs right-png" style="margin: 20px 0;" src="/static/info_g.png" mode="aspectFill"></image> -->
+					</view>
+					<view style="margin-top: 60px;" @tap="onNavDetail(item)">
+						<view class="cuIcon-moreandroid margin-lr-xs" style="font-size: 20px; margin: 10px 0;  color: #d6d6d6;"></view>
+					</view>
+				</view>
+			</view>
+			<view v-if="(cIndex == -1 && !gameShow) || gameList.length == 0 || ConnectBindingDevice == null" class="text-16px text-gray text-center margin">没有更多数据</view>
+			<view style="height: 17px;"></view>
+		</scroll-view>
+
+		<!-- <view class="float-png">
+			<image src="/static/conversion@2x.png" mode="aspectFit" @tap="onNavConver"></image>
+		</view> -->
+		<!-- <round-menu @trigger="onRoundTrigger"></round-menu> -->
+		<sideBar ref="sideBar"></sideBar>
+	</view>
+</template>
+
+<script>
+	import uniNavBar from '@/components/uni-nav-bar/uni-nav-bar.vue';
+	import sideBar from '@/components/side-bar/side-bar.vue';
+	import config from '../../../common/config.js';
+	import reqUtil from '../../../util/util-js/requstUtil.js';
+	// import roundMenu from "@/components/round-menu/round-menu.vue";
+
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex';
+
+	export default {
+		components: {
+			uniNavBar,
+			sideBar
+		},
+		computed: mapState(['ConnectBindingDevice', 'BLEConnectDevice', 'cIndex','versionCodeState','platform','gamePlatform',
+		'systemInfo','navHeight','tabbarHeight']),
+		data() {
+			return {
+				tabList: [],
+				TabCur: 0,
+				Category: 0,
+				scrollLeft: 0,
+				scrollviewHight: '',
+
+
+				bDontUpdate: false,
+
+				//游戏列表
+				gameList: [],
+				gamePage: 1,
+				gameSize: 10,
+				
+				//默认显示
+				gameShow: true,
+				//编码的item
+				encodeItem: '',
+
+			};
+		},
+		onLoad(option) {
+		
+			let _this = this;
+			let _index = 2;
+			//获得游戏类目
+			reqUtil.requestData(config.URL.GAMECATEGORY).then(
+				res => {
+					console.log('GAMECATEGORY =====', res);
+					if (res.code == 0) {
+						this.tabList = res.data;
+						this.TabCur = _index;	//video
+						this.categoryType = this.tabList[_index].categoryType;
+						this.getGameList(this.categoryType);
+					}
+				},
+				e => {
+					console.log(e);
+				}
+			);
+
+		},
+		onReady() {
+			let phoneHeight = this.systemInfo.windowHeight;
+			// 计算组件的高度
+			this.scrollviewHight = phoneHeight - this.navHeight - this.tabbarHeight;
+		},
+		methods: {
+			...mapMutations(['glimitPlayGame']),
+			// 跳转转换页面
+			onNavConver() {
+				uni.reLaunch({
+					url: '../../conversion-page/conversion/conversion',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			//跳转回主页
+			onNavHome() {
+				uni.reLaunch({
+					url: '../../personal-page/personal/personal',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			tabSelect(e) {
+				if (this.TabCur != e.currentTarget.dataset.id) {
+					//重新设置参数
+					this.bDontUpdate = false;
+					this.gameList = [];
+					this.gamePage = 1;
+					this.gameSize = 10;
+					this.TabCur = e.currentTarget.dataset.id;
+					this.categoryType = e.currentTarget.dataset.category_id;
+					this.scrollLeft = (e.currentTarget.dataset.id - 1) * 60;
+					this.getGameList(this.categoryType);
+				}
+
+			},
+			showClickEvent() {
+				this.$refs.sideBar.showModal();
+			},
+			onNavSearch() {
+
+				uni.showToast({
+					title: '功能尚未开放',
+					icon: 'none'
+				})
+				return;
+
+				uni.navigateTo({
+					url: '../game-search/game-search',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			//收藏
+			onFavoriteAdd(item) {
+				//添加收藏
+				let favoritesTemp = {
+					'fObjectId': item.gameId,
+					'favoritesType': 0,
+				}
+
+				reqUtil.requestData(config.URL.FAVORITESMODIFY, favoritesTemp).then(res => {
+						console.log('FAVORITESMODIFY =====', res);
+						if (res.code == 0) {
+							if (!res.data.bHas) {
+								item.gameFavorite = false;
+								uni.showToast({
+									title: "取消收藏",
+									icon: "none"
+								})
+							} else {
+								uni.showToast({
+									title: "收藏成功",
+									icon: "none"
+								})
+								item.gameFavorite = true;
+							}
+						}
+
+					},
+					e => {
+						console.log(e)
+					});
+			},
+			onNavComment() {
+				uni.showToast({
+					title: '功能尚未开放',
+					icon: 'none'
+				})
+				return;
+				uni.navigateTo({
+					url: '../game-comment/game-comment',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			onNavDetail(item) {
+				// console.log(item);
+				let temItem = encodeURIComponent(JSON.stringify(item));
+				// return;
+				uni.navigateTo({
+					url: '../game-detail/game-detail?item=' + temItem,
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			onNavToWebviewGame(item) {
+				// console.log("====item == ",item);
+				// if (!this.BLEConnectDevice || this.cIndex == -1) {
+				// 	uni.showToast({
+				// 		title: "没有连接绑带,请连接后重试!",
+				// 		icon: "none"
+				// 	})
+				// 	return;
+				// }
+				//1.先判断模式
+				//如果都不存在,返回
+				this.glimitPlayGame({
+					gameTags: item.gameTags,
+					callback: () => {
+						reqUtil.requestData(config.URL.GAMEDETAIL, item).then(res => {
+								console.log('GAMEDETAIL =====', res);
+								if (res.code == 0) {
+									this.encodeItem = encodeURIComponent(JSON.stringify(res.data.gameInfo));
+
+									// #ifdef APP-PLUS
+									uni.navigateTo({
+										url: '../game-play-sub/game-play-sub?item=' + this.encodeItem,
+										success: res => {},
+										fail: () => {},
+										complete: () => {}
+									});
+									// #endif 
+									// #ifdef H5
+									uni.navigateTo({
+										url: '../game-play/game-play-web?item=' + this.encodeItem,
+										success: res => {},
+										fail: () => {},
+										complete: () => {}
+									});
+									// #endif
+								}
+
+							},
+							e => {
+								console.log(e)
+							});
+					}
+				});
+
+
+
+			},
+
+			getGameList(categoryType) {
+				uni.showToast({
+					icon: "loading",
+					title: "",
+					mask: true,
+					duration: 10000
+				})
+				//获得游戏列表
+				reqUtil.requestData(
+					config.URL.GAMELIST_FROM_CATEGORY_PLATFORM, {
+						categoryType: categoryType,
+						//endTime 可以不设置,服务器默认设置一个值
+						endTime: config.endTime,
+						page: this.gamePage,
+						size: this.gameSize
+					}
+				).then(res => {
+						console.log('GAMELIST_FROM_CATEGORY_PLATFORM =====', res);
+						if (res.code == 0) {
+							uni.hideToast();
+
+							if (res.data.length < this.gameSize) {
+								this.bDontUpdate = true;
+							}
+
+							if (res.data.length != 0) {
+								uni.showToast({
+									icon: "none",
+									title: "更新成功",
+								})
+							} else {
+								uni.showToast({
+									icon: "none",
+									title: "没数据啦",
+								})
+							}
+							this.gameList = this.gameList.concat(res.data);
+							
+							if (categoryType == 1) {
+								//game
+								this.gameShow = this.versionCodeState.showGame;
+								
+							} else if (categoryType == 2) {
+								//game
+								this.gameShow = this.versionCodeState.showVideo;
+							}
+						}
+					},
+					e => {
+						console.log(e);
+						uni.showToast({
+							icon: "none",
+							title: "更新出错",
+						})
+					}
+				);
+			},
+
+			onRoundTrigger(data) {
+				console.log("onRoundTrigger==", data);
+				// return;
+				let url = '';
+				switch (data.item.type) {
+					case "personal":
+						//个人中心页面
+						url = '../../personal-page/personal/personal';
+						break;
+					case "game":
+						url = '../../game-page/game/game';
+						break;
+					default:
+						url = '../../personal-page/personal/personal';
+						break;
+				}
+				uni.reLaunch({
+					url: url,
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			lower(e) {
+				if (this.bDontUpdate) return;
+				console.log(e);
+				this.gamePage++;
+				this.getGameList(this.categoryType);
+			},
+			showDrawer() {
+				uni.getSubNVueById('game-video-drawer').show('slide-in-left', 200);
+			}
+		}
+	};
+</script>
+
+<style>
+	page {
+		background-color: #fff;
+	}
+
+	.float-png {
+		position: absolute;
+		right: 15px;
+		bottom: 200px;
+		width: 56px;
+		height: 56px;
+	}
+
+	.png-search {
+		width: 50rpx;
+		height: 100%;
+		position: absolute;
+		right: 20px;
+		top: 0;
+		bottom: 0;
+		margin: auto;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		/* border: 1rpx solid #000000; */
+	}
+
+	.scrollX {
+		position: relative;
+		width: 100%;
+		height: 90upx;
+		/* border: 1rpx solid #000000; */
+	}
+
+	.scrollX-padding {
+		padding: 0 74px 0 20px;
+	}
+
+	.game-item {
+		display: flex;
+		justify-content: flex-start;
+		flex-direction: row;
+		background-color: white;
+
+		margin: 17px 14px 0 17px;
+		/* border-bottom: 1rpx solid rgba(240, 240, 240, 1); */
+	}
+
+	.game-item-image {
+		width: 542rpx;
+		height: 542rpx;
+		z-index: 99;
+	}
+
+	.head-image {
+		position: absolute;
+		bottom: -20px;
+		left: 0;
+		margin-left: 17px;
+		width: 80rpx;
+		height: 80rpx;
+		border: 2px solid white;
+		border-radius: 100px;
+		z-index: 100;
+	}
+
+	.play-bg-image {
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		top: 0;
+		right: 0;
+		width: 112rpx;
+		height: 112rpx;
+
+		margin: auto;
+		background: rgba(0, 0, 0, 0.25);
+		/* opacity: 0.25; */
+		border-radius: 100px;
+		z-index: 100;
+	}
+
+	.play-image {
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		top: 0;
+		right: 0;
+		width: 44rpx;
+		height: 54rpx;
+		margin: auto;
+		z-index: 100;
+	}
+
+	.game-image-container {
+		position: relative;
+	}
+
+	.game-index {
+		z-index: 300;
+	}
+
+	.cu-color {
+		color: rgba(191, 191, 193, 1);
+	}
+
+	.right-png {
+		width: 36rpx;
+		height: 32rpx;
+	}
+</style>

+ 45 - 0
pages/my-page/achievement/achievement.vue

@@ -0,0 +1,45 @@
+<template>
+	<view >
+		<uni-nav-bar id="nav-bar" status-bar="true"  @clickLeft="onBack()"
+		  color="#000000"  title="我的成就" fixed="true" :border="false">
+			<view slot="left">
+				<view class="flex align-center margin-left">
+					<image class="p-left-arrow" src="../../../static/p-left-arrow.png"></image>
+				</view>
+			</view>
+		</uni-nav-bar>
+		<view style="height: 8px; background-color: #EEEEEE;"></view>
+		
+		<view class="cu-form-group">
+			<view  class="grid col-4 flex-sub" >
+				<view class="flex flex-direction align-center padding" v-for="(item,index) in 10" :key="index">
+					<image style="width: 110rpx;height:110rpx;"  src="../../../static/achievement/11-01@2x.png"></image>
+					<text>成就名称</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			onBack(){
+				uni.navigateBack({
+					delta:1
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	page{
+		background-color: #FFFFFF;
+	}
+</style>

+ 119 - 68
pages/my-page/homepage/homepage.vue

@@ -1,11 +1,27 @@
 <template>
+	<!-- title="我的" -->
 	<view class="full-container">
 		<uni-nav-bar id="nav-bar" status-bar="true"  @clickLeft="onBack()"
-		 title="我的" color="#000000" fixed="true" :border="false">
-			<view slot="left">
+		  color="#000000" fixed="true" :border="false">
+			<!-- <view slot="left">
 				<view class=" flex align-center margin-left">
 					<image class="p-left-arrow" src="../../../static/p-left-arrow.png"></image>
 				</view>
+			</view> -->
+			<view slot="middle">
+				<view class="flex justify-center align-center"
+					style="margin-left: 250rpx; ">
+					<view class="flex align-center" style="margin-right: 40rpx; padding: 0 18px; height: 56rpx; background-color: rgba(183,183,183,0.33); border-radius: 13.5px;">
+						<image class="png-more" style="margin-right: 16rpx;"
+							src="/static/common/sideBar/sGold.png"></image>
+						<view class="text-14px" style="line-height: 28rpx;">{{cGold}}</view>
+					</view>
+					<view class="flex  align-center" style="padding: 0 18px; height: 56rpx; background-color: rgba(183,183,183,0.33); border-radius: 13.5px;">
+						<image class="png-more" style="margin-right: 16rpx; "
+							src="/static/common/sideBar/sDiamond.png"></image>
+						<view  class="text-14px" style="line-height: 28rpx;">{{cDiamond}}</view>
+					</view>
+				</view>
 			</view>
 		
 		</uni-nav-bar>
@@ -17,82 +33,95 @@
 			</view>
 		</view> -->
 		<image class="bg-image" src="../../../static/loginBg.png" mode="aspectFill"></image>
-		<view class="card-view flex align-center " style="position: relative; margin-top: 113px;">
-			<view class="avatar-size">
-				<image class="avatar-img round" :src="avatarUrl"></image>
+		
+		<scroll-view  style="border: 1rpx solid #000000;" :style="{ height: scrollviewHight + 'px' }" scroll-y="true">
+			<view class="card-view flex align-center " style="position: relative; margin-top: 113px;">
+				<view class="avatar-size">
+					<image class="avatar-img round" :src="avatarUrl"></image>
+				</view>
+				<view class="avatar-group text-upload">
+					<view class="text-lg flex justify-between align-center justify-center">
+						<text class="text-black text-bold">{{userName}}</text>
+						<view style="width: 126rpx;height: 50rpx; position: relative;" class="flex align-center justify-center" >
+							<image style="height: 100%; width: 100%;" src="/static/bg-days.png"></image>
+							<text class="text-white text-13px text-center" style="line-height: 50rpx; position: absolute;top: 0;right: 10rpx;">{{days}}天</text>
+						</view>
+					</view>
+					<!-- <view class="text-xs padding-top">
+						<text class="text-black">{{days}}</text>
+					</view> -->
+					<view class="text-gray padding-top">{{signature}}</view>
+				</view>
+			
+				<view class="only-arrow" @tap="onNavUser"></view>
+			
 			</view>
-			<view class="avatar-group text-upload">
+			
+			<view class="card-view flex align-center " style="position: relative; height: 132rpx; margin-top: 8px;">
+				<image class="achievement-img round" src="../../../static/achievement/11-01@2x.png"></image>
 				<view class="text-lg flex justify-between align-center justify-center">
-					<text class="text-black text-bold">{{userName}}</text>
-					<text class="text-black">达标{{days}}天</text>
+					<text class="text-gray text-14px">我的成就</text>
 				</view>
-				<!-- <view class="text-xs padding-top">
-					<text class="text-black">{{days}}</text>
-				</view> -->
-				<view class="text-gray padding-top">{{signature}}</view>
+				<view class="only-arrow" @tap="onNavAchievement"></view>
+			
 			</view>
-
-			<view class="only-arrow" @tap="onNavUser"></view>
-
-		</view>
-
-
-
-
-
-		<view class="card-view article ">
-			<view class="title">
-				最近在玩
-			</view>
-			<view class="cu-item shadow">
-				<view class="cu-form-group margin-top">
-					<view v-if="playGames.length!=0" class="grid col-3 homepage-grid-square flex-sub ">
-						<view v-for="(item,index) in playGames" :key="index" v-if="index<6" @tap="onViewImage(item)">
-							<image class="item-img" :src="item.gameIcon" mode="aspectFill"></image>
-							<view class="border text-center text-cut">{{item.gameName}}</view>
+			
+			<view class="card-view article ">
+				<view class="title">
+					最近在玩
+				</view>
+				<view class="cu-item shadow">
+					<view class="cu-form-group margin-top">
+						<view v-if="playGames.length!=0" class="grid col-3 homepage-grid-square flex-sub ">
+							<view v-for="(item,index) in playGames" :key="index" v-if="index<6" @tap="onViewImage(item)">
+								<image class="item-img" :src="item.gameIcon" mode="aspectFill"></image>
+								<view class="border text-center text-cut">{{item.gameName}}</view>
+							</view>
 						</view>
+						<view v-else class="text-center text-gray" :style="{width:'100%'}">去玩吧~</view>
+						<view v-if="playGames.length!=0" class="homepage-arrow" @tap="onNavList('recently')"></view>
 					</view>
-					<view v-else class="text-center text-gray" :style="{width:'100%'}">去玩吧~</view>
-					<view v-if="playGames.length!=0" class="homepage-arrow" @tap="onNavList('recently')"></view>
 				</view>
 			</view>
-		</view>
-		<view v-if="favoriteGames.length==0" class="card-view flex align-center">
-			<view class="content flex flex-direction align-start margin-top">
-				<view class="title">关注</view>
-				<view class="text-grey" style="margin: 0rpx 40rpx 40rpx;">有好多好玩的视频等着你关注哦</view>
-			</view>
-			<view class=" margin-sm button-fav " @tap="onGoToFollow">
-				<image style="width: 21px;height: 21px; margin-right: 12rpx;" src="../../../static/add_w.png"></image>
-				去关注
-			</view>
-		</view>
-		<view v-else class="card-view article">
-			<view class="title">
-				已关注的
+			<view v-if="favoriteGames.length==0" class="card-view flex align-center">
+				<view class="content flex flex-direction align-start margin-top">
+					<view class="title">关注</view>
+					<view class="text-grey" style="margin: 0rpx 40rpx 40rpx;">有好多好玩的视频等着你关注哦</view>
+				</view>
+				<view class=" margin-sm button-fav " @tap="onGoToFollow">
+					<image style="width: 21px;height: 21px; margin-right: 12rpx;" src="../../../static/add_w.png"></image>
+					去关注
+				</view>
 			</view>
-			<view class="cu-item shadow">
-				<view class="cu-form-group margin-top">
-					<view v-if="favoriteGames.length!=0" class="grid col-3 homepage-grid-square flex-sub ">
-						<view  class="text-center "  v-for="(item,index) in favoriteGames" :key="index" v-if="index<6" @tap="onViewImage(item)">
-							<image class="item-img" :src="item.gameIcon" mode="aspectFill"></image>
-							<view class="border text-cut">{{item.gameName}}</view>
+			<view v-else class="card-view article">
+				<view class="title">
+					已关注的
+				</view>
+				<view class="cu-item shadow">
+					<view class="cu-form-group margin-top">
+						<view v-if="favoriteGames.length!=0" class="grid col-3 homepage-grid-square flex-sub ">
+							<view  class="text-center "  v-for="(item,index) in favoriteGames" :key="index" v-if="index<6" @tap="onViewImage(item)">
+								<image class="item-img" :src="item.gameIcon" mode="aspectFill"></image>
+								<view class="border text-cut">{{item.gameName}}</view>
+							</view>
 						</view>
+						<view v-else class="text-center text-gray" :style="{width:'100%'}">去关注更多的游戏吧~</view>
+						<view v-if="favoriteGames.length!=0" class="homepage-arrow" @tap="onNavList('watchGame')"></view>
 					</view>
-					<view v-else class="text-center text-gray" :style="{width:'100%'}">去关注更多的游戏吧~</view>
-					<view v-if="favoriteGames.length!=0" class="homepage-arrow" @tap="onNavList('watchGame')"></view>
 				</view>
 			</view>
-		</view>
+			
+			<view class="homepage-action-row">
+				<view class=" ">哔蹦</view>
+				<view class="text-bold text-decoration" style="
+			color: #007AFF; border-bottom: solid 1rpx #007AFF;" @tap="onSwitchAgree('agreement')">用户协议</view>
+				<view class=" ">和</view>
+				<view class="text-bold text-decoration" style="
+			color: #007AFF; border-bottom: solid 1rpx #007AFF;" @tap="onSwitchAgree('privacy')">隐私政策</view>
+			</view>
+		</scroll-view>
+		
 		
-		<view class="homepage-action-row">
-			<view class=" ">哔蹦</view>
-			<view class="text-bold text-decoration" style="
-		color: #007AFF; border-bottom: solid 1rpx #007AFF;" @tap="onSwitchAgree('agreement')">用户协议</view>
-			<view class=" ">和</view>
-			<view class="text-bold text-decoration" style="
-		color: #007AFF; border-bottom: solid 1rpx #007AFF;" @tap="onSwitchAgree('privacy')">隐私政策</view>
-		</view>
 	</view>
 </template>
 
@@ -105,8 +134,14 @@
 
 	export default {
 		computed: mapState(['forcedLogin', 'hasLogin', 'userName', 'avatarUrl', 'playGames', 'favoriteGames', 'days',
-			'signature','platform','gamePlatform'
+			'signature','platform','gamePlatform','cGold','cDiamond',
+			'systemInfo','navHeight','tabbarHeight',
 		]),
+		data() {
+			return {
+				scrollviewHight:0
+			}
+		},
 		onLoad() {
 			let that = this;
 			reqUtil.requestData(config.URL.RECENTLYPLAYINGGETBYPLATFORM).then(res => {
@@ -131,6 +166,11 @@
 					console.log(e)
 				});
 		},
+		onReady() {
+			let phoneHeight = this.systemInfo.windowHeight;
+			// 计算组件的高度
+			this.scrollviewHight = phoneHeight - this.navHeight - this.tabbarHeight;
+		},
 		methods: {
 			onViewImage(item) {
 				let temItem = encodeURIComponent(JSON.stringify(item));
@@ -143,6 +183,11 @@
 					url: '../userInfo/userInfo'
 				});
 			},
+			onNavAchievement(){
+				uni.navigateTo({
+					url: '../achievement/achievement'
+				});
+			},
 			onNavList(type) {
 				if (type == "recently" && this.playGames.length == 0) {
 					uni.showModal({
@@ -216,6 +261,12 @@
 		width: 140rpx;
 		height: 140rpx;
 	}
+	
+	.achievement-img{
+		margin: 0 26rpx 0 46rpx;
+		width: 82rpx;
+		height: 82rpx;
+	}
 
 	.text-upload {
 		font-size: 13px;
@@ -282,11 +333,11 @@
 	}
 
 	.bg-image {
-		position: absolute;
-		top: 0;
+		position: fixed;
+		top: 46px;
 		left: 0;
 		width: 100%;
-		height: 159px;
+		height: 164px;
 		opacity: 1;
 	}
 	

File diff suppressed because it is too large
+ 222 - 477
pages/personal-page/personal/personal.vue


+ 3 - 3
pages/personal-page/plan/plan.vue

@@ -1,11 +1,11 @@
 <template>
 	<view>
 		<uni-nav-bar id="nav-bar" status-bar="true" @clickLeft="onBack()" title="健身计划" color="#000000" fixed="true" :border="false">
-			<view slot="left">
+			<!-- <view slot="left">
 				<view class=" flex align-center margin-left">
 					<image class="p-left-arrow" src="../../../static/p-left-arrow.png"></image>
 				</view>
-			</view>
+			</view> -->
 
 		</uni-nav-bar>
 
@@ -97,7 +97,7 @@
 				<myPicker v-if="modalName == 'showPickerModal' ? true:false" :pickerObj="pickerObj" @confirmEvent="onConfirm"
 				 @cancelEvent="onCancel"></myPicker>
 			</view>
-		</view>z
+		</view>
 	</view>
 </template>
 

+ 260 - 0
platform/app-plus/subNVue/drawer.nvue

@@ -0,0 +1,260 @@
+<template>
+	<div>
+		<scroller  :style="{ height: systemInfo.windowHeight + 'px' }">
+			<view class="drawerBg">
+				<image style="width: 750rpx;height: 672rpx;"
+					src="../../../static/sidebar_white.png"></image>
+			</view>
+			<view class="blank-space"></view>
+			<view class="flex justify-center align-center ">
+				<view style="width: 146rpx;height: 146rpx; border-radius: 45px;">
+					<image class="avatar-img bg-black" mode="aspectFit" :src="avatarUrl">
+					</image>
+				</view>
+			
+				<view class="flex flex-direction-row align-center margin-12px " @tap="onNavEditInfoPage">
+					<text class="text-22px text-bold">{{userName}}
+					</text>
+					<image style="width: 34rpx;height: 34rpx; margin-left: 22rpx;" src="/static/sideEdit.png"></image>
+				</view>
+			</view>
+			<view class="flex justify-center align-center  position-relative" style="height: 256rpx;">
+				<view class="pos-top-center ">
+					<image class="bg-days" src="../../../static/bg-days.png"></image>
+				</view>
+				<text class="text-12px text-right text-white bg-days-text">{{days}}天</text>
+				<text
+					class="text-more text-13px text-gray text-cut text-lines1 margin-12px ">{{signature!=='null'?signature:'111111111'}}</text>
+			</view>
+			<list class="list-wrapper">
+				<cell v-for="item in lists" :key="item.id">
+					<div class="text-wrapper" @click="clickitem(item.id,item.page_type)">
+						<view class="flex flex-direction-row align-center">
+							<image style="width: 34rpx;height:34rpx; margin-right: 36rpx;" :src="item.url"></image>
+							<text class="text-15px text-medium">{{item.name}}</text>
+						</view>
+						<text class="icon">&#xe583;</text>
+					</div>
+				</cell>
+			</list>
+			<div class="flex justify-center align-center" style="margin-top: 140rpx; margin-bottom: 140rpx">
+				<div class="close-drawer" @click="onExit">
+					<text class="text-16px" style="color: #6B6B6B;">退出登录</text>
+				</div>
+			</div>
+		</scroller>
+	</div>
+</template>
+
+<script>
+	import sideBarData from '@/components/side-bar/sideBar.js';
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex';
+	export default {
+		computed: mapState(['bCanvasShow', 'token', 'userName', 'avatarUrl', 'days', 'signature', 'weight',
+			'height','systemInfo'
+		]),
+		data() {
+			return {
+				lists: sideBarData.getSideBarList,
+				signature: null
+			}
+		},
+		beforeCreate() {
+			const domModule = weex.requireModule('dom')
+			domModule.addRule('fontFace', {
+				fontFamily: "unibtn",
+				'src': "url('../../../static/font/uni.ttf')"
+			});
+		},
+		created() {
+			// for (let i = 0; i < 5; i++) {
+			// 	this.lists.push({
+			// 		id: i,
+			// 		name: 'Item' + i,
+			// 	});
+			// }
+		},
+		methods: {
+			...mapMutations(['loginUserInfo', 'onLuanchLogin', 'delectToken']),
+			hideDrawer() {
+				uni.getCurrentSubNVue().hide('auto')
+			},
+			clickitem(e,_pageType) {
+				// uni.$emit('drawer-page', e);
+				this.onNavListItem(_pageType);
+			},
+			// 跳转编辑信息页面
+			onNavEditInfoPage() {
+				uni.navigateTo({
+					url: '../../my-page/userInfo/userInfo',
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			//侧边栏对应页面跳转
+			onNavListItem(pageType) {
+				// console.log(pageType);
+				if (pageType == "my") {
+					this.onNavMyPage();
+					return;
+				}
+				// return;
+				let url = '';
+				switch (pageType) {
+					case "recently":
+					case "watchGame":
+						url = '/pages/personal-page/list/list?type=' + pageType;
+						break;
+					case "ranking":
+						url = '/pages/game-page/game-ranking/game-ranking';
+						break;
+					case "feedback":
+						url = '/pages/login-page/feedback/feedback';
+						break;
+					case "friend":
+						url = '/pages/friend-page/main/main';
+						break;
+				}
+				uni.navigateTo({
+					url: url,
+					success: res => {},
+					fail: () => {},
+					complete: () => {}
+				});
+			},
+			
+			/**
+			 * 退出登录
+			 */
+			onExit() {
+				console.log("退出登录");
+				// 清除token,退回首页
+				this.delectToken({
+					success: (res) => {
+						uni.reLaunch({
+							url: '../../login-page/login/login'
+						})
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style src="@/util/util-css/main-nvue.css"></style>
+<style>
+	.wrapper {
+		flex-direction: column;
+		flex: 1;
+		text-align: center;
+		padding: 60rpx 0rpx 0rpx 0rpx;
+		background-color: #FFFFFF;
+	}
+
+	.drawerBg {
+		position: absolute;
+		top: 0;
+		right: 0;
+		/* bottom: 0; */
+		left: 0;
+		justify-content: center;
+		align-items: center;
+	}
+	
+	
+
+	.blank-space {
+		height: 150rpx;
+	}
+
+
+	.avatar-img {
+		width: 146rpx;
+		height: 146rpx;
+		/* border: 8rpx solid rgba(255, 255, 255, 1); */
+		border-radius: 50%;
+	}
+
+	.bg-days {
+		width: 126rpx;
+		height: 48rpx;
+	}
+
+	.bg-days-text {
+		height: 48rpx;
+		width: 110rpx;
+		line-height: 48rpx;
+	}
+
+	.text-more {
+		width: 200px;
+		line-height: 13px;
+		height: 13px;
+	}
+
+	/* 自定义导航栏的图片大小 */
+	.png-more {
+		width: 20px;
+		height: 20px;
+	}
+
+
+	.nav-text {
+		color: #8f8f94;
+		/* #ifndef APP-PLUS-NVUE */
+		margin-bottom: 40px;
+		/* #endif */
+		/* #ifdef APP-PLUS-NVUE */
+		margin-bottom: 40rpx;
+		/* #endif */
+	}
+
+	.list-wrapper {
+		/* margin-top: 120rpx; */
+		height: 540rpx;
+		/* #ifdef APP-PLUS-NVUE */
+		/* height: 500rpx; */
+		/* #endif */
+		/* #ifndef APP-PLUS-NVUE */
+		/* height: 500px; */
+		/* #endif */
+	}
+
+	.text-wrapper {
+		justify-content: center;
+		/* border-bottom-style: solid;
+		border-bottom-width: 1rpx;
+		border-bottom-color: rgba(0, 0, 0, .2); */
+		margin-bottom: 54rpx;
+		margin-left: 140rpx;
+		margin-right: 98rpx;
+		/* padding-bottom: 15rpx; */
+	}
+
+	.close-drawer {
+		display: flex;
+		justify-content: center;
+		/* align-content: center; */
+		align-items: center;
+		background-color: #f8f8f8;
+		width: 300rpx;
+		padding: 15rpx;
+		border-radius: 40rpx;
+		border-style: solid;
+		border-width: 1rpx;
+		border-color: rgba(229, 229, 229, 1);
+	}
+
+	.icon {
+		position: absolute;
+		right: 0;
+		color: #D1D1D1;
+		font-family: unibtn;
+		font-size: 30rpx;
+		font-weight: 400;
+	}
+</style>

+ 121 - 0
platform/app-plus/subNVue/popup.nvue

@@ -0,0 +1,121 @@
+<template>
+	<div class="wrapper">
+		<text class="title">{{title}}</text>
+		<scroller class="scroller">
+			<div>
+				<text class="content">{{content}}</text>
+			</div>
+			<div>
+				<text style="color: red; font-size: 30rpx;">以下为 Popup 内部滚动示例:</text>
+			</div>
+			<div class="cell" v-for="(item, index) in lists" @click="handle(item)" :key="index">
+				<text class="text">{{item}}</text>
+			</div>
+		</scroller>
+		<div class="message-wrapper">
+			<text class="send-message" @click="sendMessage">向页面发送消息</text>
+		</div>
+	</div>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				title: '',
+				content: '',
+				lists: [],
+			}
+		},
+		created() {
+			const vm = this;
+			for (let i = 1; i < 20; i++) {
+				this.lists.push('item' + i);
+			}
+			uni.$on('page-popup', (data) => {
+				vm.title = data.title;
+				vm.content = data.content;
+			})
+		},
+		beforeDestroy() {
+			uni.$off('drawer-page')
+		},
+		methods: {
+			sendMessage() {
+				const subNVue = uni.getCurrentSubNVue()
+				uni.$emit('popup-page', {
+					title: '已读完!',
+				})
+			},
+			handle(item, index) {
+				const subNVue = uni.getCurrentSubNVue()
+				uni.$emit('popup-page', {
+					type: 'interactive',
+					info: item + ' 该元素被点击了!',
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.wrapper {
+		flex-direction: column;
+		justify-content: space-between;
+		padding: 10rpx 15rpx;
+		background-color: #F4F5F6;
+		border-radius: 4rpx;
+	}
+
+	.title {
+		height: 100rpx;
+		line-height: 100rpx;
+		border-bottom-style: solid;
+		border-bottom-width: 1rpx;
+		border-bottom-color: #CBCBCB;
+		flex: 0;
+		font-size: 30rpx;
+	}
+
+	.scroller {
+		height: 400rpx;
+		padding: 8rpx 15rpx;
+	}
+
+	.content {
+		color: #555555;
+		font-size: 32rpx;
+	}
+
+	.message-wrapper {
+		flex: 0;
+		border-top-style: solid;
+		border-top-width: 1rpx;
+		border-top-color: #CBCBCB;
+		height: 80rpx;
+		align-items: flex-end;
+	}
+
+	.send-message {
+		font-size: 30rpx;
+		line-height: 80rpx;
+		color: #00CE47;
+		margin-left: 20rpx;
+	}
+
+	.cell {
+		margin: 10rpx;
+		padding: 20rpx 0;
+		top: 10rpx;
+		align-items: center;
+		justify-content: center;
+		border-radius: 10rpx;
+		background-color: #5989B9;
+	}
+
+	.text {
+		font-size: 30rpx;
+		text-align: center;
+		color: white;
+	}
+</style>

+ 114 - 0
platform/app-plus/subNVue/video-mask.nvue

@@ -0,0 +1,114 @@
+<template>
+	<div class="wrapper">
+		<list class="list">
+			<cell v-for="(item, index) in lists" :key="index" :ref="'item' + index" class="cell">
+				<text class="name">{{item.name}}:</text>
+				<text class="content">{{item.content}}</text>
+			</cell>
+		</list>
+	</div>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				lists: [],
+				interval: null,
+				yourTexts: [
+					{
+						name: '学员A',
+						content: '老师讲的真好',
+					}, {
+						name: '学员B',
+						content: 'uni-app值得学习',
+					}, {
+						name: '学员C',
+						content: '老师,还有实战例子吗?',
+					}, {
+						name: '学员D',
+						content: '老师,请问是不是要先学会vue才能学uni-app?',
+					}, {
+						name: '学员E',
+						content: '受教了,uni-app太牛了',
+					}
+				],
+			}
+		},
+		created() {
+			const vm = this;
+			uni.$on('play-video', (data) => {
+				if(data.status === 'open'){
+					this.addItem();
+				}else{
+					this.closeItem();
+				}
+			})
+		},
+		beforeDestroy(){
+			uni.$off('play-video')
+			this.closeItem()
+		},
+		methods: {
+			addItem() {
+				const vm = this;
+				vm.lists = [{
+					name: '学员E',
+					content: '受教了,uni-app太牛了',
+				}];
+				const dom = weex.requireModule('dom')
+				vm.interval = setInterval(() => {
+					if(vm.lists.length > 15) {
+						vm.lists.unshift();
+					}
+					vm.lists.push({
+						name: vm.yourTexts[vm.lists.length%4].name,
+						content: vm.yourTexts[vm.lists.length%4].content
+					});
+					if(vm.lists.length > 5) {
+						vm.$nextTick(() => {
+							if(vm.$refs['item' + (vm.lists.length - 1)]){
+								dom.scrollToElement(vm.$refs['item' + (vm.lists.length - 1)][0]);
+							}
+						});
+					}
+				}, 3500);
+			},
+			closeItem() {
+				if(this.interval) clearInterval(this.interval);
+			}
+		}
+	}
+</script>
+
+<style>
+	.wrapper {
+		position: relative;
+		flex: 1;
+		background-color: transparent;
+	}
+	.list {
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.7);
+	}
+	.cell {
+		padding: 10rpx 0;
+		flex-direction: row;
+		flex-wrap: nowrap;
+	}
+	.name {
+		flex: 0;
+		font-size: 20rpx;
+		margin-right: 20rpx;
+		color: #FF5A5F;
+	}
+	.content {
+		flex: 1;
+		font-size: 20rpx;
+		color: #F4F5F6;
+	}
+</style>

BIN
static/achievement/11-01@2x.png


BIN
static/achievement/11-02@2x.png


BIN
static/achievement/11-03@2x.png


BIN
static/achievement/11-04@2x.png


BIN
static/achievement/11-05@2x.png


BIN
static/achievement/11-06@2x.png


BIN
static/achievement/11-07@2x.png


BIN
static/achievement/11-08@2x.png


BIN
static/achievement/11-09@2x.png


BIN
static/achievement/11-10@2x.png


BIN
static/achievement/11-11@2x.png


BIN
static/achievement/11-12@2x.png


BIN
static/achievement/11-13@2x.png


BIN
static/achievement/11-14@2x.png


BIN
static/achievement/11-15@2x.png


BIN
static/achievement/11-16@2x.png


BIN
static/font/uni.ttf


BIN
static/modal/tip/bind-tip-bg.png


BIN
static/personal/connecting.png


BIN
static/personal/disconnect.png


BIN
static/signBoard@2x.png


+ 316 - 0
util/util-css/main-nvue.css

@@ -0,0 +1,316 @@
+/* ==================
+          布局
+ ==================== */
+
+/*  -- flex弹性布局 -- */
+
+
+.flex {
+	display: flex;
+}
+
+.flex-sub {
+	flex: 1;
+}
+
+.flex-twice {
+	flex: 2;
+}
+
+.flex-treble {
+	flex: 3;
+}
+
+/* nvue 默认 column */
+.flex-direction-row {
+	flex-direction: row;
+}
+
+.flex-wrap {
+	flex-wrap: wrap;
+}
+
+.align-start {
+	align-items: flex-start;
+}
+
+.align-end {
+	align-items: flex-end;
+}
+
+.align-center {
+	align-items: center;
+}
+
+.align-stretch {
+	align-items: stretch;
+}
+
+.justify-start {
+	justify-content: flex-start;
+}
+
+.justify-end {
+	justify-content: flex-end;
+}
+
+.justify-center {
+	justify-content: center;
+}
+
+.justify-between {
+	justify-content: space-between;
+}
+
+.justify-around {
+	justify-content: space-around;
+}
+
+/* ==================
+         position
+ ==================== */
+.pos-relative {
+	position: relative;
+}
+
+.pos-center{
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	justify-content: center;
+	align-items: center;
+}
+.pos-top-center{
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	justify-content: center;
+	align-items: center;
+}
+
+/* ==================
+         线
+ ==================== */
+.border-1rpx-black {
+	border-width: 1rpx;
+	border-style: solid;
+	border-color: #000000;
+}
+
+/* ==================
+          文本
+ ==================== */
+
+
+.text-18px {
+	font-size: 18px;
+	/* line-height: 36px; */
+}
+
+.text-16px {
+	font-size: 16px;
+	/* line-height: 32px; */
+}
+
+.text-11px {
+	font-size: 11px;
+	/* line-height: 22px; */
+}
+
+.text-12px {
+	font-size: 12px;
+}
+
+.text-13px {
+	font-size: 13px;
+	/* line-height: 23px; */
+}
+
+.text-14px {
+	font-size: 14px;
+	/* line-height: 28px; */
+}
+
+.text-15px {
+	font-size: 15px;
+	/* line-height: 30px; */
+}
+
+.text-22px {
+	font-size: 22px;
+	height: 22px;
+	line-height: 22px;
+}
+
+.text-26px {
+	font-size: 26px;
+	/* line-height: 52px; */
+}
+
+.text-18px-before::before {
+	font-size: 18px;
+}
+
+.text-20px-before::before {
+	font-size: 20px;
+}
+
+.text-22px-before::before {
+	font-size: 22px;
+}
+
+
+/* .text-price::before {
+	content: "¥";
+	font-size: 80%;
+	margin-right: 4upx;
+} */
+
+.text-cut {
+	text-overflow: ellipsis;
+	/* white-space: nowrap; */
+	overflow: hidden;
+}
+
+.text-lines1{
+	/** 显示的行数 **/
+	lines: 1;
+}
+.text-lines2{
+	/** 显示的行数 **/
+	lines: 2;
+}
+
+.text-bold {
+	font-weight: bold;
+}
+
+.text-medium {
+	font-weight: 400;
+}
+
+
+.text-center {
+	text-align: center;
+}
+
+.text-content {
+	line-height: 1.6;
+}
+
+.text-left {
+	text-align: left;
+}
+
+.text-right {
+	text-align: right;
+}
+
+
+.text-red,
+.line-red,
+.lines-red {
+	color: #e54d42;
+}
+
+.text-orange,
+.line-orange,
+.lines-orange {
+	color: #f37b1d;
+}
+
+.text-yellow,
+.line-yellow,
+.lines-yellow {
+	color: #fbbd08;
+}
+
+.text-olive,
+.line-olive,
+.lines-olive {
+	color: #8dc63f;
+}
+
+.text-green,
+.line-green,
+.lines-green {
+	color: #39b54a;
+}
+
+.text-cyan,
+.line-cyan,
+.lines-cyan {
+	color: #1cbbb4;
+}
+
+.text-blue,
+.line-blue,
+.lines-blue {
+	color: #0081ff;
+}
+
+.text-purple,
+.line-purple,
+.lines-purple {
+	color: #6739b6;
+}
+
+.text-mauve,
+.line-mauve,
+.lines-mauve {
+	color: #9c26b0;
+}
+
+.text-pink,
+.line-pink,
+.lines-pink {
+	color: #e03997;
+}
+
+.text-brown,
+.line-brown,
+.lines-brown {
+	color: #a5673f;
+}
+
+.text-grey,
+.line-grey,
+.lines-grey {
+	color: #8799a3;
+}
+
+.line-mGrey {
+	color: #EAEAEA;
+}
+
+.text-gray,
+.line-gray,
+.lines-gray {
+	color: #aaaaaa;
+}
+
+.text-black,
+.line-black,
+.lines-black {
+	color: #333333;
+}
+
+.text-white,
+.line-white,
+.lines-white {
+	color: #ffffff;
+}
+
+
+/*  -- 内外边距 -- */
+
+.margin-0 {
+	margin: 0;
+}
+
+.margin-12px {
+	margin: 12px;
+}

+ 80 - 23
util/util-js/store.js

@@ -186,6 +186,11 @@ const store = new Vuex.Store({
 		//最近连接过的设备
 		finallyUseDevice: null,
 
+		/**
+		 * 用户选择好友的信息
+		 */
+		finallySelectFriendInfo: null,
+
 		//phoneNumber
 		phoneNumber: '',
 		openid: '',
@@ -211,6 +216,11 @@ const store = new Vuex.Store({
 		bInstallWechat: false,
 		bHideWeixin: false,
 
+		//导航栏高度。这里统一参数,单位px
+		navHeight: 46,
+		tabbarHeight: 65,
+
+		systemInfo: null, //系统全部信息
 		clientName: '', //但是客户端名字
 		system: '', // 系统版本
 		platform: '', // 平台
@@ -328,14 +338,42 @@ const store = new Vuex.Store({
 		//跳绳条件下计数
 		bRopeKeyOne: 0,
 		bRopeKeyTwo: 0,
-		
+
 		//钻石,金币
-		cDiamond:1000,
-		cGold:1000
+		cDiamond: 10000,
+		cGold: 10000,
+
+		/**
+		 * 任务相关
+		 */
+		currentJumpTask: null
 
 	},
 	mutations: {
+		/**
+		 * 设置当前操作的任务记录到本地
+		 * @param {Object} state
+		 * @param {Object} _taskObj
+		 */
+		setActionJumpTask(state, _taskObj) {
+			uni.setStorageSync('currentJumpTask', _taskObj);
+			state.currentJumpTask = _taskObj;
+		},
+		//获取本地任务对象
+		getActionJumpTask(state) {
+			//如果存在本地任务
+			const value = uni.getStorageSync('currentJumpTask');
+			if (value) {
+				state.currentJumpTask = value;
+			}
+		},
 
+		setFinallSelectFriendInfo(state, friendInfo) {
+			state.finallySelectFriendInfo = friendInfo;
+		},
+		clearFinallFriendInfo(state) {
+			state.finallySelectFriendInfo = null;
+		},
 		/**
 		 * 获取记录的最后一次连接设备
 		 * @param {Object} state
@@ -677,8 +715,10 @@ const store = new Vuex.Store({
 							success();
 					} else {
 
-						state.planData.cumulativeCalorie = Number(state.planData.cumulativeCalorie).sub(_localCalorieInt);
-						state.planData.showCalorie = Number(state.planData.showCalorie).sub(_localCalorieInt);
+						state.planData.cumulativeCalorie = Number(state.planData.cumulativeCalorie).sub(
+							_localCalorieInt);
+						state.planData.showCalorie = Number(state.planData.showCalorie).sub(
+							_localCalorieInt);
 
 						self.commit("setLocalCalorie", oldLocalCalorie);
 						if (fail)
@@ -690,7 +730,8 @@ const store = new Vuex.Store({
 				},
 				e => {
 					console.log(e);
-					state.planData.cumulativeCalorie = Number(state.planData.cumulativeCalorie).sub(_localCalorieInt);
+					state.planData.cumulativeCalorie = Number(state.planData.cumulativeCalorie).sub(
+						_localCalorieInt);
 					state.planData.showCalorie = Number(state.planData.showCalorie).sub(_localCalorieInt);
 					self.commit("setLocalCalorie", oldLocalCalorie);
 
@@ -896,7 +937,8 @@ const store = new Vuex.Store({
 						}
 
 
-						state.planData.allCalorie = state.planData.showCalorie.add(state.planData.localCalorie);
+						state.planData.allCalorie = state.planData.showCalorie.add(state.planData
+							.localCalorie);
 
 						// console.log("======",state.planData )
 						state.days = date.datedifference(res.data.startTime, res.data.endTime) + 1;
@@ -1186,6 +1228,9 @@ const store = new Vuex.Store({
 			//最近连接过的设备
 			state.finallyUseDevice = null;
 
+			//最近选择的好友
+			state.finallySelectFriendInfo = null;
+
 			//记录的蓝牙设备,保存id, 和对应的蓝牙连接数据
 			state.BLEDeviceList = [];
 			//显示的蓝牙设备,取本地数据时候更新
@@ -1195,6 +1240,9 @@ const store = new Vuex.Store({
 			state.oldArcbarProCalorie = 0;
 			//记录表盘当前的总卡路里
 			state.oldArcbarAllCalorie = 0;
+			
+			//任务相关
+			state.currentJumpTask = null;
 		},
 
 		loginUserInfo(state, data) {
@@ -1434,7 +1482,7 @@ const store = new Vuex.Store({
 			state.bListenerAccArray = false;
 			//更新二进制的
 			state.bListenerHexUpdate = false;
-
+			
 		},
 		//连接蓝牙
 		onCreateBLEConnection(state, context) {
@@ -1811,7 +1859,8 @@ const store = new Vuex.Store({
 				gz
 			} = data.gyro;
 
-			state.filter.Update(new o0.Vector3(ax, ay, az), msGap, new o0.Vector3(gx, gy, gz), callback); //我自己的更新acc的函数
+			state.filter.Update(new o0.Vector3(ax, ay, az), msGap, new o0.Vector3(gx, gy, gz),
+			callback); //我自己的更新acc的函数
 		},
 
 		/**
@@ -2093,7 +2142,8 @@ const store = new Vuex.Store({
 				if (!res.connected) {
 
 					//要在连接的状态下 ,并且获取过匹配列表有参数的情况下,才提示重连
-					if (!state.bShowBLEConnectModal && state.bVerifiedConnection && state.bPhoneMatched) {
+					if (!state.bShowBLEConnectModal && state.bVerifiedConnection && state
+						.bPhoneMatched) {
 						state.bShowBLEConnectModal = true;
 						let _connectItem = Object.assign({}, state.BLEConnectDevice);
 						let _cIndex = state.cIndex;
@@ -2120,6 +2170,9 @@ const store = new Vuex.Store({
 								}
 							}
 						})
+					} else {
+						//断开连接后reset一下参数
+						_self.commit("onResetBLEConnection");
 					}
 
 
@@ -2201,7 +2254,8 @@ const store = new Vuex.Store({
 					}
 					for (let i = 0; i < serviceList.length; i++) {
 						let service = serviceList[i];
-						if (service.uuid.toLocaleLowerCase() === item.PRIMARY_SERVICE.toLocaleLowerCase()) {
+						if (service.uuid.toLocaleLowerCase() === item.PRIMARY_SERVICE
+							.toLocaleLowerCase()) {
 							state.serviceId = service.uuid;
 							//开始获取指定服务的特征值
 							_self.commit('B_GetBLEDeviceCharacteristics', {
@@ -2372,7 +2426,7 @@ const store = new Vuex.Store({
 					let ay4 = BLE.hexToSignedInt(ay4Str) / 32768 * 16;
 					let az4 = BLE.hexToSignedInt(az4Str) / 32768 * 16;
 
-					let accArray= [{
+					let accArray = [{
 						ax: ax1,
 						ay: ay1,
 						az: az1,
@@ -2401,21 +2455,21 @@ const store = new Vuex.Store({
 						min: min4,
 						s: s4
 					}]
-					
-					for(let i=0 ;i<accArray.length;i++){
+
+					for (let i = 0; i < accArray.length; i++) {
 						let _temp = accArray[i];
 						box["acc"] = {
-							ax:_temp.ax,
-							ay:_temp.ay,
-							az:_temp.az,
+							ax: _temp.ax,
+							ay: _temp.ay,
+							az: _temp.az,
 						};
 						box["min"] = _temp.min;
 						box["s"] = _temp.s;
 						box["ms"] = _temp.ms;
-						
+
 						uni.$emit('updateBLEDeviceData', box);
 					}
-					
+
 				}
 
 
@@ -2522,7 +2576,7 @@ const store = new Vuex.Store({
 			// 	bSendHex: true,
 			// 	bOpen: true
 			// });
-			console.log('B_OpenRopeSkipping',3);
+			console.log('B_OpenRopeSkipping', 3);
 			this.commit('onWriteBLEConnectionValue', {
 				value: "3"
 			});
@@ -2620,7 +2674,8 @@ const store = new Vuex.Store({
 				_sendData = BLE.str2ab(value);
 			}
 
-			console.log("currentInstruction:", state.currentInstruction, value, state.bListenerUpdate, state.bListenerMac,
+			console.log("currentInstruction:", state.currentInstruction, value, state.bListenerUpdate, state
+				.bListenerMac,
 				state.bListenerHexUpdate);
 			console.log("state.deviceId:", state.deviceId, state.serviceId, state.writeCharacteristicId);
 			uni.writeBLECharacteristicValue({
@@ -2631,7 +2686,8 @@ const store = new Vuex.Store({
 				// 这里的value是ArrayBuffer类型
 				value: _sendData,
 				success: (res) => {
-					console.log('writeBLECharacteristicValue success', res.errMsg, value, retryCount);
+					console.log('writeBLECharacteristicValue success', res.errMsg, value,
+						retryCount);
 					if (success) {
 						success(res);
 					}
@@ -2640,7 +2696,8 @@ const store = new Vuex.Store({
 					console.log(fail)
 					//重新写入
 					if (retryCount > 0) {
-						console.log("writeBLECharacteristicValue Rewrite ===================>" + value + " == " + retryCount);
+						console.log("writeBLECharacteristicValue Rewrite ===================>" +
+							value + " == " + retryCount);
 						retryCount--;
 						setTimeout(() => {
 							this.commit("B_WriteBLECharacteristicValue", {

Some files were not shown because too many files changed in this diff