| 
									
										
										
										
											2022-04-06 16:08:26 +08:00
										 |  |  |  | <template> | 
					
						
							|  |  |  |  | 	<u-overlay | 
					
						
							|  |  |  |  | 	    :show="!isConnected" | 
					
						
							| 
									
										
										
										
											2022-11-19 20:38:24 +08:00
										 |  |  |  | 		:zIndex="zIndex" | 
					
						
							| 
									
										
										
										
											2022-04-06 16:08:26 +08:00
										 |  |  |  | 	    @touchmove.stop.prevent="noop" | 
					
						
							|  |  |  |  | 		:customStyle="{ | 
					
						
							|  |  |  |  | 			backgroundColor: '#fff', | 
					
						
							|  |  |  |  | 			display: 'flex', | 
					
						
							|  |  |  |  | 			justifyContent: 'center', | 
					
						
							|  |  |  |  | 		}" | 
					
						
							|  |  |  |  | 	> | 
					
						
							|  |  |  |  | 		<view | 
					
						
							|  |  |  |  | 		    class="u-no-network" | 
					
						
							|  |  |  |  | 		> | 
					
						
							|  |  |  |  | 			<u-icon | 
					
						
							|  |  |  |  | 			    :name="image" | 
					
						
							|  |  |  |  | 			    size="150" | 
					
						
							|  |  |  |  | 			    imgMode="widthFit" | 
					
						
							|  |  |  |  | 			    class="u-no-network__error-icon" | 
					
						
							|  |  |  |  | 			></u-icon> | 
					
						
							|  |  |  |  | 			<text class="u-no-network__tips">{{tips}}</text> | 
					
						
							|  |  |  |  | 			<!-- 只有APP平台,才能跳转设置页,因为需要调用plus环境 --> | 
					
						
							|  |  |  |  | 			<!-- #ifdef APP-PLUS --> | 
					
						
							|  |  |  |  | 			<view class="u-no-network__app"> | 
					
						
							|  |  |  |  | 				<text class="u-no-network__app__setting">请检查网络,或前往</text> | 
					
						
							|  |  |  |  | 				<text | 
					
						
							|  |  |  |  | 				    class="u-no-network__app__to-setting" | 
					
						
							|  |  |  |  | 				    @tap="openSettings" | 
					
						
							|  |  |  |  | 				>设置</text> | 
					
						
							|  |  |  |  | 			</view> | 
					
						
							|  |  |  |  | 			<!-- #endif --> | 
					
						
							|  |  |  |  | 			<view class="u-no-network__retry"> | 
					
						
							|  |  |  |  | 				<u-button | 
					
						
							|  |  |  |  | 				    size="mini" | 
					
						
							|  |  |  |  | 				    text="重试" | 
					
						
							|  |  |  |  | 				    type="primary" | 
					
						
							|  |  |  |  | 					plain | 
					
						
							|  |  |  |  | 				    @click="retry" | 
					
						
							|  |  |  |  | 				></u-button> | 
					
						
							|  |  |  |  | 			</view> | 
					
						
							|  |  |  |  | 		</view> | 
					
						
							|  |  |  |  | 	</u-overlay> | 
					
						
							|  |  |  |  | </template> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <script> | 
					
						
							|  |  |  |  | 	import props from './props.js'; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	/** | 
					
						
							|  |  |  |  | 	 * noNetwork 无网络提示 | 
					
						
							|  |  |  |  | 	 * @description 该组件无需任何配置,引入即可,内部自动处理所有功能和事件。 | 
					
						
							|  |  |  |  | 	 * @tutorial https://www.uviewui.com/components/noNetwork.html
 | 
					
						
							|  |  |  |  | 	 * @property {String}			tips 	没有网络时的提示语 (默认:'哎呀,网络信号丢失' ) | 
					
						
							|  |  |  |  | 	 * @property {String | Number}	zIndex	组件的z-index值  | 
					
						
							|  |  |  |  | 	 * @property {String}			image	无网络的图片提示,可用的src地址或base64图片  | 
					
						
							|  |  |  |  | 	 * @event {Function}			retry	用户点击页面的"重试"按钮时触发 | 
					
						
							|  |  |  |  | 	 * @example <u-no-network></u-no-network> | 
					
						
							|  |  |  |  | 	 */ | 
					
						
							|  |  |  |  | 	export default { | 
					
						
							|  |  |  |  | 		name: "u-no-network", | 
					
						
							|  |  |  |  | 		mixins: [uni.$u.mpMixin, uni.$u.mixin,props], | 
					
						
							|  |  |  |  | 		data() { | 
					
						
							|  |  |  |  | 			return { | 
					
						
							|  |  |  |  | 				isConnected: true, // 是否有网络连接
 | 
					
						
							|  |  |  |  | 				networkType: "none", // 网络类型
 | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		}, | 
					
						
							|  |  |  |  | 		mounted() { | 
					
						
							|  |  |  |  | 			this.isIOS = (uni.getSystemInfoSync().platform === 'ios') | 
					
						
							|  |  |  |  | 			uni.onNetworkStatusChange((res) => { | 
					
						
							|  |  |  |  | 				this.isConnected = res.isConnected | 
					
						
							|  |  |  |  | 				this.networkType = res.networkType | 
					
						
							|  |  |  |  | 				this.emitEvent(this.networkType) | 
					
						
							|  |  |  |  | 			}) | 
					
						
							|  |  |  |  | 			uni.getNetworkType({ | 
					
						
							|  |  |  |  | 				success: (res) => { | 
					
						
							|  |  |  |  | 					this.networkType = res.networkType | 
					
						
							|  |  |  |  | 					this.emitEvent(this.networkType) | 
					
						
							|  |  |  |  | 					if (res.networkType == 'none') { | 
					
						
							|  |  |  |  | 						this.isConnected = false | 
					
						
							|  |  |  |  | 					} else { | 
					
						
							|  |  |  |  | 						this.isConnected = true | 
					
						
							|  |  |  |  | 					} | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 			}) | 
					
						
							|  |  |  |  | 		}, | 
					
						
							|  |  |  |  | 		methods: { | 
					
						
							|  |  |  |  | 			retry() { | 
					
						
							|  |  |  |  | 				// 重新检查网络
 | 
					
						
							|  |  |  |  | 				uni.getNetworkType({ | 
					
						
							|  |  |  |  | 					success: (res) => { | 
					
						
							|  |  |  |  | 						this.networkType = res.networkType | 
					
						
							|  |  |  |  | 						this.emitEvent(this.networkType) | 
					
						
							|  |  |  |  | 						if (res.networkType == 'none') { | 
					
						
							|  |  |  |  | 							uni.$u.toast('无网络连接') | 
					
						
							|  |  |  |  | 							this.isConnected = false | 
					
						
							|  |  |  |  | 						} else { | 
					
						
							|  |  |  |  | 							uni.$u.toast('网络已连接') | 
					
						
							|  |  |  |  | 							this.isConnected = true | 
					
						
							|  |  |  |  | 						} | 
					
						
							|  |  |  |  | 					} | 
					
						
							|  |  |  |  | 				}) | 
					
						
							|  |  |  |  | 				this.$emit('retry') | 
					
						
							|  |  |  |  | 			}, | 
					
						
							|  |  |  |  | 			// 发出事件给父组件
 | 
					
						
							|  |  |  |  | 			emitEvent(networkType) { | 
					
						
							|  |  |  |  | 				this.$emit(networkType === 'none' ? 'disconnected' : 'connected') | 
					
						
							|  |  |  |  | 			}, | 
					
						
							|  |  |  |  | 			async openSettings() { | 
					
						
							|  |  |  |  | 				if (this.networkType == "none") { | 
					
						
							|  |  |  |  | 					this.openSystemSettings() | 
					
						
							|  |  |  |  | 					return | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 			}, | 
					
						
							|  |  |  |  | 			openAppSettings() { | 
					
						
							|  |  |  |  | 				this.gotoAppSetting() | 
					
						
							|  |  |  |  | 			}, | 
					
						
							|  |  |  |  | 			openSystemSettings() { | 
					
						
							|  |  |  |  | 				// 以下方法来自5+范畴,如需深究,请自行查阅相关文档
 | 
					
						
							|  |  |  |  | 				// https://ask.dcloud.net.cn/docs/
 | 
					
						
							|  |  |  |  | 				if (this.isIOS) { | 
					
						
							|  |  |  |  | 					this.gotoiOSSetting() | 
					
						
							|  |  |  |  | 				} else { | 
					
						
							|  |  |  |  | 					this.gotoAndroidSetting() | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 			}, | 
					
						
							|  |  |  |  | 			network() { | 
					
						
							|  |  |  |  | 				var result = null | 
					
						
							|  |  |  |  | 				var cellularData = plus.ios.newObject("CTCellularData") | 
					
						
							|  |  |  |  | 				var state = cellularData.plusGetAttribute("restrictedState") | 
					
						
							|  |  |  |  | 				if (state == 0) { | 
					
						
							|  |  |  |  | 					result = null | 
					
						
							|  |  |  |  | 				} else if (state == 2) { | 
					
						
							|  |  |  |  | 					result = 1 | 
					
						
							|  |  |  |  | 				} else if (state == 1) { | 
					
						
							|  |  |  |  | 					result = 2 | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 				plus.ios.deleteObject(cellularData) | 
					
						
							|  |  |  |  | 				return result | 
					
						
							|  |  |  |  | 			}, | 
					
						
							|  |  |  |  | 			gotoAppSetting() { | 
					
						
							|  |  |  |  | 				if (this.isIOS) { | 
					
						
							|  |  |  |  | 					var UIApplication = plus.ios.import("UIApplication") | 
					
						
							|  |  |  |  | 					var application2 = UIApplication.sharedApplication() | 
					
						
							|  |  |  |  | 					var NSURL2 = plus.ios.import("NSURL") | 
					
						
							|  |  |  |  | 					var setting2 = NSURL2.URLWithString("app-settings:") | 
					
						
							|  |  |  |  | 					application2.openURL(setting2) | 
					
						
							|  |  |  |  | 					plus.ios.deleteObject(setting2) | 
					
						
							|  |  |  |  | 					plus.ios.deleteObject(NSURL2) | 
					
						
							|  |  |  |  | 					plus.ios.deleteObject(application2) | 
					
						
							|  |  |  |  | 				} else { | 
					
						
							|  |  |  |  | 					var Intent = plus.android.importClass("android.content.Intent") | 
					
						
							|  |  |  |  | 					var Settings = plus.android.importClass("android.provider.Settings") | 
					
						
							|  |  |  |  | 					var Uri = plus.android.importClass("android.net.Uri") | 
					
						
							|  |  |  |  | 					var mainActivity = plus.android.runtimeMainActivity() | 
					
						
							|  |  |  |  | 					var intent = new Intent() | 
					
						
							|  |  |  |  | 					intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) | 
					
						
							|  |  |  |  | 					var uri = Uri.fromParts("package", mainActivity.getPackageName(), null) | 
					
						
							|  |  |  |  | 					intent.setData(uri) | 
					
						
							|  |  |  |  | 					mainActivity.startActivity(intent) | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 			}, | 
					
						
							|  |  |  |  | 			gotoiOSSetting() { | 
					
						
							|  |  |  |  | 				var UIApplication = plus.ios.import("UIApplication") | 
					
						
							|  |  |  |  | 				var application2 = UIApplication.sharedApplication() | 
					
						
							|  |  |  |  | 				var NSURL2 = plus.ios.import("NSURL") | 
					
						
							|  |  |  |  | 				var setting2 = NSURL2.URLWithString("App-prefs:root=General") | 
					
						
							|  |  |  |  | 				application2.openURL(setting2) | 
					
						
							|  |  |  |  | 				plus.ios.deleteObject(setting2) | 
					
						
							|  |  |  |  | 				plus.ios.deleteObject(NSURL2) | 
					
						
							|  |  |  |  | 				plus.ios.deleteObject(application2) | 
					
						
							|  |  |  |  | 			}, | 
					
						
							|  |  |  |  | 			gotoAndroidSetting() { | 
					
						
							|  |  |  |  | 				var Intent = plus.android.importClass("android.content.Intent") | 
					
						
							|  |  |  |  | 				var Settings = plus.android.importClass("android.provider.Settings") | 
					
						
							|  |  |  |  | 				var mainActivity = plus.android.runtimeMainActivity() | 
					
						
							|  |  |  |  | 				var intent = new Intent(Settings.ACTION_SETTINGS) | 
					
						
							|  |  |  |  | 				mainActivity.startActivity(intent) | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | </script> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <style lang="scss" scoped> | 
					
						
							|  |  |  |  | 	@import "../../libs/css/components.scss"; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	.u-no-network { | 
					
						
							|  |  |  |  | 		@include flex(column); | 
					
						
							|  |  |  |  | 		justify-content: center; | 
					
						
							|  |  |  |  | 		align-items: center; | 
					
						
							|  |  |  |  | 		margin-top: -100px; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		&__tips { | 
					
						
							|  |  |  |  | 			color: $u-tips-color; | 
					
						
							|  |  |  |  | 			font-size: 14px; | 
					
						
							|  |  |  |  | 			margin-top: 15px; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		&__app { | 
					
						
							|  |  |  |  | 			@include flex(row); | 
					
						
							|  |  |  |  | 			margin-top: 6px; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			&__setting { | 
					
						
							|  |  |  |  | 				color: $u-light-color; | 
					
						
							|  |  |  |  | 				font-size: 13px; | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			&__to-setting { | 
					
						
							|  |  |  |  | 				font-size: 13px; | 
					
						
							|  |  |  |  | 				color: $u-primary; | 
					
						
							|  |  |  |  | 				margin-left: 3px; | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		&__retry { | 
					
						
							|  |  |  |  | 			@include flex(row); | 
					
						
							|  |  |  |  | 			justify-content: center; | 
					
						
							|  |  |  |  | 			margin-top: 15px; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | </style> |