
帮搞小程序转换鸿蒙NEXT,就练技术
满足以下几点条件可以联系我,这周帮忙改了2个到原生鸿蒙,后续可以慢慢来
1、应用或者小程序已经处于上架状态,证书备案的齐全了
2、vue3写的,vue2的话改造比较耗时,暂时先帮忙搞vue3开发的应用
满足以下几点条件可以联系我,这周帮忙改了2个到原生鸿蒙,后续可以慢慢来
1、应用或者小程序已经处于上架状态,证书备案的齐全了
2、vue3写的,vue2的话改造比较耗时,暂时先帮忙搞vue3开发的应用

编辑器已打开文件的tab栏应该增加已打开文件总览
用HbulidX开发项目时,经常需要打开很多文件,但目前编辑器的已打开文件tab栏不支持已打开文件总览功能,只有左右滑动一个个文件查看。

这经常导致在开发者在开发时有些文件已经打开了却忘记了,又要到文件管理栏去查找,非常浪费精力。希望能增加像idea和eclipse这样能总览已打开文件的功能,方便开发者节省精力。
用HbulidX开发项目时,经常需要打开很多文件,但目前编辑器的已打开文件tab栏不支持已打开文件总览功能,只有左右滑动一个个文件查看。
这经常导致在开发者在开发时有些文件已经打开了却忘记了,又要到文件管理栏去查找,非常浪费精力。希望能增加像idea和eclipse这样能总览已打开文件的功能,方便开发者节省精力。
收起阅读 »
subNVue 视频播放
subNVue(type=popup)里有视频, Android手机侧滑关闭popup,视频仍然在播放, 可通过以下方式解决:
onReady(function() {
// 在Android中通过此方法可控制侧滑关闭popup, 如果让popup关闭, onHide onBackPress等方法都不触发, 视频仍然在播放.
plus.key.addEventListener("backbutton", function(){
// 不会执行
console.log('backbutton press', data)
closePlayer()
});
})
subNVue(type=popup)里有视频, Android手机侧滑关闭popup,视频仍然在播放, 可通过以下方式解决:
onReady(function() {
// 在Android中通过此方法可控制侧滑关闭popup, 如果让popup关闭, onHide onBackPress等方法都不触发, 视频仍然在播放.
plus.key.addEventListener("backbutton", function(){
// 不会执行
console.log('backbutton press', data)
closePlayer()
});
})
收起阅读 »

HBuilderX APP端 uni/nvue 调试报错问题
- 操作系统: Windows11
- HBuilderX版本: 4.56
- 项目类型:uniapp
- 模拟器: MuMu
在模拟器上运行项目时,一打开 uni/nvue 调试就会报错,甚至闪退,好像也有别的兄弟遇到了,也不知道
解决了没,分享一下我的解决方法。
报错图
在薅掉一把为数不多的头发后终于找到了问题原因(大概)
因为我谷歌浏览器改了安装位置,但是这个插件并不能识别出新位置来,这可能是导致这个问题的原因。
解决方法:
修改 HBuilderX 目录下的 install.js 文件(HBuilderX\plugins\uniapp-debugger\node_modules\puppeteer-cn-2\lib\install.js)
// 找到下面的代码并将其注释掉
// semver.gt(version, refVersion) ? resolve(chromePath) : reject();
然后直接返回谷歌安装路径
resolve("D:\\xxx\\Google\\Chrome\\Application\\chrome.exe")
保存,重启项目,点击调试,然后就T*的可以了
虽然那个但是,反正能用了。
- 操作系统: Windows11
- HBuilderX版本: 4.56
- 项目类型:uniapp
- 模拟器: MuMu
在模拟器上运行项目时,一打开 uni/nvue 调试就会报错,甚至闪退,好像也有别的兄弟遇到了,也不知道
解决了没,分享一下我的解决方法。
报错图
在薅掉一把为数不多的头发后终于找到了问题原因(大概)
因为我谷歌浏览器改了安装位置,但是这个插件并不能识别出新位置来,这可能是导致这个问题的原因。
解决方法:
修改 HBuilderX 目录下的 install.js 文件(HBuilderX\plugins\uniapp-debugger\node_modules\puppeteer-cn-2\lib\install.js)
// 找到下面的代码并将其注释掉
// semver.gt(version, refVersion) ? resolve(chromePath) : reject();
然后直接返回谷歌安装路径
resolve("D:\\xxx\\Google\\Chrome\\Application\\chrome.exe")
保存,重启项目,点击调试,然后就T*的可以了
虽然那个但是,反正能用了。
收起阅读 »
H5 app 安卓应用 连接 蓝牙打印机 打印标签
H5 app 安卓应用 连接 蓝牙打印机 打印标签
项目需求:
商超类管理端APP(H5 )能够连接蓝牙打印机,打印促销价签。
个人说明:
1、前端水平为入门级。
2、第一次搞硬件对接。
所以写的内容可能很基础,或者有错误。欢迎各位大佬指正。
开发思路:
本人负责从该功能的设计,数据库、后端、前端的所有开发。
首先需要验证H5 项目是否能够链接驱动打印机。
验证成功后再进行其他开发。
本文主要介绍:H5 项目的蓝牙打印机验证。
项目研究及同类搜索:
客户发过来的蓝牙打印机是 芝柯便携式打印机 CC3 。
1、商家技术支持:商家拉了一个技术对接群。发了一个500M左右的技术支持包。
问有没有相关的demo。答:“里面您自己找下 ,有的话就有,没有就没有了”。
这个群最后一句话是“明天这边 反馈下厂家开发”。
所以商家基本上没有支持(没错,就是在吐槽)。
2、同类搜索:在mui 及其他网站搜索 “H5 蓝牙打印机”。找到了六七个项目下载后挨个测试使用。
发现有些是H5WEB项目,有些是vue项目。符合要求的有三个。
==CSDN 搜包小弟快递 (优点:在同一个页面进行蓝牙配对、)
==雨滴科技蓝牙打印Demo https://ask.dcloud.net.cn/article/38125 buleprintDemo.zip(优点:能够自动连接已保存蓝牙)
==CSDN 搜 html5-bluetooth-HBuilderX(优点:丰富的操作)
经测试后发现有些问题无法解决。
如:Uncaught java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@8a1bcf4c: Starting discovery.;at android.bluetooth.BluetoothAdapter.startDiscovery at printer.html:1
很多文章下也有这个提问,但是暂无回答 。后来解决后 我也尽量去相关问题下回答了。
相关知识:
打印机的相关文档 和 网上搜索的demo中,每个写法都不太一样。如:不同的打印指令,不同的链接蓝牙的方法。
看的多了更乱了。发现自己关于打印机开发的相关知识还不够。
这里梳理了一些相关知识,给跟我一样刚接触的人一些提示。
1、蓝牙打印机
不同品牌的蓝牙打印机样子都差不多,相关指令也一样,可能有一些字体和字号设置不同。其他都一样。
拿到新的打印机后,先打印一个自检页,相面有相关数据 。如:mac地址,支持的指令集,支持的字体等。
2、蓝牙的连接方式
蓝牙的连接方式有两种:传统连接、ble连接(低功耗链接)。
两种链接用的方法不一样,从搜索,连接,传送指令,断开连接 等都不一样。
简单来说,方法名中 带有ble 字样的就是ble连接。
用ble连接的场景:微信小程序只支持ble蓝牙连接。 所以如果你用vue后期要编译成小程序的 ,需要用ble。
打印机支持的链接模式:打印机会有说明 ,是否支持双模连接。支持双模连接的 会有两个mac地址,ble蓝牙名称比传统蓝牙名称多一个L。
===我用的是传统连接。
3、打印机指令
我这个打印机自检页中 说支持的指令集有很多种: TSPL,ZPL,EPL,CPCL。
网上搜索的指令集一般用两种:CPCL命令集、ESC命令集
一开始我用ESC命令集,传送命令没有报错,但是打印机没反应。后来发现,这个打印机不支持。
最后用的CPCL命令集,也建议大家用这个指令集。因为:
1、CPCL指令集 更通用。
2、ESC指令集用的十六进制的指令,阅读困难。CPCL指令集阅读友好。
===我用的是CPCL命令集。
4、在什么介质上打印
热敏打印机可以在两种介质上打印。
1、热敏小票纸。就是你去超市结账后给的小票
2、热敏标签。就是你在超市买菜时,电子秤上打印的标签。
这两种打印在指令上略有不同,如果只打印一种,只看相关指令就行。
===我用的是热敏标签打印。
根据我的需求和各个例子的功能,最后选择了在 雨滴科技蓝牙打印demo 上进行修改应用。
改进的地方
1、已经在manifast中添加了相关权限,但还是在搜索蓝牙时报错Need android.permission.
var permissions = [
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.BLUETOOTH_SCAN",
"android.permission.BLUETOOTH_CONNECT"
];
plus.android.requestPermissions(
permissions,
function(result) {
// 权限申请成功后的回调
console.log("权限申请成功");
},
function(error) {
console.error("权限申请失败:" error.message);
}
);
2、搜索蓝牙有大量重复,需要去重。
// 防止重复出现
if (JSON.stringify(BleDeviceObjAry).indexOf(JSON.stringify(BleDevice)) != -1) {
console.log("重复");
} else {
console.log("增加");
BleDeviceObjAry.push(BleDevice);
self.SetpairedListHtml(unpairedList, bleName, bleId);
}
3、页面没有蓝牙连接标志。
<script type="text/javascript" src="js/jquery.min.js"></script>
$('#J_printer_status').val('打印机已就绪');
$('#J_printer_status').css('color', 'green');
4、第一次链接失败后,在连接还是失败。Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1
if(!bluetoothSocket.isConnected()) {
try{
bluetoothSocket.connect();
}catch(e){
// $('#J_printer_status').val(data.value);
bluetoothSocket.close();
$('#J_printer_status').val('打印机未连接')
$('#J_printer_status').css('color', 'red');
localStorage.setItem("printer_status", "N");
console.log(e)
return;
}
}
5、增加按钮 ,能够手动进入打印机配对界面
6、修改label_set_page 方法,能够传入打印数量
欢迎指正并一起讨论学习
H5 app 安卓应用 连接 蓝牙打印机 打印标签
项目需求:
商超类管理端APP(H5 )能够连接蓝牙打印机,打印促销价签。
个人说明:
1、前端水平为入门级。
2、第一次搞硬件对接。
所以写的内容可能很基础,或者有错误。欢迎各位大佬指正。
开发思路:
本人负责从该功能的设计,数据库、后端、前端的所有开发。
首先需要验证H5 项目是否能够链接驱动打印机。
验证成功后再进行其他开发。
本文主要介绍:H5 项目的蓝牙打印机验证。
项目研究及同类搜索:
客户发过来的蓝牙打印机是 芝柯便携式打印机 CC3 。
1、商家技术支持:商家拉了一个技术对接群。发了一个500M左右的技术支持包。
问有没有相关的demo。答:“里面您自己找下 ,有的话就有,没有就没有了”。
这个群最后一句话是“明天这边 反馈下厂家开发”。
所以商家基本上没有支持(没错,就是在吐槽)。
2、同类搜索:在mui 及其他网站搜索 “H5 蓝牙打印机”。找到了六七个项目下载后挨个测试使用。
发现有些是H5WEB项目,有些是vue项目。符合要求的有三个。
==CSDN 搜包小弟快递 (优点:在同一个页面进行蓝牙配对、)
==雨滴科技蓝牙打印Demo https://ask.dcloud.net.cn/article/38125 buleprintDemo.zip(优点:能够自动连接已保存蓝牙)
==CSDN 搜 html5-bluetooth-HBuilderX(优点:丰富的操作)
经测试后发现有些问题无法解决。
如:Uncaught java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@8a1bcf4c: Starting discovery.;at android.bluetooth.BluetoothAdapter.startDiscovery at printer.html:1
很多文章下也有这个提问,但是暂无回答 。后来解决后 我也尽量去相关问题下回答了。
相关知识:
打印机的相关文档 和 网上搜索的demo中,每个写法都不太一样。如:不同的打印指令,不同的链接蓝牙的方法。
看的多了更乱了。发现自己关于打印机开发的相关知识还不够。
这里梳理了一些相关知识,给跟我一样刚接触的人一些提示。
1、蓝牙打印机
不同品牌的蓝牙打印机样子都差不多,相关指令也一样,可能有一些字体和字号设置不同。其他都一样。
拿到新的打印机后,先打印一个自检页,相面有相关数据 。如:mac地址,支持的指令集,支持的字体等。
2、蓝牙的连接方式
蓝牙的连接方式有两种:传统连接、ble连接(低功耗链接)。
两种链接用的方法不一样,从搜索,连接,传送指令,断开连接 等都不一样。
简单来说,方法名中 带有ble 字样的就是ble连接。
用ble连接的场景:微信小程序只支持ble蓝牙连接。 所以如果你用vue后期要编译成小程序的 ,需要用ble。
打印机支持的链接模式:打印机会有说明 ,是否支持双模连接。支持双模连接的 会有两个mac地址,ble蓝牙名称比传统蓝牙名称多一个L。
===我用的是传统连接。
3、打印机指令
我这个打印机自检页中 说支持的指令集有很多种: TSPL,ZPL,EPL,CPCL。
网上搜索的指令集一般用两种:CPCL命令集、ESC命令集
一开始我用ESC命令集,传送命令没有报错,但是打印机没反应。后来发现,这个打印机不支持。
最后用的CPCL命令集,也建议大家用这个指令集。因为:
1、CPCL指令集 更通用。
2、ESC指令集用的十六进制的指令,阅读困难。CPCL指令集阅读友好。
===我用的是CPCL命令集。
4、在什么介质上打印
热敏打印机可以在两种介质上打印。
1、热敏小票纸。就是你去超市结账后给的小票
2、热敏标签。就是你在超市买菜时,电子秤上打印的标签。
这两种打印在指令上略有不同,如果只打印一种,只看相关指令就行。
===我用的是热敏标签打印。
根据我的需求和各个例子的功能,最后选择了在 雨滴科技蓝牙打印demo 上进行修改应用。
改进的地方
1、已经在manifast中添加了相关权限,但还是在搜索蓝牙时报错Need android.permission.
var permissions = [
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.BLUETOOTH_SCAN",
"android.permission.BLUETOOTH_CONNECT"
];
plus.android.requestPermissions(
permissions,
function(result) {
// 权限申请成功后的回调
console.log("权限申请成功");
},
function(error) {
console.error("权限申请失败:" error.message);
}
);
2、搜索蓝牙有大量重复,需要去重。
// 防止重复出现
if (JSON.stringify(BleDeviceObjAry).indexOf(JSON.stringify(BleDevice)) != -1) {
console.log("重复");
} else {
console.log("增加");
BleDeviceObjAry.push(BleDevice);
self.SetpairedListHtml(unpairedList, bleName, bleId);
}
3、页面没有蓝牙连接标志。
<script type="text/javascript" src="js/jquery.min.js"></script>
$('#J_printer_status').val('打印机已就绪');
$('#J_printer_status').css('color', 'green');
4、第一次链接失败后,在连接还是失败。Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1
if(!bluetoothSocket.isConnected()) {
try{
bluetoothSocket.connect();
}catch(e){
// $('#J_printer_status').val(data.value);
bluetoothSocket.close();
$('#J_printer_status').val('打印机未连接')
$('#J_printer_status').css('color', 'red');
localStorage.setItem("printer_status", "N");
console.log(e)
return;
}
}
5、增加按钮 ,能够手动进入打印机配对界面
6、修改label_set_page 方法,能够传入打印数量
欢迎指正并一起讨论学习
收起阅读 »
如何在 uniapp 中使用微信小程序原生 UI 库,比如 ant-design-mini/weui?
转自 https://ask.dcloud.net.cn/question/206730
如何在 uniapp 中使用微信小程序原生 UI 库,比如 ant-design-mini/weui?
原生UI 库是指只适配原生小程序写法的 UI 库,在 uniapp 中需要做简单调整, ant design 组件库提供的 使用说明
这里举例 uni-app如何接入 weui:
- 在 uniapp 中创建
wxcmoponents
文件夹,表示内部为原生组件 cd wxcomponets && npm init -y && npm i weui-miniprogram
安装 UI 库,在微信小程序工具里 “工具”菜单 --> “构建 npm”- 复制
weui-miniprogram/weui-wxss/dist/style/weui.wxss
到项目 style 目录,并改名为 weui.css,在 app.vue 或者 main.js 中导入,这个是 weui 全局样式 - 在使用 weui 组件库的页面引入,参考下面 pages.json,下面代码表示在微信里引入了 ant-button 和 mp-dialog
"pages": [{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app",
"usingComponents": {
// #ifdef MP-WEIXIN
"ant-button": "/wxcomponents/miniprogram_npm/antd-mini/Button/index",
"mp-dialog": "/wxcomponents/miniprogram_npm/weui-miniprogram/dialog/dialog"
// #endif
}
}
},
- 在页面中就可以正常使用 ant-design/weui 组件了
<template>
<view>
<view>123</view>
<ant-button type="default" danger icon="ForbidFill">带图标按钮</ant-button>
<mp-dialog title="test" :show="true" @buttontap="tapDialogButton" :buttons="buttons">
<view>test content</view>
</mp-dialog>
</view>
</template>
<script>
export default{
data(){
return {
buttons: [{text: '取消'}, {text: '确认'}]
}
},
methods:{
tapDialogButton(){
console.log('tap');
}
}
}
</script>
效果图如下:
参考 weui 使用说明
转自 https://ask.dcloud.net.cn/question/206730
如何在 uniapp 中使用微信小程序原生 UI 库,比如 ant-design-mini/weui?
原生UI 库是指只适配原生小程序写法的 UI 库,在 uniapp 中需要做简单调整, ant design 组件库提供的 使用说明
这里举例 uni-app如何接入 weui:
- 在 uniapp 中创建
wxcmoponents
文件夹,表示内部为原生组件 cd wxcomponets && npm init -y && npm i weui-miniprogram
安装 UI 库,在微信小程序工具里 “工具”菜单 --> “构建 npm”- 复制
weui-miniprogram/weui-wxss/dist/style/weui.wxss
到项目 style 目录,并改名为 weui.css,在 app.vue 或者 main.js 中导入,这个是 weui 全局样式 - 在使用 weui 组件库的页面引入,参考下面 pages.json,下面代码表示在微信里引入了 ant-button 和 mp-dialog
"pages": [{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app",
"usingComponents": {
// #ifdef MP-WEIXIN
"ant-button": "/wxcomponents/miniprogram_npm/antd-mini/Button/index",
"mp-dialog": "/wxcomponents/miniprogram_npm/weui-miniprogram/dialog/dialog"
// #endif
}
}
},
- 在页面中就可以正常使用 ant-design/weui 组件了
<template>
<view>
<view>123</view>
<ant-button type="default" danger icon="ForbidFill">带图标按钮</ant-button>
<mp-dialog title="test" :show="true" @buttontap="tapDialogButton" :buttons="buttons">
<view>test content</view>
</mp-dialog>
</view>
</template>
<script>
export default{
data(){
return {
buttons: [{text: '取消'}, {text: '确认'}]
}
},
methods:{
tapDialogButton(){
console.log('tap');
}
}
}
</script>
效果图如下:
参考 weui 使用说明
收起阅读 »
This app was built with the i0S 17.5 SDK. Starting April 24, 2025,
uniapp打包SDK version issue. This app was built with the i0S 17.5 SDK. Starting April 24, 2025, al ioS and iPadoS apps must be built with the i0S 18 SDK or later, included in Xcode 16 or later, in order to be uploaded to App Store Connect or submitted for distribution. (90725)
uniapp打包SDK version issue. This app was built with the i0S 17.5 SDK. Starting April 24, 2025, al ioS and iPadoS apps must be built with the i0S 18 SDK or later, included in Xcode 16 or later, in order to be uploaded to App Store Connect or submitted for distribution. (90725)
收起阅读 »
uniapp对接热敏打印机打印,使用蓝牙,usb,局域网

推荐一款好用的医疗级心电ECG采集处理模块
模块简介
WLEC2医疗级心电模块是一款专用于ECG采集的模块,可以达到医疗器械注册的技术标准。模拟部分采用苏州唯理科技低功耗高精度的 WL128 芯片采集,并配置硬件 RC 滤波,具有交流直流信号耦合方式;块内采用 32位高性能单片机,内置优秀的数据处理算法,可实时计算心率并输出心率以及经过处理的心电波形,配合苏州唯理科技心电计算API,可以为用户提供有关心脏的丰富的健康和疾病分析指标。 基于苏州唯理自研芯片WL128,我们开发出了一套精简高效的心电采集模,而且还可以同步输出WLS128芯片的原始心块,可搭配蓝牙或串口传输数据,电采样的24bit数据,模块使用邮票孔和标准2.54mm插口的方式引出了数据和电源接口,且电极的信号可通过 5pin 间距1.27mm 的排座引出,使用方式灵活集成简单。
使用自研量产芯片,性能优越,响应迅速。
模块功耗达到最优,超低功耗,满足不同场景需求。
模块集成度高,成本大幅降低。
拥有配套算法,高效精准。
提供OEM等各种合作形式。
蓝牙传输速度快,适配广泛无丢包。
监测精度高,附带相关参数分析。
经过市场多家厂商使用认证。
安全指标高,能够通过相关法规认证达到投产目的。
输入工作电压 3.3V-5.0V。
系统噪声约5uVpp。
前置放大倍数6倍。
采样率250~500sps。
数据分辨率24bit。
状态指示灯:包括待机,数据发送,模块状态异常等不同状态的显示。
标准串口协议数据输出(115200~921600波特率,1个停止位,8个数据位,无奇偶校验)。
具有状态反馈引脚(INT),主机可通过不同的电。
唯理心电云端API功能介绍
不规则心率检测
评估身体疲劳程度
评估身体亚健康程度
精准快速的心率99.8%
评估交感神经与副交感神经的兴奋度
评估精神压力
评估猝死风险
方案优势
数年从事生物电、脑机接口领域,拥有大量经验积累
强大专业的硬件研发以及软件算法工程师团队
具有状态反馈引脚,主机可通过不同的电平变化获取模块当前实时状态
内置快速心率算法,可在2~3s内输出准确的心率值
高客户满意度,服务覆盖全国
应用领域
关于我们
模块简介
WLEC2医疗级心电模块是一款专用于ECG采集的模块,可以达到医疗器械注册的技术标准。模拟部分采用苏州唯理科技低功耗高精度的 WL128 芯片采集,并配置硬件 RC 滤波,具有交流直流信号耦合方式;块内采用 32位高性能单片机,内置优秀的数据处理算法,可实时计算心率并输出心率以及经过处理的心电波形,配合苏州唯理科技心电计算API,可以为用户提供有关心脏的丰富的健康和疾病分析指标。 基于苏州唯理自研芯片WL128,我们开发出了一套精简高效的心电采集模,而且还可以同步输出WLS128芯片的原始心块,可搭配蓝牙或串口传输数据,电采样的24bit数据,模块使用邮票孔和标准2.54mm插口的方式引出了数据和电源接口,且电极的信号可通过 5pin 间距1.27mm 的排座引出,使用方式灵活集成简单。
使用自研量产芯片,性能优越,响应迅速。
模块功耗达到最优,超低功耗,满足不同场景需求。
模块集成度高,成本大幅降低。
拥有配套算法,高效精准。
提供OEM等各种合作形式。
蓝牙传输速度快,适配广泛无丢包。
监测精度高,附带相关参数分析。
经过市场多家厂商使用认证。
安全指标高,能够通过相关法规认证达到投产目的。
输入工作电压 3.3V-5.0V。
系统噪声约5uVpp。
前置放大倍数6倍。
采样率250~500sps。
数据分辨率24bit。
状态指示灯:包括待机,数据发送,模块状态异常等不同状态的显示。
标准串口协议数据输出(115200~921600波特率,1个停止位,8个数据位,无奇偶校验)。
具有状态反馈引脚(INT),主机可通过不同的电。
唯理心电云端API功能介绍
不规则心率检测
评估身体疲劳程度
评估身体亚健康程度
精准快速的心率99.8%
评估交感神经与副交感神经的兴奋度
评估精神压力
评估猝死风险
方案优势
数年从事生物电、脑机接口领域,拥有大量经验积累
强大专业的硬件研发以及软件算法工程师团队
具有状态反馈引脚,主机可通过不同的电平变化获取模块当前实时状态
内置快速心率算法,可在2~3s内输出准确的心率值
高客户满意度,服务覆盖全国
应用领域
关于我们
收起阅读 »
后端开发,如何做接口测试
因为做后端开发,不可能等uniapp前端开发完成,才进行接口测试的,而是在后端自己开发的时候,应该就需要自己做单元测试的。
而现代的接口,后端又不太好自己调用浏览器去测试。因为需要设置请求的header和body参数,这些后端都很难自己去测试的。
假如后端自己去通过Junit等单元测试类去做测试,也不是不行,但是测试效率非常慢,比如在java中,运行一个Junit,需要等待spring boot启动起来,测试效率实在是喜人。而且需要编写代码去实现,非常麻烦。
因为,这里我推荐使用专业的接口测试工具去完成,这里可以使用yunedit-post去做测试:
yuneidt-post做接口测试大概功能如下:
一、接口测试功能:
可以设置接口的url参数、header参数和body体内容,请求后端的接口,然后展示接口的返回结果。
二、接口单元测试功能:
可以编写简单的函数来接收接口返回结果,判断接口返回的数据是否及格。在第一个功能中,需要可以通过肉眼观看接口返回结果来判断接口返回的数据是否正确。但是假如返回的数据比较多比较复杂的时候,肉眼是很难判断接口返回的数据是否符合预期的,这时候就可以使用单元测试功能。
如下图,yunedit-post提供了非常简便的界面,新建单元测试后,函数头是预定义好的,用户只需要去实现函数体即可,也就是只需要关心return的结果即可,return为true则测试通过,为false则测试不通过。
三、后置处理功能-保存接口返回结果功能
可以使用后置处理功能,将接口返回结果保存到yunedit-post的全局变量或组变量当中,因为调用其他接口的时候,可能需要使用这些变量作为接口的输入值。
四、后置处理功能-使用sql清理测试数据功能:
可以定义后置处理的sql脚本,做数据清理工作,数据清理可以使用接口的返回值,也可以使用yunedit-post的变量值。如下图:
五、使用yunedit-post变量作为接口输入参数
上面说到了,接口的返回值可以通过后置处理功能,保存到变量当中,然后在下一个接口中,可以使用这个变量。
一个比较经典的场景是登录接口返回了token,然后使用后置处理功能保存到yunedt-post的全局变量当中,然后调用其他接口的时候,直接引用这个全局变量,如下图所示:
六、自动化测试功能:
一个复杂的功能,往往需要调用数十个接口,假如每次都手工去一一调用,会十分麻烦,因为,可以通过自动化测试,通过界面或自定义脚本去定义接口的执行顺序,如下图:
七、接口分享功能
可以使用一键分享功能,直接分享在yunedut-post已经一定的接口,生成可浏览的文档,如下两图:
然后生成在线文档:
因为做后端开发,不可能等uniapp前端开发完成,才进行接口测试的,而是在后端自己开发的时候,应该就需要自己做单元测试的。
而现代的接口,后端又不太好自己调用浏览器去测试。因为需要设置请求的header和body参数,这些后端都很难自己去测试的。
假如后端自己去通过Junit等单元测试类去做测试,也不是不行,但是测试效率非常慢,比如在java中,运行一个Junit,需要等待spring boot启动起来,测试效率实在是喜人。而且需要编写代码去实现,非常麻烦。
因为,这里我推荐使用专业的接口测试工具去完成,这里可以使用yunedit-post去做测试:
yuneidt-post做接口测试大概功能如下:
一、接口测试功能:
可以设置接口的url参数、header参数和body体内容,请求后端的接口,然后展示接口的返回结果。
二、接口单元测试功能:
可以编写简单的函数来接收接口返回结果,判断接口返回的数据是否及格。在第一个功能中,需要可以通过肉眼观看接口返回结果来判断接口返回的数据是否正确。但是假如返回的数据比较多比较复杂的时候,肉眼是很难判断接口返回的数据是否符合预期的,这时候就可以使用单元测试功能。
如下图,yunedit-post提供了非常简便的界面,新建单元测试后,函数头是预定义好的,用户只需要去实现函数体即可,也就是只需要关心return的结果即可,return为true则测试通过,为false则测试不通过。
三、后置处理功能-保存接口返回结果功能
可以使用后置处理功能,将接口返回结果保存到yunedit-post的全局变量或组变量当中,因为调用其他接口的时候,可能需要使用这些变量作为接口的输入值。
四、后置处理功能-使用sql清理测试数据功能:
可以定义后置处理的sql脚本,做数据清理工作,数据清理可以使用接口的返回值,也可以使用yunedit-post的变量值。如下图:
五、使用yunedit-post变量作为接口输入参数
上面说到了,接口的返回值可以通过后置处理功能,保存到变量当中,然后在下一个接口中,可以使用这个变量。
一个比较经典的场景是登录接口返回了token,然后使用后置处理功能保存到yunedt-post的全局变量当中,然后调用其他接口的时候,直接引用这个全局变量,如下图所示:
六、自动化测试功能:
一个复杂的功能,往往需要调用数十个接口,假如每次都手工去一一调用,会十分麻烦,因为,可以通过自动化测试,通过界面或自定义脚本去定义接口的执行顺序,如下图:
七、接口分享功能
可以使用一键分享功能,直接分享在yunedut-post已经一定的接口,生成可浏览的文档,如下两图:
然后生成在线文档:
收起阅读 »
uniapp 多环境配置打包,比较优雅的解决方案
uniapp 多环境配置打包,比较优雅的解决方案
读取.env.[development|test|staging|production]配置文件进行打包,最终效果如下图可以看到多个环境,
并且我们可以自定义更多的环境配置
前言
由于uniapp的hbuilder开发工具,只提供了development和production的环境编译方式,一般来说,只能做到development和production两个环境的区分。在实际开发中,我们如果有多个环境开发需求和打包需求,尤其是配置多个环境的接口请求地址等配置。
针对这种情况,我在网上找了很多相关的资料,基本都是命令行的方案,使用uniapp的scripts方案也有,但是是把配置信息写到scripts上的,这解决方案也不够优雅,如果有多个配置就显得很拥肿了。
下面,我们一步一步来配置实现如何根据编译环境读取对应的.env文件加载到项目中。(下面只讲vite配置的方式,webpack的配置方式有空再补充)
配置实现
- 项目根目录,自行新增对应的配置文件
- 在package.json文件添加uni-app的scripts,需要配置几个环境就添加几个,关于这个配置的意思,可以去查看其他相关的文档,这里不展开讲述。
配置好后,点击运行和发行就能看到对应的环境选择项了
此时只是有对应的环境选择项,接下来的思路就是,判断对应的script执行环境,来加载不同的.env配置文件,读取到项目中
- 修改vite.config.js文件,重点看注释
import { loadEnv } from 'vite';
import uni from '@dcloudio/vite-plugin-uni';
// import viteCompression from 'vite-plugin-compression';
// https://vitejs.dev/config/
export default (command, mode) => {//uniapp中,这个mode,不用命令行的添加--mode编译的话,是undefined的
let env = undefined;
if(!mode){//这里是为了确保mode有值,假如开发人员直接在开发工具选择编译到浏览器,也能兼容到
if(process.env.NODE_ENV=='production'){
mode = 'production'
}else{
mode = 'development'
}
}
switch (process.env.UNI_SCRIPT){//这个就是第三步配置的uni-app的script,一一对应判断
case 'dev-h5':
mode = 'development';
break;
case 'test-h5':
mode = 'test'
break;
case 'stage-h5':
mode = 'staging'
break;
case 'prod-h5':
mode = 'production'
break;
}
env = loadEnv(mode, __dirname,"APP")
console.log(`编译${mode}环境`)
console.log(env);//此时已经把env配置读取到了,并且这是个json格式,
return {//别试图在这里定义mode,试过了,在uniapp中不起作用,目前方案只想到了用define来做
envPrefix:'APP_',
plugins: [
uni()
],
server: {
host: true,
// open: true,
port: env.APP_PORT,
hmr: {
overlay: true,
},
},
define:{//根据vite的官方文档,可以把define定义的变量名,在项目编译时,识别项目文件中的这个变量名直接替换成env配置,我们把这个变量放到config.js文件中,对env配置进行集中管理
__VITE_ENV__:JSON.stringify(env)
}
};
};
- 接下来在项目中由一个config.js文件来集中管理env相关的配置,再暴露出来给其他业务模块调用。
至此,uniapp的多环境配置已经完成!!!
如果需要命令行配置打包,可以参考其他的博客,直接配置命令行就可以,命令行写--mode参数即可。
uniapp 多环境配置打包,比较优雅的解决方案
读取.env.[development|test|staging|production]配置文件进行打包,最终效果如下图可以看到多个环境,
并且我们可以自定义更多的环境配置
前言
由于uniapp的hbuilder开发工具,只提供了development和production的环境编译方式,一般来说,只能做到development和production两个环境的区分。在实际开发中,我们如果有多个环境开发需求和打包需求,尤其是配置多个环境的接口请求地址等配置。
针对这种情况,我在网上找了很多相关的资料,基本都是命令行的方案,使用uniapp的scripts方案也有,但是是把配置信息写到scripts上的,这解决方案也不够优雅,如果有多个配置就显得很拥肿了。
下面,我们一步一步来配置实现如何根据编译环境读取对应的.env文件加载到项目中。(下面只讲vite配置的方式,webpack的配置方式有空再补充)
配置实现
- 项目根目录,自行新增对应的配置文件
- 在package.json文件添加uni-app的scripts,需要配置几个环境就添加几个,关于这个配置的意思,可以去查看其他相关的文档,这里不展开讲述。
配置好后,点击运行和发行就能看到对应的环境选择项了
此时只是有对应的环境选择项,接下来的思路就是,判断对应的script执行环境,来加载不同的.env配置文件,读取到项目中
- 修改vite.config.js文件,重点看注释
import { loadEnv } from 'vite';
import uni from '@dcloudio/vite-plugin-uni';
// import viteCompression from 'vite-plugin-compression';
// https://vitejs.dev/config/
export default (command, mode) => {//uniapp中,这个mode,不用命令行的添加--mode编译的话,是undefined的
let env = undefined;
if(!mode){//这里是为了确保mode有值,假如开发人员直接在开发工具选择编译到浏览器,也能兼容到
if(process.env.NODE_ENV=='production'){
mode = 'production'
}else{
mode = 'development'
}
}
switch (process.env.UNI_SCRIPT){//这个就是第三步配置的uni-app的script,一一对应判断
case 'dev-h5':
mode = 'development';
break;
case 'test-h5':
mode = 'test'
break;
case 'stage-h5':
mode = 'staging'
break;
case 'prod-h5':
mode = 'production'
break;
}
env = loadEnv(mode, __dirname,"APP")
console.log(`编译${mode}环境`)
console.log(env);//此时已经把env配置读取到了,并且这是个json格式,
return {//别试图在这里定义mode,试过了,在uniapp中不起作用,目前方案只想到了用define来做
envPrefix:'APP_',
plugins: [
uni()
],
server: {
host: true,
// open: true,
port: env.APP_PORT,
hmr: {
overlay: true,
},
},
define:{//根据vite的官方文档,可以把define定义的变量名,在项目编译时,识别项目文件中的这个变量名直接替换成env配置,我们把这个变量放到config.js文件中,对env配置进行集中管理
__VITE_ENV__:JSON.stringify(env)
}
};
};
- 接下来在项目中由一个config.js文件来集中管理env相关的配置,再暴露出来给其他业务模块调用。
至此,uniapp的多环境配置已经完成!!!
如果需要命令行配置打包,可以参考其他的博客,直接配置命令行就可以,命令行写--mode参数即可。