From 44607f9b0c30cba2e061ddab29b8435520cc2b47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E5=BE=AE=E4=B8=80=E7=AC=91?= <709648985@qq.com> Date: Thu, 19 Mar 2026 15:18:59 +0800 Subject: [PATCH] =?UTF-8?q?100J=E6=9B=B4=E6=96=B0=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- uni_modules/xe-upload/tools/tools.js | 360 +++++----- utils/Common.js | 980 +++++++++++++-------------- 2 files changed, 670 insertions(+), 670 deletions(-) diff --git a/uni_modules/xe-upload/tools/tools.js b/uni_modules/xe-upload/tools/tools.js index 27d2fa6..28009b7 100644 --- a/uni_modules/xe-upload/tools/tools.js +++ b/uni_modules/xe-upload/tools/tools.js @@ -1,180 +1,180 @@ -// eslint-disable -export const isObject = (obj) => { - return obj - ? Object.prototype.toString.call(obj) === "[object Object]" - : false; -}; -export const isArray = (arr) => { - return arr ? Array.isArray(arr) : false; -}; -/** - * handle async await - * @param {*} promise promise - */ -export const awaitWrap = (promise) => - promise.then((res) => [null, res]).catch((err) => [err, {}]); -/** - * 深拷贝 - * @param {*} source - */ -export const deepClone = (source) => { - if (!isObject(source) && !isArray(source)) return source; - const targetObj = isArray(source) ? [] : {}; // 判断复制的目标是数组还是对象 - for (let keys in source) { - // 遍历目标 - if (source.hasOwnProperty(keys)) { - if (source[keys] && typeof source[keys] === "object") { - // 如果值是对象,就递归一下 - targetObj[keys] = isArray(source[keys]) ? [] : {}; - targetObj[keys] = deepClone(source[keys]); - } else { - // 如果不是,就直接赋值 - targetObj[keys] = source[keys]; - } - } - } - return targetObj; -}; -/** - * @description JS对象深度合并 - * @param {object} target 需要拷贝的对象 - * @param {object} source 拷贝的来源对象 - * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象) - */ -export const deepMerge = (target = {}, source = {}) => { - target = deepClone(target); - if (typeof target !== "object" || typeof source !== "object") return false; - for (const prop in source) { - if (!source.hasOwnProperty(prop)) continue; - if (prop in target) { - if (typeof target[prop] !== "object") { - target[prop] = source[prop]; - } else if (typeof source[prop] !== "object") { - target[prop] = source[prop]; - } else if (target[prop].concat && source[prop].concat) { - target[prop] = target[prop].concat(source[prop]); - } else { - target[prop] = deepMerge(target[prop], source[prop]); - } - } else { - target[prop] = source[prop]; - } - } - return target; -}; -/** - * 将File对象转为 Blob Url - * @param {File} File对象 - * @returns Blob Url - */ -export const fileToBlob = (file) => { - if (!file) return; - const fileType = file.type; - const blob = new Blob([file], { type: fileType || 'application/*' }); - const blobUrl = window.URL.createObjectURL(blob); - return blobUrl; -}; -/** - * 将File对象转为 base64 - * @param {File} File对象 - * @returns base64 - */ -export const fileToBase64 = (file) => { - if (!file) return; - return new Promise((r, j) => { - const reader = new FileReader(); - reader.onloadend = () => { - const base64String = reader.result; - r(base64String); - }; - reader.onerror = () => { - j({ mode: 'fileToBase64', data: { errMsg: 'File to base64 fail.' } }); - }; - reader.readAsDataURL(file); - }); -}; -/** - * base64转临时路径(改自https://github.com/zhetengbiji/image-tools/blob/master/index.js) - * @param base64 - * @returns - */ -function dataUrlToBase64(str) { - var array = str.split(','); - return array[array.length - 1]; -}; -function biggerThan(v1, v2) { - var v1Array = v1.split('.'); - var v2Array = v2.split('.'); - var update = false; - for (var index = 0; index < v2Array.length; index++) { - var diff = v1Array[index] - v2Array[index]; - if (diff !== 0) { - update = diff > 0; - break; - } - } - return update; -}; -var index = 0; -function getNewFileId() { - return Date.now() + String(index++); -}; -export const base64ToPath = (base64, name = '') => { - return new Promise((r, j) => { - if (typeof plus !== 'object') { - return j(new Error('not support')); - } - var fileName = ''; - if (name) { - const names = name.split('.'); - const extName = names.splice(-1); - fileName = `${names.join('.')}-${getNewFileId()}.${extName}`; - } else { - const names = base64.split(',')[0].match(/data\:\S+\/(\S+);/); - if (!names) { - j(new Error('base64 error')); - } - const extName = names[1]; - fileName = `${getNewFileId()}.${extName}`; - } - var basePath = '_doc'; - var dirPath = 'uniapp_temp'; - var filePath = `${basePath}/${dirPath}/${fileName}`; - if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) { - plus.io.resolveLocalFileSystemURL(basePath, function (entry) { - entry.getDirectory(dirPath, { - create: true, - exclusive: false, - }, function (entry) { - entry.getFile(fileName, { - create: true, - exclusive: false, - }, function (entry) { - entry.createWriter(function (writer) { - writer.onwrite = function () { - r(filePath); - } - writer.onerror = j; - writer.seek(0); - writer.writeAsBinary(dataUrlToBase64(base64)); - }, j) - }, j) - }, j) - }, j) - return; - } - var bitmap = new plus.nativeObj.Bitmap(fileName); - bitmap.loadBase64Data(base64, function () { - bitmap.save(filePath, {}, function () { - bitmap.clear(); - r(filePath); - }, function (error) { - bitmap.clear(); - j(error); - }); - }, function (error) { - bitmap.clear(); - j(error); - }); - }); -}; +// eslint-disable +export const isObject = (obj) => { + return obj + ? Object.prototype.toString.call(obj) === "[object Object]" + : false; +}; +export const isArray = (arr) => { + return arr ? Array.isArray(arr) : false; +}; +/** + * handle async await + * @param {*} promise promise + */ +export const awaitWrap = (promise) => + promise.then((res) => [null, res]).catch((err) => [err, {}]); +/** + * 深拷贝 + * @param {*} source + */ +export const deepClone = (source) => { + if (!isObject(source) && !isArray(source)) return source; + const targetObj = isArray(source) ? [] : {}; // 判断复制的目标是数组还是对象 + for (let keys in source) { + // 遍历目标 + if (source.hasOwnProperty(keys)) { + if (source[keys] && typeof source[keys] === "object") { + // 如果值是对象,就递归一下 + targetObj[keys] = isArray(source[keys]) ? [] : {}; + targetObj[keys] = deepClone(source[keys]); + } else { + // 如果不是,就直接赋值 + targetObj[keys] = source[keys]; + } + } + } + return targetObj; +}; +/** + * @description JS对象深度合并 + * @param {object} target 需要拷贝的对象 + * @param {object} source 拷贝的来源对象 + * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象) + */ +export const deepMerge = (target = {}, source = {}) => { + target = deepClone(target); + if (typeof target !== "object" || typeof source !== "object") return false; + for (const prop in source) { + if (!source.hasOwnProperty(prop)) continue; + if (prop in target) { + if (typeof target[prop] !== "object") { + target[prop] = source[prop]; + } else if (typeof source[prop] !== "object") { + target[prop] = source[prop]; + } else if (target[prop].concat && source[prop].concat) { + target[prop] = target[prop].concat(source[prop]); + } else { + target[prop] = deepMerge(target[prop], source[prop]); + } + } else { + target[prop] = source[prop]; + } + } + return target; +}; +/** + * 将File对象转为 Blob Url + * @param {File} File对象 + * @returns Blob Url + */ +export const fileToBlob = (file) => { + if (!file) return; + const fileType = file.type; + const blob = new Blob([file], { type: fileType || 'application/*' }); + const blobUrl = window.URL.createObjectURL(blob); + return blobUrl; +}; +/** + * 将File对象转为 base64 + * @param {File} File对象 + * @returns base64 + */ +export const fileToBase64 = (file) => { + if (!file) return; + return new Promise((r, j) => { + const reader = new FileReader(); + reader.onloadend = () => { + const base64String = reader.result; + r(base64String); + }; + reader.onerror = () => { + j({ mode: 'fileToBase64', data: { errMsg: 'File to base64 fail.' } }); + }; + reader.readAsDataURL(file); + }); +}; +/** + * base64转临时路径(改自https://github.com/zhetengbiji/image-tools/blob/master/index.js) + * @param base64 + * @returns + */ +function dataUrlToBase64(str) { + var array = str.split(','); + return array[array.length - 1]; +}; +function biggerThan(v1, v2) { + var v1Array = v1.split('.'); + var v2Array = v2.split('.'); + var update = false; + for (var index = 0; index < v2Array.length; index++) { + var diff = v1Array[index] - v2Array[index]; + if (diff !== 0) { + update = diff > 0; + break; + } + } + return update; +}; +var index = 0; +function getNewFileId() { + return Date.now() + String(index++); +}; +export const base64ToPath = (base64, name = '') => { + return new Promise((r, j) => { + if (typeof plus !== 'object') { + return j(new Error('not support')); + } + var fileName = ''; + if (name) { + const names = name.split('.'); + const extName = names.splice(-1); + fileName = `${names.join('.')}-${getNewFileId()}.${extName}`; + } else { + const names = base64.split(',')[0].match(/data\:\S+\/(\S+);/); + if (!names) { + j(new Error('base64 error')); + } + const extName = names[1]; + fileName = `${getNewFileId()}.${extName}`; + } + var basePath = '_doc'; + var dirPath = 'uniapp_temp'; + var filePath = `${basePath}/${dirPath}/${fileName}`; + if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) { + plus.io.resolveLocalFileSystemURL(basePath, function (entry) { + entry.getDirectory(dirPath, { + create: true, + exclusive: false, + }, function (entry) { + entry.getFile(fileName, { + create: true, + exclusive: false, + }, function (entry) { + entry.createWriter(function (writer) { + writer.onwrite = function () { + r(filePath); + } + writer.onerror = j; + writer.seek(0); + writer.writeAsBinary(dataUrlToBase64(base64)); + }, j) + }, j) + }, j) + }, j) + return; + } + var bitmap = new plus.nativeObj.Bitmap(fileName); + bitmap.loadBase64Data(base64, function () { + bitmap.save(filePath, {}, function () { + bitmap.clear(); + r(filePath); + }, function (error) { + bitmap.clear(); + j(error); + }); + }, function (error) { + bitmap.clear(); + j(error); + }); + }); +}; diff --git a/utils/Common.js b/utils/Common.js index f2b829c..e4be06d 100644 --- a/utils/Common.js +++ b/utils/Common.js @@ -1,491 +1,491 @@ -import request from "@/utils/request.js"; -export default { - audioStorageKey: "audioStorageKey", - pcmStorageKey: "pcmStorageKey", - guid: function generateUUID() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - let r = Math.random() * 16 | 0; - let v = c === 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); - }, - alert: function(title, content, callback) { - if (!title) { - title = '提示' - } - if (!content) { - content = title; - } - - uni.showModal({ - title: title, - content: content, - success: function(res) { - if (res.confirm) { - console.log('用户点击确定'); - } else if (res.cancel) { - console.log('用户点击取消'); - } - - if (callback) { - callback(res); - } - } - }); - }, - - showLoading: function(title, mask) { - uni.showLoading({ - title: title, - mask: mask, - }) - }, - hideLoading: function() { - uni.hideLoading(); - }, - showToast: function(title, mask, duration, callback) { - if (!duration) { - duration = 1500; - } - if (mask == undefined) { - mask = false; - } - uni.showToast({ - title: title, - mask: mask, - duration: duration, - callback: callback, - icon: 'none' - }) - }, - GetData: function(url, data, method, contentType, succ, err, complete) { - var these = this; - if (!url) { - console.error("url为空"); - return; - } - - if (url.toLowerCase().indexOf('http://') == -1 || url.toLowerCase().indexOf('https://') == -1) { - if (url.indexOf('/') == 0) { - url = url.substr(1, url.length - 1); - } - let ServerPath = these.DevApi; - if (these.Version === 'Dev') { - ServerPath = these.DevApi; - } else if (these.Version === 'Uat') { - ServerPath = these.UatApi; - } else if (these.Version === 'Relese') { - ServerPath = these.ReleseApi; - } else { - these.DevApi - } - url = ServerPath + url; - } - - var these = this; - if (!method) { - method = 'POST'; - } - method = method.toUpperCase(); - - if (!contentType) { - contentType = 'application/json;charset=UTF-8'; - } - - these.checkLAN( - - function() { - these.showLoading('请稍候..', true); - setTimeout(function() { - uni.request({ - url: url, - data: data, - header: { - "Content-Type": contentType - }, - method: method, - timeout: 60000, - dataType: 'json', - success: function(json) { - - if (succ) { - succ(json); - } - }, - fail: function(ex) { - - if (err) { - err(ex); - } - }, - complete: function() { - - if (complete) { - complete(); - } - } - }); - - }, 0); - - } - - , - function() { - these.showToast('无网络连接'); - }); - }, - checkLAN: function(succ, error) { - uni.getNetworkType({ - success: (res) => { - let networkType = res.networkType; - - - // 判断网络是否连接 - if (networkType === 'none') { - console.error('无网络连接') - if (error) { - error(); - } - } else { - if (succ) { - succ(); - } - - } - }, - fail: (err) => { - console.error('获取网络状态失败:', err); - if (error) { - error(); - } - } - }); - - }, - DateFormat: function(date, format) { - if (!date) { - date = new Date(); - } - if (!format) { - format = 'yyyy-MM-dd HH:mm:ss'; - } - // 处理参数默认值 - if (typeof date === 'string' || typeof date === 'number') { - date = new Date(date); - } - date = date instanceof Date ? date : new Date(); - format = format || 'yyyy-MM-dd'; - - // 检查日期是否有效 - if (isNaN(date.getTime())) { - return 'Invalid Date'; - } - - // 定义格式化映射 - let formatMap = { - 'yyyy': date.getFullYear(), - 'MM': String(date.getMonth() + 1).padStart(2, '0'), - 'dd': String(date.getDate()).padStart(2, '0'), - 'HH': String(date.getHours()).padStart(2, '0'), - 'mm': String(date.getMinutes()).padStart(2, '0'), - 'ss': String(date.getSeconds()).padStart(2, '0'), - 'SSS': String(date.getMilliseconds()).padStart(3, '0'), - 'M': date.getMonth() + 1, - 'd': date.getDate(), - 'H': date.getHours(), - 'm': date.getMinutes(), - 's': date.getSeconds(), - 'S': date.getMilliseconds() - }; - - // 替换格式字符串中的占位符 - return format.replace(/(yyyy|MM|dd|HH|mm|ss|SSS|M|d|H|m|s|S)/g, (match) => { - return formatMap[match]; - }); - }, - getdeviceShareId(id) { //获取设备分享信息 - return request({ - url: `/app/deviceShare/${id}`, - method: 'get', - }) - }, - getPermissions(type) { - if (!type) { - type = '6170'; - } - let array = [{ - value: "1", - label: "灯光模式", - checked: false, - type: ['6170', '670','102','6155','650','7305','6075'] - }, - { - value: "2", - label: "激光模式", - checked: false, - type: ['6170','6075'] - }, - { - value: "3", - label: "开机画面", - checked: false, - type: ['210', '6170', '670','6155','650','7305','6075'] - }, - { - value: "4", - label: "人员信息登记", - checked: false, - type: ['210', '6170', '670','6155','650','7305','6075'] - }, - { - value: "5", - label: "发送信息", - checked: false, - type: ['210', '6170', '670','6075'] - }, - { - value: "6", - label: "产品信息", - checked: false, - type: ['210', '6170', '670'] - }, { - value: "41", - label: "静电探测", - checked: false, - type: ['670','650'] - }, { - value: "42", - label: "SOS", - checked: false, - type: ['670','4877','6075'] - }, - { - value: "43", - label: "联机设备", - checked: false, - type: ['210'] - }, - { - value: "44", - label: "报警声音", - checked: false, - type: ['210'] - }, - { - value: "45", - label: "自动报警", - checked: false, - type: ['210'] - }, - { - value: "46", - label: "手动报警", - checked: false, - type: ['210','102'] - }, - { - value: "47", - label: "报警时长", - checked: false, - type: ['210'] - }, - { - value: "48", - label: "物体感应", - checked: false, - type: ['102'] - }, - { - value: "49", - label: "联机模式", - checked: false, - type: ['102'] - }, - - { - value: "50", - label: "报警模式", - checked: false, - type: ['100','100J'] - }, - - { - value: "51", - label: "警示灯", - checked: false, - type: ['100','100J'] - }, - - { - value: "52", - label: "语音管理", - checked: false, - type: ['100','100J'] - }, - - { - value: "53", - label: "箭头模式", - checked: false, - type: ['4877'] - }, - { - value: "54", - label: "配组设置", - checked: false, - type: ['4877'] - }, - { - value: "55", - label: "修改信道", - checked: false, - type: ['4877'] - }, - { - value: "56", - label: "灯光类型设置", - checked: false, - type: ['100J'] - }, - ] - - let arr = []; - for (let i = 0; i < array.length; i++) { - let item = array[i]; - if (!item) { - continue; - } - if (!item.type) { - continue; - } - let typeContais = item.type.find(v => { - return v.includes(type); - }); - if (typeContais) { - let json = {}; - Object.assign(json, item); - arr.push(json); - } - } - return arr; - }, - //10进制转换为16进制字符串 - decimalToHexLittleEndian(num, byteCount, revers) { - // 处理负数(如果需要支持负数,可先转为补码) - if (num < 0) { - num = 0xFFFFFFFF + num + 1; - } - - // 转为16进制,去除前缀0x,转为大写 - let hex = num.toString(16).toUpperCase(); - - // 计算需要补充的0的数量,确保每个字节占2位 - let padLength = (byteCount || Math.ceil(hex.length / 2) * 2) - hex.length; - if (padLength > 0) { - hex = '0'.repeat(padLength) + hex; - } - - // 分割为字节数组(每2位一个字节) - let bytes = []; - for (let i = 0; i < hex.length; i += 2) { - bytes.push(hex.substr(i, 2)); - } - - // 是否反转字节顺序(低位在前)并拼接 - if (revers) { - return bytes.reverse().join(''); - } - return bytes.join(''); - }, - //将相对路径的文件移动到_downloads文件夹中 - moveFileToDownloads(tempFilePath) { - - - return new Promise((resolve, reject) => { - if(!tempFilePath){ - console.log("无文件需要移动"); - resolve(tempFilePath); - return; - } - //本来就在此目录时直接返回 - if (tempFilePath.indexOf("_downloads") === 0) { - console.log("文件已存在,无需移动"); - resolve(tempFilePath); - return; - } - //不是app直接返回 - if (!uni.getSystemInfoSync().uniPlatform.includes('app')) { - resolve('仅支持 App 端操作'); - return; - } - // console.log("tempFilePath=", tempFilePath); - var srcPath = plus.io.convertLocalFileSystemURL(tempFilePath); - // console.log("srcPath=", srcPath); - plus.io.resolveLocalFileSystemURL(srcPath, - (fileEntry) => { - - plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS, (fs) => { - // console.log("fs=",fs.name); - // console.log("fs=",fs.root.fullPath); - - fileEntry.moveTo(fs.root, fileEntry.name, (entry) => { - console.log("entry=", entry); - let relativePath = `_downloads/${entry.name}`; - resolve(relativePath); - - }, (ex) => { - reject(ex) - }); - - - }, (e) => { - console.error("请求download目录失败 " + e); - reject(e); - }); - }, - (error) => { - console.log('文件不存在/路径错误:', error.message); // 核心问题! - } - ); - }); - }, - - getOSAndUpload(){ - let os=uni.getSystemInfoSync().platform; - let url='' - if(os==='ios'){ - url='https://apps.apple.com/cn/app/星汉物联/id6752555460' - } - - else if(os==='android'){ - url='https://www.pgyer.com/xhwl'; - } - return {os:os,url:url}; - }, - - - //将点阵数据转换成RGB565 - convertToRGB565(pixels, type) { - if (!type) { - type = 'rgb'; - } - const result = new Uint16Array(pixels.length / 4); - let index = 0; - for (let i = 0; i < pixels.length; i += 4) { - let r = pixels[i]; - let g = pixels[i + 1]; - let b = pixels[i + 2]; - let a = pixels[i + 3]; - - if (type == 'bgr') { - result[index++] = ((b & 0xF8) << 8) | ((g & 0xFC) << 3) | (r >> 3); - } else { - result[index++] = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); - } - - } - - return result; - } +import request from "@/utils/request.js"; +export default { + audioStorageKey: "audioStorageKey", + pcmStorageKey: "pcmStorageKey", + guid: function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + let r = Math.random() * 16 | 0; + let v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + }, + alert: function(title, content, callback) { + if (!title) { + title = '提示' + } + if (!content) { + content = title; + } + + uni.showModal({ + title: title, + content: content, + success: function(res) { + if (res.confirm) { + console.log('用户点击确定'); + } else if (res.cancel) { + console.log('用户点击取消'); + } + + if (callback) { + callback(res); + } + } + }); + }, + + showLoading: function(title, mask) { + uni.showLoading({ + title: title, + mask: mask, + }) + }, + hideLoading: function() { + uni.hideLoading(); + }, + showToast: function(title, mask, duration, callback) { + if (!duration) { + duration = 1500; + } + if (mask == undefined) { + mask = false; + } + uni.showToast({ + title: title, + mask: mask, + duration: duration, + callback: callback, + icon: 'none' + }) + }, + GetData: function(url, data, method, contentType, succ, err, complete) { + var these = this; + if (!url) { + console.error("url为空"); + return; + } + + if (url.toLowerCase().indexOf('http://') == -1 || url.toLowerCase().indexOf('https://') == -1) { + if (url.indexOf('/') == 0) { + url = url.substr(1, url.length - 1); + } + let ServerPath = these.DevApi; + if (these.Version === 'Dev') { + ServerPath = these.DevApi; + } else if (these.Version === 'Uat') { + ServerPath = these.UatApi; + } else if (these.Version === 'Relese') { + ServerPath = these.ReleseApi; + } else { + these.DevApi + } + url = ServerPath + url; + } + + var these = this; + if (!method) { + method = 'POST'; + } + method = method.toUpperCase(); + + if (!contentType) { + contentType = 'application/json;charset=UTF-8'; + } + + these.checkLAN( + + function() { + these.showLoading('请稍候..', true); + setTimeout(function() { + uni.request({ + url: url, + data: data, + header: { + "Content-Type": contentType + }, + method: method, + timeout: 60000, + dataType: 'json', + success: function(json) { + + if (succ) { + succ(json); + } + }, + fail: function(ex) { + + if (err) { + err(ex); + } + }, + complete: function() { + + if (complete) { + complete(); + } + } + }); + + }, 0); + + } + + , + function() { + these.showToast('无网络连接'); + }); + }, + checkLAN: function(succ, error) { + uni.getNetworkType({ + success: (res) => { + let networkType = res.networkType; + + + // 判断网络是否连接 + if (networkType === 'none') { + console.error('无网络连接') + if (error) { + error(); + } + } else { + if (succ) { + succ(); + } + + } + }, + fail: (err) => { + console.error('获取网络状态失败:', err); + if (error) { + error(); + } + } + }); + + }, + DateFormat: function(date, format) { + if (!date) { + date = new Date(); + } + if (!format) { + format = 'yyyy-MM-dd HH:mm:ss'; + } + // 处理参数默认值 + if (typeof date === 'string' || typeof date === 'number') { + date = new Date(date); + } + date = date instanceof Date ? date : new Date(); + format = format || 'yyyy-MM-dd'; + + // 检查日期是否有效 + if (isNaN(date.getTime())) { + return 'Invalid Date'; + } + + // 定义格式化映射 + let formatMap = { + 'yyyy': date.getFullYear(), + 'MM': String(date.getMonth() + 1).padStart(2, '0'), + 'dd': String(date.getDate()).padStart(2, '0'), + 'HH': String(date.getHours()).padStart(2, '0'), + 'mm': String(date.getMinutes()).padStart(2, '0'), + 'ss': String(date.getSeconds()).padStart(2, '0'), + 'SSS': String(date.getMilliseconds()).padStart(3, '0'), + 'M': date.getMonth() + 1, + 'd': date.getDate(), + 'H': date.getHours(), + 'm': date.getMinutes(), + 's': date.getSeconds(), + 'S': date.getMilliseconds() + }; + + // 替换格式字符串中的占位符 + return format.replace(/(yyyy|MM|dd|HH|mm|ss|SSS|M|d|H|m|s|S)/g, (match) => { + return formatMap[match]; + }); + }, + getdeviceShareId(id) { //获取设备分享信息 + return request({ + url: `/app/deviceShare/${id}`, + method: 'get', + }) + }, + getPermissions(type) { + if (!type) { + type = '6170'; + } + let array = [{ + value: "1", + label: "灯光模式", + checked: false, + type: ['6170', '670','102','6155','650','7305','6075'] + }, + { + value: "2", + label: "激光模式", + checked: false, + type: ['6170','6075'] + }, + { + value: "3", + label: "开机画面", + checked: false, + type: ['210', '6170', '670','6155','650','7305','6075'] + }, + { + value: "4", + label: "人员信息登记", + checked: false, + type: ['210', '6170', '670','6155','650','7305','6075'] + }, + { + value: "5", + label: "发送信息", + checked: false, + type: ['210', '6170', '670','6075'] + }, + { + value: "6", + label: "产品信息", + checked: false, + type: ['210', '6170', '670'] + }, { + value: "41", + label: "静电探测", + checked: false, + type: ['670','650'] + }, { + value: "42", + label: "SOS", + checked: false, + type: ['670','4877','6075'] + }, + { + value: "43", + label: "联机设备", + checked: false, + type: ['210'] + }, + { + value: "44", + label: "报警声音", + checked: false, + type: ['210'] + }, + { + value: "45", + label: "自动报警", + checked: false, + type: ['210'] + }, + { + value: "46", + label: "手动报警", + checked: false, + type: ['210','102'] + }, + { + value: "47", + label: "报警时长", + checked: false, + type: ['210'] + }, + { + value: "48", + label: "物体感应", + checked: false, + type: ['102'] + }, + { + value: "49", + label: "联机模式", + checked: false, + type: ['102'] + }, + + { + value: "50", + label: "报警模式", + checked: false, + type: ['100','100J'] + }, + + { + value: "51", + label: "警示灯", + checked: false, + type: ['100','100J'] + }, + + { + value: "52", + label: "语音管理", + checked: false, + type: ['100','100J'] + }, + + { + value: "53", + label: "箭头模式", + checked: false, + type: ['4877'] + }, + { + value: "54", + label: "配组设置", + checked: false, + type: ['4877'] + }, + { + value: "55", + label: "修改信道", + checked: false, + type: ['4877'] + }, + { + value: "56", + label: "灯光类型设置", + checked: false, + type: ['100J'] + }, + ] + + let arr = []; + for (let i = 0; i < array.length; i++) { + let item = array[i]; + if (!item) { + continue; + } + if (!item.type) { + continue; + } + let typeContais = item.type.find(v => { + return v.includes(type); + }); + if (typeContais) { + let json = {}; + Object.assign(json, item); + arr.push(json); + } + } + return arr; + }, + //10进制转换为16进制字符串 + decimalToHexLittleEndian(num, byteCount, revers) { + // 处理负数(如果需要支持负数,可先转为补码) + if (num < 0) { + num = 0xFFFFFFFF + num + 1; + } + + // 转为16进制,去除前缀0x,转为大写 + let hex = num.toString(16).toUpperCase(); + + // 计算需要补充的0的数量,确保每个字节占2位 + let padLength = (byteCount || Math.ceil(hex.length / 2) * 2) - hex.length; + if (padLength > 0) { + hex = '0'.repeat(padLength) + hex; + } + + // 分割为字节数组(每2位一个字节) + let bytes = []; + for (let i = 0; i < hex.length; i += 2) { + bytes.push(hex.substr(i, 2)); + } + + // 是否反转字节顺序(低位在前)并拼接 + if (revers) { + return bytes.reverse().join(''); + } + return bytes.join(''); + }, + //将相对路径的文件移动到_downloads文件夹中 + moveFileToDownloads(tempFilePath) { + + + return new Promise((resolve, reject) => { + if(!tempFilePath){ + console.log("无文件需要移动"); + resolve(tempFilePath); + return; + } + //本来就在此目录时直接返回 + if (tempFilePath.indexOf("_downloads") === 0) { + console.log("文件已存在,无需移动"); + resolve(tempFilePath); + return; + } + //不是app直接返回 + if (!uni.getSystemInfoSync().uniPlatform.includes('app')) { + resolve('仅支持 App 端操作'); + return; + } + // console.log("tempFilePath=", tempFilePath); + var srcPath = plus.io.convertLocalFileSystemURL(tempFilePath); + // console.log("srcPath=", srcPath); + plus.io.resolveLocalFileSystemURL(srcPath, + (fileEntry) => { + + plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS, (fs) => { + // console.log("fs=",fs.name); + // console.log("fs=",fs.root.fullPath); + + fileEntry.moveTo(fs.root, fileEntry.name, (entry) => { + console.log("entry=", entry); + let relativePath = `_downloads/${entry.name}`; + resolve(relativePath); + + }, (ex) => { + reject(ex) + }); + + + }, (e) => { + console.error("请求download目录失败 " + e); + reject(e); + }); + }, + (error) => { + console.log('文件不存在/路径错误:', error.message); // 核心问题! + } + ); + }); + }, + + getOSAndUpload(){ + let os=uni.getSystemInfoSync().platform; + let url='' + if(os==='ios'){ + url='https://apps.apple.com/cn/app/星汉物联/id6752555460' + } + + else if(os==='android'){ + url='https://www.pgyer.com/xhwl'; + } + return {os:os,url:url}; + }, + + + //将点阵数据转换成RGB565 + convertToRGB565(pixels, type) { + if (!type) { + type = 'rgb'; + } + const result = new Uint16Array(pixels.length / 4); + let index = 0; + for (let i = 0; i < pixels.length; i += 4) { + let r = pixels[i]; + let g = pixels[i + 1]; + let b = pixels[i + 2]; + let a = pixels[i + 3]; + + if (type == 'bgr') { + result[index++] = ((b & 0xF8) << 8) | ((g & 0xFC) << 3) | (r >> 3); + } else { + result[index++] = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); + } + + } + + return result; + } } \ No newline at end of file