Browse Source

上湾-瓦斯巡检图片压缩,图片暂存提交

lxh 8 hours ago
parent
commit
81000adeee

+ 1 - 1
.hbuilderx/launch.json

@@ -2,7 +2,7 @@
     "version" : "1.0",
     "configurations" : [
         {
-            "playground" : "standard",
+            "playground" : "custom",
             "type" : "uni-app:app-android"
         },
         {

+ 3 - 3
common/service/config.service.js

@@ -7,11 +7,11 @@ if (process.env.NODE_ENV == "development") {
   // BASE_URL = "http://10.248.135.10:9999"; // 大柳塔进
   // BASE_URL = "http://10.248.135.121:9999"; // 活鸡兔井
   // BASE_URL = "http://10.246.63.125:9999"; // 寸草塔二矿
-  BASE_URL = "http://10.246.183.35:9999"; // 乌兰木伦
+  // BASE_URL = "http://10.246.183.35:9999"; // 乌兰木伦
   // BASE_URL = "http://10.120.120.164:9999"; // 察哈素
   // BASE_URL = "http://182.92.126.35:9999"; // 生产环境
-  BASE_URL = "http://172.16.53.16:9999"; //大海则
-  // BASE_URL = "http://10.246.167.205:9999"; //上湾
+  // BASE_URL = "http://172.16.53.16:9999"; //大海则
+  BASE_URL = "http://10.246.167.205:9999"; //上湾
   // BASE_URL = "http://172.30.157.9:9999"; //元子沟
   // BASE_URL = "http://10.246.167.205:9999"; //上湾
 }

+ 197 - 0
components/helang-compress/helang-compress.vue

@@ -0,0 +1,197 @@
+<template>
+	<view class="compress" v-if="canvasId">
+		<canvas :canvas-id="canvasId" :style="{ width: canvasSize.width,height: canvasSize.height}"></canvas>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				pic:'',
+				canvasSize: {
+					width: 0,
+					height: 0
+				},
+				canvasId:""
+			}
+		},
+		mounted() {
+			if(!uni || !uni._helang_compress_canvas){
+				uni._helang_compress_canvas = 1;
+			}else{
+				uni._helang_compress_canvas++;
+			}
+			this.canvasId = `compress-canvas${uni._helang_compress_canvas}`;
+		},
+		methods: {
+			// 压缩
+			compressFun(params) {
+				return new Promise(async (resolve, reject) => {
+					// 等待图片信息
+					let info = await this.getImageInfo(params.src).then(info=>info).catch(()=>null);
+					
+					if(!info){
+						reject('获取图片信息异常');
+						return;
+					}
+					
+					// 设置最大 & 最小 尺寸
+					const maxSize = params.maxSize || 1080;
+					const minSize = params.minSize || 640;
+					
+					// 当前图片尺寸
+					let {width,height} = info;
+					
+					// 非 H5 平台进行最小尺寸校验
+					// #ifndef H5
+					if(width <= minSize && height <= minSize){
+						resolve(params.src);
+						return;
+					}
+					// #endif
+					
+					// 最大尺寸计算
+					if (width > maxSize || height > maxSize) {
+						if (width > height) {
+							height = Math.floor(height / (width / maxSize));
+							width = maxSize;
+						} else {
+							width = Math.floor(width / (height / maxSize));
+							height = maxSize;
+						}
+					}
+					
+					// 设置画布尺寸
+					this.$set(this,"canvasSize",{
+						width: `${width}px`,
+						height: `${height}px`
+					});
+					
+					
+					// Vue.nextTick 回调在 App 有异常,则使用 setTimeout 等待DOM更新
+					setTimeout(() => {
+						const ctx = uni.createCanvasContext(this.canvasId, this);
+						ctx.clearRect(0,0,width, height)
+						ctx.drawImage(info.path, 0, 0, width, height);
+						ctx.draw(false, () => {
+							uni.canvasToTempFilePath({
+								x: 0,
+								y: 0,
+								width: width,
+								height: height,
+								destWidth: width,
+								destHeight: height,
+								canvasId: this.canvasId,
+								fileType: params.fileType || 'png',
+								quality: params.quality || 0.9,
+								success: (res) => {									
+									// 在H5平台下,tempFilePath 为 base64
+									resolve(res.tempFilePath);
+								},
+								fail:(err)=>{
+									reject(null);
+								}
+							},this);
+						});
+					}, 300);
+				});
+			},
+			// 获取图片信息
+			getImageInfo(src){
+				return new Promise((resolve, reject)=>{
+					uni.getImageInfo({
+						src,
+						success: (info)=> {
+							resolve(info);
+						},
+						fail: () => {
+							reject(null);
+						}
+					});
+				});
+			},
+			// 批量压缩
+			compress(params){
+				// index:进度,done:成功,fail:失败
+				let [index,done,fail] = [0,0,0];
+				// 压缩完成的路径集合
+				let paths = [];
+				// 待压缩的图片
+				let waitList = [];
+				if(typeof params.src == 'string'){
+					waitList = [params.src];
+				}else{
+					waitList = params.src;
+				}
+				// 批量压缩方法
+				let batch = ()=>{
+					return new Promise((resolve, reject)=>{
+						// 开始
+						let start = async ()=>{
+							// 等待图片压缩方法返回
+							let path = await next().catch(()=>null);
+							if(path){
+								done++;
+								paths.push(path);
+							}else{
+								fail++;
+							}
+							
+							params.progress && params.progress({
+								done,
+								fail,
+								count:waitList.length
+							});
+							
+							index++;
+							// 压缩完成
+							if(index >= waitList.length){
+								resolve(true);
+							}else{
+								start();
+							}
+						}
+						start();
+					});
+				}
+				// 依次调用压缩方法
+				let next = ()=>{
+					return this.compressFun({
+						src:waitList[index],
+						maxSize:params.maxSize,
+						fileType:params.fileType,
+						quality:params.quality,
+						minSize:params.minSize
+					})
+				}
+				
+				// 全部压缩完成后调用
+				return new Promise(async (resolve, reject)=>{
+					// 批量压缩方法回调
+					let res = await batch();
+					if(res){
+						if(typeof params.src == 'string'){
+							resolve(paths[0]);
+						}else{
+							resolve(paths);
+						}
+					}else{
+						reject(null);
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.compress{
+		position: fixed;
+		width: 12px;
+		height: 12px;
+		overflow: hidden;
+		top: -99999px;
+		left: 0;
+	}
+</style>

+ 159 - 0
components/w-compress/compress.js

@@ -0,0 +1,159 @@
+/**
+ * 图片压缩
+ * @param {String} imgUrl  需要压缩的图片路径
+ * @param {Object} self	必传,当前组件对象
+ * @param {Object} options 压缩参数
+ * 		width: 压缩到多宽,默认图片宽度(待优化,传入宽度,应计算高度)
+ * 		height: 压缩到多高,默认图片高度
+ * 		pixels: 压缩图片的最大分辨率,默认二百万
+ * 		quality: 压缩质量,默认0.8
+ * 		type: 获取的base64类型,默认jpg
+ * 		base64: 是否返回base64,默认true(非H5有效)
+ * @return {Promise}
+ * 		reject
+ * 			code
+ * 				-1: 获取图片信息错误
+ * 				-2: 极大可能创建图片对象出错(h5会出现,出现概率无限接近0)
+ * 				-3: canvas转图片错误(小程序会出现)
+ * 				-4: 图片转base64错误(小程序会出现)
+ */
+
+// 图片分辨率压缩
+const calcImageSize = (res, pixels) => {
+	let imgW, imgH
+	imgW = res.width
+	imgH = res.height
+	
+	let ratio
+	if((ratio = imgW * imgH / pixels) > 1) {
+		ratio = Math.sqrt(ratio)
+		imgW = parseInt(imgW / ratio)
+		imgH = parseInt(imgH / ratio)
+	} else {
+		ratio = 1
+	}
+	
+	return { imgW, imgH }
+}
+
+const urlTobase64 = (url, type) => {
+	return new Promise((resolve, reject) => {
+		uni.getFileSystemManager().readFile({
+			filePath: url,
+			encoding: 'base64',
+			success: res => {
+				let base64 = res.data
+				base64 = `data:image/${type};base64,${base64}`
+				resolve(base64)
+			}
+		})
+	})
+}
+
+const compress = (imgUrl, slef, options={}) => {
+	/*************** 参数默认值 ***************/
+	const MAX_PIXELS = 2000000	// 最大分辨率,宽 * 高 的值
+	const MAX_QUALITY = 0.8	// 压缩质量
+	const IMG_TYPE = 'jpg'
+	const CANVAS_ID = 'compress_canvas'
+	const BASE_64 = false
+	
+	return new Promise((resolve, reject) => {
+		uni.getImageInfo({
+			src: imgUrl,
+			success: res => {
+				let pixels = options.pixels || MAX_PIXELS
+				let quality = options.quality || MAX_QUALITY
+				let type = options.type || IMG_TYPE
+				let canvasId = options.canvasId || CANVAS_ID
+				let isBase64 = options.base64 || BASE_64
+				
+				let { imgW, imgH } = calcImageSize(res, pixels)
+				let w = options.width || imgW
+				let h = options.height || imgH
+				// #ifdef H5
+				type = type == 'jpg' ? 'jpeg' : type,
+				// #endif
+				
+				// #ifndef H5
+				type = type == 'png' ? 'png' : 'jpg',
+				// #endif
+				console.log(`%c 宽: ${w} %c 高: ${h} %c 分辨率: ${w * h} %c 质量: ${quality} %c 类型: ${type}`, 'color:#f00', 'background-color:#f60;color:#fff', 'color:#F00', 'background-color:#f60;color:#fff', 'color:#F00')
+				
+				// #ifdef H5
+				let img = new Image()
+				img.src = res.path
+				img.onload = () => {
+					const canvas = document.createElement('canvas')
+					const ctx = canvas.getContext('2d')
+					canvas.width = w
+					canvas.height = h
+					let drawW = w, drawH = h
+					
+					ctx.drawImage(img, 0, 0, drawW, drawH)
+					
+					let base64 = canvas.toDataURL(`image/${type}`, quality)
+					
+					resolve(base64)
+				}
+				// #endif
+				
+				
+				// 非h5
+				// #ifndef H5
+				slef.height = h
+				slef.width = w
+				
+				slef.$nextTick(function() {
+					let canvas = null
+					if(!canvas) {
+						canvas = uni.createCanvasContext(canvasId, slef)
+					}
+					canvas.drawImage(res.path, 0, 0, w, h)
+					canvas.draw()
+					setTimeout(() => {
+						uni.canvasToTempFilePath({
+							canvasId: canvasId,
+							x: 0,
+							y: 0,
+							width: w,
+							height: h,
+							destWidth: w,
+							destHeight: h,
+							fileType: type,
+							quality: quality,
+							success: file => {
+								if(isBase64) {
+									urlTobase64(file.tempFilePath, type)
+										.then(res => {
+											canvas = null
+											resolve(res)
+										})
+										.catch(e => {
+											reject({
+												code: -4,
+												msg: '图片转base64错误',
+												data: e
+											})
+										})
+								} else {
+									resolve(file.tempFilePath)
+								}
+							},
+							fail: e => {
+								reject({
+									code: -3,
+									msg: 'canvas转图片错误',
+									data: e
+								})
+							}
+						}, slef)
+					}, 500)
+				})
+				// #endif
+			}
+		})
+	})
+}
+
+export default compress

+ 75 - 0
components/w-compress/w-compress.vue

@@ -0,0 +1,75 @@
+<template>
+	<view class="compress__canvas">
+		<!-- #ifndef H5 -->
+		<canvas canvas-id="compress_canvas" :style="{width: width + 'px', height: height + 'px'}"></canvas>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+/**
+ * 使用方法
+ * import WCompress from '@/components/w-compress/compress.js'
+ * components: { WCompress }
+ * <w-compress ref='wCompress' />
+ * this.$refs.wCompress.start(res.tempFilePaths[0]).then().catch()
+ * this.$refs.wCompress.start(res.tempFilePaths).then().catch()
+ */
+import compress from './compress.js'
+export default {
+	name: 'wCompress',
+	data() {
+		return {
+			width: 0,
+			height: 0
+		}
+	},
+	methods: {
+		start(imgUrl, options={}) {
+			return new Promise(async (resolve, reject) => {
+				if(imgUrl instanceof Array) {
+					try{
+						let arr = []
+						for(let i=0; i<imgUrl.length; i++) {
+							let url = await compress(imgUrl[i], this, options)
+							arr.push(url)
+						}
+						
+						resolve(arr)
+					}catch(e){
+						reject(e)
+					}
+					
+					/* let arr = []
+					arr = imgUrl.map(async c => {
+						return await compress(c, this, options)
+					})
+					resolve(arr) */
+					
+					/* let arr = imgUrl.map(c => {
+						return compress(c, this, options)
+					})
+					
+					Promise.all(arr)
+						.then(resolve)
+						.catch(reject) */
+				} else {
+					compress(imgUrl, this, options)
+						.then(resolve)
+						.catch(reject)
+				}
+			})
+		}
+	}
+}
+</script>
+
+<style>
+.compress__canvas {
+	position: absolute;
+	left: 10000px;
+	visibility: hidden;
+	height: 0;
+	overflow: hidden;
+}
+</style>

+ 122 - 122
manifest.json

@@ -1,130 +1,130 @@
 {
-  "name": "智能通风",
-  "appid": "__UNI__2000523",
-  "description": "",
-  "versionName": "2.2.22",
-  "versionCode": 1,
-  "transformPx": false,
-  "app-plus": {
-    "compatible": {
-      "ignoreVersion": true,
-      "runtimeVersion": "4.23,4.29",
-      "compilerVersion": "4.29"
-    },
-    "orientation": [
-      //竖屏正方向
-      "portrait-primary",
-      //竖屏反方向
-      "portrait-secondary",
-      //横屏正方向
-      "landscape-primary",
-      //横屏反方向
-      "landscape-secondary",
-      //自然方向
-      "default"
-    ],
-    /* 5+App特有相关 */
-    "modules": {
-      "VideoPlayer": {},
-      "Camera": {}
+    "name" : "智能通风",
+    "appid" : "__UNI__2000523",
+    "description" : "",
+    "versionName" : "2.2.22",
+    "versionCode" : 1,
+    "transformPx" : false,
+    "app-plus" : {
+        "compatible" : {
+            "ignoreVersion" : true,
+            "runtimeVersion" : "4.23,4.29",
+            "compilerVersion" : "4.29"
+        },
+        "orientation" : [
+            //竖屏正方向
+            "portrait-primary",
+            //竖屏反方向
+            "portrait-secondary",
+            //横屏正方向
+            "landscape-primary",
+            //横屏反方向
+            "landscape-secondary",
+            //自然方向
+            "default"
+        ],
+        /* 5+App特有相关 */
+        "modules" : {
+            "VideoPlayer" : {},
+            "Camera" : {}
+        },
+        /* 模块配置 */
+        "distribute" : {
+            /* 应用发布信息 */
+            "android" : {
+                /* android打包配置 */
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.NFC\"/>",
+                    "<uses-sdk android:minSdkVersion=\"10\"/>",
+                    "<uses-feature android:name=\"android.hardware.nfc\" android:required=\"true\" />",
+                    "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" />",
+                    "<uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />",
+                    "<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />"
+                ]
+            },
+            "ios" : {
+                "dSYMs" : false
+            },
+            /* ios打包配置 */
+            "sdkConfigs" : {
+                "ad" : {},
+                "maps" : {
+                    "amap" : {
+                        "name" : "",
+                        "appkey_ios" : "87f4d2a4a0c42e0c86cf312c8b8154e8",
+                        "appkey_android" : "87f4d2a4a0c42e0c86cf312c8b8154e8"
+                    }
+                },
+                "push" : {}
+            },
+            "splashscreen" : {
+                "iosStyle" : "default"
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "static/desk-img/72 – 1.png",
+                    "xhdpi" : "static/desk-img/96.png",
+                    "xxhdpi" : "static/desk-img/144.png",
+                    "xxxhdpi" : "static/desk-img/192.png"
+                }
+            }
+        },
+        "nativePlugins" : {}
     },
-    /* 模块配置 */
-    "distribute": {
-      /* 应用发布信息 */
-      "android": {
-        /* android打包配置 */
-        "permissions": [
-          "<uses-feature android:name=\"android.hardware.camera\"/>",
-          "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-          "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
-          "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
-          "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-          "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-          "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
-          "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-          "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-          "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-          "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-          "<uses-permission android:name=\"android.permission.INTERNET\"/>",
-          "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
-          "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-          "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-          "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-          "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
-          "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-          "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-          "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
-          "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
-          "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
-          "<uses-permission android:name=\"android.permission.NFC\"/>",
-          "<uses-sdk android:minSdkVersion=\"10\"/>",
-          "<uses-feature android:name=\"android.hardware.nfc\" android:required=\"true\" />",
-          "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
-          "<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" />",
-          "<uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />",
-          "<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />"
-        ]
-      },
-      "ios": {
-        "dSYMs": false
-      },
-      /* ios打包配置 */
-      "sdkConfigs": {
-        "ad": {},
-        "maps": {
-          "amap": {
-            "name": "",
-            "appkey_ios": "87f4d2a4a0c42e0c86cf312c8b8154e8",
-            "appkey_android": "87f4d2a4a0c42e0c86cf312c8b8154e8"
-          }
+    /* SDK配置 */
+    "quickapp" : {},
+    /* 快应用特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx2ba5c5690b35d173",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : true
         },
-        "push": {}
-      },
-      "splashscreen": {
-        "iosStyle": "default"
-      },
-      "icons": {
-        "android": {
-          "hdpi": "static/desk-img/72 – 1.png",
-          "xhdpi": "static/desk-img/96.png",
-          "xxhdpi": "static/desk-img/144.png",
-          "xxxhdpi": "static/desk-img/192.png"
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "有定位功能需要导航定位"
+            }
         }
-      }
     },
-    "nativePlugins": {}
-  },
-  /* SDK配置 */
-  "quickapp": {},
-  /* 快应用特有相关 */
-  "mp-weixin": {
-    "appid": "wx2ba5c5690b35d173",
-    "setting": {
-      "urlCheck": false,
-      "es6": true
+    "h5" : {
+        "title" : "智能通风",
+        "domain" : "myhjdc.cn",
+        "router" : {
+            "mode" : "history"
+        }
     },
-    "permission": {
-      "scope.userLocation": {
-        "desc": "有定位功能需要导航定位"
-      }
-    }
-  },
-  "h5": {
-    "title": "智能通风",
-    "domain": "myhjdc.cn",
-    "router": {
-      "mode": "history"
-    }
-  },
-  "android": {
-    "theme": {
-      "primaryColor": "#000000",
-      "window": {
-        "fullscreen": true,
-        "navigationBarColor": "#000000"
-      }
+    "android" : {
+        "theme" : {
+            "primaryColor" : "#000000",
+            "window" : {
+                "fullscreen" : true,
+                "navigationBarColor" : "#000000"
+            }
+        },
+        "notch" : true
     },
-    "notch": true
-  },
-  "fallbackLocale": "zh-Hans"
+    "fallbackLocale" : "zh-Hans"
 }

+ 10 - 5
npminstall-debug.log

@@ -3,7 +3,7 @@
   registry: 'https://registry.npmmirror.com',
   pkgs: [
     {
-      name: 'uni-app-nfc',
+      name: '@uni-helper/uni-compress-image',
       version: 'latest',
       type: 'tag',
       alias: undefined,
@@ -15,8 +15,8 @@
   cacheDir: 'C:\\Users\\86175\\.npminstall_tarball',
   env: {
     npm_config_registry: 'https://registry.npmmirror.com',
-    npm_config_argv: '{"remain":[],"cooked":["--fix-bug-versions","--china","--userconfig=C:\\\\Users\\\\86175\\\\.cnpmrc","--disturl=https://cdn.npmmirror.com/binaries/node","--registry=https://registry.npmmirror.com","uni-app-nfc"],"original":["--fix-bug-versions","--china","--userconfig=C:\\\\Users\\\\86175\\\\.cnpmrc","--disturl=https://cdn.npmmirror.com/binaries/node","--registry=https://registry.npmmirror.com","uni-app-nfc"]}',
-    npm_config_user_agent: 'npminstall/7.8.0 npm/? node/v18.14.0 win32 x64',
+    npm_config_argv: '{"remain":[],"cooked":["--fix-bug-versions","--china","--userconfig=C:\\\\Users\\\\86175\\\\.cnpmrc","--disturl=https://cdn.npmmirror.com/binaries/node","--registry=https://registry.npmmirror.com","@uni-helper/uni-compress-image"],"original":["--fix-bug-versions","--china","--userconfig=C:\\\\Users\\\\86175\\\\.cnpmrc","--disturl=https://cdn.npmmirror.com/binaries/node","--registry=https://registry.npmmirror.com","@uni-helper/uni-compress-image"]}',
+    npm_config_user_agent: 'npminstall/7.8.0 npm/? node/v16.15.0 win32 x64',
     npm_config_cache: 'C:\\Users\\86175\\.npminstall_tarball',
     NODE: 'C:\\Program Files\\nodejs\\node.exe',
     npm_node_execpath: 'C:\\Program Files\\nodejs\\node.exe',
@@ -50,6 +50,7 @@
     npm_config_sharp_binary_host: 'https://cdn.npmmirror.com/binaries/sharp',
     npm_config_sharp_libvips_binary_host: 'https://cdn.npmmirror.com/binaries/sharp-libvips',
     npm_config_robotjs_binary_host: 'https://cdn.npmmirror.com/binaries/robotjs',
+    npm_config_gl_binary_host: 'https://cdn.npmmirror.com/binaries/gl',
     npm_rootpath: 'D:\\project\\app\\Vent-App',
     INIT_CWD: 'D:\\project\\app\\Vent-App'
   },
@@ -80,7 +81,8 @@
       npm_config_keytar_binary_host: 'https://cdn.npmmirror.com/binaries/keytar',
       npm_config_sharp_binary_host: 'https://cdn.npmmirror.com/binaries/sharp',
       npm_config_sharp_libvips_binary_host: 'https://cdn.npmmirror.com/binaries/sharp-libvips',
-      npm_config_robotjs_binary_host: 'https://cdn.npmmirror.com/binaries/robotjs'
+      npm_config_robotjs_binary_host: 'https://cdn.npmmirror.com/binaries/robotjs',
+      npm_config_gl_binary_host: 'https://cdn.npmmirror.com/binaries/gl'
     },
     '@ali/s2': { host: 'https://cdn.npmmirror.com/binaries/looksgood-s2' },
     sharp: { replaceHostFiles: [Array], replaceHostMap: [Object] },
@@ -119,7 +121,10 @@
     },
     fsevents: { host: 'https://cdn.npmmirror.com/binaries/fsevents' },
     nodejieba: { host: 'https://cdn.npmmirror.com/binaries/nodejieba' },
-    canvas: { host: 'https://cdn.npmmirror.com/binaries/canvas' },
+    canvas: {
+      host: 'https://cdn.npmmirror.com/binaries/canvas',
+      remote_path: 'v{version}'
+    },
     'skia-canvas': { host: 'https://cdn.npmmirror.com/binaries/skia-canvas' },
     'flow-bin': {
       replaceHost: 'https://github.com/facebook/flow/releases/download/v',

+ 17 - 12
package.json

@@ -1,13 +1,18 @@
 {
-  "dependencies": {
-    "crypto-js": "^4.2.0",
-    "dayjs": "^1.11.10",
-    "echarts": "^5.5.1",
-    "flv.js": "^1.6.2",
-    "moment": "^2.30.1",
-    "string-similarity": "^4.0.4",
-    "uview-ui": "^2.0.36",
-    "vuex": "^3.6.2",
-    "zrender": "^5.6.0"
-  }
-}
+    "id": "helang-compress",
+    "name": "图片压缩 - 可以自定义压缩尺寸和压缩质量",
+    "displayName": "图片压缩 - 可以自定义压缩尺寸和压缩质量",
+    "version": "1.1.5",
+    "description": "简单实用的图片压缩插件,对大体积图片的压缩率显著。能大大的提高图片上传速度。",
+    "keywords": [
+        "图片",
+        "压缩",
+        "批量压缩"
+    ],
+    "dcloudext": {
+        "category": [
+            "前端组件",
+            "通用组件"
+        ]
+    }
+}

+ 40 - 11
pages/gasreport/components/gasImgIdentify.vue

@@ -19,6 +19,7 @@
                     <u-button icon="trash" type="primary" size="small" style="width:49%;margin:0"
                         @click="delSb">删除</u-button>
                 </view>
+                <helang-compress ref="helangCompress"></helang-compress>
             </view>
         </view>
 
@@ -127,8 +128,12 @@ import api from "@/api/api";
 import moment from 'moment'
 import configService from '@/common/service/config.service.js'
 import { RHFselcet } from '@/uni_modules/fz-media-selcet';
+import helangCompress from '@/components/helang-compress/helang-compress';
 export default {
     name: 'gasFill',
+    components: {
+        helangCompress
+    },
     props: {
         Ids: {
             type: String,
@@ -308,13 +313,12 @@ export default {
             }
             RHFselcet.getPicture(parameter, (data) => {
                 let arrData = data.mediaArray
-                let list = []
-                // let jsonData = JSON.stringify(arrData)
                 console.log(arrData)
                 that.imageSrc = arrData[0].Pathurl
                 that.imageSrcList = arrData[0].path
-                list.push(arrData[0].Pathurl)
-                that.tempFilePaths = list
+                that.tempFilePaths = []
+                that.tempFilePaths.push(that.imageSrc)
+                uni.setStorageSync(that.deviceID, that.imageSrc);
             });
         },
         //点击返回上一级
@@ -329,16 +333,26 @@ export default {
                 current: 0
             });
         },
-        //获取图片识别数据
-        getGasIdentify() {
+        //压缩图片
+        getScale() {
             let that = this
-            if (that.imageSrc) {
+            // 单张压缩
+            that.$refs.helangCompress.compress({
+                src: that.imageSrc,
+                maxSize: 800,
+                fileType: 'png',
+                quality: 0.85,
+                minSize: 640 //最小压缩尺寸,图片尺寸小于该时值不压缩,非H5平台有效。若需要忽略该设置,可设置为一个极小的值,比如负数。
+            }).then((res) => {
+                console.log(res, '9900===')
+                that.imageSrc = res
+                // 压缩成功回调
                 that.loading = true
                 let jcNum = that.deviceName.indexOf('第三次') != -1 ? 3 : null
                 let apiUrlImg = `${configService.apiUrlP.substring(0, configService.apiUrlP.lastIndexOf(':'))}:6006`
                 uni.uploadFile({
                     url: `${apiUrlImg}/gasIdentify`,
-                    filePath: that.imageSrcList,
+                    filePath: that.imageSrc,
                     name: 'img',
                     formData: {
                         'user': that.username,
@@ -622,10 +636,10 @@ export default {
                                     bc: that.classType || '',
                                     count: that.checkNum == '1' ? '第一次' : that.checkNum == '2' ? '第二次' : '',
                                     jcdd: that.deviceName || '',
-                                    jcy:  that.username,
+                                    jcy: that.username,
                                     time: '',
                                     ch4: '',
-                                    co2:  '',
+                                    co2: '',
                                     co: '',
                                     o2: '',
                                     jw: that.isSensor == '1' ? '0' : '-',
@@ -644,6 +658,21 @@ export default {
                         that.loading = false
                     }
                 });
+
+            }).catch((err) => {
+                // 压缩失败回调
+                uni.showToast({
+                    title: '压缩失败!',
+                    icon: 'none' // 可选图标,'success', 'loading', 'none'
+                });
+                that.loading = false
+            })
+        },
+        //获取图片识别数据
+        getGasIdentify() {
+            let that = this
+            if (that.imageSrc) {
+                that.getScale()
             } else {
                 uni.showToast({
                     title: '请选择上传图片!',
@@ -651,7 +680,7 @@ export default {
                 });
             }
 
-          
+
 
         },
         // // 选择图片的方法

+ 3 - 3
pages/gasreport/components/popupModal.vue

@@ -32,8 +32,8 @@ export default {
     data() {
         return {
             indexList: [
-                { id: 1, label: '瓦斯巡检记录卡管理', },
-                // { id: 1, label: '图片识别', },
+                // { id: 1, label: '瓦斯巡检记录卡管理', },
+                { id: 1, label: '图片识别', },
                 {
                     id: 2, label: '巡检任务面板', children: [
                         { label: '早班', },
@@ -41,7 +41,7 @@ export default {
                         { label: '夜班' },
                     ]
                 },
-                { id: 3, label: '瓦斯巡检填报' },
+                // { id: 3, label: '瓦斯巡检填报' },
             ],
         }
     },

+ 21 - 10
pages/gasreport/components/taskBoardAddress.vue

@@ -2,18 +2,18 @@
     <view class="taskBoardAddress">
         <u-navbar :bgStatusImage="backPic0" :bgImage="backPic" :title="gasTitle" :safeAreaInsetTop="true"
             leftIcon="arrow-left" @leftClick="handlerToggle"> </u-navbar>
-        <u-list :height="666" :scrollTop="topH" 
-            v-if="isShow">
+        <u-list :height="666" :scrollTop="topH" v-if="isShow">
             <u-list-item v-for="(item, index) in indexList" :key="index">
-                <u-cell icon="share" @click="getBoradAddress(item, index)">
+                <u-cell icon="share" >
                     <view slot="title" class="u-slot-title">
                         <text class="u-cell-text">{{ `${item.deviceName} (${item.checkNum == '1' ? '第一次' :
                             item.checkNum == '2' ? '第二次' : ''})` }}</text>
                         <!-- <u-tag text="查看" plain size="mini" type="warning">
                         </u-tag> -->
                     </view>
-                    <view slot="value">
-                        <u-icon :name="item.checkState == '0' ? 'plus' : 'checkmark'" size="16"></u-icon>
+                    <view slot="value" style="display: flex;align-items: center;">
+                        <u-icon :name="item.checkState == '0' ? 'plus' : 'checkmark'" size="16" @click="getBoradAddress(item, index)"></u-icon>
+                        <u-icon style="margin-left:10px" name="photo" size="16" @click="getView(item)"></u-icon>
                     </view>
                 </u-cell>
             </u-list-item>
@@ -40,8 +40,9 @@ export default {
 
     data() {
         return {
-            topH:0,
-            activeIndex:0,
+            imgList: [],
+            topH: 0,
+            activeIndex: 0,
             Ids: '',
             checkNum: '',//巡检次数
             classType: '',
@@ -70,10 +71,20 @@ export default {
         handlerToggle() {
             this.$emit('getBackBoard')
         },
-      
+        //暂存图片预览
+        getView(item) {
+            this.imgList = []
+            this.imgList.push(uni.getStorageSync(item.deviceId))
+            // 预览图片
+            uni.previewImage({
+                urls: this.imgList,
+                current: 0
+            });
+        },
+
         getBoradAddress(item, index) {
             let that = this
-            that.activeIndex=index
+            that.activeIndex = index
             if (item.checkState == '0') {
                 that.isShow = false
                 that.Ids = item.id
@@ -97,7 +108,7 @@ export default {
         getBackAddress() {
             this.isShow = true
             this.toComponent = ''
-            this.topH = 39*this.activeIndex
+            this.topH = 39 * this.activeIndex
             this.taskDetailsLists()
         },
 

+ 2 - 2
pages/gasreport/gasreport.vue

@@ -37,9 +37,9 @@ export default {
             backPic: "url(../../static/topnavbar.png)",
             gasTitle: '瓦斯日报',//标题
             showModel: false,//是否打开弹出层
-            loadComponent: 'gasFill',//默认加载组件
+            // loadComponent: 'gasFill',//默认加载组件
             // loadComponent: 'gasImgIdentify',//默认加载组件
-            // loadComponent: 'taskBoard',//默认加载组件
+            loadComponent: 'taskBoard',//默认加载组件
             taskTj: {},
             firstAddress: '',//一次线路
             secondAddress: '',//二次线路