删除错误的代码依旧重新真机运行后依旧报错
我感觉这个编译系统就是在开玩笑的。localStorage我按编辑器选的,说没有这个函数。
而且我把这个代码删了依旧报错。有点秀哦!删了之后我重新真机运行,肯定保存了
我感觉这个编译系统就是在开玩笑的。localStorage我按编辑器选的,说没有这个函数。
而且我把这个代码删了依旧报错。有点秀哦!删了之后我重新真机运行,肯定保存了
android H5+ 应用打包
官方andorid studio 中打包 H5+应用打包有问题,缺少一个 activity ,代码如下:```javascript
<activity
android:name="io.dcloud.PandoraEntryActivity"
android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard"
android:hardwareAccelerated="true"
android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"
android:screenOrientation="user"
android:theme="@style/DCloudTheme"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
<data android:scheme="h5911154b" />
</intent-filter>
</activity>
对应自己的app 名称,以及图标。可以自行修改。下面是自己的AndroidManifest.xml 配置
官方andorid studio 中打包 H5+应用打包有问题,缺少一个 activity ,代码如下:```javascript
<activity
android:name="io.dcloud.PandoraEntryActivity"
android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard"
android:hardwareAccelerated="true"
android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"
android:screenOrientation="user"
android:theme="@style/DCloudTheme"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
<data android:scheme="h5911154b" />
</intent-filter>
</activity>
对应自己的app 名称,以及图标。可以自行修改。下面是自己的AndroidManifest.xml 配置
收起阅读 »
Drawer 抽屉
插件预览图
使用教程
1.插件代码拷贝
- 下载后把components目录下/drawer/drawer.vue文件拷贝到自己项目目录下
2.插件全局配置
- 在项目里main.js中配置如下代码
import drawer from './components/battery/drawer.vue'
Vue.component('drawer',drawer)
3.插件使用
- vue页面使用
<template>
<view>
<drawer :show="drawerShow" @cancel="cancel" @ensure="ensure">
<view>这里是自定义内容区域</view>
</drawer>
<button type="primary" @tap="show">显示</button>
</view>
</template>
<script>
export default {
data() {
return {
drawerShow: false,
};
},
methods: {
//显示抽屉
show(){
this.drawerShow = true;
},
//取消
cancel() {
console.log('您点击了取消按钮')
this.drawerShow = false;
},
//确定
ensure(){
console.log('您点击了确定按钮')
this.drawerShow = false;
}
}
}
</script>
<style lang="less">
</style>
兼容性
uni-app项目中使用都兼容
插件预览图
使用教程
1.插件代码拷贝
- 下载后把components目录下/drawer/drawer.vue文件拷贝到自己项目目录下
2.插件全局配置
- 在项目里main.js中配置如下代码
import drawer from './components/battery/drawer.vue'
Vue.component('drawer',drawer)
3.插件使用
- vue页面使用
<template>
<view>
<drawer :show="drawerShow" @cancel="cancel" @ensure="ensure">
<view>这里是自定义内容区域</view>
</drawer>
<button type="primary" @tap="show">显示</button>
</view>
</template>
<script>
export default {
data() {
return {
drawerShow: false,
};
},
methods: {
//显示抽屉
show(){
this.drawerShow = true;
},
//取消
cancel() {
console.log('您点击了取消按钮')
this.drawerShow = false;
},
//确定
ensure(){
console.log('您点击了确定按钮')
this.drawerShow = false;
}
}
}
</script>
<style lang="less">
</style>
兼容性
uni-app项目中使用都兼容
收起阅读 »分享在Windows申请iOS证书及提交ipa工具
随着xcode的更新,苹果公司已经不直接提供Application Loader这个工具上传IPA了,导致上传ipa比较难搞了。
这里分享介绍一个可以在Windows、跨平台申请iOS证书上传ipa的工具Appuploader,方面跨平台开发没有苹果电脑,或者还不熟悉iOS上架流程的开发者使用。
双重验证码登录,安全放心,已帮助上万开发者提交苹果APP!
1、Windows、Linux、Mac系统都能使用
2、快速申请iOS证书,直接获取p12证书文件
3、一键上传ipa到App Store后台
4、详细配套iOS打包上架教程、专业技术支持!
运行界面!
随着xcode的更新,苹果公司已经不直接提供Application Loader这个工具上传IPA了,导致上传ipa比较难搞了。
这里分享介绍一个可以在Windows、跨平台申请iOS证书上传ipa的工具Appuploader,方面跨平台开发没有苹果电脑,或者还不熟悉iOS上架流程的开发者使用。
双重验证码登录,安全放心,已帮助上万开发者提交苹果APP!
1、Windows、Linux、Mac系统都能使用
2、快速申请iOS证书,直接获取p12证书文件
3、一键上传ipa到App Store后台
4、详细配套iOS打包上架教程、专业技术支持!
运行界面!
收起阅读 »
margin 为一个负的rpx, 转为正px值 正常吗?
详细问题描述
uni-app 设置margin 为一个负的rpx, 居然自动转为了正值, 设置负数的px,则没问题,依然为负数 ==> 希望结果输出负值rpx
(选的新建项目- uniapp -默认模板, 页面是用的scss)
测试简单,恕不贴详细代码.
新手一枚, 不会看什么版本, 只知道 HBulilderX 版本2.4.2.20191115
发现BUG日期: 2019年12月5日17:09:26
不知道算不BUG, 如果不算请忽略
重现步骤
[步骤]
这个很简单,随便给一个标签加一个类名,样式 输入一个负值rpx就可以试试, 比如:
margin: -1rpx
[结果]
margin: 1px
[期望]
margin: -1px (保留数值为负)
联系方式
站内呗
详细问题描述
uni-app 设置margin 为一个负的rpx, 居然自动转为了正值, 设置负数的px,则没问题,依然为负数 ==> 希望结果输出负值rpx
(选的新建项目- uniapp -默认模板, 页面是用的scss)
测试简单,恕不贴详细代码.
新手一枚, 不会看什么版本, 只知道 HBulilderX 版本2.4.2.20191115
发现BUG日期: 2019年12月5日17:09:26
不知道算不BUG, 如果不算请忽略
重现步骤
[步骤]
这个很简单,随便给一个标签加一个类名,样式 输入一个负值rpx就可以试试, 比如:
margin: -1rpx
[结果]
margin: 1px
[期望]
margin: -1px (保留数值为负)
联系方式
站内呗
收起阅读 »前端框架uniapp版玩安卓客户端
自己利用闲余时间使用uniapp开发了一个小开源项目,里面的功能有登录注册,文章列表,其中还使用了nvue等,具体移步参观我的博客地址:https://www.jianshu.com/p/1557569e1b15
自己利用闲余时间使用uniapp开发了一个小开源项目,里面的功能有登录注册,文章列表,其中还使用了nvue等,具体移步参观我的博客地址:https://www.jianshu.com/p/1557569e1b15
收起阅读 »承接UniApp+Android原生底层App混合开发
老铁们大家好,在uniapp开发过程中,如果遇到需要使用到第三方库,jar包时遇到的开发问题,(如pad感应,二维码扫描,地图sdk,安卓系统级功能介入等等等等)时,可以联系我,专业承接,并提供良好的解决方案。有意者请联系我,wx:17189985456。
老铁们大家好,在uniapp开发过程中,如果遇到需要使用到第三方库,jar包时遇到的开发问题,(如pad感应,二维码扫描,地图sdk,安卓系统级功能介入等等等等)时,可以联系我,专业承接,并提供良好的解决方案。有意者请联系我,wx:17189985456。
获取Uni-app页面路由的方式
通常会有需要对某个页面进行收藏,获取页面路由的方式,如路径:pages/category/live/liveURLContent
这时通过函数getcurrentpages获取当前页面栈的实例后调用page.route方法就能拿到了
var pages = getCurrentPages();
var page = (pages[pages.length - 1]).route;
通常会有需要对某个页面进行收藏,获取页面路由的方式,如路径:pages/category/live/liveURLContent
这时通过函数getcurrentpages获取当前页面栈的实例后调用page.route方法就能拿到了
var pages = getCurrentPages();
var page = (pages[pages.length - 1]).route;
收起阅读 »
编译报错,同样的文件。
首先,换新电脑,我把某个项目整体拷贝到新电脑上,都放桌面。正想体验新电脑有多流畅时,编辑器报错了。
错误代码可以搜一下‘编译报错’之类的,各种贴的代码,都很类似,但都不完全一样。我看了各种解决方式,比如,插件没有安装,我会傻到看不出缺少sass编译环境吗;比如css错误,我使用nvue都忽略其他vue文件中的样式错误,这不能使我信服;还有说page文件和manifest文件有问题,我复制的,我看了,里边的注释都一字不差。
当然,每个人都报错不尽相同,或许你们可以从我的排除过程中看到自己的错误。
最后错误当然被我解决了,其实我也莫名其妙的。说一下操作过程吧,1.使用内置浏览器运行,然后手贱点了一下谷歌运行(不出意外,各种报错,不过大部分是我没有使用条件编译造成的)2.关闭浏览器之前,我觉得条件编译有可能是一处问题,同时会不会是node的问题呢(这个项目并没有npm的插件),尝试开启终端,3.终端,开node,.exit退出(这时候浏览器突然显示了页面,貌似问题就这样奇妙的解决了)
关于这次的问题,有可能是条件编译部分出了问题,也有可能是node,大家多尝试各种方法解决吧。
最后,祝大家财源广进。
首先,换新电脑,我把某个项目整体拷贝到新电脑上,都放桌面。正想体验新电脑有多流畅时,编辑器报错了。
错误代码可以搜一下‘编译报错’之类的,各种贴的代码,都很类似,但都不完全一样。我看了各种解决方式,比如,插件没有安装,我会傻到看不出缺少sass编译环境吗;比如css错误,我使用nvue都忽略其他vue文件中的样式错误,这不能使我信服;还有说page文件和manifest文件有问题,我复制的,我看了,里边的注释都一字不差。
当然,每个人都报错不尽相同,或许你们可以从我的排除过程中看到自己的错误。
最后错误当然被我解决了,其实我也莫名其妙的。说一下操作过程吧,1.使用内置浏览器运行,然后手贱点了一下谷歌运行(不出意外,各种报错,不过大部分是我没有使用条件编译造成的)2.关闭浏览器之前,我觉得条件编译有可能是一处问题,同时会不会是node的问题呢(这个项目并没有npm的插件),尝试开启终端,3.终端,开node,.exit退出(这时候浏览器突然显示了页面,貌似问题就这样奇妙的解决了)
关于这次的问题,有可能是条件编译部分出了问题,也有可能是node,大家多尝试各种方法解决吧。
最后,祝大家财源广进。
分享关于uniapp和后台信息传输,token会话,uni.request封装的一些方法技巧。
提前背景:
我是主要做后台开发的,用的是thinkphp3.2.最近需要开发小程序。前台数据调用需要我写。在开发的过种中遇到如下问题:
1,如何在每次数据调用中在uni.request中带上用户登录信息。或者说有没有统一的方法。不用每个地方请求都要写上一些登录信息。这样看起来非常不好,使用也不爽;
2,前后端会话的token,如何规定。
3,整体项目中如何针对全局的出错做统一判断,如登录信息不存在。token失效等。
带着上面这些问题,专研了两天。最后分享一些我的解决方案;
问题1:最后使用了封装方法。即我把uni.request放到自己写的方法里,然后所有ajax请求都用自己写的封闭方法:
//接口地址前缀
Vue.prototype.serverUrl="http://xxx.com/index.php/Home";
//封装uni.request方法
Vue.prototype.uni_request=function(params){
/*默认值*/
params.showLoading=params.showLoading==undefined?true:params.showLoading;
params.method=params.method==undefined?"GET":params.method;
params.header=params.header==undefined?{'X-Requested-With':'XMLHttpRequest'}:params.header;
//请求头里一定要带上用户登录信息,没得商量
if(params.header.memberInfo==undefined||params.header.memberInfo==""){
params.header.memberInfo=JSON.stringify({"member_id":uni.getStorageSync("memberInfo").member_id,"token":uni.getStorageSync("memberInfo").token});
}
/**/
if(params.showLoading){
uni.showLoading({mask:true,title:(params.showLoadingTitle?params.showLoadingTitle:"加载中...")});
}
uni.request({
url: this.serverUrl+params.url,
data:params.data,
header:params.header,
method:params.method,
success: (res) => {
var status=res.data.status;
var data=res.data.info;
var loginStatus=res.header.loginStatus;
var newToken=res.header.newToken;
//登录状态:登录异常
if(loginStatus==0||loginStatus==""||loginStatus==undefined){
uni.showModal({
title: data,
content: '',
success:function(){
uni.navigateTo({url:"../Registered/Registered"});
}
});
return;
}
//更新token
if(newToken){
var memberInfo=uni.getStorageSync("memberInfo");
memberInfo.token=newToken;
uni.setStorageSync("memberInfo",memberInfo);
}
//服务端返回错误
if(status!=1){
if(params.fail){
params.fail(res.data);
}else{
uni.showToast({
title: data,
duration: 3000,
"icon":"none"
});
return false;
}
}else{
if(params.success){
params.success(data);
}
}
},
complete: () => {
if(params.showLoading){
uni.hideLoading();
}
}
});
}
以上代码放到main.js中
封装的方法调用:
比如我在首页调用banner:
this.uni_request({
"url":'/Ad/index/?adid=7',
success: (data) => {
this.bannerData=data.data;
},
});
现在我对代码分析讲解一下
1,方法传参按照uni.request的结构来的,传参也是用对象方式来传递的。
接口参数说明:
2,params.showLoading这个是控制加载动画的,默认开启的。
3,params.header.memberInfo(C端向S端发起header头)
这个是C端向S端传递用户的登录参数,包含:member_id,token。
后台我是用thinkphp3.2框架,我把用户检测的方法放到了一个基本类里,整个项目都继承这个类(除了注册,登录类和其它不需要验证用户登录的类)。
4,S端返回的数据
var status=res.data.status;//业务逻辑判断,比如数据不合法,必填字段验证等
var data=res.data.info;//数据,当status和loginStatus为0的时候,返回的是出错的提示内容(Sting)
var loginStatus=res.header.loginStatus;//是获取后面传递过来的登录状态。1为正常,0未异常;
var newToken=res.header.newToken;//S端每隔一定时间会生成新和token,这个时候C端要更新。这里会有一个问题,就是当并发请求的时候会有时间差,等下会在下面讲到;
5,登录状态判断
//登录状态:登录异常
if(loginStatus==0||loginStatus==""||loginStatus==undefined){
uni.showModal({
title: data,
content: '',
success:function(){
uni.navigateTo({url:"../Registered/Registered"});
}
});
return;
}
6,更新token
//更新token
if(newToken){
var memberInfo=uni.getStorageSync("memberInfo");
memberInfo.token=newToken;
uni.setStorageSync("memberInfo",memberInfo);
}
这里要说一下上面提到的并数据并发的时候会有token过期的问题,场景如下:
A在10点登录平台了(这里系统生成新的tokenA)
然后用户在10:31点击某个面页,这个页面有两个ajax请求,是并发的。比如第一个ajax请求banner图,第二个ajax请求数据列表
那么第一个ajax请求带的是tokenA。同时服务器接收到tokenA后,会生成新的tokenB(因为已经过30分钟了)。
同时第二个ajax请求也到达了(这时候带的token还是tokenA,因为是并发请求的,那时候还没有tokenB产生呢),那第二个ajax就会报错了,提示token不对
显示出现的问题大家也知道了,我在解决方案如下:
一个token过渡,即在一定时间(一般5分钟)内,tokenA,tokenB都可以用,即生成新的token,老的token要缓存一下。参考微信的access_token原理。
7,逻辑判断处理
//服务端返回错误
if(status!=1){
if(params.fail){
params.fail(res.data);
}else{
uni.showToast({
title: data,
duration: 3000,
"icon":"none"
});
return false;
}
}else{
if(params.success){
params.success(data);
}
}
当status字段(业务逻辑判断字段,上面讲到了)不为0的时候如果用户定义了fail方法则调用用户的fail方法,没有定义fail则弹出提示框,并返回。
success也是。但success没有默认的处理机制,因为方法不知道你调用成功了要干什么啊,所以一般success一般都要定义的。
注意:
上面的success和fail方法是在业务逻辑判断后所用的回调,和uni.request定义的success,fail不一样地。
以上是根据我的项目需地写的方法,欢迎大家探讨,针对我的方法不合理之处提出指导。
附件是main.js和后端的一些代码,我打包传上来了。
提前背景:
我是主要做后台开发的,用的是thinkphp3.2.最近需要开发小程序。前台数据调用需要我写。在开发的过种中遇到如下问题:
1,如何在每次数据调用中在uni.request中带上用户登录信息。或者说有没有统一的方法。不用每个地方请求都要写上一些登录信息。这样看起来非常不好,使用也不爽;
2,前后端会话的token,如何规定。
3,整体项目中如何针对全局的出错做统一判断,如登录信息不存在。token失效等。
带着上面这些问题,专研了两天。最后分享一些我的解决方案;
问题1:最后使用了封装方法。即我把uni.request放到自己写的方法里,然后所有ajax请求都用自己写的封闭方法:
//接口地址前缀
Vue.prototype.serverUrl="http://xxx.com/index.php/Home";
//封装uni.request方法
Vue.prototype.uni_request=function(params){
/*默认值*/
params.showLoading=params.showLoading==undefined?true:params.showLoading;
params.method=params.method==undefined?"GET":params.method;
params.header=params.header==undefined?{'X-Requested-With':'XMLHttpRequest'}:params.header;
//请求头里一定要带上用户登录信息,没得商量
if(params.header.memberInfo==undefined||params.header.memberInfo==""){
params.header.memberInfo=JSON.stringify({"member_id":uni.getStorageSync("memberInfo").member_id,"token":uni.getStorageSync("memberInfo").token});
}
/**/
if(params.showLoading){
uni.showLoading({mask:true,title:(params.showLoadingTitle?params.showLoadingTitle:"加载中...")});
}
uni.request({
url: this.serverUrl+params.url,
data:params.data,
header:params.header,
method:params.method,
success: (res) => {
var status=res.data.status;
var data=res.data.info;
var loginStatus=res.header.loginStatus;
var newToken=res.header.newToken;
//登录状态:登录异常
if(loginStatus==0||loginStatus==""||loginStatus==undefined){
uni.showModal({
title: data,
content: '',
success:function(){
uni.navigateTo({url:"../Registered/Registered"});
}
});
return;
}
//更新token
if(newToken){
var memberInfo=uni.getStorageSync("memberInfo");
memberInfo.token=newToken;
uni.setStorageSync("memberInfo",memberInfo);
}
//服务端返回错误
if(status!=1){
if(params.fail){
params.fail(res.data);
}else{
uni.showToast({
title: data,
duration: 3000,
"icon":"none"
});
return false;
}
}else{
if(params.success){
params.success(data);
}
}
},
complete: () => {
if(params.showLoading){
uni.hideLoading();
}
}
});
}
以上代码放到main.js中
封装的方法调用:
比如我在首页调用banner:
this.uni_request({
"url":'/Ad/index/?adid=7',
success: (data) => {
this.bannerData=data.data;
},
});
现在我对代码分析讲解一下
1,方法传参按照uni.request的结构来的,传参也是用对象方式来传递的。
接口参数说明:
2,params.showLoading这个是控制加载动画的,默认开启的。
3,params.header.memberInfo(C端向S端发起header头)
这个是C端向S端传递用户的登录参数,包含:member_id,token。
后台我是用thinkphp3.2框架,我把用户检测的方法放到了一个基本类里,整个项目都继承这个类(除了注册,登录类和其它不需要验证用户登录的类)。
4,S端返回的数据
var status=res.data.status;//业务逻辑判断,比如数据不合法,必填字段验证等
var data=res.data.info;//数据,当status和loginStatus为0的时候,返回的是出错的提示内容(Sting)
var loginStatus=res.header.loginStatus;//是获取后面传递过来的登录状态。1为正常,0未异常;
var newToken=res.header.newToken;//S端每隔一定时间会生成新和token,这个时候C端要更新。这里会有一个问题,就是当并发请求的时候会有时间差,等下会在下面讲到;
5,登录状态判断
//登录状态:登录异常
if(loginStatus==0||loginStatus==""||loginStatus==undefined){
uni.showModal({
title: data,
content: '',
success:function(){
uni.navigateTo({url:"../Registered/Registered"});
}
});
return;
}
6,更新token
//更新token
if(newToken){
var memberInfo=uni.getStorageSync("memberInfo");
memberInfo.token=newToken;
uni.setStorageSync("memberInfo",memberInfo);
}
这里要说一下上面提到的并数据并发的时候会有token过期的问题,场景如下:
A在10点登录平台了(这里系统生成新的tokenA)
然后用户在10:31点击某个面页,这个页面有两个ajax请求,是并发的。比如第一个ajax请求banner图,第二个ajax请求数据列表
那么第一个ajax请求带的是tokenA。同时服务器接收到tokenA后,会生成新的tokenB(因为已经过30分钟了)。
同时第二个ajax请求也到达了(这时候带的token还是tokenA,因为是并发请求的,那时候还没有tokenB产生呢),那第二个ajax就会报错了,提示token不对
显示出现的问题大家也知道了,我在解决方案如下:
一个token过渡,即在一定时间(一般5分钟)内,tokenA,tokenB都可以用,即生成新的token,老的token要缓存一下。参考微信的access_token原理。
7,逻辑判断处理
//服务端返回错误
if(status!=1){
if(params.fail){
params.fail(res.data);
}else{
uni.showToast({
title: data,
duration: 3000,
"icon":"none"
});
return false;
}
}else{
if(params.success){
params.success(data);
}
}
当status字段(业务逻辑判断字段,上面讲到了)不为0的时候如果用户定义了fail方法则调用用户的fail方法,没有定义fail则弹出提示框,并返回。
success也是。但success没有默认的处理机制,因为方法不知道你调用成功了要干什么啊,所以一般success一般都要定义的。
注意:
上面的success和fail方法是在业务逻辑判断后所用的回调,和uni.request定义的success,fail不一样地。
以上是根据我的项目需地写的方法,欢迎大家探讨,针对我的方法不合理之处提出指导。
附件是main.js和后端的一些代码,我打包传上来了。
收起阅读 »uni-app 云开发
-
安装项目
vue create -p dcloudio/uni-preset-vue my-project
-
APP.vue 增加代码,增加云操作
onLaunch: function() { console.log('App Launch'); if (!wx.cloud) { console.error('请使用 2.2.3 或以上的基础库以使用云能力'); } else { wx.cloud.init({ traceUser: true }) } }
-
开通云开发
AppID 首次开通云环境后,需等待大约 10 分钟方可正常使用云 API,在此期间官方后台服务正在做准备服务,所以只需等待10分钟后再次调用即可。
VM54:1 cloud init error: Error: invalid scope 没有权限,请先开通云服务 // 报错信息 -
我建立了一个云项目作为参考,目录大概如下
-
查询数据库
在(开发者工具-数据库-集合名称) 上建立新的集合
参考云项目的 src/pages/databaseGuide的操作数据库的方法 -
云函数
在(开发者工具-云函数) 上新建云函数
参考云项目的 src/cloudfunctions操作函数的方法
-
安装项目
vue create -p dcloudio/uni-preset-vue my-project
-
APP.vue 增加代码,增加云操作
onLaunch: function() { console.log('App Launch'); if (!wx.cloud) { console.error('请使用 2.2.3 或以上的基础库以使用云能力'); } else { wx.cloud.init({ traceUser: true }) } }
-
开通云开发
AppID 首次开通云环境后,需等待大约 10 分钟方可正常使用云 API,在此期间官方后台服务正在做准备服务,所以只需等待10分钟后再次调用即可。
VM54:1 cloud init error: Error: invalid scope 没有权限,请先开通云服务 // 报错信息 -
我建立了一个云项目作为参考,目录大概如下
-
查询数据库
在(开发者工具-数据库-集合名称) 上建立新的集合
参考云项目的 src/pages/databaseGuide的操作数据库的方法 -
云函数
在(开发者工具-云函数) 上新建云函数
参考云项目的 src/cloudfunctions操作函数的方法
Android 和 IOS 佳博 蓝牙小票 、标签 打印模板
uni-app 跨平台app框架 佳博打印机蓝牙连接打印机模板
------你还在付费寻找蓝牙打印插件吗?深知现在很难找到开源的蓝牙打印插件,故开源给大家参考,有能力的同学可以自己深度封装-----
使用教程
直接整个项目导入自己电脑即可
兼容
原生Android、IOS和小程序
备注
项目中有开发文档,有能力的同学可以学习下,大家共同成长
uni-app 跨平台app框架 佳博打印机蓝牙连接打印机模板
------你还在付费寻找蓝牙打印插件吗?深知现在很难找到开源的蓝牙打印插件,故开源给大家参考,有能力的同学可以自己深度封装-----
使用教程
直接整个项目导入自己电脑即可
兼容
原生Android、IOS和小程序
备注
项目中有开发文档,有能力的同学可以学习下,大家共同成长
收起阅读 »