HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

android NFC MifareClassic 读IC卡加密扇区方法

uniapp Native.JS NFC Android

近段时间在做android下NFC的M1卡的加密扇区的读取,参考了Android_磊子的操作基础内容,但是涉及到MifareClassic类操作验证未能找到相关资料,后来查看了MifareClassic类的源代码和基于android原生案例,实现了加密扇区读取。分享下代码,希望对大家有帮助。
对于NFC操作的基本部分有很多资料都一样的,这里不再赘述,仅简单介绍MifareClassic验证和读取的过程
1、创建MifareClassic对象,MifareClassic.get(tag);
2、建立MifareClassic类连接,MifareClassic.connect();
3、对扇区(0-15)进行验证,按KeyA和KeyB两种验证,
 (1) MifareClassic.authenticateSectorWithKeyA(sector,key);
  其中sector为扇区号,key为6字节验证码,此处Key需要处理为-128至127的字节,开始使用0x00-0xFF会报错
 (2) MifareClassic.authenticateSectorWithKeyB(sector,key);
  其中sector为扇区号,key为6字节验证码,此处Key需要处理为-128至127的字节,开始使用0x00-0xFF会报错
4、按块(sector*4+i)读取扇区内的16Byte内容,MifareClassic.readBlock(Block);
Block0=sector×4+0;
Block1=sector×4+1;
Block2=sector×4+2;
Block3=sector×4+3;
5、关闭MifareClassic连接,MifareClassic.close();
MifareClassic读取代码

//MifareClassic读取代码  
readData:function(intent){  
    var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
    var techList = tag.getTechList();  
    var bisMfc=false;  
    for(var i=0;i<techList.length;i++){  
        if(techList[i].indexOf('MifareClassic')>=0){  
            bisMfc=true;  
            break;  
        }  
    }  
    if(!bisMfc){  
        this.ICERROR='卡片类型错误!';  
        return;  
    }  
    var mfc=MifareClassic.get(tag);  
    if(!mfc){  
        this.ICERROR='卡片获取错误!';  
        return;  
    }  
    mfc.setTimeout(3000);  
    if(!mfc.isConnected()){  
        try{  
            invoke(mfc,'connect');   
        }catch(e){  
            this.ICERROR='卡片连接错误!';  
            return;  
        }  
    }  
    try{  
        this.ICUID=this.ByteArrayToHexString(tag.getId());  
        var cmdBytes=this.HexStringToByteArray(this.keyVal);  
        var auth=false;  
        if(this.keyType=="A"){  
            auth=invoke(mfc,"authenticateSectorWithKeyA",parseInt(this.sector),cmdBytes);  
        }else{  
            auth=invoke(mfc,"authenticateSectorWithKeyB",parseInt(this.sector),cmdBytes);  
        }  
        if(!auth){  
            this.ICERROR='扇区验证失败';  
            return;  
        }  
        var sectorData=[];  
        var tmpRet;  
        this.ICData='IC卡扇区数据>>';  
        for(var i=0;i<4;i++){   
            tmpRet=invoke(mfc,"readBlock",this.sector*4+i);  
            this.ICData=this.ICData+'\n';  
            this.ICData=this.ICData+this.ByteArrayToHexString(tmpRet);  
            sectorData.push.apply(sectorData,tmpRet);  
        }  
        console.log(this.ByteArrayToHexString(sectorData));  
        this.ICERROR='读卡完成';  
    }catch(e){  
        this.ICERROR=e.message;  
        console.error(e);   
    }finally{  
        mfc.close();  
    }  
}  
//Key处理函数  
HexStringToByteArray:function(instr) {  
    var hexA = new Array();  
    var pos = 0;  
    var len = instr.length/2;  
    for(var i=0; i<len; i++)  
    {  
        var s = instr.substr(pos, 2);  
        var v = parseInt(s, 16);  
        if(v>=128)  
            v=v-256;  
        hexA.push(v);  
        pos += 2;  
    }  
    return hexA;  
}

项目是基于nui-app项目的vue测试通过的,附件共享了vue文件。
项目需设置android.permission.NFC权限。

继续阅读 »

近段时间在做android下NFC的M1卡的加密扇区的读取,参考了Android_磊子的操作基础内容,但是涉及到MifareClassic类操作验证未能找到相关资料,后来查看了MifareClassic类的源代码和基于android原生案例,实现了加密扇区读取。分享下代码,希望对大家有帮助。
对于NFC操作的基本部分有很多资料都一样的,这里不再赘述,仅简单介绍MifareClassic验证和读取的过程
1、创建MifareClassic对象,MifareClassic.get(tag);
2、建立MifareClassic类连接,MifareClassic.connect();
3、对扇区(0-15)进行验证,按KeyA和KeyB两种验证,
 (1) MifareClassic.authenticateSectorWithKeyA(sector,key);
  其中sector为扇区号,key为6字节验证码,此处Key需要处理为-128至127的字节,开始使用0x00-0xFF会报错
 (2) MifareClassic.authenticateSectorWithKeyB(sector,key);
  其中sector为扇区号,key为6字节验证码,此处Key需要处理为-128至127的字节,开始使用0x00-0xFF会报错
4、按块(sector*4+i)读取扇区内的16Byte内容,MifareClassic.readBlock(Block);
Block0=sector×4+0;
Block1=sector×4+1;
Block2=sector×4+2;
Block3=sector×4+3;
5、关闭MifareClassic连接,MifareClassic.close();
MifareClassic读取代码

//MifareClassic读取代码  
readData:function(intent){  
    var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
    var techList = tag.getTechList();  
    var bisMfc=false;  
    for(var i=0;i<techList.length;i++){  
        if(techList[i].indexOf('MifareClassic')>=0){  
            bisMfc=true;  
            break;  
        }  
    }  
    if(!bisMfc){  
        this.ICERROR='卡片类型错误!';  
        return;  
    }  
    var mfc=MifareClassic.get(tag);  
    if(!mfc){  
        this.ICERROR='卡片获取错误!';  
        return;  
    }  
    mfc.setTimeout(3000);  
    if(!mfc.isConnected()){  
        try{  
            invoke(mfc,'connect');   
        }catch(e){  
            this.ICERROR='卡片连接错误!';  
            return;  
        }  
    }  
    try{  
        this.ICUID=this.ByteArrayToHexString(tag.getId());  
        var cmdBytes=this.HexStringToByteArray(this.keyVal);  
        var auth=false;  
        if(this.keyType=="A"){  
            auth=invoke(mfc,"authenticateSectorWithKeyA",parseInt(this.sector),cmdBytes);  
        }else{  
            auth=invoke(mfc,"authenticateSectorWithKeyB",parseInt(this.sector),cmdBytes);  
        }  
        if(!auth){  
            this.ICERROR='扇区验证失败';  
            return;  
        }  
        var sectorData=[];  
        var tmpRet;  
        this.ICData='IC卡扇区数据>>';  
        for(var i=0;i<4;i++){   
            tmpRet=invoke(mfc,"readBlock",this.sector*4+i);  
            this.ICData=this.ICData+'\n';  
            this.ICData=this.ICData+this.ByteArrayToHexString(tmpRet);  
            sectorData.push.apply(sectorData,tmpRet);  
        }  
        console.log(this.ByteArrayToHexString(sectorData));  
        this.ICERROR='读卡完成';  
    }catch(e){  
        this.ICERROR=e.message;  
        console.error(e);   
    }finally{  
        mfc.close();  
    }  
}  
//Key处理函数  
HexStringToByteArray:function(instr) {  
    var hexA = new Array();  
    var pos = 0;  
    var len = instr.length/2;  
    for(var i=0; i<len; i++)  
    {  
        var s = instr.substr(pos, 2);  
        var v = parseInt(s, 16);  
        if(v>=128)  
            v=v-256;  
        hexA.push(v);  
        pos += 2;  
    }  
    return hexA;  
}

项目是基于nui-app项目的vue测试通过的,附件共享了vue文件。
项目需设置android.permission.NFC权限。

收起阅读 »

解决HbuilerX 无法启动的问题

解决 Win HbuilderX无法启动的问题
解决方法如下,删除了注册表中有关hbuilder的东西,就是所有能通过hbuilder字段搜索到的全部删除
然后删除你安装的Hubilder X
然后删除所有用户目录下
例子
C:\Users\用户名\AppData\Roaming\HBuilder X 这个文件夹
然后从官方下载最新的 解压打开就可以使用

继续阅读 »

解决 Win HbuilderX无法启动的问题
解决方法如下,删除了注册表中有关hbuilder的东西,就是所有能通过hbuilder字段搜索到的全部删除
然后删除你安装的Hubilder X
然后删除所有用户目录下
例子
C:\Users\用户名\AppData\Roaming\HBuilder X 这个文件夹
然后从官方下载最新的 解压打开就可以使用

收起阅读 »

郑州app开发外包公司,什么样的公司好呢

移动APP 5+App开发

  找郑州app外包公司开发软件,费用、工期是两个最重要也是最基本的要求。郑州app制作公司知道投资方一般都希望费用越低,工期越短越好,为了拿到单子,很多外包服务商就迎合客户,报开发周期时,就报的很短,就是为了打动客户,先拿下单子再说,但实际情况是开发一款app软件,无论复杂还是简单,都有自己的开发周期,并不是想多快就能多快。

  第一、app开发是一个系统工程,有系统的工作流程

  一个成熟的app软件项目,其实开发过程是一样的。从一个想法到一个产品都要经过这些过程,业务流程确定,功能点梳理,原型图,效果图,架构搭建,前端开发,后端开发,测试,上线。简单的官网也是这个过程,只不过其中一些环节比较简单,用时较少。复杂的APP,每个环节都用时较多。

  app开发是一个系统工作,不太懂技术的人总是以为写代码才是开发产品,其实前期的设计才是关键,真到了开发环节,反而非常可控。但如果一些环节没做好,就会影响相关的环节,甚至导致整个项目失败。

  第二、原生的开发、写代码,测试的时间是绝对的

  一个互联网产品,如果是原生开发,就是大家认为那种通过写代码开发出来的,写代码的时间是必须的,一个程序员每天能写的代码数是固定的,如果一个产品需要10万行代码,一个程序员一天500行,那一个人写简单算就是200天。测试的时间也绝对的,一个产品开发过程中,一直伴随测试,有功能点的黑盒测试,还是测代码质量的白盒测试,还是联调的灰盒测试,可以说产品上线后质量不是决定在开发,而决定在测试,测试一个功能点,从写测试用例到测试,少的几个小时,多则几天。

  讲到这里,大家对互联网产品开发周期为什么不能随意缩短有了大体的认识,也就知道为什么正规的外包公司为什么有时会比小外包公司开发周期还长,因为一个根据流程一步步开发,一个可能节省了很多流程,或用一些模板,结果是上线快了,但你的产品暗伤可能很多,后期升级,修复困难非常大。
本文由专业的郑州app外包公司燚轩科技整理发布。

继续阅读 »

  找郑州app外包公司开发软件,费用、工期是两个最重要也是最基本的要求。郑州app制作公司知道投资方一般都希望费用越低,工期越短越好,为了拿到单子,很多外包服务商就迎合客户,报开发周期时,就报的很短,就是为了打动客户,先拿下单子再说,但实际情况是开发一款app软件,无论复杂还是简单,都有自己的开发周期,并不是想多快就能多快。

  第一、app开发是一个系统工程,有系统的工作流程

  一个成熟的app软件项目,其实开发过程是一样的。从一个想法到一个产品都要经过这些过程,业务流程确定,功能点梳理,原型图,效果图,架构搭建,前端开发,后端开发,测试,上线。简单的官网也是这个过程,只不过其中一些环节比较简单,用时较少。复杂的APP,每个环节都用时较多。

  app开发是一个系统工作,不太懂技术的人总是以为写代码才是开发产品,其实前期的设计才是关键,真到了开发环节,反而非常可控。但如果一些环节没做好,就会影响相关的环节,甚至导致整个项目失败。

  第二、原生的开发、写代码,测试的时间是绝对的

  一个互联网产品,如果是原生开发,就是大家认为那种通过写代码开发出来的,写代码的时间是必须的,一个程序员每天能写的代码数是固定的,如果一个产品需要10万行代码,一个程序员一天500行,那一个人写简单算就是200天。测试的时间也绝对的,一个产品开发过程中,一直伴随测试,有功能点的黑盒测试,还是测代码质量的白盒测试,还是联调的灰盒测试,可以说产品上线后质量不是决定在开发,而决定在测试,测试一个功能点,从写测试用例到测试,少的几个小时,多则几天。

  讲到这里,大家对互联网产品开发周期为什么不能随意缩短有了大体的认识,也就知道为什么正规的外包公司为什么有时会比小外包公司开发周期还长,因为一个根据流程一步步开发,一个可能节省了很多流程,或用一些模板,结果是上线快了,但你的产品暗伤可能很多,后期升级,修复困难非常大。
本文由专业的郑州app外包公司燚轩科技整理发布。

收起阅读 »

分享个hb 即时会话的APP防微信小程序功能

小程序 IM

分享个 hb 即时会话的APP
防微信 带小程序功能 首页
下载链接

继续阅读 »

分享个 hb 即时会话的APP
防微信 带小程序功能 首页
下载链接

收起阅读 »

uni-app 中如何刷新页面

返回刷新 uniapp

我们知道 ,html重新加载页面有几种方式

  1. reload():强迫浏览器刷新当前页面 ;
  2. replace() :通过指定URL替换当前缓存在历史里(客户端)的项目 ;
  3. 添加标签<meta http-equiv="refresh" content="20"> : 页面自动刷新;

而在uni-app 中并没有页面重新加载和刷新当前页面的概念,所以接下来,告诉不会的同学 uni-app 中怎么刷新页面。

如何刷新页面

场景:从个人中心页面,进入登录页面。登录成功之后返回个人中心页面,个人中心页面数据进行相应的变化。

  1. 使用缓存

    点击登录按钮之后,关键代码:

    // ...  
    methods: {  
        bindLogin(e) {  
            try {  
                uni.setStorageSync('login_key', {  
                    avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',  
                    token: 'user123456',  
                    userName: '缓存登录用户',  
                    login: true  
                });  
            } catch (e) {  
                // error  
            }  
            uni.navigateBack();  
        }  
    }  
    // ...  

    返回到个人中心页面,关键代码:

    // ...  
    data(){  
        return {  
            storageData:{}  
        }  
    },  
    onShow: {  
        const loginKey = uni.getStorageSync('login_key');  
    
        if (loginKey) {  
            console.log(loginKey);  
            this.storageData = {  
                avatarUrl: loginKey.avatarUrl,  
                login: loginKey.login,  
                userName: loginKey.userName  
            };  
        }  
    }  
    // ...  
  2. 使用 vuex

    vuex 关键代码

    // ...  
    const store = new Vuex.Store({  
        state: {  
            login: false,  
            token: '',  
            avatarUrl: '',  
            userName: ''  
        },  
        mutations: {  
            login(state, provider) {  
                state.login = true;  
                state.token = provider.token;  
                state.userName = provider.userName;  
                state.avatarUrl = provider.avatarUrl;  
            },  
            logout(state) {  
                state.login = false;  
                state.token = '';  
                state.userName = '';  
                state.avatarUrl = '';  
            }  
        }  
    })  
    // ...  

    点击登录按钮之后,关键代码:

    import { mapMutations } from 'vuex';  
    // ...  
    methods: {  
        bindLogin(e) {  
    
            this.login({  
                avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',  
                token: 'user123456',  
                userName: 'vuex登录用户'  
            });  
            uni.navigateBack();  
        },  
        ...mapMutations(['login'])  
    }  
    // ...  

    返回到个人中心页面,关键代码:

    import { mapState } from 'vuex';  
    
    // ...  
    computed: {  
        ...mapState(['avatarUrl', 'login', 'userName'])  
    }  
    // ...  

关联阅读:uni-app 全局变量的几种实现方式

结语: 整体下来都没有什么难点的,推荐使用 vuex 去实现类似功能。

完成示例,请下载附件。

继续阅读 »

我们知道 ,html重新加载页面有几种方式

  1. reload():强迫浏览器刷新当前页面 ;
  2. replace() :通过指定URL替换当前缓存在历史里(客户端)的项目 ;
  3. 添加标签<meta http-equiv="refresh" content="20"> : 页面自动刷新;

而在uni-app 中并没有页面重新加载和刷新当前页面的概念,所以接下来,告诉不会的同学 uni-app 中怎么刷新页面。

如何刷新页面

场景:从个人中心页面,进入登录页面。登录成功之后返回个人中心页面,个人中心页面数据进行相应的变化。

  1. 使用缓存

    点击登录按钮之后,关键代码:

    // ...  
    methods: {  
        bindLogin(e) {  
            try {  
                uni.setStorageSync('login_key', {  
                    avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',  
                    token: 'user123456',  
                    userName: '缓存登录用户',  
                    login: true  
                });  
            } catch (e) {  
                // error  
            }  
            uni.navigateBack();  
        }  
    }  
    // ...  

    返回到个人中心页面,关键代码:

    // ...  
    data(){  
        return {  
            storageData:{}  
        }  
    },  
    onShow: {  
        const loginKey = uni.getStorageSync('login_key');  
    
        if (loginKey) {  
            console.log(loginKey);  
            this.storageData = {  
                avatarUrl: loginKey.avatarUrl,  
                login: loginKey.login,  
                userName: loginKey.userName  
            };  
        }  
    }  
    // ...  
  2. 使用 vuex

    vuex 关键代码

    // ...  
    const store = new Vuex.Store({  
        state: {  
            login: false,  
            token: '',  
            avatarUrl: '',  
            userName: ''  
        },  
        mutations: {  
            login(state, provider) {  
                state.login = true;  
                state.token = provider.token;  
                state.userName = provider.userName;  
                state.avatarUrl = provider.avatarUrl;  
            },  
            logout(state) {  
                state.login = false;  
                state.token = '';  
                state.userName = '';  
                state.avatarUrl = '';  
            }  
        }  
    })  
    // ...  

    点击登录按钮之后,关键代码:

    import { mapMutations } from 'vuex';  
    // ...  
    methods: {  
        bindLogin(e) {  
    
            this.login({  
                avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',  
                token: 'user123456',  
                userName: 'vuex登录用户'  
            });  
            uni.navigateBack();  
        },  
        ...mapMutations(['login'])  
    }  
    // ...  

    返回到个人中心页面,关键代码:

    import { mapState } from 'vuex';  
    
    // ...  
    computed: {  
        ...mapState(['avatarUrl', 'login', 'userName'])  
    }  
    // ...  

关联阅读:uni-app 全局变量的几种实现方式

结语: 整体下来都没有什么难点的,推荐使用 vuex 去实现类似功能。

完成示例,请下载附件。

收起阅读 »

头像裁剪压缩,分享下图片裁剪压缩,jq头像裁剪

图片裁剪 头像裁剪

1.可以手动移动底图,放大缩小,随意移动,方框可以改成圆框,我的头像是方框的

2.宣传图片,45度多次旋转,左右旋转,上下旋转




3.裁剪完显示裁剪区域

非常感谢王者地带,是昨天学习了他的app后,自己改造一下,和他稍有区别![/鞠躬]

继续阅读 »

1.可以手动移动底图,放大缩小,随意移动,方框可以改成圆框,我的头像是方框的

2.宣传图片,45度多次旋转,左右旋转,上下旋转




3.裁剪完显示裁剪区域

非常感谢王者地带,是昨天学习了他的app后,自己改造一下,和他稍有区别![/鞠躬]

收起阅读 »

云打包苹果开发者账号被封

iOS打包 打包 Apple云端打包

苹果开发者账号被封 , 被封的原因是 把p12证书和Provisioning Profiles文件上传到第三方打包平台 或 云打包之类的平台 ; 现在账号被封了, 什么鬼? 企业号被封不好解封啊...

苹果开发者账号被封 , 被封的原因是 把p12证书和Provisioning Profiles文件上传到第三方打包平台 或 云打包之类的平台 ; 现在账号被封了, 什么鬼? 企业号被封不好解封啊...

郑州微信小程序制作费用,开发公司怎么找

微信小程序 小程序

  郑州微信小程序开发平台给移动互联网解决的痛点,以及它基于微信大量用户入口的利好;很多郑州小程序开发公司,无论是互联网企业,还是传统企业,都想利用微信小程序为自己的服务创造更多的生机。那么,做一个微信小程序究竟需要投入多少钱呢?先给大家分析下小程序开发的成本组成,让大家详细的了解下。

  一、人力成本,开发费用较大的成分所在,分为软件前端,后端,软件设计,服务器运维,维护费用。根据用户需求而定。

  二、消耗成本,开发公司场地费用,水电费用,电脑设配等。这些消耗成本是每一家小程序开发公司都存在的,所以一款小程序的开发报价中,其实都是包含这些方面的成本在内的。

  三、设计开发成本,一个普通的小程序页面的设计开发成本一般为500元,复杂一点的800元。这里“复杂”一般指的是页面特别长、内容特别多、或者有动画的情况。设计开发成本这一部分是最不稳定的,往往需要开发者和需求方深入沟通后才能确定。不过如果没有比较特殊的情况,上面的报价还是比较靠谱的。

  四,公司利润,公司肯定要赚钱,利润的定价也分什么公司了,大公司品牌的价格较高。小公司为的销量做起来,价格较低,基本够开销,亏钱都愿意做的也有。

  此外,如果你的小程序里需要支付的功能,那么需要300元的微信认证费用。如果你的小程序积累了大量的用户数据和资源,那么会有对应的存储费用和流量费用,不过这些费用都不高,刚开始一般是免费的,即便涉及费用,早期一个月十几块钱也能搞定。

  其实这些公司开发的小程序基本都一致,只要用户需要的功能什么的都会上,价格在这里表现,功能多样式多价格高,功能少样式少价格自然而然少了。
本文由专业的郑州微信小程序开发燚轩科技整理发布。

继续阅读 »

  郑州微信小程序开发平台给移动互联网解决的痛点,以及它基于微信大量用户入口的利好;很多郑州小程序开发公司,无论是互联网企业,还是传统企业,都想利用微信小程序为自己的服务创造更多的生机。那么,做一个微信小程序究竟需要投入多少钱呢?先给大家分析下小程序开发的成本组成,让大家详细的了解下。

  一、人力成本,开发费用较大的成分所在,分为软件前端,后端,软件设计,服务器运维,维护费用。根据用户需求而定。

  二、消耗成本,开发公司场地费用,水电费用,电脑设配等。这些消耗成本是每一家小程序开发公司都存在的,所以一款小程序的开发报价中,其实都是包含这些方面的成本在内的。

  三、设计开发成本,一个普通的小程序页面的设计开发成本一般为500元,复杂一点的800元。这里“复杂”一般指的是页面特别长、内容特别多、或者有动画的情况。设计开发成本这一部分是最不稳定的,往往需要开发者和需求方深入沟通后才能确定。不过如果没有比较特殊的情况,上面的报价还是比较靠谱的。

  四,公司利润,公司肯定要赚钱,利润的定价也分什么公司了,大公司品牌的价格较高。小公司为的销量做起来,价格较低,基本够开销,亏钱都愿意做的也有。

  此外,如果你的小程序里需要支付的功能,那么需要300元的微信认证费用。如果你的小程序积累了大量的用户数据和资源,那么会有对应的存储费用和流量费用,不过这些费用都不高,刚开始一般是免费的,即便涉及费用,早期一个月十几块钱也能搞定。

  其实这些公司开发的小程序基本都一致,只要用户需要的功能什么的都会上,价格在这里表现,功能多样式多价格高,功能少样式少价格自然而然少了。
本文由专业的郑州微信小程序开发燚轩科技整理发布。

收起阅读 »

关于“无法定位程序输入点??4QDateTime@@QAEAAV0@$$QAV0@@Z于动态链接库XXX.dll上”我的解决办法

HBuilderX


首先进入主目录的bin文件夹,找到错误弹框里面提到的dll文件(如上图的Qt5Core.dll),然后扔到System32或者SysWOW64文件夹,怕麻烦所以还注册了一下,然后HBuilderX就这样给我打开了。至于是不是每个人适用有待大伙们的反馈。(PS:我后面尝试还原错误现场把SysWOW64文件夹里的之前报错的dll删了,结果发现HBuilderX还能打开)

继续阅读 »


首先进入主目录的bin文件夹,找到错误弹框里面提到的dll文件(如上图的Qt5Core.dll),然后扔到System32或者SysWOW64文件夹,怕麻烦所以还注册了一下,然后HBuilderX就这样给我打开了。至于是不是每个人适用有待大伙们的反馈。(PS:我后面尝试还原错误现场把SysWOW64文件夹里的之前报错的dll删了,结果发现HBuilderX还能打开)

收起阅读 »

郑州手机app开发,自己组建团队划算吗

5+App开发 移动APP

  郑州app开发和郑州app制作已经不再是什么新鲜事了,许多企业都知道,专属独立品牌app开发是企业在移动互联网未来生存发展的重要选择。而app开发要多少钱就成为了许多客户首要关心的问题。一般来说决定一款企业app开发价格的因素主要有两个:一是架构的复杂性,二是app开发投入的人力以及时间。

  今天从app开发公司的角度,一起来算一下中小型app从无到有需要做哪些工作,以及为达成使命,需要付出多少金钱代价。

  首先假设在开发app之前我们已经有了一个成熟的团队,app的团队结构以架构师兼后台开发1名+安卓1名+iOS开发1名+产品经理1名+前端开发1名+设计师1名。你可能也发现了这些人员配备都是单点的,一旦有人生病或请假,某个职位就会缺失,项目进度就会拖后,所以我们大约配备2个浮动名额,也就是,初始团队大概有8名。

  我们假设团队平均工资在8000左右,需要给员工缴纳五险一金,除工资的部分,还要平均为每个员工多缴纳3000元的五险一金支出,员工部分的支出是(8000+3000)*8=88000元/月;有了app开发团队,下一步要解决的是工作场所的问题,8人团队可以选择中低端的办公场所,是否划算,得创业团队自己掂量,算上水电、物业,一个月15000左右算比较省了。

  有了场地和团队,接下来置换办公耗材、宽带之类的(假设电脑自己带),普通的人体工程学椅子价格在150元左右,如果不买工程学椅子也可以,用普通的椅子,加上桌子平摊成本,桌椅需要200左右的成本,这算一次性付出。拍脑袋,6000元可以搞定吧。

  6个月的时间,算快,一个app从无到有需要的费用大概这么算:人工费用: 88000元6个月 ≈ 52 w。场地租金: 15000元6个月 = 9w。办公耗材+桌椅支出:1w。服务器、域名、周边IT基础费用:2w。

  是的,当有人问独立开发一个app要多少钱?你可以回答一个不太复杂的app,从无到有做出来,半年第一个版本出来,需要100万,真的是不夸张的说,所以从这一点可以看出来,企业还是选择app开发公司更加明智一些。
本文由专业的郑州app制作燚轩科技整理发布。

继续阅读 »

  郑州app开发和郑州app制作已经不再是什么新鲜事了,许多企业都知道,专属独立品牌app开发是企业在移动互联网未来生存发展的重要选择。而app开发要多少钱就成为了许多客户首要关心的问题。一般来说决定一款企业app开发价格的因素主要有两个:一是架构的复杂性,二是app开发投入的人力以及时间。

  今天从app开发公司的角度,一起来算一下中小型app从无到有需要做哪些工作,以及为达成使命,需要付出多少金钱代价。

  首先假设在开发app之前我们已经有了一个成熟的团队,app的团队结构以架构师兼后台开发1名+安卓1名+iOS开发1名+产品经理1名+前端开发1名+设计师1名。你可能也发现了这些人员配备都是单点的,一旦有人生病或请假,某个职位就会缺失,项目进度就会拖后,所以我们大约配备2个浮动名额,也就是,初始团队大概有8名。

  我们假设团队平均工资在8000左右,需要给员工缴纳五险一金,除工资的部分,还要平均为每个员工多缴纳3000元的五险一金支出,员工部分的支出是(8000+3000)*8=88000元/月;有了app开发团队,下一步要解决的是工作场所的问题,8人团队可以选择中低端的办公场所,是否划算,得创业团队自己掂量,算上水电、物业,一个月15000左右算比较省了。

  有了场地和团队,接下来置换办公耗材、宽带之类的(假设电脑自己带),普通的人体工程学椅子价格在150元左右,如果不买工程学椅子也可以,用普通的椅子,加上桌子平摊成本,桌椅需要200左右的成本,这算一次性付出。拍脑袋,6000元可以搞定吧。

  6个月的时间,算快,一个app从无到有需要的费用大概这么算:人工费用: 88000元6个月 ≈ 52 w。场地租金: 15000元6个月 = 9w。办公耗材+桌椅支出:1w。服务器、域名、周边IT基础费用:2w。

  是的,当有人问独立开发一个app要多少钱?你可以回答一个不太复杂的app,从无到有做出来,半年第一个版本出来,需要100万,真的是不夸张的说,所以从这一点可以看出来,企业还是选择app开发公司更加明智一些。
本文由专业的郑州app制作燚轩科技整理发布。

收起阅读 »

关于微信里wx.getUserInfo获取用户信息都是拼音的转成中文方法

微信登录
  1. 加在js里面
wx.getUserInfo({  
  lang:"zh_CN",  
  success: function(res) {  
    var userInfo = res.userInfo  
    var nickName = userInfo.nickName  
    var avatarUrl = userInfo.avatarUrl  
    var gender = userInfo.gender //性别 0:未知、1:男、2:女  
    var province = userInfo.province  
    var city = userInfo.city             
    var country = userInfo.country  
  }

2.加在 行内

<button open-type='getUserInfo' lang="zh_CN" bindgetuserinfo="onGotUserInfo"></button>  

力量本身并不可怕,可怕的是它的主人。

继续阅读 »
  1. 加在js里面
wx.getUserInfo({  
  lang:"zh_CN",  
  success: function(res) {  
    var userInfo = res.userInfo  
    var nickName = userInfo.nickName  
    var avatarUrl = userInfo.avatarUrl  
    var gender = userInfo.gender //性别 0:未知、1:男、2:女  
    var province = userInfo.province  
    var city = userInfo.city             
    var country = userInfo.country  
  }

2.加在 行内

<button open-type='getUserInfo' lang="zh_CN" bindgetuserinfo="onGotUserInfo"></button>  

力量本身并不可怕,可怕的是它的主人。

收起阅读 »