pages.json冲突解决
							
								
								
									
										3
									
								
								App.vue
								
								
								
								
							
							
						
						|  | @ -26,14 +26,13 @@ | ||||||
| 
 | 
 | ||||||
| <style> | <style> | ||||||
| 	/*每个页面公共css */ | 	/*每个页面公共css */ | ||||||
|  |      | ||||||
| 	/* 阿里巴巴矢量图标库 start */ | 	/* 阿里巴巴矢量图标库 start */ | ||||||
| 	@import url("./commons/icon-font.css"); | 	@import url("./commons/icon-font.css"); | ||||||
| 	/* 阿里巴巴矢量图标库 end */ | 	/* 阿里巴巴矢量图标库 end */ | ||||||
| 	 |  | ||||||
| 	/* 项目基础样式 start */ | 	/* 项目基础样式 start */ | ||||||
| 	@import url("./commons/base.css"); | 	@import url("./commons/base.css"); | ||||||
| 	/* 项目基础样式 end */ | 	/* 项目基础样式 end */ | ||||||
| 	 |  | ||||||
| 	/* 项目页面样式 start */ | 	/* 项目页面样式 start */ | ||||||
| 	@import url("./commons/flying-monkey.css"); | 	@import url("./commons/flying-monkey.css"); | ||||||
| 	/* 项目页面样式 end */ | 	/* 项目页面样式 end */ | ||||||
|  |  | ||||||
|  | @ -63,6 +63,11 @@ uni-radio .uni-radio-input {border: 1rpx solid #444444;} | ||||||
| .clear-close span:first-child {transform: rotate(45deg);} | .clear-close span:first-child {transform: rotate(45deg);} | ||||||
| .clear-close span:last-child {transform: rotate(-45deg);} | .clear-close span:last-child {transform: rotate(-45deg);} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | /* panding全局 */ | ||||||
|  | .padding{ | ||||||
|  |     padding: 0 27rpx; | ||||||
|  | } | ||||||
| /* 登录 */ | /* 登录 */ | ||||||
| .login-img { | .login-img { | ||||||
| 	width: 100%; | 	width: 100%; | ||||||
|  | @ -203,6 +208,7 @@ uni-radio .uni-radio-input {border: 1rpx solid #444444;} | ||||||
| 	border-radius: 100%; | 	border-radius: 100%; | ||||||
| 	color: #FFFFFF; | 	color: #FFFFFF; | ||||||
| 	transform: scale(.8); | 	transform: scale(.8); | ||||||
|  | 
 | ||||||
| } | } | ||||||
| /* 我的页面 */ | /* 我的页面 */ | ||||||
| .my-exit-btn{ | .my-exit-btn{ | ||||||
|  |  | ||||||
							
								
								
									
										120
									
								
								pages.json
								
								
								
								
							
							
						
						|  | @ -1,87 +1,97 @@ | ||||||
| { | { | ||||||
| 	"pages": [ |     "pages": [{ | ||||||
| 		{ |             "path": "pages/guide-page/guide-page", | ||||||
| 		    "path" : "pages/guide-page/guide-page", |             "style": { | ||||||
| 		    "style" :{ |  | ||||||
|                 "navigationBarTitleText": "", |                 "navigationBarTitleText": "", | ||||||
|                 "enablePullDownRefresh": false, |                 "enablePullDownRefresh": false, | ||||||
| 				"navigationStyle": "custom",//禁用原生导航栏,微信小程序可用 |                 "navigationStyle": "custom", //禁用原生导航栏,微信小程序可用 | ||||||
| 				"navigationBarTextStyle":"white", |                 "navigationBarTextStyle": "white", | ||||||
|                 "app-plus": { |                 "app-plus": { | ||||||
|                     "titleNView": false //禁用原生导航栏,APP和H5可用 |                     "titleNView": false //禁用原生导航栏,APP和H5可用 | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |         }, { | ||||||
|  |             "path": "pages/login/login", | ||||||
|  |             "style": { | ||||||
|  |                 "navigationBarTitleText": "", | ||||||
|  |                 "navigationStyle": "custom" //禁用原生导航栏,微信小程序可用 | ||||||
|             } |             } | ||||||
| 		,{ |         }, { | ||||||
| 		    "path" : "pages/login/login", |             "path": "pages/tabbar/pagehome/pagehome", | ||||||
| 		    "style" :{ |             "style": { | ||||||
| 				"navigationBarTitleText":"", |  | ||||||
| 				"navigationStyle": "custom"//禁用原生导航栏,微信小程序可用 |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		,{ |  | ||||||
| 		    "path" : "pages/tabbar/pagehome/pagehome", |  | ||||||
| 		    "style" :{ |  | ||||||
|                 "navigationBarTitleText": "", |                 "navigationBarTitleText": "", | ||||||
|                 "enablePullDownRefresh": false, |                 "enablePullDownRefresh": false, | ||||||
| 				"navigationStyle": "custom",//禁用原生导航栏,微信小程序可用 |                 "navigationStyle": "custom", //禁用原生导航栏,微信小程序可用 | ||||||
| 				"navigationBarTextStyle":"black", |                 "navigationBarTextStyle": "black", | ||||||
|                 "app-plus": { |                 "app-plus": { | ||||||
| 					"titleNView": false ,//禁用原生导航栏,APP和H5可用 |                     "titleNView": false, //禁用原生导航栏,APP和H5可用 | ||||||
| 					"bounce":"none", |                     "bounce": "none", | ||||||
| 					"scrollIndicator":"none" |                     "scrollIndicator": "none" | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |         }, { | ||||||
|  |             "path": "pages/tabbar/my/my", | ||||||
|  |             "style": { | ||||||
|  |                 "navigationBarTitleText": "个人中心", | ||||||
|  | 				"navigationStyle": "custom" //禁用原生导航栏,微信小程序可用 | ||||||
|             } |             } | ||||||
| 		,{ |         }, { | ||||||
| 		    "path" : "pages/tabbar/my/my", |  | ||||||
| 		    "style" :{ |  | ||||||
| 				"navigationBarTitleText":"个人中心", |  | ||||||
| 				"navigationStyle": "custom"//禁用原生导航栏,微信小程序可用 |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		,{ |  | ||||||
|             "path": "pages/login/agreement", |             "path": "pages/login/agreement", | ||||||
| 			"style" :{ |             "style": { | ||||||
| 				"navigationBarTitleText":"" |                 "navigationBarTitleText": "" | ||||||
|             } |             } | ||||||
| 		} |         }, { | ||||||
|         ,{ |             "path": "pages/tabbar/project-list/project-list", | ||||||
|             "path" : "pages/tabbar/project-list/project-list", |             "style": { | ||||||
|             "style" :                                                                                     |  | ||||||
|             { |  | ||||||
|                 "navigationBarTitleText": "项目列表", |                 "navigationBarTitleText": "项目列表", | ||||||
|                 "enablePullDownRefresh": false |                 "enablePullDownRefresh": false | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|         } |         }, { | ||||||
|         ,{ |             "path": "pages/tabbar/feedback/feedback", | ||||||
|             "path" : "pages/tabbar/feedback/feedback", |             "style": { | ||||||
|             "style" :                                                                                     |  | ||||||
|             { |  | ||||||
|                 "navigationBarTitleText": "意见反馈", |                 "navigationBarTitleText": "意见反馈", | ||||||
|                 "enablePullDownRefresh": false |                 "enablePullDownRefresh": false | ||||||
|             } |             } | ||||||
|         } |         }, { | ||||||
|         ,{ |             "path": "pages/register/register", | ||||||
|             "path" : "pages/register/register", |             "style": { | ||||||
|             "style" :{ |  | ||||||
|                 "navigationBarTitleText": "", |                 "navigationBarTitleText": "", | ||||||
|                 "enablePullDownRefresh": false, |                 "enablePullDownRefresh": false, | ||||||
|                 "navigationStyle": "custom",//禁用原生导航栏,微信小程序可用 |                 "navigationStyle": "custom", //禁用原生导航栏,微信小程序可用 | ||||||
|                 "navigationBarTextStyle":"black", |                 "navigationBarTextStyle": "black", | ||||||
|                 "app-plus": { |                 "app-plus": { | ||||||
|                 	"titleNView": false ,//禁用原生导航栏,APP和H5可用 |                     "titleNView": false, //禁用原生导航栏,APP和H5可用 | ||||||
|                 	"bounce":"none", |                     "bounce": "none", | ||||||
|                 	"scrollIndicator":"none" |                     "scrollIndicator": "none" | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |         }, { | ||||||
|  | 
 | ||||||
|  |             "path": "pages/repairsPage/repairsPage", | ||||||
|  |             "style": { | ||||||
|  |                 "navigationBarTitleText": "添加保修", | ||||||
|  |                 "enablePullDownRefresh": false | ||||||
|             } |             } | ||||||
|         ,{ | 
 | ||||||
|             "path" : "pages/forget/forget", |         }, { | ||||||
|             "style" :                                                                                     |             "path": "pages/project/projectList", | ||||||
|  |             "style": { | ||||||
|  |                 "navigationBarTitleText": "", | ||||||
|  |                 "enablePullDownRefresh": false | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         }, { | ||||||
|  |             "path": "pages/project/details", | ||||||
|  |             "style": { | ||||||
|  |                 "navigationBarTitleText": "" | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         }, | ||||||
|         { |         { | ||||||
|  |             "path": "pages/forget/forget", | ||||||
|  |             "style": { | ||||||
|                 "navigationBarTitleText": "找回密码", |                 "navigationBarTitleText": "找回密码", | ||||||
|                 "enablePullDownRefresh": false |                 "enablePullDownRefresh": false | ||||||
|             } |             } | ||||||
|  | @ -165,7 +175,7 @@ | ||||||
|     }, |     }, | ||||||
|     "globalStyle": { |     "globalStyle": { | ||||||
|         "navigationBarTextStyle": "black", |         "navigationBarTextStyle": "black", | ||||||
| 		"navigationBarBackgroundColor": "#FFFFFF",//导航栏背景色 |         "navigationBarBackgroundColor": "#FFFFFF", //导航栏背景色 | ||||||
| 		"backgroundColor": "#FFFFFF"//窗口背景色 |         "backgroundColor": "#FFFFFF" //窗口背景色 | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,157 @@ | ||||||
|  | <template> | ||||||
|  |     <view class="content"> | ||||||
|  |         <view class="details-head"> | ||||||
|  |             <view class="swiper-head"> | ||||||
|  |                 <swiper class="swiper" @change="changeAutoplay" :autoplay="autoplay" :interval="interval" | ||||||
|  |                     :duration="duration"> | ||||||
|  |                     <swiper-item> | ||||||
|  |                         <view class="swiper-item uni-bg-red"> | ||||||
|  |                             <image class="img" src="../../static/del/项目图片.png" mode="aspectFill"></image> | ||||||
|  |                         </view> | ||||||
|  |                     </swiper-item> | ||||||
|  |                     <swiper-item> | ||||||
|  |                         <view class="swiper-item uni-bg-red"> | ||||||
|  |                             <image class="img" src="../../static/del/项目图片.png" mode="aspectFill"></image> | ||||||
|  |                         </view> | ||||||
|  |                     </swiper-item> | ||||||
|  |                     <swiper-item> | ||||||
|  |                         <view class="swiper-item uni-bg-red"> | ||||||
|  |                             <image class="img" src="../../static/del/项目图片.png" mode="aspectFill"></image> | ||||||
|  |                         </view> | ||||||
|  |                     </swiper-item> | ||||||
|  |                 </swiper> | ||||||
|  | 
 | ||||||
|  |                 <view class="indication-point "> | ||||||
|  |                     {{index}}/3 | ||||||
|  |                 </view> | ||||||
|  | 
 | ||||||
|  |             </view> | ||||||
|  | 
 | ||||||
|  |             <view class="title"> | ||||||
|  |                 湖南工业大学生化学院会议室P2.5全彩LED显示屏 | ||||||
|  |             </view> | ||||||
|  |             <view class="code"> | ||||||
|  |                 XM20220108-1001 | ||||||
|  |             </view> | ||||||
|  | 
 | ||||||
|  |             <view class="address"> | ||||||
|  |                 <image class="img" src="../../static/iocn/im.png" mode=""></image> | ||||||
|  |                 <view class="text"> | ||||||
|  |                     湖南省长沙市高新开发区谷园路109号像素大厦1205 | ||||||
|  |                 </view> | ||||||
|  |             </view> | ||||||
|  | 
 | ||||||
|  |         </view> | ||||||
|  |         <view class="last-date"> | ||||||
|  |             <view class="last-date-content"> | ||||||
|  |                  | ||||||
|  |             </view> | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  |     </view> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     export default { | ||||||
|  |         data() { | ||||||
|  |             return { | ||||||
|  |                 autoplay: true, | ||||||
|  |                 interval: 3000, | ||||||
|  |                 index: 1, | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         methods: { | ||||||
|  |             changeAutoplay(data) { | ||||||
|  |                 console.log() | ||||||
|  |                 this.index = data.detail.current - 0 + 1 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  |     page { | ||||||
|  |         background-color: #F7F7F7; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .content { | ||||||
|  |         padding: 16rpx 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .swiper { | ||||||
|  |         width: 100%; | ||||||
|  |         height: 500rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .swiper .img { | ||||||
|  |         height: 500rpx; | ||||||
|  |         width: 100%; | ||||||
|  |     } | ||||||
|  |     | ||||||
|  |     .details-head { | ||||||
|  |         width: 725rpx; | ||||||
|  |         margin: auto; | ||||||
|  |         padding: 24rpx 12rpx; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         height: 682rpx; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |          | ||||||
|  |         border-radius: 20rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .swiper-head { | ||||||
|  |         position: relative; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .indication-point { | ||||||
|  |         width: 102rpx; | ||||||
|  |         height: 46rpx; | ||||||
|  |         border-radius: 26rpx 0 0 0; | ||||||
|  |         right: 0px; | ||||||
|  |         bottom: 0rpx; | ||||||
|  |         text-align: center; | ||||||
|  |         color: #fff; | ||||||
|  |         position: absolute; | ||||||
|  |         background-color: #e64545; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .details-head .title { | ||||||
|  |         font-size: 28rpx; | ||||||
|  |         padding: 13rpx 0rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .details-head .code { | ||||||
|  |         font-size: 24rpx; | ||||||
|  |         padding: 0rpx 0rpx 13rpx 0rpx; | ||||||
|  |         color: #ff8800; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .address { | ||||||
|  | 
 | ||||||
|  |         display: flex; | ||||||
|  |         align-items: center; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .address .img { | ||||||
|  |         width: 18rpx; | ||||||
|  |         margin-right: 14rpx; | ||||||
|  |         height: 24rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .address .text { | ||||||
|  |         font-size: 24rpx; | ||||||
|  |         color: #666666; | ||||||
|  |     } | ||||||
|  |     .last-date{ | ||||||
|  |         width: 100%; | ||||||
|  |        padding: 10rpx 13rpx 10rpx; | ||||||
|  |         box-shadow: 0rpx 10rpx 10rpx rgba(0,0,0,0.1); | ||||||
|  |     } | ||||||
|  |          | ||||||
|  |     .last-date-content{ | ||||||
|  |      width: 100%; | ||||||
|  |      height: 57rpx; | ||||||
|  |      border-radius: 10rpx; | ||||||
|  |      background: linear-gradient(to right,#FFEBEB,#F7F7F7); | ||||||
|  |     } | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,338 @@ | ||||||
|  | <template> | ||||||
|  |     <view class="content"> | ||||||
|  |         <view class="project-list-input"> | ||||||
|  |             <input type="text" class="int" value="" placeholder="请输入关键字" /> | ||||||
|  |             <image class="search" src="../../static/ss.png" mode=""></image> | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         <view class="screen"> | ||||||
|  |                     <picker @change="bindPickerChange" :value="index" :range="array"> | ||||||
|  |             <view class="li"> | ||||||
|  |                 <view class="text"> | ||||||
|  |                     产品类型 | ||||||
|  |                 </view> | ||||||
|  |                 <image class="img" src="../../static/iocn/xla.png" mode="aspectFill"></image> | ||||||
|  | 
 | ||||||
|  |             </view> | ||||||
|  |     </picker> | ||||||
|  |             <picker mode="date" :value="date"  @change="bindDateChange"> | ||||||
|  |                  | ||||||
|  |                 <view class="li"> | ||||||
|  |                     <view class="text"> | ||||||
|  |                         竣工日期 | ||||||
|  |                     </view> | ||||||
|  |                     <image class="img" src="../../static/iocn/xla.png" mode="aspectFill"></image> | ||||||
|  |                 </view> | ||||||
|  | 
 | ||||||
|  |             </picker> | ||||||
|  | 
 | ||||||
|  |             <view class="li"> | ||||||
|  |                 <view class="text"> | ||||||
|  |                     筛选 | ||||||
|  |                 </view> | ||||||
|  |                 <image class="imgA" src="../../static/iocn/sx.png" mode="aspectFill"></image> | ||||||
|  |             </view> | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  |         <view class="project-list"> | ||||||
|  |             <view class="li"> | ||||||
|  |                 <view class="message"> | ||||||
|  |                     <image class="img" src="../../static/del/项目图片.png" mode="aspectFill"></image> | ||||||
|  | 
 | ||||||
|  |                     <view class="text"> | ||||||
|  |                         <view class="title"> | ||||||
|  |                             湖南工业大学化工学院会议室P2.5全彩LED显示屏 | ||||||
|  |                         </view> | ||||||
|  |                         <view class="serial-number"> | ||||||
|  |                             项目编号:20220108-1001 | ||||||
|  |                         </view> | ||||||
|  |                         <view class="specification"> | ||||||
|  |                             规格型号:DS-CK25FI/H | ||||||
|  |                         </view> | ||||||
|  |                         <view class="specification"> | ||||||
|  |                             产品尺寸:3.94m*2.02m | ||||||
|  |                         </view> | ||||||
|  |                         <view class="installation-site"> | ||||||
|  |                             安装位置:xxx综合楼2楼会议室 | ||||||
|  |                         </view> | ||||||
|  |                     </view> | ||||||
|  |                 </view> | ||||||
|  | 
 | ||||||
|  |                 <view class="project-list-address"> | ||||||
|  |                     <view class="address"> | ||||||
|  |                         <image class="img" src="../../static/iocn/im.png" mode="aspectFill"></image> | ||||||
|  |                         <view class="text"> | ||||||
|  |                             湖南省长沙市高新开发区谷园路109号像素大厦1205 | ||||||
|  |                         </view> | ||||||
|  |                     </view> | ||||||
|  |                     <view class="date"> | ||||||
|  |                         2022/01/08 | ||||||
|  |                     </view> | ||||||
|  |                 </view> | ||||||
|  |                 <view class="icon iconBer"> | ||||||
|  |                     质保到期 | ||||||
|  |                 </view> | ||||||
|  |             </view> | ||||||
|  |             <view class="li"> | ||||||
|  |                 <view class="message"> | ||||||
|  |                     <image class="img" src="../../static/del/项目图片.png" mode="aspectFill"></image> | ||||||
|  | 
 | ||||||
|  |                     <view class="text"> | ||||||
|  |                         <view class="title"> | ||||||
|  |                             湖南工业大学化工学院会议室P2.5全彩LED显示屏 | ||||||
|  |                         </view> | ||||||
|  |                         <view class="serial-number"> | ||||||
|  |                             项目编号:20220108-1001 | ||||||
|  |                         </view> | ||||||
|  |                         <view class="specification"> | ||||||
|  |                             规格型号:DS-CK25FI/H | ||||||
|  |                         </view> | ||||||
|  |                         <view class="specification"> | ||||||
|  |                             产品尺寸:3.94m*2.02m | ||||||
|  |                         </view> | ||||||
|  |                         <view class="installation-site"> | ||||||
|  |                             安装位置:xxx综合楼2楼会议室 | ||||||
|  |                         </view> | ||||||
|  |                     </view> | ||||||
|  |                 </view> | ||||||
|  | 
 | ||||||
|  |                 <view class="project-list-address"> | ||||||
|  |                     <view class="address"> | ||||||
|  |                         <image class="img" src="../../static/iocn/im.png" mode="aspectFill"></image> | ||||||
|  |                         <view class="text"> | ||||||
|  |                             湖南省长沙市高新开发区谷园路109号像素大厦1205 | ||||||
|  |                         </view> | ||||||
|  |                     </view> | ||||||
|  |                     <view class="date"> | ||||||
|  |                         2022/01/08 | ||||||
|  |                     </view> | ||||||
|  |                 </view> | ||||||
|  |                 <view class="icon iconBera"> | ||||||
|  |                     质保中 | ||||||
|  |                 </view> | ||||||
|  |             </view> | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  |     				 | ||||||
|  |     </view> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     export default { | ||||||
|  |         data() { | ||||||
|  |             const currentDate = this.getDate({ | ||||||
|  |                 format: true | ||||||
|  |             }) | ||||||
|  |             return { | ||||||
|  |                 date: currentDate, | ||||||
|  |                 array: ['类型', '类型', '类型', '类型'], | ||||||
|  |                    index: 0, | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         methods: { | ||||||
|  |             bindPickerChange(data){ | ||||||
|  |                   console.log(data) | ||||||
|  |             }, | ||||||
|  |             bindDateChange(date){ | ||||||
|  |                  console.log(date) | ||||||
|  |             }, | ||||||
|  |             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; | ||||||
|  |                 console.log(year,month,day) | ||||||
|  |                 return `${year}-${month}-${day}`; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped> | ||||||
|  |     page { | ||||||
|  |         background-color: #F7F7F7; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list-input { | ||||||
|  |         width: 100%; | ||||||
|  |         height: 114rpx; | ||||||
|  |         position: relative; | ||||||
|  |         padding: 20rpx 16rpx; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         background-color: #FFFFFF | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list-input .int { | ||||||
|  |         width: 100%; | ||||||
|  |         height: 100%; | ||||||
|  |         background-color: #F7F7F7; | ||||||
|  |         padding: 0 25rpx; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         border-radius: 36rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list-input .search { | ||||||
|  |         width: 28rpx; | ||||||
|  |         height: 28rpx; | ||||||
|  |         position: absolute; | ||||||
|  |         right: 43rpx; | ||||||
|  |         top: 50%; | ||||||
|  |         margin-top: -14rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .screen { | ||||||
|  |         display: flex; | ||||||
|  |         justify-content: space-around; | ||||||
|  |         padding: 46rpx 20rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .screen .li { | ||||||
|  |         display: flex; | ||||||
|  |         align-items: center; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .screen .li .text { | ||||||
|  |         font-size: 32rpx; | ||||||
|  |         color: #333333; | ||||||
|  |         margin-right: 10rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .screen .li .img { | ||||||
|  |         width: 14rpx; | ||||||
|  |         height: 8rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .screen .li .imgA { | ||||||
|  |         width: 24rpx; | ||||||
|  |         height: 23rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li { | ||||||
|  |         width: 710rpx; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |         position: relative; | ||||||
|  | 
 | ||||||
|  |         margin: auto; | ||||||
|  |         margin-bottom: 20rpx; | ||||||
|  |         padding: 33rpx 23rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .icon { | ||||||
|  |         width: 135rpx; | ||||||
|  |         height: 40rpx; | ||||||
|  |         position: absolute; | ||||||
|  |         font-size: 24rpx; | ||||||
|  |         color: #FFFFFF; | ||||||
|  |         right: 23rpx; | ||||||
|  |         line-height: 40rpx; | ||||||
|  |         text-align: center; | ||||||
|  |         background-size: 100% 100%; | ||||||
|  |         top: -10rpx; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .iconBer { | ||||||
|  |         background-image: url(../../static/iocn/za.png); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .iconBera { | ||||||
|  |         background-image: url(../../static/iocn/zaa.png); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .message { | ||||||
|  |         display: flex; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .message .img { | ||||||
|  |         width: 230rpx; | ||||||
|  |         margin-right: 11rpx; | ||||||
|  |         height: 180rpx; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .message .text { | ||||||
|  |         flex: 1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .message .text .title { | ||||||
|  |         display: -webkit-box; | ||||||
|  |         -webkit-box-orient: vertical; | ||||||
|  |         -webkit-line-clamp: 1; | ||||||
|  |         overflow: hidden; | ||||||
|  |         text-overflow: ellipsis; | ||||||
|  |         word-wrap: break-word; | ||||||
|  |         word-break: break-all; | ||||||
|  |         margin-bottom: 15rpx; | ||||||
|  |         font-size: 28rpx; | ||||||
|  |         line-height: 29rpx; | ||||||
|  |         color: #333333; | ||||||
|  |         font-weight: bold; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .message .serial-number { | ||||||
|  |         color: #ff8800; | ||||||
|  |         font-size: 24rpx; | ||||||
|  |         margin-bottom: 15rpx; | ||||||
|  |         line-height: 24rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .message .specification { | ||||||
|  |         color: #00b1ff; | ||||||
|  |         font-size: 24rpx; | ||||||
|  |         margin-bottom: 15rpx; | ||||||
|  |         line-height: 24rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list .li .message .installation-site { | ||||||
|  |         color: #6b6a6a; | ||||||
|  |         font-size: 24rpx; | ||||||
|  |         margin-bottom: 15rpx; | ||||||
|  |         line-height: 24rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list-address { | ||||||
|  |         display: flex; | ||||||
|  |         /* justify-content: space-between; */ | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list-address .text { | ||||||
|  |         font-size: 24rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list-address .date { | ||||||
|  |         font-size: 24rpx; | ||||||
|  |         text-align: right; | ||||||
|  |         margin-left: 20rpx; | ||||||
|  |         margin-top: 12rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list-address .img { | ||||||
|  |         width: 23rpx; | ||||||
|  |         height: 28rpx; | ||||||
|  |         margin-right: 10rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .project-list-address .address { | ||||||
|  |         display: flex; | ||||||
|  |         align-items: center; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .pickerDate { | ||||||
|  |         width: 300rpx; | ||||||
|  |         height: 300rpx; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,341 @@ | ||||||
|  | <template> | ||||||
|  |     <view class="content"> | ||||||
|  |         <view class="repairs-nav"> | ||||||
|  |             <view class="li" @click="repairsNavFun(index)" :class="item.state?'on':''" v-for="(item,index) in navDataState"> | ||||||
|  |                 {{item.title}} | ||||||
|  |             </view> | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  |         <view class="repairs-hint padding"> | ||||||
|  |             <image class="icon" src="../../static/iocn/lp.png" mode="aspectFill"></image> | ||||||
|  |             <view class="text"> | ||||||
|  |                 请务必拍好故障照片或视频上传,便于技术工程师作为判断依据,带齐 相关维保设备。高效为您提供服务。 | ||||||
|  |             </view> | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  |         <view class="fault-type-title padding"> | ||||||
|  |             故障类型: | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  |         <view class="padding fault-type-content"> | ||||||
|  |             <view class="li" :class="item.state?'on':''" v-for="(item,index) in faultTypeData"> | ||||||
|  |                 {{item.title}} | ||||||
|  |             </view> | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  |         <view class="padding"> | ||||||
|  |             <view class="devicename" v-if="navDataState[0].state"> | ||||||
|  |              | ||||||
|  |                 <view class=""> | ||||||
|  |                     请填写设备名称和型号或扫描二维码 | ||||||
|  |                 </view> | ||||||
|  |                 <image class="sm" src="../../static/iocn/sm.png" mode=""></image> | ||||||
|  |             </view> | ||||||
|  |             <view class="devicename" v-else> | ||||||
|  |                 请填写设备名称和型号 | ||||||
|  |             </view> | ||||||
|  |         | ||||||
|  |             <view class="fault-pictures"> | ||||||
|  |                 <image class="img" src="../../static/iocn/gz.png" mode="aspectFill"></image> | ||||||
|  |                 <view class="text"> | ||||||
|  |                     添加故障图片 | ||||||
|  |                 </view> | ||||||
|  |             </view> | ||||||
|  | 
 | ||||||
|  |             <textarea value="" class="fault-description" placeholder="故障情况描述" | ||||||
|  |                 placeholder-class="fault-description-text" /> | ||||||
|  | 
 | ||||||
|  |             <view class="detailed-address inputCss"> | ||||||
|  | 
 | ||||||
|  |                 <input type="text" value="" placeholder="请输入详细的上门服务地址" placeholder-class="inputCss-input" /> | ||||||
|  | 
 | ||||||
|  |                 <image @click="mapFun()" src="../../static/iocn/map.png" class="map" mode="aspectFill"></image> | ||||||
|  |             </view> | ||||||
|  | 
 | ||||||
|  |             <input type="text" class="inputCss" placeholder="请填写您的姓名" placeholder-class="inputCss-input" value="" /> | ||||||
|  |             <input type="text" class="inputCss" placeholder="请填写联系电话" placeholder-class="inputCss-input" value="" /> | ||||||
|  |             <uni-datetime-picker type="date" class="uni-datetime-pickerCss" :value="single" :border="false" | ||||||
|  |                 @change="change" /> | ||||||
|  | 
 | ||||||
|  |             <button class="submit-button" type="default">提交故障申报</button> | ||||||
|  |         </view> | ||||||
|  | 
 | ||||||
|  |     </view> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     export default { | ||||||
|  |         data() { | ||||||
|  |             return { | ||||||
|  |                 single: "2021-04-3", | ||||||
|  | 
 | ||||||
|  |                 navDataState: [{ | ||||||
|  |                         title: "有设备", | ||||||
|  |                         state: false | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: "无设备", | ||||||
|  |                         state: true | ||||||
|  |                     }, | ||||||
|  |                 ], | ||||||
|  |                 faultTypeData: [{ | ||||||
|  |                         title: "供电不足", | ||||||
|  |                         state: false | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: "参数错误", | ||||||
|  |                         state: false | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: "模组故障", | ||||||
|  |                         state: false | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: "网络故障", | ||||||
|  |                         state: false | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: "外力损坏", | ||||||
|  |                         state: false | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: "软件问题", | ||||||
|  |                         state: true | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: "信号故障", | ||||||
|  |                         state: false | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: "其他问题", | ||||||
|  |                         state: false | ||||||
|  |                     }, | ||||||
|  |                 ] | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         methods: { | ||||||
|  |             change(e) { | ||||||
|  |                 this.single = e; | ||||||
|  |                 console.log("-change事件:", e); | ||||||
|  |             }, | ||||||
|  |             mapFun() { | ||||||
|  |                 uni.getLocation({ | ||||||
|  |                     type: 'wgs84', | ||||||
|  |                     success: function(res) { | ||||||
|  |                         console.log('当前位置的经度:' + res.longitude); | ||||||
|  |                         console.log('当前位置的纬度:' + res.latitude); | ||||||
|  |                     } | ||||||
|  |                 }); | ||||||
|  |             }, | ||||||
|  |             repairsNavFun(index){ | ||||||
|  |                  for (var i = 0; i < this.navDataState.length; i++) { | ||||||
|  |                      this.navDataState[i].state=false | ||||||
|  |                  } | ||||||
|  |                    this.navDataState[index].state=true | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  |     .repairs-nav { | ||||||
|  |         display: flex; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |         justify-content: space-between; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .repairs-nav .li { | ||||||
|  |         width: 50%; | ||||||
|  |         padding: 30rpx 0rpx; | ||||||
|  |         text-align: center; | ||||||
|  |         display: flex; | ||||||
|  |         align-items: center; | ||||||
|  |         justify-content: center; | ||||||
|  |         font-size: 28rpx; | ||||||
|  |         color: #343536; | ||||||
|  |              border-bottom: 2rpx solid rgba(0,0,0,0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .repairs-nav .on { | ||||||
|  |         color: #00a2ea; | ||||||
|  | 
 | ||||||
|  |         border-bottom: 2rpx solid #00a2ea; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .content { | ||||||
|  |         background-color: #F7F7F7; | ||||||
|  |         min-height: 100vh; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .repairs-hint { | ||||||
|  |         width: 100%; | ||||||
|  |         height: 123rpx; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |         display: flex; | ||||||
|  |         padding-top: 20rpx; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         margin-top: 23rpx; | ||||||
|  |         border-top: 2rpx solid #e7e7e7; | ||||||
|  |         border-bottom: 2rpx solid #e7e7e7; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .repairs-hint .icon { | ||||||
|  |         width: 30rpx; | ||||||
|  |         height: 27rpx; | ||||||
|  |         margin-right: 15rpx; | ||||||
|  |         margin-top: 8rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .repairs-hint .text { | ||||||
|  |         flex: 1; | ||||||
|  |         color: #5e5e5e; | ||||||
|  |         font-size: 22rpx; | ||||||
|  |         line-height: 40rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-type-title { | ||||||
|  |         margin-top: 14rpx; | ||||||
|  |         width: 100%; | ||||||
|  |         line-height: 80rpx; | ||||||
|  |         margin-bottom: 13rpx; | ||||||
|  |         border-top: 2rpx solid #e7e7e7; | ||||||
|  |         border-bottom: 2rpx solid #e7e7e7; | ||||||
|  |         height: 80rpx; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |         color: #434242; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-type-content { | ||||||
|  |         display: flex; | ||||||
|  |         flex-wrap: wrap; | ||||||
|  |         justify-content: space-between; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-type-content .li { | ||||||
|  |         width: 160rpx; | ||||||
|  |         height: 59rpx; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |         font-size: 26rpx; | ||||||
|  |         color: #5e5e5e; | ||||||
|  |         text-align: center; | ||||||
|  |         line-height: 59rpx; | ||||||
|  |         border-radius: 22rpx; | ||||||
|  |         border: 2rpx solid #eeeeee; | ||||||
|  |         margin-bottom: 15rpx; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-type-content .on { | ||||||
|  |         color: #FFFFFF; | ||||||
|  |         border: none; | ||||||
|  |         background-color: #00a2ea; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .information {} | ||||||
|  | 
 | ||||||
|  |     .devicename { | ||||||
|  |         width: 100%; | ||||||
|  |         height: 78rpx; | ||||||
|  |         border-radius: 10rpx; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |         padding: 0 16rpx; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         display: flex; | ||||||
|  |         align-items: center; | ||||||
|  |         justify-content: space-between; | ||||||
|  |         color: #9f9898; | ||||||
|  |         font-size: 26rpx; | ||||||
|  |         line-height: 78rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-pictures { | ||||||
|  |         display: flex; | ||||||
|  |         align-items: center; | ||||||
|  |         justify-content: center; | ||||||
|  |         margin-top: 18rpx; | ||||||
|  |         height: 320rpx; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         width: 100%; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |         flex-direction: column; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-pictures .img { | ||||||
|  |         width: 87rpx; | ||||||
|  |         margin-bottom: 27rpx; | ||||||
|  |         height: 87rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-pictures .text { | ||||||
|  |         font-size: 30rpx; | ||||||
|  | 
 | ||||||
|  |         color: #9f9898; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-description { | ||||||
|  |         height: 193rpx; | ||||||
|  |         width: 100%; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         margin-top: 23rpx; | ||||||
|  |         padding: 23rpx 19rpx; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .fault-description-text { | ||||||
|  |         color: #9f9898; | ||||||
|  |         font-size: 26rpx | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .inputCss { | ||||||
|  |         height: 78rpx; | ||||||
|  |         width: 100%; | ||||||
|  |         box-sizing: border-box; | ||||||
|  |         padding: 0rpx 17rpx; | ||||||
|  |         font-size: 30rpx; | ||||||
|  |         border-radius: 10rpx; | ||||||
|  |         background-color: #FFFFFF; | ||||||
|  |         color: #9f9898; | ||||||
|  |         display: flex; | ||||||
|  |         margin-top: 20rpx; | ||||||
|  |         align-items: center; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .detailed-address { | ||||||
|  |         justify-content: space-between; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .inputCss-input-input { | ||||||
|  |         font-size: 30rpx; | ||||||
|  |         color: #9f9898; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .detailed-address .map { | ||||||
|  |         width: 151rpx; | ||||||
|  |         height: 59rpx; | ||||||
|  |         background-color: #F7F7F7; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .uni-datetime-pickerCss { | ||||||
|  |         margin-top: 20rpx; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .submit-button { | ||||||
|  |         width: 100%; | ||||||
|  |         margin-top: 44rpx; | ||||||
|  |         border-radius: 50rpx; | ||||||
|  |         height: 90rpx; | ||||||
|  |         background-color: #02A2ea; | ||||||
|  |         line-height: 90rpx; | ||||||
|  |         color: #FFFFFF; | ||||||
|  |         text-align: center; | ||||||
|  |         font-size: 30rpx; | ||||||
|  |     } | ||||||
|  |     .devicename .sm{ | ||||||
|  |         width: 42rpx; | ||||||
|  |         height: 36rpx; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
| After Width: | Height: | Size: 64 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 394 B | 
| After Width: | Height: | Size: 747 B | 
| After Width: | Height: | Size: 6.8 KiB | 
| After Width: | Height: | Size: 681 B | 
| After Width: | Height: | Size: 576 B | 
| After Width: | Height: | Size: 161 B | 
| After Width: | Height: | Size: 291 B | 
| After Width: | Height: | Size: 291 B | 
| After Width: | Height: | Size: 714 B | 
|  | @ -0,0 +1,85 @@ | ||||||
|  | ## 2.2.2(2021-12-10) | ||||||
|  | - 修复 clear-icon 属性在小程序平台不生效的 bug | ||||||
|  | ## 2.2.1(2021-12-10) | ||||||
|  | - 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的 bug | ||||||
|  | ## 2.2.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-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) | ||||||
|  | ## 2.1.5(2021-11-09)  | ||||||
|  | - 新增 提供组件设计资源,组件样式调整 | ||||||
|  | ## 2.1.4(2021-09-10) | ||||||
|  | - 修复 hide-second 在移动端的 bug | ||||||
|  | - 修复 单选赋默认值时,赋值日期未高亮的 bug | ||||||
|  | - 修复 赋默认值时,移动端未正确显示时间的 bug | ||||||
|  | ## 2.1.3(2021-09-09) | ||||||
|  | - 新增 hide-second 属性,支持只使用时分,隐藏秒 | ||||||
|  | ## 2.1.2(2021-09-03) | ||||||
|  | - 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次 | ||||||
|  | - 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法 | ||||||
|  | - 优化 调整字号大小,美化日历界面 | ||||||
|  | - 修复 因国际化导致的 placeholder 失效的 bug | ||||||
|  | ## 2.1.1(2021-08-24) | ||||||
|  | - 新增 支持国际化 | ||||||
|  | - 优化 范围选择器在 pc 端过宽的问题 | ||||||
|  | ## 2.1.0(2021-08-09) | ||||||
|  | - 新增 适配 vue3 | ||||||
|  | ## 2.0.19(2021-08-09) | ||||||
|  | - 新增 支持作为 uni-forms 子组件相关功能 | ||||||
|  | - 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug | ||||||
|  | ## 2.0.18(2021-08-05) | ||||||
|  | - 修复 type 属性动态赋值无效的 bug | ||||||
|  | - 修复 ‘确认’按钮被 tabbar 遮盖 bug | ||||||
|  | - 修复 组件未赋值时范围选左、右日历相同的 bug | ||||||
|  | ## 2.0.17(2021-08-04) | ||||||
|  | - 修复 范围选未正确显示当前值的 bug | ||||||
|  | - 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug | ||||||
|  | ## 2.0.16(2021-07-21) | ||||||
|  | - 新增 return-type 属性支持返回 date 日期对象 | ||||||
|  | ## 2.0.15(2021-07-14) | ||||||
|  | - 修复 单选日期类型,初始赋值后不在当前日历的 bug | ||||||
|  | - 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效) | ||||||
|  | - 优化 移动端移除显示框的清空按钮,无实际用途 | ||||||
|  | ## 2.0.14(2021-07-14) | ||||||
|  | - 修复 组件赋值为空,界面未更新的 bug | ||||||
|  | - 修复 start 和 end 不能动态赋值的 bug | ||||||
|  | - 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的 bug | ||||||
|  | ## 2.0.13(2021-07-08) | ||||||
|  | - 修复 范围选择不能动态赋值的 bug | ||||||
|  | ## 2.0.12(2021-07-08) | ||||||
|  | - 修复 范围选择的初始时间在一个月内时,造成无法选择的bug | ||||||
|  | ## 2.0.11(2021-07-08) | ||||||
|  | - 优化 弹出层在超出视窗边缘定位不准确的问题 | ||||||
|  | ## 2.0.10(2021-07-08) | ||||||
|  | - 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的 bug | ||||||
|  | - 优化 弹出层在超出视窗边缘被遮盖的问题 | ||||||
|  | ## 2.0.9(2021-07-07) | ||||||
|  | - 新增 maskClick 事件 | ||||||
|  | - 修复 特殊情况日历 rpx 布局错误的 bug,rpx -> px | ||||||
|  | - 修复 范围选择时清空返回值不合理的bug,['', ''] -> [] | ||||||
|  | ## 2.0.8(2021-07-07) | ||||||
|  | - 新增 日期时间显示框支持插槽 | ||||||
|  | ## 2.0.7(2021-07-01) | ||||||
|  | - 优化 添加 uni-icons 依赖 | ||||||
|  | ## 2.0.6(2021-05-22) | ||||||
|  | - 修复 图标在小程序上不显示的 bug | ||||||
|  | - 优化 重命名引用组件,避免潜在组件命名冲突 | ||||||
|  | ## 2.0.5(2021-05-20) | ||||||
|  | - 优化 代码目录扁平化 | ||||||
|  | ## 2.0.4(2021-05-12) | ||||||
|  | - 新增 组件示例地址 | ||||||
|  | ## 2.0.3(2021-05-10) | ||||||
|  | - 修复 ios 下不识别 '-' 日期格式的 bug | ||||||
|  | - 优化 pc 下弹出层添加边框和阴影 | ||||||
|  | ## 2.0.2(2021-05-08) | ||||||
|  | - 修复 在 admin 中获取弹出层定位错误的bug | ||||||
|  | ## 2.0.1(2021-05-08) | ||||||
|  | - 修复 type 属性向下兼容,默认值从 date 变更为 datetime | ||||||
|  | ## 2.0.0(2021-04-30) | ||||||
|  | - 支持日历形式的日期+时间的范围选择 | ||||||
|  |  > 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker) | ||||||
|  | ## 1.0.6(2021-03-18) | ||||||
|  | - 新增 hide-second 属性,时间支持仅选择时、分 | ||||||
|  | - 修复 选择跟显示的日期不一样的 bug | ||||||
|  | - 修复 chang事件触发2次的 bug | ||||||
|  | - 修复 分、秒 end 范围错误的 bug | ||||||
|  | - 优化 更好的 nvue 适配 | ||||||
|  | @ -0,0 +1,185 @@ | ||||||
|  | <template> | ||||||
|  | 	<view class="uni-calendar-item__weeks-box" :class="{ | ||||||
|  | 		'uni-calendar-item--disable':weeks.disable, | ||||||
|  | 		'uni-calendar-item--before-checked-x':weeks.beforeMultiple, | ||||||
|  | 		'uni-calendar-item--multiple': weeks.multiple, | ||||||
|  | 		'uni-calendar-item--after-checked-x':weeks.afterMultiple, | ||||||
|  | 		}" @click="choiceDate(weeks)" @mouseenter="handleMousemove(weeks)"> | ||||||
|  | 		<view class="uni-calendar-item__weeks-box-item" :class="{ | ||||||
|  | 				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && (calendar.userChecked || !checkHover), | ||||||
|  | 				'uni-calendar-item--checked-range-text': checkHover, | ||||||
|  | 				'uni-calendar-item--before-checked':weeks.beforeMultiple, | ||||||
|  | 				'uni-calendar-item--multiple': weeks.multiple, | ||||||
|  | 				'uni-calendar-item--after-checked':weeks.afterMultiple, | ||||||
|  | 				'uni-calendar-item--disable':weeks.disable, | ||||||
|  | 				}"> | ||||||
|  | 			<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text> | ||||||
|  | 			<text class="uni-calendar-item__weeks-box-text uni-calendar-item__weeks-box-text-disable uni-calendar-item--checked-text">{{weeks.date}}</text> | ||||||
|  | 		</view> | ||||||
|  | 		<view :class="{'uni-calendar-item--isDay': weeks.isDay}"></view> | ||||||
|  | 	</view> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | 	export default { | ||||||
|  | 		props: { | ||||||
|  | 			weeks: { | ||||||
|  | 				type: Object, | ||||||
|  | 				default () { | ||||||
|  | 					return {} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			calendar: { | ||||||
|  | 				type: Object, | ||||||
|  | 				default: () => { | ||||||
|  | 					return {} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			selected: { | ||||||
|  | 				type: Array, | ||||||
|  | 				default: () => { | ||||||
|  | 					return [] | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			lunar: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: false | ||||||
|  | 			}, | ||||||
|  | 			checkHover: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: false | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		methods: { | ||||||
|  | 			choiceDate(weeks) { | ||||||
|  | 				this.$emit('change', weeks) | ||||||
|  | 			}, | ||||||
|  | 			handleMousemove(weeks) { | ||||||
|  | 				this.$emit('handleMouse', weeks) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="scss" scoped> | ||||||
|  | 	.uni-calendar-item__weeks-box { | ||||||
|  | 		flex: 1; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: column; | ||||||
|  | 		justify-content: center; | ||||||
|  | 		align-items: center; | ||||||
|  | 		margin: 1px 0; | ||||||
|  | 		position: relative; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item__weeks-box-text { | ||||||
|  | 		font-size: 14px; | ||||||
|  | 		// font-family: Lato-Bold, Lato; | ||||||
|  | 		font-weight: bold; | ||||||
|  | 		color: #455997; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item__weeks-lunar-text { | ||||||
|  | 		font-size: 12px; | ||||||
|  | 		color: #333; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item__weeks-box-item { | ||||||
|  | 		position: relative; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: column; | ||||||
|  | 		justify-content: center; | ||||||
|  | 		align-items: center; | ||||||
|  | 		width: 40px; | ||||||
|  | 		height: 40px; | ||||||
|  | 		/* #ifdef H5 */ | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item__weeks-box-circle { | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 5px; | ||||||
|  | 		right: 5px; | ||||||
|  | 		width: 8px; | ||||||
|  | 		height: 8px; | ||||||
|  | 		border-radius: 8px; | ||||||
|  | 		background-color: #dd524d; | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item__weeks-box .uni-calendar-item--disable { | ||||||
|  | 		// background-color: rgba(249, 249, 249, $uni-opacity-disabled); | ||||||
|  | 		cursor: default; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--disable .uni-calendar-item__weeks-box-text-disable { | ||||||
|  | 		color: #D1D1D1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--isDay { | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 10px; | ||||||
|  | 		right: 17%; | ||||||
|  | 		background-color: #dd524d; | ||||||
|  | 		width:6px; | ||||||
|  | 		height: 6px; | ||||||
|  | 		border-radius: 50%; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--extra { | ||||||
|  | 		color: #dd524d; | ||||||
|  | 		opacity: 0.8; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item__weeks-box .uni-calendar-item--checked { | ||||||
|  | 		background-color: #007aff; | ||||||
|  | 		border-radius: 50%; | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		border: 3px solid #fff; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--checked .uni-calendar-item--checked-text { | ||||||
|  | 		color: #fff; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--multiple .uni-calendar-item--checked-range-text { | ||||||
|  | 		color: #333; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--multiple { | ||||||
|  | 		background-color:  #F6F7FC; | ||||||
|  | 		// color: #fff; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--multiple .uni-calendar-item--before-checked, | ||||||
|  | 	.uni-calendar-item--multiple .uni-calendar-item--after-checked { | ||||||
|  | 		background-color: #409eff; | ||||||
|  | 		border-radius: 50%; | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		border: 3px solid #F6F7FC; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--before-checked .uni-calendar-item--checked-text, | ||||||
|  | 	.uni-calendar-item--after-checked .uni-calendar-item--checked-text { | ||||||
|  | 		color: #fff; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--before-checked-x { | ||||||
|  | 		border-top-left-radius: 50px; | ||||||
|  | 		border-bottom-left-radius: 50px; | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		background-color: #F6F7FC; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar-item--after-checked-x { | ||||||
|  | 		border-top-right-radius: 50px; | ||||||
|  | 		border-bottom-right-radius: 50px; | ||||||
|  | 		background-color: #F6F7FC; | ||||||
|  | 	} | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,898 @@ | ||||||
|  | <template> | ||||||
|  | 	<view class="uni-calendar" @mouseleave="leaveCale"> | ||||||
|  | 		<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" | ||||||
|  | 			@click="clean"></view> | ||||||
|  | 		<view v-if="insert || show" class="uni-calendar__content" | ||||||
|  | 			:class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow, 'uni-calendar__content-mobile': aniMaskShow}"> | ||||||
|  | 			<view class="uni-calendar__header" :class="{'uni-calendar__header-mobile' :!insert}"> | ||||||
|  | 				<view v-if="left" class="uni-calendar__header-btn-box" @click.stop="pre"> | ||||||
|  | 					<view class="uni-calendar__header-btn uni-calendar--left"></view> | ||||||
|  | 				</view> | ||||||
|  | 				<picker mode="date" :value="date" fields="month" @change="bindDateChange"> | ||||||
|  | 					<text | ||||||
|  | 						class="uni-calendar__header-text">{{ (nowDate.year||'') + ' 年 ' + ( nowDate.month||'') +' 月'}}</text> | ||||||
|  | 				</picker> | ||||||
|  | 				<view v-if="right" class="uni-calendar__header-btn-box" @click.stop="next"> | ||||||
|  | 					<view class="uni-calendar__header-btn uni-calendar--right"></view> | ||||||
|  | 				</view> | ||||||
|  | 				<view v-if="!insert" class="dialog-close" @click="clean"> | ||||||
|  | 					<view class="dialog-close-plus" data-id="close"></view> | ||||||
|  | 					<view class="dialog-close-plus dialog-close-rotate" data-id="close"></view> | ||||||
|  | 				</view> | ||||||
|  | 
 | ||||||
|  | 				<!-- <text class="uni-calendar__backtoday" @click="backtoday">回到今天</text> --> | ||||||
|  | 			</view> | ||||||
|  | 			<view class="uni-calendar__box"> | ||||||
|  | 				<view v-if="showMonth" class="uni-calendar__box-bg"> | ||||||
|  | 					<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text> | ||||||
|  | 				</view> | ||||||
|  | 				<view class="uni-calendar__weeks" style="padding-bottom: 7px;"> | ||||||
|  | 					<view class="uni-calendar__weeks-day"> | ||||||
|  | 						<text class="uni-calendar__weeks-day-text">{{SUNText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 					<view class="uni-calendar__weeks-day"> | ||||||
|  | 						<text class="uni-calendar__weeks-day-text">{{monText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 					<view class="uni-calendar__weeks-day"> | ||||||
|  | 						<text class="uni-calendar__weeks-day-text">{{TUEText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 					<view class="uni-calendar__weeks-day"> | ||||||
|  | 						<text class="uni-calendar__weeks-day-text">{{WEDText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 					<view class="uni-calendar__weeks-day"> | ||||||
|  | 						<text class="uni-calendar__weeks-day-text">{{THUText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 					<view class="uni-calendar__weeks-day"> | ||||||
|  | 						<text class="uni-calendar__weeks-day-text">{{FRIText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 					<view class="uni-calendar__weeks-day"> | ||||||
|  | 						<text class="uni-calendar__weeks-day-text">{{SATText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 				</view> | ||||||
|  | 				<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex"> | ||||||
|  | 					<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex"> | ||||||
|  | 						<calendar-item class="uni-calendar-item--hook" :weeks="weeks" :calendar="calendar" | ||||||
|  | 							:selected="selected" :lunar="lunar" :checkHover="range" @change="choiceDate" | ||||||
|  | 							@handleMouse="handleMouse"> | ||||||
|  | 						</calendar-item> | ||||||
|  | 					</view> | ||||||
|  | 				</view> | ||||||
|  | 			</view> | ||||||
|  | 			<view v-if="!insert && !range && typeHasTime" class="uni-date-changed uni-calendar--fixed-top" | ||||||
|  | 				style="padding: 0 80px;"> | ||||||
|  | 				<view class="uni-date-changed--time-date">{{tempSingleDate ? tempSingleDate : selectDateText}}</view> | ||||||
|  | 				<time-picker type="time" :start="reactStartTime" :end="reactEndTime" v-model="time" | ||||||
|  | 					:disabled="!tempSingleDate" :border="false" :hide-second="hideSecond" class="time-picker-style"> | ||||||
|  | 				</time-picker> | ||||||
|  | 			</view> | ||||||
|  | 
 | ||||||
|  | 			<view v-if="!insert && range && typeHasTime" class="uni-date-changed uni-calendar--fixed-top"> | ||||||
|  | 				<view class="uni-date-changed--time-start"> | ||||||
|  | 					<view class="uni-date-changed--time-date">{{tempRange.before ? tempRange.before : startDateText}} | ||||||
|  | 					</view> | ||||||
|  | 					<time-picker type="time" :start="reactStartTime" v-model="timeRange.startTime" :border="false" | ||||||
|  | 						:hide-second="hideSecond" :disabled="!tempRange.before" class="time-picker-style"> | ||||||
|  | 					</time-picker> | ||||||
|  | 				</view> | ||||||
|  | 				<uni-icons type="arrowthinright" color="#999" style="line-height: 50px;"></uni-icons> | ||||||
|  | 				<view class="uni-date-changed--time-end"> | ||||||
|  | 					<view class="uni-date-changed--time-date">{{tempRange.after ? tempRange.after : endDateText}}</view> | ||||||
|  | 					<time-picker type="time" :end="reactEndTime" v-model="timeRange.endTime" :border="false" | ||||||
|  | 						:hide-second="hideSecond" :disabled="!tempRange.after" class="time-picker-style"> | ||||||
|  | 					</time-picker> | ||||||
|  | 				</view> | ||||||
|  | 			</view> | ||||||
|  | 			<view v-if="!insert" class="uni-date-changed uni-date-btn--ok"> | ||||||
|  | 				<!-- <view class="uni-calendar__header-btn-box"> | ||||||
|  | 					<text class="uni-calendar__button-text uni-calendar--fixed-width">{{okText}}</text> | ||||||
|  | 				</view> --> | ||||||
|  | 				<view class="uni-datetime-picker--btn" @click="confirm">确认</view> | ||||||
|  | 			</view> | ||||||
|  | 		</view> | ||||||
|  | 	</view> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | 	import Calendar from './util.js'; | ||||||
|  | 	import calendarItem from './calendar-item.vue' | ||||||
|  | 	import timePicker from './time-picker.vue' | ||||||
|  | 	import { | ||||||
|  | 		initVueI18n | ||||||
|  | 	} from '@dcloudio/uni-i18n' | ||||||
|  | 	import messages from './i18n/index.js' | ||||||
|  | 	const { | ||||||
|  | 		t | ||||||
|  | 	} = initVueI18n(messages) | ||||||
|  | 	/** | ||||||
|  | 	 * Calendar 日历 | ||||||
|  | 	 * @description 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等 | ||||||
|  | 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=56 | ||||||
|  | 	 * @property {String} date 自定义当前时间,默认为今天 | ||||||
|  | 	 * @property {Boolean} lunar 显示农历 | ||||||
|  | 	 * @property {String} startDate 日期选择范围-开始日期 | ||||||
|  | 	 * @property {String} endDate 日期选择范围-结束日期 | ||||||
|  | 	 * @property {Boolean} range 范围选择 | ||||||
|  | 	 * @property {Boolean} insert = [true|false] 插入模式,默认为false | ||||||
|  | 	 * 	@value true 弹窗模式 | ||||||
|  | 	 * 	@value false 插入模式 | ||||||
|  | 	 * @property {Boolean} clearDate = [true|false] 弹窗模式是否清空上次选择内容 | ||||||
|  | 	 * @property {Array} selected 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}] | ||||||
|  | 	 * @property {Boolean} showMonth 是否选择月份为背景 | ||||||
|  | 	 * @event {Function} change 日期改变,`insert :ture` 时生效 | ||||||
|  | 	 * @event {Function} confirm 确认选择`insert :false` 时生效 | ||||||
|  | 	 * @event {Function} monthSwitch 切换月份时触发 | ||||||
|  | 	 * @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" /> | ||||||
|  | 	 */ | ||||||
|  | 	export default { | ||||||
|  | 		components: { | ||||||
|  | 			calendarItem, | ||||||
|  | 			timePicker | ||||||
|  | 		}, | ||||||
|  | 		props: { | ||||||
|  | 			date: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			defTime: { | ||||||
|  | 				type: [String, Object], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			selectableTimes: { | ||||||
|  | 				type: [Object], | ||||||
|  | 				default () { | ||||||
|  | 					return {} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			selected: { | ||||||
|  | 				type: Array, | ||||||
|  | 				default () { | ||||||
|  | 					return [] | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			lunar: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: false | ||||||
|  | 			}, | ||||||
|  | 			startDate: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			endDate: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			range: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: false | ||||||
|  | 			}, | ||||||
|  | 			typeHasTime: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: false | ||||||
|  | 			}, | ||||||
|  | 			insert: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			showMonth: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			clearDate: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			left: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			right: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			checkHover: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			hideSecond: { | ||||||
|  | 				type: [Boolean], | ||||||
|  | 				default: false | ||||||
|  | 			}, | ||||||
|  | 			pleStatus: { | ||||||
|  | 				type: Object, | ||||||
|  | 				default () { | ||||||
|  | 					return { | ||||||
|  | 						before: '', | ||||||
|  | 						after: '', | ||||||
|  | 						data: [], | ||||||
|  | 						fulldate: '' | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		data() { | ||||||
|  | 			return { | ||||||
|  | 				show: false, | ||||||
|  | 				weeks: [], | ||||||
|  | 				calendar: {}, | ||||||
|  | 				nowDate: '', | ||||||
|  | 				aniMaskShow: false, | ||||||
|  | 				firstEnter: true, | ||||||
|  | 				time: '', | ||||||
|  | 				timeRange: { | ||||||
|  | 					startTime: '', | ||||||
|  | 					endTime: '' | ||||||
|  | 				}, | ||||||
|  | 				tempSingleDate: '', | ||||||
|  | 				tempRange: { | ||||||
|  | 					before: '', | ||||||
|  | 					after: '' | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		watch: { | ||||||
|  | 			date: { | ||||||
|  | 				immediate: true, | ||||||
|  | 				handler(newVal, oldVal) { | ||||||
|  | 					if (!this.range) { | ||||||
|  | 						this.tempSingleDate = newVal | ||||||
|  | 						setTimeout(() => { | ||||||
|  | 							this.init(newVal) | ||||||
|  | 						}, 100) | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			defTime: { | ||||||
|  | 				immediate: true, | ||||||
|  | 				handler(newVal, oldVal) { | ||||||
|  | 					if (!this.range) { | ||||||
|  | 						this.time = newVal | ||||||
|  | 					} else { | ||||||
|  | 						// console.log('-----', newVal); | ||||||
|  | 						this.timeRange.startTime = newVal.start | ||||||
|  | 						this.timeRange.endTime = newVal.end | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			startDate(val) { | ||||||
|  | 				this.cale.resetSatrtDate(val) | ||||||
|  | 				this.cale.setDate(this.nowDate.fullDate) | ||||||
|  | 				this.weeks = this.cale.weeks | ||||||
|  | 			}, | ||||||
|  | 			endDate(val) { | ||||||
|  | 				this.cale.resetEndDate(val) | ||||||
|  | 				this.cale.setDate(this.nowDate.fullDate) | ||||||
|  | 				this.weeks = this.cale.weeks | ||||||
|  | 			}, | ||||||
|  | 			selected(newVal) { | ||||||
|  | 				this.cale.setSelectInfo(this.nowDate.fullDate, newVal) | ||||||
|  | 				this.weeks = this.cale.weeks | ||||||
|  | 			}, | ||||||
|  | 			pleStatus: { | ||||||
|  | 				immediate: true, | ||||||
|  | 				handler(newVal, oldVal) { | ||||||
|  | 					const { | ||||||
|  | 						before, | ||||||
|  | 						after, | ||||||
|  | 						fulldate, | ||||||
|  | 						which | ||||||
|  | 					} = newVal | ||||||
|  | 					this.tempRange.before = before | ||||||
|  | 					this.tempRange.after = after | ||||||
|  | 					setTimeout(() => { | ||||||
|  | 						if (fulldate) { | ||||||
|  | 							this.cale.setHoverMultiple(fulldate) | ||||||
|  | 							if (before && after) { | ||||||
|  | 								this.cale.lastHover = true | ||||||
|  | 								if (this.rangeWithinMonth(after, before)) return | ||||||
|  | 								this.setDate(before) | ||||||
|  | 							} else { | ||||||
|  | 								this.cale.setMultiple(fulldate) | ||||||
|  | 								this.setDate(this.nowDate.fullDate) | ||||||
|  | 								this.calendar.fullDate = '' | ||||||
|  | 								this.cale.lastHover = false | ||||||
|  | 							} | ||||||
|  | 						} else { | ||||||
|  | 							this.cale.setDefaultMultiple(before, after) | ||||||
|  | 							if (which === 'left') { | ||||||
|  | 								this.setDate(before) | ||||||
|  | 								this.weeks = this.cale.weeks | ||||||
|  | 							} else { | ||||||
|  | 								this.setDate(after) | ||||||
|  | 								this.weeks = this.cale.weeks | ||||||
|  | 							} | ||||||
|  | 							this.cale.lastHover = true | ||||||
|  | 						} | ||||||
|  | 					}, 16) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		computed: { | ||||||
|  | 			reactStartTime() { | ||||||
|  | 				const activeDate = this.range ? this.tempRange.before : this.calendar.fullDate | ||||||
|  | 				const res = activeDate === this.startDate ? this.selectableTimes.start : '' | ||||||
|  | 				return res | ||||||
|  | 			}, | ||||||
|  | 			reactEndTime() { | ||||||
|  | 				const activeDate = this.range ? this.tempRange.after : this.calendar.fullDate | ||||||
|  | 				const res = activeDate === this.endDate ? this.selectableTimes.end : '' | ||||||
|  | 				return res | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * for i18n | ||||||
|  | 			 */ | ||||||
|  | 			selectDateText() { | ||||||
|  | 				return t("uni-datetime-picker.selectDate") | ||||||
|  | 			}, | ||||||
|  | 			startDateText() { | ||||||
|  | 				return this.startPlaceholder || t("uni-datetime-picker.startDate") | ||||||
|  | 			}, | ||||||
|  | 			endDateText() { | ||||||
|  | 				return this.endPlaceholder || t("uni-datetime-picker.endDate") | ||||||
|  | 			}, | ||||||
|  | 			okText() { | ||||||
|  | 				return t("uni-datetime-picker.ok") | ||||||
|  | 			}, | ||||||
|  | 			monText() { | ||||||
|  | 				return t("uni-calender.MON") | ||||||
|  | 			}, | ||||||
|  | 			TUEText() { | ||||||
|  | 				return t("uni-calender.TUE") | ||||||
|  | 			}, | ||||||
|  | 			WEDText() { | ||||||
|  | 				return t("uni-calender.WED") | ||||||
|  | 			}, | ||||||
|  | 			THUText() { | ||||||
|  | 				return t("uni-calender.THU") | ||||||
|  | 			}, | ||||||
|  | 			FRIText() { | ||||||
|  | 				return t("uni-calender.FRI") | ||||||
|  | 			}, | ||||||
|  | 			SATText() { | ||||||
|  | 				return t("uni-calender.SAT") | ||||||
|  | 			}, | ||||||
|  | 			SUNText() { | ||||||
|  | 				return t("uni-calender.SUN") | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		created() { | ||||||
|  | 			// 获取日历方法实例 | ||||||
|  | 			this.cale = new Calendar({ | ||||||
|  | 				// date: new Date(), | ||||||
|  | 				selected: this.selected, | ||||||
|  | 				startDate: this.startDate, | ||||||
|  | 				endDate: this.endDate, | ||||||
|  | 				range: this.range, | ||||||
|  | 				// multipleStatus: this.pleStatus | ||||||
|  | 			}) | ||||||
|  | 			// 选中某一天 | ||||||
|  | 			// this.cale.setDate(this.date) | ||||||
|  | 			this.init(this.date) | ||||||
|  | 			// this.setDay | ||||||
|  | 		}, | ||||||
|  | 		methods: { | ||||||
|  | 			leaveCale() { | ||||||
|  | 				this.firstEnter = true | ||||||
|  | 			}, | ||||||
|  | 			handleMouse(weeks) { | ||||||
|  | 				if (weeks.disable) return | ||||||
|  | 				if (this.cale.lastHover) return | ||||||
|  | 				let { | ||||||
|  | 					before, | ||||||
|  | 					after | ||||||
|  | 				} = this.cale.multipleStatus | ||||||
|  | 				if (!before) return | ||||||
|  | 				this.calendar = weeks | ||||||
|  | 				// 设置范围选 | ||||||
|  | 				this.cale.setHoverMultiple(this.calendar.fullDate) | ||||||
|  | 				this.weeks = this.cale.weeks | ||||||
|  | 				// hover时,进入一个日历,更新另一个 | ||||||
|  | 				if (this.firstEnter) { | ||||||
|  | 					this.$emit('firstEnterCale', this.cale.multipleStatus) | ||||||
|  | 					this.firstEnter = false | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			rangeWithinMonth(A, B) { | ||||||
|  | 				const [yearA, monthA] = A.split('-') | ||||||
|  | 				const [yearB, monthB] = B.split('-') | ||||||
|  | 				return yearA === yearB && monthA === monthB | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 取消穿透 | ||||||
|  | 			clean() { | ||||||
|  | 				this.close() | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			clearCalender() { | ||||||
|  | 				if (this.range) { | ||||||
|  | 					this.timeRange.startTime = '' | ||||||
|  | 					this.timeRange.endTime = '' | ||||||
|  | 					this.tempRange.before = '' | ||||||
|  | 					this.tempRange.after = '' | ||||||
|  | 					this.cale.multipleStatus.before = '' | ||||||
|  | 					this.cale.multipleStatus.after = '' | ||||||
|  | 					this.cale.multipleStatus.data = [] | ||||||
|  | 					this.cale.lastHover = false | ||||||
|  | 				} else { | ||||||
|  | 					this.time = '' | ||||||
|  | 					this.tempSingleDate = '' | ||||||
|  | 				} | ||||||
|  | 				this.calendar.fullDate = '' | ||||||
|  | 				this.setDate() | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			bindDateChange(e) { | ||||||
|  | 				const value = e.detail.value + '-1' | ||||||
|  | 				this.init(value) | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 初始化日期显示 | ||||||
|  | 			 * @param {Object} date | ||||||
|  | 			 */ | ||||||
|  | 			init(date) { | ||||||
|  | 				this.cale.setDate(date) | ||||||
|  | 				this.weeks = this.cale.weeks | ||||||
|  | 				this.nowDate = this.calendar = this.cale.getInfo(date) | ||||||
|  | 			}, | ||||||
|  | 			// choiceDate(weeks) { | ||||||
|  | 			// 	if (weeks.disable) return | ||||||
|  | 			// 	this.calendar = weeks | ||||||
|  | 			// 	// 设置多选 | ||||||
|  | 			// 	this.cale.setMultiple(this.calendar.fullDate, true) | ||||||
|  | 			// 	this.weeks = this.cale.weeks | ||||||
|  | 			// 	this.tempSingleDate = this.calendar.fullDate | ||||||
|  | 			// 	this.tempRange.before = this.cale.multipleStatus.before | ||||||
|  | 			// 	this.tempRange.after = this.cale.multipleStatus.after | ||||||
|  | 			// 	this.change() | ||||||
|  | 			// }, | ||||||
|  | 			/** | ||||||
|  | 			 * 打开日历弹窗 | ||||||
|  | 			 */ | ||||||
|  | 			open() { | ||||||
|  | 				// 弹窗模式并且清理数据 | ||||||
|  | 				if (this.clearDate && !this.insert) { | ||||||
|  | 					this.cale.cleanMultipleStatus() | ||||||
|  | 					// this.cale.setDate(this.date) | ||||||
|  | 					this.init(this.date) | ||||||
|  | 				} | ||||||
|  | 				this.show = true | ||||||
|  | 				this.$nextTick(() => { | ||||||
|  | 					setTimeout(() => { | ||||||
|  | 						this.aniMaskShow = true | ||||||
|  | 					}, 50) | ||||||
|  | 				}) | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 关闭日历弹窗 | ||||||
|  | 			 */ | ||||||
|  | 			close() { | ||||||
|  | 				this.aniMaskShow = false | ||||||
|  | 				this.$nextTick(() => { | ||||||
|  | 					setTimeout(() => { | ||||||
|  | 						this.show = false | ||||||
|  | 						this.$emit('close') | ||||||
|  | 					}, 300) | ||||||
|  | 				}) | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 确认按钮 | ||||||
|  | 			 */ | ||||||
|  | 			confirm() { | ||||||
|  | 				this.setEmit('confirm') | ||||||
|  | 				this.close() | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 变化触发 | ||||||
|  | 			 */ | ||||||
|  | 			change() { | ||||||
|  | 				if (!this.insert) return | ||||||
|  | 				this.setEmit('change') | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 选择月份触发 | ||||||
|  | 			 */ | ||||||
|  | 			monthSwitch() { | ||||||
|  | 				let { | ||||||
|  | 					year, | ||||||
|  | 					month | ||||||
|  | 				} = this.nowDate | ||||||
|  | 				this.$emit('monthSwitch', { | ||||||
|  | 					year, | ||||||
|  | 					month: Number(month) | ||||||
|  | 				}) | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 派发事件 | ||||||
|  | 			 * @param {Object} name | ||||||
|  | 			 */ | ||||||
|  | 			setEmit(name) { | ||||||
|  | 				let { | ||||||
|  | 					year, | ||||||
|  | 					month, | ||||||
|  | 					date, | ||||||
|  | 					fullDate, | ||||||
|  | 					lunar, | ||||||
|  | 					extraInfo | ||||||
|  | 				} = this.calendar | ||||||
|  | 				this.$emit(name, { | ||||||
|  | 					range: this.cale.multipleStatus, | ||||||
|  | 					year, | ||||||
|  | 					month, | ||||||
|  | 					date, | ||||||
|  | 					time: this.time, | ||||||
|  | 					timeRange: this.timeRange, | ||||||
|  | 					fulldate: fullDate, | ||||||
|  | 					lunar, | ||||||
|  | 					extraInfo: extraInfo || {} | ||||||
|  | 				}) | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 选择天触发 | ||||||
|  | 			 * @param {Object} weeks | ||||||
|  | 			 */ | ||||||
|  | 			choiceDate(weeks) { | ||||||
|  | 				if (weeks.disable) return | ||||||
|  | 				this.calendar = weeks | ||||||
|  | 				this.calendar.userChecked = true | ||||||
|  | 				// 设置多选 | ||||||
|  | 				this.cale.setMultiple(this.calendar.fullDate, true) | ||||||
|  | 				this.weeks = this.cale.weeks | ||||||
|  | 				this.tempSingleDate = this.calendar.fullDate | ||||||
|  | 				this.tempRange.before = this.cale.multipleStatus.before | ||||||
|  | 				this.tempRange.after = this.cale.multipleStatus.after | ||||||
|  | 				this.change() | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 回到今天 | ||||||
|  | 			 */ | ||||||
|  | 			backtoday() { | ||||||
|  | 				let date = this.cale.getDate(new Date()).fullDate | ||||||
|  | 				// this.cale.setDate(date) | ||||||
|  | 				this.init(date) | ||||||
|  | 				this.change() | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 比较时间大小 | ||||||
|  | 			 */ | ||||||
|  | 			dateCompare(startDate, endDate) { | ||||||
|  | 				// 计算截止时间 | ||||||
|  | 				startDate = new Date(startDate.replace('-', '/').replace('-', '/')) | ||||||
|  | 				// 计算详细项的截止时间 | ||||||
|  | 				endDate = new Date(endDate.replace('-', '/').replace('-', '/')) | ||||||
|  | 				if (startDate <= endDate) { | ||||||
|  | 					return true | ||||||
|  | 				} else { | ||||||
|  | 					return false | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 上个月 | ||||||
|  | 			 */ | ||||||
|  | 			pre() { | ||||||
|  | 				const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate | ||||||
|  | 				this.setDate(preDate) | ||||||
|  | 				this.monthSwitch() | ||||||
|  | 
 | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 下个月 | ||||||
|  | 			 */ | ||||||
|  | 			next() { | ||||||
|  | 				const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate | ||||||
|  | 				this.setDate(nextDate) | ||||||
|  | 				this.monthSwitch() | ||||||
|  | 			}, | ||||||
|  | 			/** | ||||||
|  | 			 * 设置日期 | ||||||
|  | 			 * @param {Object} date | ||||||
|  | 			 */ | ||||||
|  | 			setDate(date) { | ||||||
|  | 				this.cale.setDate(date) | ||||||
|  | 				this.weeks = this.cale.weeks | ||||||
|  | 				this.nowDate = this.cale.getInfo(date) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="scss" scoped> | ||||||
|  | 	.uni-calendar { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: column; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__mask { | ||||||
|  | 		position: fixed; | ||||||
|  | 		bottom: 0; | ||||||
|  | 		top: 0; | ||||||
|  | 		left: 0; | ||||||
|  | 		right: 0; | ||||||
|  | 		background-color: rgba(0, 0, 0, 0.4); | ||||||
|  | 		transition-property: opacity; | ||||||
|  | 		transition-duration: 0.3s; | ||||||
|  | 		opacity: 0; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		z-index: 99; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar--mask-show { | ||||||
|  | 		opacity: 1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar--fixed { | ||||||
|  | 		position: fixed; | ||||||
|  | 		bottom: calc(var(--window-bottom)); | ||||||
|  | 		left: 0; | ||||||
|  | 		right: 0; | ||||||
|  | 		transition-property: transform; | ||||||
|  | 		transition-duration: 0.3s; | ||||||
|  | 		transform: translateY(460px); | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		z-index: 99; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar--ani-show { | ||||||
|  | 		transform: translateY(0); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__content { | ||||||
|  | 		background-color: #fff; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__content-mobile { | ||||||
|  | 		border-top-left-radius: 10px; | ||||||
|  | 		border-top-right-radius: 10px; | ||||||
|  | 		box-shadow: 0px 0px 5px 3px rgba(0, 0, 0, 0.1); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__header { | ||||||
|  | 		position: relative; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 		justify-content: center; | ||||||
|  | 		align-items: center; | ||||||
|  | 		height: 50px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__header-mobile { | ||||||
|  | 		padding: 10px; | ||||||
|  | 		padding-bottom: 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar--fixed-top { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 		justify-content: space-between; | ||||||
|  | 		border-top-color: rgba(0, 0, 0, 0.4); | ||||||
|  | 		border-top-style: solid; | ||||||
|  | 		border-top-width: 1px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar--fixed-width { | ||||||
|  | 		width: 50px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__backtoday { | ||||||
|  | 		position: absolute; | ||||||
|  | 		right: 0; | ||||||
|  | 		top: 25rpx; | ||||||
|  | 		padding: 0 5px; | ||||||
|  | 		padding-left: 10px; | ||||||
|  | 		height: 25px; | ||||||
|  | 		line-height: 25px; | ||||||
|  | 		font-size: 12px; | ||||||
|  | 		border-top-left-radius: 25px; | ||||||
|  | 		border-bottom-left-radius: 25px; | ||||||
|  | 		color: #fff; | ||||||
|  | 		background-color: #f1f1f1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__header-text { | ||||||
|  | 		text-align: center; | ||||||
|  | 		width: 100px; | ||||||
|  | 		font-size: 15px; | ||||||
|  | 		color: #666; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__button-text { | ||||||
|  | 		text-align: center; | ||||||
|  | 		width: 100px; | ||||||
|  | 		font-size: 14px; | ||||||
|  | 		color: #007aff; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		letter-spacing: 3px; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__header-btn-box { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 		align-items: center; | ||||||
|  | 		justify-content: center; | ||||||
|  | 		width: 50px; | ||||||
|  | 		height: 50px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__header-btn { | ||||||
|  | 		width: 9px; | ||||||
|  | 		height: 9px; | ||||||
|  | 		border-left-color: #808080; | ||||||
|  | 		border-left-style: solid; | ||||||
|  | 		border-left-width: 1px; | ||||||
|  | 		border-top-color: #555555; | ||||||
|  | 		border-top-style: solid; | ||||||
|  | 		border-top-width: 1px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar--left { | ||||||
|  | 		transform: rotate(-45deg); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar--right { | ||||||
|  | 		transform: rotate(135deg); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__weeks { | ||||||
|  | 		position: relative; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__weeks-item { | ||||||
|  | 		flex: 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__weeks-day { | ||||||
|  | 		flex: 1; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: column; | ||||||
|  | 		justify-content: center; | ||||||
|  | 		align-items: center; | ||||||
|  | 		height: 40px; | ||||||
|  | 		border-bottom-color: #F5F5F5; | ||||||
|  | 		border-bottom-style: solid; | ||||||
|  | 		border-bottom-width: 1px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__weeks-day-text { | ||||||
|  | 		font-size: 12px; | ||||||
|  | 		color: #B2B2B2; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__box { | ||||||
|  | 		position: relative; | ||||||
|  | 		// padding: 0 10px; | ||||||
|  | 		padding-bottom: 7px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__box-bg { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		justify-content: center; | ||||||
|  | 		align-items: center; | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 0; | ||||||
|  | 		left: 0; | ||||||
|  | 		right: 0; | ||||||
|  | 		bottom: 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-calendar__box-bg-text { | ||||||
|  | 		font-size: 200px; | ||||||
|  | 		font-weight: bold; | ||||||
|  | 		color: #999; | ||||||
|  | 		opacity: 0.1; | ||||||
|  | 		text-align: center; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		line-height: 1; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-changed { | ||||||
|  | 		padding: 0 10px; | ||||||
|  | 		// line-height: 50px; | ||||||
|  | 		text-align: center; | ||||||
|  | 		color: #333; | ||||||
|  | 		border-top-color: #DCDCDC; | ||||||
|  | 		; | ||||||
|  | 		border-top-style: solid; | ||||||
|  | 		border-top-width: 1px; | ||||||
|  | 		flex: 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-btn--ok { | ||||||
|  | 		padding: 20px 15px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-changed--time-start { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		align-items: center; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-changed--time-end { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		align-items: center; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-changed--time-date { | ||||||
|  | 		color: #999; | ||||||
|  | 		line-height: 50px; | ||||||
|  | 		margin-right: 5px; | ||||||
|  | 		// opacity: 0.6; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.time-picker-style { | ||||||
|  | 		// width: 62px; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		justify-content: center; | ||||||
|  | 		align-items: center | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.mr-10 { | ||||||
|  | 		margin-right: 10px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.dialog-close { | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 0; | ||||||
|  | 		right: 0; | ||||||
|  | 		bottom: 0; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 		align-items: center; | ||||||
|  | 		padding: 0 25px; | ||||||
|  | 		margin-top: 10px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.dialog-close-plus { | ||||||
|  | 		width: 16px; | ||||||
|  | 		height: 2px; | ||||||
|  | 		background-color: #737987; | ||||||
|  | 		border-radius: 2px; | ||||||
|  | 		transform: rotate(45deg); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.dialog-close-rotate { | ||||||
|  | 		position: absolute; | ||||||
|  | 		transform: rotate(-45deg); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker--btn { | ||||||
|  | 		border-radius: 100px; | ||||||
|  | 		height: 40px; | ||||||
|  | 		line-height: 40px; | ||||||
|  | 		background-color: #007aff; | ||||||
|  | 		color: #fff; | ||||||
|  | 		font-size: 16px; | ||||||
|  | 		letter-spacing: 5px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* #ifndef APP-NVUE */ | ||||||
|  | 	.uni-datetime-picker--btn:active { | ||||||
|  | 		opacity: 0.7; | ||||||
|  | 	} | ||||||
|  | 	/* #endif */ | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | { | ||||||
|  | 	"uni-datetime-picker.selectDate": "select date", | ||||||
|  | 	"uni-datetime-picker.selectTime": "select time", | ||||||
|  | 	"uni-datetime-picker.selectDateTime": "select datetime", | ||||||
|  | 	"uni-datetime-picker.startDate": "start date", | ||||||
|  | 	"uni-datetime-picker.endDate": "end date", | ||||||
|  | 	"uni-datetime-picker.startTime": "start time", | ||||||
|  | 	"uni-datetime-picker.endTime": "end time", | ||||||
|  | 	"uni-datetime-picker.ok": "ok", | ||||||
|  | 	"uni-datetime-picker.clear": "clear", | ||||||
|  | 	"uni-datetime-picker.cancel": "cancel", | ||||||
|  | 	"uni-calender.MON": "MON", | ||||||
|  | 	"uni-calender.TUE": "TUE", | ||||||
|  | 	"uni-calender.WED": "WED", | ||||||
|  | 	"uni-calender.THU": "THU", | ||||||
|  | 	"uni-calender.FRI": "FRI", | ||||||
|  | 	"uni-calender.SAT": "SAT", | ||||||
|  | 	"uni-calender.SUN": "SUN" | ||||||
|  | } | ||||||
|  | @ -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 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | { | ||||||
|  | 	"uni-datetime-picker.selectDate": "选择日期", | ||||||
|  | 	"uni-datetime-picker.selectTime": "选择时间", | ||||||
|  | 	"uni-datetime-picker.selectDateTime": "选择日期时间", | ||||||
|  | 	"uni-datetime-picker.startDate": "开始日期", | ||||||
|  | 	"uni-datetime-picker.endDate": "结束日期", | ||||||
|  | 	"uni-datetime-picker.startTime": "开始时间", | ||||||
|  | 	"uni-datetime-picker.endTime": "结束时间", | ||||||
|  | 	"uni-datetime-picker.ok": "确定", | ||||||
|  | 	"uni-datetime-picker.clear": "清除", | ||||||
|  | 	"uni-datetime-picker.cancel": "取消", | ||||||
|  | 	"uni-calender.SUN": "日", | ||||||
|  | 	"uni-calender.MON": "一", | ||||||
|  | 	"uni-calender.TUE": "二", | ||||||
|  | 	"uni-calender.WED": "三", | ||||||
|  | 	"uni-calender.THU": "四", | ||||||
|  | 	"uni-calender.FRI": "五", | ||||||
|  | 	"uni-calender.SAT": "六" | ||||||
|  | } | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | { | ||||||
|  | 	"uni-datetime-picker.selectDate": "選擇日期", | ||||||
|  | 	"uni-datetime-picker.selectTime": "選擇時間", | ||||||
|  | 	"uni-datetime-picker.selectDateTime": "選擇日期時間", | ||||||
|  | 	"uni-datetime-picker.startDate": "開始日期", | ||||||
|  | 	"uni-datetime-picker.endDate": "結束日期", | ||||||
|  | 	"uni-datetime-picker.startTime": "開始时间", | ||||||
|  | 	"uni-datetime-picker.endTime": "結束时间", | ||||||
|  | 	"uni-datetime-picker.ok": "確定", | ||||||
|  | 	"uni-datetime-picker.clear": "清除", | ||||||
|  | 	"uni-datetime-picker.cancel": "取消", | ||||||
|  | 	"uni-calender.SUN": "日", | ||||||
|  | 	"uni-calender.MON": "一", | ||||||
|  | 	"uni-calender.TUE": "二", | ||||||
|  | 	"uni-calender.WED": "三", | ||||||
|  | 	"uni-calender.THU": "四", | ||||||
|  | 	"uni-calender.FRI": "五", | ||||||
|  | 	"uni-calender.SAT": "六" | ||||||
|  | } | ||||||
|  | @ -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
 | ||||||
|  | @ -0,0 +1,927 @@ | ||||||
|  | <template> | ||||||
|  | 	<view class="uni-datetime-picker"> | ||||||
|  | 		<view @click="initTimePicker"> | ||||||
|  | 			<slot> | ||||||
|  | 				<view class="uni-datetime-picker-timebox-pointer" | ||||||
|  | 					:class="{'uni-datetime-picker-disabled': disabled, 'uni-datetime-picker-timebox': border}"> | ||||||
|  | 					<text class="uni-datetime-picker-text">{{time}}</text> | ||||||
|  | 					<view v-if="!time" class="uni-datetime-picker-time"> | ||||||
|  | 						<text class="uni-datetime-picker-text">{{selectTimeText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 				</view> | ||||||
|  | 			</slot> | ||||||
|  | 		</view> | ||||||
|  | 		<view v-if="visible" id="mask" class="uni-datetime-picker-mask" @click="tiggerTimePicker"></view> | ||||||
|  | 		<view v-if="visible" class="uni-datetime-picker-popup" :class="[dateShow && timeShow ? '' : 'fix-nvue-height']" | ||||||
|  | 			:style="fixNvueBug"> | ||||||
|  | 			<view class="uni-title"> | ||||||
|  | 				<text class="uni-datetime-picker-text">{{selectTimeText}}</text> | ||||||
|  | 			</view> | ||||||
|  | 			<view v-if="dateShow" class="uni-datetime-picker__container-box"> | ||||||
|  | 				<picker-view class="uni-datetime-picker-view" :indicator-style="indicatorStyle" :value="ymd" | ||||||
|  | 					@change="bindDateChange"> | ||||||
|  | 					<picker-view-column> | ||||||
|  | 						<view class="uni-datetime-picker-item" v-for="(item,index) in years" :key="index"> | ||||||
|  | 							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> | ||||||
|  | 						</view> | ||||||
|  | 					</picker-view-column> | ||||||
|  | 					<picker-view-column> | ||||||
|  | 						<view class="uni-datetime-picker-item" v-for="(item,index) in months" :key="index"> | ||||||
|  | 							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> | ||||||
|  | 						</view> | ||||||
|  | 					</picker-view-column> | ||||||
|  | 					<picker-view-column> | ||||||
|  | 						<view class="uni-datetime-picker-item" v-for="(item,index) in days" :key="index"> | ||||||
|  | 							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> | ||||||
|  | 						</view> | ||||||
|  | 					</picker-view-column> | ||||||
|  | 				</picker-view> | ||||||
|  | 				<!-- 兼容 nvue 不支持伪类 --> | ||||||
|  | 				<text class="uni-datetime-picker-sign sign-left">-</text> | ||||||
|  | 				<text class="uni-datetime-picker-sign sign-right">-</text> | ||||||
|  | 			</view> | ||||||
|  | 			<view v-if="timeShow" class="uni-datetime-picker__container-box"> | ||||||
|  | 				<picker-view class="uni-datetime-picker-view" :class="[hideSecond ? 'time-hide-second' : '']" | ||||||
|  | 					:indicator-style="indicatorStyle" :value="hms" @change="bindTimeChange"> | ||||||
|  | 					<picker-view-column> | ||||||
|  | 						<view class="uni-datetime-picker-item" v-for="(item,index) in hours" :key="index"> | ||||||
|  | 							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> | ||||||
|  | 						</view> | ||||||
|  | 					</picker-view-column> | ||||||
|  | 					<picker-view-column> | ||||||
|  | 						<view class="uni-datetime-picker-item" v-for="(item,index) in minutes" :key="index"> | ||||||
|  | 							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> | ||||||
|  | 						</view> | ||||||
|  | 					</picker-view-column> | ||||||
|  | 					<picker-view-column v-if="!hideSecond"> | ||||||
|  | 						<view class="uni-datetime-picker-item" v-for="(item,index) in seconds" :key="index"> | ||||||
|  | 							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> | ||||||
|  | 						</view> | ||||||
|  | 					</picker-view-column> | ||||||
|  | 				</picker-view> | ||||||
|  | 				<!-- 兼容 nvue 不支持伪类 --> | ||||||
|  | 				<text class="uni-datetime-picker-sign" :class="[hideSecond ? 'sign-center' : 'sign-left']">:</text> | ||||||
|  | 				<text v-if="!hideSecond" class="uni-datetime-picker-sign sign-right">:</text> | ||||||
|  | 			</view> | ||||||
|  | 			<view class="uni-datetime-picker-btn"> | ||||||
|  | 				<view @click="clearTime"> | ||||||
|  | 					<text class="uni-datetime-picker-btn-text">{{clearText}}</text> | ||||||
|  | 				</view> | ||||||
|  | 				<view class="uni-datetime-picker-btn-group"> | ||||||
|  | 					<view class="uni-datetime-picker-cancel" @click="tiggerTimePicker"> | ||||||
|  | 						<text class="uni-datetime-picker-btn-text">{{cancelText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 					<view @click="setTime"> | ||||||
|  | 						<text class="uni-datetime-picker-btn-text">{{okText}}</text> | ||||||
|  | 					</view> | ||||||
|  | 				</view> | ||||||
|  | 			</view> | ||||||
|  | 		</view> | ||||||
|  | 		<!-- #ifdef H5 --> | ||||||
|  | 		<!-- <keypress v-if="visible" @esc="tiggerTimePicker" @enter="setTime" /> --> | ||||||
|  | 		<!-- #endif --> | ||||||
|  | 	</view> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | 	// #ifdef H5 | ||||||
|  | 	import keypress from './keypress' | ||||||
|  | 	// #endif | ||||||
|  | 	import { | ||||||
|  | 		initVueI18n | ||||||
|  | 	} from '@dcloudio/uni-i18n' | ||||||
|  | 	import messages from './i18n/index.js' | ||||||
|  | 	const {	t	} = initVueI18n(messages) | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * DatetimePicker 时间选择器 | ||||||
|  | 	 * @description 可以同时选择日期和时间的选择器 | ||||||
|  | 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=xxx | ||||||
|  | 	 * @property {String} type = [datetime | date | time] 显示模式 | ||||||
|  | 	 * @property {Boolean} multiple = [true|false] 是否多选 | ||||||
|  | 	 * @property {String|Number} value 默认值 | ||||||
|  | 	 * @property {String|Number} start 起始日期或时间 | ||||||
|  | 	 * @property {String|Number} end 起始日期或时间 | ||||||
|  | 	 * @property {String} return-type = [timestamp | string] | ||||||
|  | 	 * @event {Function} change  选中发生变化触发 | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	export default { | ||||||
|  | 		name: 'UniDatetimePicker', | ||||||
|  | 		components: { | ||||||
|  | 			// #ifdef H5 | ||||||
|  | 			keypress | ||||||
|  | 			// #endif | ||||||
|  | 		}, | ||||||
|  | 		data() { | ||||||
|  | 			return { | ||||||
|  | 				indicatorStyle: `height: 50px;`, | ||||||
|  | 				visible: false, | ||||||
|  | 				fixNvueBug: {}, | ||||||
|  | 				dateShow: true, | ||||||
|  | 				timeShow: true, | ||||||
|  | 				title: '日期和时间', | ||||||
|  | 				// 输入框当前时间 | ||||||
|  | 				time: '', | ||||||
|  | 				// 当前的年月日时分秒 | ||||||
|  | 				year: 1920, | ||||||
|  | 				month: 0, | ||||||
|  | 				day: 0, | ||||||
|  | 				hour: 0, | ||||||
|  | 				minute: 0, | ||||||
|  | 				second: 0, | ||||||
|  | 				// 起始时间 | ||||||
|  | 				startYear: 1920, | ||||||
|  | 				startMonth: 1, | ||||||
|  | 				startDay: 1, | ||||||
|  | 				startHour: 0, | ||||||
|  | 				startMinute: 0, | ||||||
|  | 				startSecond: 0, | ||||||
|  | 				// 结束时间 | ||||||
|  | 				endYear: 2120, | ||||||
|  | 				endMonth: 12, | ||||||
|  | 				endDay: 31, | ||||||
|  | 				endHour: 23, | ||||||
|  | 				endMinute: 59, | ||||||
|  | 				endSecond: 59, | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		props: { | ||||||
|  | 			type: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: 'datetime' | ||||||
|  | 			}, | ||||||
|  | 			value: { | ||||||
|  | 				type: [String, Number], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			modelValue: { | ||||||
|  | 				type: [String, Number], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			start: { | ||||||
|  | 				type: [Number, String], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			end: { | ||||||
|  | 				type: [Number, String], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			returnType: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: 'string' | ||||||
|  | 			}, | ||||||
|  | 			disabled: { | ||||||
|  | 				type: [Boolean, String], | ||||||
|  | 				default: false | ||||||
|  | 			}, | ||||||
|  | 			border: { | ||||||
|  | 				type: [Boolean, String], | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			hideSecond: { | ||||||
|  | 				type: [Boolean, String], | ||||||
|  | 				default: false | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		watch: { | ||||||
|  | 			value: { | ||||||
|  | 				handler(newVal, oldVal) { | ||||||
|  | 					if (newVal) { | ||||||
|  | 						this.parseValue(this.fixIosDateFormat(newVal)) //兼容 iOS、safari 日期格式 | ||||||
|  | 						this.initTime(false) | ||||||
|  | 					} else { | ||||||
|  | 						this.time = '' | ||||||
|  | 						this.parseValue(Date.now()) | ||||||
|  | 					} | ||||||
|  | 				}, | ||||||
|  | 				immediate: true | ||||||
|  | 			}, | ||||||
|  | 			type: { | ||||||
|  | 				handler(newValue) { | ||||||
|  | 					if (newValue === 'date') { | ||||||
|  | 						this.dateShow = true | ||||||
|  | 						this.timeShow = false | ||||||
|  | 						this.title = '日期' | ||||||
|  | 					} else if (newValue === 'time') { | ||||||
|  | 						this.dateShow = false | ||||||
|  | 						this.timeShow = true | ||||||
|  | 						this.title = '时间' | ||||||
|  | 					} else { | ||||||
|  | 						this.dateShow = true | ||||||
|  | 						this.timeShow = true | ||||||
|  | 						this.title = '日期和时间' | ||||||
|  | 					} | ||||||
|  | 				}, | ||||||
|  | 				immediate: true | ||||||
|  | 			}, | ||||||
|  | 			start: { | ||||||
|  | 				handler(newVal) { | ||||||
|  | 					this.parseDatetimeRange(this.fixIosDateFormat(newVal), 'start') //兼容 iOS、safari 日期格式 | ||||||
|  | 				}, | ||||||
|  | 				immediate: true | ||||||
|  | 			}, | ||||||
|  | 			end: { | ||||||
|  | 				handler(newVal) { | ||||||
|  | 					this.parseDatetimeRange(this.fixIosDateFormat(newVal), 'end') //兼容 iOS、safari 日期格式 | ||||||
|  | 				}, | ||||||
|  | 				immediate: true | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 月、日、时、分、秒可选范围变化后,检查当前值是否在范围内,不在则当前值重置为可选范围第一项 | ||||||
|  | 			months(newVal) { | ||||||
|  | 				this.checkValue('month', this.month, newVal) | ||||||
|  | 			}, | ||||||
|  | 			days(newVal) { | ||||||
|  | 				this.checkValue('day', this.day, newVal) | ||||||
|  | 			}, | ||||||
|  | 			hours(newVal) { | ||||||
|  | 				this.checkValue('hour', this.hour, newVal) | ||||||
|  | 			}, | ||||||
|  | 			minutes(newVal) { | ||||||
|  | 				this.checkValue('minute', this.minute, newVal) | ||||||
|  | 			}, | ||||||
|  | 			seconds(newVal) { | ||||||
|  | 				this.checkValue('second', this.second, newVal) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		computed: { | ||||||
|  | 			// 当前年、月、日、时、分、秒选择范围 | ||||||
|  | 			years() { | ||||||
|  | 				return this.getCurrentRange('year') | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			months() { | ||||||
|  | 				return this.getCurrentRange('month') | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			days() { | ||||||
|  | 				return this.getCurrentRange('day') | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			hours() { | ||||||
|  | 				return this.getCurrentRange('hour') | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			minutes() { | ||||||
|  | 				return this.getCurrentRange('minute') | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			seconds() { | ||||||
|  | 				return this.getCurrentRange('second') | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// picker 当前值数组 | ||||||
|  | 			ymd() { | ||||||
|  | 				return [this.year - this.minYear, this.month - this.minMonth, this.day - this.minDay] | ||||||
|  | 			}, | ||||||
|  | 			hms() { | ||||||
|  | 				return [this.hour - this.minHour, this.minute - this.minMinute, this.second - this.minSecond] | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 当前 date 是 start | ||||||
|  | 			currentDateIsStart() { | ||||||
|  | 				return this.year === this.startYear && this.month === this.startMonth && this.day === this.startDay | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 当前 date 是 end | ||||||
|  | 			currentDateIsEnd() { | ||||||
|  | 				return this.year === this.endYear && this.month === this.endMonth && this.day === this.endDay | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 当前年、月、日、时、分、秒的最小值和最大值 | ||||||
|  | 			minYear() { | ||||||
|  | 				return this.startYear | ||||||
|  | 			}, | ||||||
|  | 			maxYear() { | ||||||
|  | 				return this.endYear | ||||||
|  | 			}, | ||||||
|  | 			minMonth() { | ||||||
|  | 				if (this.year === this.startYear) { | ||||||
|  | 					return this.startMonth | ||||||
|  | 				} else { | ||||||
|  | 					return 1 | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			maxMonth() { | ||||||
|  | 				if (this.year === this.endYear) { | ||||||
|  | 					return this.endMonth | ||||||
|  | 				} else { | ||||||
|  | 					return 12 | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			minDay() { | ||||||
|  | 				if (this.year === this.startYear && this.month === this.startMonth) { | ||||||
|  | 					return this.startDay | ||||||
|  | 				} else { | ||||||
|  | 					return 1 | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			maxDay() { | ||||||
|  | 				if (this.year === this.endYear && this.month === this.endMonth) { | ||||||
|  | 					return this.endDay | ||||||
|  | 				} else { | ||||||
|  | 					return this.daysInMonth(this.year, this.month) | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			minHour() { | ||||||
|  | 				if (this.type === 'datetime') { | ||||||
|  | 					if (this.currentDateIsStart) { | ||||||
|  | 						return this.startHour | ||||||
|  | 					} else { | ||||||
|  | 						return 0 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if (this.type === 'time') { | ||||||
|  | 					return this.startHour | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			maxHour() { | ||||||
|  | 				if (this.type === 'datetime') { | ||||||
|  | 					if (this.currentDateIsEnd) { | ||||||
|  | 						return this.endHour | ||||||
|  | 					} else { | ||||||
|  | 						return 23 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if (this.type === 'time') { | ||||||
|  | 					return this.endHour | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			minMinute() { | ||||||
|  | 				if (this.type === 'datetime') { | ||||||
|  | 					if (this.currentDateIsStart && this.hour === this.startHour) { | ||||||
|  | 						return this.startMinute | ||||||
|  | 					} else { | ||||||
|  | 						return 0 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if (this.type === 'time') { | ||||||
|  | 					if (this.hour === this.startHour) { | ||||||
|  | 						return this.startMinute | ||||||
|  | 					} else { | ||||||
|  | 						return 0 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			maxMinute() { | ||||||
|  | 				if (this.type === 'datetime') { | ||||||
|  | 					if (this.currentDateIsEnd && this.hour === this.endHour) { | ||||||
|  | 						return this.endMinute | ||||||
|  | 					} else { | ||||||
|  | 						return 59 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if (this.type === 'time') { | ||||||
|  | 					if (this.hour === this.endHour) { | ||||||
|  | 						return this.endMinute | ||||||
|  | 					} else { | ||||||
|  | 						return 59 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			minSecond() { | ||||||
|  | 				if (this.type === 'datetime') { | ||||||
|  | 					if (this.currentDateIsStart && this.hour === this.startHour && this.minute === this.startMinute) { | ||||||
|  | 						return this.startSecond | ||||||
|  | 					} else { | ||||||
|  | 						return 0 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if (this.type === 'time') { | ||||||
|  | 					if (this.hour === this.startHour && this.minute === this.startMinute) { | ||||||
|  | 						return this.startSecond | ||||||
|  | 					} else { | ||||||
|  | 						return 0 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			maxSecond() { | ||||||
|  | 				if (this.type === 'datetime') { | ||||||
|  | 					if (this.currentDateIsEnd && this.hour === this.endHour && this.minute === this.endMinute) { | ||||||
|  | 						return this.endSecond | ||||||
|  | 					} else { | ||||||
|  | 						return 59 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if (this.type === 'time') { | ||||||
|  | 					if (this.hour === this.endHour && this.minute === this.endMinute) { | ||||||
|  | 						return this.endSecond | ||||||
|  | 					} else { | ||||||
|  | 						return 59 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * for i18n | ||||||
|  | 			 */ | ||||||
|  | 			selectTimeText() { | ||||||
|  | 				return t("uni-datetime-picker.selectTime") | ||||||
|  | 			}, | ||||||
|  | 			okText() { | ||||||
|  | 				return t("uni-datetime-picker.ok") | ||||||
|  | 			}, | ||||||
|  | 			clearText() { | ||||||
|  | 				return t("uni-datetime-picker.clear") | ||||||
|  | 			}, | ||||||
|  | 			cancelText() { | ||||||
|  | 				return t("uni-datetime-picker.cancel") | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 		mounted() { | ||||||
|  | 			// #ifdef APP-NVUE | ||||||
|  | 			const res = uni.getSystemInfoSync(); | ||||||
|  | 			this.fixNvueBug = { | ||||||
|  | 				top: res.windowHeight / 2, | ||||||
|  | 				left: res.windowWidth / 2 | ||||||
|  | 			} | ||||||
|  | 			// #endif | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 		methods: { | ||||||
|  | 			/** | ||||||
|  | 			 * @param {Object} item | ||||||
|  | 			 * 小于 10 在前面加个 0 | ||||||
|  | 			 */ | ||||||
|  | 
 | ||||||
|  | 			lessThanTen(item) { | ||||||
|  | 				return item < 10 ? '0' + item : item | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 解析时分秒字符串,例如:00:00:00 | ||||||
|  | 			 * @param {String} timeString | ||||||
|  | 			 */ | ||||||
|  | 			parseTimeType(timeString) { | ||||||
|  | 				if (timeString) { | ||||||
|  | 					let timeArr = timeString.split(':') | ||||||
|  | 					this.hour = Number(timeArr[0]) | ||||||
|  | 					this.minute = Number(timeArr[1]) | ||||||
|  | 					this.second = Number(timeArr[2]) | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 解析选择器初始值,类型可以是字符串、时间戳,例如:2000-10-02、'08:30:00'、 1610695109000 | ||||||
|  | 			 * @param {String | Number} datetime | ||||||
|  | 			 */ | ||||||
|  | 			initPickerValue(datetime) { | ||||||
|  | 				let defaultValue = null | ||||||
|  | 				if (datetime) { | ||||||
|  | 					defaultValue = this.compareValueWithStartAndEnd(datetime, this.start, this.end) | ||||||
|  | 				} else { | ||||||
|  | 					defaultValue = Date.now() | ||||||
|  | 					defaultValue = this.compareValueWithStartAndEnd(defaultValue, this.start, this.end) | ||||||
|  | 				} | ||||||
|  | 				this.parseValue(defaultValue) | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 初始值规则: | ||||||
|  | 			 * - 用户设置初始值 value | ||||||
|  | 			 * 	- 设置了起始时间 start、终止时间 end,并 start < value < end,初始值为 value, 否则初始值为 start | ||||||
|  | 			 * 	- 只设置了起始时间 start,并 start < value,初始值为 value,否则初始值为 start | ||||||
|  | 			 * 	- 只设置了终止时间 end,并 value < end,初始值为 value,否则初始值为 end | ||||||
|  | 			 * 	- 无起始终止时间,则初始值为 value | ||||||
|  | 			 * - 无初始值 value,则初始值为当前本地时间 Date.now() | ||||||
|  | 			 * @param {Object} value | ||||||
|  | 			 * @param {Object} dateBase | ||||||
|  | 			 */ | ||||||
|  | 			compareValueWithStartAndEnd(value, start, end) { | ||||||
|  | 				let winner = null | ||||||
|  | 				value = this.superTimeStamp(value) | ||||||
|  | 				start = this.superTimeStamp(start) | ||||||
|  | 				end = this.superTimeStamp(end) | ||||||
|  | 
 | ||||||
|  | 				if (start && end) { | ||||||
|  | 					if (value < start) { | ||||||
|  | 						winner = new Date(start) | ||||||
|  | 					} else if (value > end) { | ||||||
|  | 						winner = new Date(end) | ||||||
|  | 					} else { | ||||||
|  | 						winner = new Date(value) | ||||||
|  | 					} | ||||||
|  | 				} else if (start && !end) { | ||||||
|  | 					winner = start <= value ? new Date(value) : new Date(start) | ||||||
|  | 				} else if (!start && end) { | ||||||
|  | 					winner = value <= end ? new Date(value) : new Date(end) | ||||||
|  | 				} else { | ||||||
|  | 					winner = new Date(value) | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				return winner | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 转换为可比较的时间戳,接受日期、时分秒、时间戳 | ||||||
|  | 			 * @param {Object} value | ||||||
|  | 			 */ | ||||||
|  | 			superTimeStamp(value) { | ||||||
|  | 				let dateBase = '' | ||||||
|  | 				if (this.type === 'time' && value && typeof value === 'string') { | ||||||
|  | 					const now = new Date() | ||||||
|  | 					const year = now.getFullYear() | ||||||
|  | 					const month = now.getMonth() + 1 | ||||||
|  | 					const day = now.getDate() | ||||||
|  | 					dateBase = year + '/' + month + '/' + day + ' ' | ||||||
|  | 				} | ||||||
|  | 				if (Number(value) && typeof value !== NaN) { | ||||||
|  | 					value = parseInt(value) | ||||||
|  | 					dateBase = 0 | ||||||
|  | 				} | ||||||
|  | 				return this.createTimeStamp(dateBase + value) | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 解析默认值 value,字符串、时间戳 | ||||||
|  | 			 * @param {Object} defaultTime | ||||||
|  | 			 */ | ||||||
|  | 			parseValue(value) { | ||||||
|  | 				if (!value) { | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 				if (this.type === 'time' && typeof value === "string") { | ||||||
|  | 					this.parseTimeType(value) | ||||||
|  | 				} else { | ||||||
|  | 					let defaultDate = null | ||||||
|  | 					defaultDate = new Date(value) | ||||||
|  | 					if (this.type !== 'time') { | ||||||
|  | 						this.year = defaultDate.getFullYear() | ||||||
|  | 						this.month = defaultDate.getMonth() + 1 | ||||||
|  | 						this.day = defaultDate.getDate() | ||||||
|  | 					} | ||||||
|  | 					if (this.type !== 'date') { | ||||||
|  | 						this.hour = defaultDate.getHours() | ||||||
|  | 						this.minute = defaultDate.getMinutes() | ||||||
|  | 						this.second = defaultDate.getSeconds() | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if (this.hideSecond) { | ||||||
|  | 					this.second = 0 | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 解析可选择时间范围 start、end,年月日字符串、时间戳 | ||||||
|  | 			 * @param {Object} defaultTime | ||||||
|  | 			 */ | ||||||
|  | 			parseDatetimeRange(point, pointType) { | ||||||
|  | 				// 时间为空,则重置为初始值 | ||||||
|  | 				if (!point) { | ||||||
|  | 					if (pointType === 'start') { | ||||||
|  | 						this.startYear = 1920 | ||||||
|  | 						this.startMonth = 1 | ||||||
|  | 						this.startDay = 1 | ||||||
|  | 						this.startHour = 0 | ||||||
|  | 						this.startMinute = 0 | ||||||
|  | 						this.startSecond = 0 | ||||||
|  | 					} | ||||||
|  | 					if (pointType === 'end') { | ||||||
|  | 						this.endYear = 2120 | ||||||
|  | 						this.endMonth = 12 | ||||||
|  | 						this.endDay = 31 | ||||||
|  | 						this.endHour = 23 | ||||||
|  | 						this.endMinute = 59 | ||||||
|  | 						this.endSecond = 59 | ||||||
|  | 					} | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 				if (this.type === 'time') { | ||||||
|  | 					const pointArr = point.split(':') | ||||||
|  | 					this[pointType + 'Hour'] = Number(pointArr[0]) | ||||||
|  | 					this[pointType + 'Minute'] = Number(pointArr[1]) | ||||||
|  | 					this[pointType + 'Second'] = Number(pointArr[2]) | ||||||
|  | 				} else { | ||||||
|  | 					if (!point) { | ||||||
|  | 						pointType === 'start' ? this.startYear = this.year - 60 : this.endYear = this.year + 60 | ||||||
|  | 						return | ||||||
|  | 					} | ||||||
|  | 					if (Number(point) && Number(point) !== NaN) { | ||||||
|  | 						point = parseInt(point) | ||||||
|  | 					} | ||||||
|  | 					// datetime 的 end 没有时分秒, 则不限制 | ||||||
|  | 					const hasTime = /[0-9]:[0-9]/ | ||||||
|  | 					if (this.type === 'datetime' && pointType === 'end' && typeof point === 'string' && !hasTime.test( | ||||||
|  | 							point)) { | ||||||
|  | 						point = point + ' 23:59:59' | ||||||
|  | 					} | ||||||
|  | 					const pointDate = new Date(point) | ||||||
|  | 					this[pointType + 'Year'] = pointDate.getFullYear() | ||||||
|  | 					this[pointType + 'Month'] = pointDate.getMonth() + 1 | ||||||
|  | 					this[pointType + 'Day'] = pointDate.getDate() | ||||||
|  | 					if (this.type === 'datetime') { | ||||||
|  | 						this[pointType + 'Hour'] = pointDate.getHours() | ||||||
|  | 						this[pointType + 'Minute'] = pointDate.getMinutes() | ||||||
|  | 						this[pointType + 'Second'] = pointDate.getSeconds() | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 获取 年、月、日、时、分、秒 当前可选范围 | ||||||
|  | 			getCurrentRange(value) { | ||||||
|  | 				const range = [] | ||||||
|  | 				for (let i = this['min' + this.capitalize(value)]; i <= this['max' + this.capitalize(value)]; i++) { | ||||||
|  | 					range.push(i) | ||||||
|  | 				} | ||||||
|  | 				return range | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 字符串首字母大写 | ||||||
|  | 			capitalize(str) { | ||||||
|  | 				return str.charAt(0).toUpperCase() + str.slice(1) | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 检查当前值是否在范围内,不在则当前值重置为可选范围第一项 | ||||||
|  | 			checkValue(name, value, values) { | ||||||
|  | 				if (values.indexOf(value) === -1) { | ||||||
|  | 					this[name] = values[0] | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			// 每个月的实际天数 | ||||||
|  | 			daysInMonth(year, month) { // Use 1 for January, 2 for February, etc. | ||||||
|  | 				return new Date(year, month, 0).getDate(); | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			//兼容 iOS、safari 日期格式 | ||||||
|  | 			fixIosDateFormat(value) { | ||||||
|  | 				if (typeof value === 'string') { | ||||||
|  | 					value = value.replace(/-/g, '/') | ||||||
|  | 				} | ||||||
|  | 				return value | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 生成时间戳 | ||||||
|  | 			 * @param {Object} time | ||||||
|  | 			 */ | ||||||
|  | 			createTimeStamp(time) { | ||||||
|  | 				if (!time) return | ||||||
|  | 				if (typeof time === "number") { | ||||||
|  | 					return time | ||||||
|  | 				} else { | ||||||
|  | 					time = time.replace(/-/g, '/') | ||||||
|  | 					if (this.type === 'date') { | ||||||
|  | 						time = time + ' ' + '00:00:00' | ||||||
|  | 					} | ||||||
|  | 					return Date.parse(time) | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 生成日期或时间的字符串 | ||||||
|  | 			 */ | ||||||
|  | 			createDomSting() { | ||||||
|  | 				const yymmdd = this.year + | ||||||
|  | 					'-' + | ||||||
|  | 					this.lessThanTen(this.month) + | ||||||
|  | 					'-' + | ||||||
|  | 					this.lessThanTen(this.day) | ||||||
|  | 
 | ||||||
|  | 				let hhmmss = this.lessThanTen(this.hour) + | ||||||
|  | 					':' + | ||||||
|  | 					this.lessThanTen(this.minute) | ||||||
|  | 
 | ||||||
|  | 				if (!this.hideSecond) { | ||||||
|  | 					hhmmss = hhmmss + ':' + this.lessThanTen(this.second) | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				if (this.type === 'date') { | ||||||
|  | 					return yymmdd | ||||||
|  | 				} else if (this.type === 'time') { | ||||||
|  | 					return hhmmss | ||||||
|  | 				} else { | ||||||
|  | 					return yymmdd + ' ' + hhmmss | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 初始化返回值,并抛出 change 事件 | ||||||
|  | 			 */ | ||||||
|  | 			initTime(emit = true) { | ||||||
|  | 				this.time = this.createDomSting() | ||||||
|  | 				if (!emit) return | ||||||
|  | 				if (this.returnType === 'timestamp' && this.type !== 'time') { | ||||||
|  | 					this.$emit('change', this.createTimeStamp(this.time)) | ||||||
|  | 					this.$emit('input', this.createTimeStamp(this.time)) | ||||||
|  | 					this.$emit('update:modelValue', this.createTimeStamp(this.time)) | ||||||
|  | 				} else { | ||||||
|  | 					this.$emit('change', this.time) | ||||||
|  | 					this.$emit('input', this.time) | ||||||
|  | 					this.$emit('update:modelValue', this.time) | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 用户选择日期或时间更新 data | ||||||
|  | 			 * @param {Object} e | ||||||
|  | 			 */ | ||||||
|  | 			bindDateChange(e) { | ||||||
|  | 				const val = e.detail.value | ||||||
|  | 				this.year = this.years[val[0]] | ||||||
|  | 				this.month = this.months[val[1]] | ||||||
|  | 				this.day = this.days[val[2]] | ||||||
|  | 			}, | ||||||
|  | 			bindTimeChange(e) { | ||||||
|  | 				const val = e.detail.value | ||||||
|  | 				this.hour = this.hours[val[0]] | ||||||
|  | 				this.minute = this.minutes[val[1]] | ||||||
|  | 				this.second = this.seconds[val[2]] | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 初始化弹出层 | ||||||
|  | 			 */ | ||||||
|  | 			initTimePicker() { | ||||||
|  | 				if (this.disabled) return | ||||||
|  | 				const value = this.fixIosDateFormat(this.value) | ||||||
|  | 				this.initPickerValue(value) | ||||||
|  | 				this.visible = !this.visible | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 触发或关闭弹框 | ||||||
|  | 			 */ | ||||||
|  | 			tiggerTimePicker(e) { | ||||||
|  | 				this.visible = !this.visible | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 用户点击“清空”按钮,清空当前值 | ||||||
|  | 			 */ | ||||||
|  | 			clearTime() { | ||||||
|  | 				this.time = '' | ||||||
|  | 				this.$emit('change', this.time) | ||||||
|  | 				this.$emit('input', this.time) | ||||||
|  | 				this.$emit('update:modelValue', this.time) | ||||||
|  | 				this.tiggerTimePicker() | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 用户点击“确定”按钮 | ||||||
|  | 			 */ | ||||||
|  | 			setTime() { | ||||||
|  | 				this.initTime() | ||||||
|  | 				this.tiggerTimePicker() | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  | 	.uni-datetime-picker { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		/* width: 100%; */ | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-view { | ||||||
|  | 		height: 130px; | ||||||
|  | 		width: 270px; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-item { | ||||||
|  | 		height: 50px; | ||||||
|  | 		line-height: 50px; | ||||||
|  | 		text-align: center; | ||||||
|  | 		font-size: 14px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-btn { | ||||||
|  | 		margin-top: 60px; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 		justify-content: space-between; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-btn-text { | ||||||
|  | 		font-size: 14px; | ||||||
|  | 		color: #007AFF; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-btn-group { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-cancel { | ||||||
|  | 		margin-right: 30px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-mask { | ||||||
|  | 		position: fixed; | ||||||
|  | 		bottom: 0px; | ||||||
|  | 		top: 0px; | ||||||
|  | 		left: 0px; | ||||||
|  | 		right: 0px; | ||||||
|  | 		background-color: rgba(0, 0, 0, 0.4); | ||||||
|  | 		transition-duration: 0.3s; | ||||||
|  | 		z-index: 998; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-popup { | ||||||
|  | 		border-radius: 8px; | ||||||
|  | 		padding: 30px; | ||||||
|  | 		width: 270px; | ||||||
|  | 		/* #ifdef APP-NVUE */ | ||||||
|  | 		height: 500px; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		/* #ifdef APP-NVUE */ | ||||||
|  | 		width: 330px; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		background-color: #fff; | ||||||
|  | 		position: fixed; | ||||||
|  | 		top: 50%; | ||||||
|  | 		left: 50%; | ||||||
|  | 		transform: translate(-50%, -50%); | ||||||
|  | 		transition-duration: 0.3s; | ||||||
|  | 		z-index: 999; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.fix-nvue-height { | ||||||
|  | 		/* #ifdef APP-NVUE */ | ||||||
|  | 		height: 330px; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-time { | ||||||
|  | 		color: grey; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-column { | ||||||
|  | 		height: 50px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-timebox { | ||||||
|  | 
 | ||||||
|  | 		border: 1px solid #E5E5E5; | ||||||
|  | 		border-radius: 5px; | ||||||
|  | 		padding: 7px 10px; | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-timebox-pointer { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-disabled { | ||||||
|  | 		opacity: 0.4; | ||||||
|  | 		/* #ifdef H5 */ | ||||||
|  | 		cursor: not-allowed !important; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-text { | ||||||
|  | 		font-size: 14px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker-sign { | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 53px; | ||||||
|  | 		/* 减掉 10px 的元素高度,兼容nvue */ | ||||||
|  | 		color: #999; | ||||||
|  | 		/* #ifdef APP-NVUE */ | ||||||
|  | 		font-size: 16px; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.sign-left { | ||||||
|  | 		left: 86px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.sign-right { | ||||||
|  | 		right: 86px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.sign-center { | ||||||
|  | 		left: 135px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-datetime-picker__container-box { | ||||||
|  | 		position: relative; | ||||||
|  | 		display: flex; | ||||||
|  | 		align-items: center; | ||||||
|  | 		justify-content: center; | ||||||
|  | 		margin-top: 40px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.time-hide-second { | ||||||
|  | 		width: 180px; | ||||||
|  | 	} | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,981 @@ | ||||||
|  | <template> | ||||||
|  | 	<view class="uni-date"> | ||||||
|  | 		<view class="uni-date-editor" @click="show"> | ||||||
|  | 			<slot> | ||||||
|  | 				<view class="uni-date-editor--x" :class="{'uni-date-editor--x__disabled': disabled, | ||||||
|  | 		'uni-date-x--border': border}"> | ||||||
|  | 					<view v-if="!isRange" class="uni-date-x uni-date-single"> | ||||||
|  | 						<uni-icons type="calendar" color="#e1e1e1" size="22"></uni-icons> | ||||||
|  | 						<input class="uni-date__x-input" type="text" v-model="singleVal" | ||||||
|  | 							:placeholder="singlePlaceholderText" :disabled="true" /> | ||||||
|  | 					</view> | ||||||
|  | 					<view v-else class="uni-date-x uni-date-range"> | ||||||
|  | 						<uni-icons type="calendar" color="#e1e1e1" size="22"></uni-icons> | ||||||
|  | 						<input class="uni-date__x-input t-c" type="text" v-model="range.startDate" | ||||||
|  | 							:placeholder="startPlaceholderText" :disabled="true" /> | ||||||
|  | 						<slot> | ||||||
|  | 							<view class="">{{rangeSeparator}}</view> | ||||||
|  | 						</slot> | ||||||
|  | 						<input class="uni-date__x-input t-c" type="text" v-model="range.endDate" | ||||||
|  | 							:placeholder="endPlaceholderText" :disabled="true" /> | ||||||
|  | 					</view> | ||||||
|  | 					<view v-if="showClearIcon" class="uni-date__icon-clear" @click.stop="clear"> | ||||||
|  | 						<uni-icons type="clear" color="#e1e1e1" size="18"></uni-icons> | ||||||
|  | 					</view> | ||||||
|  | 				</view> | ||||||
|  | 			</slot> | ||||||
|  | 		</view> | ||||||
|  | 
 | ||||||
|  | 		<view v-show="popup" class="uni-date-mask" @click="close"></view> | ||||||
|  | 		<view v-if="!isPhone" ref="datePicker" v-show="popup" class="uni-date-picker__container"> | ||||||
|  | 			<view v-if="!isRange" class="uni-date-single--x" :style="popover"> | ||||||
|  | 				<view class="uni-popper__arrow"></view> | ||||||
|  | 				<view v-if="hasTime" class="uni-date-changed popup-x-header"> | ||||||
|  | 					<input class="uni-date__input t-c" type="text" v-model="tempSingleDate" | ||||||
|  | 						:placeholder="selectDateText" /> | ||||||
|  | 					<time-picker type="time" v-model="time" :border="false" :disabled="!tempSingleDate" | ||||||
|  | 						:start="reactStartTime" :end="reactEndTime" :hideSecond="hideSecond" style="width: 100%;"> | ||||||
|  | 						<input class="uni-date__input t-c" type="text" v-model="time" :placeholder="selectTimeText" | ||||||
|  | 							:disabled="!tempSingleDate" /> | ||||||
|  | 					</time-picker> | ||||||
|  | 				</view> | ||||||
|  | 				<calendar ref="pcSingle" :showMonth="false" | ||||||
|  | 					:start-date="caleRange.startDate" :end-date="caleRange.endDate" :date="defSingleDate" | ||||||
|  | 					@change="singleChange" style="padding: 0 8px;" /> | ||||||
|  | 				<view v-if="hasTime" class="popup-x-footer"> | ||||||
|  | 					<!-- <text class="">此刻</text> --> | ||||||
|  | 					<text class="confirm" @click="confirmSingleChange">{{okText}}</text> | ||||||
|  | 				</view> | ||||||
|  | 				<view class="uni-date-popper__arrow"></view> | ||||||
|  | 			</view> | ||||||
|  | 
 | ||||||
|  | 			<view v-else class="uni-date-range--x" :style="popover"> | ||||||
|  | 				<view class="uni-popper__arrow"></view> | ||||||
|  | 				<view v-if="hasTime" class="popup-x-header uni-date-changed"> | ||||||
|  | 					<view class="popup-x-header--datetime"> | ||||||
|  | 						<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startDate" | ||||||
|  | 							:placeholder="startDateText" /> | ||||||
|  | 						<time-picker type="time" v-model="tempRange.startTime" :start="reactStartTime" :border="false" | ||||||
|  | 							:disabled="!tempRange.startDate" :hideSecond="hideSecond"> | ||||||
|  | 							<input class="uni-date__input uni-date-range__input" type="text" | ||||||
|  | 								v-model="tempRange.startTime" :placeholder="startTimeText" | ||||||
|  | 								:disabled="!tempRange.startDate" /> | ||||||
|  | 						</time-picker> | ||||||
|  | 					</view> | ||||||
|  | 					<uni-icons type="arrowthinright" color="#999" style="line-height: 40px;"></uni-icons> | ||||||
|  | 					<view class="popup-x-header--datetime"> | ||||||
|  | 						<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endDate" | ||||||
|  | 							:placeholder="endDateText" /> | ||||||
|  | 						<time-picker type="time" v-model="tempRange.endTime" :end="reactEndTime" :border="false" | ||||||
|  | 							:disabled="!tempRange.endDate" :hideSecond="hideSecond"> | ||||||
|  | 							<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endTime" | ||||||
|  | 								:placeholder="endTimeText" :disabled="!tempRange.endDate" /> | ||||||
|  | 						</time-picker> | ||||||
|  | 					</view> | ||||||
|  | 				</view> | ||||||
|  | 				<view class="popup-x-body"> | ||||||
|  | 					<calendar ref="left" :showMonth="false" | ||||||
|  | 						:start-date="caleRange.startDate" :end-date="caleRange.endDate" :range="true" | ||||||
|  | 						@change="leftChange" :pleStatus="endMultipleStatus" @firstEnterCale="updateRightCale" | ||||||
|  | 						@monthSwitch="leftMonthSwitch" style="padding: 0 8px;" /> | ||||||
|  | 					<calendar ref="right" :showMonth="false" | ||||||
|  | 						:start-date="caleRange.startDate" :end-date="caleRange.endDate" :range="true" | ||||||
|  | 						@change="rightChange" :pleStatus="startMultipleStatus" @firstEnterCale="updateLeftCale" | ||||||
|  | 						@monthSwitch="rightMonthSwitch" style="padding: 0 8px;border-left: 1px solid #F1F1F1;" /> | ||||||
|  | 				</view> | ||||||
|  | 				<view v-if="hasTime" class="popup-x-footer"> | ||||||
|  | 					<text class="" @click="clear">{{clearText}}</text> | ||||||
|  | 					<text class="confirm" @click="confirmRangeChange">{{okText}}</text> | ||||||
|  | 				</view> | ||||||
|  | 			</view> | ||||||
|  | 		</view> | ||||||
|  | 		<calendar v-show="isPhone" ref="mobile" :clearDate="false" :date="defSingleDate" :defTime="reactMobDefTime" | ||||||
|  | 			:start-date="caleRange.startDate" :end-date="caleRange.endDate" :selectableTimes="mobSelectableTime" | ||||||
|  | 			:pleStatus="endMultipleStatus" :showMonth="false" :range="isRange" :typeHasTime="hasTime" :insert="false" | ||||||
|  | 			:hideSecond="hideSecond" @confirm="mobileChange" /> | ||||||
|  | 	</view> | ||||||
|  | </template> | ||||||
|  | <script> | ||||||
|  | 	/** | ||||||
|  | 	 * DatetimePicker 时间选择器 | ||||||
|  | 	 * @description 同时支持 PC 和移动端使用日历选择日期和日期范围 | ||||||
|  | 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=3962 | ||||||
|  | 	 * @property {String} type 选择器类型 | ||||||
|  | 	 * @property {String|Number|Array|Date} value 绑定值 | ||||||
|  | 	 * @property {String} placeholder 单选择时的占位内容 | ||||||
|  | 	 * @property {String} start 起始时间 | ||||||
|  | 	 * @property {String} end 终止时间 | ||||||
|  | 	 * @property {String} start-placeholder 范围选择时开始日期的占位内容 | ||||||
|  | 	 * @property {String} end-placeholder 范围选择时结束日期的占位内容 | ||||||
|  | 	 * @property {String} range-separator 选择范围时的分隔符 | ||||||
|  | 	 * @property {Boolean} border = [true|false] 是否有边框 | ||||||
|  | 	 * @property {Boolean} disabled = [true|false] 是否禁用 | ||||||
|  | 	 * @property {Boolean} clearIcon = [true|false] 是否显示清除按钮(仅PC端适用) | ||||||
|  | 	 * @event {Function} change 确定日期时触发的事件 | ||||||
|  | 	 * @event {Function} show 打开弹出层 | ||||||
|  | 	 * @event {Function} close 关闭弹出层 | ||||||
|  | 	 * @event {Function} clear 清除上次选中的状态和值 | ||||||
|  | 	 **/ | ||||||
|  | 	import calendar from './calendar.vue' | ||||||
|  | 	import timePicker from './time-picker.vue' | ||||||
|  | 	import { | ||||||
|  | 		initVueI18n | ||||||
|  | 	} from '@dcloudio/uni-i18n' | ||||||
|  | 	import messages from './i18n/index.js' | ||||||
|  | 	const { | ||||||
|  | 		t | ||||||
|  | 	} = initVueI18n(messages) | ||||||
|  | 
 | ||||||
|  | 	export default { | ||||||
|  | 		name: 'UniDatetimePicker', | ||||||
|  | 		components: { | ||||||
|  | 			calendar, | ||||||
|  | 			timePicker | ||||||
|  | 		}, | ||||||
|  | 		data() { | ||||||
|  | 			return { | ||||||
|  | 				isRange: false, | ||||||
|  | 				hasTime: false, | ||||||
|  | 				mobileRange: false, | ||||||
|  | 				// 单选 | ||||||
|  | 				singleVal: '', | ||||||
|  | 				tempSingleDate: '', | ||||||
|  | 				defSingleDate: '', | ||||||
|  | 				time: '', | ||||||
|  | 				// 范围选 | ||||||
|  | 				caleRange: { | ||||||
|  | 					startDate: '', | ||||||
|  | 					startTime: '', | ||||||
|  | 					endDate: '', | ||||||
|  | 					endTime: '' | ||||||
|  | 				}, | ||||||
|  | 				range: { | ||||||
|  | 					startDate: '', | ||||||
|  | 					// startTime: '', | ||||||
|  | 					endDate: '', | ||||||
|  | 					// endTime: '' | ||||||
|  | 				}, | ||||||
|  | 				tempRange: { | ||||||
|  | 					startDate: '', | ||||||
|  | 					startTime: '', | ||||||
|  | 					endDate: '', | ||||||
|  | 					endTime: '' | ||||||
|  | 				}, | ||||||
|  | 				// 左右日历同步数据 | ||||||
|  | 				startMultipleStatus: { | ||||||
|  | 					before: '', | ||||||
|  | 					after: '', | ||||||
|  | 					data: [], | ||||||
|  | 					fulldate: '' | ||||||
|  | 				}, | ||||||
|  | 				endMultipleStatus: { | ||||||
|  | 					before: '', | ||||||
|  | 					after: '', | ||||||
|  | 					data: [], | ||||||
|  | 					fulldate: '' | ||||||
|  | 				}, | ||||||
|  | 				visible: false, | ||||||
|  | 				popup: false, | ||||||
|  | 				popover: null, | ||||||
|  | 				isEmitValue: false, | ||||||
|  | 				isPhone: false, | ||||||
|  | 				isFirstShow: true, | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		props: { | ||||||
|  | 			type: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: 'datetime' | ||||||
|  | 			}, | ||||||
|  | 			value: { | ||||||
|  | 				type: [String, Number, Array, Date], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			modelValue: { | ||||||
|  | 				type: [String, Number, Array, Date], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			start: { | ||||||
|  | 				type: [Number, String], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			end: { | ||||||
|  | 				type: [Number, String], | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			returnType: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: 'string' | ||||||
|  | 			}, | ||||||
|  | 			placeholder: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			startPlaceholder: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			endPlaceholder: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			rangeSeparator: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '-' | ||||||
|  | 			}, | ||||||
|  | 			border: { | ||||||
|  | 				type: [Boolean], | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			disabled: { | ||||||
|  | 				type: [Boolean], | ||||||
|  | 				default: false | ||||||
|  | 			}, | ||||||
|  | 			clearIcon: { | ||||||
|  | 				type: [Boolean], | ||||||
|  | 				default: true | ||||||
|  | 			}, | ||||||
|  | 			hideSecond: { | ||||||
|  | 				type: [Boolean], | ||||||
|  | 				default: false | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		watch: { | ||||||
|  | 			type: { | ||||||
|  | 				immediate: true, | ||||||
|  | 				handler(newVal, oldVal) { | ||||||
|  | 					if (newVal.indexOf('time') !== -1) { | ||||||
|  | 						this.hasTime = true | ||||||
|  | 					} else { | ||||||
|  | 						this.hasTime = false | ||||||
|  | 					} | ||||||
|  | 					if (newVal.indexOf('range') !== -1) { | ||||||
|  | 						this.isRange = true | ||||||
|  | 					} else { | ||||||
|  | 						this.isRange = false | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			value: { | ||||||
|  | 				immediate: true, | ||||||
|  | 				handler(newVal, oldVal) { | ||||||
|  | 					if (this.isEmitValue) { | ||||||
|  | 						this.isEmitValue = false | ||||||
|  | 						return | ||||||
|  | 					} | ||||||
|  | 					this.initPicker(newVal) | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			start: { | ||||||
|  | 				immediate: true, | ||||||
|  | 				handler(newVal, oldVal) { | ||||||
|  | 					if (!newVal) return | ||||||
|  | 					const { | ||||||
|  | 						defDate, | ||||||
|  | 						defTime | ||||||
|  | 					} = this.parseDate(newVal) | ||||||
|  | 					this.caleRange.startDate = defDate | ||||||
|  | 					if (this.hasTime) { | ||||||
|  | 						this.caleRange.startTime = defTime | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			end: { | ||||||
|  | 				immediate: true, | ||||||
|  | 				handler(newVal, oldVal) { | ||||||
|  | 					if (!newVal) return | ||||||
|  | 					const { | ||||||
|  | 						defDate, | ||||||
|  | 						defTime | ||||||
|  | 					} = this.parseDate(newVal) | ||||||
|  | 					this.caleRange.endDate = defDate | ||||||
|  | 					if (this.hasTime) { | ||||||
|  | 						this.caleRange.endTime = defTime | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		computed: { | ||||||
|  | 			reactStartTime() { | ||||||
|  | 				const activeDate = this.isRange ? this.tempRange.startDate : this.tempSingleDate | ||||||
|  | 				const res = activeDate === this.caleRange.startDate ? this.caleRange.startTime : '' | ||||||
|  | 				return res | ||||||
|  | 			}, | ||||||
|  | 			reactEndTime() { | ||||||
|  | 				const activeDate = this.isRange ? this.tempRange.endDate : this.tempSingleDate | ||||||
|  | 				const res = activeDate === this.caleRange.endDate ? this.caleRange.endTime : '' | ||||||
|  | 				return res | ||||||
|  | 			}, | ||||||
|  | 			reactMobDefTime() { | ||||||
|  | 				const times = { | ||||||
|  | 					start: this.tempRange.startTime, | ||||||
|  | 					end: this.tempRange.endTime | ||||||
|  | 				} | ||||||
|  | 				return this.isRange ? times : this.time | ||||||
|  | 			}, | ||||||
|  | 			mobSelectableTime() { | ||||||
|  | 				return { | ||||||
|  | 					start: this.caleRange.startTime, | ||||||
|  | 					end: this.caleRange.endTime | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			datePopupWidth() { | ||||||
|  | 				// todo | ||||||
|  | 				return this.isRange ? 653 : 301 | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * for i18n | ||||||
|  | 			 */ | ||||||
|  | 			singlePlaceholderText() { | ||||||
|  | 				return this.placeholder || (this.type === 'date' ? this.selectDateText : t( | ||||||
|  | 					"uni-datetime-picker.selectDateTime")) | ||||||
|  | 			}, | ||||||
|  | 			startPlaceholderText() { | ||||||
|  | 				return this.startPlaceholder || this.startDateText | ||||||
|  | 			}, | ||||||
|  | 			endPlaceholderText() { | ||||||
|  | 				return this.endPlaceholder || this.endDateText | ||||||
|  | 			}, | ||||||
|  | 			selectDateText() { | ||||||
|  | 				return t("uni-datetime-picker.selectDate") | ||||||
|  | 			}, | ||||||
|  | 			selectTimeText() { | ||||||
|  | 				return t("uni-datetime-picker.selectTime") | ||||||
|  | 			}, | ||||||
|  | 			startDateText() { | ||||||
|  | 				return this.startPlaceholder || t("uni-datetime-picker.startDate") | ||||||
|  | 			}, | ||||||
|  | 			startTimeText() { | ||||||
|  | 				return t("uni-datetime-picker.startTime") | ||||||
|  | 			}, | ||||||
|  | 			endDateText() { | ||||||
|  | 				return this.endPlaceholder || t("uni-datetime-picker.endDate") | ||||||
|  | 			}, | ||||||
|  | 			endTimeText() { | ||||||
|  | 				return t("uni-datetime-picker.endTime") | ||||||
|  | 			}, | ||||||
|  | 			okText() { | ||||||
|  | 				return t("uni-datetime-picker.ok") | ||||||
|  | 			}, | ||||||
|  | 			clearText() { | ||||||
|  | 				return t("uni-datetime-picker.clear") | ||||||
|  | 			}, | ||||||
|  | 			showClearIcon() { | ||||||
|  | 				const { clearIcon, disabled, singleVal, range } = this | ||||||
|  | 				const bool = clearIcon && !disabled && (singleVal || (range.startDate && range.endDate)) | ||||||
|  | 				return bool | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		created() { | ||||||
|  | 			this.form = this.getForm('uniForms') | ||||||
|  | 			this.formItem = this.getForm('uniFormsItem') | ||||||
|  | 
 | ||||||
|  | 			// if (this.formItem) { | ||||||
|  | 			// 	if (this.formItem.name) { | ||||||
|  | 			// 		this.rename = this.formItem.name | ||||||
|  | 			// 		this.form.inputChildrens.push(this) | ||||||
|  | 			// 	} | ||||||
|  | 			// } | ||||||
|  | 		}, | ||||||
|  | 		mounted() { | ||||||
|  | 			this.platform() | ||||||
|  | 		}, | ||||||
|  | 		methods: { | ||||||
|  | 			/** | ||||||
|  | 			 * 获取父元素实例 | ||||||
|  | 			 */ | ||||||
|  | 			getForm(name = 'uniForms') { | ||||||
|  | 				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; | ||||||
|  | 			}, | ||||||
|  | 			initPicker(newVal) { | ||||||
|  | 				if (!newVal || Array.isArray(newVal) && !newVal.length) { | ||||||
|  | 					this.$nextTick(() => { | ||||||
|  | 						this.clear(false) | ||||||
|  | 					}) | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 				if (!Array.isArray(newVal) && !this.isRange) { | ||||||
|  | 					const { | ||||||
|  | 						defDate, | ||||||
|  | 						defTime | ||||||
|  | 					} = this.parseDate(newVal) | ||||||
|  | 					this.singleVal = defDate | ||||||
|  | 					this.tempSingleDate = defDate | ||||||
|  | 					this.defSingleDate = defDate | ||||||
|  | 					if (this.hasTime) { | ||||||
|  | 						this.singleVal = defDate + ' ' + defTime | ||||||
|  | 						this.time = defTime | ||||||
|  | 					} | ||||||
|  | 				} else { | ||||||
|  | 					const [before, after] = newVal | ||||||
|  | 					if (!before && !after) return | ||||||
|  | 					const defBefore = this.parseDate(before) | ||||||
|  | 					const defAfter = this.parseDate(after) | ||||||
|  | 					const startDate = defBefore.defDate | ||||||
|  | 					const endDate = defAfter.defDate | ||||||
|  | 					this.range.startDate = this.tempRange.startDate = startDate | ||||||
|  | 					this.range.endDate = this.tempRange.endDate = endDate | ||||||
|  | 
 | ||||||
|  | 					if (this.hasTime) { | ||||||
|  | 						this.range.startDate = defBefore.defDate + ' ' + defBefore.defTime | ||||||
|  | 						this.range.endDate = defAfter.defDate + ' ' + defAfter.defTime | ||||||
|  | 						this.tempRange.startTime = defBefore.defTime | ||||||
|  | 						this.tempRange.endTime = defAfter.defTime | ||||||
|  | 					} | ||||||
|  | 					const defaultRange = { | ||||||
|  | 						before: defBefore.defDate, | ||||||
|  | 						after: defAfter.defDate | ||||||
|  | 					} | ||||||
|  | 					this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, defaultRange, { | ||||||
|  | 						which: 'right' | ||||||
|  | 					}) | ||||||
|  | 					this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, defaultRange, { | ||||||
|  | 						which: 'left' | ||||||
|  | 					}) | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			updateLeftCale(e) { | ||||||
|  | 				const left = this.$refs.left | ||||||
|  | 				// 设置范围选 | ||||||
|  | 				left.cale.setHoverMultiple(e.after) | ||||||
|  | 				left.setDate(this.$refs.left.nowDate.fullDate) | ||||||
|  | 			}, | ||||||
|  | 			updateRightCale(e) { | ||||||
|  | 				const right = this.$refs.right | ||||||
|  | 				// 设置范围选 | ||||||
|  | 				right.cale.setHoverMultiple(e.after) | ||||||
|  | 				right.setDate(this.$refs.right.nowDate.fullDate) | ||||||
|  | 			}, | ||||||
|  | 			platform() { | ||||||
|  | 				const systemInfo = uni.getSystemInfoSync() | ||||||
|  | 				this.isPhone = systemInfo.windowWidth <= 500 | ||||||
|  | 				this.windowWidth = systemInfo.windowWidth | ||||||
|  | 			}, | ||||||
|  | 			show(event) { | ||||||
|  | 				if (this.disabled) { | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 				this.platform() | ||||||
|  | 				if (this.isPhone) { | ||||||
|  | 					this.$refs.mobile.open() | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 				this.popover = { | ||||||
|  | 					top: '10px' | ||||||
|  | 				} | ||||||
|  | 				const dateEditor = uni.createSelectorQuery().in(this).select(".uni-date-editor") | ||||||
|  | 				dateEditor.boundingClientRect(rect => { | ||||||
|  | 					if (this.windowWidth - rect.left < this.datePopupWidth) { | ||||||
|  | 						this.popover.right = 0 | ||||||
|  | 					} | ||||||
|  | 				}).exec() | ||||||
|  | 				setTimeout(() => { | ||||||
|  | 					this.popup = !this.popup | ||||||
|  | 					if (!this.isPhone && this.isRange && this.isFirstShow) { | ||||||
|  | 						this.isFirstShow = false | ||||||
|  | 						const { | ||||||
|  | 							startDate, | ||||||
|  | 							endDate | ||||||
|  | 						} = this.range | ||||||
|  | 						if (startDate && endDate) { | ||||||
|  | 							if (this.diffDate(startDate, endDate) < 30) { | ||||||
|  | 								this.$refs.right.next() | ||||||
|  | 							} | ||||||
|  | 						} else { | ||||||
|  | 							this.$refs.right.next() | ||||||
|  | 							this.$refs.right.cale.lastHover = false | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 				}, 50) | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			close() { | ||||||
|  | 				setTimeout(() => { | ||||||
|  | 					this.popup = false | ||||||
|  | 					this.$emit('maskClick', this.value) | ||||||
|  | 				}, 20) | ||||||
|  | 			}, | ||||||
|  | 			setEmit(value) { | ||||||
|  | 				if (this.returnType === "timestamp" || this.returnType === "date") { | ||||||
|  | 					if (!Array.isArray(value)) { | ||||||
|  | 						if (!this.hasTime) { | ||||||
|  | 							value = value + ' ' + '00:00:00' | ||||||
|  | 						} | ||||||
|  | 						value = this.createTimestamp(value) | ||||||
|  | 						if (this.returnType === "date") { | ||||||
|  | 							value = new Date(value) | ||||||
|  | 						} | ||||||
|  | 					} else { | ||||||
|  | 						if (!this.hasTime) { | ||||||
|  | 							value[0] = value[0] + ' ' + '00:00:00' | ||||||
|  | 							value[1] = value[1] + ' ' + '00:00:00' | ||||||
|  | 						} | ||||||
|  | 						value[0] = this.createTimestamp(value[0]) | ||||||
|  | 						value[1] = this.createTimestamp(value[1]) | ||||||
|  | 						if (this.returnType === "date") { | ||||||
|  | 							value[0] = new Date(value[0]) | ||||||
|  | 							value[1] = new Date(value[1]) | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				this.formItem && this.formItem.setValue(value) | ||||||
|  | 				this.$emit('change', value) | ||||||
|  | 				this.$emit('input', value) | ||||||
|  | 				this.$emit('update:modelValue', value) | ||||||
|  | 				this.isEmitValue = true | ||||||
|  | 			}, | ||||||
|  | 			createTimestamp(date) { | ||||||
|  | 				date = this.fixIosDateFormat(date) | ||||||
|  | 				return Date.parse(new Date(date)) | ||||||
|  | 			}, | ||||||
|  | 			singleChange(e) { | ||||||
|  | 				this.tempSingleDate = e.fulldate | ||||||
|  | 				if (this.hasTime) return | ||||||
|  | 				this.confirmSingleChange() | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			confirmSingleChange() { | ||||||
|  | 				if (!this.tempSingleDate) { | ||||||
|  | 					this.popup = false | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 				if (this.hasTime) { | ||||||
|  | 					this.singleVal = this.tempSingleDate + ' ' + (this.time ? this.time : '00:00:00') | ||||||
|  | 				} else { | ||||||
|  | 					this.singleVal = this.tempSingleDate | ||||||
|  | 				} | ||||||
|  | 				this.setEmit(this.singleVal) | ||||||
|  | 				this.popup = false | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			leftChange(e) { | ||||||
|  | 				const { | ||||||
|  | 					before, | ||||||
|  | 					after | ||||||
|  | 				} = e.range | ||||||
|  | 				this.rangeChange(before, after) | ||||||
|  | 				const obj = { | ||||||
|  | 					before: e.range.before, | ||||||
|  | 					after: e.range.after, | ||||||
|  | 					data: e.range.data, | ||||||
|  | 					fulldate: e.fulldate | ||||||
|  | 				} | ||||||
|  | 				this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, obj) | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			rightChange(e) { | ||||||
|  | 				const { | ||||||
|  | 					before, | ||||||
|  | 					after | ||||||
|  | 				} = e.range | ||||||
|  | 				this.rangeChange(before, after) | ||||||
|  | 				const obj = { | ||||||
|  | 					before: e.range.before, | ||||||
|  | 					after: e.range.after, | ||||||
|  | 					data: e.range.data, | ||||||
|  | 					fulldate: e.fulldate | ||||||
|  | 				} | ||||||
|  | 				this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, obj) | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			mobileChange(e) { | ||||||
|  | 				if (this.isRange) { | ||||||
|  | 					const { | ||||||
|  | 						before, | ||||||
|  | 						after | ||||||
|  | 					} = e.range | ||||||
|  | 					this.handleStartAndEnd(before, after, true) | ||||||
|  | 					if (this.hasTime) { | ||||||
|  | 						const { | ||||||
|  | 							startTime, | ||||||
|  | 							endTime | ||||||
|  | 						} = e.timeRange | ||||||
|  | 						this.tempRange.startTime = startTime | ||||||
|  | 						this.tempRange.endTime = endTime | ||||||
|  | 					} | ||||||
|  | 					this.confirmRangeChange() | ||||||
|  | 
 | ||||||
|  | 				} else { | ||||||
|  | 					if (this.hasTime) { | ||||||
|  | 						this.singleVal = e.fulldate + ' ' + e.time | ||||||
|  | 					} else { | ||||||
|  | 						this.singleVal = e.fulldate | ||||||
|  | 					} | ||||||
|  | 					this.setEmit(this.singleVal) | ||||||
|  | 				} | ||||||
|  | 				this.$refs.mobile.close() | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			rangeChange(before, after) { | ||||||
|  | 				if (!(before && after)) return | ||||||
|  | 				this.handleStartAndEnd(before, after, true) | ||||||
|  | 				if (this.hasTime) return | ||||||
|  | 				this.confirmRangeChange() | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			confirmRangeChange() { | ||||||
|  | 				if (!this.tempRange.startDate && !this.tempRange.endDate) { | ||||||
|  | 					this.popup = false | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 				let start, end | ||||||
|  | 				if (!this.hasTime) { | ||||||
|  | 					start = this.range.startDate = this.tempRange.startDate | ||||||
|  | 					end = this.range.endDate = this.tempRange.endDate | ||||||
|  | 				} else { | ||||||
|  | 					start = this.range.startDate = this.tempRange.startDate + ' ' + | ||||||
|  | 						(this.tempRange.startTime ? this.tempRange.startTime : '00:00:00') | ||||||
|  | 					end = this.range.endDate = this.tempRange.endDate + ' ' + | ||||||
|  | 						(this.tempRange.endTime ? this.tempRange.endTime : '00:00:00') | ||||||
|  | 				} | ||||||
|  | 				const displayRange = [start, end] | ||||||
|  | 				this.setEmit(displayRange) | ||||||
|  | 				this.popup = false | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			handleStartAndEnd(before, after, temp = false) { | ||||||
|  | 				if (!(before && after)) return | ||||||
|  | 				const type = temp ? 'tempRange' : 'range' | ||||||
|  | 				if (this.dateCompare(before, after)) { | ||||||
|  | 					this[type].startDate = before | ||||||
|  | 					this[type].endDate = after | ||||||
|  | 				} else { | ||||||
|  | 					this[type].startDate = after | ||||||
|  | 					this[type].endDate = before | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 比较时间大小 | ||||||
|  | 			 */ | ||||||
|  | 			dateCompare(startDate, endDate) { | ||||||
|  | 				// 计算截止时间 | ||||||
|  | 				startDate = new Date(startDate.replace('-', '/').replace('-', '/')) | ||||||
|  | 				// 计算详细项的截止时间 | ||||||
|  | 				endDate = new Date(endDate.replace('-', '/').replace('-', '/')) | ||||||
|  | 				if (startDate <= endDate) { | ||||||
|  | 					return true | ||||||
|  | 				} else { | ||||||
|  | 					return false | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			/** | ||||||
|  | 			 * 比较时间差 | ||||||
|  | 			 */ | ||||||
|  | 			diffDate(startDate, endDate) { | ||||||
|  | 				// 计算截止时间 | ||||||
|  | 				startDate = new Date(startDate.replace('-', '/').replace('-', '/')) | ||||||
|  | 				// 计算详细项的截止时间 | ||||||
|  | 				endDate = new Date(endDate.replace('-', '/').replace('-', '/')) | ||||||
|  | 				const diff = (endDate - startDate) / (24 * 60 * 60 * 1000) | ||||||
|  | 				return Math.abs(diff) | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			clear(needEmit = true) { | ||||||
|  | 				if (!this.isRange) { | ||||||
|  | 					this.singleVal = '' | ||||||
|  | 					this.tempSingleDate = '' | ||||||
|  | 					this.time = '' | ||||||
|  | 					if (this.isPhone) { | ||||||
|  | 						this.$refs.mobile && this.$refs.mobile.clearCalender() | ||||||
|  | 					} else { | ||||||
|  | 						this.$refs.pcSingle && this.$refs.pcSingle.clearCalender() | ||||||
|  | 					} | ||||||
|  | 					if (needEmit) { | ||||||
|  | 						this.formItem && this.formItem.setValue('') | ||||||
|  | 						this.$emit('change', '') | ||||||
|  | 						this.$emit('input', '') | ||||||
|  | 						this.$emit('update:modelValue', '') | ||||||
|  | 					} | ||||||
|  | 				} else { | ||||||
|  | 					this.range.startDate = '' | ||||||
|  | 					this.range.endDate = '' | ||||||
|  | 					this.tempRange.startDate = '' | ||||||
|  | 					this.tempRange.startTime = '' | ||||||
|  | 					this.tempRange.endDate = '' | ||||||
|  | 					this.tempRange.endTime = '' | ||||||
|  | 					if (this.isPhone) { | ||||||
|  | 						this.$refs.mobile && this.$refs.mobile.clearCalender() | ||||||
|  | 					} else { | ||||||
|  | 						this.$refs.left && this.$refs.left.clearCalender() | ||||||
|  | 						this.$refs.right && this.$refs.right.clearCalender() | ||||||
|  | 						this.$refs.right && this.$refs.right.next() | ||||||
|  | 					} | ||||||
|  | 					if (needEmit) { | ||||||
|  | 						this.formItem && this.formItem.setValue([]) | ||||||
|  | 						this.$emit('change', []) | ||||||
|  | 						this.$emit('input', []) | ||||||
|  | 						this.$emit('update:modelValue', []) | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			parseDate(date) { | ||||||
|  | 				date = this.fixIosDateFormat(date) | ||||||
|  | 				const defVal = new Date(date) | ||||||
|  | 				const year = defVal.getFullYear() | ||||||
|  | 				const month = defVal.getMonth() + 1 | ||||||
|  | 				const day = defVal.getDate() | ||||||
|  | 				const hour = defVal.getHours() | ||||||
|  | 				const minute = defVal.getMinutes() | ||||||
|  | 				const second = defVal.getSeconds() | ||||||
|  | 				const defDate = year + '-' + this.lessTen(month) + '-' + this.lessTen(day) | ||||||
|  | 				const defTime = this.lessTen(hour) + ':' + this.lessTen(minute) + (this.hideSecond ? '' : (':' + this | ||||||
|  | 					.lessTen(second))) | ||||||
|  | 				return { | ||||||
|  | 					defDate, | ||||||
|  | 					defTime | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			lessTen(item) { | ||||||
|  | 				return item < 10 ? '0' + item : item | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			//兼容 iOS、safari 日期格式 | ||||||
|  | 			fixIosDateFormat(value) { | ||||||
|  | 				if (typeof value === 'string') { | ||||||
|  | 					value = value.replace(/-/g, '/') | ||||||
|  | 				} | ||||||
|  | 				return value | ||||||
|  | 			}, | ||||||
|  | 
 | ||||||
|  | 			leftMonthSwitch(e) { | ||||||
|  | 				// console.log('leftMonthSwitch 返回:', e) | ||||||
|  | 			}, | ||||||
|  | 			rightMonthSwitch(e) { | ||||||
|  | 				// console.log('rightMonthSwitch 返回:', e) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  | 	.uni-date-x { | ||||||
|  | 		display: flex; | ||||||
|  | 		flex-direction: row; | ||||||
|  | 		align-items: center; | ||||||
|  | 		justify-content: center; | ||||||
|  | 		padding: 0 10px; | ||||||
|  | 		border-radius: 4px; | ||||||
|  | 		background-color: #fff; | ||||||
|  | 		color: #666; | ||||||
|  | 		font-size: 14px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-x--border { | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		border-radius: 4px; | ||||||
|  | 		border: 1px solid #dcdfe6; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-editor--x { | ||||||
|  | 		position: relative; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-editor--x .uni-date__icon-clear { | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 0; | ||||||
|  | 		right: 0; | ||||||
|  | 		display: inline-block; | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		border: 9px solid transparent; | ||||||
|  | 		/* #ifdef H5 */ | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		/* #endif */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date__x-input { | ||||||
|  | 		padding: 0 8px; | ||||||
|  | 		height: 40px; | ||||||
|  | 		width: 100%; | ||||||
|  | 		line-height: 40px; | ||||||
|  | 		font-size: 14px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.t-c { | ||||||
|  | 		text-align: center; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date__input { | ||||||
|  | 		height: 40px; | ||||||
|  | 		width: 100%; | ||||||
|  | 		line-height: 40px; | ||||||
|  | 		font-size: 14px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-range__input { | ||||||
|  | 		text-align: center; | ||||||
|  | 		max-width: 142px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-picker__container { | ||||||
|  | 		position: relative; | ||||||
|  | 		/* 		position: fixed; | ||||||
|  | 		left: 0; | ||||||
|  | 		right: 0; | ||||||
|  | 		top: 0; | ||||||
|  | 		bottom: 0; | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		z-index: 996; | ||||||
|  | 		font-size: 14px; */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-mask { | ||||||
|  | 		position: fixed; | ||||||
|  | 		bottom: 0px; | ||||||
|  | 		top: 0px; | ||||||
|  | 		left: 0px; | ||||||
|  | 		right: 0px; | ||||||
|  | 		background-color: rgba(0, 0, 0, 0); | ||||||
|  | 		transition-duration: 0.3s; | ||||||
|  | 		z-index: 996; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-single--x { | ||||||
|  | 		/* padding: 0 8px; */ | ||||||
|  | 		background-color: #fff; | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 0; | ||||||
|  | 		z-index: 999; | ||||||
|  | 		border: 1px solid #EBEEF5; | ||||||
|  | 		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); | ||||||
|  | 		border-radius: 4px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-range--x { | ||||||
|  | 		/* padding: 0 8px; */ | ||||||
|  | 		background-color: #fff; | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 0; | ||||||
|  | 		z-index: 999; | ||||||
|  | 		border: 1px solid #EBEEF5; | ||||||
|  | 		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); | ||||||
|  | 		border-radius: 4px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-editor--x__disabled { | ||||||
|  | 		opacity: 0.4; | ||||||
|  | 		cursor: default; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-editor--logo { | ||||||
|  | 		width: 16px; | ||||||
|  | 		height: 16px; | ||||||
|  | 		vertical-align: middle; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* 添加时间 */ | ||||||
|  | 	.popup-x-header { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 		/* justify-content: space-between; */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.popup-x-header--datetime { | ||||||
|  | 		/* #ifndef APP-NVUE */ | ||||||
|  | 		display: flex; | ||||||
|  | 		/* #endif */ | ||||||
|  | 		flex-direction: row; | ||||||
|  | 		flex: 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.popup-x-body { | ||||||
|  | 		display: flex; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.popup-x-footer { | ||||||
|  | 		padding: 0 15px; | ||||||
|  | 		border-top-color: #F1F1F1; | ||||||
|  | 		border-top-style: solid; | ||||||
|  | 		border-top-width: 1px; | ||||||
|  | 		/* background-color: #fff; */ | ||||||
|  | 		line-height: 40px; | ||||||
|  | 		text-align: right; | ||||||
|  | 		color: #666; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.popup-x-footer text:hover { | ||||||
|  | 		color: #007aff; | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		opacity: 0.8; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.popup-x-footer .confirm { | ||||||
|  | 		margin-left: 20px; | ||||||
|  | 		color: #007aff; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-changed { | ||||||
|  | 		/* background-color: #fff; */ | ||||||
|  | 		text-align: center; | ||||||
|  | 		color: #333; | ||||||
|  | 		border-bottom-color: #F1F1F1; | ||||||
|  | 		border-bottom-style: solid; | ||||||
|  | 		border-bottom-width: 1px; | ||||||
|  | 		/* padding: 0 50px; */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-changed--time text { | ||||||
|  | 		/* padding: 0 20px; */ | ||||||
|  | 		height: 50px; | ||||||
|  | 		line-height: 50px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-changed .uni-date-changed--time { | ||||||
|  | 		/* display: flex; */ | ||||||
|  | 		flex: 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-date-changed--time-date { | ||||||
|  | 		color: #333; | ||||||
|  | 		opacity: 0.6; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.mr-50 { | ||||||
|  | 		margin-right: 50px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* picker 弹出层通用的指示小三角, todo:扩展至上下左右方向定位 */ | ||||||
|  | 	.uni-popper__arrow, | ||||||
|  | 	.uni-popper__arrow::after { | ||||||
|  | 		position: absolute; | ||||||
|  | 		display: block; | ||||||
|  | 		width: 0; | ||||||
|  | 		height: 0; | ||||||
|  | 		border-color: transparent; | ||||||
|  | 		border-style: solid; | ||||||
|  | 		border-width: 6px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-popper__arrow { | ||||||
|  | 		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); | ||||||
|  | 		top: -6px; | ||||||
|  | 		left: 10%; | ||||||
|  | 		margin-right: 3px; | ||||||
|  | 		border-top-width: 0; | ||||||
|  | 		border-bottom-color: #EBEEF5; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.uni-popper__arrow::after { | ||||||
|  | 		content: " "; | ||||||
|  | 		top: 1px; | ||||||
|  | 		margin-left: -6px; | ||||||
|  | 		border-top-width: 0; | ||||||
|  | 		border-bottom-color: #fff; | ||||||
|  | 	} | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,410 @@ | ||||||
|  | class Calendar { | ||||||
|  | 	constructor({ | ||||||
|  | 		date, | ||||||
|  | 		selected, | ||||||
|  | 		startDate, | ||||||
|  | 		endDate, | ||||||
|  | 		range, | ||||||
|  | 		// multipleStatus
 | ||||||
|  | 	} = {}) { | ||||||
|  | 		// 当前日期
 | ||||||
|  | 		this.date = this.getDate(new Date()) // 当前初入日期
 | ||||||
|  | 		// 打点信息
 | ||||||
|  | 		this.selected = selected || []; | ||||||
|  | 		// 范围开始
 | ||||||
|  | 		this.startDate = startDate | ||||||
|  | 		// 范围结束
 | ||||||
|  | 		this.endDate = endDate | ||||||
|  | 		this.range = range | ||||||
|  | 		// 多选状态
 | ||||||
|  | 		this.cleanMultipleStatus() | ||||||
|  | 		// 每周日期
 | ||||||
|  | 		this.weeks = {} | ||||||
|  | 		// this._getWeek(this.date.fullDate)
 | ||||||
|  | 		// this.multipleStatus = multipleStatus
 | ||||||
|  | 		this.lastHover = false | ||||||
|  | 	} | ||||||
|  | 	/** | ||||||
|  | 	 * 设置日期 | ||||||
|  | 	 * @param {Object} date | ||||||
|  | 	 */ | ||||||
|  | 	setDate(date) { | ||||||
|  | 		this.selectDate = this.getDate(date) | ||||||
|  | 		this._getWeek(this.selectDate.fullDate) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 清理多选状态 | ||||||
|  | 	 */ | ||||||
|  | 	cleanMultipleStatus() { | ||||||
|  | 		this.multipleStatus = { | ||||||
|  | 			before: '', | ||||||
|  | 			after: '', | ||||||
|  | 			data: [] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 重置开始日期 | ||||||
|  | 	 */ | ||||||
|  | 	resetSatrtDate(startDate) { | ||||||
|  | 		// 范围开始
 | ||||||
|  | 		this.startDate = startDate | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 重置结束日期 | ||||||
|  | 	 */ | ||||||
|  | 	resetEndDate(endDate) { | ||||||
|  | 		// 范围结束
 | ||||||
|  | 		this.endDate = endDate | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 获取任意时间 | ||||||
|  | 	 */ | ||||||
|  | 	getDate(date, AddDayCount = 0, str = 'day') { | ||||||
|  | 		if (!date) { | ||||||
|  | 			date = new Date() | ||||||
|  | 		} | ||||||
|  | 		if (typeof date !== 'object') { | ||||||
|  | 			date = date.replace(/-/g, '/') | ||||||
|  | 		} | ||||||
|  | 		const dd = new Date(date) | ||||||
|  | 		switch (str) { | ||||||
|  | 			case 'day': | ||||||
|  | 				dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
 | ||||||
|  | 				break | ||||||
|  | 			case 'month': | ||||||
|  | 				if (dd.getDate() === 31) { | ||||||
|  | 					dd.setDate(dd.getDate() + AddDayCount) | ||||||
|  | 				} else { | ||||||
|  | 					dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期
 | ||||||
|  | 				} | ||||||
|  | 				break | ||||||
|  | 			case 'year': | ||||||
|  | 				dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
 | ||||||
|  | 				break | ||||||
|  | 		} | ||||||
|  | 		const y = dd.getFullYear() | ||||||
|  | 		const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
 | ||||||
|  | 		const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
 | ||||||
|  | 		return { | ||||||
|  | 			fullDate: y + '-' + m + '-' + d, | ||||||
|  | 			year: y, | ||||||
|  | 			month: m, | ||||||
|  | 			date: d, | ||||||
|  | 			day: dd.getDay() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 获取上月剩余天数 | ||||||
|  | 	 */ | ||||||
|  | 	_getLastMonthDays(firstDay, full) { | ||||||
|  | 		let dateArr = [] | ||||||
|  | 		for (let i = firstDay; i > 0; i--) { | ||||||
|  | 			const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() | ||||||
|  | 			dateArr.push({ | ||||||
|  | 				date: beforeDate, | ||||||
|  | 				month: full.month - 1, | ||||||
|  | 				disable: true | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 		return dateArr | ||||||
|  | 	} | ||||||
|  | 	/** | ||||||
|  | 	 * 获取本月天数 | ||||||
|  | 	 */ | ||||||
|  | 	_currentMonthDys(dateData, full) { | ||||||
|  | 		let dateArr = [] | ||||||
|  | 		let fullDate = this.date.fullDate | ||||||
|  | 		for (let i = 1; i <= dateData; i++) { | ||||||
|  | 			let isinfo = false | ||||||
|  | 			let nowDate = full.year + '-' + (full.month < 10 ? | ||||||
|  | 				full.month : full.month) + '-' + (i < 10 ? | ||||||
|  | 				'0' + i : i) | ||||||
|  | 			// 是否今天
 | ||||||
|  | 			let isDay = fullDate === nowDate | ||||||
|  | 			// 获取打点信息
 | ||||||
|  | 			let info = this.selected && this.selected.find((item) => { | ||||||
|  | 				if (this.dateEqual(nowDate, item.date)) { | ||||||
|  | 					return item | ||||||
|  | 				} | ||||||
|  | 			}) | ||||||
|  | 
 | ||||||
|  | 			// 日期禁用
 | ||||||
|  | 			let disableBefore = true | ||||||
|  | 			let disableAfter = true | ||||||
|  | 			if (this.startDate) { | ||||||
|  | 				// let dateCompBefore = this.dateCompare(this.startDate, fullDate)
 | ||||||
|  | 				// disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
 | ||||||
|  | 				disableBefore = this.dateCompare(this.startDate, nowDate) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (this.endDate) { | ||||||
|  | 				// let dateCompAfter = this.dateCompare(fullDate, this.endDate)
 | ||||||
|  | 				// disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
 | ||||||
|  | 				disableAfter = this.dateCompare(nowDate, this.endDate) | ||||||
|  | 			} | ||||||
|  | 			let multiples = this.multipleStatus.data | ||||||
|  | 			let checked = false | ||||||
|  | 			let multiplesStatus = -1 | ||||||
|  | 			if (this.range) { | ||||||
|  | 				if (multiples) { | ||||||
|  | 					multiplesStatus = multiples.findIndex((item) => { | ||||||
|  | 						return this.dateEqual(item, nowDate) | ||||||
|  | 					}) | ||||||
|  | 				} | ||||||
|  | 				if (multiplesStatus !== -1) { | ||||||
|  | 					checked = true | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			let data = { | ||||||
|  | 				fullDate: nowDate, | ||||||
|  | 				year: full.year, | ||||||
|  | 				date: i, | ||||||
|  | 				multiple: this.range ? checked : false, | ||||||
|  | 				beforeMultiple: this.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after), | ||||||
|  | 				afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after), | ||||||
|  | 				month: full.month, | ||||||
|  | 				disable: !(disableBefore && disableAfter), | ||||||
|  | 				isDay, | ||||||
|  | 				userChecked: false | ||||||
|  | 			} | ||||||
|  | 			if (info) { | ||||||
|  | 				data.extraInfo = info | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			dateArr.push(data) | ||||||
|  | 		} | ||||||
|  | 		return dateArr | ||||||
|  | 	} | ||||||
|  | 	/** | ||||||
|  | 	 * 获取下月天数 | ||||||
|  | 	 */ | ||||||
|  | 	_getNextMonthDays(surplus, full) { | ||||||
|  | 		let dateArr = [] | ||||||
|  | 		for (let i = 1; i < surplus + 1; i++) { | ||||||
|  | 			dateArr.push({ | ||||||
|  | 				date: i, | ||||||
|  | 				month: Number(full.month) + 1, | ||||||
|  | 				disable: true | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 		return dateArr | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 获取当前日期详情 | ||||||
|  | 	 * @param {Object} date | ||||||
|  | 	 */ | ||||||
|  | 	getInfo(date) { | ||||||
|  | 		if (!date) { | ||||||
|  | 			date = new Date() | ||||||
|  | 		} | ||||||
|  | 		const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) | ||||||
|  | 		return dateInfo | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 比较时间大小 | ||||||
|  | 	 */ | ||||||
|  | 	dateCompare(startDate, endDate) { | ||||||
|  | 		// 计算截止时间
 | ||||||
|  | 		startDate = new Date(startDate.replace('-', '/').replace('-', '/')) | ||||||
|  | 		// 计算详细项的截止时间
 | ||||||
|  | 		endDate = new Date(endDate.replace('-', '/').replace('-', '/')) | ||||||
|  | 		if (startDate <= endDate) { | ||||||
|  | 			return true | ||||||
|  | 		} else { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 比较时间是否相等 | ||||||
|  | 	 */ | ||||||
|  | 	dateEqual(before, after) { | ||||||
|  | 		// 计算截止时间
 | ||||||
|  | 		before = new Date(before.replace('-', '/').replace('-', '/')) | ||||||
|  | 		// 计算详细项的截止时间
 | ||||||
|  | 		after = new Date(after.replace('-', '/').replace('-', '/')) | ||||||
|  | 		if (before.getTime() - after.getTime() === 0) { | ||||||
|  | 			return true | ||||||
|  | 		} else { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 *  比较真实起始日期 | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	isLogicBefore(currentDay, before, after) { | ||||||
|  | 		let logicBefore = before | ||||||
|  | 		if (before && after) { | ||||||
|  | 			logicBefore = this.dateCompare(before, after) ? before : after | ||||||
|  | 		} | ||||||
|  | 		return this.dateEqual(logicBefore, currentDay) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	isLogicAfter(currentDay, before, after) { | ||||||
|  | 		let logicAfter = after | ||||||
|  | 		if (before && after) { | ||||||
|  | 			logicAfter = this.dateCompare(before, after) ? after : before | ||||||
|  | 		} | ||||||
|  | 		return this.dateEqual(logicAfter, currentDay) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 获取日期范围内所有日期 | ||||||
|  | 	 * @param {Object} begin | ||||||
|  | 	 * @param {Object} end | ||||||
|  | 	 */ | ||||||
|  | 	geDateAll(begin, end) { | ||||||
|  | 		var arr = [] | ||||||
|  | 		var ab = begin.split('-') | ||||||
|  | 		var ae = end.split('-') | ||||||
|  | 		var db = new Date() | ||||||
|  | 		db.setFullYear(ab[0], ab[1] - 1, ab[2]) | ||||||
|  | 		var de = new Date() | ||||||
|  | 		de.setFullYear(ae[0], ae[1] - 1, ae[2]) | ||||||
|  | 		var unixDb = db.getTime() - 24 * 60 * 60 * 1000 | ||||||
|  | 		var unixDe = de.getTime() - 24 * 60 * 60 * 1000 | ||||||
|  | 		for (var k = unixDb; k <= unixDe;) { | ||||||
|  | 			k = k + 24 * 60 * 60 * 1000 | ||||||
|  | 			arr.push(this.getDate(new Date(parseInt(k))).fullDate) | ||||||
|  | 		} | ||||||
|  | 		return arr | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 *  获取多选状态 | ||||||
|  | 	 */ | ||||||
|  | 	setMultiple(fullDate) { | ||||||
|  | 		let { | ||||||
|  | 			before, | ||||||
|  | 			after | ||||||
|  | 		} = this.multipleStatus | ||||||
|  | 		if (!this.range) return | ||||||
|  | 		if (before && after) { | ||||||
|  | 			if (!this.lastHover) { | ||||||
|  | 				this.lastHover = true | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 			this.multipleStatus.before = fullDate | ||||||
|  | 			this.multipleStatus.after = '' | ||||||
|  | 			this.multipleStatus.data = [] | ||||||
|  | 			this.multipleStatus.fulldate = '' | ||||||
|  | 			this.lastHover = false | ||||||
|  | 		} else { | ||||||
|  | 			if (!before) { | ||||||
|  | 				this.multipleStatus.before = fullDate | ||||||
|  | 				this.lastHover = false | ||||||
|  | 			} else { | ||||||
|  | 				this.multipleStatus.after = fullDate | ||||||
|  | 				if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { | ||||||
|  | 					this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus | ||||||
|  | 						.after); | ||||||
|  | 				} else { | ||||||
|  | 					this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus | ||||||
|  | 						.before); | ||||||
|  | 				} | ||||||
|  | 				this.lastHover = true | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		this._getWeek(fullDate) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 *  鼠标 hover 更新多选状态 | ||||||
|  | 	 */ | ||||||
|  | 	setHoverMultiple(fullDate) { | ||||||
|  | 		let { | ||||||
|  | 			before, | ||||||
|  | 			after | ||||||
|  | 		} = this.multipleStatus | ||||||
|  | 
 | ||||||
|  | 		if (!this.range) return | ||||||
|  | 		if (this.lastHover) return | ||||||
|  | 
 | ||||||
|  | 		if (!before) { | ||||||
|  | 			this.multipleStatus.before = fullDate | ||||||
|  | 		} else { | ||||||
|  | 			this.multipleStatus.after = fullDate | ||||||
|  | 			if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { | ||||||
|  | 				this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); | ||||||
|  | 			} else { | ||||||
|  | 				this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		this._getWeek(fullDate) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 更新默认值多选状态 | ||||||
|  | 	 */ | ||||||
|  | 	setDefaultMultiple(before, after) { | ||||||
|  | 		this.multipleStatus.before = before | ||||||
|  | 		this.multipleStatus.after = after | ||||||
|  | 		if (before && after) { | ||||||
|  | 			if (this.dateCompare(before, after)) { | ||||||
|  | 				this.multipleStatus.data = this.geDateAll(before, after); | ||||||
|  | 				this._getWeek(after) | ||||||
|  | 			} else { | ||||||
|  | 				this.multipleStatus.data = this.geDateAll(after, before); | ||||||
|  | 				this._getWeek(before) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 获取每周数据 | ||||||
|  | 	 * @param {Object} dateData | ||||||
|  | 	 */ | ||||||
|  | 	_getWeek(dateData) { | ||||||
|  | 		const { | ||||||
|  | 			fullDate, | ||||||
|  | 			year, | ||||||
|  | 			month, | ||||||
|  | 			date, | ||||||
|  | 			day | ||||||
|  | 		} = this.getDate(dateData) | ||||||
|  | 		let firstDay = new Date(year, month - 1, 1).getDay() | ||||||
|  | 		let currentDay = new Date(year, month, 0).getDate() | ||||||
|  | 		let dates = { | ||||||
|  | 			lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
 | ||||||
|  | 			currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
 | ||||||
|  | 			nextMonthDays: [], // 下个月开始几天
 | ||||||
|  | 			weeks: [] | ||||||
|  | 		} | ||||||
|  | 		let canlender = [] | ||||||
|  | 		const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) | ||||||
|  | 		dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) | ||||||
|  | 		canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) | ||||||
|  | 		let weeks = {} | ||||||
|  | 		// 拼接数组  上个月开始几天 + 本月天数+ 下个月开始几天
 | ||||||
|  | 		for (let i = 0; i < canlender.length; i++) { | ||||||
|  | 			if (i % 7 === 0) { | ||||||
|  | 				weeks[parseInt(i / 7)] = new Array(7) | ||||||
|  | 			} | ||||||
|  | 			weeks[parseInt(i / 7)][i % 7] = canlender[i] | ||||||
|  | 		} | ||||||
|  | 		this.canlender = canlender | ||||||
|  | 		this.weeks = weeks | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//静态方法
 | ||||||
|  | 	// static init(date) {
 | ||||||
|  | 	// 	if (!this.instance) {
 | ||||||
|  | 	// 		this.instance = new Calendar(date);
 | ||||||
|  | 	// 	}
 | ||||||
|  | 	// 	return this.instance;
 | ||||||
|  | 	// }
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | export default Calendar | ||||||
|  | @ -0,0 +1,90 @@ | ||||||
|  | { | ||||||
|  |   "id": "uni-datetime-picker", | ||||||
|  |   "displayName": "uni-datetime-picker 日期选择器", | ||||||
|  |   "version": "2.2.2", | ||||||
|  |   "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", | ||||||
|  |   "keywords": [ | ||||||
|  |     "uni-datetime-picker", | ||||||
|  |     "uni-ui", | ||||||
|  |     "uniui", | ||||||
|  |     "日期时间选择器", | ||||||
|  |     "日期时间" | ||||||
|  | ], | ||||||
|  |   "repository": "https://github.com/dcloudio/uni-ui", | ||||||
|  |   "engines": { | ||||||
|  |     "HBuilderX": "" | ||||||
|  |   }, | ||||||
|  |   "directories": { | ||||||
|  |     "example": "../../temps/example_temps" | ||||||
|  |   }, | ||||||
|  |   "dcloudext": { | ||||||
|  |     "category": [ | ||||||
|  |       "前端组件", | ||||||
|  |       "通用组件" | ||||||
|  |     ], | ||||||
|  |     "sale": { | ||||||
|  |       "regular": { | ||||||
|  |         "price": "0.00" | ||||||
|  |       }, | ||||||
|  |       "sourcecode": { | ||||||
|  |         "price": "0.00" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "contact": { | ||||||
|  |       "qq": "" | ||||||
|  |     }, | ||||||
|  |     "declaration": { | ||||||
|  |       "ads": "无", | ||||||
|  |       "data": "无", | ||||||
|  |       "permissions": "无" | ||||||
|  |     }, | ||||||
|  |     "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" | ||||||
|  |   }, | ||||||
|  |   "uni_modules": { | ||||||
|  |     "dependencies": [ | ||||||
|  | 			"uni-scss", | ||||||
|  | 			"uni-icons" | ||||||
|  | 		], | ||||||
|  |     "encrypt": [], | ||||||
|  |     "platforms": { | ||||||
|  |       "cloud": { | ||||||
|  |         "tcb": "y", | ||||||
|  |         "aliyun": "y" | ||||||
|  |       }, | ||||||
|  |       "client": { | ||||||
|  |         "App": { | ||||||
|  |           "app-vue": "y", | ||||||
|  |           "app-nvue": "n" | ||||||
|  |         }, | ||||||
|  |         "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" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,21 @@ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | > `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` | ||||||
|  | 
 | ||||||
|  | ## DatetimePicker 时间选择器 | ||||||
|  | 
 | ||||||
|  | > **组件名:uni-datetime-picker** | ||||||
|  | > 代码块: `uDatetimePicker` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 | ||||||
|  | 
 | ||||||
|  | 若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 | ||||||
|  | 
 | ||||||
|  | **_点击 picker 默认值规则:_** | ||||||
|  | 
 | ||||||
|  | - 若设置初始值 value, 会显示在 picker 显示框中 | ||||||
|  | - 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 | ||||||
|  | 
 | ||||||
|  | ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) | ||||||
|  | #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839  | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | ## 1.3.5(2022-01-24) | ||||||
|  | - 优化 size 属性可以传入不带单位的字符串数值 | ||||||
|  | ## 1.3.4(2022-01-24) | ||||||
|  | - 优化 size 支持其他单位 | ||||||
|  | ## 1.3.3(2022-01-17) | ||||||
|  | - 修复 nvue 有些图标不显示的bug,兼容老版本图标 | ||||||
|  | ## 1.3.2(2021-12-01) | ||||||
|  | - 优化 示例可复制图标名称 | ||||||
|  | ## 1.3.1(2021-11-23) | ||||||
|  | - 优化 兼容旧组件 type 值 | ||||||
|  | ## 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-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) | ||||||
|  | ## 1.1.7(2021-11-08) | ||||||
|  | ## 1.2.0(2021-07-30) | ||||||
|  | - 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) | ||||||
|  | ## 1.1.5(2021-05-12) | ||||||
|  | - 新增 组件示例地址 | ||||||
|  | ## 1.1.4(2021-02-05) | ||||||
|  | - 调整为uni_modules目录规范 | ||||||
|  | @ -0,0 +1,96 @@ | ||||||
|  | <template> | ||||||
|  | 	<!-- #ifdef APP-NVUE --> | ||||||
|  | 	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text> | ||||||
|  | 	<!-- #endif --> | ||||||
|  | 	<!-- #ifndef APP-NVUE --> | ||||||
|  | 	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text> | ||||||
|  | 	<!-- #endif --> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | 	import icons from './icons.js'; | ||||||
|  | 	const getVal = (val) => { | ||||||
|  | 		const reg = /^[0-9]*$/g | ||||||
|  | 		return (typeof val === 'number' || reg.test(val) )? val + 'px' : val; | ||||||
|  | 	}  | ||||||
|  | 	// #ifdef APP-NVUE | ||||||
|  | 	var domModule = weex.requireModule('dom'); | ||||||
|  | 	import iconUrl from './uniicons.ttf' | ||||||
|  | 	domModule.addRule('fontFace', { | ||||||
|  | 		'fontFamily': "uniicons", | ||||||
|  | 		'src': "url('"+iconUrl+"')" | ||||||
|  | 	}); | ||||||
|  | 	// #endif | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Icons 图标 | ||||||
|  | 	 * @description 用于展示 icons 图标 | ||||||
|  | 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=28 | ||||||
|  | 	 * @property {Number} size 图标大小 | ||||||
|  | 	 * @property {String} type 图标图案,参考示例 | ||||||
|  | 	 * @property {String} color 图标颜色 | ||||||
|  | 	 * @property {String} customPrefix 自定义图标 | ||||||
|  | 	 * @event {Function} click 点击 Icon 触发事件 | ||||||
|  | 	 */ | ||||||
|  | 	export default { | ||||||
|  | 		name: 'UniIcons', | ||||||
|  | 		emits:['click'], | ||||||
|  | 		props: { | ||||||
|  | 			type: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '' | ||||||
|  | 			}, | ||||||
|  | 			color: { | ||||||
|  | 				type: String, | ||||||
|  | 				default: '#333333' | ||||||
|  | 			}, | ||||||
|  | 			size: { | ||||||
|  | 				type: [Number, String], | ||||||
|  | 				default: 16 | ||||||
|  | 			}, | ||||||
|  | 			customPrefix:{ | ||||||
|  | 				type: String, | ||||||
|  | 				default: '' | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		data() { | ||||||
|  | 			return { | ||||||
|  | 				icons: icons.glyphs | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		computed:{ | ||||||
|  | 			unicode(){ | ||||||
|  | 				let code = this.icons.find(v=>v.font_class === this.type) | ||||||
|  | 				if(code){ | ||||||
|  | 					return unescape(`%u${code.unicode}`) | ||||||
|  | 				} | ||||||
|  | 				return '' | ||||||
|  | 			}, | ||||||
|  | 			iconSize(){ | ||||||
|  | 				return getVal(this.size) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		methods: { | ||||||
|  | 			_onClick() { | ||||||
|  | 				this.$emit('click') | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="scss"> | ||||||
|  | 	/* #ifndef APP-NVUE */ | ||||||
|  | 	@import './uniicons.css'; | ||||||
|  | 	@font-face { | ||||||
|  | 		font-family: uniicons; | ||||||
|  | 		src: url('./uniicons.ttf') format('truetype'); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* #endif */ | ||||||
|  | 	.uni-icons { | ||||||
|  | 		font-family: uniicons; | ||||||
|  | 		text-decoration: none; | ||||||
|  | 		text-align: center; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,663 @@ | ||||||
|  | .uniui-color:before { | ||||||
|  |   content: "\e6cf"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-wallet:before { | ||||||
|  |   content: "\e6b1"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-settings-filled:before { | ||||||
|  |   content: "\e6ce"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-auth-filled:before { | ||||||
|  |   content: "\e6cc"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-shop-filled:before { | ||||||
|  |   content: "\e6cd"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-staff-filled:before { | ||||||
|  |   content: "\e6cb"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-vip-filled:before { | ||||||
|  |   content: "\e6c6"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-plus-filled:before { | ||||||
|  |   content: "\e6c7"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-folder-add-filled:before { | ||||||
|  |   content: "\e6c8"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-color-filled:before { | ||||||
|  |   content: "\e6c9"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-tune-filled:before { | ||||||
|  |   content: "\e6ca"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-calendar-filled:before { | ||||||
|  |   content: "\e6c0"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-notification-filled:before { | ||||||
|  |   content: "\e6c1"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-wallet-filled:before { | ||||||
|  |   content: "\e6c2"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-medal-filled:before { | ||||||
|  |   content: "\e6c3"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-gift-filled:before { | ||||||
|  |   content: "\e6c4"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-fire-filled:before { | ||||||
|  |   content: "\e6c5"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-refreshempty:before { | ||||||
|  |   content: "\e6bf"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-location-filled:before { | ||||||
|  |   content: "\e6af"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-person-filled:before { | ||||||
|  |   content: "\e69d"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-personadd-filled:before { | ||||||
|  |   content: "\e698"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-back:before { | ||||||
|  |   content: "\e6b9"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-forward:before { | ||||||
|  |   content: "\e6ba"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrow-right:before { | ||||||
|  |   content: "\e6bb"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrowthinright:before { | ||||||
|  |   content: "\e6bb"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrow-left:before { | ||||||
|  |   content: "\e6bc"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrowthinleft:before { | ||||||
|  |   content: "\e6bc"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrow-up:before { | ||||||
|  |   content: "\e6bd"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrowthinup:before { | ||||||
|  |   content: "\e6bd"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrow-down:before { | ||||||
|  |   content: "\e6be"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrowthindown:before { | ||||||
|  |   content: "\e6be"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-bottom:before { | ||||||
|  |   content: "\e6b8"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrowdown:before { | ||||||
|  |   content: "\e6b8"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-right:before { | ||||||
|  |   content: "\e6b5"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrowright:before { | ||||||
|  |   content: "\e6b5"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-top:before { | ||||||
|  |   content: "\e6b6"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrowup:before { | ||||||
|  |   content: "\e6b6"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-left:before { | ||||||
|  |   content: "\e6b7"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-arrowleft:before { | ||||||
|  |   content: "\e6b7"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-eye:before { | ||||||
|  |   content: "\e651"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-eye-filled:before { | ||||||
|  |   content: "\e66a"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-eye-slash:before { | ||||||
|  |   content: "\e6b3"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-eye-slash-filled:before { | ||||||
|  |   content: "\e6b4"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-info-filled:before { | ||||||
|  |   content: "\e649"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-reload:before { | ||||||
|  |   content: "\e6b2"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-micoff-filled:before { | ||||||
|  |   content: "\e6b0"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-map-pin-ellipse:before { | ||||||
|  |   content: "\e6ac"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-map-pin:before { | ||||||
|  |   content: "\e6ad"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-location:before { | ||||||
|  |   content: "\e6ae"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-starhalf:before { | ||||||
|  |   content: "\e683"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-star:before { | ||||||
|  |   content: "\e688"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-star-filled:before { | ||||||
|  |   content: "\e68f"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-calendar:before { | ||||||
|  |   content: "\e6a0"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-fire:before { | ||||||
|  |   content: "\e6a1"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-medal:before { | ||||||
|  |   content: "\e6a2"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-font:before { | ||||||
|  |   content: "\e6a3"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-gift:before { | ||||||
|  |   content: "\e6a4"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-link:before { | ||||||
|  |   content: "\e6a5"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-notification:before { | ||||||
|  |   content: "\e6a6"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-staff:before { | ||||||
|  |   content: "\e6a7"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-vip:before { | ||||||
|  |   content: "\e6a8"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-folder-add:before { | ||||||
|  |   content: "\e6a9"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-tune:before { | ||||||
|  |   content: "\e6aa"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-auth:before { | ||||||
|  |   content: "\e6ab"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-person:before { | ||||||
|  |   content: "\e699"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-email-filled:before { | ||||||
|  |   content: "\e69a"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-phone-filled:before { | ||||||
|  |   content: "\e69b"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-phone:before { | ||||||
|  |   content: "\e69c"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-email:before { | ||||||
|  |   content: "\e69e"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-personadd:before { | ||||||
|  |   content: "\e69f"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-chatboxes-filled:before { | ||||||
|  |   content: "\e692"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-contact:before { | ||||||
|  |   content: "\e693"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-chatbubble-filled:before { | ||||||
|  |   content: "\e694"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-contact-filled:before { | ||||||
|  |   content: "\e695"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-chatboxes:before { | ||||||
|  |   content: "\e696"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-chatbubble:before { | ||||||
|  |   content: "\e697"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-upload-filled:before { | ||||||
|  |   content: "\e68e"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-upload:before { | ||||||
|  |   content: "\e690"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-weixin:before { | ||||||
|  |   content: "\e691"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-compose:before { | ||||||
|  |   content: "\e67f"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-qq:before { | ||||||
|  |   content: "\e680"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-download-filled:before { | ||||||
|  |   content: "\e681"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-pyq:before { | ||||||
|  |   content: "\e682"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-sound:before { | ||||||
|  |   content: "\e684"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-trash-filled:before { | ||||||
|  |   content: "\e685"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-sound-filled:before { | ||||||
|  |   content: "\e686"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-trash:before { | ||||||
|  |   content: "\e687"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-videocam-filled:before { | ||||||
|  |   content: "\e689"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-spinner-cycle:before { | ||||||
|  |   content: "\e68a"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-weibo:before { | ||||||
|  |   content: "\e68b"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-videocam:before { | ||||||
|  |   content: "\e68c"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-download:before { | ||||||
|  |   content: "\e68d"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-help:before { | ||||||
|  |   content: "\e679"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-navigate-filled:before { | ||||||
|  |   content: "\e67a"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-plusempty:before { | ||||||
|  |   content: "\e67b"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-smallcircle:before { | ||||||
|  |   content: "\e67c"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-minus-filled:before { | ||||||
|  |   content: "\e67d"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-micoff:before { | ||||||
|  |   content: "\e67e"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-closeempty:before { | ||||||
|  |   content: "\e66c"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-clear:before { | ||||||
|  |   content: "\e66d"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-navigate:before { | ||||||
|  |   content: "\e66e"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-minus:before { | ||||||
|  |   content: "\e66f"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-image:before { | ||||||
|  |   content: "\e670"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-mic:before { | ||||||
|  |   content: "\e671"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-paperplane:before { | ||||||
|  |   content: "\e672"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-close:before { | ||||||
|  |   content: "\e673"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-help-filled:before { | ||||||
|  |   content: "\e674"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-paperplane-filled:before { | ||||||
|  |   content: "\e675"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-plus:before { | ||||||
|  |   content: "\e676"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-mic-filled:before { | ||||||
|  |   content: "\e677"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-image-filled:before { | ||||||
|  |   content: "\e678"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-locked-filled:before { | ||||||
|  |   content: "\e668"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-info:before { | ||||||
|  |   content: "\e669"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-locked:before { | ||||||
|  |   content: "\e66b"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-camera-filled:before { | ||||||
|  |   content: "\e658"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-chat-filled:before { | ||||||
|  |   content: "\e659"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-camera:before { | ||||||
|  |   content: "\e65a"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-circle:before { | ||||||
|  |   content: "\e65b"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-checkmarkempty:before { | ||||||
|  |   content: "\e65c"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-chat:before { | ||||||
|  |   content: "\e65d"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-circle-filled:before { | ||||||
|  |   content: "\e65e"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-flag:before { | ||||||
|  |   content: "\e65f"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-flag-filled:before { | ||||||
|  |   content: "\e660"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-gear-filled:before { | ||||||
|  |   content: "\e661"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-home:before { | ||||||
|  |   content: "\e662"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-home-filled:before { | ||||||
|  |   content: "\e663"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-gear:before { | ||||||
|  |   content: "\e664"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-smallcircle-filled:before { | ||||||
|  |   content: "\e665"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-map-filled:before { | ||||||
|  |   content: "\e666"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-map:before { | ||||||
|  |   content: "\e667"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-refresh-filled:before { | ||||||
|  |   content: "\e656"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-refresh:before { | ||||||
|  |   content: "\e657"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-cloud-upload:before { | ||||||
|  |   content: "\e645"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-cloud-download-filled:before { | ||||||
|  |   content: "\e646"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-cloud-download:before { | ||||||
|  |   content: "\e647"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-cloud-upload-filled:before { | ||||||
|  |   content: "\e648"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-redo:before { | ||||||
|  |   content: "\e64a"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-images-filled:before { | ||||||
|  |   content: "\e64b"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-undo-filled:before { | ||||||
|  |   content: "\e64c"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-more:before { | ||||||
|  |   content: "\e64d"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-more-filled:before { | ||||||
|  |   content: "\e64e"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-undo:before { | ||||||
|  |   content: "\e64f"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-images:before { | ||||||
|  |   content: "\e650"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-paperclip:before { | ||||||
|  |   content: "\e652"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-settings:before { | ||||||
|  |   content: "\e653"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-search:before { | ||||||
|  |   content: "\e654"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-redo-filled:before { | ||||||
|  |   content: "\e655"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-list:before { | ||||||
|  |   content: "\e644"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-mail-open-filled:before { | ||||||
|  |   content: "\e63a"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-hand-down-filled:before { | ||||||
|  |   content: "\e63c"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-hand-down:before { | ||||||
|  |   content: "\e63d"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-hand-up-filled:before { | ||||||
|  |   content: "\e63e"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-hand-up:before { | ||||||
|  |   content: "\e63f"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-heart-filled:before { | ||||||
|  |   content: "\e641"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-mail-open:before { | ||||||
|  |   content: "\e643"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-heart:before { | ||||||
|  |   content: "\e639"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-loop:before { | ||||||
|  |   content: "\e633"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-pulldown:before { | ||||||
|  |   content: "\e632"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-scan:before { | ||||||
|  |   content: "\e62a"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-bars:before { | ||||||
|  |   content: "\e627"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-cart-filled:before { | ||||||
|  |   content: "\e629"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-checkbox:before { | ||||||
|  |   content: "\e62b"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-checkbox-filled:before { | ||||||
|  |   content: "\e62c"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-shop:before { | ||||||
|  |   content: "\e62f"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-headphones:before { | ||||||
|  |   content: "\e630"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .uniui-cart:before { | ||||||
|  |   content: "\e631"; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,86 @@ | ||||||
|  | { | ||||||
|  |   "id": "uni-icons", | ||||||
|  |   "displayName": "uni-icons 图标", | ||||||
|  |   "version": "1.3.5", | ||||||
|  |   "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", | ||||||
|  |   "keywords": [ | ||||||
|  |     "uni-ui", | ||||||
|  |     "uniui", | ||||||
|  |     "icon", | ||||||
|  |     "图标" | ||||||
|  | ], | ||||||
|  |   "repository": "https://github.com/dcloudio/uni-ui", | ||||||
|  |   "engines": { | ||||||
|  |     "HBuilderX": "^3.2.14" | ||||||
|  |   }, | ||||||
|  |   "directories": { | ||||||
|  |     "example": "../../temps/example_temps" | ||||||
|  |   }, | ||||||
|  |   "dcloudext": { | ||||||
|  |     "category": [ | ||||||
|  |       "前端组件", | ||||||
|  |       "通用组件" | ||||||
|  |     ], | ||||||
|  |     "sale": { | ||||||
|  |       "regular": { | ||||||
|  |         "price": "0.00" | ||||||
|  |       }, | ||||||
|  |       "sourcecode": { | ||||||
|  |         "price": "0.00" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "contact": { | ||||||
|  |       "qq": "" | ||||||
|  |     }, | ||||||
|  |     "declaration": { | ||||||
|  |       "ads": "无", | ||||||
|  |       "data": "无", | ||||||
|  |       "permissions": "无" | ||||||
|  |     }, | ||||||
|  |     "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" | ||||||
|  |   }, | ||||||
|  |   "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" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | ## Icons 图标 | ||||||
|  | > **组件名:uni-icons** | ||||||
|  | > 代码块: `uIcons` | ||||||
|  | 
 | ||||||
|  | 用于展示 icons 图标 。 | ||||||
|  | 
 | ||||||
|  | ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) | ||||||
|  | #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839  | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | ## 1.0.3(2022-01-21) | ||||||
|  | - 优化 组件示例 | ||||||
|  | ## 1.0.2(2021-11-22) | ||||||
|  | - 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 | ||||||
|  | ## 1.0.1(2021-11-22) | ||||||
|  | - 修复 vue3中scss语法兼容问题 | ||||||
|  | ## 1.0.0(2021-11-18) | ||||||
|  | - init | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | @import './styles/index.scss'; | ||||||
|  | @ -0,0 +1,82 @@ | ||||||
|  | { | ||||||
|  |   "id": "uni-scss", | ||||||
|  |   "displayName": "uni-scss 辅助样式", | ||||||
|  |   "version": "1.0.3", | ||||||
|  |   "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", | ||||||
|  |   "keywords": [ | ||||||
|  |     "uni-scss", | ||||||
|  |     "uni-ui", | ||||||
|  |     "辅助样式" | ||||||
|  | ], | ||||||
|  |   "repository": "https://github.com/dcloudio/uni-ui", | ||||||
|  |   "engines": { | ||||||
|  |     "HBuilderX": "^3.1.0" | ||||||
|  |   }, | ||||||
|  |   "dcloudext": { | ||||||
|  |     "category": [ | ||||||
|  |         "JS SDK", | ||||||
|  |         "通用 SDK" | ||||||
|  |     ], | ||||||
|  |     "sale": { | ||||||
|  |       "regular": { | ||||||
|  |         "price": "0.00" | ||||||
|  |       }, | ||||||
|  |       "sourcecode": { | ||||||
|  |         "price": "0.00" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "contact": { | ||||||
|  |       "qq": "" | ||||||
|  |     }, | ||||||
|  |     "declaration": { | ||||||
|  |       "ads": "无", | ||||||
|  |       "data": "无", | ||||||
|  |       "permissions": "无" | ||||||
|  |     }, | ||||||
|  |     "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" | ||||||
|  |   }, | ||||||
|  |   "uni_modules": { | ||||||
|  |     "dependencies": [], | ||||||
|  |     "encrypt": [], | ||||||
|  |     "platforms": { | ||||||
|  |       "cloud": { | ||||||
|  |         "tcb": "y", | ||||||
|  |         "aliyun": "y" | ||||||
|  |       }, | ||||||
|  |       "client": { | ||||||
|  |         "App": { | ||||||
|  |           "app-vue": "y", | ||||||
|  |           "app-nvue": "u" | ||||||
|  |         }, | ||||||
|  |         "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" | ||||||
|  |         }, | ||||||
|  |         "快应用": { | ||||||
|  |           "华为": "n", | ||||||
|  |           "联盟": "n" | ||||||
|  |         }, | ||||||
|  |         "Vue": { | ||||||
|  |             "vue2": "y", | ||||||
|  |             "vue3": "y" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | `uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 | ||||||
|  | 
 | ||||||
|  | ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) | ||||||
|  | #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839  | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | @import './setting/_variables.scss'; | ||||||
|  | @import './setting/_border.scss'; | ||||||
|  | @import './setting/_color.scss'; | ||||||
|  | @import './setting/_space.scss'; | ||||||
|  | @import './setting/_radius.scss'; | ||||||
|  | @import './setting/_text.scss'; | ||||||
|  | @import './setting/_styles.scss'; | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | .uni-border { | ||||||
|  | 	border: 1px $uni-border-1 solid; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,66 @@ | ||||||
|  | 
 | ||||||
|  | // TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 | ||||||
|  | // @mixin get-styles($k,$c) { | ||||||
|  | // 	@if $k == size or $k == weight{ | ||||||
|  | // 		font-#{$k}:#{$c} | ||||||
|  | // 	}@else{ | ||||||
|  | // 		#{$k}:#{$c} | ||||||
|  | // 	} | ||||||
|  | // } | ||||||
|  | $uni-ui-color:( | ||||||
|  | 	// 主色 | ||||||
|  | 	primary: $uni-primary, | ||||||
|  | 	primary-disable: $uni-primary-disable, | ||||||
|  | 	primary-light: $uni-primary-light, | ||||||
|  | 	// 辅助色 | ||||||
|  | 	success: $uni-success, | ||||||
|  | 	success-disable: $uni-success-disable, | ||||||
|  | 	success-light: $uni-success-light, | ||||||
|  | 	warning: $uni-warning, | ||||||
|  | 	warning-disable: $uni-warning-disable, | ||||||
|  | 	warning-light: $uni-warning-light, | ||||||
|  | 	error: $uni-error, | ||||||
|  | 	error-disable: $uni-error-disable, | ||||||
|  | 	error-light: $uni-error-light, | ||||||
|  | 	info: $uni-info, | ||||||
|  | 	info-disable: $uni-info-disable, | ||||||
|  | 	info-light: $uni-info-light, | ||||||
|  | 	// 中性色 | ||||||
|  | 	main-color: $uni-main-color, | ||||||
|  | 	base-color: $uni-base-color, | ||||||
|  | 	secondary-color: $uni-secondary-color, | ||||||
|  | 	extra-color: $uni-extra-color, | ||||||
|  | 	// 背景色 | ||||||
|  | 	bg-color: $uni-bg-color, | ||||||
|  | 	// 边框颜色 | ||||||
|  | 	border-1: $uni-border-1, | ||||||
|  | 	border-2: $uni-border-2, | ||||||
|  | 	border-3: $uni-border-3, | ||||||
|  | 	border-4: $uni-border-4, | ||||||
|  | 	// 黑色 | ||||||
|  | 	black:$uni-black, | ||||||
|  | 	// 白色 | ||||||
|  | 	white:$uni-white, | ||||||
|  | 	// 透明 | ||||||
|  | 	transparent:$uni-transparent | ||||||
|  | ) !default; | ||||||
|  | @each $key, $child in $uni-ui-color { | ||||||
|  | 	.uni-#{"" + $key} { | ||||||
|  | 		color: $child; | ||||||
|  | 	} | ||||||
|  | 	.uni-#{"" + $key}-bg { | ||||||
|  | 		background-color: $child; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | .uni-shadow-sm { | ||||||
|  | 	box-shadow: $uni-shadow-sm; | ||||||
|  | } | ||||||
|  | .uni-shadow-base { | ||||||
|  | 	box-shadow: $uni-shadow-base; | ||||||
|  | } | ||||||
|  | .uni-shadow-lg { | ||||||
|  | 	box-shadow: $uni-shadow-lg; | ||||||
|  | } | ||||||
|  | .uni-mask { | ||||||
|  | 	background-color:$uni-mask; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,55 @@ | ||||||
|  | @mixin radius($r,$d:null ,$important: false){ | ||||||
|  |   $radius-value:map-get($uni-radius, $r) if($important, !important, null); | ||||||
|  |   // Key exists within the $uni-radius variable | ||||||
|  |   @if (map-has-key($uni-radius, $r) and  $d){ | ||||||
|  | 		@if $d == t { | ||||||
|  | 				border-top-left-radius:$radius-value; | ||||||
|  | 				border-top-right-radius:$radius-value; | ||||||
|  | 		}@else if $d == r { | ||||||
|  | 				border-top-right-radius:$radius-value; | ||||||
|  | 				border-bottom-right-radius:$radius-value; | ||||||
|  | 		}@else if $d == b { | ||||||
|  | 				border-bottom-left-radius:$radius-value; | ||||||
|  | 				border-bottom-right-radius:$radius-value; | ||||||
|  | 		}@else if $d == l { | ||||||
|  | 				border-top-left-radius:$radius-value; | ||||||
|  | 				border-bottom-left-radius:$radius-value; | ||||||
|  | 		}@else if $d == tl { | ||||||
|  | 				border-top-left-radius:$radius-value; | ||||||
|  | 		}@else if $d == tr { | ||||||
|  | 				border-top-right-radius:$radius-value; | ||||||
|  | 		}@else if $d == br { | ||||||
|  | 				border-bottom-right-radius:$radius-value; | ||||||
|  | 		}@else if $d == bl { | ||||||
|  | 				border-bottom-left-radius:$radius-value; | ||||||
|  | 		} | ||||||
|  |   }@else{ | ||||||
|  | 		border-radius:$radius-value; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @each $key, $child in $uni-radius { | ||||||
|  | 	@if($key){ | ||||||
|  | 		.uni-radius-#{"" + $key} { | ||||||
|  | 				@include radius($key) | ||||||
|  | 		} | ||||||
|  | 	}@else{ | ||||||
|  | 		.uni-radius { | ||||||
|  | 				@include radius($key) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @each $direction in t, r, b, l,tl, tr, br, bl { | ||||||
|  | 	@each $key, $child in $uni-radius { | ||||||
|  | 		@if($key){ | ||||||
|  | 			.uni-radius-#{"" + $direction}-#{"" + $key} { | ||||||
|  | 				@include radius($key,$direction,false) | ||||||
|  | 			} | ||||||
|  | 		}@else{ | ||||||
|  | 			.uni-radius-#{$direction} { | ||||||
|  | 				@include radius($key,$direction,false) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,56 @@ | ||||||
|  | 
 | ||||||
|  | @mixin fn($space,$direction,$size,$n) { | ||||||
|  | 	@if $n { | ||||||
|  | 		#{$space}-#{$direction}: #{$size*$uni-space-root}px | ||||||
|  | 	} @else { | ||||||
|  | 		 #{$space}-#{$direction}: #{-$size*$uni-space-root}px | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @mixin get-styles($direction,$i,$space,$n){ | ||||||
|  | 	@if $direction == t { | ||||||
|  | 		@include fn($space, top,$i,$n); | ||||||
|  | 	}  | ||||||
|  | 	@if $direction == r { | ||||||
|  | 		@include fn($space, right,$i,$n); | ||||||
|  | 	}  | ||||||
|  | 	@if $direction == b { | ||||||
|  | 		@include fn($space, bottom,$i,$n); | ||||||
|  | 	}  | ||||||
|  | 	@if $direction == l { | ||||||
|  | 	 @include fn($space, left,$i,$n); | ||||||
|  | 	}  | ||||||
|  | 	@if $direction == x { | ||||||
|  | 		@include fn($space, left,$i,$n); | ||||||
|  | 		@include fn($space, right,$i,$n); | ||||||
|  | 	}  | ||||||
|  | 	@if $direction == y { | ||||||
|  | 		@include fn($space, top,$i,$n); | ||||||
|  | 		@include fn($space, bottom,$i,$n); | ||||||
|  | 	}  | ||||||
|  | 	@if $direction == a { | ||||||
|  | 		@if $n { | ||||||
|  | 			#{$space}:#{$i*$uni-space-root}px; | ||||||
|  | 		} @else { | ||||||
|  | 			#{$space}:#{-$i*$uni-space-root}px; | ||||||
|  | 		} | ||||||
|  | 	}  | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @each $orientation in m,p { | ||||||
|  | 	$space: margin; | ||||||
|  | 	@if $orientation == m { | ||||||
|  | 		$space: margin; | ||||||
|  | 	} @else { | ||||||
|  | 		$space: padding; | ||||||
|  | 	} | ||||||
|  | 	@for $i from 0 through 16 { | ||||||
|  | 		@each $direction in t, r, b, l, x, y, a { | ||||||
|  | 			.uni-#{$orientation}#{$direction}-#{$i} {  | ||||||
|  | 				@include  get-styles($direction,$i,$space,true); | ||||||
|  | 			}  | ||||||
|  | 			.uni-#{$orientation}#{$direction}-n#{$i} {  | ||||||
|  | 				@include  get-styles($direction,$i,$space,false); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,167 @@ | ||||||
|  | /* #ifndef APP-NVUE */ | ||||||
|  | 
 | ||||||
|  | $-color-white:#fff; | ||||||
|  | $-color-black:#000; | ||||||
|  | @mixin base-style($color) { | ||||||
|  | 	color: #fff; | ||||||
|  | 	background-color: $color; | ||||||
|  | 	border-color: mix($-color-black, $color, 8%); | ||||||
|  | 	&:not([hover-class]):active { | ||||||
|  | 		background: mix($-color-black, $color, 10%); | ||||||
|  | 		border-color: mix($-color-black, $color, 20%); | ||||||
|  | 		color: $-color-white; | ||||||
|  | 		outline: none; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @mixin is-color($color) { | ||||||
|  | 	@include base-style($color); | ||||||
|  | 	&[loading] { | ||||||
|  | 		@include base-style($color); | ||||||
|  | 		&::before { | ||||||
|  | 			margin-right:5px; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	&[disabled] { | ||||||
|  | 	  &, | ||||||
|  | 		&[loading], | ||||||
|  | 	  &:not([hover-class]):active { | ||||||
|  | 	    color: $-color-white; | ||||||
|  | 			border-color: mix(darken($color,10%), $-color-white); | ||||||
|  | 	    background-color: mix($color, $-color-white); | ||||||
|  | 	  } | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @mixin base-plain-style($color) { | ||||||
|  | 	color:$color; | ||||||
|  | 	background-color: mix($-color-white, $color, 90%); | ||||||
|  | 	border-color: mix($-color-white, $color, 70%); | ||||||
|  | 	&:not([hover-class]):active { | ||||||
|  | 	  background: mix($-color-white, $color, 80%); | ||||||
|  | 	  color: $color; | ||||||
|  | 	  outline: none; | ||||||
|  | 		border-color: mix($-color-white, $color, 50%); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @mixin is-plain($color){ | ||||||
|  | 	&[plain] { | ||||||
|  | 		@include base-plain-style($color); | ||||||
|  | 		&[loading] { | ||||||
|  | 			@include base-plain-style($color); | ||||||
|  | 			&::before { | ||||||
|  | 				margin-right:5px; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		&[disabled] { | ||||||
|  | 		  &, | ||||||
|  | 		  &:active { | ||||||
|  | 		    color: mix($-color-white, $color, 40%); | ||||||
|  | 		    background-color: mix($-color-white, $color, 90%); | ||||||
|  | 				border-color: mix($-color-white, $color, 80%); | ||||||
|  | 		  } | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .uni-btn { | ||||||
|  | 	margin: 5px; | ||||||
|  | 	color: #393939; | ||||||
|  | 	border:1px solid #ccc; | ||||||
|  | 	font-size: 16px; | ||||||
|  | 	font-weight: 200; | ||||||
|  | 	background-color: #F9F9F9; | ||||||
|  | 	// TODO 暂时处理边框隐藏一边的问题 | ||||||
|  | 	overflow: visible; | ||||||
|  | 	&::after{ | ||||||
|  | 		border: none; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&:not([type]),&[type=default] { | ||||||
|  | 		color: #999; | ||||||
|  | 		&[loading] { | ||||||
|  | 			background: none; | ||||||
|  | 			&::before { | ||||||
|  | 				margin-right:5px; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		&[disabled]{ | ||||||
|  | 			color: mix($-color-white, #999, 60%); | ||||||
|  | 		  &, | ||||||
|  | 			&[loading], | ||||||
|  | 		  &:active { | ||||||
|  | 				color: mix($-color-white, #999, 60%); | ||||||
|  | 		    background-color: mix($-color-white,$-color-black , 98%); | ||||||
|  | 				border-color: mix($-color-white,  #999, 85%); | ||||||
|  | 		  } | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		&[plain] { | ||||||
|  | 			color: #999; | ||||||
|  | 			background: none; | ||||||
|  | 			border-color: $uni-border-1; | ||||||
|  | 			&:not([hover-class]):active { | ||||||
|  | 				background: none; | ||||||
|  | 			  color: mix($-color-white, $-color-black, 80%); | ||||||
|  | 				border-color: mix($-color-white, $-color-black, 90%); | ||||||
|  | 			  outline: none; | ||||||
|  | 			} | ||||||
|  | 			&[disabled]{ | ||||||
|  | 			  &, | ||||||
|  | 				&[loading], | ||||||
|  | 			  &:active { | ||||||
|  | 			    background: none; | ||||||
|  | 					color: mix($-color-white, #999, 60%); | ||||||
|  | 					border-color: mix($-color-white,  #999, 85%); | ||||||
|  | 			  } | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&:not([hover-class]):active { | ||||||
|  | 	  color: mix($-color-white, $-color-black, 50%); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&[size=mini] { | ||||||
|  | 		font-size: 16px; | ||||||
|  | 		font-weight: 200; | ||||||
|  | 		border-radius: 8px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	&.uni-btn-small { | ||||||
|  | 		font-size: 14px; | ||||||
|  | 	} | ||||||
|  | 	&.uni-btn-mini { | ||||||
|  | 		font-size: 12px; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&.uni-btn-radius { | ||||||
|  | 		border-radius: 999px; | ||||||
|  | 	} | ||||||
|  | 	&[type=primary] { | ||||||
|  | 		@include is-color($uni-primary); | ||||||
|  | 		@include is-plain($uni-primary) | ||||||
|  | 	} | ||||||
|  | 	&[type=success] { | ||||||
|  | 		@include is-color($uni-success); | ||||||
|  | 		@include is-plain($uni-success) | ||||||
|  | 	} | ||||||
|  | 	&[type=error] { | ||||||
|  | 		@include is-color($uni-error); | ||||||
|  | 		@include is-plain($uni-error) | ||||||
|  | 	} | ||||||
|  | 	&[type=warning] { | ||||||
|  | 		@include is-color($uni-warning); | ||||||
|  | 		@include is-plain($uni-warning) | ||||||
|  | 	} | ||||||
|  | 	&[type=info] { | ||||||
|  | 		@include is-color($uni-info); | ||||||
|  | 		@include is-plain($uni-info) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | /* #endif */ | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | @mixin get-styles($k,$c) { | ||||||
|  | 	@if $k == size or $k == weight{ | ||||||
|  | 		font-#{$k}:#{$c} | ||||||
|  | 	}@else{ | ||||||
|  | 		#{$k}:#{$c} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @each $key, $child in $uni-headings { | ||||||
|  | 	/* #ifndef APP-NVUE */ | ||||||
|  | 	.uni-#{$key} { | ||||||
|  | 		@each $k, $c in $child { | ||||||
|  | 			@include get-styles($k,$c) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	/* #endif */ | ||||||
|  | 	/* #ifdef APP-NVUE */ | ||||||
|  | 	.container .uni-#{$key} { | ||||||
|  | 		@each $k, $c in $child { | ||||||
|  | 			@include get-styles($k,$c) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	/* #endif */ | ||||||
|  | } | ||||||
|  | @ -0,0 +1,146 @@ | ||||||
|  | // @use "sass:math"; | ||||||
|  | @import  '../tools/functions.scss'; | ||||||
|  | // 间距基础倍数 | ||||||
|  | $uni-space-root: 2 !default; | ||||||
|  | // 边框半径默认值 | ||||||
|  | $uni-radius-root:5px !default; | ||||||
|  | $uni-radius: () !default; | ||||||
|  | // 边框半径断点 | ||||||
|  | $uni-radius: map-deep-merge( | ||||||
|  |   ( | ||||||
|  |     0: 0, | ||||||
|  | 		// TODO 当前版本暂时不支持 sm 属性 | ||||||
|  |     // 'sm': math.div($uni-radius-root, 2), | ||||||
|  |     null: $uni-radius-root, | ||||||
|  |     'lg': $uni-radius-root * 2, | ||||||
|  |     'xl': $uni-radius-root * 6, | ||||||
|  |     'pill': 9999px, | ||||||
|  |     'circle': 50% | ||||||
|  |   ), | ||||||
|  |   $uni-radius | ||||||
|  | ); | ||||||
|  | // 字体家族 | ||||||
|  | $body-font-family: 'Roboto', sans-serif !default; | ||||||
|  | // 文本 | ||||||
|  | $heading-font-family: $body-font-family !default; | ||||||
|  | $uni-headings: () !default; | ||||||
|  | $letterSpacing: -0.01562em; | ||||||
|  | $uni-headings: map-deep-merge( | ||||||
|  |   ( | ||||||
|  |     'h1': ( | ||||||
|  |       size: 32px, | ||||||
|  | 			weight: 300, | ||||||
|  | 			line-height: 50px, | ||||||
|  | 			// letter-spacing:-0.01562em | ||||||
|  |     ), | ||||||
|  |     'h2': ( | ||||||
|  |       size: 28px, | ||||||
|  |       weight: 300, | ||||||
|  |       line-height: 40px, | ||||||
|  |       // letter-spacing: -0.00833em | ||||||
|  |     ), | ||||||
|  |     'h3': ( | ||||||
|  |       size: 24px, | ||||||
|  |       weight: 400, | ||||||
|  |       line-height: 32px, | ||||||
|  |       // letter-spacing: normal | ||||||
|  |     ), | ||||||
|  |     'h4': ( | ||||||
|  |       size: 20px, | ||||||
|  |       weight: 400, | ||||||
|  |       line-height: 30px, | ||||||
|  |       // letter-spacing: 0.00735em | ||||||
|  |     ), | ||||||
|  |     'h5': ( | ||||||
|  |       size: 16px, | ||||||
|  |       weight: 400, | ||||||
|  |       line-height: 24px, | ||||||
|  |       // letter-spacing: normal | ||||||
|  |     ), | ||||||
|  |     'h6': ( | ||||||
|  |       size: 14px, | ||||||
|  |       weight: 500, | ||||||
|  |       line-height: 18px, | ||||||
|  |       // letter-spacing: 0.0125em | ||||||
|  |     ), | ||||||
|  |     'subtitle': ( | ||||||
|  |       size: 12px, | ||||||
|  |       weight: 400, | ||||||
|  |       line-height: 20px, | ||||||
|  |       // letter-spacing: 0.00937em | ||||||
|  |     ), | ||||||
|  |     'body': ( | ||||||
|  |       font-size: 14px, | ||||||
|  | 			font-weight: 400, | ||||||
|  | 			line-height: 22px, | ||||||
|  | 			// letter-spacing: 0.03125em | ||||||
|  |     ), | ||||||
|  |     'caption': ( | ||||||
|  |       'size': 12px, | ||||||
|  |       'weight': 400, | ||||||
|  |       'line-height': 20px, | ||||||
|  |       // 'letter-spacing': 0.03333em, | ||||||
|  |       // 'text-transform': false | ||||||
|  |     ) | ||||||
|  |   ), | ||||||
|  |   $uni-headings | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 主色 | ||||||
|  | $uni-primary: #2979ff !default; | ||||||
|  | $uni-primary-disable:lighten($uni-primary,20%) !default; | ||||||
|  | $uni-primary-light: lighten($uni-primary,25%) !default; | ||||||
|  | 
 | ||||||
|  | // 辅助色 | ||||||
|  | // 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 | ||||||
|  | $uni-success: #18bc37 !default; | ||||||
|  | $uni-success-disable:lighten($uni-success,20%) !default; | ||||||
|  | $uni-success-light: lighten($uni-success,25%) !default; | ||||||
|  | 
 | ||||||
|  | $uni-warning: #f3a73f !default; | ||||||
|  | $uni-warning-disable:lighten($uni-warning,20%) !default; | ||||||
|  | $uni-warning-light: lighten($uni-warning,25%) !default; | ||||||
|  | 
 | ||||||
|  | $uni-error: #e43d33 !default; | ||||||
|  | $uni-error-disable:lighten($uni-error,20%) !default; | ||||||
|  | $uni-error-light: lighten($uni-error,25%) !default; | ||||||
|  | 
 | ||||||
|  | $uni-info: #8f939c !default; | ||||||
|  | $uni-info-disable:lighten($uni-info,20%) !default; | ||||||
|  | $uni-info-light: lighten($uni-info,25%) !default; | ||||||
|  | 
 | ||||||
|  | // 中性色 | ||||||
|  | // 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 | ||||||
|  | $uni-main-color: #3a3a3a !default; 			// 主要文字 | ||||||
|  | $uni-base-color: #6a6a6a !default;			// 常规文字 | ||||||
|  | $uni-secondary-color: #909399 !default;	// 次要文字 | ||||||
|  | $uni-extra-color: #c7c7c7 !default;			// 辅助说明 | ||||||
|  | 
 | ||||||
|  | // 边框颜色 | ||||||
|  | $uni-border-1: #F0F0F0 !default; | ||||||
|  | $uni-border-2: #EDEDED !default; | ||||||
|  | $uni-border-3: #DCDCDC !default; | ||||||
|  | $uni-border-4: #B9B9B9 !default; | ||||||
|  | 
 | ||||||
|  | // 常规色 | ||||||
|  | $uni-black: #000000 !default; | ||||||
|  | $uni-white: #ffffff !default; | ||||||
|  | $uni-transparent: rgba($color: #000000, $alpha: 0) !default; | ||||||
|  | 
 | ||||||
|  | // 背景色 | ||||||
|  | $uni-bg-color: #f7f7f7 !default; | ||||||
|  | 
 | ||||||
|  | /* 水平间距 */ | ||||||
|  | $uni-spacing-sm: 8px !default; | ||||||
|  | $uni-spacing-base: 15px !default; | ||||||
|  | $uni-spacing-lg: 30px !default; | ||||||
|  | 
 | ||||||
|  | // 阴影 | ||||||
|  | $uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; | ||||||
|  | $uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; | ||||||
|  | $uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; | ||||||
|  | 
 | ||||||
|  | // 蒙版 | ||||||
|  | $uni-mask: rgba($color: #000000, $alpha: 0.4) !default; | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | // 合并 map | ||||||
|  | @function map-deep-merge($parent-map, $child-map){ | ||||||
|  | 	$result: $parent-map; | ||||||
|  | 	@each $key, $child in $child-map { | ||||||
|  | 		$parent-has-key: map-has-key($result, $key); | ||||||
|  | 		$parent-value: map-get($result, $key); | ||||||
|  | 		$parent-type: type-of($parent-value); | ||||||
|  | 		$child-type: type-of($child); | ||||||
|  | 		$parent-is-map: $parent-type == map; | ||||||
|  | 		$child-is-map: $child-type == map; | ||||||
|  | 			 | ||||||
|  | 		@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ | ||||||
|  | 			$result: map-merge($result, ( $key: $child )); | ||||||
|  | 		}@else { | ||||||
|  | 			$result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	@return $result; | ||||||
|  | }; | ||||||
|  | @ -0,0 +1,31 @@ | ||||||
|  | // 间距基础倍数 | ||||||
|  | $uni-space-root: 2; | ||||||
|  | // 边框半径默认值 | ||||||
|  | $uni-radius-root:5px; | ||||||
|  | // 主色 | ||||||
|  | $uni-primary: #2979ff; | ||||||
|  | // 辅助色 | ||||||
|  | $uni-success: #4cd964; | ||||||
|  | // 警告色 | ||||||
|  | $uni-warning: #f0ad4e; | ||||||
|  | // 错误色 | ||||||
|  | $uni-error: #dd524d; | ||||||
|  | // 描述色 | ||||||
|  | $uni-info: #909399; | ||||||
|  | // 中性色 | ||||||
|  | $uni-main-color: #303133; | ||||||
|  | $uni-base-color: #606266; | ||||||
|  | $uni-secondary-color: #909399; | ||||||
|  | $uni-extra-color: #C0C4CC; | ||||||
|  | // 背景色 | ||||||
|  | $uni-bg-color: #f5f5f5; | ||||||
|  | // 边框颜色 | ||||||
|  | $uni-border-1: #DCDFE6; | ||||||
|  | $uni-border-2: #E4E7ED; | ||||||
|  | $uni-border-3: #EBEEF5; | ||||||
|  | $uni-border-4: #F2F6FC; | ||||||
|  | 
 | ||||||
|  | // 常规色 | ||||||
|  | $uni-black: #000000; | ||||||
|  | $uni-white: #ffffff; | ||||||
|  | $uni-transparent: rgba($color: #000000, $alpha: 0); | ||||||
|  | @ -0,0 +1,62 @@ | ||||||
|  | @import './styles/setting/_variables.scss'; | ||||||
|  | // 间距基础倍数 | ||||||
|  | $uni-space-root: 2; | ||||||
|  | // 边框半径默认值 | ||||||
|  | $uni-radius-root:5px; | ||||||
|  | 
 | ||||||
|  | // 主色 | ||||||
|  | $uni-primary: #2979ff; | ||||||
|  | $uni-primary-disable:mix(#fff,$uni-primary,50%); | ||||||
|  | $uni-primary-light: mix(#fff,$uni-primary,80%); | ||||||
|  | 
 | ||||||
|  | // 辅助色 | ||||||
|  | // 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 | ||||||
|  | $uni-success: #18bc37; | ||||||
|  | $uni-success-disable:mix(#fff,$uni-success,50%); | ||||||
|  | $uni-success-light: mix(#fff,$uni-success,80%); | ||||||
|  | 
 | ||||||
|  | $uni-warning: #f3a73f; | ||||||
|  | $uni-warning-disable:mix(#fff,$uni-warning,50%); | ||||||
|  | $uni-warning-light: mix(#fff,$uni-warning,80%); | ||||||
|  | 
 | ||||||
|  | $uni-error: #e43d33; | ||||||
|  | $uni-error-disable:mix(#fff,$uni-error,50%); | ||||||
|  | $uni-error-light: mix(#fff,$uni-error,80%); | ||||||
|  | 
 | ||||||
|  | $uni-info: #8f939c; | ||||||
|  | $uni-info-disable:mix(#fff,$uni-info,50%); | ||||||
|  | $uni-info-light: mix(#fff,$uni-info,80%); | ||||||
|  | 
 | ||||||
|  | // 中性色 | ||||||
|  | // 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 | ||||||
|  | $uni-main-color: #3a3a3a; 			// 主要文字 | ||||||
|  | $uni-base-color: #6a6a6a;			// 常规文字 | ||||||
|  | $uni-secondary-color: #909399;	// 次要文字 | ||||||
|  | $uni-extra-color: #c7c7c7;			// 辅助说明 | ||||||
|  | 
 | ||||||
|  | // 边框颜色 | ||||||
|  | $uni-border-1: #F0F0F0; | ||||||
|  | $uni-border-2: #EDEDED; | ||||||
|  | $uni-border-3: #DCDCDC; | ||||||
|  | $uni-border-4: #B9B9B9; | ||||||
|  | 
 | ||||||
|  | // 常规色 | ||||||
|  | $uni-black: #000000; | ||||||
|  | $uni-white: #ffffff; | ||||||
|  | $uni-transparent: rgba($color: #000000, $alpha: 0); | ||||||
|  | 
 | ||||||
|  | // 背景色 | ||||||
|  | $uni-bg-color: #f7f7f7; | ||||||
|  | 
 | ||||||
|  | /* 水平间距 */ | ||||||
|  | $uni-spacing-sm: 8px; | ||||||
|  | $uni-spacing-base: 15px; | ||||||
|  | $uni-spacing-lg: 30px; | ||||||
|  | 
 | ||||||
|  | // 阴影 | ||||||
|  | $uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); | ||||||
|  | $uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); | ||||||
|  | $uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); | ||||||
|  | 
 | ||||||
|  | // 蒙版 | ||||||
|  | $uni-mask: rgba($color: #000000, $alpha: 0.4); | ||||||