微信小程序 开发中的问题(simba_wx)

news/2024/4/20 16:02:52/文章来源:https://blog.csdn.net/Benxiaohai_311/article/details/130363925

目录

  • 一、[将 proto 文件转成 json 文件](https://blog.csdn.net/wzxzRoad/article/details/129300513)
  • 二、[使用 test.json 文件](https://blog.csdn.net/wzxzRoad/article/details/129300513)
  • 三、[微信小程序插件网址](https://ext.dcloud.net.cn/)
  • 四、[vant-weapp网址](https://vant-contrib.gitee.io/vant-weapp/#/home)
  • 五、[文本读取文件](https://blog.csdn.net/a526001650a/article/details/128146156)
  • 六、[字符串内容转arraybuffer](https://blog.csdn.net/weixin_42577672/article/details/106401697)
  • 七、微信小程序页面跳转 的几种方式
          • wx.navigateTo(OBJECT)
          • wx.redirectTo(OBJECT)
          • wx.redirectTo(OBJECT)
          • wx.switchTab(OBJECT)
          • wx.reLaunch(OBJECT)

一、将 proto 文件转成 json 文件

需要先下载 protobufjs-cli 依赖

npm i -D protobufjs-cli

然后再当前目录下的终端,执行以下命令

npx pbjs -t json proto/test.proto > proto/test.json

proto/test.proto > proto/test.json :意思是找到当前目录的 proto 文件夹下的 test.proto 文件,将该文件转为 test.json 并将该文件放到 proto 文件夹下

二、使用 test.json 文件

npm i -S protobufjs

由于收到数据是二进制的,虽然拿到的 proto 文件的 json 结构,但这还是不能直接使用,还需要下转 protobufjs 依赖,将收到的二进制数据根据 test.json 文件转成对应的 json 结构

import protobuf from "protobufjs";
import protoJson from "./proto/test.json";// 使用 protobufjs 拿到 test.json 的 json 结构
const root = protobuf.Root.fromJSON(protoJson);
// 找到要翻译的包和字段
const protoData = root.lookupType("interface_message.GeneralDetectionMapData");// data是收到二进制数据,使用 decode 方法,将二进制数据根据【包和字段】转成 json 结构的数据,该过程简称:解密
const data = protoData.decode(data);// 当需要发送修改过后的 proto 数据发送给后端时,使用 encode 可将数据转成 proto 结构的数据,该过程简称:加密
const protoData = protoData.encode(data).finish()

例如:

const serverUrl = 'http://192.168.200.200:7081';var protobuf = require('@/weichatPb/protobuf.js');
const awesomeConfig = require('@/proto/order.js');
var AwesomeRoot = protobuf.Root.fromJSON(awesomeConfig);// 错误结果
var ErrorRequest = AwesomeRoot.lookupType("ErrorMessage");
// 结果sucess
var OperationGeneralResp = AwesomeRoot.lookupType("OperationGeneralResp");// 获取验证码
var VerificationCodeResp = AwesomeRoot.lookupType("VerifyCodeMessage"); // 获取验证码结果// 登录
var SignInRes = AwesomeRoot.lookupType("UserLogInRequest"); // 登录传值
var SignInResp = AwesomeRoot.lookupType("LoginResp"); // 登录结果// 获取初始信息 --> 1:销售  2:商务
var AuthorInitRes = AwesomeRoot.lookupType("AuthorizationFileTicketInitReq"); // 传值
var AuthorInitResp = AwesomeRoot.lookupType("AuthorizationFileTicketInitResp"); // 结果// 查询授权工单
var SearchAuthorRes = AwesomeRoot.lookupType("GetAuthorizationFileTicketReq"); // 传值
var SearchAuthorResp = AwesomeRoot.lookupType("SalesGetAuthorizationFileTicketResp"); // 结果// 新建授权工单
var AddAuthorRes = AwesomeRoot.lookupType("AddAuthorizationFileTicketReq"); // 传值// 关闭工单
var DelRes = AwesomeRoot.lookupType("CloseAuthorizationFileTicketReq"); // 传值// 修改工单
var UpdateRes = AwesomeRoot.lookupType("EditAuthorizationFileTicketReq"); // 传值// 审核工单
var ProcessRes = AwesomeRoot.lookupType("AuditAuthorizationFileTicketReq"); // 传值// 下载附件
var AnnexRes = AwesomeRoot.lookupType("DeleteAuthFileAttachmentReq"); // 传值// 上传附件
var UpAnnexRes = AwesomeRoot.lookupType("AddAuthFileAttachmentReq"); // 传值const timeout = 15000;
export class Api {// 公共发送请求体static _request(url, requestBuffer, resMode) {var promise = new Promise((resolve, reject) => {var that = this;uni.request({url: serverUrl + url,method: "POST",dataType: 'protobuf',data: requestBuffer,responseType: "arraybuffer",timeout: timeout,header: {"X-Requested-With": "XMLHttpRequest","Content-Type": "application/octet-stream",},success(res) {if (res.statusCode == 200) {var deMessage = resMode.decode(res.data);} else {var deMessage = ErrorRequest.decode(res.data);}resolve(deMessage);},error: function (e) {reject("网络出错");console.log("网络出错")}});});return promise;}// 序列化数据static getUnit8Data(Message, payload) {var message = Message.create(payload);var buffer = Message.encode(message).finish();var requestBuffer = new Uint8Array([...buffer]).buffer;return requestBuffer}// 获取初始信息static async getAuthInit(payload) {var url = "/AuthorizationFileTicketInit";var requestBuffer = Api.getUnit8Data(AuthorInitRes, payload)const res = await Api._request(url, requestBuffer, AuthorInitResp);console.log(res)return res;}// 新建授权工单static async setAuthData(payload) {var url = "/AddAuthorizationFileTicket";var requestBuffer = Api.getUnit8Data(AddAuthorRes, payload)const res = await Api._request(url, requestBuffer, OperationGeneralResp);console.log(res)return res;}// 查询授权工单static async getAuthData(payload) {var url = "/GetAuthorizationFileTicket";var requestBuffer = Api.getUnit8Data(SearchAuthorRes, payload)const res = await Api._request(url, requestBuffer, SearchAuthorResp);console.log(res)return res;}// 关闭工单static async getDel(payload) {var url = "/CloseAuthorizationFileTicket";var requestBuffer = Api.getUnit8Data(DelRes, payload)const res = await Api._request(url, requestBuffer, OperationGeneralResp);console.log(res)return res;}// 修改工单static async getUpdate(payload) {var url = "/EditAuthorizationFileTicket";var requestBuffer = Api.getUnit8Data(UpdateRes, payload)const res = await Api._request(url, requestBuffer, OperationGeneralResp);console.log(res)return res;}// 审核工单static async getProcess(payload) {var url = "/AuditAuthorizationFileTicket";var requestBuffer = Api.getUnit8Data(ProcessRes, payload)const res = await Api._request(url, requestBuffer, OperationGeneralResp);console.log(res)return res;}// 删除附件static async getAnnex(payload) {var url = "/DeleteAuthFileAttachment";var requestBuffer = Api.getUnit8Data(AnnexRes, payload)const res = await Api._request(url, requestBuffer, OperationGeneralResp);console.log(res)return res;}// 上传附件static async getUpAnnex(payload) {var url = "/AddAuthFileAttachment";var requestBuffer = Api.getUnit8Data(UpAnnexRes, payload)const res = await Api._request(url, requestBuffer, OperationGeneralResp);console.log(res)return res;}// 获取验证码static async getVerificationCode() {let payload = {}var url = "/GenerateVerificationCode";var requestBuffer = Api.getUnit8Data(AuthorInitRes, payload)const res = await Api._request(url, requestBuffer, VerificationCodeResp);return res;}// 登录static async getSignIn(payload) {var url = "/UserLogin";var requestBuffer = Api.getUnit8Data(SignInRes, payload)const res = await Api._request(url, requestBuffer, SignInResp);return res;}
}

三、微信小程序插件网址

四、vant-weapp网址

五、文本读取文件

在这里插入图片描述

// this.fileList3 格式如上图所示即可
if (this.fileList3 != 0) {for (let i = 0; i < this.fileList3.length; i++) {const fm = wx.getFileSystemManager(); // 获取文件管理器var arrayBuffer = new ArrayBuffer(`${this.fileList3[i].size}`);try {var fd = fm.openSync({filePath: this.fileList3[i].path,});fm.readSync({fd: fd,arrayBuffer: arrayBuffer, //数据写入的缓冲区length: this.fileList3[i].size, //读取的字节数,默认0}); // 读取文件内容// var enc = new TextDecoder("utf-8");// var fileContent = enc.decode(arrayBuffer); //将ArrayBuffer转为字符串filesAll.push({name: this.fileList3[i].name,file: new Uint8Array(arrayBuffer),});fm.closeSync({ fd: fd }); // 关闭文件} catch (exception) {console.log("onShow >> 读文件失败, 异常消息: ", exception);}}
}

六、字符串内容转arraybuffer

微信小程序 JS 字符串string与utf8编码的arraybuffer的相互转换

&#8194最近在做一个微信小程序,和后端用websocket连接,后端要求传输过去的信息是UTF8编码的二进制信息。JS并没有可以直接进行转换的库函数,因此必须自己写一个编码以及解析的函数。
    最开始采用了一个字符一个字符的charCodeAt,但是通过这种方式可以传输非中文的内容,有中文时则无法正确的转换。
    后来参考了网上的一些资料,通过先将字符串编码并转换为byte[],再转换为对应的arraybuffer(解析同理,先将arraybuffer转换为byte[],再进行解码)
    编码及解码的过程较复杂,不过这两个函数是可以直接使用的,同时支持中文和英文。
    
字符串内容转arraybuffer

stringToArrayBuffer(str) {var bytes = new Array();var len, c;len = str.length;for (var i = 0; i < len; i++) {c = str.charCodeAt(i);if (c >= 0x010000 && c <= 0x10ffff) {bytes.push(((c >> 18) & 0x07) | 0xf0);bytes.push(((c >> 12) & 0x3f) | 0x80);bytes.push(((c >> 6) & 0x3f) | 0x80);bytes.push((c & 0x3f) | 0x80);} else if (c >= 0x000800 && c <= 0x00ffff) {bytes.push(((c >> 12) & 0x0f) | 0xe0);bytes.push(((c >> 6) & 0x3f) | 0x80);bytes.push((c & 0x3f) | 0x80);} else if (c >= 0x000080 && c <= 0x0007ff) {bytes.push(((c >> 6) & 0x1f) | 0xc0);bytes.push((c & 0x3f) | 0x80);} else {bytes.push(c & 0xff);}}var array = new Int8Array(bytes.length);for (var i in bytes) {array[i] = bytes[i];}return array.buffer;},

arraybuffer转字符串内容

function arrayBufferToString(arr){if(typeof arr === 'string') {  return arr;  }  var dataview=new DataView(arr.data);var ints=new Uint8Array(arr.data.byteLength);for(var i=0;i<ints.length;i++){ints[i]=dataview.getUint8(i);}arr=ints;var str = '',  _arr = arr;  for(var i = 0; i < _arr.length; i++) {  var one = _arr[i].toString(2),  v = one.match(/^1+?(?=0)/);  if(v && one.length == 8) {  var bytesLength = v[0].length;  var store = _arr[i].toString(2).slice(7 - bytesLength);  for(var st = 1; st < bytesLength; st++) {  store += _arr[st + i].toString(2).slice(2);  }  str += String.fromCharCode(parseInt(store, 2));  i += bytesLength - 1;  } else {  str += String.fromCharCode(_arr[i]);  }  }  return str; 
}

七、微信小程序页面跳转 的几种方式

wx.navigateTo(OBJECT)

保留当前页面,跳转到应用内的某个页面, 小程序中左上角有一个返回箭头,可返回上一个页面,也可以通过方法 wx.navigateBack 返回原页面.

wx.redirectTo(OBJECT)

关闭当前页面,跳转到应用内的某个页面, 左上角没有返回箭头,不能返回上一个页面

wx.redirectTo(OBJECT)

关闭当前页面,跳转到应用内的某个页面, 左上角没有返回箭头,不能返回上一个页面

wx.switchTab(OBJECT)

跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面, wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面

wx.reLaunch(OBJECT)

关闭所有页面,打开到应用内的某个页面, 跟wx.redirectTo 一样左上角不会出现返回箭头,但两者却不完全相同

这里要提到小程序中的 getCurrentPages() 方法,在wx.navigateTo中,每跳转一个新的页面,其原始页面就会被加入堆栈,通过调用wx.navigateBack(OBJECT)可通过获取堆栈中保存的页面 返回上一级或多级页面

wx.redirectTo,方法则不会被加入堆栈,但仍可通过wx.navigateBack(OBJECT)方法返回之前堆栈中的页面

wx.reLaunch 方法则会清空当前的堆栈

例如: A跳转到B,B跳转到C,C navigateBack,将返回b页面

// 此处是A页面
wx.navigateTo({url: 'B?id=1'
})
// 此处是B页面
wx.navigateTo({url: 'C?id=1'
})
// 在C页面内 navigateBack,将返回b页面
wx.navigateBack({delta: 1
})
// 此处是B页面
wx.redirectTo({url: 'C?id=1'
})
// 在C页面内 navigateBack,则会返回a页面 
wx.navigateBack({delta: 1})
// 此处是B页面
wx.reLaunch({url: 'C?id=1'
})
// 在C页面内 navigateBack,则无效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103360.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0搭建Vue3组件库(八):使用 release-it 实现自动管理发布组件库

使用 release-it 实现自动管理发布组件库 上一篇文章已经打包好我们的组件库了,而本篇文章将介绍如何发布一个组件库。当然本篇文章介绍的肯定不单单只是发布那么简单。 组件库发布 我们要发布的包名为打包后的 easyest,因此在 easyest 下执行pnpm init生成package.json {&…

本地缓存解决方案Caffeine | Spring Cloud 38

一、Caffeine简介 Caffeine是一款高性能、最优缓存库。Caffeine是受Google guava启发的本地缓存&#xff08;青出于蓝而胜于蓝&#xff09;&#xff0c;在Cafeine的改进设计中借鉴了 Guava 缓存和 ConcurrentLinkedHashMap&#xff0c;Guava缓存可以参考上篇&#xff1a;本地缓…

【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata

NacosSentinelSeata 9/9 1、SpringCloud Alibaba简介1.1 主要功能1.2 具体组件 2、SpringCloud Alibaba Nacos服务注册和配置中心2.1 Nacos介绍2.2 Nacos下载安装2.3 使用Nacos作为注册中心2.3.1 在父工程的pom文件中引入springcloudalibaba依赖2.3.2 创建cloudalibaba-provide…

适合学生党的蓝牙耳机品牌有哪些?性价比高的无线耳机推荐

相较于有线耳机&#xff0c;蓝牙耳机的受欢迎程度可谓是越来越高&#xff0c;当然&#xff0c;这也离不开部分手机取消耳机孔的设计。最近看到很多网友问&#xff0c;适合学生党的蓝牙耳机品牌有哪些&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比高的无线耳机…

static_cast、dynamic_cast和reinterpret_cast区别和联系

其实网上相关的资料不少&#xff0c;但是能够说清楚明白这个问题的也不多。 于是&#xff0c;我尝试着问了一下AI&#xff0c;感觉回答还可以&#xff0c;但是需要更多的资料验证。 让我们先看看AI是怎么回答这个问题的。 static_cast、dynamic_cast和reinterpret_cast都是C中…

视频音频提取器推荐:快速提取视频中的音频!

视频中的音频可以用于很多用途&#xff0c;比如制作配乐、音频剪辑等。但是&#xff0c;许多人并不知道如何将视频中的音频提取出来。如果您也是这样的情况&#xff0c;那么本文为您介绍一个简单易用的视频音频提取器&#xff1a;。 它是一个免费的在线工具&#xff0c;可以帮…

如何在Web上实现激光点云数据在线浏览和展示?

无人机激光雷达测量是一项综合性较强的应用系统&#xff0c;具有数据精度高、层次细节丰富、全天候作业等优势&#xff0c;能够精确测量三维现实世界&#xff0c;为各个行业提供了丰富有效的数据信息。但无人机激光雷达测量产生的点云数据需要占用大量的存储空间&#xff0c;甚…

DataGridView 真·列头不高亮 真·列头合并

高亮BUG VB.Net&#xff0c;在 .NET Framework 4.8 的 WinForm 下(即不是 WPF 的绘图模式、也不是 Core 或 Mono 的开发框架)&#xff0c;使用 DataGridView 行模式&#xff0c;还是有个列头表现为高亮显示&#xff1a; 查找各种解决方式: 设置 ColumnHeadersDefaultCellSty…

YOLOv1代码复现2:数据加载器构建

YOLOv1代码复现2&#xff1a;数据加载器构建 前言 ​ 在经历了Faster-RCNN代码解读的摧残后&#xff0c;下决心要搞点简单的&#xff0c;于是便有了本系列的博客。如果你苦于没有博客详细告诉你如何自己去实现YOLOv1&#xff0c;那么可以看看本系列的博客&#xff0c;也许可以帮…

【Java实战篇】Day13.在线教育网课平台--生成支付二维码与完成支付

文章目录 一、需求&#xff1a;生成支付二维码1、需求分析2、表设计3、接口定义4、接口实现5、完善controller 二、需求&#xff1a;查询支付结果1、需求分析2、表设计与模型类3、接口定义4、接口实现步骤一&#xff1a;查询支付结果步骤二&#xff1a;保存支付结果&#xff08…

VUE3如何定义less全局变量

默认已经安装好了less&#xff0c;这里不过多讲。 &#xff08;1&#xff09;首先我们需要下载一个插件依赖&#xff1a; npm i style-resources-loader --save-dev &#xff08;2&#xff09;VUE3里配置vue.config.js文件内容 代码&#xff1a; const path require("p…

HashMap如何解决哈希冲突

HashMap如何解决哈希冲突 Hash算法和Hash表Hash冲突解决哈希冲突的方法开放地址法链式寻址法再hash法建立公共溢出区 Hash算法和Hash表 Hash算法就是把任意长度的输入通过散列算法编程固定长度的输出。这个输出结果就是一个散列值。 Hash表又称为“散列表”&#xff0c;它是通…

SpringBoot中一个注解优雅实现重试Retry框架

目录: 1、简介2、实现步骤 1、简介 重试&#xff0c;在项目需求中是非常常见的&#xff0c;例如遇到网络波动等&#xff0c;要求某个接口或者是方法可以最多/最少调用几次&#xff1b;实现重试机制&#xff0c;非得用Retry这个重试框架吗&#xff1f;那肯定不是&#xff0c;相信…

Mysql 查询同类数据中某一数字最大的所有数据

方法一、将时间进行排序后再分组 该表表名为customer, park_id表示园区id&#xff0c;joined_at表示用户的加入时间&#xff0c;created_at表示用户的创建时间。 需求&#xff1a;查出每个园区中&#xff0c;最早加入园区的第一位用户 select * from (select * from custome…

数据库课设--基于Python+MySQL的餐厅点餐系统(表的设计)

文章目录 一、系统需求分析二、系统设计1. 功能结构设计2、概念设计2.2.1 bill_food表E-R图2.2.2 bills表E-R图2.2.3 categories E-R图2.2.4 discounts表 E-R图2.2.5 emp表E-R图2.2.6 food 表E-R图2.2.7 member表E-R图2.2.8 member_point_bill表E-R图2.2.9 servers表E-R图2.2.1…

操作系统考试复习—第二章 2.1 2.2程序和进程的描述

第二章 进程的描述与控制 程序&#xff1a;有序的指令集合 程序顺序执行的特征&#xff1a;1.顺序性 2.封闭性 3.可再现性(确定性) 在多道程序环境下&#xff0c;允许多个程序并发执行&#xff0c;此时他们将失去封闭性&#xff0c;并具有间断性和不可再现性的特征。为此引…

基于SGM431的电路设计问题分析

本案例中,采用SGM431芯片设计了一个过压保护电路。 这个电路初次设计,有很多的问题,下面逐一分析 1.当输入24V,测得Vref=1.59V。Vout为1.15V;,mos管关断 2。经过多次测量发现,临界值在10V到10.5之间; 当输入10.5V时,测量Vref=1.69V。vout=1.15V;mos管关断 当输入1…

智慧物联网边缘协同感知(EICS)技术方案: 低功耗无线扫描唤醒技术

物联网的传感器或控制节点通常有体积限制&#xff0c;只能使用钮扣电池、小型电池&#xff0c;甚至使用能量收集源进行运作。在许多工业应用中&#xff0c;需要人工更换电池的成本&#xff0c;特别是在难以接近地方更换所需的成本&#xff0c;使得人们更加重视降低平均电流消耗…

深度学习入门到实践:相关基础概述

绪论 深度学习&#xff08;Deep Learning&#xff09;是近年来发展十分迅速的研究领域&#xff0c;并且在人工智能的很多子领域都取得了巨大的成功。从根源来讲&#xff0c;深度学习是机器学习的一个分支&#xff0c;是指一类问题以及解决这类问题的方法。     深度学习问题…

halcon灰度积分投影/垂直积分投影

简介:关于灰度投影积分可以用到的场合很多,例如分割字符,分割尺子上的刻度等,适用于有规律的变化这些内容的检测。本文复现了论文《基于深度学习和灰度纹理特征的铁路接触网绝缘子状态检测》中灰度积分投影实现了对绝缘子缺陷位置的检测。见(图1)灰度积分垂直方向投影获得…