Эх сурвалжийг харах

Merge remote-tracking branch 'origin/new-dev' into new-dev

wuguojie 1 жил өмнө
parent
commit
c7d4ff1675

+ 94 - 94
App.vue

@@ -57,104 +57,104 @@
 			// #endif
 		},
 		onShow: function(e) {
-			// #ifdef APP-PLUS
-			this.getLocation();
-			// #endif
+			// // #ifdef APP-PLUS
+			// this.getLocation();
+			// // #endif
 		},
 		onHide: function() {},
 		methods: {
-			getLocation() {
-				uni.getLocation({
-					type: 'gcj02', // 根据需要选择坐标类型
-					geocode: true,
-					success: (res) => {
-						this.saveLocation(res);
-						if (this.locationInterval) {
-							clearInterval(this.locationInterval);
-						}
-						// 设置每小时重新获取坐标
-						this.locationInterval = setInterval(() => {
-							this.updateLocation();
-						}, 3600000); // 3600000毫秒 = 1小时
+			// getLocation() {
+			// 	uni.getLocation({
+			// 		type: 'gcj02', // 根据需要选择坐标类型
+			// 		geocode: true,
+			// 		success: (res) => {
+			// 			this.saveLocation(res);
+			// 			if (this.locationInterval) {
+			// 				clearInterval(this.locationInterval);
+			// 			}
+			// 			// 设置每小时重新获取坐标
+			// 			this.locationInterval = setInterval(() => {
+			// 				this.updateLocation();
+			// 			}, 3600000); // 3600000毫秒 = 1小时
 
-						// 重置错误通知状态
-						this.errorNotified = false;
-					},
-					fail: (err) => {
-						if (!this.errorNotified) {
-							this.handleLocationError(err);
-							this.errorNotified = true;
-						}
-					}
-				});
-			},
-			updateLocation() {
-				uni.getLocation({
-					type: 'gcj02',
-					geocode: true,
-					success: (res) => {
-						this.saveLocation(res);
-					},
-					fail: (err) => {
-						if (!this.errorNotified) {
-							this.handleLocationError(err);
-							this.errorNotified = true;
-						}
-					}
-				});
-			},
-			saveLocation(res) {
-				uni.setStorage({
-					key: 'location',
-					data: {
-						latitude: res.latitude,
-						longitude: res.longitude,
-						province: res.address.province,
-						city: res.address.city,
-						district: res.address.district,
-						street: res.address.street,
-						streetNum: res.address.streetNum,
-						poiName: res.address.poiName,
-						cityCode: res.address.cityCode
-					},
-					success: () => {}
-				});
-			},
-			handleLocationError(err) {
-				uni.showModal({
-					title: '获取权限',
-					content: '晋掌柜有道路救援服务,需要获取位置信息',
-					success: ({
-						confirm,
-						cancel
-					}) => {
-						setTimeout(() => {
-							if (confirm) {
-								this.openLocationSettings();
-							}
-							if (cancel) {
-								this.exitApp();
-							}
-						}, 0);
-					}
-				});
-			},
-			openLocationSettings() {
-				if (uni.getSystemInfoSync().platform == 'android') {
-					var Intent = plus.android.importClass('android.content.Intent');
-					var Settings = plus.android.importClass('android.provider.Settings');
-					var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
-					var main = plus.android.runtimeMainActivity();
-					main.startActivity(intent);
-				}
-			},
-			exitApp() {
-				if (plus.os.name === "Android") {
-					plus.runtime.quit();
-				} else {
-					plus.ios.import("UIApplication").sharedApplication().performSelector("exit");
-				}
-			},
+			// 			// 重置错误通知状态
+			// 			this.errorNotified = false;
+			// 		},
+			// 		fail: (err) => {
+			// 			if (!this.errorNotified) {
+			// 				this.handleLocationError(err);
+			// 				this.errorNotified = true;
+			// 			}
+			// 		}
+			// 	});
+			// },
+			// updateLocation() {
+			// 	uni.getLocation({
+			// 		type: 'gcj02',
+			// 		geocode: true,
+			// 		success: (res) => {
+			// 			this.saveLocation(res);
+			// 		},
+			// 		fail: (err) => {
+			// 			if (!this.errorNotified) {
+			// 				this.handleLocationError(err);
+			// 				this.errorNotified = true;
+			// 			}
+			// 		}
+			// 	});
+			// },
+			// saveLocation(res) {
+			// 	uni.setStorage({
+			// 		key: 'location',
+			// 		data: {
+			// 			latitude: res.latitude,
+			// 			longitude: res.longitude,
+			// 			province: res.address.province,
+			// 			city: res.address.city,
+			// 			district: res.address.district,
+			// 			street: res.address.street,
+			// 			streetNum: res.address.streetNum,
+			// 			poiName: res.address.poiName,
+			// 			cityCode: res.address.cityCode
+			// 		},
+			// 		success: () => {}
+			// 	});
+			// },
+			// handleLocationError(err) {
+			// 	uni.showModal({
+			// 		title: '获取权限',
+			// 		content: '晋掌柜有道路救援服务,需要获取位置信息',
+			// 		success: ({
+			// 			confirm,
+			// 			cancel
+			// 		}) => {
+			// 			setTimeout(() => {
+			// 				if (confirm) {
+			// 					this.openLocationSettings();
+			// 				}
+			// 				if (cancel) {
+			// 					this.exitApp();
+			// 				}
+			// 			}, 0);
+			// 		}
+			// 	});
+			// },
+			// openLocationSettings() {
+			// 	if (uni.getSystemInfoSync().platform == 'android') {
+			// 		var Intent = plus.android.importClass('android.content.Intent');
+			// 		var Settings = plus.android.importClass('android.provider.Settings');
+			// 		var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+			// 		var main = plus.android.runtimeMainActivity();
+			// 		main.startActivity(intent);
+			// 	}
+			// },
+			// exitApp() {
+			// 	if (plus.os.name === "Android") {
+			// 		plus.runtime.quit();
+			// 	} else {
+			// 		plus.ios.import("UIApplication").sharedApplication().performSelector("exit");
+			// 	}
+			// },
 			//  TODO 开屏广告 后续优化添加
 			launch() {
 				try {

+ 2 - 1
components/modules/my/my-list-item.vue

@@ -196,7 +196,8 @@
 	}
 
 	.home-list-item>view:last-child {
-		color: #CCCCCC;
+		color: #333333;
+		font-size: 14px;
 	}
 
 	.home-list-hover {

+ 6 - 5
config/baseUrl.js

@@ -4,25 +4,26 @@ let socketUrl = "";
 if (process.env.NODE_ENV === 'development') {
 	// 开发环境
 	// baseUrl = "https://test.baoxianzhanggui.com/dx/"; //屈晨
-	// baseUrl = "http://192.168.0.115:8080"; //董鑫
+	baseUrl = "http://192.168.0.115:8090"; //董鑫
 	// baseUrl = "http://192.168.0.253:8080"; //田智
 	// baseUrl = "https://test.baoxianzhanggui.com/web-api"; //测试
 	// h5BaseUrl = "https://test.baoxianzhanggui.com/h5";
 	// baseUrl = "https://pre.baoxianzhanggui.com/web-api"; //预生产
 	// h5BaseUrl = "https://pre.baoxianzhanggui.com/h5";
 	// baseUrl = "https://pre.baoxianzhanggui.com/test"; //生产
-	baseUrl = "https://sxzgkj.baoxianzhanggui.com/web-api"; //生产
-	h5BaseUrl = "https://sxzgkj.baoxianzhanggui.com/h5";
+	// baseUrl = "https://sxzgkj.baoxianzhanggui.com/web-api"; //生产
+	// h5BaseUrl = "https://sxzgkj.baoxianzhanggui.com/h5";
 	socketUrl = "wss://sxzgkj.baoxianzhanggui.com/web-api/websocket";
 	// socketUrl = "ws://192.168.0.52:8080/websocket";
 } else if (process.env.NODE_ENV === 'production') {
 	// 生产环境
+	baseUrl = "http://192.168.0.115:8090"; //董鑫
 	// baseUrl = "https://test.baoxianzhanggui.com/web-api"; //测试
 	// h5BaseUrl = "https://test.baoxianzhanggui.com/h5";
 	// baseUrl = "https://pre.baoxianzhanggui.com/web-api"; //预生产
 	// h5BaseUrl = "https://pre.baoxianzhanggui.com/h5";
-	baseUrl = "https://sxzgkj.baoxianzhanggui.com/web-api"; //生产
-	h5BaseUrl = "https://sxzgkj.baoxianzhanggui.com/h5";
+	// baseUrl = "https://sxzgkj.baoxianzhanggui.com/web-api"; //生产
+	// h5BaseUrl = "https://sxzgkj.baoxianzhanggui.com/h5";
 	socketUrl = "wss://sxzgkj.baoxianzhanggui.com/web-api/websocket";
 }
 const courtConfig = {

+ 14 - 2
main.js

@@ -2,7 +2,10 @@ import Vue from 'vue'
 import uView from "uview-ui";
 Vue.use(uView);
 import App from './App'
-
+import {
+	addPermisionInterceptor,
+	removePermisionInterceptor
+} from '@/uni_modules/x-perm-apply-instr/js_sdk/index.js'
 //数据管理中心
 import store from '@/store'
 Vue.prototype.$store = store;
@@ -83,4 +86,13 @@ plus.nativeUI.toast = (function(str) {
 		})
 	}
 });
-// #endif
+// #endif
+
+addPermisionInterceptor('chooseImage', '为了正确识别证件内容,实现图片转文字功能等, 我们需要申请您设备的相机和存储权限')
+addPermisionInterceptor('chooseVideo', '为了发布信息图片视频等, 我们需要申请您设备的相机和存储权限')
+addPermisionInterceptor('saveImageToPhotosAlbum', '为了保存推广海报到手机相册, 我们需要申请您设备的存储权限')
+addPermisionInterceptor('getLocation', '为了根据您的位置展示信息, 我们需要申请您设备的位置权限')
+addPermisionInterceptor('makePhoneCall', '为了联系客服/用户/咨询等, 我们需要申请您设备的拨打电话权限')
+addPermisionInterceptor('getRecorderManager', '为了使用语言消息功能等, 我们需要申请您设备的麦克风权限')
+addPermisionInterceptor('startLocationUpdate', '为了根据您的位置展示信息, 我们需要申请您设备的位置权限')
+addPermisionInterceptor('scanCode', '为了识别二维码信息, 我们需要申请您设备的相机权限')

+ 222 - 221
manifest.json

@@ -1,225 +1,226 @@
 {
-	"name": "晋掌柜",
-	"appid": "__UNI__D4FE29A",
-	"description": "保险类app",
-	"transformPx": false,
-	"icons": [{
-		"sizes": "分辨率,192x192",
-		"src": "图片路径"
-	}],
-	"versionName": "3.1.5",
-	"versionCode": 315,
-	"app-plus": {
-		"error": {
-			"url": "hybrid/html/error.html"
-		},
-		"compatible": {
-			"ignoreVersion": true
-		},
-		"privacy": {
-			"prompt": "template",
-			"template": {
-				"title": "平台协议和隐私协议",
-				"message": "欢迎使用晋掌柜app,我们非常重视您的个人信息和隐私保护。我们将通过《隐私权保护政策》帮助您了解我们收集、使用、存储、共享和保护个人信息的情况,以及您所享有的相关权利。<br/> 为了更好的向您提供注册认证、线上投保、以及周边服务等相关服务功能,我们会收集、使用必要的信息。包括但不限于:<br/>1、为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。2、在使用道路救援功能时,基于您的授权我们可能会获取您的位置信息,以便为您提供服务。您有权拒绝或取消授权。在使用线上投保以及注册等功能时, 基于您的授权我们会获取您的相册存储的权限, 以便在使用时能够正确的上传个人资料。获取通知权限, 用于向您发送重要通知, 如服务更新或安全提醒。<br/>   请仔细阅读<a href='https://sxzgkj.baoxianzhanggui.com/h5/#/pages/login/xieyi'>《平台协议》</a>和<a href='https://sxzgkj.baoxianzhanggui.com/h5/#/pages/login/mimi'>《隐私协议》</a>了解详细信息。我们将按照您同意的条款使用您的个人信息,以便为您提供服务。",
-				"buttonAccept": "同意",
-				"buttonRefuse": "暂不同意"
-			}
-		},
-		"modules": {
-			"Messaging": {},
-			"OAuth": {},
-			"Payment": {},
-			"Share": {},
-			"SQLite": {
-				"description": "iBeacon"
-			},
-			"Camera": {},
-			"Maps": {},
-			"Geolocation": {}
-		},
-		"distribute": {
-			"android": {
-				"permissionPhoneState": {
-					"request": "none",
-					"prompt": "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"
-				},
-				"permissionExternalStorage": {
-					"request": "none",
-					"prompt": "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
-				},
-				"permissions": [
-					"<uses-feature android:name=\"android.hardware.camera\"/>",
-					"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-					"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-					"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
-					"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
-					"<uses-permission android:name=\"android.permission.CAMERA\"/>",
-					"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-					"<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/>",
-					"<uses-permission android:name=\"android.permission.INTERNET\"/>",
-					"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
-					"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-					"<uses-permission android:name=\"android.permission.READ_SMS\"/>",
-					"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
-					"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
-					"<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
-					"<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>",
-					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-					"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-					"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
-					"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
-					"<uses-permission android:name=\"android.permission.WRITE_SMS\"/>"
-				],
-				"abiFilters": ["armeabi-v7a", "arm64-v8a", "x86"],
-				"minSdkVersion": 21,
-				"schemes": "zgcxapp",
-				"targetSdkVersion": 30
-			},
-			"sdkConfigs": {
-				"ad": {
-					"ks": {},
-					"sigmob": {}
-				},
-				"payment": {
-					"weixin": {
-						"__platform__": ["android"],
-						"appid": "wx612ca90988c46947",
-						"UniversalLinks": ""
-					}
-				},
-				"share": {
-					"weixin": {
-						"appid": "wx612ca90988c46947",
-						"UniversalLinks": ""
-					}
-				},
-				"oauth": {
-					"weixin": {
-						"appid": "wx612ca90988c46947",
-						"appsecret": "75b7d4cda453b2075dec23f849278bc0",
-						"UniversalLinks": ""
-					}
-				},
-				"geolocation": {
-					"amap": {
-						"name": "amap_18335592986CWFSxSLAB",
-						"__platform__": ["android"],
-						"appkey_ios": "e410fdbf6be7110af9267b6d56c93c8d",
-						"appkey_android": "e410fdbf6be7110af9267b6d56c93c8d"
-					},
-					"system": {
-						"__platform__": ["ios", "android"]
-					}
-				},
-				"push": {
-					"unipush": {
-						"appid": "YDcU8mcWRO6MWIT1i4naP2",
-						"appkey": "DK2LTzhnc87pFFFhcTSgs8",
-						"appsecret": "wTUMKWB4ReAoPyCp7Jyaz9"
-					}
-				},
-				"maps": {
-					"amap": {
-						"name": "amap_18335592986CWFSxSLAB",
-						"appkey_ios": "e410fdbf6be7110af9267b6d56c93c8d",
-						"appkey_android": "e410fdbf6be7110af9267b6d56c93c8d"
-					}
-				}
-			},
-			"icons": {
-				"android": {
-					"hdpi": "unpackage/res/icons/72x72.png",
-					"xhdpi": "unpackage/res/icons/96x96.png",
-					"xxhdpi": "unpackage/res/icons/144x144.png",
-					"xxxhdpi": "unpackage/res/icons/192x192.png"
-				},
-				"ios": {
-					"appstore": "unpackage/res/icons/1024x1024.png",
-					"ipad": {
-						"app": "unpackage/res/icons/76x76.png",
-						"app@2x": "unpackage/res/icons/152x152.png",
-						"notification": "unpackage/res/icons/20x20.png",
-						"notification@2x": "unpackage/res/icons/40x40.png",
-						"proapp@2x": "unpackage/res/icons/167x167.png",
-						"settings": "unpackage/res/icons/29x29.png",
-						"settings@2x": "unpackage/res/icons/58x58.png",
-						"spotlight": "unpackage/res/icons/40x40.png",
-						"spotlight@2x": "unpackage/res/icons/80x80.png"
-					},
-					"iphone": {
-						"app@2x": "unpackage/res/icons/120x120.png",
-						"app@3x": "unpackage/res/icons/180x180.png",
-						"notification@2x": "unpackage/res/icons/40x40.png",
-						"notification@3x": "unpackage/res/icons/60x60.png",
-						"settings@2x": "unpackage/res/icons/58x58.png",
-						"settings@3x": "unpackage/res/icons/87x87.png",
-						"spotlight@2x": "unpackage/res/icons/80x80.png",
-						"spotlight@3x": "unpackage/res/icons/120x120.png"
-					}
-				}
-			},
-			"splashscreen": {
-				"androidStyle": "common",
-				"useOriginalMsgbox": true
-			},
-			"ios": {
-				"dSYMs": false,
-				"urltypes": "zgcxapp"
-			}
-		},
-		"compilerVersion": 3,
-		"nvueLaunchMode": "fast",
-		"splashscreen": {
-			"alwaysShowBeforeRender": true
-		},
-		"nativePlugins": {}
-	},
-	// 5+App特有相关
-	"quickapp": {},
-	// 快应用特有相关
-	"mp-weixin": {
-		"setting": {
-			"urlCheck": false,
-			"es6": false,
-			"postcss": false,
-			"minified": false
-		},
-		"usingComponents": true,
-		"appid": "wxe57ddfbe230bcfba",
-		"permission": {
-			"photos": {
-				"desc": "你的应用程序需要保存图片到相册"
-			}
-		}
-	},
-	"h5": {
-		"template": "template.h5.html",
-		"router": {
-			"mode": "hash",
-			"base": "./"
-		},
-		"optimization": {
-			"treeShaking": {
-				"enable": true
-			}
-		},
-		"devServer": {
-			"https": false,
-			"port": 80
-		},
-		"sdkConfigs": {
-			"maps": {}
-		},
-		"uniStatistics": {
-			"enable": false
-		}
-	},
-	"mp-jd": {
-		"unipush": {
-			"enable": false
-		}
-	}
+    "name" : "晋掌柜",
+    "appid" : "__UNI__D4FE29A",
+    "description" : "保险类app",
+    "transformPx" : false,
+    "icons" : [
+        {
+            "sizes" : "分辨率,192x192",
+            "src" : "图片路径"
+        }
+    ],
+    "versionName" : "3.1.6",
+    "versionCode" : 316,
+    "app-plus" : {
+        "error" : {
+            "url" : "hybrid/html/error.html"
+        },
+        "compatible" : {
+            "ignoreVersion" : true
+        },
+        "privacy" : {
+            "prompt" : "template",
+            "template" : {
+                "title" : "平台协议和隐私协议",
+                "message" : "欢迎使用晋掌柜app,我们非常重视您的个人信息和隐私保护。我们将通过《隐私权保护政策》帮助您了解我们收集、使用、存储、共享和保护个人信息的情况,以及您所享有的相关权利。<br/> 为了更好的向您提供注册认证、线上投保、以及周边服务等相关服务功能,我们会收集、使用必要的信息。包括但不限于:<br/>1、为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。2、在使用道路救援功能时,基于您的授权我们可能会获取您的位置信息,以便为您提供服务。您有权拒绝或取消授权。在使用线上投保以及注册等功能时, 基于您的授权我们会获取您的相册存储的权限, 以便在使用时能够正确的上传个人资料。获取通知权限, 用于向您发送重要通知, 如服务更新或安全提醒。<br/>   请仔细阅读<a href='https://sxzgkj.baoxianzhanggui.com/h5/#/pages/login/xieyi'>《平台协议》</a>和<a href='https://sxzgkj.baoxianzhanggui.com/h5/#/pages/login/mimi'>《隐私协议》</a>了解详细信息。我们将按照您同意的条款使用您的个人信息,以便为您提供服务。",
+                "buttonAccept" : "同意",
+                "buttonRefuse" : "暂不同意"
+            }
+        },
+        "modules" : {
+            "Messaging" : {},
+            "OAuth" : {},
+            "Payment" : {},
+            "Share" : {},
+            "SQLite" : {
+                "description" : "iBeacon"
+            },
+            "Camera" : {},
+            "Maps" : {},
+            "Geolocation" : {}
+        },
+        "distribute" : {
+            "android" : {
+                "permissionPhoneState" : {
+                    "request" : "none",
+                    "prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"
+                },
+                "permissionExternalStorage" : {
+                    "request" : "none",
+                    "prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
+                },
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_SMS\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
+                    "<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
+                    "<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SMS\"/>"
+                ],
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
+                "minSdkVersion" : 21,
+                "schemes" : "zgcxapp",
+                "targetSdkVersion" : 30
+            },
+            "sdkConfigs" : {
+                "ad" : {
+                    "ks" : {},
+                    "sigmob" : {}
+                },
+                "payment" : {
+                    "weixin" : {
+                        "__platform__" : [ "android" ],
+                        "appid" : "wx612ca90988c46947",
+                        "UniversalLinks" : ""
+                    }
+                },
+                "share" : {
+                    "weixin" : {
+                        "appid" : "wx612ca90988c46947",
+                        "UniversalLinks" : ""
+                    }
+                },
+                "oauth" : {
+                    "weixin" : {
+                        "appid" : "wx612ca90988c46947",
+                        "appsecret" : "75b7d4cda453b2075dec23f849278bc0",
+                        "UniversalLinks" : ""
+                    }
+                },
+                "geolocation" : {
+                    "amap" : {
+                        "name" : "amap_18335592986CWFSxSLAB",
+                        "__platform__" : [ "android" ],
+                        "appkey_ios" : "e410fdbf6be7110af9267b6d56c93c8d",
+                        "appkey_android" : "e410fdbf6be7110af9267b6d56c93c8d"
+                    },
+                    "system" : {
+                        "__platform__" : [ "ios", "android" ]
+                    }
+                },
+                "push" : {
+                    "unipush" : {
+                        "appid" : "YDcU8mcWRO6MWIT1i4naP2",
+                        "appkey" : "DK2LTzhnc87pFFFhcTSgs8",
+                        "appsecret" : "wTUMKWB4ReAoPyCp7Jyaz9"
+                    }
+                },
+                "maps" : {
+                    "amap" : {
+                        "name" : "amap_18335592986CWFSxSLAB",
+                        "appkey_ios" : "e410fdbf6be7110af9267b6d56c93c8d",
+                        "appkey_android" : "e410fdbf6be7110af9267b6d56c93c8d"
+                    }
+                }
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            },
+            "splashscreen" : {
+                "androidStyle" : "common",
+                "useOriginalMsgbox" : true
+            },
+            "ios" : {
+                "dSYMs" : false,
+                "urltypes" : "zgcxapp"
+            }
+        },
+        "compilerVersion" : 3,
+        "nvueLaunchMode" : "fast",
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true
+        },
+        "nativePlugins" : {}
+    },
+    // 5+App特有相关
+    "quickapp" : {},
+    // 快应用特有相关
+    "mp-weixin" : {
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : false,
+            "postcss" : false,
+            "minified" : false
+        },
+        "usingComponents" : true,
+        "appid" : "wxe57ddfbe230bcfba",
+        "permission" : {
+            "photos" : {
+                "desc" : "你的应用程序需要保存图片到相册"
+            }
+        }
+    },
+    "h5" : {
+        "template" : "template.h5.html",
+        "router" : {
+            "mode" : "hash",
+            "base" : "./"
+        },
+        "optimization" : {
+            "treeShaking" : {
+                "enable" : true
+            }
+        },
+        "devServer" : {
+            "https" : false,
+            "port" : 80
+        },
+        "sdkConfigs" : {
+            "maps" : {}
+        },
+        "uniStatistics" : {
+            "enable" : false
+        }
+    },
+    "mp-jd" : {
+        "unipush" : {
+            "enable" : false
+        }
+    }
 }
 // 小程序特有相关
 
-

+ 20 - 0
pages.json

@@ -226,6 +226,26 @@
 				}
 			}
 		},
+		{
+			"path": "pages/set/accountCancellation",
+			"style": {
+				"navigationBarTitleText": "账号注销",
+				"app-plus": {
+					"scrollIndicator": "none", //隐藏滚动条
+					"bounce": "none" //关闭反弹效果
+				}
+			}
+		},
+		{
+			"path": "pages/login/logoutAgreement",
+			"style": {
+				"navigationBarTitleText": "注销协议",
+				"app-plus": {
+					"scrollIndicator": "none", //隐藏滚动条
+					"bounce": "none" //关闭反弹效果
+				}
+			}
+		},
 		{
 			"path": "pages/set/question",
 			"style": {

+ 47 - 47
pages/index/index.vue

@@ -8,6 +8,7 @@
 				<text>{{city}}</text>
 				<image src="../../static/image/index/img/jiantou.png" mode="" style="width: 12px;height: 12px;"></image>
 			</view>
+
 			<view class="search" :style="{opacity:featureHideHandling?1:0}">
 				<u-search :show-action="true" action-text="搜索" bg-color="#fff" maxlength="10" placeholder="请输入关键词"
 					:clearabled="false" :action-style="{position: 'absolute',right:'10px'}" search-icon="0">
@@ -222,7 +223,7 @@
 						cat_id: 2,
 						img: '/static/image/index/category-img/3.png',
 						title: '道路救援',
-						src: '/pages/roadRescue/index',
+						// src: '/pages/roadRescue/index',
 						width: '92rpx',
 						height: '69rpx',
 					},
@@ -388,11 +389,10 @@
 				}
 			};
 		},
-
+		async onLoad() {},
 		computed: {
 			...mapState(['userInfo', 'featureHideHandling'])
 		},
-
 		onPageScroll(e) {
 			//兼容iOS端下拉时顶部漂移
 			if (e.scrollTop >= 0) {
@@ -414,12 +414,12 @@
 			}
 			this.initializeCategoryList();
 			// #ifdef APP-PLUS
-			this.getCurrentLocation();
-			this.soketInit();
+			// this.getCurrentLocation();
+			// this.soketInit();
 			// #endif
 
 		},
-		async onLoad() {},
+
 		async onPullDownRefresh() {
 			await this.loginUser();
 			uni.stopPullDownRefresh();
@@ -469,48 +469,48 @@
 				})
 			},
 			//初始化websoket连接
-			soketInit() {
-				uni.connectSocket({
-					url: base.socketUrl + '/' + this.userInfo.sysUser.id,
-					method: 'GET',
-
-				});
-				uni.onSocketOpen((res) => {
-					console.log(res, '已打开');
-					this.socketOpen = true;
-					this.sendMessage();
-				});
-			},
+			// soketInit() {
+			// 	uni.connectSocket({
+			// 		url: base.socketUrl + '/' + this.userInfo.sysUser.id,
+			// 		method: 'GET',
+
+			// 	});
+			// 	uni.onSocketOpen((res) => {
+			// 		console.log(res, '已打开');
+			// 		this.socketOpen = true;
+			// 		this.sendMessage();
+			// 	});
+			// },
 			//发送信息
-			sendMessage() {
-				if (this.longitude) {
-					const dataToSend = {
-						userId: this.userInfo.sysUser.id,
-						longitude: this.longitude,
-						latitude: this.latitude,
-						province: this.province,
-						city: this.city,
-						district: this.district,
-						street: this.street,
-						streetNum: this.streetNum,
-						poiName: this.poiName,
-						cityCode: this.cityCode
-					};
-					console.log("首次消息", dataToSend);
-					if (this.socketOpen) {
-						uni.sendSocketMessage({
-							data: JSON.stringify(dataToSend)
-						})
-						if (this.messageInterval) {
-							clearInterval(this.messageInterval);
-						}
-						this.messageInterval = setInterval(async () => {
-							await this.getCurrentLocation();
-							await this.updatesendMessage();
-						}, 120000); // 120000毫秒 = 2分钟	
-					}
-				}
-			},
+			// sendMessage() {
+			// 	if (this.longitude) {
+			// 		const dataToSend = {
+			// 			userId: this.userInfo.sysUser.id,
+			// 			longitude: this.longitude,
+			// 			latitude: this.latitude,
+			// 			province: this.province,
+			// 			city: this.city,
+			// 			district: this.district,
+			// 			street: this.street,
+			// 			streetNum: this.streetNum,
+			// 			poiName: this.poiName,
+			// 			cityCode: this.cityCode
+			// 		};
+			// 		console.log("首次消息", dataToSend);
+			// 		if (this.socketOpen) {
+			// 			uni.sendSocketMessage({
+			// 				data: JSON.stringify(dataToSend)
+			// 			})
+			// 			if (this.messageInterval) {
+			// 				clearInterval(this.messageInterval);
+			// 			}
+			// 			this.messageInterval = setInterval(async () => {
+			// 				await this.getCurrentLocation();
+			// 				await this.updatesendMessage();
+			// 			}, 120000); // 120000毫秒 = 2分钟	
+			// 		}
+			// 	}
+			// },
 
 			getCurrentLocation() {
 				//获取当前的地理位置

+ 85 - 32
pages/login/login.vue

@@ -119,7 +119,19 @@
 				<view class="heng1" @click="queren" style="background-color: orangered;">确认</view>
 			</view>
 		</u-popup>
+		<u-popup v-model="privacyPolicyValidation" mode="bottom" border-radius="12">
+			<view class="privacyPolicyValidationclass dis f-c a-start">
+				<text class="title">用户协议及隐私政策</text>
+				<text class="content">未注册的用户将自动注册,请您认真阅读 <text @tap="nav('/pages/login/xieyi')"
+						class="text-color">《用户协议》</text>和<text class="text-color"
+						@tap="nav('/pages/login/mimi')">《隐私政策》</text>的全部条款,接受后可开始使用本产品 </text>
+				<view class="dis a-c j-s" style="margin-top: 10px;width: 100%;">
+					<u-button type="default" @click="butongyi">不同意</u-button>
+					<u-button type="primary" style="width: 70%;" @click="tongyi">同意并继续</u-button>
+				</view>
 
+			</view>
+		</u-popup>
 	</view>
 </template>
 <script>
@@ -138,6 +150,8 @@
 		},
 		data() {
 			return {
+				privacyPolicyValidation: false,
+				loginMethod: "weixin",
 				checked: false,
 				list: [{
 					name: '账号登录'
@@ -288,7 +302,18 @@
 					url: url
 				});
 			},
-
+			butongyi() {
+				this.privacyPolicyValidation = false;
+				return uni.showToast({
+					title: '请先同意协议',
+					icon: 'none'
+				});
+			},
+			tongyi() {
+				this.privacyPolicyValidation = false;
+				this.checked = true;
+				this[this.loginMethod]();
+			},
 			// 图片验证码
 			refreshCaptcha() {
 				let randnum = Math.floor(Math.random() * (1000000 - 1 + 1)) + 1
@@ -516,41 +541,53 @@
 			},
 			// 微信APP登录
 			onWxAppLogin() {
+				this.loginMethod = 'onWxAppLogin';
 				var that = this;
-				uni.login({
-					provider: 'weixin',
-					onlyAuthorize: true,
-					success: function(loginRes) {
-						that.codeRes(loginRes.code);
-
-					},
-					fail: (err) => {
-						uni.showToast({
-							title: '绑定失败',
-							icon: "none"
-						});
-					}
-				});
+				if (!this.checked) {
+					this.privacyPolicyValidation = true;
+				} else {
+					uni.login({
+						provider: 'weixin',
+						onlyAuthorize: true,
+						success: function(loginRes) {
+							that.codeRes(loginRes.code);
+
+						},
+						fail: (err) => {
+							uni.showToast({
+								title: '绑定失败',
+								icon: "none"
+							});
+						}
+					});
+				}
+
 			},
 			onzfbAppLogin() {
-				let urls =
-					'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=2021004153668213&scope=auth_user&redirect_uri=https://test.baoxianzhanggui.com/pay/';
-				urls = encodeURIComponent(urls); //将地址编码成浏览器访问的格式
-				plus.runtime.openURL(
-					'alipays://platformapi/startapp?appId=20000067&url=' + urls,
-					res => {
-						//这里写打开URL地址失败后的处理0
-						uni.showModal({
-							content: '本机未检测到对应客户端,是否打开浏览器访问页面?',
-							success: function(res) {
-								if (res.confirm) {
-									//plus.runtime.openURL();
+				this.loginMethod = 'onzfbAppLogin';
+				if (!this.checked) {
+					this.privacyPolicyValidation = true;
+				} else {
+					let urls =
+						'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=2021004153668213&scope=auth_user&redirect_uri=https://test.baoxianzhanggui.com/pay/';
+					urls = encodeURIComponent(urls); //将地址编码成浏览器访问的格式
+					plus.runtime.openURL(
+						'alipays://platformapi/startapp?appId=20000067&url=' + urls,
+						res => {
+							//这里写打开URL地址失败后的处理0
+							uni.showModal({
+								content: '本机未检测到对应客户端,是否打开浏览器访问页面?',
+								success: function(res) {
+									if (res.confirm) {
+										//plus.runtime.openURL();
+									}
 								}
-							}
-						});
-					},
-					'com.eg.android.AlipayGphone'
-				);
+							});
+						},
+						'com.eg.android.AlipayGphone'
+					);
+				}
+
 			},
 			codeRes(code) {
 				this.$login({
@@ -726,6 +763,22 @@
 		}
 	}
 
+	.privacyPolicyValidationclass {
+		padding: 20px;
+
+		.title {
+			font-weight: bold;
+			font-size: 14px;
+			margin-bottom: 10px;
+		}
+
+		.content {
+			font-size: 13px;
+			color: #333;
+			margin-bottom: 20px;
+		}
+	}
+
 	.shu1 {
 		display: flex;
 		flex-direction: column;

+ 68 - 0
pages/login/logoutAgreement.vue

@@ -0,0 +1,68 @@
+<template>
+	<view style="font-size: 14px;line-height: 26px;padding: 32upx;background: #FFFFFF;" class="home1">
+		<!-- 公共组件-每个页面必须引入 -->
+		<public-module></public-module>
+		<view class="u-f-ajc" style="font-size: 16px;font-weight: bold">山西晋掌柜用户注销协议</view>
+		<view style="text-align: left;margin-top: 15upx;font-weight: bold">生效日期:2025年01月14日</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			感谢您使用山西晋掌柜(以下简称“本平台”)的产品与服务。我们非常重视您的个人信息安全与隐私保护。<text
+				style="font-weight: bold;">在您决定注销晋掌柜科技账号之前,请仔细阅读以下协议条款。</text></view>
+		<view style="font-size: 16px;font-weight: bold">1、注销条件</view>
+		<view style="text-align: left;">在申请注销账号前,请确保满足以下条件:</view>
+		<ul>
+			<li>您的账号无任何未提现余额的或未关闭的订单。</li>
+			<li>您的账号未处于任何争议、投诉或调查之中。</li>
+			<li>所有与账号关联的订单均已完成且无后续纠纷。</li>
+		</ul>
+
+		<!-- <view style="text-align: left;text-indent: 2rem;">
+			2.3您应妥善保管您的账户(用户名)和密码,通过您的账户(用户名)和密码操作或实施的行为,将视为您本人的行为,由您本人承担相应的责任和后果。<text
+				style="font-weight: bold;">如果您发现他人不当使用您的账户或有任何其他可能危及您的账户安全的情形时,您应当立即以书面、有效方式通知我们,要求我们暂停相关服务。在此,您理解我们对您的请求采取行动需要合理时间,我们对在采取行动前已经产生的后果(包括但不限于您的任何损失)不承担任何责任。</text>
+		</view> -->
+
+
+		<view style="font-size: 16px;font-weight: bold">2、注销后果</view>
+		<ul>
+			<li>账号一旦注销,您将无法使用该账号登录或访问任何相关数据和服务。</li>
+			<li>注销后,您的个人信息将被删除或匿名化处理,但根据法律规定需保留的相关数据除外。</li>
+			<li>注销账号的操作不可逆,注销后的数据、信息、历史记录等将无法找回。</li>
+		</ul>
+		<view style="font-size: 16px;font-weight: bold">3、信息保留与删除</view>
+		<ul>
+			<li>在注销账号后,我们将根据法律法规的要求保留或删除您的个人信息。</li>
+			<li>对于因法律要求需要保留的个人信息,我们将继续保护其安全,直至删除。</li>
+		</ul>
+		<view style="font-size: 16px;font-weight: bold">4、注销流程</view>
+		<ul>
+			<li><text style="font-weight: bold;">提交申请:</text>通过上述任一方式提交注销申请。</li>
+			<li><text style="font-weight: bold;">信息验证:</text>我们将要求您提供必要的信息以验证您的身份,并确认注销意图。</li>
+			<li><text style="font-weight: bold;">审核处理:</text>系统在收到注销申请后会进行校验,校验完成后将会注销您的账号。</li>
+		</ul>
+		<view style="font-size: 16px;font-weight: bold">5、费用与退款</view>
+		<ul>
+			<li>如账号内存在未提现的余额,您有权在注销前申请提现。提现将付款至您绑定的银行账户,具体到账时间取决于银行或支付平台的处理周期。</li>
+			<li>注销后,如账号内有纠纷的订单,您仍需承担相关责任。</li>
+		</ul>
+		<view style="font-size: 16px;font-weight: bold">6、争议解决</view>
+		<ul>
+			<li>若在账号注销过程中产生任何争议,您可以通过客服联系我们,我们将尽力协助解决。如无法达成一致意见,双方同意将争议提交何鑫商贸所在地有管辖权的法院诉讼解决。</li>
+			<li>联系方式:请您发送电子邮件到 <text style="background-color: yellow;">690068578@qq.com</text>,我们将在15天内回复您的诉求。</li>
+		</ul>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {}
+		},
+		methods: {}
+	}
+</script>
+
+<style>
+	page {
+		background: #FFFFFF;
+	}
+</style>

+ 4 - 3
pages/login/mimi.vue

@@ -6,7 +6,7 @@
 		<view style="text-align: left;margin-top: 15rpx;">更新日期: 2024年06月24日</view>
 		<view style="text-align: left;margin-bottom: 15rpx;">生效日期: 2024年06月24日</view>
 		<view style="text-align: left;text-indent: 2rem;"> 掌柜科技移动设备客户端(掌柜科技APP)网络运营平台以下简称“晋掌柜)
-			由山西掌柜鼎科技有公司(以下简称”我们”或“掌柜科技”。注册地址:山西转型综合改革示范区科技创新城化章北街1号山西数据流量生态园4号楼4层4408-176,)运营本政策适用晋掌柜所提供的保险信息服务、养车服务、网上购物服务、车圈动态服务,以及其他增值服多(以下统称“我们的产品和/或服务"),包括各类保险产品息服务及洗车美容、维修保养、违章查询、充值服务、代驾、
+			由山西掌柜鼎科技有公司(以下简称”我们”或“掌柜科技”。注册地址:山西转型综合改革示范区科技创新城化章北街1号山西数据流量生态园4号楼4层4408-176,)运营本政策适用晋掌柜所提供的保险信息服务、养车服务、网上购物服务、车圈动态服务,以及其他增值服多(以下统称“我们的产品和/或服务"),包括各类保险产品息服务及洗车美容、维修保养、违章查询、充值服务、代驾、
 			预约停车、一键救援、U驾服务、选座观影、车损测算及我们在晋掌柜页面所展示的相关产品和/或服务。
 		</view>
 		<view style="text-align: left;text-indent: 2rem;font-weight: bold;text-decoration: underline;">
@@ -107,8 +107,9 @@
 		<view style="text-align: left;text-indent: 2rem;">当您使用充值服务时,您需要提供<text
 				style="font-weight: bold;text-decoration: underline;">油卡卡号(油卡充值)、手机号码(话费充值)。</text></view>
 		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">2、开展数据分析和研究,改进我们的产品与/或服务所必需的功能</view>
+		<!-- 用来将您可能感兴趣的产品与/或服务信息在晋掌柜展示给您;或在晋掌柜上您搜索时向您展示您可能希望找到的产品与/或服务。 -->
 		<view style="text-align: left;text-indent: 2rem;"><text
-				style="font-weight: bold;text-decoration: underline;">我们可能会收集您的订单信息、设备信息及您因使用晋掌柜所产生的必要信息进行数据分析以形成用户画像,用来将您可能感兴趣的产品与/或服务信息在晋掌柜展示给您;或在晋掌柜上您搜索时向您展示您可能希望找到的产品与/或服务。</text>对于从您的各种设备上收集到的信息,包括您的设备信息(设备型号、崩溃日志、性能日志)及其他相关信息,我们可能会将它们进行关联,以便可以改进我们的产品或服务,并能在这些设备上为您提供一致的服务。
+				style="font-weight: bold;text-decoration: underline;">我们可能会收集您的订单信息、设备信息及您因使用晋掌柜所产生的必要信息。</text>对于从您的各种设备上收集到的信息,包括您的设备信息(设备型号、崩溃日志、性能日志)及其他相关信息,我们可能会将它们进行关联,以便可以改进我们的产品或服务,并能在这些设备上为您提供一致的服务。
 		</view>
 		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">3、保障交易安全所必须的功能</view>
 		<view style="text-align: left;text-indent: 2rem;">
@@ -138,7 +139,7 @@
 		</view>
 		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">2、我们从第三方获得您个人信息的情形</view>
 		<view style="text-align: left;text-indent: 2rem;">
-			为向您提供更优质、全面的服务,您授权我们在法律及相关规定允许的范围内,从我们的关联方、服务提供方及第三方处接收、存储和处理您的相关个人信息,以改善您的服务体验或者为之赋予个性化。如您拒绝授权,可能无法使用全面服务,但不影响您使用晋掌柜的核心功能。
+			为向您提供更优质、全面的服务,您授权我们在法律及相关规定允许的范围内,从我们的关联方、服务提供方及第三方处接收、存储和处理您的相关个人信息。如您拒绝授权,可能无法使用全面服务,但不影响您使用晋掌柜的核心功能。
 		</view>
 		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">(三)您充分知晓,以下情形中,我们收集、使用您的个人信息无需征得您的授权同意:
 		</view>

+ 1 - 1
pages/login/minis.vue

@@ -6,7 +6,7 @@
 		<view style="text-align: left;margin-top: 15rpx;">更新日期: 2024年07月01日</view>
 		<view style="text-align: left;margin-bottom: 15rpx;">生效日期: 2021年07月01日</view>
 		<view style="text-align: left;text-indent: 2rem;"> 掌柜科技移动设备客户端(掌柜科技APP)网络运营平台以下简称“掌柜科技平台)
-			由山西掌柜鼎科技有公司(以下简称”我们”或“掌柜科技”。注册地址:山西转型综合改革示范区科技创新城化章北街1号山西数据流量生态园4号楼4层4408-176,)运营本政策适用掌柜科技平台所提供的保险信息服务、养车服务、网上购物服务、车圈动态服务,以及其他增值服多(以下统称“我们的产品和/或服务"),包括各类保险产品息服务及洗车美容、维修保养、违章查询、充值服务、代驾、
+			由山西掌柜鼎科技有公司(以下简称”我们”或“掌柜科技”。注册地址:山西转型综合改革示范区科技创新城化章北街1号山西数据流量生态园4号楼4层4408-176,)运营本政策适用掌柜科技平台所提供的保险信息服务、养车服务、网上购物服务、车圈动态服务,以及其他增值服多(以下统称“我们的产品和/或服务"),包括各类保险产品息服务及洗车美容、维修保养、违章查询、充值服务、代驾、
 			预约停车、一键救援、U驾服务、选座观影、车损测算及我们在掌柜科技平台页面所展示的相关产品和/或服务。
 		</view>
 		<view style="text-align: left;text-indent: 2rem;font-weight: bold;text-decoration: underline;">

+ 1 - 1
pages/login/xieyi.vue

@@ -6,7 +6,7 @@
 		<view style="text-align: left;margin-top: 15upx;">更新日期: 2024年07月01日</view>
 		<view style="text-align: left;margin-bottom: 15upx;">生效日期: 2024年07月01日</view>
 		<view style="text-align: left;text-indent: 2rem;"> 掌柜科技移动设备客户端(掌柜科技APP) 网络运营平台(以下简称“晋掌柜)
-			由山西省掌柜鼎科技有公司(以下简称”我们”或“掌柜科技”。注册地址:山西转型综合改革示范区科技创新城化章北街1号山西数据流量生态园4号楼4层4408-176,))运营。掌柜科技是一款为车主提供电商、社交与资讯一体化综合服务的APP。<text
+			由山西省掌柜鼎科技有公司(以下简称”我们”或“掌柜科技”。注册地址:山西转型综合改革示范区科技创新城化章北街1号山西数据流量生态园4号楼4层4408-176,))运营。掌柜科技是一款为车主提供电商、社交与资讯一体化综合服务的APP。<text
 				style="font-weight: bold;">本服务协议构成我们与掌柜科技用户(以下称“用户"或"您")之间就掌柜科技提供的全部服务(以下称“掌柜科技服务”)等事宜而订立的契约,请仔细阅读本服务协议,特别是以粗体标识的条款(这些条款可能会明确您应履行的义务或对您的权利有所限制)。如您不同意以下任何内容,请立刻停止访问掌柜科技或使用掌柜科技服务。</text>
 		</view>
 		<view style="font-size: 16px;font-weight: bold">1、总则</view>

+ 1 - 1
pages/my/my.vue

@@ -530,7 +530,7 @@
 			async getInsureCount() {
 				let res = await this.$http.post('/insurance/order/getExpirationInsureCount');
 				if (res.code == '200') {
-					this.InsureCount = res.data;
+					// this.InsureCount = res.data;
 				}
 			},
 			handleScroll(e) {

+ 174 - 0
pages/set/accountCancellation.vue

@@ -0,0 +1,174 @@
+<template>
+	<view class="page">
+		<view class="header dis a-c f-c">
+			<image src="../../static/image/my/zgcx.png" mode=""></image>
+			<text class="name">申请注销晋掌柜账号</text>
+		</view>
+		<view class="content">
+			<view class="mb-4">
+				<text class="p">在您注销账号前,请确保账号内的 <text style="color: #343EEF;">余额</text> 已全部提现,<text
+						style="color: #343EEF;">订单</text> 已全部关闭以保障您的账号,财产安全。</text>
+			</view>
+			<text class="title">注销账号后,将放弃所有资产和权益</text>
+			<ul class="ul">
+				<li>身份、帐号信息、增员关系等资产将清空且无法恢复</li>
+				<li>订单记录、出单员身份、增员关系及收益记录清空</li>
+				<li>帐号一旦被注销将不可恢复,请在操作前自行备份帐号相关的所有信息和数据</li>
+				<li>账号注销前请确认不存在或不需要管理的业务团队,否则一旦注销后将会导致其他产品或服务的必要功能无法实现,你将无法再登录掌柜应用。</li>
+			</ul>
+		</view>
+		<view class="footer dis f-c a-start">
+			<view class="selection">
+				<u-checkbox v-model="checked" style="margin-top: 4px;"></u-checkbox>
+				<text>
+					我已阅读并同意<text @tap="nav('/pages/login/logoutAgreement')" class="text-color">《用户注销协议》</text>
+				</text>
+			</view>
+			<view class="btn dis a-c j-c " @click="accountSubmit">
+				申请注销
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from "vuex"
+	export default {
+		data() {
+			return {
+				checked: false,
+			}
+		},
+		computed: {
+			...mapState(['userInfo']),
+		},
+		onShow() {
+
+		},
+		onLoad() {
+
+		},
+		methods: {
+			...mapMutations(['emptyUserInfo']),
+			nav(url) {
+				uni.navigateTo({
+					url: url
+				});
+			},
+			async accountSubmit() {
+				let _this = this;
+				if (!this.checked) {
+					return uni.showToast({
+						title: '请勾选用户注销协议',
+						icon: 'none'
+					});
+				}
+				uni.showModal({
+					title: '提示',
+					content: '是否要注销账户?',
+					confirmText: '立刻注销',
+					success: async res => {
+						if (res.confirm) {
+							let res = await _this.$http.get('/user/userLogout?userId=' + _this.userInfo
+								.sysUser.id)
+							console.log(res);
+							if (res.code == 200) {
+								uni.showToast({
+									title: res.msg,
+									icon: 'none'
+								});
+								_this.emptyUserInfo();
+								setTimeout(() => {
+									uni.reLaunch({
+										url: "/pages/login/login"
+									})
+									return true;
+								}, 500);
+							} else {
+								uni.showToast({
+									title: res.msg,
+									icon: 'none'
+								});
+							}
+						}
+					},
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	page {
+		background: #fff;
+	}
+
+	.header {
+		border-top: 1px solid #EEEEEE;
+		border-bottom: 1px solid #EEEEEE;
+		padding: 69rpx 69rpx 65rpx;
+
+		image {
+			width: 72rpx;
+			height: 72rpx;
+			margin-bottom: 24rpx;
+
+		}
+
+		.name {
+			font-size: 30rpx;
+			font-weight: bold;
+			color: #333;
+		}
+	}
+
+	.content {
+		padding: 40rpx 40rpx;
+
+		.p {
+			font-size: 28rpx;
+			color: #333;
+		}
+
+		.title {
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #333;
+			margin-top: 60rpx;
+		}
+
+		.ul {
+			li {
+				font-size: 28rpx;
+				color: #666;
+				margin: 30rpx 0;
+			}
+		}
+	}
+
+	.footer {
+		padding: 32rpx;
+
+		.selection {
+			font-size: 28rpx;
+			color: #666;
+			margin-bottom: 40rpx;
+
+			.text-color {
+				color: #343EEF;
+			}
+		}
+
+		.btn {
+			width: 100%;
+			background: #343EEF;
+			border-radius: 6rpx;
+			padding: 16rpx;
+			color: #fff;
+			font-size: 32rpx;
+		}
+	}
+</style>

+ 8 - 1
pages/set/safe.vue

@@ -35,7 +35,14 @@
 						text: '',
 						auth: true
 					},
-
+					{
+						icon: "",
+						name: "账号注销",
+						clicktype: "navigateTo",
+						text: '去注销',
+						url: "/pages/set/accountCancellation",
+						auth: true
+					},
 				],
 
 

BIN
static/image/my/zgcx.png


+ 38 - 0
uni_modules/x-perm-apply-instr/changelog.md

@@ -0,0 +1,38 @@
+## 2.0.3(2024-12-21)
+增加连接蓝牙设备支持 startBluetoothDevicesDiscovery
+## 2.0.2(2024-11-18)
+popup 优化
+## 2.0.1(2024-11-07)
+弹框优化
+## 2.0.0(2024-11-05)
+权限申请说明弹窗修改为顶部原生弹窗,与申请系统权限弹窗同步显示
+## 1.1.5(2024-08-02)
+添加拦截器时增加 once 入参, once 只询问用户一次如果用户不同意申请或同意后拒绝权限将不会再次弹窗
+## 1.1.3(2024-07-30)
+增加 uni.scanCode 支持
+## 1.1.2(2024-07-17)
+chooseImage 和 chooseVideo 的相机和存储权限可以单独申请
+## 1.1.1(2024-06-24)
+优化
+## 1.1.0(2024-06-23)
+增加  startLocationUpdate 支持
+## 1.0.9(2024-04-22)
+1
+## 1.0.8(2024-04-21)
+1
+## 1.0.7(2024-04-21)
+增加 getRecorderManager 拦截支持
+## 1.0.6(2024-04-15)
+文档修改
+## 1.0.5(2024-04-10)
+优化
+## 1.0.4(2024-03-19)
+更新文档
+## 1.0.3(2024-01-16)
+优化
+## 1.0.2(2024-01-03)
+1
+## 1.0.1(2023-12-16)
+解耦
+## 1.0.0(2023-12-14)
+初版

+ 298 - 0
uni_modules/x-perm-apply-instr/js_sdk/index.js

@@ -0,0 +1,298 @@
+import permisionUtil from "./permission.js"
+import { popup } from './native_popup.js'
+
+const prefix = 'permision_'
+const {
+    uniPlatform,
+    platform
+} = uni.getSystemInfoSync()
+
+const permisionMap = {
+    startBluetoothDevicesDiscovery: async function() {
+        try {
+            const status1 = await permisionUtil.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION')
+            const status2 = await permisionUtil.requestAndroidPermission('android.permission.BLUETOOTH_SCAN')
+            const status3 = await permisionUtil.requestAndroidPermission('android.permission.BLUETOOTH_CONNECT')
+            if (status1 == 1 && status2 == 1 && status3 == 1) {
+                return Promise.resolve(1)
+            } else {
+                return Promise.resolve(-1)
+            }
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    scanCode: async function() {
+        try {
+            const status1 = await permisionUtil.requestAndroidPermission('android.permission.CAMERA')
+            const status2 = await permisionUtil.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE')
+            if (status1 == 1 || status2 == 1) {
+                return Promise.resolve(1)
+            } else {
+                return Promise.resolve(-1)
+            }
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    album: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    camera: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.CAMERA')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    chooseFile: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    chooseImage: async function() {
+        try {
+            const status1 = await permisionUtil.requestAndroidPermission('android.permission.CAMERA')
+            const status2 = await permisionUtil.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE')
+            if (status1 == 1 || status2 == 1) {
+                return Promise.resolve(1)
+            } else {
+                return Promise.resolve(-1)
+            }
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    chooseVideo: async function() {
+        try {
+            const status1 = await permisionUtil.requestAndroidPermission('android.permission.CAMERA')
+            const status2 = await permisionUtil.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE')
+            if (status1 == 1 || status2 == 1) {
+                return Promise.resolve(1)
+            } else {
+                return Promise.resolve(-1)
+            }
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    saveImageToPhotosAlbum: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.WRITE_EXTERNAL_STORAGE')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    saveVideoToPhotosAlbum: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.WRITE_EXTERNAL_STORAGE')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    getLocation: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    startLocationUpdate: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    makePhoneCall: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.CALL_PHONE')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    },
+    getRecorderManager: async function() {
+        try {
+            const status = await permisionUtil.requestAndroidPermission('android.permission.RECORD_AUDIO')
+            return Promise.resolve(status)
+        } catch (e) {
+            return Promise.resolve(0)
+        }
+    }
+}
+
+const resultHandler = function(args, err) {
+    args.fail && args.fail(err)
+    args.complete && args.complete(err)
+}
+
+let getRecorderManagerFlag = false
+const _getRecorderManager = uni.getRecorderManager
+
+const gotoAppPermissionSetting = function() {
+    uni.showModal({
+        title: '提示',
+        content: '当前功能需要开启相应权限,是否前往开启?',
+        cancelText: '否',
+        confirmText: '是',
+        success: (res) => {
+            if (res.confirm) {
+                permisionUtil.gotoAppPermissionSetting()
+            }
+        }
+    })
+}
+
+/**
+ * @func addPermisionInterceptor
+ * @desc 添加权限申请说明拦截
+ * @param {String} permisionName 要拦截的 uniApi 名称
+ * @param {String} content 申请权限说明信息
+ * @param {Boolean} once 只询问一次, 用户不同意申请或拒绝权限将无法使用 uniApi, 如果要继续使用 Api 先用 removePermisionInterceptor 函数移除拦截再调用 Api
+ * @return 无
+ * @Author huiliyi
+ * @Email 1824159241@qq.com
+ */
+export const addPermisionInterceptor = function(permisionName, content, once) {
+    if (uniPlatform != 'app' || platform != 'android') return
+    const getRecorderManagerAdapter = function() {
+        const recorder = _getRecorderManager()
+        const _start = recorder.start.bind(recorder)
+        recorder.start = async function(options) {
+            const perm = uni.getStorageSync(prefix + permisionName)
+            if (perm == 1) {
+                _start(options)
+                return
+            }
+            if (once && typeof perm == 'number') {
+                console.error(`用户不同意申请或已拒绝权限`)
+                return
+            }
+            try {
+                popup.show({ content })
+                let status = 0
+                if (permisionMap[permisionName]) {
+                    status = await permisionMap[permisionName]()
+                } else {
+                    status = 1
+                    console.error(`addPermisionInterceptor fail, ${permisionName}-未配置获取权限方法`)
+                }
+                uni.setStorageSync(prefix + permisionName, status)
+                if (status === 1) {
+                    _start(options)
+                }
+                if (status === 0) {
+                    console.error(`申请麦克风权限失败`)
+                }
+                if (status === -1) {
+                    console.error(`用户已拒绝麦克风权限`)
+                    gotoAppPermissionSetting()
+                }
+            } catch (err) {
+                console.error(err)
+            } finally {
+                popup.close()
+            }
+        }
+        return recorder
+    }
+    if (permisionName == 'getRecorderManager') {
+        if (getRecorderManagerFlag) return
+        uni.getRecorderManager = getRecorderManagerAdapter
+        getRecorderManagerFlag = true
+        return
+    }
+    uni.addInterceptor(permisionName, {
+        invoke(args) {
+            if (args.sourceType && Array.isArray(args.sourceType) && args.sourceType.length == 1) permisionName = args.sourceType[0]
+            return new Promise(async (resolve, reject) => {
+                const perm = uni.getStorageSync(prefix + permisionName)
+                if (perm == 1) {
+                    resolve(args)
+                    return
+                }
+                if (once && typeof perm == 'number') {
+                    reject(args)
+                    resultHandler(args, {
+                        errMsg: '用户不同意申请或已拒绝权限'
+                    })
+                    return
+                }
+                try {
+                    popup.show({ content })
+                    let status = 0
+                    if (permisionMap[permisionName]) {
+                        status = await permisionMap[permisionName]()
+                    } else {
+                        status = 1
+                        console.error(`addPermisionInterceptor fail, ${permisionName}-未配置获取权限方法`)
+                    }
+                    uni.setStorageSync(prefix + permisionName, status)
+                    if (status === 1) {
+                        resolve(args)
+                    }
+                    if (status === 0) {
+                        reject(args)
+                        resultHandler(args, {
+                            errMsg: '申请权限失败'
+                        })
+                    }
+                    if (status === -1) {
+                        reject(args)
+                        resultHandler(args, {
+                            errMsg: '用户已拒绝该权限'
+                        })
+                        gotoAppPermissionSetting()
+                    }
+                } catch (err) {
+                    reject(args)
+                    resultHandler(args, err)
+                } finally {
+                    popup.close()
+                }
+            });
+        },
+        success: (res) => {
+            console.log(res);
+        },
+        fail(err) {
+            console.log('interceptor-fail', err)
+            const errMsg = String(err?.errMsg)
+            if (errMsg.includes('fail No Permission') || (errMsg.includes('fail') && errMsg.includes('权限'))) {
+                uni.setStorageSync(prefix + permisionName, 0)
+                gotoAppPermissionSetting()
+            }
+        }
+    })
+}
+
+/**
+ * @func removePermisionInterceptor
+ * @desc 移除权限申请说明拦截
+ * @param {String} permisionName 要移除拦截的 uniApi 名称
+ * @return 无
+ * @Author huiliyi
+ * @Email 1824159241@qq.com
+ */
+export const removePermisionInterceptor = function(permisionName) {
+    if (permisionName == 'getRecorderManager') {
+        getRecorderManagerFlag = false
+        uni.getRecorderManager = _getRecorderManager
+    }
+    uni.removeInterceptor(permisionName)
+    uni.removeStorageSync(prefix + permisionName)
+}

+ 99 - 0
uni_modules/x-perm-apply-instr/js_sdk/native_popup.js

@@ -0,0 +1,99 @@
+export class NativePopup {
+    constructor(options = {}) {
+        this.sysInfo = uni.getSystemInfoSync()
+
+        const { bgColor = '#fff', titleColor = '#000', contentColor = "#272727" } = options
+
+        this.bgColor = bgColor
+        this.titleColor = titleColor
+        this.contentColor = contentColor
+    }
+
+    createPopup = () => {
+        const { statusBarHeight, screenWidth } = this.sysInfo
+
+        const popupView = new plus.nativeObj.View('popupView', {
+            top: 0,
+            left: 0,
+            width: screenWidth,
+            height: 110 + statusBarHeight + 'px',
+            // backgroundColor: 'blue' // debug
+        })
+
+        popupView.addEventListener("click", this.close)
+
+        const bgPadding = 15
+
+        popupView.drawRect({
+            color: 'rgba(0, 0, 0, 0.1)',
+            radius: '10px'
+        }, {
+            top: statusBarHeight + 7 + 'px',
+            left: bgPadding - 2 + 'px',
+            width: screenWidth - bgPadding * 2 + 4 + 'px',
+            height: "100px",
+        })
+
+        popupView.drawRect({
+            color: this.bgColor,
+            radius: '10px'
+        }, {
+            top: statusBarHeight + 5 + 'px',
+            left: bgPadding + 'px',
+            width: screenWidth - bgPadding * 2 + 'px',
+            height: "100px",
+        })
+
+        const padding = 10
+
+        popupView.drawText(this.title, {
+            top: statusBarHeight + 10 + 'px',
+            left: padding + bgPadding + 'px',
+            height: "30px",
+            width: screenWidth - bgPadding * 2 - padding * 2 + 'px',
+        }, {
+            size: "16px",
+            weight: "bold",
+            align: "left",
+            color: this.titleColor,
+        }, {
+            onClick: function(e) {
+                console.log(e);
+            }
+        })
+
+        popupView.drawText(this.content, {
+            top: statusBarHeight + 40 + 'px',
+            height: "60px",
+            left: padding + bgPadding + 'px',
+            width: screenWidth - bgPadding * 2 - padding * 2 + 'px',
+        }, {
+            size: "14px",
+            align: "left",
+            color: this.contentColor,
+            whiteSpace: 'normal',
+        })
+
+        this.popupView = popupView
+
+        return popupView
+    }
+
+    show = (options = {}) => {
+        this.close()
+
+        const { title = '权限申请说明', content = '' } = options
+        this.title = title
+        this.content = content
+
+        this.createPopup()
+
+        this.popupView.show()
+    }
+
+    close = () => {
+        this.popupView && this.popupView.close()
+    }
+}
+
+export const popup = new NativePopup()

+ 276 - 0
uni_modules/x-perm-apply-instr/js_sdk/permission.js

@@ -0,0 +1,276 @@
+/**
+ * 此文件来源于 https://ext.dcloud.net.cn/plugin?id=594 
+ * 没有将该插件声明为依赖是为避免插件作者更新导致使用方式变化, 所以直接拷贝了一份使用, 有问题请联系QQ:1824159241
+ */
+/**
+ * 本模块封装了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
+    }
+}
+
+export default {
+    judgeIosPermission: judgeIosPermission,
+    requestAndroidPermission: requestAndroidPermission,
+    checkSystemEnableLocation: checkSystemEnableLocation,
+    gotoAppPermissionSetting: gotoAppPermissionSetting
+}

+ 87 - 0
uni_modules/x-perm-apply-instr/package.json

@@ -0,0 +1,87 @@
+{
+    "id": "x-perm-apply-instr",
+    "displayName": "权限申请说明、权限申请的使用目的、华为上架、小米上架(无需改动代码、全局处理)",
+    "version": "2.0.3",
+    "description": "安卓权限申请的使用目的说明弹窗, 解决华为、小米等应用商店上架审核不通过问题, 无需改动原本代码逻辑",
+    "keywords": [
+        "权限申请",
+        "权限申请的目的",
+        "权限申请的使用目的",
+        "上架",
+        "华为上架"
+    ],
+    "repository": "",
+    "engines": {
+    },
+    "dcloudext": {
+        "type": "sdk-js",
+        "sale": {
+            "regular": {
+                "price": "0.00"
+            },
+            "sourcecode": {
+                "price": "0.00"
+            }
+        },
+        "contact": {
+            "qq": ""
+        },
+        "declaration": {
+            "ads": "无",
+            "data": "插件不采集任何数据",
+            "permissions": "无"
+        },
+        "npmurl": ""
+    },
+    "uni_modules": {
+        "dependencies": [],
+        "encrypt": [],
+        "platforms": {
+            "cloud": {
+                "tcb": "y",
+                "aliyun": "y",
+                "alipay": "n"
+            },
+            "client": {
+                "Vue": {
+                    "vue2": "y",
+                    "vue3": "y"
+                },
+                "App": {
+                    "app-vue": "y",
+                    "app-nvue": "u",
+                    "app-uvue": "u",
+                    "app-harmony": "u"
+                },
+                "H5-mobile": {
+                    "Safari": "u",
+                    "Android Browser": "u",
+                    "微信浏览器(Android)": "u",
+                    "QQ浏览器(Android)": "u"
+                },
+                "H5-pc": {
+                    "Chrome": "u",
+                    "IE": "u",
+                    "Edge": "u",
+                    "Firefox": "u",
+                    "Safari": "u"
+                },
+                "小程序": {
+                    "微信": "u",
+                    "阿里": "u",
+                    "百度": "u",
+                    "字节跳动": "u",
+                    "QQ": "u",
+                    "钉钉": "u",
+                    "快手": "u",
+                    "飞书": "u",
+                    "京东": "u"
+                },
+                "快应用": {
+                    "华为": "u",
+                    "联盟": "u"
+                }
+            }
+        }
+    }
+}

+ 60 - 0
uni_modules/x-perm-apply-instr/readme.md

@@ -0,0 +1,60 @@
+# x-perm-apply-instr
+
+### 安卓应用申请权限时弹窗告知用户使用目的
+
+## 用法说明, 在main.js引入
+```js
+import { addPermisionInterceptor, removePermisionInterceptor } from '@/uni_modules/x-perm-apply-instr/js_sdk/index.js'
+addPermisionInterceptor('chooseImage', '为了修改个人头像和发布信息图片视频等, 我们需要申请您设备的相机和存储权限')
+addPermisionInterceptor('chooseVideo', '为了发布信息图片视频等, 我们需要申请您设备的相机和存储权限')
+addPermisionInterceptor('saveImageToPhotosAlbum', '为了保存推广海报到手机相册, 我们需要申请您设备的存储权限')
+addPermisionInterceptor('getLocation', '为了根据您的位置展示信息, 我们需要申请您设备的位置权限')
+addPermisionInterceptor('makePhoneCall', '为了联系客服/用户/咨询等, 我们需要申请您设备的拨打电话权限')
+addPermisionInterceptor('getRecorderManager', '为了使用语言消息功能等, 我们需要申请您设备的麦克风权限')
+addPermisionInterceptor('startLocationUpdate', '为了根据您的位置展示信息, 我们需要申请您设备的位置权限')
+addPermisionInterceptor('scanCode', '为了识别二维码信息, 我们需要申请您设备的相机权限')
+```
+
+**addPermisionInterceptor 添加 uniApi 调用拦截**
+
+| 位置	| 类型			| 描述																															| 可选值																												|
+| ----	| -------------	| ------------------------------------------------------------																	 | ------------------------------------------------------------																	 |
+| 0		| String		| 要拦截的 uniApi 名称																											| scanCode、chooseImage、chooseVideo、saveImageToPhotosAlbum、saveVideoToPhotosAlbum、getLocation、startLocationUpdate、makePhoneCall、getRecorderManager、startBluetoothDevicesDiscovery	|
+| 1		| String		| 申请权限说明信息																												| 自定义文本																							|
+| 2		| Boolean		| 只询问一次, 用户不同意申请或拒绝权限将无法使用 uniApi, 如果要继续使用 Api 先用 removePermisionInterceptor 函数移除拦截再调用 Api	| true, false	|
+
+**removePermisionInterceptor 移除 uniApi 调用拦截**
+
+| 位置 | 类型        | 描述                     | 可选值                |
+| ---- | ------------- | ------------------------ | ------------------------ |
+| 0    | String | 要移除拦截的 uniApi 名称 | 同上 |
+
+### 注意, 如果需要拦截 getRecorderManager , 在使用时不要直接在 script 下初始化, 会导致拦截失败, 请在 onLoad 或 onReady 中调用
+
+``` vue
+<script>
+	// 错误写法
+	const recorderManager = uni.getRecorderManager();
+	// 正确写法
+	let recorderManager = null
+    export default {
+		onLoad() {
+			recorderManager = uni.getRecorderManager();
+		}
+    }
+</script>
+```
+
+## 手动控制权限说明弹窗(自行控制显示、关闭逻辑)
+```js
+import { popup } from '@/uni_modules/x-perm-apply-instr/js_sdk/native_popup.js'
+// 显示
+popup.show({
+    title: '权限申请说明',
+    content: '为了xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
+})
+// 关闭
+popup.close()
+```
+
+### 插件如果对你有帮助给个好评吧~