dayu 2 лет назад
Родитель
Сommit
92ea3d6487
100 измененных файлов с 4357 добавлено и 1999 удалено
  1. 221 0
      sleep/components/Mark-Tab/ScrollNav.vue
  2. 192 0
      sleep/components/Mark-Tab/Tab.vue
  3. 284 0
      sleep/components/wanghexu-timeslot/wanghexu-timeslot.vue
  4. 2 0
      sleep/main.js
  5. 4 2
      sleep/pages.json
  6. 196 22
      sleep/pages/alertSetting/alertSetting.vue
  7. 0 385
      sleep/pages/detail/detail.nvue
  8. 22 0
      sleep/pages/detail/detail.vue
  9. 0 106
      sleep/pages/detail/nvue-swiper-page.nvue
  10. 52 4
      sleep/pages/report/report.vue
  11. 68 0
      sleep/uni_modules/uni-popup/changelog.md
  12. 45 0
      sleep/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
  13. 275 0
      sleep/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
  14. 143 0
      sleep/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue
  15. 187 0
      sleep/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
  16. 7 0
      sleep/uni_modules/uni-popup/components/uni-popup/i18n/en.json
  17. 8 0
      sleep/uni_modules/uni-popup/components/uni-popup/i18n/index.js
  18. 7 0
      sleep/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json
  19. 7 0
      sleep/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json
  20. 45 0
      sleep/uni_modules/uni-popup/components/uni-popup/keypress.js
  21. 26 0
      sleep/uni_modules/uni-popup/components/uni-popup/popup.js
  22. 473 0
      sleep/uni_modules/uni-popup/components/uni-popup/uni-popup.vue
  23. 87 0
      sleep/uni_modules/uni-popup/package.json
  24. 17 0
      sleep/uni_modules/uni-popup/readme.md
  25. 22 0
      sleep/uni_modules/uni-transition/changelog.md
  26. 131 0
      sleep/uni_modules/uni-transition/components/uni-transition/createAnimation.js
  27. 286 0
      sleep/uni_modules/uni-transition/components/uni-transition/uni-transition.vue
  28. 84 0
      sleep/uni_modules/uni-transition/package.json
  29. 11 0
      sleep/uni_modules/uni-transition/readme.md
  30. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map
  31. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map
  32. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  33. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/boxTitle/index.js.map
  34. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/ccq-week-picker/ccq-week-picker.js.map
  35. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/musicControl/index.js.map
  36. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/musicControl/playList.js.map
  37. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/search/index.js.map
  38. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/tabBar/index.js.map
  39. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/uni-popup/uni-popup.js.map
  40. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/uni-transition/uni-transition.js.map
  41. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/alertSetting/alertSetting.js.map
  42. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/auth/auth.js.map
  43. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/dayRecommend/index.js.map
  44. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/index.js.map
  45. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/components/musicList.js.map
  46. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/components/songList.js.map
  47. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map
  48. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/index.js.map
  49. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/monthReport/monthReport.js.map
  50. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/my/index.js.map
  51. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/play/index.js.map
  52. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/report/report.js.map
  53. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/search/components/historySearch.js.map
  54. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/search/components/hotSearch.js.map
  55. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/search/index.js.map
  56. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/searchList/index.js.map
  57. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/shareUser/shareUser.js.map
  58. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/singer/index.js.map
  59. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/singerPlayList/index.js.map
  60. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/songDetail/index.js.map
  61. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/songList/index.js.map
  62. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/weekReport/weekReport.js.map
  63. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js.map
  64. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-section/components/uni-section/uni-section.js.map
  65. 1 1
      sleep/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-steps/components/uni-steps/uni-steps.js.map
  66. 2 1
      sleep/unpackage/dist/dev/mp-weixin/app.json
  67. 10 10
      sleep/unpackage/dist/dev/mp-weixin/colorui/components/cu-custom.js
  68. 12 6
      sleep/unpackage/dist/dev/mp-weixin/common/main.js
  69. 2 2
      sleep/unpackage/dist/dev/mp-weixin/common/runtime.js
  70. 1030 1030
      sleep/unpackage/dist/dev/mp-weixin/common/vendor.js
  71. 14 14
      sleep/unpackage/dist/dev/mp-weixin/components/boxTitle/index.js
  72. 14 14
      sleep/unpackage/dist/dev/mp-weixin/components/ccq-week-picker/ccq-week-picker.js
  73. 15 15
      sleep/unpackage/dist/dev/mp-weixin/components/musicControl/index.js
  74. 14 14
      sleep/unpackage/dist/dev/mp-weixin/components/musicControl/playList.js
  75. 2 2
      sleep/unpackage/dist/dev/mp-weixin/components/musicControl/playList.json
  76. 14 14
      sleep/unpackage/dist/dev/mp-weixin/components/search/index.js
  77. 14 14
      sleep/unpackage/dist/dev/mp-weixin/components/tabBar/index.js
  78. 16 16
      sleep/unpackage/dist/dev/mp-weixin/components/uni-popup/uni-popup.js
  79. 14 14
      sleep/unpackage/dist/dev/mp-weixin/components/uni-transition/uni-transition.js
  80. 34 152
      sleep/unpackage/dist/dev/mp-weixin/pages/alertSetting/alertSetting.js
  81. 3 1
      sleep/unpackage/dist/dev/mp-weixin/pages/alertSetting/alertSetting.json
  82. 1 1
      sleep/unpackage/dist/dev/mp-weixin/pages/alertSetting/alertSetting.wxml
  83. 87 0
      sleep/unpackage/dist/dev/mp-weixin/pages/alertSetting/alertSetting.wxss
  84. 1 1
      sleep/unpackage/dist/dev/mp-weixin/pages/home/index.js
  85. 14 14
      sleep/unpackage/dist/dev/mp-weixin/pages/index/components/musicList.js
  86. 0 1
      sleep/unpackage/dist/dev/mp-weixin/pages/index/components/singerList.js
  87. 0 4
      sleep/unpackage/dist/dev/mp-weixin/pages/index/components/singerList.json
  88. 0 1
      sleep/unpackage/dist/dev/mp-weixin/pages/index/components/singerList.wxml
  89. 0 50
      sleep/unpackage/dist/dev/mp-weixin/pages/index/components/singerList.wxss
  90. 14 14
      sleep/unpackage/dist/dev/mp-weixin/pages/index/components/songList.js
  91. 2 2
      sleep/unpackage/dist/dev/mp-weixin/pages/index/index.js
  92. 1 1
      sleep/unpackage/dist/dev/mp-weixin/pages/monthReport/monthReport.js
  93. 1 1
      sleep/unpackage/dist/dev/mp-weixin/pages/play/index.js
  94. 53 2
      sleep/unpackage/dist/dev/mp-weixin/pages/report/report.js
  95. 3 1
      sleep/unpackage/dist/dev/mp-weixin/pages/report/report.json
  96. 1 1
      sleep/unpackage/dist/dev/mp-weixin/pages/report/report.wxml
  97. 14 14
      sleep/unpackage/dist/dev/mp-weixin/pages/search/components/historySearch.js
  98. 14 14
      sleep/unpackage/dist/dev/mp-weixin/pages/search/components/hotSearch.js
  99. 3 3
      sleep/unpackage/dist/dev/mp-weixin/pages/search/index.js
  100. 0 0
      sleep/unpackage/dist/dev/mp-weixin/pages/searchList/index.js

+ 221 - 0
sleep/components/Mark-Tab/ScrollNav.vue

@@ -0,0 +1,221 @@
+<template>
+    <view class="component-view-scroll-nav" :style="[{position:tabStyle.position,left:tabStyle.left,top:tabStyle.top,bottom:tabStyle.bottom,right:tabStyle.right}]">
+		<scroll-view scroll-x :scroll-with-animation="animate" enable-flex class="navbar" :scroll-left="navStyle.scrollLeft" :skip-hidden-item-layout="true" :style="{height,background}">
+			<view class="nav-wrapper">
+				<view @click="changeTab(key)" :class="['nav-item',{'active':key === modelKey}]" v-for="(item,key) in scrollData" :key="key" :style="{background:fontStyle[key === modelKey?'active':'default']['background']}">
+					<text :class="['item-label',{animate}]" v-text="item.label" :style="[{fontSize:fontStyle[key === modelKey?'active':'default']['fontSize'],color:fontStyle[key === modelKey?'active':'default']['color']}]"></text>
+				</view>
+				<view :class="['line',{animate}]" :style="[{'width':navStyle.width+'px','left':navStyle.left+'px','height':lineStyle.height}]">
+					<view class="s" :style="[{width:lineStyle.width,'backgroundColor':lineStyle.backgroundColor}]"></view>
+				</view>
+			</view>	
+		</scroll-view>
+	</view>
+</template>
+<script>
+const propStyleMap = {
+	line:{
+		color:'backgroundColor',
+		height:'height',
+		width:'width'
+	},
+	font:{
+		default:{
+			defaultColor:'color',
+			defaultSize:'fontSize',
+			defaultBackground:'background'
+		},
+		active:{
+			activeColor:'color',
+			activeSize:'fontSize',
+			activeBackground:'background'
+		}
+	},
+	fixed:{
+		top:'top',
+		left:'left',
+		bottom:'bottom',
+		right:'right'
+	}
+};
+export default {
+    components: {},
+    props: {
+		scrollData:{
+			default:[],
+			type:Array
+		},
+		activeKey:{
+			default:0,
+			type:Number
+		},
+		animate:{
+			default:true,
+			type:Boolean
+		},
+		height:{
+			default:'70rpx',
+			type:String
+		},
+		line:{
+			default:()=>({}),
+			type:Object
+		},
+		font:{
+			default:()=>({}),
+			type:Object
+		},
+		background:{
+			default:'transparent',
+			type:String
+		},
+		fixed:{
+			default:()=>({}),
+			type:Object
+		}
+	},
+	emits:['tabClick','change','update:activeKey','rendered'],
+    // mixins: [require('@/components/mixins/Component').default],
+    data() {
+        return {
+			modelKey:null,
+			navStyle:{
+				width:0,
+				left:0,
+				scrollLeft:0
+			}
+		};
+    },
+    created() {
+	},
+    mounted() {},
+    unmounted() {},
+    computed: {
+		lineStyle:{
+			get(){
+				return this.formatProp('line');
+			}
+		},
+		fontStyle:{
+			get(){
+				const font = this.font;
+				var style = {};
+				for(var key in propStyleMap.font){
+					style[key] = {};
+					var cfg = propStyleMap.font[key];
+					for(var ck in font){
+						ck in cfg && (style[key][cfg[ck]] = font[ck]);
+					}
+				}
+				return style;
+			}
+		},
+		tabStyle:{
+			get(){
+				const formated = this.formatProp('fixed');
+				Object.keys(formated).length && Object.assign(formated,{
+					position:'fixed'
+				});
+				return formated;
+			}
+		}
+	},
+    watch: {
+		activeKey:{
+			handler(n){
+				n !== this.modelKey && this.render(n);
+			},
+			deep:true,
+			immediate:true
+		}
+	},
+    methods: {
+		init(){
+
+		},
+		load(){
+
+		},
+		formatProp(prop){
+			const oThis = this[prop];
+			var props = {};
+			for(var key in oThis){
+				key in propStyleMap[prop] && (props[propStyleMap[prop][key]] = oThis[key]);
+			}
+			return props;
+		},
+		$document(self, select, cfg) {
+			return new Promise((res, rej) => {
+				if (!self || !select) rej('$document:params error');
+				uni.createSelectorQuery().in(self).select(select).fields(Object.assign({
+					id: true,
+					dataset: true,
+					rect:true,
+					size: true,
+					scrollOffset: true,
+					context:true
+				},cfg),data=>res(data)).exec();
+			})
+		},
+		async render(e){
+			this.move = true;
+			this.modelKey = e;
+			await this.$nextTick();
+			await this.changeStyle(e);
+			await new Promise(r=>setTimeout(r,300));
+			this.move = false;
+		},
+		async changeTab(e){
+			!this.move && (async()=>{
+				this.$emit('tabClick',e);
+				if(this.modelKey !== e){
+					this.$emit('update:activeKey',e);
+					this.$emit('change',e);
+					await this.render(e);
+				}
+			})();
+		},
+		async changeStyle(e){
+			var active = await this.$document(this,'.nav-item.active'),
+				scroll = await this.$document(this,'.navbar');
+			if(active && scroll){
+				var left = active.left+scroll.scrollLeft;
+				Object.assign(this.navStyle,{
+					width:active.width,
+					left,
+					...(this.animate ? {scrollLeft:left - scroll.width/2 + active.width/2} : null)
+				});
+			}
+		}
+	},
+    directives: {},
+    errorCaptured() {},
+    renderTracked() {},
+    renderTriggered() {},
+	
+};
+</script>
+<style lang='stylus'>
+$animate = {transition:all .3s linear};
+.component-view-scroll-nav
+	width 100%;z-index 999;
+	.navbar
+		overflow auto;display flex;width 100%;height 70rpx;position relative;background-color #fff;
+		.nav-wrapper
+			display flex;position relative;width 100%;
+			.line
+				position absolute;bottom 0;height 4rpx;
+				&.animate
+					transition all .3s linear;
+				.s
+					width 100%;height 100%;margin 0 auto;background-color #02c4c7;border-radius 2rpx;max-width:100%;transition @transition;
+		.nav-item
+			display flex;align-items center;padding 0 30rpx;white-space nowrap;width 100%;justify-content center;
+			&.active
+				.item-label
+					color #02c4c7;
+					&.animate
+						transition color .3s linear;
+			.item-label
+				font-size 24rpx;color #333;
+</style>

+ 192 - 0
sleep/components/Mark-Tab/Tab.vue

@@ -0,0 +1,192 @@
+<template>
+    <view class="component-view-tab">
+		<scroll-nav :fixed="tabFix" ref="scrollNav" :background="background" :scrollData="scrollData" :activeKey.sync="activeKey" @change="changeTab" @tabClick="tabClick" :animate="animate" :height="height" :line="line" :font="font"></scroll-nav>
+		<view class="scroll-view">
+			<view :class="['tab-wrapper',{animate}]" :style="[{left:tabview.left+'px'}]">
+				<view class="tab" v-for="(item,key) in scrollData" :key="key">
+					<view v-if="forceRender ? true :activeKey === key" class="tab-content" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd($event,key)">
+						<slot name="{{item.slot}}"/>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+import scrollNav from './ScrollNav';
+export default {
+    components: {scrollNav},
+    props: {
+		navData:{
+			default:()=>[],
+			type:Array
+		},
+		value:{
+			default:0,
+			type:Number
+		},
+		animate:{
+			default:true,
+			type:Boolean
+		},
+		scrollThreshold:{
+			default:50,
+			type:Number
+		},
+		height:{
+			default:'70rpx',
+			type:String
+		},
+		line:Object,
+		font:Object,
+		background:String,
+		forceRender:{
+			default:false,
+			type:Boolean
+		},
+		tabFix:Object
+	},
+    // mixins: [require('@/components/mixins/Component').default],
+    data() {
+        return {
+			tabview:{
+				left:0
+			},
+			scrollData:[],												
+            activeKey:0
+		};
+    },
+	emits:['change','update:value','tabClick','rendered'],
+    created() {
+	},
+    mounted() {},
+    unmounted() {},
+    computed: {
+	},
+    watch: {
+		navData:{
+			handler(n){
+				this.scrollData = n;
+				this.$nextTick(this.resizeStyle);
+			},
+			deep:true,
+			immediate:true
+		},
+		value:{
+			handler(n){
+				this.setPosition(n,'set');
+			},
+			deep:true,
+			immediate:true
+		}
+	},
+    methods: {
+		async init(){
+		},
+		load(){},
+		$document(self, select, cfg) {
+			return new Promise((res, rej) => {
+				if (!self || !select) rej('$document:params error');
+				uni.createSelectorQuery().in(self).select(select).fields(Object.assign({
+					id: true,
+					dataset: true,
+					rect:true,
+					size: true,
+					scrollOffset: true,
+					context:true
+				},cfg),data=>res(data)).exec();
+			})
+		},
+		async changeTab(e){
+			await this.setPosition(e);
+        },
+		tabClick(e){
+			this.$emit('tabClick',this.handleItem(e));
+		},
+		handleItem(e){
+			return {
+				index:e,
+				item:this.scrollData[e]
+			}
+		},
+		touchStart(e){
+			if(this.locked) return;
+			var client = e.touches[0];
+			Object.assign(this,{
+				client,
+				position:[client]
+			});
+		},
+		touchMove(e){
+			if(!this.position) return;
+			var client = e.touches[0];
+			if(Math.abs(client.clientY - this.client.clientY) < 25){
+				this.position.push(client);
+				const 
+					positions = this.position.map(item=>Object.assign({},item)),
+					sorted = positions.sort((a,b)=>a.clientX - b.clientX);
+				if(sorted[0].clientX !== client.clientX && sorted.slice(-1)[0].clientX !== client.clientX){
+					this.clearPosition();
+				}
+			}else{
+				this.clearPosition();
+			}
+		},
+		async touchEnd(e,key){
+			var 
+				positions = this.position,
+				act;
+			if(positions){
+				var move = positions.slice(-1)[0].clientX - positions[0].clientX;
+				if(Math.abs(move) < this.scrollThreshold) return;
+				act = move > 0 ? 1 : -1;
+				var changeKey = key - act;
+				if(changeKey < 0 || changeKey > this.navData.length - 1) return;
+				await this.setPosition(changeKey);
+				this.clearPosition();
+			}
+		},
+		async setPosition(key,act){
+			this.locked = true;
+			switch(act){
+				case 'set':
+					break;
+				default:
+					this.$emit('update:value',key);
+					this.$emit('change',this.handleItem(key));
+			}
+			this.activeKey = key;
+			try{
+				!this.itemWidth && (this.itemWidth = (await this.$document(this,'.tab')).width);
+				this.tabview.left = -key * this.itemWidth;
+			}catch(e){}
+			await new Promise(r=>setTimeout(r,300));
+			this.locked && (this.locked = false);
+		},
+		clearPosition(){
+			this.position = null;
+		},
+		resizeStyle(){
+			this.$refs.scrollNav.changeStyle(this.activeKey);
+		}
+	},
+    directives: {},
+    errorCaptured() {},
+    renderTracked() {},
+    renderTriggered() {},
+};
+</script>
+<style lang='stylus'>
+.component-view-tab
+	width 100%;overflow auto;
+	.scroll-view
+		overflow hidden;width 100%;max-width 100%;
+		.tab-wrapper
+			width 100%;display flex;felx-wrap:nowrap;position relative;
+			&.animate
+				transition all .3s;
+			.tab
+				min-width 100%;max-width 100%;
+				.tab-content
+					overflow hidden;width 100%;height 100%;
+</style>

+ 284 - 0
sleep/components/wanghexu-timeslot/wanghexu-timeslot.vue

@@ -0,0 +1,284 @@
+<template>
+    <view>
+		<view v-if="isShow" class="time_mask" :class="{'uni-timer-mask-show':timeMaskShow}"></view>
+		<view v-if="isShow" class="yx_time_slot" :class="{'fadelogIn1':timeMaskShow}">
+			<view class="time_top_box">
+				<view class="time_close" @click="close">取消</view>
+				<view class="time_text">{{title}}</view>
+				<view class="time_comfirm" @click="confirm">确认</view>
+			</view>
+			<view class="typelist">
+				<view class="typeobj" :class="{'typeobj_hover':typeIndex==index}" v-for="(item,index) in typeList" :key="index" @click="handleType(index)">
+					<view class="text">{{item}}</view>
+					<view class="line"></view>
+				</view>
+			</view>
+			<!-- 时间选择 -->
+			<view class="yx_timer_sel">
+				<swiper class="sel_swiper" :current="typeIndex">
+				    <swiper-item>
+				        <view>
+							<picker-view :value="startvalue" :indicator-style="indicatorStyle" @change="bindstartChange" class="sel_swiper-item">
+							    <picker-view-column>
+							        <view class="item" v-for="(item,index) in timeHour" :key="index">{{item}}时</view>
+							    </picker-view-column>
+							    <picker-view-column>
+							        <view class="item" v-for="(item,index) in timeMin" :key="index">{{item}}分</view>
+							    </picker-view-column>
+							</picker-view>
+						</view>
+				    </swiper-item>
+				    <swiper-item>
+				        <view>
+				    		<picker-view :value="endvalue" :indicator-style="indicatorStyle" @change="bindendChange" class="sel_swiper-item">
+				    		    <picker-view-column>
+				    		        <view class="item" v-for="(item,index) in timeHour" :key="index">{{item}}时</view>
+				    		    </picker-view-column>
+				    		    <picker-view-column>
+				    		        <view class="item" v-for="(item,index) in timeMin" :key="index">{{item}}分</view>
+				    		    </picker-view-column>
+				    		</picker-view>
+				    	</view>
+				    </swiper-item>
+				</swiper>
+			</view>
+			
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	name:"time-slot",
+	props: {
+		title: {
+		    type: String,
+		    default: () => {
+		       return "选择时间段";
+		    }
+		},
+	},
+    data() {
+        return {
+			timeMaskShow:false,//遮罩
+			isShow:false,//显示
+			typeList:["开始时间","结束时间"],
+			typeIndex:0,//下标
+			startvalue:[14,0],//默认下标,14时 00分
+			endvalue:[15,0],//默认下标,15时 00分
+			indicatorStyle: 'height: 50px;',
+			// timeList:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],
+			timeHour:[],
+			timeMin:[],//分钟可选项
+        };
+    },
+    mounted() {
+		//获取时分
+		let timeHour = [] 
+		let timeMin = [] 
+		for (let i = 0; i < 24; i++) {
+		    timeHour.push(this.formatNumber(i))
+	    }
+		for (let i = 0; i < 60; i++) {
+		    timeMin.push(this.formatNumber(i))
+		}
+		this.timeHour = timeHour
+		this.timeMin = timeMin
+	},
+    methods: {
+		//看看是不是有两位数
+		formatNumber(n) {
+			n = n.toString()
+			return n[1] ? n : '0' + n
+		},
+		//开始选择
+		bindstartChange(e){
+			console.log(e)
+			this.startvalue = e.detail.value
+		},
+		//结束选择
+		bindendChange(e){
+			console.log(e)
+			this.endvalue = e.detail.value
+		},
+        /**
+         * 关闭弹窗
+         */
+        close() {
+        	this.timeMaskShow = false
+        	this.$nextTick(() => {
+        		setTimeout(() => {
+        			this.isShow = false
+        			this.$emit('close')
+        		}, 300)
+        	})
+        },
+        /**
+         * 确认按钮
+         */
+        confirm() {
+			if(this.typeIndex==0){
+				this.endvalue = [this.startvalue[0]+1,0]
+				this.typeIndex = 1
+			}else{
+				if(this.startvalue[0]<this.endvalue[0] || (this.startvalue[0]==this.endvalue[0]&&this.startvalue[1]<this.endvalue[1])){
+					var obj = {
+						start:{
+							hour:this.timeHour[this.startvalue[0]],
+							min:this.timeMin[this.startvalue[1]]
+						},
+						end:{
+							hour:this.timeHour[this.endvalue[0]],
+							min:this.timeMin[this.endvalue[1]]
+						}
+					}
+					this.$emit('confirm',obj)
+					this.close()
+				}else{
+					uni.showToast({
+						icon:"error",
+						title:"结束时间要大于开始时间"
+					})
+				}
+				
+			}
+        },
+		/**
+		 * 打开日历弹窗
+		 */
+		open() {
+			this.typeIndex = 0
+			this.isShow = true
+			this.$nextTick(() => {
+				setTimeout(() => {
+					this.timeMaskShow = true
+				}, 50)
+			})
+		},
+		//栏目选择
+		handleType(index){
+			if(index!=this.typeIndex){
+				if(index==1){
+					this.endvalue = [this.startvalue[0]+1,0]
+				}
+				this.typeIndex = index
+			}
+		}
+		
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+.time_mask {
+	position: fixed;
+	bottom: 0;
+	top: 0;
+	left: 0;
+	right: 0;
+	background-color: $uni-bg-color-mask;
+	transition-property: opacity;
+	transition-duration: 0.3s;
+	opacity: 0;
+	/* #ifndef APP-NVUE */
+	z-index: 99;
+	/* #endif */
+}
+.yx_time_slot{
+	background-color: #FFFFFF;
+	width: 100%;
+	height: 750rpx;
+	position: fixed;
+	bottom: calc(var(--window-bottom));
+	left: 0;
+	right: 0;
+	z-index: 999;
+	transition-property: transform;
+	transition-duration: 0.3s;
+	transform: translateY(460px);
+	.time_top_box{
+		width: 100%;
+		height: 80rpx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		.time_close,.time_comfirm{
+			width: 100rpx;
+			color: #999999;
+			font-size: 28rpx;
+			font-weight: 400;
+			text-align: center;
+		}
+		.time_comfirm{
+			color: #4360F7;
+		}
+		.time_text{
+			flex: 1;
+			font-size: 30rpx;
+			font-weight: 800;
+			text-align: center;
+		}
+	}
+}
+.uni-timer-mask-show{
+	opacity: 1;
+}
+/* 从下往上弹窗动画 */
+.fadelogIn1 {
+	// -webkit-animation: fadelogIn 0.5s;
+	// animation: fadelogIn 0.5s;
+	transform: translateY(0);
+}
+.typelist{
+	width: 100%;
+	height: 70rpx;
+	display: flex;
+	align-items: center;
+	.typeobj{
+		width: 158rpx;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		.text{
+			height: 65rpx;
+			line-height: 65rpx;
+			font-size: 28rpx;
+			color: #333333;
+		}
+		.line{
+			width: 1rpx;
+			height: 5rpx;
+		}
+	}
+	.typeobj_hover{
+		.text{
+			font-weight: 600;
+		}
+		.line{
+			width: 88rpx;
+			transition: width .5s;
+			background-color: #4360F7;
+		}
+	}
+}
+.yx_timer_sel{
+	width: 100%;
+	margin-top: 38rpx;
+	.sel_swiper{
+		// width: 80%;
+		// margin: 0 auto;
+		height: 500rpx;
+	}
+	.sel_swiper-item{
+		height: 500rpx;
+		.item {
+		    height: 50px;
+			display: flex;
+		    align-items: center;
+		    justify-content: center;
+		    text-align: center;
+		}
+	}
+}
+</style>

+ 2 - 0
sleep/main.js

@@ -31,6 +31,8 @@ Vue.component('uni-steps', UniSteps)
 import {UniSection} from './uni_modules/uni-section/components/uni-section/uni-section.vue'
 Vue.component('uni-section', UniSection)
 
+import {timeSlot} from '@/components/wanghexu-timeslot/wanghexu-timeslot.vue'
+Vue.component('time-slot', timeSlot)
 
 const app = new Vue({
 	...App,

+ 4 - 2
sleep/pages.json

@@ -111,8 +111,10 @@
         }
         ,{
             "path" : "pages/detail/detail",
-            "style" : {
-                "navigationBarTitleText": "nvue-swiper"
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
             }
             
         }

+ 196 - 22
sleep/pages/alertSetting/alertSetting.vue

@@ -1,7 +1,13 @@
 <template>
 	<view class="flex-col justify-start page">
 	  <cu-custom isBack="true" bgColor="#000000"><view slot="content" style="color: #FFFFFF">UU睡眠</view></cu-custom>
-
+	  
+	  <time-slot
+	      ref="timeslot"
+	      :title="'选择时间段'"
+	      @confirm="confirmTime">
+	  </time-slot>
+		
 	  <view class="flex-col justify-start section">
 		  
 	    <view class="flex-col section_2 space-y-32">
@@ -22,12 +28,17 @@
 	            <view class="flex-row justify-between items-center list-item" :key="i" v-for="(item, i) in list1">
 	              <text class="font_2 text_3">心率过速提醒值</text>
 	              <view class="flex-row items-center group_3 space-x-6">
-	                <text class="font_3">110</text>
-	                <text class="font_4">次/分钟</text>
-	                <image
-	                  class="shrink-0 image_7"
-					  src="../../static/iconRight.png"
-	                />
+					<picker @change="bindHeartPickerChange" :value="index" :range="array">
+						<view class="uni-input">
+							<text class="font_3">{{array[index]}}</text>
+							<text class="font_4">次/分钟</text>
+							<image
+							  class="shrink-0 image_7"
+							  src="../../static/iconRight.png"
+							/>
+						</view>
+					</picker>  
+					  
 	              </view>
 	            </view>
 	          </view>
@@ -50,12 +61,17 @@
 	            <view class="flex-row justify-between items-center list-item" :key="i" v-for="(item, i) in list2">
 	              <text class="font_2 text_3">呼吸率过速提醒值</text>
 	              <view class="flex-row items-center space-x-6">
-	                <text class="font_3">110</text>
-	                <text class="font_4">次/分钟</text>
-	                <image
-	                  class="shrink-0 image_7"
-	                  src="../../static/iconRight.png"
-	                />
+	                <picker @change="bindBreathPickerChange" :value="index" :range="array">
+	                	<view class="uni-input">
+							<text class="font_3">{{array[index]}}</text>
+							<text class="font_4">次/分钟</text>
+							<image
+							  class="shrink-0 image_7"
+							  src="../../static/iconRight.png"
+							/>
+						</view>
+	                </picker>
+					
 	              </view>
 	            </view>
 	          </view>
@@ -80,7 +96,7 @@
 	          <view class="flex-col group_7">
 	            <view class="flex-row justify-between items-center group_8">
 	              <text class="font_2 text_3">离床预警区间</text>
-	              <view class="flex-row items-center group_9 space-x-20">
+	              <view @click="handleTimeChoose" class="flex-row items-center group_9 space-x-20">
 	                <text class="font_3">22:00 - 6:00</text>
 	                <image
 	                  class="shrink-0 image_7"
@@ -91,12 +107,17 @@
 	            <view class="flex-row justify-between items-center group_10">
 	              <text class="font_2 text_3">离床未归提醒</text>
 	              <view class="flex-row items-center group_11 space-x-8">
-	                <text class="font_3">60</text>
-	                <text class="font_4">分钟</text>
-	                <image
-	                  class="shrink-0 image_7"
-	                  src="../../static/iconRight.png"
-	                />
+					<picker @change="bindBedPickerChange" :value="index" :range="array">
+						<view class="uni-input">
+							<text class="font_3">{{array[index]}}</text>
+							<text class="font_4">分钟</text>
+							<image
+							  class="shrink-0 image_7"
+							  src="../../static/iconRight.png"
+							/>
+						</view>
+					</picker>    
+					  
 	              </view>
 	            </view>
 	          </view>
@@ -149,15 +170,44 @@
 </template>
 
 <script>
+	import timeSlot from "@/components/wanghexu-timeslot/wanghexu-timeslot.vue"
+
 	export default {
 		data() {
 			return {
+				value: 0,
 				list1: [null, null],
-				list2: [null, null]
+				list2: [null, null],
+				title: 'picker',
+				array: ['90', '91', '92', '93', '94'],
+				index: 0
 			}
 		},
+		components: {
+			timeSlot
+		},
 		methods: {
-			
+			handleInput() {
+				this.$refs.inputDialog.open()
+			},
+			handleTimeChoose() {
+				this.$refs.timeslot.open();
+			},
+			confirmTime(val) {
+				
+			},
+			bindBreathPickerChange: function(e) {
+			    console.log('picker发送选择改变,携带值为', e.detail.value)
+			    this.index = e.detail.value
+			},
+			bindHeartPickerChange: function(e) {
+			    console.log('picker发送选择改变,携带值为', e.detail.value)
+			    this.index = e.detail.value
+			},
+			bindBedPickerChange: function(e) {
+			    console.log('picker发送选择改变,携带值为', e.detail.value)
+			    this.index = e.detail.value
+			}
 		}
 	}
 </script>
@@ -478,4 +528,128 @@
     }
   }
 }
+@mixin flex {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	@mixin height {
+		/* #ifndef APP-NVUE */
+		height: 100%;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		flex: 1;
+		/* #endif */
+	}
+
+	.box {
+		@include flex;
+	}
+
+	.button {
+		@include flex;
+		align-items: center;
+		justify-content: center;
+		flex: 1;
+		height: 35px;
+		margin: 0 5px;
+		border-radius: 5px;
+	}
+
+	.example-body {
+		background-color: #fff;
+		padding: 10px 0;
+	}
+
+	.button-text {
+		color: #fff;
+		font-size: 12px;
+	}
+
+	.popup-content {
+		@include flex;
+		align-items: center;
+		justify-content: center;
+		padding: 15px;
+		height: 50px;
+		background-color: #fff;
+	}
+
+	.popup-height {
+		@include height;
+		width: 200px;
+	}
+
+	.text {
+		font-size: 12px;
+		color: #333;
+	}
+
+	.popup-success {
+		color: #fff;
+		background-color: #e1f3d8;
+	}
+
+	.popup-warn {
+		color: #fff;
+		background-color: #faecd8;
+	}
+
+	.popup-error {
+		color: #fff;
+		background-color: #fde2e2;
+	}
+
+	.popup-info {
+		color: #fff;
+		background-color: #f2f6fc;
+	}
+
+	.success-text {
+		color: #09bb07;
+	}
+
+	.warn-text {
+		color: #e6a23c;
+	}
+
+	.error-text {
+		color: #f56c6c;
+	}
+
+	.info-text {
+		color: #909399;
+	}
+
+	.dialog,
+	.share {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.dialog-box {
+		padding: 10px;
+	}
+
+	.dialog .button,
+	.share .button {
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+		margin: 0;
+		margin-top: 10px;
+		padding: 3px 0;
+		flex: 1;
+	}
+
+	.dialog-text {
+		font-size: 14px;
+		color: #333;
+	}
+
+
 </style>

+ 0 - 385
sleep/pages/detail/detail.nvue

@@ -1,385 +0,0 @@
-<template>
-	<view class="tabs">
-		<scroll-view ref="tabbar1" id="tab-bar" class="tab-bar" :scroll="false" :scroll-x="true" :show-scrollbar="false"
-			:scroll-into-view="scrollInto">
-			<view style="flex-direction: column;">
-				<view style="flex-direction: row;">
-					<view class="uni-tab-item" v-for="(tab,index) in tabList" :key="tab.id" :id="tab.id"
-						:ref="'tabitem'+index" :data-id="index" :data-current="index" @click="ontabtap">
-						<text class="uni-tab-item-title"
-							:class="tabIndex==index ? 'uni-tab-item-title-active' : ''">{{tab.name}}</text>
-					</view>
-				</view>
-				<view class="scroll-view-indicator">
-					<view ref="underline" class="scroll-view-underline" :class="isTap ? 'scroll-view-animation':''"
-						:style="{left: indicatorLineLeft + 'px', width: indicatorLineWidth + 'px'}"></view>
-				</view>
-			</view>
-		</scroll-view>
-		<view class="tab-bar-line"></view>
-		<swiper class="tab-view" ref="swiper1" id="tab-bar-view" :current="tabIndex" :duration="300"
-			@change="onswiperchange" @transition="onswiperscroll" @animationfinish="animationfinish"
-			@onAnimationEnd="animationfinish">
-			<swiper-item class="swiper-item" v-for="(page, index) in tabList" :key="index">
-				<swiper-page class="swiper-page" :pid="page.pageid" ref="page"></swiper-page>
-			</swiper-item>
-		</swiper>
-	</view>
-</template>
-
-<script>
-	// #ifdef APP-PLUS
-	const dom = weex.requireModule('dom');
-	// #endif
-
-	// 缓存每页最多
-	const MAX_CACHE_DATA = 100;
-
-	// 缓存页签数量
-	const MAX_CACHE_PAGE = 3;
-	const TAB_PRELOAD_OFFSET = 1;
-
-	import swiperPage from './nvue-swiper-page.nvue';
-
-	export default {
-		components: {
-			swiperPage
-		},
-		data() {
-			return {
-				tabList: [],
-				tabIndex: 0,
-				cacheTab: [],
-				scrollInto: "",
-				indicatorLineLeft: 0,
-				indicatorLineWidth: 0,
-				isTap: false,
-				showTitleView: true,
-				pageId: "page",
-				refreshing: false,
-				refreshText: "",
-				refreshFlag: false
-			}
-		},
-		onLoad() {
-			for (var i = 0; i < 6; i++) {
-				this.tabList.push({
-					id: "tab" + i,
-					name: 'Tab ' + (i + 1),
-					pageid: i + 1
-				})
-			}
-		},
-		onReady() {
-			this._lastTabIndex = 0;
-			this.swiperWidth = 0;
-			this.tabbarWidth = 0;
-			this.tabListSize = {};
-			this._touchTabIndex = 0;
-
-			this.pageList = this.$refs.page;
-			this.selectorQuery();
-		},
-		methods: {
-			ontabtap(e) {
-				let index = e.target.dataset.current || e.currentTarget.dataset.current;
-				//let offsetIndex = this._touchTabIndex = Math.abs(index - this._lastTabIndex) > 1;
-
-				// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-QQ
-				this.isTap = true;
-				var currentSize = this.tabListSize[index];
-				this.updateIndicator(currentSize.left, currentSize.width);
-				this._touchTabIndex = index;
-				// #endif
-
-				this.switchTab(index);
-			},
-			onswiperchange(e) {
-				// 注意:百度小程序会触发2次
-
-				// #ifndef APP-PLUS || H5 || MP-WEIXIN || MP-QQ
-				let index = e.target.current || e.detail.current;
-				this.switchTab(index);
-				// #endif
-			},
-			onswiperscroll(e) {
-				if (this.isTap) {
-					return;
-				}
-
-				var offsetX = e.detail.dx;
-				var preloadIndex = this._lastTabIndex;
-				if (offsetX > TAB_PRELOAD_OFFSET) {
-					preloadIndex++;
-				} else if (offsetX < -TAB_PRELOAD_OFFSET) {
-					preloadIndex--;
-				}
-				if (preloadIndex === this._lastTabIndex || preloadIndex < 0 || preloadIndex > this.pageList.length - 1) {
-					return;
-				}
-				if (this.pageList[preloadIndex].dataList.length === 0) {
-					this.loadTabData(preloadIndex);
-				}
-
-				// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-QQ
-				var percentage = Math.abs(this.swiperWidth / offsetX);
-				var currentSize = this.tabListSize[this._lastTabIndex];
-				var preloadSize = this.tabListSize[preloadIndex];
-				var lineL = currentSize.left + (preloadSize.left - currentSize.left) / percentage;
-				var lineW = currentSize.width + (preloadSize.width - currentSize.width) / percentage;
-				this.updateIndicator(lineL, lineW);
-				// #endif
-			},
-			animationfinish(e) {
-				// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-QQ
-				let index = e.detail.current;
-				if (this._touchTabIndex === index) {
-					this.isTap = false;
-				}
-				this._lastTabIndex = index;
-				this.switchTab(index);
-				this.updateIndicator(this.tabListSize[index].left, this.tabListSize[index].width);
-				// #endif
-			},
-			selectorQuery() {
-				// #ifdef APP-NVUE
-				// 查询 tabbar 宽度
-				uni.createSelectorQuery().in(this).select('#tab-bar').boundingClientRect().exec(rect => {
-					this.tabbarWidth = rect[0].width;
-				});
-				// 查询 tabview 宽度
-				uni.createSelectorQuery().in(this).select('#tab-bar-view').boundingClientRect().exec(rect => {
-					this.swiperWidth = rect[0].width;
-				});
-
-				// 因 nvue 暂不支持 class 查询
-				var queryTabSize = uni.createSelectorQuery().in(this);
-				for (var i = 0; i < this.tabList.length; i++) {
-					queryTabSize.select('#' + this.tabList[i].id).boundingClientRect();
-				}
-				queryTabSize.exec(rects => {
-					rects.forEach((rect) => {
-						this.tabListSize[rect.dataset.id] = rect;
-					})
-					this.updateIndicator(this.tabListSize[this.tabIndex].left, this.tabListSize[this.tabIndex]
-						.width);
-					this.switchTab(this.tabIndex);
-				});
-				// #endif
-
-				// #ifdef MP-WEIXIN || H5 || MP-QQ
-				uni.createSelectorQuery().in(this).select('.tab-view').fields({
-					dataset: true,
-					size: true,
-				}, (res) => {
-					this.swiperWidth = res.width;
-				}).exec();
-				uni.createSelectorQuery().in(this).selectAll('.uni-tab-item').boundingClientRect((rects) => {
-					rects.forEach((rect) => {
-						this.tabListSize[rect.dataset.id] = rect;
-					})
-					this.updateIndicator(this.tabListSize[this.tabIndex].left, this.tabListSize[this.tabIndex]
-						.width);
-				}).exec();
-				// #endif
-			},
-			updateIndicator(left, width) {
-				this.indicatorLineLeft = left;
-				this.indicatorLineWidth = width;
-			},
-			switchTab(index) {
-				if (this.pageList[index].dataList.length === 0) {
-					this.loadTabData(index);
-				}
-
-				if (this.tabIndex === index) {
-					return;
-				}
-
-				// 缓存 tabId
-				if (this.pageList[this.tabIndex].dataList.length > MAX_CACHE_DATA) {
-					let isExist = this.cacheTab.indexOf(this.tabIndex);
-					if (isExist < 0) {
-						this.cacheTab.push(this.tabIndex);
-					}
-				}
-
-				this.tabIndex = index;
-
-				// #ifdef APP-NVUE
-				this.scrollTabTo(index);
-				// #endif
-				// #ifndef APP-NVUE
-				this.scrollInto = this.tabList[index].id;
-				// #endif
-
-				// 释放 tabId
-				if (this.cacheTab.length > MAX_CACHE_PAGE) {
-					let cacheIndex = this.cacheTab[0];
-					this.clearTabData(cacheIndex);
-					this.cacheTab.splice(0, 1);
-				}
-			},
-			scrollTabTo(index) {
-				const el = this.$refs['tabitem' + index][0];
-				let offset = 0;
-				// TODO fix ios offset
-				if (index > 0) {
-					offset = this.tabbarWidth / 2 - this.tabListSize[index].width / 2;
-					if (this.tabListSize[index].right < this.tabbarWidth / 2) {
-						offset = this.tabListSize[0].width;
-					}
-				}
-				dom.scrollToElement(el, {
-					offset: -offset
-				});
-			},
-			loadTabData(index) {
-				this.pageList[index].loadData();
-			},
-			clearTabData(index) {
-				this.pageList[index].clear();
-			},
-			onrefresh(e) {
-				this.refreshing = true;
-				this.refreshText = "刷新中...";
-				setTimeout(() => {
-					this.refreshing = false;
-					this.refreshFlag = false;
-					this.refreshText = "已刷新";
-				}, 2000)
-			},
-			onpullingdown(e) {
-				if (this.refreshing) {
-					return;
-				}
-
-				this.pulling = false;
-				if (Math.abs(e.pullingDistance) > Math.abs(e.viewHeight)) {
-					this.refreshFlag = true;
-					this.refreshText = "释放立即刷新";
-				} else {
-					this.refreshFlag = false;
-					this.refreshText = "下拉可以刷新";
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-	/* #ifndef APP-PLUS */
-	page {
-		width: 100%;
-		min-height: 100%;
-		display: flex;
-	}
-
-	/* #endif */
-
-	.page {
-		flex: 1;
-	}
-
-	.flexible-view {
-		background-color: #f823ff;
-	}
-
-	.tabs {
-		flex: 1;
-		flex-direction: column;
-		overflow: hidden;
-		background-color: #ffffff;
-		/* #ifdef MP-ALIPAY || MP-BAIDU */
-		height: 100vh;
-		/* #endif */
-	}
-
-	.tab-bar {
-		width: 750upx;
-		height: 84upx;
-		flex-direction: row;
-		/* #ifndef APP-PLUS */
-		white-space: nowrap;
-		/* #endif */
-	}
-
-	/* #ifndef APP-NVUE */
-	.tab-bar ::-webkit-scrollbar {
-		display: none;
-		width: 0 !important;
-		height: 0 !important;
-		-webkit-appearance: none;
-		background: transparent;
-	}
-
-	/* #endif */
-
-	.scroll-view-indicator {
-		position: relative;
-		height: 2px;
-		background-color: transparent;
-	}
-
-	.scroll-view-underline {
-		position: absolute;
-		top: 0;
-		bottom: 0;
-		width: 0;
-		background-color: #007AFF;
-	}
-
-	.scroll-view-animation {
-		transition-duration: 0.2s;
-		transition-property: left;
-	}
-
-	.tab-bar-line {
-		height: 1upx;
-		background-color: #cccccc;
-	}
-
-	.tab-view {
-		flex: 1;
-	}
-
-	.uni-tab-item {
-		/* #ifndef APP-PLUS */
-		display: inline-block;
-		/* #endif */
-		flex-wrap: nowrap;
-		padding-left: 25px;
-		padding-right: 25px;
-	}
-
-	.uni-tab-item-title {
-		color: #555;
-		font-size: 30upx;
-		height: 80upx;
-		line-height: 80upx;
-		flex-wrap: nowrap;
-		/* #ifndef APP-PLUS */
-		white-space: nowrap;
-		/* #endif */
-	}
-
-	.uni-tab-item-title-active {
-		color: #007AFF;
-	}
-
-	.swiper-item {
-		flex: 1;
-		flex-direction: column;
-	}
-
-	.swiper-page {
-		flex: 1;
-		flex-direction: column;
-		position: absolute;
-		left: 0;
-		top: 0;
-		right: 0;
-		bottom: 0;
-	}
-
-</style>

+ 22 - 0
sleep/pages/detail/detail.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 0 - 106
sleep/pages/detail/nvue-swiper-page.nvue

@@ -1,106 +0,0 @@
-<template>
-	<list class="list" :offset-accuracy="5" :bounce="false" isSwiperList="true">
-		<refresh class="refresh" @refresh="onrefresh" @pullingdown="onpullingdown"
-			:display="refreshing ? 'show' : 'hide'">
-			<div class="refresh-view">
-				<text class="loading-text">{{refreshText}}</text>
-			</div>
-		</refresh>
-		<cell v-for="(item, index) in dataList" :key="item.id" @click="onclick">
-			<view class="list-item">
-				<text>{{item.name}}</text>
-			</view>
-		</cell>
-	</list>
-</template>
-
-<script>
-	export default {
-		props: {
-			pid: {
-				type: [Number, String],
-				default: ''
-			},
-			parentId: {
-				type: String,
-				default: ''
-			}
-		},
-		data() {
-			return {
-				scrollable: true,
-				dataList: [],
-				refreshing: false,
-				refreshText: "",
-				refreshFlag: false
-			}
-		},
-		created() {
-			for (var i = 1; i < 32; i++) {
-				this.dataList.push({
-					id: i,
-					name: i
-				});
-			}
-		},
-		methods: {
-			onclick(e) {
-				console.log("onclick");
-			},
-			loadData() {
-				// 首次激活时被调用
-			},
-			clear() {
-				// 释放数据时被调用,参考 swiper-list 缓存配置
-				this.dataList.length = 0;
-			},
-			onrefresh(e) {
-				this.refreshing = true;
-				this.refreshText = "刷新中...";
-				setTimeout(() => {
-					this.refreshing = false;
-					this.refreshFlag = false;
-					this.refreshText = "已刷新";
-				}, 2000)
-			},
-			onpullingdown(e) {
-				if (this.refreshing) {
-					return;
-				}
-
-				this.pulling = false;
-				if (Math.abs(e.pullingDistance) > Math.abs(e.viewHeight)) {
-					this.refreshFlag = true;
-					this.refreshText = "释放立即刷新";
-				} else {
-					this.refreshFlag = false;
-					this.refreshText = "下拉可以刷新";
-				}
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.refresh-view {
-		width: 750rpx;
-		height: 80px;
-		flex-direction: row;
-		align-items: center;
-		justify-content: center;
-	}
-
-	.list {
-		flex: 1;
-		background-color: #ebebeb;
-	}
-
-	.list-item {
-		margin-left: 12px;
-		margin-right: 12px;
-		margin-top: 12px;
-		padding: 20px;
-		background-color: #fff;
-		border-radius: 5px;
-	}
-</style>

+ 52 - 4
sleep/pages/report/report.vue

@@ -1,6 +1,12 @@
 <template>
 	<view class="report-container">
+		
 		<cu-custom bgColor="#000000"><view slot="content" style="color: #FFFFFF">UU睡眠</view></cu-custom>
+		<time-slot
+		    ref="timeslot"
+		    :title="'选择时间段'"
+		    @confirm="confirmTime">
+		</time-slot>
 		
 		<view v-if="!isDeviceAdded" class="flex-col page">
 		  <view class="flex-col flex-auto image-wrapper_2">
@@ -32,14 +38,17 @@
 									<image class="shrink-0 image_4"
 										src="../../static/report/reportIconLeft.png"
 									/>
-									<text class="font_2 text_2">2020-08-16</text>
+									<picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange">
+										<text class="font_2 text_2">{{date}}</text>
+									</picker>
+
 									<image class="image_4"
 										src="../../static/report/reportIconRight.png"
 									/>
 								</view>
 							</view>
 							
-							<view class="flex-row items-center shrink-0 section_4 space-x-10">
+							<view @click="handleTimeChoose" class="flex-row items-center shrink-0 section_4 space-x-10">
 								<text class="font_2 text_3">23:30~05:42</text>
 								<image
 									class="shrink-0 image_5"
@@ -376,18 +385,57 @@
 
 <script>
 	import * as echarts from '@/uni_modules/lime-echart/static/echarts.min'
+	import timeSlot from "@/components/wanghexu-timeslot/wanghexu-timeslot.vue"
 
 	export default {
 		data() {
+			const currentDate = this.getDate({
+			    format: true
+			})
 			return {
-				isDeviceAdded: true
+				isDeviceAdded: true,
+				date: currentDate
 			};
 		},
 		onReady: function() {
 			
 		},
+		components: {
+			timeSlot
+		},
+		computed: {
+		    startDate() {
+				return this.getDate('start');
+			},
+		    endDate() {
+		        return this.getDate('end');
+		    }
+		},
 		methods: {
-			
+			handleTimeChoose() {
+				this.$refs.timeslot.open();
+			},
+			confirmTime(val) {
+				
+			},
+			bindDateChange: function(e) {
+			    this.date = e.detail.value
+		    },
+			getDate(type) {
+			    const date = new Date();
+			    let year = date.getFullYear();
+			    let month = date.getMonth() + 1;
+			    let day = date.getDate();
+			    		
+			    if (type === 'start') {
+			        year = year - 60;
+			    } else if (type === 'end') {
+			        year = year + 2;
+			    }
+			    month = month > 9 ? month : '0' + month;
+			    day = day > 9 ? day : '0' + day;
+			    return `${year}-${month}-${day}`;    
+			}            
 		}
 	}
 </script>

+ 68 - 0
sleep/uni_modules/uni-popup/changelog.md

@@ -0,0 +1,68 @@
+## 1.8.3(2023-04-17)
+- 修复 uni-popup 重复打开时的 bug
+## 1.8.2(2023-02-02)
+- uni-popup-dialog 组件新增 inputType 属性
+## 1.8.1(2022-12-01)
+- 修复 nvue 下 v-show 报错
+## 1.8.0(2022-11-29)
+- 优化 主题样式
+## 1.7.9(2022-04-02)
+- 修复 弹出层内部无法滚动的bug
+## 1.7.8(2022-03-28)
+- 修复 小程序中高度错误的bug
+## 1.7.7(2022-03-17)
+- 修复 快速调用open出现问题的Bug
+## 1.7.6(2022-02-14)
+- 修复 safeArea 属性不能设置为false的bug
+## 1.7.5(2022-01-19)
+- 修复 isMaskClick 失效的bug
+## 1.7.4(2022-01-19)
+- 新增 cancelText \ confirmText 属性 ,可自定义文本
+- 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色
+- 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题
+## 1.7.3(2022-01-13)
+- 修复 设置 safeArea 属性不生效的bug
+## 1.7.2(2021-11-26)
+- 优化 组件示例
+## 1.7.1(2021-11-26)
+- 修复 vuedoc 文字错误
+## 1.7.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup)
+## 1.6.2(2021-08-24)
+- 新增 支持国际化
+## 1.6.1(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 1.6.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.5.0(2021-06-23)
+- 新增 mask-click 遮罩层点击事件
+## 1.4.5(2021-06-22)
+- 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
+## 1.4.4(2021-06-18)
+- 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
+## 1.4.3(2021-06-08)
+- 修复 错误的 watch 字段
+- 修复 safeArea 属性不生效的问题
+- 修复 点击内容,再点击遮罩无法关闭的Bug
+## 1.4.2(2021-05-12)
+- 新增 组件示例地址
+## 1.4.1(2021-04-29)
+- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题
+## 1.4.0 (2021-04-29)
+- 新增 type 属性的 left\right 值,支持左右弹出
+- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗
+- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色
+- 新增 safeArea 属性,是否适配底部安全区
+- 修复 App\h5\微信小程序底部安全区占位不对的Bug
+- 修复 App 端弹出等待的Bug
+- 优化 提升低配设备性能,优化动画卡顿问题
+- 优化 更简单的组件自定义方式
+## 1.2.9(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 1.2.8(2021-02-05)
+- 调整为uni_modules目录规范
+## 1.2.7(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 支持 PC 端
+- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端

+ 45 - 0
sleep/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js

@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+  name: 'Keypress',
+  props: {
+    disable: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted () {
+    const keyNames = {
+      esc: ['Esc', 'Escape'],
+      tab: 'Tab',
+      enter: 'Enter',
+      space: [' ', 'Spacebar'],
+      up: ['Up', 'ArrowUp'],
+      left: ['Left', 'ArrowLeft'],
+      right: ['Right', 'ArrowRight'],
+      down: ['Down', 'ArrowDown'],
+      delete: ['Backspace', 'Delete', 'Del']
+    }
+    const listener = ($event) => {
+      if (this.disable) {
+        return
+      }
+      const keyName = Object.keys(keyNames).find(key => {
+        const keyName = $event.key
+        const value = keyNames[key]
+        return value === keyName || (Array.isArray(value) && value.includes(keyName))
+      })
+      if (keyName) {
+        // 避免和其他按键事件冲突
+        setTimeout(() => {
+          this.$emit(keyName, {})
+        }, 0)
+      }
+    }
+    document.addEventListener('keyup', listener)
+    this.$once('hook:beforeDestroy', () => {
+      document.removeEventListener('keyup', listener)
+    })
+  },
+	render: () => {}
+}
+// #endif

+ 275 - 0
sleep/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue

@@ -0,0 +1,275 @@
+<template>
+	<view class="uni-popup-dialog">
+		<view class="uni-dialog-title">
+			<text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{titleText}}</text>
+		</view>
+		<view v-if="mode === 'base'" class="uni-dialog-content">
+			<slot>
+				<text class="uni-dialog-content-text">{{content}}</text>
+			</slot>
+		</view>
+		<view v-else class="uni-dialog-content">
+			<slot>
+				<input class="uni-dialog-input" v-model="val" :type="inputType" :placeholder="placeholderText" :focus="focus" >
+			</slot>
+		</view>
+		<view class="uni-dialog-button-group">
+			<view class="uni-dialog-button" @click="closeDialog">
+				<text class="uni-dialog-button-text">{{closeText}}</text>
+			</view>
+			<view class="uni-dialog-button uni-border-left" @click="onOk">
+				<text class="uni-dialog-button-text uni-button-color">{{okText}}</text>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import popup from '../uni-popup/popup.js'
+	import {
+	initVueI18n
+	} from '@dcloudio/uni-i18n'
+	import messages from '../uni-popup/i18n/index.js'
+	const {	t } = initVueI18n(messages)
+	/**
+	 * PopUp 弹出层-对话框样式
+	 * @description 弹出层-对话框样式
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} value input 模式下的默认值
+	 * @property {String} placeholder input 模式下输入提示
+	 * @property {String} type = [success|warning|info|error] 主题样式
+	 *  @value success 成功
+	 * 	@value warning 提示
+	 * 	@value info 消息
+	 * 	@value error 错误
+	 * @property {String} mode = [base|input] 模式、
+	 * 	@value base 基础对话框
+	 * 	@value input 可输入对话框
+	 * @property {String} content 对话框内容
+	 * @property {Boolean} beforeClose 是否拦截取消事件
+	 * @event {Function} confirm 点击确认按钮触发
+	 * @event {Function} close 点击取消按钮触发
+	 */
+
+	export default {
+		name: "uniPopupDialog",
+		mixins: [popup],
+		emits:['confirm','close'],
+		props: {
+			inputType:{
+				type: String,
+				default: 'text'
+			},
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			placeholder: {
+				type: [String, Number],
+				default: ''
+			},
+			type: {
+				type: String,
+				default: 'error'
+			},
+			mode: {
+				type: String,
+				default: 'base'
+			},
+			title: {
+				type: String,
+				default: ''
+			},
+			content: {
+				type: String,
+				default: ''
+			},
+			beforeClose: {
+				type: Boolean,
+				default: false
+			},
+			cancelText:{
+				type: String,
+				default: ''
+			},
+			confirmText:{
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				dialogType: 'error',
+				focus: false,
+				val: ""
+			}
+		},
+		computed: {
+			okText() {
+				return this.confirmText || t("uni-popup.ok")
+			},
+			closeText() {
+				return this.cancelText || t("uni-popup.cancel")
+			},
+			placeholderText() {
+				return this.placeholder || t("uni-popup.placeholder")
+			},
+			titleText() {
+				return this.title || t("uni-popup.title")
+			}
+		},
+		watch: {
+			type(val) {
+				this.dialogType = val
+			},
+			mode(val) {
+				if (val === 'input') {
+					this.dialogType = 'info'
+				}
+			},
+			value(val) {
+				this.val = val
+			}
+		},
+		created() {
+			// 对话框遮罩不可点击
+			// this.popup.disableMask()
+			// this.popup.closeMask()
+			if (this.mode === 'input') {
+				this.dialogType = 'info'
+				this.val = this.value
+			} else {
+				this.dialogType = this.type
+			}
+		},
+		mounted() {
+			this.focus = true
+		},
+		methods: {
+			/**
+			 * 点击确认按钮
+			 */
+			onOk() {
+				if (this.mode === 'input'){
+					this.$emit('confirm', this.val)
+				}else{
+					this.$emit('confirm')
+				}
+				if(this.beforeClose) return
+				// this.popup.close()
+			},
+			/**
+			 * 点击取消按钮
+			 */
+			closeDialog() {
+				this.$emit('close')
+				if(this.beforeClose) return
+				// this.popup.close()
+			},
+			close(){
+				// this.popup.close()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	.uni-popup-dialog {
+		width: 300px;
+		border-radius: 11px;
+		background-color: #fff;
+	}
+
+	.uni-dialog-title {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		padding-top: 25px;
+	}
+
+	.uni-dialog-title-text {
+		font-size: 16px;
+		font-weight: 500;
+	}
+
+	.uni-dialog-content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		padding: 20px;
+	}
+
+	.uni-dialog-content-text {
+		font-size: 14px;
+		color: #6C6C6C;
+	}
+
+	.uni-dialog-button-group {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		border-top-color: #f5f5f5;
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-dialog-button {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+
+		flex: 1;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 45px;
+	}
+
+	.uni-border-left {
+		border-left-color: #f0f0f0;
+		border-left-style: solid;
+		border-left-width: 1px;
+	}
+
+	.uni-dialog-button-text {
+		font-size: 16px;
+		color: #333;
+	}
+
+	.uni-button-color {
+		color: #007aff;
+	}
+
+	.uni-dialog-input {
+		flex: 1;
+		font-size: 14px;
+		border: 1px #eee solid;
+		height: 40px;
+		padding: 0 10px;
+		border-radius: 5px;
+		color: #555;
+	}
+
+	.uni-popup__success {
+		color: #4cd964;
+	}
+
+	.uni-popup__warn {
+		color: #f0ad4e;
+	}
+
+	.uni-popup__error {
+		color: #dd524d;
+	}
+
+	.uni-popup__info {
+		color: #909399;
+	}
+</style>

+ 143 - 0
sleep/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue

@@ -0,0 +1,143 @@
+<template>
+	<view class="uni-popup-message">
+		<view class="uni-popup-message__box fixforpc-width" :class="'uni-popup__'+type">
+			<slot>
+				<text class="uni-popup-message-text" :class="'uni-popup__'+type+'-text'">{{message}}</text>
+			</slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	import popup from '../uni-popup/popup.js'
+	/**
+	 * PopUp 弹出层-消息提示
+	 * @description 弹出层-消息提示
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} type = [success|warning|info|error] 主题样式
+	 *  @value success 成功
+	 * 	@value warning 提示
+	 * 	@value info 消息
+	 * 	@value error 错误
+	 * @property {String} message 消息提示文字
+	 * @property {String} duration 显示时间,设置为 0 则不会自动关闭
+	 */
+
+	export default {
+		name: 'uniPopupMessage',
+		mixins:[popup],
+		props: {
+			/**
+			 * 主题 success/warning/info/error	  默认 success
+			 */
+			type: {
+				type: String,
+				default: 'success'
+			},
+			/**
+			 * 消息文字
+			 */
+			message: {
+				type: String,
+				default: ''
+			},
+			/**
+			 * 显示时间,设置为 0 则不会自动关闭
+			 */
+			duration: {
+				type: Number,
+				default: 3000
+			},
+			maskShow:{
+				type:Boolean,
+				default:false
+			}
+		},
+		data() {
+			return {}
+		},
+		created() {
+			this.popup.maskShow = this.maskShow
+			this.popup.messageChild = this
+		},
+		methods: {
+			timerClose(){
+				if(this.duration === 0) return
+				clearTimeout(this.timer) 
+				this.timer = setTimeout(()=>{
+					this.popup.close()
+				},this.duration)
+			}
+		}
+	}
+</script>
+<style lang="scss" >
+	.uni-popup-message {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+	}
+
+	.uni-popup-message__box {
+		background-color: #e1f3d8;
+		padding: 10px 15px;
+		border-color: #eee;
+		border-style: solid;
+		border-width: 1px;
+		flex: 1;
+	}
+
+	@media screen and (min-width: 500px) {
+		.fixforpc-width {
+			margin-top: 20px;
+			border-radius: 4px;
+			flex: none;
+			min-width: 380px;
+			/* #ifndef APP-NVUE */
+			max-width: 50%;
+			/* #endif */
+			/* #ifdef APP-NVUE */
+			max-width: 500px;
+			/* #endif */
+		}
+	}
+
+	.uni-popup-message-text {
+		font-size: 14px;
+		padding: 0;
+	}
+
+	.uni-popup__success {
+		background-color: #e1f3d8;
+	}
+
+	.uni-popup__success-text {
+		color: #67C23A;
+	}
+
+	.uni-popup__warn {
+		background-color: #faecd8;
+	}
+
+	.uni-popup__warn-text {
+		color: #E6A23C;
+	}
+
+	.uni-popup__error {
+		background-color: #fde2e2;
+	}
+
+	.uni-popup__error-text {
+		color: #F56C6C;
+	}
+
+	.uni-popup__info {
+		background-color: #F2F6FC;
+	}
+
+	.uni-popup__info-text {
+		color: #909399;
+	}
+</style>

+ 187 - 0
sleep/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue

@@ -0,0 +1,187 @@
+<template>
+	<view class="uni-popup-share">
+		<view class="uni-share-title"><text class="uni-share-title-text">{{shareTitleText}}</text></view>
+		<view class="uni-share-content">
+			<view class="uni-share-content-box">
+				<view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)">
+					<image class="uni-share-image" :src="item.icon" mode="aspectFill"></image>
+					<text class="uni-share-text">{{item.text}}</text>
+				</view>
+
+			</view>
+		</view>
+		<view class="uni-share-button-box">
+			<button class="uni-share-button" @click="close">{{cancelText}}</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import popup from '../uni-popup/popup.js'
+	import {
+	initVueI18n
+	} from '@dcloudio/uni-i18n'
+	import messages from '../uni-popup/i18n/index.js'
+	const {	t	} = initVueI18n(messages)
+	export default {
+		name: 'UniPopupShare',
+		mixins:[popup],
+		emits:['select'],
+		props: {
+			title: {
+				type: String,
+				default: ''
+			},
+			beforeClose: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				bottomData: [{
+						text: '微信',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/c2b17470-50be-11eb-b680-7980c8a877b8.png',
+						name: 'wx'
+					},
+					{
+						text: '支付宝',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d684ae40-50be-11eb-8ff1-d5dcf8779628.png',
+						name: 'wx'
+					},
+					{
+						text: 'QQ',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/e7a79520-50be-11eb-b997-9918a5dda011.png',
+						name: 'qq'
+					},
+					{
+						text: '新浪',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/0dacdbe0-50bf-11eb-8ff1-d5dcf8779628.png',
+						name: 'sina'
+					},
+					// {
+					// 	text: '百度',
+					// 	icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/1ec6e920-50bf-11eb-8a36-ebb87efcf8c0.png',
+					// 	name: 'copy'
+					// },
+					// {
+					// 	text: '其他',
+					// 	icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2e0fdfe0-50bf-11eb-b997-9918a5dda011.png',
+					// 	name: 'more'
+					// }
+				]
+			}
+		},
+		created() {},
+		computed: {
+			cancelText() {
+				return t("uni-popup.cancel")
+			},
+		shareTitleText() {
+				return this.title || t("uni-popup.shareTitle")
+			}
+		},
+		methods: {
+			/**
+			 * 选择内容
+			 */
+			select(item, index) {
+				this.$emit('select', {
+					item,
+					index
+				})
+				this.close()
+
+			},
+			/**
+			 * 关闭窗口
+			 */
+			close() {
+				if(this.beforeClose) return
+				this.popup.close()
+			}
+		}
+	}
+</script>
+<style lang="scss" >
+	.uni-popup-share {
+		background-color: #fff;
+		border-top-left-radius: 11px;
+		border-top-right-radius: 11px;
+	}
+	.uni-share-title {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		height: 40px;
+	}
+	.uni-share-title-text {
+		font-size: 14px;
+		color: #666;
+	}
+	.uni-share-content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		padding-top: 10px;
+	}
+
+	.uni-share-content-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: wrap;
+		width: 360px;
+	}
+
+	.uni-share-content-item {
+		width: 90px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		padding: 10px 0;
+		align-items: center;
+	}
+
+	.uni-share-content-item:active {
+		background-color: #f5f5f5;
+	}
+
+	.uni-share-image {
+		width: 30px;
+		height: 30px;
+	}
+
+	.uni-share-text {
+		margin-top: 10px;
+		font-size: 14px;
+		color: #3B4144;
+	}
+
+	.uni-share-button-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		padding: 10px 15px;
+	}
+
+	.uni-share-button {
+		flex: 1;
+		border-radius: 50px;
+		color: #666;
+		font-size: 16px;
+	}
+
+	.uni-share-button::after {
+		border-radius: 50px;
+	}
+</style>

+ 7 - 0
sleep/uni_modules/uni-popup/components/uni-popup/i18n/en.json

@@ -0,0 +1,7 @@
+{
+	"uni-popup.cancel": "cancel",
+	"uni-popup.ok": "ok",
+	"uni-popup.placeholder": "pleace enter",
+	"uni-popup.title": "Hint",
+	"uni-popup.shareTitle": "Share to"
+}

+ 8 - 0
sleep/uni_modules/uni-popup/components/uni-popup/i18n/index.js

@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+	en,
+	'zh-Hans': zhHans,
+	'zh-Hant': zhHant
+}

+ 7 - 0
sleep/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json

@@ -0,0 +1,7 @@
+{
+	"uni-popup.cancel": "取消",
+	"uni-popup.ok": "确定",
+	"uni-popup.placeholder": "请输入",
+		"uni-popup.title": "提示",
+		"uni-popup.shareTitle": "分享到"
+}

+ 7 - 0
sleep/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json

@@ -0,0 +1,7 @@
+{
+	"uni-popup.cancel": "取消",
+	"uni-popup.ok": "確定",
+	"uni-popup.placeholder": "請輸入",
+	"uni-popup.title": "提示",
+	"uni-popup.shareTitle": "分享到"
+}

+ 45 - 0
sleep/uni_modules/uni-popup/components/uni-popup/keypress.js

@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+  name: 'Keypress',
+  props: {
+    disable: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted () {
+    const keyNames = {
+      esc: ['Esc', 'Escape'],
+      tab: 'Tab',
+      enter: 'Enter',
+      space: [' ', 'Spacebar'],
+      up: ['Up', 'ArrowUp'],
+      left: ['Left', 'ArrowLeft'],
+      right: ['Right', 'ArrowRight'],
+      down: ['Down', 'ArrowDown'],
+      delete: ['Backspace', 'Delete', 'Del']
+    }
+    const listener = ($event) => {
+      if (this.disable) {
+        return
+      }
+      const keyName = Object.keys(keyNames).find(key => {
+        const keyName = $event.key
+        const value = keyNames[key]
+        return value === keyName || (Array.isArray(value) && value.includes(keyName))
+      })
+      if (keyName) {
+        // 避免和其他按键事件冲突
+        setTimeout(() => {
+          this.$emit(keyName, {})
+        }, 0)
+      }
+    }
+    document.addEventListener('keyup', listener)
+    // this.$once('hook:beforeDestroy', () => {
+    //   document.removeEventListener('keyup', listener)
+    // })
+  },
+	render: () => {}
+}
+// #endif

+ 26 - 0
sleep/uni_modules/uni-popup/components/uni-popup/popup.js

@@ -0,0 +1,26 @@
+
+export default {
+	data() {
+		return {
+			
+		}
+	},
+	created(){
+		this.popup = this.getParent()
+	},
+	methods:{
+		/**
+		 * 获取父元素实例
+		 */
+		getParent(name = 'uniPopup') {
+			let parent = this.$parent;
+			let parentName = parent.$options.name;
+			while (parentName !== name) {
+				parent = parent.$parent;
+				if (!parent) return false
+				parentName = parent.$options.name;
+			}
+			return parent;
+		},
+	}
+}

+ 473 - 0
sleep/uni_modules/uni-popup/components/uni-popup/uni-popup.vue

@@ -0,0 +1,473 @@
+<template>
+	<view v-if="showPopup" class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']">
+		<view @touchstart="touchstart">
+			<uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass"
+				:duration="duration" :show="showTrans" @click="onTap" />
+			<uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration"
+				:show="showTrans" @click="onTap">
+				<view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear">
+					<slot />
+				</view>
+			</uni-transition>
+		</view>
+		<!-- #ifdef H5 -->
+		<keypress v-if="maskShow" @esc="onTap" />
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	// #ifdef H5
+	import keypress from './keypress.js'
+	// #endif
+
+	/**
+	 * PopUp 弹出层
+	 * @description 弹出层组件,为了解决遮罩弹层的问题
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} type = [top|center|bottom|left|right|message|dialog|share] 弹出方式
+	 * 	@value top 顶部弹出
+	 * 	@value center 中间弹出
+	 * 	@value bottom 底部弹出
+	 * 	@value left		左侧弹出
+	 * 	@value right  右侧弹出
+	 * 	@value message 消息提示
+	 * 	@value dialog 对话框
+	 * 	@value share 底部分享示例
+	 * @property {Boolean} animation = [true|false] 是否开启动画
+	 * @property {Boolean} maskClick = [true|false] 蒙版点击是否关闭弹窗(废弃)
+	 * @property {Boolean} isMaskClick = [true|false] 蒙版点击是否关闭弹窗
+	 * @property {String}  backgroundColor 主窗口背景色
+	 * @property {String}  maskBackgroundColor 蒙版颜色
+	 * @property {Boolean} safeArea		   是否适配底部安全区
+	 * @event {Function} change 打开关闭弹窗触发,e={show: false}
+	 * @event {Function} maskClick 点击遮罩触发
+	 */
+
+	export default {
+		name: 'uniPopup',
+		components: {
+			// #ifdef H5
+			keypress
+			// #endif
+		},
+		emits: ['change', 'maskClick'],
+		props: {
+			// 开启动画
+			animation: {
+				type: Boolean,
+				default: true
+			},
+			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
+			// message: 消息提示 ; dialog : 对话框
+			type: {
+				type: String,
+				default: 'center'
+			},
+			// maskClick
+			isMaskClick: {
+				type: Boolean,
+				default: null
+			},
+			// TODO 2 个版本后废弃属性 ,使用 isMaskClick
+			maskClick: {
+				type: Boolean,
+				default: null
+			},
+			backgroundColor: {
+				type: String,
+				default: 'none'
+			},
+			safeArea: {
+				type: Boolean,
+				default: true
+			},
+			maskBackgroundColor: {
+				type: String,
+				default: 'rgba(0, 0, 0, 0.4)'
+			},
+		},
+
+		watch: {
+			/**
+			 * 监听type类型
+			 */
+			type: {
+				handler: function(type) {
+					if (!this.config[type]) return
+					this[this.config[type]](true)
+				},
+				immediate: true
+			},
+			isDesktop: {
+				handler: function(newVal) {
+					if (!this.config[newVal]) return
+					this[this.config[this.type]](true)
+				},
+				immediate: true
+			},
+			/**
+			 * 监听遮罩是否可点击
+			 * @param {Object} val
+			 */
+			maskClick: {
+				handler: function(val) {
+					this.mkclick = val
+				},
+				immediate: true
+			},
+			isMaskClick: {
+				handler: function(val) {
+					this.mkclick = val
+				},
+				immediate: true
+			},
+			// H5 下禁止底部滚动
+			showPopup(show) {
+				// #ifdef H5
+				// fix by mehaotian 处理 h5 滚动穿透的问题
+				document.getElementsByTagName('body')[0].style.overflow = show ? 'hidden' : 'visible'
+				// #endif
+			}
+		},
+		data() {
+			return {
+				duration: 300,
+				ani: [],
+				showPopup: false,
+				showTrans: false,
+				popupWidth: 0,
+				popupHeight: 0,
+				config: {
+					top: 'top',
+					bottom: 'bottom',
+					center: 'center',
+					left: 'left',
+					right: 'right',
+					message: 'top',
+					dialog: 'center',
+					share: 'bottom'
+				},
+				maskClass: {
+					position: 'fixed',
+					bottom: 0,
+					top: 0,
+					left: 0,
+					right: 0,
+					backgroundColor: 'rgba(0, 0, 0, 0.4)'
+				},
+				transClass: {
+					position: 'fixed',
+					left: 0,
+					right: 0
+				},
+				maskShow: true,
+				mkclick: true,
+				popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
+			}
+		},
+		computed: {
+			isDesktop() {
+				return this.popupWidth >= 500 && this.popupHeight >= 500
+			},
+			bg() {
+				if (this.backgroundColor === '' || this.backgroundColor === 'none') {
+					return 'transparent'
+				}
+				return this.backgroundColor
+			}
+		},
+		mounted() {
+			const fixSize = () => {
+				const {
+					windowWidth,
+					windowHeight,
+					windowTop,
+					safeArea,
+					screenHeight,
+					safeAreaInsets
+				} = uni.getSystemInfoSync()
+				this.popupWidth = windowWidth
+				this.popupHeight = windowHeight + (windowTop || 0)
+				// TODO fix by mehaotian 是否适配底部安全区 ,目前微信ios 、和 app ios 计算有差异,需要框架修复
+				if (safeArea && this.safeArea) {
+					// #ifdef MP-WEIXIN
+					this.safeAreaInsets = screenHeight - safeArea.bottom
+					// #endif
+					// #ifndef MP-WEIXIN
+					this.safeAreaInsets = safeAreaInsets.bottom
+					// #endif
+				} else {
+					this.safeAreaInsets = 0
+				}
+			}
+			fixSize()
+			// #ifdef H5
+			// window.addEventListener('resize', fixSize)
+			// this.$once('hook:beforeDestroy', () => {
+			// 	window.removeEventListener('resize', fixSize)
+			// })
+			// #endif
+		},
+		// #ifndef VUE3
+		// TODO vue2
+		destroyed() {
+			this.setH5Visible()
+		},
+		// #endif
+		// #ifdef VUE3
+		// TODO vue3
+		unmounted() {
+			this.setH5Visible()
+		},
+		// #endif
+		created() {
+			// this.mkclick =  this.isMaskClick || this.maskClick
+			if (this.isMaskClick === null && this.maskClick === null) {
+				this.mkclick = true
+			} else {
+				this.mkclick = this.isMaskClick !== null ? this.isMaskClick : this.maskClick
+			}
+			if (this.animation) {
+				this.duration = 300
+			} else {
+				this.duration = 0
+			}
+			// TODO 处理 message 组件生命周期异常的问题
+			this.messageChild = null
+			// TODO 解决头条冒泡的问题
+			this.clearPropagation = false
+			this.maskClass.backgroundColor = this.maskBackgroundColor
+		},
+		methods: {
+			setH5Visible() {
+				// #ifdef H5
+				// fix by mehaotian 处理 h5 滚动穿透的问题
+				document.getElementsByTagName('body')[0].style.overflow = 'visible'
+				// #endif
+			},
+			/**
+			 * 公用方法,不显示遮罩层
+			 */
+			closeMask() {
+				this.maskShow = false
+			},
+			/**
+			 * 公用方法,遮罩层禁止点击
+			 */
+			disableMask() {
+				this.mkclick = false
+			},
+			// TODO nvue 取消冒泡
+			clear(e) {
+				// #ifndef APP-NVUE
+				e.stopPropagation()
+				// #endif
+				this.clearPropagation = true
+			},
+
+			open(direction) {
+				// fix by mehaotian 处理快速打开关闭的情况
+				if (this.showPopup) {
+					return
+				}
+				let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share']
+				if (!(direction && innerType.indexOf(direction) !== -1)) {
+					direction = this.type
+				}
+				if (!this.config[direction]) {
+					console.error('缺少类型:', direction)
+					return
+				}
+				this[this.config[direction]]()
+				this.$emit('change', {
+					show: true,
+					type: direction
+				})
+			},
+			close(type) {
+				this.showTrans = false
+				this.$emit('change', {
+					show: false,
+					type: this.type
+				})
+				clearTimeout(this.timer)
+				// // 自定义关闭事件
+				// this.customOpen && this.customClose()
+				this.timer = setTimeout(() => {
+					this.showPopup = false
+				}, 300)
+			},
+			// TODO 处理冒泡事件,头条的冒泡事件有问题 ,先这样兼容
+			touchstart() {
+				this.clearPropagation = false
+			},
+
+			onTap() {
+				if (this.clearPropagation) {
+					// fix by mehaotian 兼容 nvue
+					this.clearPropagation = false
+					return
+				}
+				this.$emit('maskClick')
+				if (!this.mkclick) return
+				this.close()
+			},
+			/**
+			 * 顶部弹出样式处理
+			 */
+			top(type) {
+				this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top'
+				this.ani = ['slide-top']
+				this.transClass = {
+					position: 'fixed',
+					left: 0,
+					right: 0,
+					backgroundColor: this.bg
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+				this.$nextTick(() => {
+					if (this.messageChild && this.type === 'message') {
+						this.messageChild.timerClose()
+					}
+				})
+			},
+			/**
+			 * 底部弹出样式处理
+			 */
+			bottom(type) {
+				this.popupstyle = 'bottom'
+				this.ani = ['slide-bottom']
+				this.transClass = {
+					position: 'fixed',
+					left: 0,
+					right: 0,
+					bottom: 0,
+					paddingBottom: this.safeAreaInsets + 'px',
+					backgroundColor: this.bg
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			},
+			/**
+			 * 中间弹出样式处理
+			 */
+			center(type) {
+				this.popupstyle = 'center'
+				this.ani = ['zoom-out', 'fade']
+				this.transClass = {
+					position: 'fixed',
+					/* #ifndef APP-NVUE */
+					display: 'flex',
+					flexDirection: 'column',
+					/* #endif */
+					bottom: 0,
+					left: 0,
+					right: 0,
+					top: 0,
+					justifyContent: 'center',
+					alignItems: 'center'
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			},
+			left(type) {
+				this.popupstyle = 'left'
+				this.ani = ['slide-left']
+				this.transClass = {
+					position: 'fixed',
+					left: 0,
+					bottom: 0,
+					top: 0,
+					backgroundColor: this.bg,
+					/* #ifndef APP-NVUE */
+					display: 'flex',
+					flexDirection: 'column'
+					/* #endif */
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			},
+			right(type) {
+				this.popupstyle = 'right'
+				this.ani = ['slide-right']
+				this.transClass = {
+					position: 'fixed',
+					bottom: 0,
+					right: 0,
+					top: 0,
+					backgroundColor: this.bg,
+					/* #ifndef APP-NVUE */
+					display: 'flex',
+					flexDirection: 'column'
+					/* #endif */
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			}
+		}
+	}
+</script>
+<style lang="scss">
+	.uni-popup {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+
+		/* #endif */
+		&.top,
+		&.left,
+		&.right {
+			/* #ifdef H5 */
+			top: var(--window-top);
+			/* #endif */
+			/* #ifndef H5 */
+			top: 0;
+			/* #endif */
+		}
+
+		.uni-popup__wrapper {
+			/* #ifndef APP-NVUE */
+			display: block;
+			/* #endif */
+			position: relative;
+
+			/* iphonex 等安全区设置,底部安全区适配 */
+			/* #ifndef APP-NVUE */
+			// padding-bottom: constant(safe-area-inset-bottom);
+			// padding-bottom: env(safe-area-inset-bottom);
+			/* #endif */
+			&.left,
+			&.right {
+				/* #ifdef H5 */
+				padding-top: var(--window-top);
+				/* #endif */
+				/* #ifndef H5 */
+				padding-top: 0;
+				/* #endif */
+				flex: 1;
+			}
+		}
+	}
+
+	.fixforpc-z-index {
+		/* #ifndef APP-NVUE */
+		z-index: 999;
+		/* #endif */
+	}
+
+	.fixforpc-top {
+		top: 0;
+	}
+</style>

+ 87 - 0
sleep/uni_modules/uni-popup/package.json

@@ -0,0 +1,87 @@
+{
+	"id": "uni-popup",
+	"displayName": "uni-popup 弹出层",
+	"version": "1.8.3",
+	"description": " Popup 组件,提供常用的弹层",
+	"keywords": [
+        "uni-ui",
+        "弹出层",
+        "弹窗",
+        "popup",
+        "弹框"
+    ],
+	"repository": "https://github.com/dcloudio/uni-ui",
+	"engines": {
+		"HBuilderX": ""
+	},
+	"directories": {
+		"example": "../../temps/example_temps"
+	},
+    "dcloudext": {
+        "sale": {
+			"regular": {
+				"price": "0.00"
+			},
+			"sourcecode": {
+				"price": "0.00"
+			}
+		},
+		"contact": {
+			"qq": ""
+		},
+		"declaration": {
+			"ads": "无",
+			"data": "无",
+			"permissions": "无"
+		},
+        "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+        "type": "component-vue"
+	},
+	"uni_modules": {
+		"dependencies": [
+			"uni-scss",
+			"uni-transition"
+		],
+		"encrypt": [],
+		"platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+                },
+                "Vue": {
+                    "vue2": "y",
+                    "vue3": "y"
+                }
+			}
+		}
+	}
+}

+ 17 - 0
sleep/uni_modules/uni-popup/readme.md

@@ -0,0 +1,17 @@
+
+
+## Popup 弹出层
+> **组件名:uni-popup**
+> 代码块: `uPopup`
+> 关联组件:`uni-transition`
+
+
+弹出层组件,在应用中弹出一个消息提示窗口、提示框等
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 
+
+
+
+
+

+ 22 - 0
sleep/uni_modules/uni-transition/changelog.md

@@ -0,0 +1,22 @@
+## 1.3.2(2023-05-04)
+- 修复 NVUE 平台报错的问题
+## 1.3.1(2021-11-23)
+- 修复 init 方法初始化问题
+## 1.3.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition)
+## 1.2.1(2021-09-27)
+- 修复 init 方法不生效的 Bug
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.1(2021-05-12)
+- 新增 示例地址
+- 修复 示例项目缺少组件的 Bug
+## 1.1.0(2021-04-22)
+- 新增 通过方法自定义动画
+- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
+- 优化 动画触发逻辑,使动画更流畅
+- 优化 支持单独的动画类型
+- 优化 文档示例
+## 1.0.2(2021-02-05)
+- 调整为 uni_modules 目录规范

+ 131 - 0
sleep/uni_modules/uni-transition/components/uni-transition/createAnimation.js

@@ -0,0 +1,131 @@
+// const defaultOption = {
+// 	duration: 300,
+// 	timingFunction: 'linear',
+// 	delay: 0,
+// 	transformOrigin: '50% 50% 0'
+// }
+// #ifdef APP-NVUE
+const nvueAnimation = uni.requireNativePlugin('animation')
+// #endif
+class MPAnimation {
+	constructor(options, _this) {
+		this.options = options
+		// 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
+		this.animation = uni.createAnimation({
+			...options
+		})
+		this.currentStepAnimates = {}
+		this.next = 0
+		this.$ = _this
+
+	}
+
+	_nvuePushAnimates(type, args) {
+		let aniObj = this.currentStepAnimates[this.next]
+		let styles = {}
+		if (!aniObj) {
+			styles = {
+				styles: {},
+				config: {}
+			}
+		} else {
+			styles = aniObj
+		}
+		if (animateTypes1.includes(type)) {
+			if (!styles.styles.transform) {
+				styles.styles.transform = ''
+			}
+			let unit = ''
+			if(type === 'rotate'){
+				unit = 'deg'
+			}
+			styles.styles.transform += `${type}(${args+unit}) `
+		} else {
+			styles.styles[type] = `${args}`
+		}
+		this.currentStepAnimates[this.next] = styles
+	}
+	_animateRun(styles = {}, config = {}) {
+		let ref = this.$.$refs['ani'].ref
+		if (!ref) return
+		return new Promise((resolve, reject) => {
+			nvueAnimation.transition(ref, {
+				styles,
+				...config
+			}, res => {
+				resolve()
+			})
+		})
+	}
+
+	_nvueNextAnimate(animates, step = 0, fn) {
+		let obj = animates[step]
+		if (obj) {
+			let {
+				styles,
+				config
+			} = obj
+			this._animateRun(styles, config).then(() => {
+				step += 1
+				this._nvueNextAnimate(animates, step, fn)
+			})
+		} else {
+			this.currentStepAnimates = {}
+			typeof fn === 'function' && fn()
+			this.isEnd = true
+		}
+	}
+
+	step(config = {}) {
+		// #ifndef APP-NVUE
+		this.animation.step(config)
+		// #endif
+		// #ifdef APP-NVUE
+		this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
+		this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
+		this.next++
+		// #endif
+		return this
+	}
+
+	run(fn) {
+		// #ifndef APP-NVUE
+		this.$.animationData = this.animation.export()
+		this.$.timer = setTimeout(() => {
+			typeof fn === 'function' && fn()
+		}, this.$.durationTime)
+		// #endif
+		// #ifdef APP-NVUE
+		this.isEnd = false
+		let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
+		if(!ref) return
+		this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
+		this.next = 0
+		// #endif
+	}
+}
+
+
+const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
+	'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
+	'translateZ'
+]
+const animateTypes2 = ['opacity', 'backgroundColor']
+const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
+animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
+	MPAnimation.prototype[type] = function(...args) {
+		// #ifndef APP-NVUE
+		this.animation[type](...args)
+		// #endif
+		// #ifdef APP-NVUE
+		this._nvuePushAnimates(type, args)
+		// #endif
+		return this
+	}
+})
+
+export function createAnimation(option, _this) {
+	if(!_this) return
+	clearTimeout(_this.timer)
+	return new MPAnimation(option, _this)
+}

+ 286 - 0
sleep/uni_modules/uni-transition/components/uni-transition/uni-transition.vue

@@ -0,0 +1,286 @@
+<template>
+  <!-- #ifndef APP-NVUE -->
+  <view v-show="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
+  <!-- #endif -->
+  <!-- #ifdef APP-NVUE -->
+  <view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
+  <!-- #endif -->
+</template>
+
+<script>
+import { createAnimation } from './createAnimation'
+
+/**
+ * Transition 过渡动画
+ * @description 简单过渡动画组件
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=985
+ * @property {Boolean} show = [false|true] 控制组件显示或隐藏
+ * @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
+ *  @value fade 渐隐渐出过渡
+ *  @value slide-top 由上至下过渡
+ *  @value slide-right 由右至左过渡
+ *  @value slide-bottom 由下至上过渡
+ *  @value slide-left 由左至右过渡
+ *  @value zoom-in 由小到大过渡
+ *  @value zoom-out 由大到小过渡
+ * @property {Number} duration 过渡动画持续时间
+ * @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
+ */
+export default {
+	name: 'uniTransition',
+	emits:['click','change'],
+	props: {
+		show: {
+			type: Boolean,
+			default: false
+		},
+		modeClass: {
+			type: [Array, String],
+			default() {
+				return 'fade'
+			}
+		},
+		duration: {
+			type: Number,
+			default: 300
+		},
+		styles: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		customClass:{
+			type: String,
+			default: ''
+		},
+		onceRender:{
+			type:Boolean,
+			default:false
+		},
+	},
+	data() {
+		return {
+			isShow: false,
+			transform: '',
+			opacity: 1,
+			animationData: {},
+			durationTime: 300,
+			config: {}
+		}
+	},
+	watch: {
+		show: {
+			handler(newVal) {
+				if (newVal) {
+					this.open()
+				} else {
+					// 避免上来就执行 close,导致动画错乱
+					if (this.isShow) {
+						this.close()
+					}
+				}
+			},
+			immediate: true
+		}
+	},
+	computed: {
+		// 生成样式数据
+		stylesObject() {
+			let styles = {
+				...this.styles,
+				'transition-duration': this.duration / 1000 + 's'
+			}
+			let transform = ''
+			for (let i in styles) {
+				let line = this.toLine(i)
+				transform += line + ':' + styles[i] + ';'
+			}
+			return transform
+		},
+		// 初始化动画条件
+		transformStyles() {
+			return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
+		}
+	},
+	created() {
+		// 动画默认配置
+		this.config = {
+			duration: this.duration,
+			timingFunction: 'ease',
+			transformOrigin: '50% 50%',
+			delay: 0
+		}
+		this.durationTime = this.duration
+	},
+	methods: {
+		/**
+		 *  ref 触发 初始化动画
+		 */
+		init(obj = {}) {
+			if (obj.duration) {
+				this.durationTime = obj.duration
+			}
+			this.animation = createAnimation(Object.assign(this.config, obj),this)
+		},
+		/**
+		 * 点击组件触发回调
+		 */
+		onClick() {
+			this.$emit('click', {
+				detail: this.isShow
+			})
+		},
+		/**
+		 * ref 触发 动画分组
+		 * @param {Object} obj
+		 */
+		step(obj, config = {}) {
+			if (!this.animation) return
+			for (let i in obj) {
+				try {
+					if(typeof obj[i] === 'object'){
+						this.animation[i](...obj[i])
+					}else{
+						this.animation[i](obj[i])
+					}
+				} catch (e) {
+					console.error(`方法 ${i} 不存在`)
+				}
+			}
+			this.animation.step(config)
+			return this
+		},
+		/**
+		 *  ref 触发 执行动画
+		 */
+		run(fn) {
+			if (!this.animation) return
+			this.animation.run(fn)
+		},
+		// 开始过度动画
+		open() {
+			clearTimeout(this.timer)
+			this.transform = ''
+			this.isShow = true
+			let { opacity, transform } = this.styleInit(false)
+			if (typeof opacity !== 'undefined') {
+				this.opacity = opacity
+			}
+			this.transform = transform
+			// 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常
+			this.$nextTick(() => {
+				// TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器
+				this.timer = setTimeout(() => {
+					this.animation = createAnimation(this.config, this)
+					this.tranfromInit(false).step()
+					this.animation.run()
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				}, 20)
+			})
+		},
+		// 关闭过度动画
+		close(type) {
+			if (!this.animation) return
+			this.tranfromInit(true)
+				.step()
+				.run(() => {
+					this.isShow = false
+					this.animationData = null
+					this.animation = null
+					let { opacity, transform } = this.styleInit(false)
+					this.opacity = opacity || 1
+					this.transform = transform
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				})
+		},
+		// 处理动画开始前的默认样式
+		styleInit(type) {
+			let styles = {
+				transform: ''
+			}
+			let buildStyle = (type, mode) => {
+				if (mode === 'fade') {
+					styles.opacity = this.animationType(type)[mode]
+				} else {
+					styles.transform += this.animationType(type)[mode] + ' '
+				}
+			}
+			if (typeof this.modeClass === 'string') {
+				buildStyle(type, this.modeClass)
+			} else {
+				this.modeClass.forEach(mode => {
+					buildStyle(type, mode)
+				})
+			}
+			return styles
+		},
+		// 处理内置组合动画
+		tranfromInit(type) {
+			let buildTranfrom = (type, mode) => {
+				let aniNum = null
+				if (mode === 'fade') {
+					aniNum = type ? 0 : 1
+				} else {
+					aniNum = type ? '-100%' : '0'
+					if (mode === 'zoom-in') {
+						aniNum = type ? 0.8 : 1
+					}
+					if (mode === 'zoom-out') {
+						aniNum = type ? 1.2 : 1
+					}
+					if (mode === 'slide-right') {
+						aniNum = type ? '100%' : '0'
+					}
+					if (mode === 'slide-bottom') {
+						aniNum = type ? '100%' : '0'
+					}
+				}
+				this.animation[this.animationMode()[mode]](aniNum)
+			}
+			if (typeof this.modeClass === 'string') {
+				buildTranfrom(type, this.modeClass)
+			} else {
+				this.modeClass.forEach(mode => {
+					buildTranfrom(type, mode)
+				})
+			}
+
+			return this.animation
+		},
+		animationType(type) {
+			return {
+				fade: type ? 1 : 0,
+				'slide-top': `translateY(${type ? '0' : '-100%'})`,
+				'slide-right': `translateX(${type ? '0' : '100%'})`,
+				'slide-bottom': `translateY(${type ? '0' : '100%'})`,
+				'slide-left': `translateX(${type ? '0' : '-100%'})`,
+				'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
+				'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
+			}
+		},
+		// 内置动画类型与实际动画对应字典
+		animationMode() {
+			return {
+				fade: 'opacity',
+				'slide-top': 'translateY',
+				'slide-right': 'translateX',
+				'slide-bottom': 'translateY',
+				'slide-left': 'translateX',
+				'zoom-in': 'scale',
+				'zoom-out': 'scale'
+			}
+		},
+		// 驼峰转中横线
+		toLine(name) {
+			return name.replace(/([A-Z])/g, '-$1').toLowerCase()
+		}
+	}
+}
+</script>
+
+<style></style>

+ 84 - 0
sleep/uni_modules/uni-transition/package.json

@@ -0,0 +1,84 @@
+{
+  "id": "uni-transition",
+  "displayName": "uni-transition 过渡动画",
+  "version": "1.3.2",
+  "description": "元素的简单过渡动画",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "动画",
+    "过渡",
+    "过渡动画"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 11 - 0
sleep/uni_modules/uni-transition/readme.md

@@ -0,0 +1,11 @@
+
+
+## Transition 过渡动画
+> **组件名:uni-transition**
+> 代码块: `uTransition`
+
+
+元素过渡动画
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/boxTitle/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/ccq-week-picker/ccq-week-picker.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/musicControl/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/musicControl/playList.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/search/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/tabBar/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/uni-popup/uni-popup.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/components/uni-transition/uni-transition.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/alertSetting/alertSetting.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/auth/auth.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/dayRecommend/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/components/musicList.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/components/songList.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/monthReport/monthReport.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/my/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/play/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/report/report.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/search/components/historySearch.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/search/components/hotSearch.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/search/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/searchList/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/shareUser/shareUser.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/singer/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/singerPlayList/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/songDetail/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/songList/index.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/pages/weekReport/weekReport.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-section/components/uni-section/uni-section.js.map


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-steps/components/uni-steps/uni-steps.js.map


+ 2 - 1
sleep/unpackage/dist/dev/mp-weixin/app.json

@@ -70,6 +70,7 @@
     "tab-bar": "/components/tabBar/index",
     "cu-custom": "/colorui/components/cu-custom",
     "uni-steps": "/uni_modules/uni-steps/components/uni-steps/uni-steps",
-    "uni-section": "/uni_modules/uni-section/components/uni-section/uni-section"
+    "uni-section": "/uni_modules/uni-section/components/uni-section/uni-section",
+    "time-slot": "/components/wanghexu-timeslot/wanghexu-timeslot"
   }
 }

Разница между файлами не показана из-за своего большого размера
+ 10 - 10
sleep/unpackage/dist/dev/mp-weixin/colorui/components/cu-custom.js


+ 12 - 6
sleep/unpackage/dist/dev/mp-weixin/common/main.js

@@ -27,41 +27,47 @@ _App.default.mpType = 'app';
 _vue.default.prototype.$api = _index.default;
 var musicControl = function musicControl() {
   __webpack_require__.e(/*! require.ensure | components/musicControl/index */ "components/musicControl/index").then((function () {
-    return resolve(__webpack_require__(/*! @/components/musicControl/index.vue */ 217));
+    return resolve(__webpack_require__(/*! @/components/musicControl/index.vue */ 223));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 _vue.default.component('music-control', musicControl);
 var boxTitle = function boxTitle() {
   __webpack_require__.e(/*! require.ensure | components/boxTitle/index */ "components/boxTitle/index").then((function () {
-    return resolve(__webpack_require__(/*! @/components/boxTitle/index.vue */ 224));
+    return resolve(__webpack_require__(/*! @/components/boxTitle/index.vue */ 230));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 _vue.default.component('box-title', boxTitle);
 var tabBar = function tabBar() {
   __webpack_require__.e(/*! require.ensure | components/tabBar/index */ "components/tabBar/index").then((function () {
-    return resolve(__webpack_require__(/*! @/components/tabBar/index.vue */ 231));
+    return resolve(__webpack_require__(/*! @/components/tabBar/index.vue */ 237));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 _vue.default.component('tab-bar', tabBar);
 var cuCustom = function cuCustom() {
   __webpack_require__.e(/*! require.ensure | colorui/components/cu-custom */ "colorui/components/cu-custom").then((function () {
-    return resolve(__webpack_require__(/*! ./colorui/components/cu-custom.vue */ 238));
+    return resolve(__webpack_require__(/*! ./colorui/components/cu-custom.vue */ 244));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 _vue.default.component('cu-custom', cuCustom);
 _vue.default.prototype.$audio = _index2.audio;
 var UniSteps = function UniSteps() {
   __webpack_require__.e(/*! require.ensure | uni_modules/uni-steps/components/uni-steps/uni-steps */ "uni_modules/uni-steps/components/uni-steps/uni-steps").then((function () {
-    return resolve(__webpack_require__(/*! ./uni_modules/uni-steps/components/uni-steps/uni-steps.vue */ 243));
+    return resolve(__webpack_require__(/*! ./uni_modules/uni-steps/components/uni-steps/uni-steps.vue */ 249));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 _vue.default.component('uni-steps', UniSteps);
 var UniSection = function UniSection() {
   __webpack_require__.e(/*! require.ensure | uni_modules/uni-section/components/uni-section/uni-section */ "uni_modules/uni-section/components/uni-section/uni-section").then((function () {
-    return resolve(__webpack_require__(/*! ./uni_modules/uni-section/components/uni-section/uni-section.vue */ 250));
+    return resolve(__webpack_require__(/*! ./uni_modules/uni-section/components/uni-section/uni-section.vue */ 256));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 _vue.default.component('uni-section', UniSection);
+var timeSlot = function timeSlot() {
+  __webpack_require__.e(/*! require.ensure | components/wanghexu-timeslot/wanghexu-timeslot */ "components/wanghexu-timeslot/wanghexu-timeslot").then((function () {
+    return resolve(__webpack_require__(/*! @/components/wanghexu-timeslot/wanghexu-timeslot.vue */ 263));
+  }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
+};
+_vue.default.component('time-slot', timeSlot);
 var app = new _vue.default(_objectSpread(_objectSpread({}, _App.default), {}, {
   store: _store.default
 }));

Разница между файлами не показана из-за своего большого размера
+ 2 - 2
sleep/unpackage/dist/dev/mp-weixin/common/runtime.js


Разница между файлами не показана из-за своего большого размера
+ 1030 - 1030
sleep/unpackage/dist/dev/mp-weixin/common/vendor.js


Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/components/boxTitle/index.js


Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/components/ccq-week-picker/ccq-week-picker.js


Разница между файлами не показана из-за своего большого размера
+ 15 - 15
sleep/unpackage/dist/dev/mp-weixin/components/musicControl/index.js


Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/components/musicControl/playList.js


+ 2 - 2
sleep/unpackage/dist/dev/mp-weixin/components/musicControl/playList.json

@@ -1,4 +1,4 @@
 {
-  "usingComponents": {},
-  "component": true
+  "component": true,
+  "usingComponents": {}
 }

Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/components/search/index.js


Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/components/tabBar/index.js


Разница между файлами не показана из-за своего большого размера
+ 16 - 16
sleep/unpackage/dist/dev/mp-weixin/components/uni-popup/uni-popup.js


Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/components/uni-transition/uni-transition.js


+ 34 - 152
sleep/unpackage/dist/dev/mp-weixin/pages/alertSetting/alertSetting.js

@@ -141,164 +141,46 @@ Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.default = void 0;
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
+var timeSlot = function timeSlot() {
+  __webpack_require__.e(/*! require.ensure | components/wanghexu-timeslot/wanghexu-timeslot */ "components/wanghexu-timeslot/wanghexu-timeslot").then((function () {
+    return resolve(__webpack_require__(/*! @/components/wanghexu-timeslot/wanghexu-timeslot.vue */ 263));
+  }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
+};
 var _default = {
   data: function data() {
     return {
+      value: 0,
       list1: [null, null],
-      list2: [null, null]
+      list2: [null, null],
+      title: 'picker',
+      array: ['90', '91', '92', '93', '94'],
+      index: 0
     };
   },
-  methods: {}
+  components: {
+    timeSlot: timeSlot
+  },
+  methods: {
+    handleInput: function handleInput() {
+      this.$refs.inputDialog.open();
+    },
+    handleTimeChoose: function handleTimeChoose() {
+      this.$refs.timeslot.open();
+    },
+    confirmTime: function confirmTime(val) {},
+    bindBreathPickerChange: function bindBreathPickerChange(e) {
+      console.log('picker发送选择改变,携带值为', e.detail.value);
+      this.index = e.detail.value;
+    },
+    bindHeartPickerChange: function bindHeartPickerChange(e) {
+      console.log('picker发送选择改变,携带值为', e.detail.value);
+      this.index = e.detail.value;
+    },
+    bindBedPickerChange: function bindBedPickerChange(e) {
+      console.log('picker发送选择改变,携带值为', e.detail.value);
+      this.index = e.detail.value;
+    }
+  }
 };
 exports.default = _default;
 

+ 3 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/alertSetting/alertSetting.json

@@ -1,4 +1,6 @@
 {
   "enablePullDownRefresh": true,
-  "usingComponents": {}
+  "usingComponents": {
+    "time-slot": "/components/wanghexu-timeslot/wanghexu-timeslot"
+  }
 }

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/alertSetting/alertSetting.wxml


+ 87 - 0
sleep/unpackage/dist/dev/mp-weixin/pages/alertSetting/alertSetting.wxss

@@ -310,4 +310,91 @@
 .page .section .space-y-32 > image.data-v-0fb9c086:not(:first-child) {
   margin-top: 2rem;
 }
+.box.data-v-0fb9c086 {
+  display: flex;
+  flex-direction: row;
+}
+.button.data-v-0fb9c086 {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  flex: 1;
+  height: 35px;
+  margin: 0 5px;
+  border-radius: 5px;
+}
+.example-body.data-v-0fb9c086 {
+  background-color: #fff;
+  padding: 10px 0;
+}
+.button-text.data-v-0fb9c086 {
+  color: #fff;
+  font-size: 12px;
+}
+.popup-content.data-v-0fb9c086 {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  padding: 15px;
+  height: 50px;
+  background-color: #fff;
+}
+.popup-height.data-v-0fb9c086 {
+  height: 100%;
+  width: 200px;
+}
+.text.data-v-0fb9c086 {
+  font-size: 12px;
+  color: #333;
+}
+.popup-success.data-v-0fb9c086 {
+  color: #fff;
+  background-color: #e1f3d8;
+}
+.popup-warn.data-v-0fb9c086 {
+  color: #fff;
+  background-color: #faecd8;
+}
+.popup-error.data-v-0fb9c086 {
+  color: #fff;
+  background-color: #fde2e2;
+}
+.popup-info.data-v-0fb9c086 {
+  color: #fff;
+  background-color: #f2f6fc;
+}
+.success-text.data-v-0fb9c086 {
+  color: #09bb07;
+}
+.warn-text.data-v-0fb9c086 {
+  color: #e6a23c;
+}
+.error-text.data-v-0fb9c086 {
+  color: #f56c6c;
+}
+.info-text.data-v-0fb9c086 {
+  color: #909399;
+}
+.dialog.data-v-0fb9c086,
+.share.data-v-0fb9c086 {
+  display: flex;
+  flex-direction: column;
+}
+.dialog-box.data-v-0fb9c086 {
+  padding: 10px;
+}
+.dialog .button.data-v-0fb9c086,
+.share .button.data-v-0fb9c086 {
+  width: 100%;
+  margin: 0;
+  margin-top: 10px;
+  padding: 3px 0;
+  flex: 1;
+}
+.dialog-text.data-v-0fb9c086 {
+  font-size: 14px;
+  color: #333;
+}
 

+ 1 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/home/index.js

@@ -101,7 +101,7 @@ var components
 try {
   components = {
     uniSteps: function () {
-      return __webpack_require__.e(/*! import() | uni_modules/uni-steps/components/uni-steps/uni-steps */ "uni_modules/uni-steps/components/uni-steps/uni-steps").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-steps/components/uni-steps/uni-steps.vue */ 243))
+      return __webpack_require__.e(/*! import() | uni_modules/uni-steps/components/uni-steps/uni-steps */ "uni_modules/uni-steps/components/uni-steps/uni-steps").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-steps/components/uni-steps/uni-steps.vue */ 249))
     },
   }
 } catch (e) {

Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/pages/index/components/musicList.js


+ 0 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/index/components/singerList.js

@@ -1 +0,0 @@
-Component({})

+ 0 - 4
sleep/unpackage/dist/dev/mp-weixin/pages/index/components/singerList.json

@@ -1,4 +0,0 @@
-{
-  "usingComponents": {},
-  "component": true
-}

Разница между файлами не показана из-за своего большого размера
+ 0 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/index/components/singerList.wxml


+ 0 - 50
sleep/unpackage/dist/dev/mp-weixin/pages/index/components/singerList.wxss

@@ -1,50 +0,0 @@
-@charset "UTF-8";
-/**
- * 这里是uni-app内置的常用样式变量
- *
- * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
- * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
- *
- */
-/**
- * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
- *
- * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
- */
-/* 颜色变量 */
-/* 行为相关颜色 */
-/* 文字基本颜色 */
-/* 背景颜色 */
-/* 边框颜色 */
-/* 尺寸变量 */
-/* 文字尺寸 */
-/* 图片尺寸 */
-/* Border Radius */
-/* 水平间距 */
-/* 垂直间距 */
-/* 透明度 */
-/* 文章场景相关 */
-.music-list-wrapper.data-v-0459d86d {
-  width: 100%;
-  white-space: nowrap;
-}
-.music-list-wrapper .singer-list-item.data-v-0459d86d {
-  width: 20%;
-  margin: 0 6px;
-  display: inline-block;
-  overflow: hidden;
-  position: relative;
-  border-radius: 7px;
-  text-align: center;
-}
-.music-list-wrapper .singer-list-item .music-singer-item-image.data-v-0459d86d {
-  width: 70px;
-  height: 70px;
-  border-radius: 50%;
-}
-.music-list-wrapper .singer-list-item .music-singer-item-text.data-v-0459d86d {
-  font-size: 14px;
-  color: #000;
-  margin-top: 3px;
-}
-

Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/pages/index/components/songList.js


+ 2 - 2
sleep/unpackage/dist/dev/mp-weixin/pages/index/index.js

@@ -160,12 +160,12 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/r
 var _index = __webpack_require__(/*! @/utils/index.js */ 62);
 var songList = function songList() {
   __webpack_require__.e(/*! require.ensure | pages/index/components/songList */ "pages/index/components/songList").then((function () {
-    return resolve(__webpack_require__(/*! ./components/songList.vue */ 257));
+    return resolve(__webpack_require__(/*! ./components/songList.vue */ 270));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 var musicList = function musicList() {
   Promise.all(/*! require.ensure | pages/index/components/musicList */[__webpack_require__.e("common/vendor"), __webpack_require__.e("pages/index/components/musicList")]).then((function () {
-    return resolve(__webpack_require__(/*! ./components/musicList.vue */ 264));
+    return resolve(__webpack_require__(/*! ./components/musicList.vue */ 277));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 var _default = {

+ 1 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/monthReport/monthReport.js

@@ -101,7 +101,7 @@ var components
 try {
   components = {
     uniSection: function () {
-      return __webpack_require__.e(/*! import() | uni_modules/uni-section/components/uni-section/uni-section */ "uni_modules/uni-section/components/uni-section/uni-section").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-section/components/uni-section/uni-section.vue */ 250))
+      return __webpack_require__.e(/*! import() | uni_modules/uni-section/components/uni-section/uni-section */ "uni_modules/uni-section/components/uni-section/uni-section").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-section/components/uni-section/uni-section.vue */ 256))
     },
   }
 } catch (e) {

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/play/index.js


+ 53 - 2
sleep/unpackage/dist/dev/mp-weixin/pages/report/report.js

@@ -410,14 +410,65 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
 //
 //
 //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+var timeSlot = function timeSlot() {
+  __webpack_require__.e(/*! require.ensure | components/wanghexu-timeslot/wanghexu-timeslot */ "components/wanghexu-timeslot/wanghexu-timeslot").then((function () {
+    return resolve(__webpack_require__(/*! @/components/wanghexu-timeslot/wanghexu-timeslot.vue */ 263));
+  }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
+};
 var _default = {
   data: function data() {
+    var currentDate = this.getDate({
+      format: true
+    });
     return {
-      isDeviceAdded: true
+      isDeviceAdded: true,
+      date: currentDate
     };
   },
   onReady: function onReady() {},
-  methods: {}
+  components: {
+    timeSlot: timeSlot
+  },
+  computed: {
+    startDate: function startDate() {
+      return this.getDate('start');
+    },
+    endDate: function endDate() {
+      return this.getDate('end');
+    }
+  },
+  methods: {
+    handleTimeChoose: function handleTimeChoose() {
+      this.$refs.timeslot.open();
+    },
+    confirmTime: function confirmTime(val) {},
+    bindDateChange: function bindDateChange(e) {
+      this.date = e.detail.value;
+    },
+    getDate: function getDate(type) {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var day = date.getDate();
+      if (type === 'start') {
+        year = year - 60;
+      } else if (type === 'end') {
+        year = year + 2;
+      }
+      month = month > 9 ? month : '0' + month;
+      day = day > 9 ? day : '0' + day;
+      return "".concat(year, "-").concat(month, "-").concat(day);
+    }
+  }
 };
 exports.default = _default;
 

+ 3 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/report/report.json

@@ -1,4 +1,6 @@
 {
   "enablePullDownRefresh": true,
-  "usingComponents": {}
+  "usingComponents": {
+    "time-slot": "/components/wanghexu-timeslot/wanghexu-timeslot"
+  }
 }

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
sleep/unpackage/dist/dev/mp-weixin/pages/report/report.wxml


Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/pages/search/components/historySearch.js


Разница между файлами не показана из-за своего большого размера
+ 14 - 14
sleep/unpackage/dist/dev/mp-weixin/pages/search/components/hotSearch.js


+ 3 - 3
sleep/unpackage/dist/dev/mp-weixin/pages/search/index.js

@@ -144,17 +144,17 @@ exports.default = void 0;
 var _vuex = __webpack_require__(/*! vuex */ 37);
 var search = function search() {
   Promise.all(/*! require.ensure | components/search/index */[__webpack_require__.e("common/vendor"), __webpack_require__.e("components/search/index")]).then((function () {
-    return resolve(__webpack_require__(/*! @/components/search/index.vue */ 292));
+    return resolve(__webpack_require__(/*! @/components/search/index.vue */ 298));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 var historySearch = function historySearch() {
   __webpack_require__.e(/*! require.ensure | pages/search/components/historySearch */ "pages/search/components/historySearch").then((function () {
-    return resolve(__webpack_require__(/*! ./components/historySearch.vue */ 299));
+    return resolve(__webpack_require__(/*! ./components/historySearch.vue */ 305));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 var hotSearch = function hotSearch() {
   __webpack_require__.e(/*! require.ensure | pages/search/components/hotSearch */ "pages/search/components/hotSearch").then((function () {
-    return resolve(__webpack_require__(/*! ./components/hotSearch.vue */ 306));
+    return resolve(__webpack_require__(/*! ./components/hotSearch.vue */ 312));
   }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
 };
 var _default = {

+ 0 - 0
sleep/unpackage/dist/dev/mp-weixin/pages/searchList/index.js


Некоторые файлы не были показаны из-за большого количества измененных файлов