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

2023-10-20 16:40

本文主要是介绍微信小程序 开发中的问题(simba_wx),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、[将 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,则无效

这篇关于微信小程序 开发中的问题(simba_wx)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248346

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监