From 51f9d68a26870672d6e516d740651665f9e7f386 Mon Sep 17 00:00:00 2001
From: yfx <1249361928@.com>
Date: Fri, 13 Mar 2026 13:32:25 +0800
Subject: [PATCH] Ui

---
 components/u-pdf/u-pdf.vue           |  168 ++++++++++
 js_sdk/wa-permission/permission.js   |  272 +++++++++++++++++
 components/yk-authpup/yk-authpup.vue |  331 ++++++++++++++++++++
 components/agreePup/agreePup.vue     |  180 +++++++++++
 4 files changed, 951 insertions(+), 0 deletions(-)

diff --git a/components/agreePup/agreePup.vue b/components/agreePup/agreePup.vue
new file mode 100644
index 0000000..5338a30
--- /dev/null
+++ b/components/agreePup/agreePup.vue
@@ -0,0 +1,180 @@
+<template>
+	<view>
+		<view class="agreePup" v-if="dialog">
+			<view class="msk"></view>
+			<view class="agreeMain">
+				<view class="pop-title" v-if="gp == 6" style="height: 15px !important;line-height: 15px !important">{{title}}</view>
+				<view class="pop-title" v-else>{{title}}</view>
+				<view class="popup-content">
+					<view class="content" v-html="content"></view>
+					<view class="popBtn" @tap="popClose">确定</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'agree-pup',
+		props: {
+			gp: {
+				type: Number,
+				default: 0,
+			},
+			title: {
+				type: String,
+				default: '',
+			},
+			addrId : {
+				type: Number,
+				default: 0,
+			},
+			cartsIds: {
+				type: String,
+				default: '',
+			},
+			userid: {
+				type: Number,
+				default: 0,
+			},
+			yz: {
+				type: Number,
+				default: 0,
+			}
+		},
+		data() {
+			return {
+				userInfo: null,
+				dialog: false,
+				content: '',
+			}
+		},
+		watch: {
+			dialog () {
+				if(this.dialog) {
+					//this.$refs.popup.open()
+				}
+			}
+		},
+		created() {
+			this.userInfo = this.$util.getUserInfo()
+			this.getContent()
+		},
+		methods: {
+			popClose () {
+				this.dialog = false
+			},
+			getContent () {
+				let t = this
+				let param = {gp: this.gp}
+				if(t.gp == 6) {
+					param = {
+						sn: '',
+						gp: this.gp, 
+						userid: this.userInfo.id,
+						cartsIds: this.cartsIds,
+						addrId: this.addrId, 
+						yz: this.yz, 
+					}
+				}
+				t.$util.post('Index/getAgree', param).then(res => {
+					if(res.code == 1){
+						this.content = res.data.replace(/\<p/gi, '<p style="width:100%;word-wrap: break-word;margin-bottom: 10px"')	
+						
+						let userInfo = null
+						let userStr = uni.getStorageSync('user-info') ? uni.getStorageSync('user-info') : null
+						if(userStr != null) {
+							userInfo = JSON.parse(userStr)
+						}
+
+						if(userInfo != null){
+							this.content = this.content.replace(/NAME/g, userInfo.realname)	
+							this.content = this.content.replace(/IDCARD/g, userInfo.idcard)
+							this.content = this.content.replace(/PHONE/g, userInfo.phone)
+						}
+						const today = new Date();
+						const year = today.getFullYear();
+						const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份是从0开始的,所以要加1,并且需要补零
+						const day = String(today.getDate()).padStart(2, '0');
+
+						this.content = this.content.replace(/YYYY/g, year)
+						this.content = this.content.replace(/MM/g, month)
+						this.content = this.content.replace(/DD/g, day)
+					}
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss">
+	.agreePup{
+		width: 100%;
+		left: 0;
+		top: 0;
+		z-index: 999999;
+		height: 100%;
+		position: fixed;
+	}
+	.agreePup .msk{
+		width: 100%;
+		height: 100%;
+		z-index: 99;
+		background-color: #000000;
+		position: absolute;
+		left: 0;
+		top: 0;
+		opacity: .5;
+	}
+	.agreeMain{
+		width: 90%;
+		position: absolute;
+		left: 5%;
+		top: 10%;
+		background: #ffffff;
+		border-radius: 10upx;
+		height: 70%;
+		z-index: 999999;
+	}
+	.pop-title{
+		width: 100%;
+		height: 90upx;
+		border-bottom: 1px solid #eeeeee;
+		text-align: center;
+		line-height: 90upx;
+		font-size: 28upx;
+		font-weight: 700;
+	}
+	.popup-content{
+		width: 100%;
+		margin: 0%;
+		border-radius: 10upx;
+		padding-bottom: 20upx;
+		overflow-y: auto;
+		height: 90%;
+	}
+	.content{
+		padding: 30upx;
+		height: 80%;
+		word-wrap: break-word;
+		overflow-y: auto;
+		overflow-x: hidden;
+	}
+	p{
+		width: 100%;
+		padding: 0;
+		margin-block-start: 0em;
+		margin-block-end: 0em;
+		word-wrap: break-word;
+		line-height: 40px;
+	}
+	.popBtn{
+		width: 200upx;
+		height: 76upx;
+		margin: 30upx auto 0;
+		text-align: center;
+		line-height: 76upx;
+		border-radius: 20upx;
+		border: 1px solid #dddddd;
+	}
+</style>
\ No newline at end of file
diff --git a/components/u-pdf/u-pdf.vue b/components/u-pdf/u-pdf.vue
new file mode 100644
index 0000000..deb56af
--- /dev/null
+++ b/components/u-pdf/u-pdf.vue
@@ -0,0 +1,168 @@
+<template>
+  <view class="pdf-page">
+    <view class="pdf-wrap" :style="{'height':viewHeight}">
+      <view ref="pdfRef" id="pdfView"></view>
+    </view>
+    <view v-if="showBottom" class="pdf-btn-group">
+      <slot>
+        <button class="btn-readed" size="mini" @click="handleComplete"
+            :disabled="btnDisabled">{{showTimer ? countTimer<=1 ? '':'('+countTimer+'s)':''}}我已阅读</button>
+      </slot>
+    </view>
+  </view>
+</template>
+
+<script>
+  import Pdfh5 from "pdfh5";
+  import "pdfh5/css/pdfh5.css";
+  export default {
+    name: "u-pdf",
+    props: {
+      url: {
+        type: String,
+        require: true
+      },
+      viewHeight: {
+        type: String,
+        default: "100%"
+      },
+      showBottom: {
+        type: Boolean,
+        default: true
+      },
+      options: {
+        type: Object,
+        default: () => ({
+          cMapUrl: "https://unpkg.com/pdfjs-dist@3.8.162/cmaps/",
+          lazy: false,
+          withCredentials: true,
+          // pdfLoaded:false,
+          renderType: "svg",
+          maxZoom: 3, //手势缩放最大倍数 默认3
+          scrollEnable: true, //是否允许pdf滚动
+          zoomEnable: true //是否允许pdf手势缩放
+        })
+      },
+      disabled:{
+        type:Boolean,
+        default:true
+      },
+      showTimer:Boolean
+    },
+    data() {
+      return {
+        totalNum: 0,
+        pdfh5: undefined,
+        countTimer:10,
+        timer:undefined,
+        btnDisabled:true
+      }
+    },
+    
+    watch:{
+      disabled(n,o){
+        this.btnDisabled = this.disabled
+      },
+      showTimer(n,o){
+        console.log("showTimer ",n);
+        if(this.showTimer){
+          this.startCountDownTimer()
+        }
+      }
+    },
+
+    mounted() {
+      this.$nextTick(() => {
+        this.loadPdf()
+      })
+    },
+
+    // onPageScroll(scroll) {
+    //   console.log(`onPageScroll ${scroll}`,scroll);
+    // },
+
+    // onReachBottom(scroll) {
+    //   console.log(`onReachBottom 滚动到底部`);
+    // },
+
+    methods: {
+      handleComplete(){
+        this.$emit("onClickReader")
+      },
+      
+      startCountDownTimer(){
+        this.timer= setInterval(()=>{
+          if(this.countTimer<=1){
+            this.btnDisabled=false
+            clearInterval(this.timer)
+          }else{
+            this.countTimer--
+          }
+        },1000)
+      },
+      
+      loadPdf() {
+        if (!this.url) {
+          console.error("pdf url is null ");
+          return;
+        }
+        const opts = {
+          pdfurl: this.url,
+          ...this.options
+        }
+        console.log(opts);
+        this.pdfh5 = new Pdfh5('#pdfView', opts);
+        // 准备加载pdf
+        this.pdfh5.on("ready", () => {
+          this.$emit("ready")
+        })
+        //pdf 监听完成事件
+        this.pdfh5.on("complete", (status, msg, time) => {
+          console.log(`PDF complete status=${status}, msg =${msg}`);
+          this.$emit("complete", { status, msg })
+        });
+        // pdf 滚动事件 Svg 方式不会执行此方法, 需要在page中监听 onReachBottom,onPageScroll
+        this.pdfh5.on("scroll", (scrollTop, currentNum) => {
+          console.log(`pdf scrollTop =${scrollTop} , currentNum =${currentNum}`);
+          this.$emit("scroll", { scrollTop, currentNum })
+        });
+      }
+    }
+  }
+</script>
+
+<style scoped>
+  @import 'pdfh5/css/pdfh5.css';
+
+  .pdf-page {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+  }
+
+  .pdf-wrap {
+    width: 100%;
+    flex: 1;
+  }
+
+  .pdf-btn-group {
+    width: 100%;
+    border-top: 2rpx solid #F8F9FC;
+    height: 8%;
+    position: fixed;
+    bottom: -1rpx;
+    z-index: 999;
+    background: white;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+  .btn-readed {
+    background: #4E70F6;
+    color: #ffffff;
+    font-size: 32rpx;
+  }
+</style>
\ No newline at end of file
diff --git a/components/yk-authpup/yk-authpup.vue b/components/yk-authpup/yk-authpup.vue
new file mode 100644
index 0000000..2711322
--- /dev/null
+++ b/components/yk-authpup/yk-authpup.vue
@@ -0,0 +1,331 @@
+<template>
+	<view v-if="showPopup" class="uni-popup" :style="{top:isNativeHead?'':StatusBar}">
+		<view :class="[type, ani, animation ? 'ani' : '']" class="uni-custom uni-popup__wrapper" @click="close(true)">
+			<view class="uni-popup__wrapper-box">
+				<view class="title">{{authList[permissionID].title}}</view>
+				<view class="content">{{authList[permissionID].content}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'YkAuthpup',
+		props: {
+			// 开启动画
+			animation: {
+				type: Boolean,
+				default: true
+			},
+			type: {
+				type: String,
+				default: 'top'
+			},
+			show: {
+				type: Boolean,
+				default: true
+			},
+			//是否是原生头部
+			isNativeHead:{
+				type: Boolean,
+				default: true
+			},
+			permissionID: {
+				type: [String, Number],
+				default: ''
+			},
+			noticeTitle:{
+				type: [String],
+				default: ''
+			}
+		},
+		data() {
+			return {
+				ani: '',
+				showPopup: false,
+				StatusBar:'',
+				refuseNum:'',//拒绝次数,
+				authList: {
+					'WRITE_EXTERNAL_STORAGE': {
+						title: "存储空间/照片权限申请说明",
+						content: this.noticeTitle
+					},
+					'ACCESS_FINE_LOCATION': {
+						title: "地理位置权限申请说明",
+						content: this.noticeTitle
+					},
+					'CAMERA':{
+						title: "相机/摄像头权限申请说明",
+						content:this.noticeTitle
+					},
+					'RECORD_AUDIO':{
+						title: "麦克风权限申请说明",
+						content: this.noticeTitle
+					},
+					'CALL_PHONE': {
+						title: "拨打/管理电话权限申请说明",
+						content: this.noticeTitle
+					}
+				}
+			}
+		},
+		created() {
+			// #ifdef APP-PLUS
+			this.getSystemInfo();
+			// #endif
+		},
+		methods: {
+			//获取状态栏高度
+			getSystemInfo() {
+				let _this = this;
+				uni.getSystemInfo({
+					success: function(e) {
+						_this.StatusBar = e.statusBarHeight + 'px'; //用于自定义头部时,给手机状态栏留出位置,可通过isNativeHead这个参数控制
+					}
+				})
+			},
+			open() {
+				this.requestPermissions(this.permissionID);
+			},
+			close(type) {
+				this.ani = '';
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.showPopup = false;
+					}, 300)
+				})
+			},
+			//权限检测
+			requestPermissions(permissionID) {
+				let _this = this;
+				// #ifdef APP-PLUS
+				//判断安卓与ios设备
+				if (plus.os.name == 'Android') {
+					let _permissionID = 'android.permission.' + permissionID;
+					plus.android.checkPermission(_permissionID,
+						granted => {
+							if (granted.checkResult == -1) {
+								//还未授权当前查询的权限,打开权限申请目的自定义弹框
+								_this.showPopup = true;
+								_this.$nextTick(() => {
+									setTimeout(() => {
+										_this.ani = 'uni-' + _this.type
+									},30)
+								})
+							}
+						},
+						error => {
+							console.log(error.message);
+						}
+					);
+					plus.android.requestPermissions([_permissionID],
+						(e) => {
+							//关闭权限申请目的自定义弹框
+							_this.ani = '';
+							_this.$nextTick(() => {
+								setTimeout(() => {
+									_this.showPopup = false
+								}, 0)
+							})
+							//console.log(e,'kkkkk')
+							if (e.granted.length > 0) {
+								//当前查询权限已授权,此时可以通知页面执行接下来的操作
+								_this.$emit('changeAuth');
+							}
+							if (e.deniedAlways.length > 0) {
+								//当前查询权限已被永久禁用,此时需要引导用户跳转手机系统设置去开启
+								uni.showModal({
+									title: '温馨提示',
+									content: '还没有该权限,立即去设置开启?',
+									cancelText: "取消",
+									confirmText: "去设置",
+									showCancel: true,
+									confirmColor: '#000',
+									cancelColor: '#666',
+									success: (res) => {
+										if (res.confirm) {
+											_this.goSetting();
+										}
+									}
+								})
+							}
+						})
+				} else {
+					//IOS不需要添加自定义弹框来描述权限目的,因为在配置文件的隐私信息访问的许可描述里可添加
+					//正常可以直接调用uni的API调起权限询问弹框使用各种权限,下面的判断使用场景主要是在IOS禁用某权限后,这个可以判断有无权限,进而引导用户跳转设置开启,仅列出了位置、相册、通讯录、相机、录音等权限,其他IOS权限可具体参考 https://ext.dcloud.net.cn/plugin?id=15787
+					let result = 0;
+					if (permissionID == 'ACCESS_FINE_LOCATION') {
+						//IOS检测位置权限
+						let cLLocationManager = plus.ios.importClass("CLLocationManager"),
+							authStatus = cLLocationManager.authorizationStatus(),
+							enable = cLLocationManager.locationServicesEnabled();
+						if (enable && authStatus != 2) {
+							result = 1;
+						} else {
+							result = 0;
+						}
+						plus.ios.deleteObject(cLLocationManager);
+					} else if (permissionID == 'WRITE_EXTERNAL_STORAGE') {
+						//IOS检测相册权限
+						let PHPhotoLibrary = plus.ios.importClass("PHPhotoLibrary"),
+							authStatus = PHPhotoLibrary.authorizationStatus();
+						if (authStatus === 3) {
+							result = 1;
+						} else {
+							result = 0;
+						}
+						plus.ios.deleteObject(PHPhotoLibrary);
+					} else if (permissionID == 'CAMERA') {
+						//IOS检测相机/摄像头权限
+						let avCaptureDevice = plus.ios.importClass("AVCaptureDevice"),
+						    authStatus = avCaptureDevice.authorizationStatusForMediaType("vide");
+						if (authStatus === 3) {
+						  result = 1;
+						} else {
+						  result = 0;
+						}
+						plus.ios.deleteObject(avCaptureDevice);
+					} else if (permissionID == 'CALL_PHONE') {
+						//IOS检测通讯录权限
+						let contactStore = plus.ios.importClass("CNContactStore"),
+							authStatus = contactStore.authorizationStatusForEntityType(0);
+						if (authStatus === 3) {
+							result = 1;
+						} else {
+							result = 0;
+						}
+						plus.ios.deleteObject(contactStore);
+					}else if(permissionID == 'RECORD_AUDIO'){
+						//IOS检测麦克风权限
+						let aVAudioSession = plus.ios.importClass("AVAudioSession"),
+						  aVAudio = aVAudioSession.sharedInstance(),
+						  authStatus = aVAudio.recordPermission();
+						if ([1684369017, 1970168948].includes(authStatus)) {
+						  result = 0;
+						} else {
+						  result = 1;
+						}
+						plus.ios.deleteObject(aVAudioSession);
+					}
+					if (result) {
+						//当前查询权限已授权,此时可以通知页面执行接下来的操作
+						that.$emit('changeAuth')
+					} else {
+						//当前查询的权限已禁用,引导用户跳转手机系统设置去开启
+						uni.showModal({
+							title: '温馨提示',
+							content: '还没有该权限,立即去设置开启?',
+							cancelText: "取消",
+							confirmText: "去设置",
+							showCancel: true,
+							confirmColor: '#000',
+							cancelColor: '#666',
+							success: (res) => {
+								if (res.confirm) {
+									_this.goSetting();
+								}
+							}
+						})
+					}
+				}
+				// #endif
+			},
+			//跳转手机系统设置
+			goSetting() {
+				if (plus.os.name == "iOS") {
+					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);
+				}
+			}
+		}
+	}
+</script>
+<style lang="scss">
+	.uni-popup {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		z-index: 99999;
+		overflow: hidden;
+		&__wrapper {
+			position: absolute;
+			z-index: 9999999;
+			/* #ifndef APP-NVUE */
+			box-sizing: border-box;
+			/* #endif */
+			&.ani {
+				/* #ifndef APP-NVUE */
+				transition: all 0.3s;
+				/* #endif */
+			}
+			&.top {
+				top: 0;
+				width:705rpx;
+				/* #ifdef APP-NVUE */
+				left:22.5rpx;
+				/* #endif */
+				/* #ifndef APP-NVUE */
+				left:0;
+				transform: translateY(-705rpx);
+				/* #endif */
+			}
+			&-box {
+				position: relative;
+				/* #ifndef APP-NVUE */
+				box-sizing: border-box;
+				/* #endif */
+			}
+			&.uni-custom {
+				& .uni-popup__wrapper-box {
+					width: 705rpx;
+					/* #ifndef APP-NVUE */
+					margin: 0 22.5rpx;
+					/* #endif */
+					padding: 30upx;
+					background: #fff;
+					z-index:9999;
+					border: solid 2rpx #ddd;
+					/* #ifndef APP-NVUE */
+					box-sizing: border-box;
+					/* #endif */
+					border-radius: 16rpx;
+					.title{
+						font-size: 32rpx;
+						font-weight: bold;
+					}
+					.content{
+						margin-top: 16rpx;
+						line-height: 1.6;
+					}
+				}
+				&.top{
+					& .uni-popup__wrapper-box {
+						width: 705rpx;
+					}
+				}
+			}
+			&.uni-top{
+				transform: translateY(0);
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/js_sdk/wa-permission/permission.js b/js_sdk/wa-permission/permission.js
new file mode 100644
index 0000000..9981504
--- /dev/null
+++ b/js_sdk/wa-permission/permission.js
@@ -0,0 +1,272 @@
+/**
+ * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
+ */
+
+var isIos
+// #ifdef APP-PLUS
+isIos = (plus.os.name == "iOS")
+// #endif
+
+// 判断推送权限是否开启
+function judgeIosPermissionPush() {
+	var result = false;
+	var UIApplication = plus.ios.import("UIApplication");
+	var app = UIApplication.sharedApplication();
+	var enabledTypes = 0;
+	if (app.currentUserNotificationSettings) {
+		var settings = app.currentUserNotificationSettings();
+		enabledTypes = settings.plusGetAttribute("types");
+		console.log("enabledTypes1:" + enabledTypes);
+		if (enabledTypes == 0) {
+			console.log("推送权限没有开启");
+		} else {
+			result = true;
+			console.log("已经开启推送功能!")
+		}
+		plus.ios.deleteObject(settings);
+	} else {
+		enabledTypes = app.enabledRemoteNotificationTypes();
+		if (enabledTypes == 0) {
+			console.log("推送权限没有开启!");
+		} else {
+			result = true;
+			console.log("已经开启推送功能!")
+		}
+		console.log("enabledTypes2:" + enabledTypes);
+	}
+	plus.ios.deleteObject(app);
+	plus.ios.deleteObject(UIApplication);
+	return result;
+}
+
+// 判断定位权限是否开启
+function judgeIosPermissionLocation() {
+	var result = false;
+	var cllocationManger = plus.ios.import("CLLocationManager");
+	var status = cllocationManger.authorizationStatus();
+	result = (status != 2)
+	console.log("定位权限开启:" + result);
+	// 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
+	/* var enable = cllocationManger.locationServicesEnabled();
+	var status = cllocationManger.authorizationStatus();
+	console.log("enable:" + enable);
+	console.log("status:" + status);
+	if (enable && status != 2) {
+		result = true;
+		console.log("手机定位服务已开启且已授予定位权限");
+	} else {
+		console.log("手机系统的定位没有打开或未给予定位权限");
+	} */
+	plus.ios.deleteObject(cllocationManger);
+	return result;
+}
+
+// 判断麦克风权限是否开启
+function judgeIosPermissionRecord() {
+	var result = false;
+	var avaudiosession = plus.ios.import("AVAudioSession");
+	var avaudio = avaudiosession.sharedInstance();
+	var permissionStatus = avaudio.recordPermission();
+	console.log("permissionStatus:" + permissionStatus);
+	if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
+		console.log("麦克风权限没有开启");
+	} else {
+		result = true;
+		console.log("麦克风权限已经开启");
+	}
+	plus.ios.deleteObject(avaudiosession);
+	return result;
+}
+
+// 判断相机权限是否开启
+function judgeIosPermissionCamera() {
+	var result = false;
+	var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
+	var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
+	console.log("authStatus:" + authStatus);
+	if (authStatus == 3) {
+		result = true;
+		console.log("相机权限已经开启");
+	} else {
+		console.log("相机权限没有开启");
+	}
+	plus.ios.deleteObject(AVCaptureDevice);
+	return result;
+}
+
+// 判断相册权限是否开启
+function judgeIosPermissionPhotoLibrary() {
+	var result = false;
+	var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
+	var authStatus = PHPhotoLibrary.authorizationStatus();
+	console.log("authStatus:" + authStatus);
+	if (authStatus == 3) {
+		result = true;
+		console.log("相册权限已经开启");
+	} else {
+		console.log("相册权限没有开启");
+	}
+	plus.ios.deleteObject(PHPhotoLibrary);
+	return result;
+}
+
+// 判断通讯录权限是否开启
+function judgeIosPermissionContact() {
+	var result = false;
+	var CNContactStore = plus.ios.import("CNContactStore");
+	var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
+	if (cnAuthStatus == 3) {
+		result = true;
+		console.log("通讯录权限已经开启");
+	} else {
+		console.log("通讯录权限没有开启");
+	}
+	plus.ios.deleteObject(CNContactStore);
+	return result;
+}
+
+// 判断日历权限是否开启
+function judgeIosPermissionCalendar() {
+	var result = false;
+	var EKEventStore = plus.ios.import("EKEventStore");
+	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
+	if (ekAuthStatus == 3) {
+		result = true;
+		console.log("日历权限已经开启");
+	} else {
+		console.log("日历权限没有开启");
+	}
+	plus.ios.deleteObject(EKEventStore);
+	return result;
+}
+
+// 判断备忘录权限是否开启
+function judgeIosPermissionMemo() {
+	var result = false;
+	var EKEventStore = plus.ios.import("EKEventStore");
+	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
+	if (ekAuthStatus == 3) {
+		result = true;
+		console.log("备忘录权限已经开启");
+	} else {
+		console.log("备忘录权限没有开启");
+	}
+	plus.ios.deleteObject(EKEventStore);
+	return result;
+}
+
+// Android权限查询
+function requestAndroidPermission(permissionID) {
+	return new Promise((resolve, reject) => {
+		plus.android.requestPermissions(
+			[permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
+			function(resultObj) {
+				var result = 0;
+				for (var i = 0; i < resultObj.granted.length; i++) {
+					var grantedPermission = resultObj.granted[i];
+					console.log('已获取的权限:' + grantedPermission);
+					result = 1
+				}
+				for (var i = 0; i < resultObj.deniedPresent.length; i++) {
+					var deniedPresentPermission = resultObj.deniedPresent[i];
+					console.log('拒绝本次申请的权限:' + deniedPresentPermission);
+					result = 0
+				}
+				for (var i = 0; i < resultObj.deniedAlways.length; i++) {
+					var deniedAlwaysPermission = resultObj.deniedAlways[i];
+					console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
+					result = -1
+				}
+				resolve(result);
+				// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
+				// if (result != 1) {
+				// gotoAppPermissionSetting()
+				// }
+			},
+			function(error) {
+				console.log('申请权限错误:' + error.code + " = " + error.message);
+				resolve({
+					code: error.code,
+					message: error.message
+				});
+			}
+		);
+	});
+}
+
+// 使用一个方法,根据参数判断权限
+function judgeIosPermission(permissionID) {
+	if (permissionID == "location") {
+		return judgeIosPermissionLocation()
+	} else if (permissionID == "camera") {
+		return judgeIosPermissionCamera()
+	} else if (permissionID == "photoLibrary") {
+		return judgeIosPermissionPhotoLibrary()
+	} else if (permissionID == "record") {
+		return judgeIosPermissionRecord()
+	} else if (permissionID == "push") {
+		return judgeIosPermissionPush()
+	} else if (permissionID == "contact") {
+		return judgeIosPermissionContact()
+	} else if (permissionID == "calendar") {
+		return judgeIosPermissionCalendar()
+	} else if (permissionID == "memo") {
+		return judgeIosPermissionMemo()
+	}
+	return false;
+}
+
+// 跳转到**应用**的权限页面
+function gotoAppPermissionSetting() {
+	if (isIos) {
+		var UIApplication = plus.ios.import("UIApplication");
+		var application2 = UIApplication.sharedApplication();
+		var NSURL2 = plus.ios.import("NSURL");
+		// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");		
+		var setting2 = NSURL2.URLWithString("app-settings:");
+		application2.openURL(setting2);
+
+		plus.ios.deleteObject(setting2);
+		plus.ios.deleteObject(NSURL2);
+		plus.ios.deleteObject(application2);
+	} else {
+		// console.log(plus.device.vendor);
+		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);
+	}
+}
+
+// 检查系统的设备服务是否开启
+// var checkSystemEnableLocation = async function () {
+function checkSystemEnableLocation() {
+	if (isIos) {
+		var result = false;
+		var cllocationManger = plus.ios.import("CLLocationManager");
+		var result = cllocationManger.locationServicesEnabled();
+		console.log("系统定位开启:" + result);
+		plus.ios.deleteObject(cllocationManger);
+		return result;
+	} else {
+		var context = plus.android.importClass("android.content.Context");
+		var locationManager = plus.android.importClass("android.location.LocationManager");
+		var main = plus.android.runtimeMainActivity();
+		var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
+		var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
+		console.log("系统定位开启:" + result);
+		return result
+	}
+}
+
+module.exports = {
+	judgeIosPermission: judgeIosPermission,
+	requestAndroidPermission: requestAndroidPermission,
+	checkSystemEnableLocation: checkSystemEnableLocation,
+	gotoAppPermissionSetting: gotoAppPermissionSetting
+}

--
Gitblit v1.9.3