HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

app端打开微信客服

微信 App 客服

1.先申请立即去申请
2.在‘开始接入’找到‘在微信外接入’选项进入,填写完成,就可以获取到客服地址url
3.在企业信息里面查看企业ID也就是下面的corpid
4.打自定义包测试。

// #ifdef APP-PLUS  
            let sweixin = null  
            plus.share.getServices(res=>{  
                sweixin = res.find(i => i.id === 'weixin')  
                if(sweixin){  
                    sweixin.openCustomerServiceChat({  
                        corpid: '企业ID',  
                        url: '客服地址',  
                    },suc=>{  
                        console.log("success",JSON.stringify(res))  
                    },err=>{  
                        console.log("error",JSON.stringify(err))  
                    })  
                }else{  
                    plus.nativeUI.alert('当前环境不支持微信操作!')  
                }  
            },function(){  
                uni.showToast({title: "获取服务失败,不支持该操作。"+JSON.stringify(e), icon: 'error'})  
            })  
            // #endif
继续阅读 »

1.先申请立即去申请
2.在‘开始接入’找到‘在微信外接入’选项进入,填写完成,就可以获取到客服地址url
3.在企业信息里面查看企业ID也就是下面的corpid
4.打自定义包测试。

// #ifdef APP-PLUS  
            let sweixin = null  
            plus.share.getServices(res=>{  
                sweixin = res.find(i => i.id === 'weixin')  
                if(sweixin){  
                    sweixin.openCustomerServiceChat({  
                        corpid: '企业ID',  
                        url: '客服地址',  
                    },suc=>{  
                        console.log("success",JSON.stringify(res))  
                    },err=>{  
                        console.log("error",JSON.stringify(err))  
                    })  
                }else{  
                    plus.nativeUI.alert('当前环境不支持微信操作!')  
                }  
            },function(){  
                uni.showToast({title: "获取服务失败,不支持该操作。"+JSON.stringify(e), icon: 'error'})  
            })  
            // #endif
收起阅读 »

uniapp安卓端获取本地文件base64转化成字节数组

Android base64

通过文件选择插件获取本地文件路径 文件选择插件

//this.pathArr[0].url 为文件路径  
void plus.io.resolveLocalFileSystemURL(this.pathArr[0].url, (FileEntry) => {  
                    FileEntry.file((file) => {  
                        var fileReader = new plus.io.FileReader();  

                        fileReader.readAsDataURL(file);  
                        fileReader.onloadend = function(evt) {  
                                                //evt.target.result 为 base64数据  
                            _this.base64Toutf8(evt.target.result)  
                        }  
                    })  

                });  
            },
//根据base64转字节数组  
            base64Toutf8(base64) {  
                               //去除base64文件头  
                base64 = base64.replace(/^data:+.+;base64,/, "");  
                var strArr = [];  
                var n = 256;  
                var l = base64.length;  
                console.log(base64)  
                console.log(l)  
                for (let i = 0; i < l / n; i++) {  
                    let a = base64.slice(n * i, n * (i + 1))  
                    strArr.push(a)  
                }  
                let byteArr = []  
                let byteArr2=[]  
                let Base64 = plus.android.importClass("java.util.Base64");  
                let decoder = Base64.getDecoder();  
                for (let k = 0; k < strArr.length; k++) {  
                    let bytes = decoder.decode(strArr[k]);  
                    if (bytes !== null) {  
                        for (let j = 0; j < bytes.length; j++) {  
                            bytes[j] = bytes[j] & 0xFF  
                        }  
                        byteArr.push(...bytes)  
                    } else {  
                        console.log(strArr[k])  
                    }  
                }  

            },
继续阅读 »

通过文件选择插件获取本地文件路径 文件选择插件

//this.pathArr[0].url 为文件路径  
void plus.io.resolveLocalFileSystemURL(this.pathArr[0].url, (FileEntry) => {  
                    FileEntry.file((file) => {  
                        var fileReader = new plus.io.FileReader();  

                        fileReader.readAsDataURL(file);  
                        fileReader.onloadend = function(evt) {  
                                                //evt.target.result 为 base64数据  
                            _this.base64Toutf8(evt.target.result)  
                        }  
                    })  

                });  
            },
//根据base64转字节数组  
            base64Toutf8(base64) {  
                               //去除base64文件头  
                base64 = base64.replace(/^data:+.+;base64,/, "");  
                var strArr = [];  
                var n = 256;  
                var l = base64.length;  
                console.log(base64)  
                console.log(l)  
                for (let i = 0; i < l / n; i++) {  
                    let a = base64.slice(n * i, n * (i + 1))  
                    strArr.push(a)  
                }  
                let byteArr = []  
                let byteArr2=[]  
                let Base64 = plus.android.importClass("java.util.Base64");  
                let decoder = Base64.getDecoder();  
                for (let k = 0; k < strArr.length; k++) {  
                    let bytes = decoder.decode(strArr[k]);  
                    if (bytes !== null) {  
                        for (let j = 0; j < bytes.length; j++) {  
                            bytes[j] = bytes[j] & 0xFF  
                        }  
                        byteArr.push(...bytes)  
                    } else {  
                        console.log(strArr[k])  
                    }  
                }  

            },
收起阅读 »

长期招聘全职uniapp开发,主要为APP。月薪2W到3W。

招聘 uniapp

长期招聘全职uniapp开发,主要为APP。月薪2W到3W。

**需远程连接进行开发,可个人,可签合同。

要求:
3年及以上开发经验

uniapp技术栈:必须熟练掌握以下 (npro和uview,nvue,sass,unicloud)

项目经验丰富,能够快速理解并上手他人项目,对项目进行继续开发。

时间充裕,工作态度认真,代码逻辑严谨**

有意者联系V:oyo476

有人监工,不适合划水。

继续阅读 »

长期招聘全职uniapp开发,主要为APP。月薪2W到3W。

**需远程连接进行开发,可个人,可签合同。

要求:
3年及以上开发经验

uniapp技术栈:必须熟练掌握以下 (npro和uview,nvue,sass,unicloud)

项目经验丰富,能够快速理解并上手他人项目,对项目进行继续开发。

时间充裕,工作态度认真,代码逻辑严谨**

有意者联系V:oyo476

有人监工,不适合划水。

收起阅读 »

发现一款可以生成uniapp项目代码的工具

http://wtm.plus

可以在线拖拽制作页面,能在线预览,并且可以下载完整的uniapp项目代码,可以直接用hbuilder打开运行的。

http://wtm.plus

可以在线拖拽制作页面,能在线预览,并且可以下载完整的uniapp项目代码,可以直接用hbuilder打开运行的。

nvue map 高德地图组件升级、离线个性化地图、离线设置样式文件、可使用nvue map 所有功能

nvue map 高德地图组件升级、离线个性化地图、离线设置样式文件、可使用nvue map 所有功能:https://ext.dcloud.net.cn/plugin?id=7637

继续阅读 »

nvue map 高德地图组件升级、离线个性化地图、离线设置样式文件、可使用nvue map 所有功能:https://ext.dcloud.net.cn/plugin?id=7637

收起阅读 »

【报Bug】uni.getSystemInfoSync().safeAreaInsets.bottom为 -48 的错误

bug反馈

【报Bug】uni.getSystemInfoSync().safeAreaInsets.bottom为 -48 的错误 Hbuilder v3.3.11

【报Bug】uni.getSystemInfoSync().safeAreaInsets.bottom为 -48 的错误 Hbuilder v3.3.11

android端实体返回键阻止返回上一页且实现点击两次退出

nativeUI

在页面中加入一下代码:

data() {  
            return {  
                backButtonPress: 0  
            }  
        }  

......  

onBackPress() {  
            this.backButtonPress ++  
            if (this.backButtonPress > 1) {  
                plus.runtime.quit()  
            } else {  
                plus.nativeUI.toast(this.$t('app.quit'))  
            }  
            setTimeout(() => {  
                this.backButtonPress = 0;  
            }, 2000)  
            return true  
        }

将backButtonPress设置为0的延时处理,设置为2000毫秒,为了和plus.nativeUI.toast默认的显示时长保持一致:

https://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.toast
https://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.ToastStyles

duration: (String 类型 )提示消息框显示的时间
可选值为"long"、"short",值为"long"时显示时间约为3.5s,值为"short"时显示时间约为2s,未设置时默认值为"short"。

继续阅读 »

在页面中加入一下代码:

data() {  
            return {  
                backButtonPress: 0  
            }  
        }  

......  

onBackPress() {  
            this.backButtonPress ++  
            if (this.backButtonPress > 1) {  
                plus.runtime.quit()  
            } else {  
                plus.nativeUI.toast(this.$t('app.quit'))  
            }  
            setTimeout(() => {  
                this.backButtonPress = 0;  
            }, 2000)  
            return true  
        }

将backButtonPress设置为0的延时处理,设置为2000毫秒,为了和plus.nativeUI.toast默认的显示时长保持一致:

https://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.toast
https://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.ToastStyles

duration: (String 类型 )提示消息框显示的时间
可选值为"long"、"short",值为"long"时显示时间约为3.5s,值为"short"时显示时间约为2s,未设置时默认值为"short"。

收起阅读 »

uni-app 实现Map地图聚合功能,可自定义聚合图标样式,支持app的nvue/微信小程序的vue/H5,可以设置或定 死地图的俯视角度/倾斜角度

uni-app 实现Map地图聚合功能,可自定义聚合图标样式,支持app的nvue/微信小程序的vue/H5,可以设置或定 死地图的俯视角度/倾斜角度

由于uni-app的api兼容性,造成个平台的聚合样式可能不同

有偿提供源码

QQ:543610866

继续阅读 »

uni-app 实现Map地图聚合功能,可自定义聚合图标样式,支持app的nvue/微信小程序的vue/H5,可以设置或定 死地图的俯视角度/倾斜角度

由于uni-app的api兼容性,造成个平台的聚合样式可能不同

有偿提供源码

QQ:543610866

收起阅读 »

界面建议

增加一个菜单或选项卡组或复选按钮组,可以选择在IDE中显示的标签。这样可以减少非必要标签的拥挤,减少开发者的视觉干扰,因为同名不同项目按“页面名-项目名”取名的标签也不需要这样的格式了,进一步节省了视觉空间,除非同名页面的两个项目都是同时显示的。

增加一个菜单或选项卡组或复选按钮组,可以选择在IDE中显示的标签。这样可以减少非必要标签的拥挤,减少开发者的视觉干扰,因为同名不同项目按“页面名-项目名”取名的标签也不需要这样的格式了,进一步节省了视觉空间,除非同名页面的两个项目都是同时显示的。

关于HBuilderX logo的建议

优化建议

HBuilderX 在mac上logo 过于"粗旷", 显得格格不入,希望mac版本匹配mac os的视觉风格。

HBuilderX 在mac上logo 过于"粗旷", 显得格格不入,希望mac版本匹配mac os的视觉风格。

文件选择器、快速查询文件、自定义路径、完全自定义UI界面、可多选、自定义类型(android)

文件选择器、快速查询文件、自定义路径、完全自定义UI界面、可多选、自定义类型(android):https://ext.dcloud.net.cn/plugin?id=7608

继续阅读 »

文件选择器、快速查询文件、自定义路径、完全自定义UI界面、可多选、自定义类型(android):https://ext.dcloud.net.cn/plugin?id=7608

收起阅读 »

微信小程序源码+开源H5小游戏代码全套

微信小程序

  微信小程序和小游戏源代码创建思路:
  1.6万套微信小程序和小游戏源代码:casgams.top/gm
  ●创建一个数字猜测游戏,在其中用户选择一个范围;
  ●假设用户选择了一个范围,例如,从a到B,其中a和B属于Integer;
  ●系统将选择某个随机整数,用户必须在猜测的最小次数中猜测这个整数。
  源码分析:
  解释1:如果用户输入范围是1到100。编译器随机选择42作为整数。现在猜谜游戏开始了,所以用户输入50作为他/她的第一猜。编译器显示“Try Again!”你猜得太高了。”这意味着随机数(即42)不会落在50到100之间。这就是猜范围的一半的重要性。再一次,用户猜50的一半(你能告诉我为什么吗?)50的一半是25。用户输入25作为他/她的第二个猜测。这一次,编译器将显示“Try Again!”你猜的太小了。”这意味着小于25的整数(从1到25)是无法猜测的。现在用户猜测的范围更短了,即从25到50。智能!用户猜了这个范围的一半,所以,用户第三次猜37。这一次,编译器再次显示输出:“重试!”你猜的太小了。”对于用户来说,每猜一次,猜测范围就会变小。用户的猜测范围是37到50,用户的第四次猜测是43。这一次,编译器将显示“Try Again!”你猜得太高了。”因此,用户的猜测范围将从37到43,同样,用户猜测的是这个范围的一半,即40作为他/她的第五次猜测。这一次,编译器显示输出:“Try Again!”你猜的太小了。”让猜测更小,从41到43。现在用户第六次猜41。这是错误的,显示输出“Try Again!”你猜的太小了。”最后,用户第七次猜对了42。
  总猜测次数= 7
  解释2:如果用户输入范围是1到50。编译器随机选择42作为整数。现在猜谜游戏开始了。50的一半是25。用户输入25作为他/她的第一个猜测。这一次,编译器将显示“Try Again!”你猜的太小了。”这意味着小于25的整数(从1到25)是无法猜测的。现在用户猜测的范围更短了,即从25到50。智能!用户猜了这个范围的一半,所以,用户猜了37作为他/她的第二次猜测。这一次,编译器再次显示输出:“重试!”你猜的太小了。”对于用户来说,每猜一次,猜测范围就会变小。现在,用户的猜测范围是37到50,用户第三次猜43。这一次,编译器将显示“Try Again!”你猜得太高了。”因此,用户的猜测范围将从37到43,同样,用户猜测的是这个范围的一半,即40作为他/她的第四次猜测。这一次,编译器显示输出:“Try Again!”你猜的太小了。”让猜测更小,从41到43。现在用户第五次猜41。这是错误的,显示输出“Try Again!”你猜的太小了。”最后,用户第六次猜对了42。
  总猜测次数= 6
  所以,猜测的最小次数取决于范围。编译器必须计算出猜测的最小次数,这取决于范围本身。对于这个,我们有一个公式:
  Minimum number of guessing = log2(Upper bound – lower bound + 1)
  代码算法步骤如下:
  ●用户输入范围的上界和下界;
  ●编译器在范围之间生成一个随机整数,并将其存储在一个变量中,以备将来引用;
  ●为了进行重复猜测,将初始化一个while循环;
  ●如果用户猜测的数字大于随机选择的数字,用户将得到一个输出“重试!”你猜得太高了。”;
  ●如果用户猜测的数字小于随机选择的数字,用户将得到一个输出“Try Again!”你猜的太小了。”;
  ●如果用户猜了最少的次数,用户就会得到一个“恭喜!”输出;
  ●否则,如果用户没有在最小猜测次数中猜出整数,他/她将得到“Better Luck Next Time!””输出。
  源码实现如下:
  import random
  import math
  # Taking Inputs
  lower = int(input("Enter Lower bound:- "))
  # Taking Inputs
  upper = int(input("Enter Upper bound:- "))
  # generating random number between
  # the lower and upper
  x = random.randint(lower, upper)
  print("\n\tYou've only ",
  round(math.log(upper - lower + 1, 2)),
  " chances to guess the integer!\n")
  # Initializing the number of guesses.
  count = 0
  # for calculation of minimum number of
  # guesses depends upon range
  while count < math.log(upper - lower + 1, 2):
  count += 1
  # taking guessing number as input
  guess = int(input("Guess a number:- "))
  # Condition testing
  if x == guess:
  print("Congratulations you did it in ",
  count, " try")
  # Once guessed, loop will break
  break
  elif x > guess:
  print("You guessed too small!")
  elif x < guess:
  print("You Guessed too high!")
  # If Guessing is more than required guesses,
  # shows this output.
  if count >= math.log(upper - lower + 1, 2):
  print("\nThe number is %d" % x)
  print("\tBetter Luck Next time!")
  # Better to use This source Code on pycharm!
  下面是上面程序的输出结果:

继续阅读 »

  微信小程序和小游戏源代码创建思路:
  1.6万套微信小程序和小游戏源代码:casgams.top/gm
  ●创建一个数字猜测游戏,在其中用户选择一个范围;
  ●假设用户选择了一个范围,例如,从a到B,其中a和B属于Integer;
  ●系统将选择某个随机整数,用户必须在猜测的最小次数中猜测这个整数。
  源码分析:
  解释1:如果用户输入范围是1到100。编译器随机选择42作为整数。现在猜谜游戏开始了,所以用户输入50作为他/她的第一猜。编译器显示“Try Again!”你猜得太高了。”这意味着随机数(即42)不会落在50到100之间。这就是猜范围的一半的重要性。再一次,用户猜50的一半(你能告诉我为什么吗?)50的一半是25。用户输入25作为他/她的第二个猜测。这一次,编译器将显示“Try Again!”你猜的太小了。”这意味着小于25的整数(从1到25)是无法猜测的。现在用户猜测的范围更短了,即从25到50。智能!用户猜了这个范围的一半,所以,用户第三次猜37。这一次,编译器再次显示输出:“重试!”你猜的太小了。”对于用户来说,每猜一次,猜测范围就会变小。用户的猜测范围是37到50,用户的第四次猜测是43。这一次,编译器将显示“Try Again!”你猜得太高了。”因此,用户的猜测范围将从37到43,同样,用户猜测的是这个范围的一半,即40作为他/她的第五次猜测。这一次,编译器显示输出:“Try Again!”你猜的太小了。”让猜测更小,从41到43。现在用户第六次猜41。这是错误的,显示输出“Try Again!”你猜的太小了。”最后,用户第七次猜对了42。
  总猜测次数= 7
  解释2:如果用户输入范围是1到50。编译器随机选择42作为整数。现在猜谜游戏开始了。50的一半是25。用户输入25作为他/她的第一个猜测。这一次,编译器将显示“Try Again!”你猜的太小了。”这意味着小于25的整数(从1到25)是无法猜测的。现在用户猜测的范围更短了,即从25到50。智能!用户猜了这个范围的一半,所以,用户猜了37作为他/她的第二次猜测。这一次,编译器再次显示输出:“重试!”你猜的太小了。”对于用户来说,每猜一次,猜测范围就会变小。现在,用户的猜测范围是37到50,用户第三次猜43。这一次,编译器将显示“Try Again!”你猜得太高了。”因此,用户的猜测范围将从37到43,同样,用户猜测的是这个范围的一半,即40作为他/她的第四次猜测。这一次,编译器显示输出:“Try Again!”你猜的太小了。”让猜测更小,从41到43。现在用户第五次猜41。这是错误的,显示输出“Try Again!”你猜的太小了。”最后,用户第六次猜对了42。
  总猜测次数= 6
  所以,猜测的最小次数取决于范围。编译器必须计算出猜测的最小次数,这取决于范围本身。对于这个,我们有一个公式:
  Minimum number of guessing = log2(Upper bound – lower bound + 1)
  代码算法步骤如下:
  ●用户输入范围的上界和下界;
  ●编译器在范围之间生成一个随机整数,并将其存储在一个变量中,以备将来引用;
  ●为了进行重复猜测,将初始化一个while循环;
  ●如果用户猜测的数字大于随机选择的数字,用户将得到一个输出“重试!”你猜得太高了。”;
  ●如果用户猜测的数字小于随机选择的数字,用户将得到一个输出“Try Again!”你猜的太小了。”;
  ●如果用户猜了最少的次数,用户就会得到一个“恭喜!”输出;
  ●否则,如果用户没有在最小猜测次数中猜出整数,他/她将得到“Better Luck Next Time!””输出。
  源码实现如下:
  import random
  import math
  # Taking Inputs
  lower = int(input("Enter Lower bound:- "))
  # Taking Inputs
  upper = int(input("Enter Upper bound:- "))
  # generating random number between
  # the lower and upper
  x = random.randint(lower, upper)
  print("\n\tYou've only ",
  round(math.log(upper - lower + 1, 2)),
  " chances to guess the integer!\n")
  # Initializing the number of guesses.
  count = 0
  # for calculation of minimum number of
  # guesses depends upon range
  while count < math.log(upper - lower + 1, 2):
  count += 1
  # taking guessing number as input
  guess = int(input("Guess a number:- "))
  # Condition testing
  if x == guess:
  print("Congratulations you did it in ",
  count, " try")
  # Once guessed, loop will break
  break
  elif x > guess:
  print("You guessed too small!")
  elif x < guess:
  print("You Guessed too high!")
  # If Guessing is more than required guesses,
  # shows this output.
  if count >= math.log(upper - lower + 1, 2):
  print("\nThe number is %d" % x)
  print("\tBetter Luck Next time!")
  # Better to use This source Code on pycharm!
  下面是上面程序的输出结果:

收起阅读 »