HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

基于 MUI 构建一个具有 90 +页面的APP应用,欢迎star

mui

前言

mui是一款接近原生App体验的前端框架,只需要掌握前端技术就可以开发APP应用,官方有提供功能比较全面的demo版本,
但在实战中总会遇到一些不可避免但坑,对于没有接触过mui的开发者,难免会浪费很多时间在踩坑上。

该项目以mui为开发框架,artTemplate.js作为js模版引擎,没有繁琐的配置和编译过程,拿来就可以上手,适合刚接触mui的同学参考和学习

项目运行

项目地址

git clone https://github.com/EasyTuan/mui-kidApp.git  

打开HBuider,打开项目

右键项目=>转换为移动App

运行=>真机运行(需要usb连接手机)

注:服务器到期,接口服务不再支持,能正常登陆和退出,不影响正常功能但预览和学习

目标功能

  • [x] 定位功能 -- 完成
  • [x] 选择城市 -- 完成
  • [x] 展示所选地址附近商家列表 -- 完成
  • [x] 在高德地图中寻找店铺 -- 完成
  • [x] 搜索文章,赛事 -- 完成
  • [x] 商家列表页 -- 完成
  • [x] 店铺评价页面 -- 完成
  • [x] 单张卡牌详情页面 -- 完成
  • [x] 商家详情页 -- 完成
  • [x] 登录、注册 -- 完成
  • [x] 三方微信、QQ登陆 -- 完成
  • [x] 修改密码 -- 完成
  • [x] 个人中心 -- 完成
  • [x] 发送短信、语音验证 -- 完成
  • [x] 赛事列表 -- 完成
  • [x] 赛事详情 -- 完成
  • [x] 添加、删除、修改收货地址 -- 完成
  • [x] 帐户信息 -- 完成
  • [x] 服务中心 -- 完成
  • [x] 红包 -- 完成
  • [x] 上传头像 -- 完成
  • [x] 卡牌对战发起 -- 完成

业务介绍

入口地址为 html/main.html

目录结构

├── css                     //css样式文件  
├── fonts                       //字体图标  
├── html                    //页面  
├── images                  //图片  
├── js                      //js  
│   └── lib                         //js第三方库  
├── unpackage               //App图标、启动页  
└── manifest.json           //App配置文件  

部分截图展示

说明

如果对您有帮助,您可以点项目地址 "Star" 支持一下 谢谢! ^_^

或者您可以 "follow" 一下,我会不断开源更多的有趣的项目

如有问题请直接在 github Issues 中提,或者您发现问题并有非常好的解决方案,欢迎 PR

继续阅读 »

前言

mui是一款接近原生App体验的前端框架,只需要掌握前端技术就可以开发APP应用,官方有提供功能比较全面的demo版本,
但在实战中总会遇到一些不可避免但坑,对于没有接触过mui的开发者,难免会浪费很多时间在踩坑上。

该项目以mui为开发框架,artTemplate.js作为js模版引擎,没有繁琐的配置和编译过程,拿来就可以上手,适合刚接触mui的同学参考和学习

项目运行

项目地址

git clone https://github.com/EasyTuan/mui-kidApp.git  

打开HBuider,打开项目

右键项目=>转换为移动App

运行=>真机运行(需要usb连接手机)

注:服务器到期,接口服务不再支持,能正常登陆和退出,不影响正常功能但预览和学习

目标功能

  • [x] 定位功能 -- 完成
  • [x] 选择城市 -- 完成
  • [x] 展示所选地址附近商家列表 -- 完成
  • [x] 在高德地图中寻找店铺 -- 完成
  • [x] 搜索文章,赛事 -- 完成
  • [x] 商家列表页 -- 完成
  • [x] 店铺评价页面 -- 完成
  • [x] 单张卡牌详情页面 -- 完成
  • [x] 商家详情页 -- 完成
  • [x] 登录、注册 -- 完成
  • [x] 三方微信、QQ登陆 -- 完成
  • [x] 修改密码 -- 完成
  • [x] 个人中心 -- 完成
  • [x] 发送短信、语音验证 -- 完成
  • [x] 赛事列表 -- 完成
  • [x] 赛事详情 -- 完成
  • [x] 添加、删除、修改收货地址 -- 完成
  • [x] 帐户信息 -- 完成
  • [x] 服务中心 -- 完成
  • [x] 红包 -- 完成
  • [x] 上传头像 -- 完成
  • [x] 卡牌对战发起 -- 完成

业务介绍

入口地址为 html/main.html

目录结构

├── css                     //css样式文件  
├── fonts                       //字体图标  
├── html                    //页面  
├── images                  //图片  
├── js                      //js  
│   └── lib                         //js第三方库  
├── unpackage               //App图标、启动页  
└── manifest.json           //App配置文件  

部分截图展示

说明

如果对您有帮助,您可以点项目地址 "Star" 支持一下 谢谢! ^_^

或者您可以 "follow" 一下,我会不断开源更多的有趣的项目

如有问题请直接在 github Issues 中提,或者您发现问题并有非常好的解决方案,欢迎 PR

收起阅读 »

【分享】快速新建 uni-app 页面

uniapp

更新:新版HBuilderX已经实现新建页面时自动创建文件夹、自动创建vue文件、自动添加pages.json信息。

========以下为过期信息,但可以作为利用node扩展HBuilderX功能的一个案例============

之前有小伙伴提到过,uni-app 创建页面时,应该同步 pages.json 等相关配置信息。
鉴于目前 HBuilderX 中还未实现此功能,这里分享一个简单的方法来实现此功能。

var fs = require('fs');  

var jsonPath = 'pages.json';  
var dirPath = 'pages/{name}';  
var pagePath = 'pages/{name}/{name}.vue';  
var pageReg = /{name}/g;  
var encodeType = 'utf8';  
var comment = '//pages数组中第一项表示应用启动页';  

var pageTpl =  
  '<template>\n\  
\t<view>\n\  
\n\  
\t</view>\n\  
</template>\  
\n\  
<script>\n\  
\texport default {\n\  
\n\  
\t}\n\  
<\/script>\n\  
\n\  
<style>\n\  
\n\  
</style>';  

var build = function (name) {  
  // 创建目录  
  fs.mkdir(dirPath.replace(pageReg, name), (err) => {  
    if (err) {  
      throw err;  
    }  
    // 创建vue文件  
    fs.writeFile(pagePath.replace(pageReg, name), pageTpl, encodeType, err => {  
      if (err) {  
        throw err;  
      }  
      // 同步pages.json中的内容  
      try {  
        var pagesJson = '';  
        var pagesOptions = null;  

        pagesJson = fs.readFileSync(jsonPath, encodeType).replace(comment, '');  
        pagesOptions = JSON.parse(pagesJson);  

        pagesOptions.pages.push({  
          path: pagePath.replace(pageReg, name),  
          style: {  
            navigationBarTitleText: name  
          }  
        });  

        fs.writeFileSync(jsonPath, JSON.stringify(pagesOptions), encodeType);  
      } catch (err) {  
        if (err) {  
          throw err;  
        }  
      }  
    });  
  });  
};  

/**  
 * 根据名称,创建目录及vue文件,并在pages.json中新增page的配置。  
 */  
if (process.argv.length !== 3) {  
  console.log('参数个数不正确!');  
} else {  
  build(process.argv[2]);  
}

使用方法
将附件中的 build.js 文件解压出来,放在 uni-app 项目的根目录下。

在 uni-app 项目的根目录下打开一个命令行工具

$ node build.js {page}

{page} 就是页面名称,比如输入

$ node build.js hello

就会在 pages 目录下新建一个 hello 目录以及下一级的 hello.vue,同时 pages.json 中的 pages 节点,也会新增页面的配置。

{  
  "pages": [{  
    "path": "pages/index/index",  
    "style": {  
      "navigationBarTitleText": "uni-app"  
    }  
  }, {  
    "path": "pages/hello/hello.vue",  
    "style": {  
      "navigationBarTitleText": "hello"  
    }  
  }],  
  "globalStyle": {  
    "navigationBarTextStyle": "white",  
    "navigationBarTitleText": "uni-app",  
    "navigationBarBackgroundColor": "#0faeff",  
    "backgroundColor": "#fbf9fe"  
  }  
}

缺点

  • 仅支持新建一级目录下的页面

之后 HBuilderX 会逐步完善此类操作功能,这里的示例小伙伴们可以参考继续做扩展。

继续阅读 »

更新:新版HBuilderX已经实现新建页面时自动创建文件夹、自动创建vue文件、自动添加pages.json信息。

========以下为过期信息,但可以作为利用node扩展HBuilderX功能的一个案例============

之前有小伙伴提到过,uni-app 创建页面时,应该同步 pages.json 等相关配置信息。
鉴于目前 HBuilderX 中还未实现此功能,这里分享一个简单的方法来实现此功能。

var fs = require('fs');  

var jsonPath = 'pages.json';  
var dirPath = 'pages/{name}';  
var pagePath = 'pages/{name}/{name}.vue';  
var pageReg = /{name}/g;  
var encodeType = 'utf8';  
var comment = '//pages数组中第一项表示应用启动页';  

var pageTpl =  
  '<template>\n\  
\t<view>\n\  
\n\  
\t</view>\n\  
</template>\  
\n\  
<script>\n\  
\texport default {\n\  
\n\  
\t}\n\  
<\/script>\n\  
\n\  
<style>\n\  
\n\  
</style>';  

var build = function (name) {  
  // 创建目录  
  fs.mkdir(dirPath.replace(pageReg, name), (err) => {  
    if (err) {  
      throw err;  
    }  
    // 创建vue文件  
    fs.writeFile(pagePath.replace(pageReg, name), pageTpl, encodeType, err => {  
      if (err) {  
        throw err;  
      }  
      // 同步pages.json中的内容  
      try {  
        var pagesJson = '';  
        var pagesOptions = null;  

        pagesJson = fs.readFileSync(jsonPath, encodeType).replace(comment, '');  
        pagesOptions = JSON.parse(pagesJson);  

        pagesOptions.pages.push({  
          path: pagePath.replace(pageReg, name),  
          style: {  
            navigationBarTitleText: name  
          }  
        });  

        fs.writeFileSync(jsonPath, JSON.stringify(pagesOptions), encodeType);  
      } catch (err) {  
        if (err) {  
          throw err;  
        }  
      }  
    });  
  });  
};  

/**  
 * 根据名称,创建目录及vue文件,并在pages.json中新增page的配置。  
 */  
if (process.argv.length !== 3) {  
  console.log('参数个数不正确!');  
} else {  
  build(process.argv[2]);  
}

使用方法
将附件中的 build.js 文件解压出来,放在 uni-app 项目的根目录下。

在 uni-app 项目的根目录下打开一个命令行工具

$ node build.js {page}

{page} 就是页面名称,比如输入

$ node build.js hello

就会在 pages 目录下新建一个 hello 目录以及下一级的 hello.vue,同时 pages.json 中的 pages 节点,也会新增页面的配置。

{  
  "pages": [{  
    "path": "pages/index/index",  
    "style": {  
      "navigationBarTitleText": "uni-app"  
    }  
  }, {  
    "path": "pages/hello/hello.vue",  
    "style": {  
      "navigationBarTitleText": "hello"  
    }  
  }],  
  "globalStyle": {  
    "navigationBarTextStyle": "white",  
    "navigationBarTitleText": "uni-app",  
    "navigationBarBackgroundColor": "#0faeff",  
    "backgroundColor": "#fbf9fe"  
  }  
}

缺点

  • 仅支持新建一级目录下的页面

之后 HBuilderX 会逐步完善此类操作功能,这里的示例小伙伴们可以参考继续做扩展。

收起阅读 »

周报(20180810):一起 uni-app

周报 uniapp

热门话题

近期最为热门的话题,当属 uni-app 了。

问题清单

开源及分享

多说几句

uni-app 已经发布两周有余了,小伙伴们也都积极参与并反馈问题与意见。uni-app 希望有更多的小伙伴加入,成为它成长中的一员。

许多小伙伴可能会习惯于在 QQ 群问问题,但是 QQ 群适合咨询和小伙伴之间讨论,并不适合反馈问题和需求。

  • QQ 消息一闪而过,一些信息很容易被忽略掉。
  • 工作期间如果一直盯着 QQ 看,工作效率会非常低。
  • 问答社区可以方便地去翻阅,或者转发。
  • 同样的,社区的内容可以沉淀下来,为后来的小伙伴提供更多的帮助。

总之,在使用产品的过程中,遇到问题或者疑惑,请前往问答社区反馈。

PS:如何正确高效地在社区提问

最后

本周的动态就是这些,希望能对大家有所帮助。同时,也希望更多的小伙伴在社区分享自己的经验心得,交流学习。

祝大家周末愉快。

继续阅读 »

热门话题

近期最为热门的话题,当属 uni-app 了。

问题清单

开源及分享

多说几句

uni-app 已经发布两周有余了,小伙伴们也都积极参与并反馈问题与意见。uni-app 希望有更多的小伙伴加入,成为它成长中的一员。

许多小伙伴可能会习惯于在 QQ 群问问题,但是 QQ 群适合咨询和小伙伴之间讨论,并不适合反馈问题和需求。

  • QQ 消息一闪而过,一些信息很容易被忽略掉。
  • 工作期间如果一直盯着 QQ 看,工作效率会非常低。
  • 问答社区可以方便地去翻阅,或者转发。
  • 同样的,社区的内容可以沉淀下来,为后来的小伙伴提供更多的帮助。

总之,在使用产品的过程中,遇到问题或者疑惑,请前往问答社区反馈。

PS:如何正确高效地在社区提问

最后

本周的动态就是这些,希望能对大家有所帮助。同时,也希望更多的小伙伴在社区分享自己的经验心得,交流学习。

祝大家周末愉快。

收起阅读 »

采用mui + vuejs开发的APP商城

mui 移动APP

前端演示:

后端演示:

更多演示图查看:
https://docs.qq.com/sheet/BUZLOH0Ra1uF3YZlG31gl5pm2gGfuB2oLtOJ3

继续阅读 »

前端演示:

后端演示:

更多演示图查看:
https://docs.qq.com/sheet/BUZLOH0Ra1uF3YZlG31gl5pm2gGfuB2oLtOJ3

收起阅读 »

微信支付失败返回 -1

微信支付

微信支付返回-1,调起微信支付失败
项目中要用到微信支付,所以打算把微信支付集成进去,参考了官方demo,但是遇到了BUG,返回-100,微信端错误码是-1;
官方的解释是:


遇到这个问题:

  1. 首先排查自己的包名和签名是否与申请微信开放平台的APK包名和签名一致;
  2. 离线打包和云打包时微信支付的appid是否和微信开放平台的appid一致;
  3. 如果1和2都没问题,一般就是服务端的问题了;
  4. 服务端首先排除是否有下发所需要的参数;
  5. 服务端签名sign一定要按照签名规则来签名;(我就是签名问题,顺序一定不要错);

    6.其他原因(未知);
    效果图:

祝大家开发愉快

继续阅读 »

微信支付返回-1,调起微信支付失败
项目中要用到微信支付,所以打算把微信支付集成进去,参考了官方demo,但是遇到了BUG,返回-100,微信端错误码是-1;
官方的解释是:


遇到这个问题:

  1. 首先排查自己的包名和签名是否与申请微信开放平台的APK包名和签名一致;
  2. 离线打包和云打包时微信支付的appid是否和微信开放平台的appid一致;
  3. 如果1和2都没问题,一般就是服务端的问题了;
  4. 服务端首先排除是否有下发所需要的参数;
  5. 服务端签名sign一定要按照签名规则来签名;(我就是签名问题,顺序一定不要错);

    6.其他原因(未知);
    效果图:

祝大家开发愉快

收起阅读 »

小程序研发需要多少钱?贵不贵呢

微信小程序

  随着小程序红利的渐渐显现,越来越多的商家、企业开始研发属于自己的小程序。当然他们会首先询问微信小程序开发公司关于:小程序研发需要多少钱?这是每一个企业在研发小程序之前都会问到的问题,今天咱们就从小程序的研发周期、成本等问题来分析研发一个小程序到底需要多少钱,这样企业投资者就知道自己投资开发小程序划不划算了。

  其实小程序研发到底需要多少钱,这个不好说。因为小程序的研发费用要取决于你想要实现的小程序的功能,总的来说就是功能越多越复杂研发费用也就越多!

  小程序研发费用

  1、第三方平台研发

  如果是寻求第三方平台研发定制,首先从制作周期上来说要比较节省时间,直接交给第三方开发公司,把你需要实现功能告诉他们然后约定个时间到时直接验收就可以了。

  从费用上来看,主要看你开发的小程序是什么类型的。若是企业型的费用会便宜点一般会在3000左右;若是电商类或者功能比较全面型的小程序费用基本都在20000元左右。

  2、自主研发

  如果选择自主研发,从周期、费用上来说需要花费较长的时间与费用。因为自主研发首先就需要组建一个研发团队,

  从目前市场来看小程序的研发费用与功能是成正比关系,功能越全费用也就越高,反之费用也就越低!
本文由专业的微信小程序开发公司燚轩科技整理发布,如需转载请注明出处!

继续阅读 »

  随着小程序红利的渐渐显现,越来越多的商家、企业开始研发属于自己的小程序。当然他们会首先询问微信小程序开发公司关于:小程序研发需要多少钱?这是每一个企业在研发小程序之前都会问到的问题,今天咱们就从小程序的研发周期、成本等问题来分析研发一个小程序到底需要多少钱,这样企业投资者就知道自己投资开发小程序划不划算了。

  其实小程序研发到底需要多少钱,这个不好说。因为小程序的研发费用要取决于你想要实现的小程序的功能,总的来说就是功能越多越复杂研发费用也就越多!

  小程序研发费用

  1、第三方平台研发

  如果是寻求第三方平台研发定制,首先从制作周期上来说要比较节省时间,直接交给第三方开发公司,把你需要实现功能告诉他们然后约定个时间到时直接验收就可以了。

  从费用上来看,主要看你开发的小程序是什么类型的。若是企业型的费用会便宜点一般会在3000左右;若是电商类或者功能比较全面型的小程序费用基本都在20000元左右。

  2、自主研发

  如果选择自主研发,从周期、费用上来说需要花费较长的时间与费用。因为自主研发首先就需要组建一个研发团队,

  从目前市场来看小程序的研发费用与功能是成正比关系,功能越全费用也就越高,反之费用也就越低!
本文由专业的微信小程序开发公司燚轩科技整理发布,如需转载请注明出处!

收起阅读 »

打包问题:manifest.plus.distribute.splashscreen.ios.iphone.default;

云端打包发布常见问题

几分钟前打包正常,麻烦看一下。。
manifest.plus.distribute.splashscreen.ios.iphone.default;
BuildConfigure Failed 31007 无法导入p12证书plus->distribute->apple->p12

BuildConfigure Failed 31007 无法导入p12证书plus->distribute->apple->p12

继续阅读 »

几分钟前打包正常,麻烦看一下。。
manifest.plus.distribute.splashscreen.ios.iphone.default;
BuildConfigure Failed 31007 无法导入p12证书plus->distribute->apple->p12

BuildConfigure Failed 31007 无法导入p12证书plus->distribute->apple->p12

收起阅读 »

微信支付 -100 错误 -1错误解决分析与办法

支付 微信支付

我下载的是官方的支付demo V3版本php服务端..

今天在写H5+的时候 遇到一个-100的问题.
核对了包名
app签名
appid 等数据都无误
一直报-100错误.

最后发现官方服务端demo中

WxPay.Api.php 文件63行 var_dump($response);exit;
造成的输出格式与app需求不符,所以产生的报错.

这个句估计是官方大神们测试的语句. 忘记注释了.

所以大家把这句删掉或者注释掉就正常了.

提醒大家,切记 包名 APP签名 等信息 一定要跟再微信开发平台上设置的一致才行.

继续阅读 »

我下载的是官方的支付demo V3版本php服务端..

今天在写H5+的时候 遇到一个-100的问题.
核对了包名
app签名
appid 等数据都无误
一直报-100错误.

最后发现官方服务端demo中

WxPay.Api.php 文件63行 var_dump($response);exit;
造成的输出格式与app需求不符,所以产生的报错.

这个句估计是官方大神们测试的语句. 忘记注释了.

所以大家把这句删掉或者注释掉就正常了.

提醒大家,切记 包名 APP签名 等信息 一定要跟再微信开发平台上设置的一致才行.

收起阅读 »

php编程之小程序支付所需规避的问题

  对于开发一款小程序来说,经常是需要做支付功能的,但是大家在做这个功能的时候,往往会发现遇到很多自己无法解决的问题,那么对于这个问题,下面就跟大家详细来分析解答一下吧。

  重点代码部分:
/*

  • A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
  • Digest Algorithm, as defined in RFC 1321.
  • Version 1.1 Copyright (C) Paul Johnston 1999 - 2002.
  • Code also contributed by Greg Holt
  • See http://pajhome.org.uk/site/legal.html for details.
    */

/*

  • Add integers, wrapping at 2^32. This uses 16-bit operations internally
  • to work around bugs in some JS interpreters.
    */
    function safe_add(x, y) {
    var lsw = (x & 0xFFFF) + (y & 0xFFFF)
    var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
    return (msw << 16) | (lsw & 0xFFFF)
    }

/*

  • Bitwise rotate a 32-bit number to the left.
    */
    function rol(num, cnt) {
    return (num << cnt) | (num >>> (32 - cnt))
    }

/*

  • These functions implement the four basic operations the algorithm uses.
    */
    function cmn(q, a, b, x, s, t) {
    return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)
    }
    function ff(a, b, c, d, x, s, t) {
    return cmn((b & c) | ((~b) & d), a, b, x, s, t)
    }
    function gg(a, b, c, d, x, s, t) {
    return cmn((b & d) | (c & (~d)), a, b, x, s, t)
    }
    function hh(a, b, c, d, x, s, t) {
    return cmn(b ^ c ^ d, a, b, x, s, t)
    }
    function ii(a, b, c, d, x, s, t) {
    return cmn(c ^ (b | (~d)), a, b, x, s, t)
    }

/*

  • Calculate the MD5 of an array of little-endian words, producing an array
  • of little-endian words.
    */
    function coreMD5(x) {
    var a = 1732584193
    var b = -271733879
    var c = -1732584194
    var d = 271733878

for (var i = 0; i < x.length; i += 16) {
var olda = a
var oldb = b
var oldc = c
var oldd = d

a = ff(a, b, c, d, x[i + 0], 7, -680876936)
d = ff(d, a, b, c, x[i + 1], 12, -389564586)
c = ff(c, d, a, b, x[i + 2], 17, 606105819)
b = ff(b, c, d, a, x[i + 3], 22, -1044525330)
a = ff(a, b, c, d, x[i + 4], 7, -176418897)
d = ff(d, a, b, c, x[i + 5], 12, 1200080426)
c = ff(c, d, a, b, x[i + 6], 17, -1473231341)
b = ff(b, c, d, a, x[i + 7], 22, -45705983)
a = ff(a, b, c, d, x[i + 8], 7, 1770035416)
d = ff(d, a, b, c, x[i + 9], 12, -1958414417)
c = ff(c, d, a, b, x[i + 10], 17, -42063)
b = ff(b, c, d, a, x[i + 11], 22, -1990404162)
a = ff(a, b, c, d, x[i + 12], 7, 1804603682)
d = ff(d, a, b, c, x[i + 13], 12, -40341101)
c = ff(c, d, a, b, x[i + 14], 17, -1502002290)
b = ff(b, c, d, a, x[i + 15], 22, 1236535329)

a = gg(a, b, c, d, x[i + 1], 5, -165796510)
d = gg(d, a, b, c, x[i + 6], 9, -1069501632)
c = gg(c, d, a, b, x[i + 11], 14, 643717713)
b = gg(b, c, d, a, x[i + 0], 20, -373897302)
a = gg(a, b, c, d, x[i + 5], 5, -701558691)
d = gg(d, a, b, c, x[i + 10], 9, 38016083)
c = gg(c, d, a, b, x[i + 15], 14, -660478335)
b = gg(b, c, d, a, x[i + 4], 20, -405537848)
a = gg(a, b, c, d, x[i + 9], 5, 568446438)
d = gg(d, a, b, c, x[i + 14], 9, -1019803690)
c = gg(c, d, a, b, x[i + 3], 14, -187363961)
b = gg(b, c, d, a, x[i + 8], 20, 1163531501)
a = gg(a, b, c, d, x[i + 13], 5, -1444681467)
d = gg(d, a, b, c, x[i + 2], 9, -51403784)
c = gg(c, d, a, b, x[i + 7], 14, 1735328473)
b = gg(b, c, d, a, x[i + 12], 20, -1926607734)

a = hh(a, b, c, d, x[i + 5], 4, -378558)
d = hh(d, a, b, c, x[i + 8], 11, -2022574463)
c = hh(c, d, a, b, x[i + 11], 16, 1839030562)
b = hh(b, c, d, a, x[i + 14], 23, -35309556)
a = hh(a, b, c, d, x[i + 1], 4, -1530992060)
d = hh(d, a, b, c, x[i + 4], 11, 1272893353)
c = hh(c, d, a, b, x[i + 7], 16, -155497632)
b = hh(b, c, d, a, x[i + 10], 23, -1094730640)
a = hh(a, b, c, d, x[i + 13], 4, 681279174)
d = hh(d, a, b, c, x[i + 0], 11, -358537222)
c = hh(c, d, a, b, x[i + 3], 16, -722521979)
b = hh(b, c, d, a, x[i + 6], 23, 76029189)
a = hh(a, b, c, d, x[i + 9], 4, -640364487)
d = hh(d, a, b, c, x[i + 12], 11, -421815835)
c = hh(c, d, a, b, x[i + 15], 16, 530742520)
b = hh(b, c, d, a, x[i + 2], 23, -995338651)

a = ii(a, b, c, d, x[i + 0], 6, -198630844)
d = ii(d, a, b, c, x[i + 7], 10, 1126891415)
c = ii(c, d, a, b, x[i + 14], 15, -1416354905)
b = ii(b, c, d, a, x[i + 5], 21, -57434055)
a = ii(a, b, c, d, x[i + 12], 6, 1700485571)
d = ii(d, a, b, c, x[i + 3], 10, -1894986606)
c = ii(c, d, a, b, x[i + 10], 15, -1051523)
b = ii(b, c, d, a, x[i + 1], 21, -2054922799)
a = ii(a, b, c, d, x[i + 8], 6, 1873313359)
d = ii(d, a, b, c, x[i + 15], 10, -30611744)
c = ii(c, d, a, b, x[i + 6], 15, -1560198380)
b = ii(b, c, d, a, x[i + 13], 21, 1309151649)
a = ii(a, b, c, d, x[i + 4], 6, -145523070)
d = ii(d, a, b, c, x[i + 11], 10, -1120210379)
c = ii(c, d, a, b, x[i + 2], 15, 718787259)
b = ii(b, c, d, a, x[i + 9], 21, -343485551)

a = safe_add(a, olda)
b = safe_add(b, oldb)
c = safe_add(c, oldc)
d = safe_add(d, oldd)
}
return [a, b, c, d]
}

/*

  • Convert an array of little-endian words to a hex string.
    /
    function binl2hex(binarray) {
    var hex_tab = "0123456789abcdef"
    var str = ""
    for (var i = 0; i < binarray.length
    4; i++) {
    str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) 8 + 4)) & 0xF) +
    hex_tab.charAt((binarray[i >> 2] >> ((i % 4)
    8)) & 0xF)
    }
    return str
    }

/*

  • Convert an array of little-endian words to a base64 encoded string.
    /
    function binl2b64(binarray) {
    var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    var str = ""
    for (var i = 0; i < binarray.length
    32; i += 6) {
    str += tab.charAt(((binarray[i >> 5] << (i % 32)) & 0x3F) |
    ((binarray[i >> 5 + 1] >> (32 - i % 32)) & 0x3F))
    }
    return str
    }

/*

  • Convert an 8-bit character string to a sequence of 16-word blocks, stored
  • as an array, and append appropriate padding for MD4/5 calculation.
  • If any of the characters are >255, the high byte is silently ignored.
    /
    function str2binl(str) {
    var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks
    var blks = new Array(nblk
    16)
    for (var i = 0; i < nblk 16; i++) blks[i] = 0
    for (var i = 0; i < str.length; i++)
    blks[i >> 2] |= (str.charCodeAt(i) & 0xFF) << ((i % 4)
    8)
    blks[i >> 2] |= 0x80 << ((i % 4) 8)
    blks[nblk
    16 - 2] = str.length * 8
    return blks
    }

/*

  • Convert a wide-character string to a sequence of 16-word blocks, stored as
  • an array, and append appropriate padding for MD4/5 calculation.
    /
    function strw2binl(str) {
    var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocks
    var blks = new Array(nblk
    16)
    for (var i = 0; i < nblk 16; i++) blks[i] = 0
    for (var i = 0; i < str.length; i++)
    blks[i >> 1] |= str.charCodeAt(i) << ((i % 2)
    16)
    blks[i >> 1] |= 0x80 << ((i % 2) 16)
    blks[nblk
    16 - 2] = str.length * 16
    return blks
    }

/*

  • External interface
    /
    function hexMD5(str) { return binl2hex(coreMD5(str2binl(str))) }
    function hexMD5w(str) { return binl2hex(coreMD5(strw2binl(str))) }
    function b64MD5(str) { return binl2b64(coreMD5(str2binl(str))) }
    function b64MD5w(str) { return binl2b64(coreMD5(strw2binl(str))) }
    /
    Backward compatibility */
    function calcMD5(str) { return binl2hex(coreMD5(str2binl(str))) }
    module.exports = {
    hexMD5: hexMD5
    }

  然后在js中引入

  至此参数都有了就可以调用:wx.requestPayment

  之后就是回调函数;回调方法接收统一下单方法返回的值,可以这样做,在xcxpay方法里是用&链接的,现在用&分割就可以得到想要的数据,再做处理就Ok!

  告诉微信你已经接到过通知 返回”success”;至此小程序微信支付就搞定了,现在大家通过学习已经知道要规避哪些问题了吧,也知道具体出错在哪里了吧,那么如果还存在有疑问的,可以留言咨询。

  本文由专业的微信小程序开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。

继续阅读 »

  对于开发一款小程序来说,经常是需要做支付功能的,但是大家在做这个功能的时候,往往会发现遇到很多自己无法解决的问题,那么对于这个问题,下面就跟大家详细来分析解答一下吧。

  重点代码部分:
/*

  • A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
  • Digest Algorithm, as defined in RFC 1321.
  • Version 1.1 Copyright (C) Paul Johnston 1999 - 2002.
  • Code also contributed by Greg Holt
  • See http://pajhome.org.uk/site/legal.html for details.
    */

/*

  • Add integers, wrapping at 2^32. This uses 16-bit operations internally
  • to work around bugs in some JS interpreters.
    */
    function safe_add(x, y) {
    var lsw = (x & 0xFFFF) + (y & 0xFFFF)
    var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
    return (msw << 16) | (lsw & 0xFFFF)
    }

/*

  • Bitwise rotate a 32-bit number to the left.
    */
    function rol(num, cnt) {
    return (num << cnt) | (num >>> (32 - cnt))
    }

/*

  • These functions implement the four basic operations the algorithm uses.
    */
    function cmn(q, a, b, x, s, t) {
    return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)
    }
    function ff(a, b, c, d, x, s, t) {
    return cmn((b & c) | ((~b) & d), a, b, x, s, t)
    }
    function gg(a, b, c, d, x, s, t) {
    return cmn((b & d) | (c & (~d)), a, b, x, s, t)
    }
    function hh(a, b, c, d, x, s, t) {
    return cmn(b ^ c ^ d, a, b, x, s, t)
    }
    function ii(a, b, c, d, x, s, t) {
    return cmn(c ^ (b | (~d)), a, b, x, s, t)
    }

/*

  • Calculate the MD5 of an array of little-endian words, producing an array
  • of little-endian words.
    */
    function coreMD5(x) {
    var a = 1732584193
    var b = -271733879
    var c = -1732584194
    var d = 271733878

for (var i = 0; i < x.length; i += 16) {
var olda = a
var oldb = b
var oldc = c
var oldd = d

a = ff(a, b, c, d, x[i + 0], 7, -680876936)
d = ff(d, a, b, c, x[i + 1], 12, -389564586)
c = ff(c, d, a, b, x[i + 2], 17, 606105819)
b = ff(b, c, d, a, x[i + 3], 22, -1044525330)
a = ff(a, b, c, d, x[i + 4], 7, -176418897)
d = ff(d, a, b, c, x[i + 5], 12, 1200080426)
c = ff(c, d, a, b, x[i + 6], 17, -1473231341)
b = ff(b, c, d, a, x[i + 7], 22, -45705983)
a = ff(a, b, c, d, x[i + 8], 7, 1770035416)
d = ff(d, a, b, c, x[i + 9], 12, -1958414417)
c = ff(c, d, a, b, x[i + 10], 17, -42063)
b = ff(b, c, d, a, x[i + 11], 22, -1990404162)
a = ff(a, b, c, d, x[i + 12], 7, 1804603682)
d = ff(d, a, b, c, x[i + 13], 12, -40341101)
c = ff(c, d, a, b, x[i + 14], 17, -1502002290)
b = ff(b, c, d, a, x[i + 15], 22, 1236535329)

a = gg(a, b, c, d, x[i + 1], 5, -165796510)
d = gg(d, a, b, c, x[i + 6], 9, -1069501632)
c = gg(c, d, a, b, x[i + 11], 14, 643717713)
b = gg(b, c, d, a, x[i + 0], 20, -373897302)
a = gg(a, b, c, d, x[i + 5], 5, -701558691)
d = gg(d, a, b, c, x[i + 10], 9, 38016083)
c = gg(c, d, a, b, x[i + 15], 14, -660478335)
b = gg(b, c, d, a, x[i + 4], 20, -405537848)
a = gg(a, b, c, d, x[i + 9], 5, 568446438)
d = gg(d, a, b, c, x[i + 14], 9, -1019803690)
c = gg(c, d, a, b, x[i + 3], 14, -187363961)
b = gg(b, c, d, a, x[i + 8], 20, 1163531501)
a = gg(a, b, c, d, x[i + 13], 5, -1444681467)
d = gg(d, a, b, c, x[i + 2], 9, -51403784)
c = gg(c, d, a, b, x[i + 7], 14, 1735328473)
b = gg(b, c, d, a, x[i + 12], 20, -1926607734)

a = hh(a, b, c, d, x[i + 5], 4, -378558)
d = hh(d, a, b, c, x[i + 8], 11, -2022574463)
c = hh(c, d, a, b, x[i + 11], 16, 1839030562)
b = hh(b, c, d, a, x[i + 14], 23, -35309556)
a = hh(a, b, c, d, x[i + 1], 4, -1530992060)
d = hh(d, a, b, c, x[i + 4], 11, 1272893353)
c = hh(c, d, a, b, x[i + 7], 16, -155497632)
b = hh(b, c, d, a, x[i + 10], 23, -1094730640)
a = hh(a, b, c, d, x[i + 13], 4, 681279174)
d = hh(d, a, b, c, x[i + 0], 11, -358537222)
c = hh(c, d, a, b, x[i + 3], 16, -722521979)
b = hh(b, c, d, a, x[i + 6], 23, 76029189)
a = hh(a, b, c, d, x[i + 9], 4, -640364487)
d = hh(d, a, b, c, x[i + 12], 11, -421815835)
c = hh(c, d, a, b, x[i + 15], 16, 530742520)
b = hh(b, c, d, a, x[i + 2], 23, -995338651)

a = ii(a, b, c, d, x[i + 0], 6, -198630844)
d = ii(d, a, b, c, x[i + 7], 10, 1126891415)
c = ii(c, d, a, b, x[i + 14], 15, -1416354905)
b = ii(b, c, d, a, x[i + 5], 21, -57434055)
a = ii(a, b, c, d, x[i + 12], 6, 1700485571)
d = ii(d, a, b, c, x[i + 3], 10, -1894986606)
c = ii(c, d, a, b, x[i + 10], 15, -1051523)
b = ii(b, c, d, a, x[i + 1], 21, -2054922799)
a = ii(a, b, c, d, x[i + 8], 6, 1873313359)
d = ii(d, a, b, c, x[i + 15], 10, -30611744)
c = ii(c, d, a, b, x[i + 6], 15, -1560198380)
b = ii(b, c, d, a, x[i + 13], 21, 1309151649)
a = ii(a, b, c, d, x[i + 4], 6, -145523070)
d = ii(d, a, b, c, x[i + 11], 10, -1120210379)
c = ii(c, d, a, b, x[i + 2], 15, 718787259)
b = ii(b, c, d, a, x[i + 9], 21, -343485551)

a = safe_add(a, olda)
b = safe_add(b, oldb)
c = safe_add(c, oldc)
d = safe_add(d, oldd)
}
return [a, b, c, d]
}

/*

  • Convert an array of little-endian words to a hex string.
    /
    function binl2hex(binarray) {
    var hex_tab = "0123456789abcdef"
    var str = ""
    for (var i = 0; i < binarray.length
    4; i++) {
    str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) 8 + 4)) & 0xF) +
    hex_tab.charAt((binarray[i >> 2] >> ((i % 4)
    8)) & 0xF)
    }
    return str
    }

/*

  • Convert an array of little-endian words to a base64 encoded string.
    /
    function binl2b64(binarray) {
    var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    var str = ""
    for (var i = 0; i < binarray.length
    32; i += 6) {
    str += tab.charAt(((binarray[i >> 5] << (i % 32)) & 0x3F) |
    ((binarray[i >> 5 + 1] >> (32 - i % 32)) & 0x3F))
    }
    return str
    }

/*

  • Convert an 8-bit character string to a sequence of 16-word blocks, stored
  • as an array, and append appropriate padding for MD4/5 calculation.
  • If any of the characters are >255, the high byte is silently ignored.
    /
    function str2binl(str) {
    var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks
    var blks = new Array(nblk
    16)
    for (var i = 0; i < nblk 16; i++) blks[i] = 0
    for (var i = 0; i < str.length; i++)
    blks[i >> 2] |= (str.charCodeAt(i) & 0xFF) << ((i % 4)
    8)
    blks[i >> 2] |= 0x80 << ((i % 4) 8)
    blks[nblk
    16 - 2] = str.length * 8
    return blks
    }

/*

  • Convert a wide-character string to a sequence of 16-word blocks, stored as
  • an array, and append appropriate padding for MD4/5 calculation.
    /
    function strw2binl(str) {
    var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocks
    var blks = new Array(nblk
    16)
    for (var i = 0; i < nblk 16; i++) blks[i] = 0
    for (var i = 0; i < str.length; i++)
    blks[i >> 1] |= str.charCodeAt(i) << ((i % 2)
    16)
    blks[i >> 1] |= 0x80 << ((i % 2) 16)
    blks[nblk
    16 - 2] = str.length * 16
    return blks
    }

/*

  • External interface
    /
    function hexMD5(str) { return binl2hex(coreMD5(str2binl(str))) }
    function hexMD5w(str) { return binl2hex(coreMD5(strw2binl(str))) }
    function b64MD5(str) { return binl2b64(coreMD5(str2binl(str))) }
    function b64MD5w(str) { return binl2b64(coreMD5(strw2binl(str))) }
    /
    Backward compatibility */
    function calcMD5(str) { return binl2hex(coreMD5(str2binl(str))) }
    module.exports = {
    hexMD5: hexMD5
    }

  然后在js中引入

  至此参数都有了就可以调用:wx.requestPayment

  之后就是回调函数;回调方法接收统一下单方法返回的值,可以这样做,在xcxpay方法里是用&链接的,现在用&分割就可以得到想要的数据,再做处理就Ok!

  告诉微信你已经接到过通知 返回”success”;至此小程序微信支付就搞定了,现在大家通过学习已经知道要规避哪些问题了吧,也知道具体出错在哪里了吧,那么如果还存在有疑问的,可以留言咨询。

  本文由专业的微信小程序开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。

收起阅读 »

【分享】合理地利用入口页初始化应用的信息

登录 首页 5+App开发 h5+ HBuilderX HBuilder manifest.json配置 manifest

开发 5+ App 时,『页面入口』通常会配置为应用的首页。这种配置方式,也存在着一些不方便的地方:

  • 首页比较特殊,一些配置需要在 manifest.json 中填写。比如 titleNView、subNViews 等。
  • 登录状态或者环境语言等信息,可能需要在应用启动的时候尽可能早的获取。这些状态也会影响到首页的信息,修改操作不是很方便。

其实可以换一个思路,利用『页面入口』作为一个初始化的页面。这个页面不显示出来,登录状态或者语言等信息的处理在这里完成。

调整页面

依旧使用 index.html 作为入口,同时调整 splash 为手动关闭。新建一个 home.html 作为实际的首页,id 约定为 home。

index.html

因为这个页面没有实际的内容,因此前面需要将 splash 调整为手动关闭,防止白屏。

在这个页面完成的工作有:

  • 获取登录状态
  • 获取当前系统语言信息
  • 监听 backbutton

获取完相关信息后,打开实际的首页窗口。如果需要用到 titleNView 或者 subNViews,那么在 js 中完成配置或绘制,相较于在 json 中配置会更加灵活。

var url = 'home.html';  
var login = $login.getValue();  
var lang = $lang.getValue();  
var webview = null;  

url += '?login=' + login + '&lang=' + lang;  

webview = plus.webview.create(url, 'home', {  
  titleNView: {  
    backgroundColor: '#ff3333',  
    titleText: '首页',  
    titleColor: '#ffffff',  
  },  
});  
webview.show('none');

注意这里未使用动画效果,一来节省开销,二来动画也看不到。

home.html

这是真正的首页,在这个页面要完成的工作主要有:

  • 获取入口页传递过来的参数信息。
  • 根据参数信息,初始化相应的内容。
  • 在合理的时机选择关闭 splash。

登录

未登录状态下,其实有两种引导用户登录的方式。

  • 弹框提示用户去登录。
  • 直接打开登录页,并且登录页点击 back 触发退出的逻辑。

如果选择直接打开登录页,就可以理解为应用是强制需要登录的,那么登录页 back 需要走退出的逻辑。并且 splash 的关闭也应当在登录页完成。

语言

语言信息的初始化,建议两种方式。

  • 应用本地 js 中存储配置读取。
  • 联网从服务器拉取。

无论选择哪种方式,都应当在渲染语言信息相关的内容后,再选择关闭 splash。

结束

实际开发中,需要根据业务场景灵活掌握,而非一成不变。附件中有一个简单的示例项目,下载后直接拖到 HBuilder/HBuilderX 中真机运行即可预览效果。

注意:这是 5+ App 是移动应用,不要再问为什么浏览器中没有效果这种问题了。

继续阅读 »

开发 5+ App 时,『页面入口』通常会配置为应用的首页。这种配置方式,也存在着一些不方便的地方:

  • 首页比较特殊,一些配置需要在 manifest.json 中填写。比如 titleNView、subNViews 等。
  • 登录状态或者环境语言等信息,可能需要在应用启动的时候尽可能早的获取。这些状态也会影响到首页的信息,修改操作不是很方便。

其实可以换一个思路,利用『页面入口』作为一个初始化的页面。这个页面不显示出来,登录状态或者语言等信息的处理在这里完成。

调整页面

依旧使用 index.html 作为入口,同时调整 splash 为手动关闭。新建一个 home.html 作为实际的首页,id 约定为 home。

index.html

因为这个页面没有实际的内容,因此前面需要将 splash 调整为手动关闭,防止白屏。

在这个页面完成的工作有:

  • 获取登录状态
  • 获取当前系统语言信息
  • 监听 backbutton

获取完相关信息后,打开实际的首页窗口。如果需要用到 titleNView 或者 subNViews,那么在 js 中完成配置或绘制,相较于在 json 中配置会更加灵活。

var url = 'home.html';  
var login = $login.getValue();  
var lang = $lang.getValue();  
var webview = null;  

url += '?login=' + login + '&lang=' + lang;  

webview = plus.webview.create(url, 'home', {  
  titleNView: {  
    backgroundColor: '#ff3333',  
    titleText: '首页',  
    titleColor: '#ffffff',  
  },  
});  
webview.show('none');

注意这里未使用动画效果,一来节省开销,二来动画也看不到。

home.html

这是真正的首页,在这个页面要完成的工作主要有:

  • 获取入口页传递过来的参数信息。
  • 根据参数信息,初始化相应的内容。
  • 在合理的时机选择关闭 splash。

登录

未登录状态下,其实有两种引导用户登录的方式。

  • 弹框提示用户去登录。
  • 直接打开登录页,并且登录页点击 back 触发退出的逻辑。

如果选择直接打开登录页,就可以理解为应用是强制需要登录的,那么登录页 back 需要走退出的逻辑。并且 splash 的关闭也应当在登录页完成。

语言

语言信息的初始化,建议两种方式。

  • 应用本地 js 中存储配置读取。
  • 联网从服务器拉取。

无论选择哪种方式,都应当在渲染语言信息相关的内容后,再选择关闭 splash。

结束

实际开发中,需要根据业务场景灵活掌握,而非一成不变。附件中有一个简单的示例项目,下载后直接拖到 HBuilder/HBuilderX 中真机运行即可预览效果。

注意:这是 5+ App 是移动应用,不要再问为什么浏览器中没有效果这种问题了。

收起阅读 »

为什么我要用GoEasy替代WebSocket

WEBSOCKET

最近一个紧急项目里,出于考虑节约开发成本和缩短开发周期的目的,我选择用GoEasy来替代自己搭建WebSocket,当然我也考虑过workerman和融云等同类型的产品。最后选择GoEasy的原因只有2点,极简、稳定。
我可以来说一下我在项目里从GoEasy得到了哪些实质性的帮助,这里敲黑板,可能其中的一到两条就是你想要的。

uniapp websocket体验demo:https://ext.dcloud.net.cn/plugin?id=1334

1 简单
我是写Java的,GoEasy里有自己的依赖包,我从注册到获取APP key,到自己写好代码到跑通推送不到30分钟,在我看来这是目前能最大程度减少开发成本和缩短开发周期的三方WebSocket的产品。从GoEasy这边所需要获取的也只有1个APP key和1个地址。

2 稳定
因为简单心里肯定会充满不确定性,担心稳定性不高,看官网所说的多集群和可靠容灾,因为我购买的消息数量不多,测了1W条,从开始到完成0.67S,没有漏发,还是很稳定的。

3 兼容性
从浏览器到代码类型,GoEasy兼容性做的可以说是很完善了,我从IE6开始测,目前没有发现不支持的浏览器。同时官网上的快速入门可以看到,可以支持任何开发语言。

4 安全
我这个项目消息推送数量不多,但是并发连接数量会比较多一点,所以我付了费增加并发数量,同时也体验了一下GoEasy所谓的独创的OTP技术,在app key和推送消息隐私方面做的很不错,具体的不多说,有兴趣可以去自己去了解一下。

5 应用范围
可以说GoEasy 的应用范围非常广泛了,整个WebScoket这一块完全不用你管,我觉得可以适用于任何web项目中。

这是我从用GoEasy得到的总结,当然可能没有说的很完整,如果你现在需求WebSocket而没有太多的时间去做这一块的话,可以去试试GoEasy的免费版。推荐原因很简单,因为真的很简单。(www.goeasy.io)

继续阅读 »

最近一个紧急项目里,出于考虑节约开发成本和缩短开发周期的目的,我选择用GoEasy来替代自己搭建WebSocket,当然我也考虑过workerman和融云等同类型的产品。最后选择GoEasy的原因只有2点,极简、稳定。
我可以来说一下我在项目里从GoEasy得到了哪些实质性的帮助,这里敲黑板,可能其中的一到两条就是你想要的。

uniapp websocket体验demo:https://ext.dcloud.net.cn/plugin?id=1334

1 简单
我是写Java的,GoEasy里有自己的依赖包,我从注册到获取APP key,到自己写好代码到跑通推送不到30分钟,在我看来这是目前能最大程度减少开发成本和缩短开发周期的三方WebSocket的产品。从GoEasy这边所需要获取的也只有1个APP key和1个地址。

2 稳定
因为简单心里肯定会充满不确定性,担心稳定性不高,看官网所说的多集群和可靠容灾,因为我购买的消息数量不多,测了1W条,从开始到完成0.67S,没有漏发,还是很稳定的。

3 兼容性
从浏览器到代码类型,GoEasy兼容性做的可以说是很完善了,我从IE6开始测,目前没有发现不支持的浏览器。同时官网上的快速入门可以看到,可以支持任何开发语言。

4 安全
我这个项目消息推送数量不多,但是并发连接数量会比较多一点,所以我付了费增加并发数量,同时也体验了一下GoEasy所谓的独创的OTP技术,在app key和推送消息隐私方面做的很不错,具体的不多说,有兴趣可以去自己去了解一下。

5 应用范围
可以说GoEasy 的应用范围非常广泛了,整个WebScoket这一块完全不用你管,我觉得可以适用于任何web项目中。

这是我从用GoEasy得到的总结,当然可能没有说的很完整,如果你现在需求WebSocket而没有太多的时间去做这一块的话,可以去试试GoEasy的免费版。推荐原因很简单,因为真的很简单。(www.goeasy.io)

收起阅读 »

开发app是找专业的开发公司好还是自主研发好呢

5 App开发

  做app开发是找专业的郑州app开发公司好,还是自己组建团队好呢?其实对于这样的选择,很多人都不知道有什么区别,因此在选择的时候比较犯难,那么对于这样的问题,下面就为大家分析解答一下吧。

  一、专业的APP开发公司制作

  1、app开发分为部分外包和全部外包。部分外包是指发包者自己完成一部分工作比如企划、美工或者其他一部分技术,剩下的其他部分由app开发公司的专业工程师完成,这样发包者公司是主导者,外包公司或者外包团队只负责配合工作。

  2、沟通。外包项目最需要的就是沟通,不管是部分外包还是全部外包,都是需要相互沟通的,只是部分外包要比全部外包的沟通少一些。全部外包是指发包者提供功能需求,从原型图、UI设计到程序开发全部交由专业的外包公司来完成,这是行业里最常见的一种方式,但是全部外包需要事情进行充分的沟通,不然极易引发矛盾,做出的APP项目和客户想象中的差别大,再改动的话耗时耗力,错失了进入市场的时机,那对于双方来说得不偿失。

  3、金钱成本。不管是部分外包还是全部外包,外包公司都是根据功能需求和工期进行报价的,这样的话发包者只需要拿出这些成本即可,一般来说要比自己组建团队要节省不少。

  二、自主研发APP

  1、创建团队。自己创建开发团队进行APP开发的话,至少要包括产品经理、项目经理、UI设计师、后台技术员、安卓技术员、IOS技术员、测试人员,这样才能算是一个完整的开发团队。

  2、时间。对于刚组建的开发团队,一切要从零开始,招聘员工需要一定的时间,团队人员相互磨合写作需要时间,这样的话,估计需要两三个月的时间才能组建成功。

  3、金钱成本。按照现在的工资每个部门一个人来算,产品经理、项目经理大概在6000~8000左右,技术人员工资大概在10000左右,再加上办公室租金、物业费、水电费等等一些环境成本,还有时间成本,想要开发出一个高质量的APP项目,成本花费至少在50万以上。

  以上就是小编总结的关于APP开发是自主研发还是找专业的app软件开发公司,这就要根据自身情况来决定,对于没有团队而经费又不多的创业者来说,APP开发就像一道没有答案的选择题,到底选择哪种开发方式,需要自己慎重考虑,谨慎选择。本文由专业的郑州app开发公司燚轩科技整理发布,如需转载请注明出处。

继续阅读 »

  做app开发是找专业的郑州app开发公司好,还是自己组建团队好呢?其实对于这样的选择,很多人都不知道有什么区别,因此在选择的时候比较犯难,那么对于这样的问题,下面就为大家分析解答一下吧。

  一、专业的APP开发公司制作

  1、app开发分为部分外包和全部外包。部分外包是指发包者自己完成一部分工作比如企划、美工或者其他一部分技术,剩下的其他部分由app开发公司的专业工程师完成,这样发包者公司是主导者,外包公司或者外包团队只负责配合工作。

  2、沟通。外包项目最需要的就是沟通,不管是部分外包还是全部外包,都是需要相互沟通的,只是部分外包要比全部外包的沟通少一些。全部外包是指发包者提供功能需求,从原型图、UI设计到程序开发全部交由专业的外包公司来完成,这是行业里最常见的一种方式,但是全部外包需要事情进行充分的沟通,不然极易引发矛盾,做出的APP项目和客户想象中的差别大,再改动的话耗时耗力,错失了进入市场的时机,那对于双方来说得不偿失。

  3、金钱成本。不管是部分外包还是全部外包,外包公司都是根据功能需求和工期进行报价的,这样的话发包者只需要拿出这些成本即可,一般来说要比自己组建团队要节省不少。

  二、自主研发APP

  1、创建团队。自己创建开发团队进行APP开发的话,至少要包括产品经理、项目经理、UI设计师、后台技术员、安卓技术员、IOS技术员、测试人员,这样才能算是一个完整的开发团队。

  2、时间。对于刚组建的开发团队,一切要从零开始,招聘员工需要一定的时间,团队人员相互磨合写作需要时间,这样的话,估计需要两三个月的时间才能组建成功。

  3、金钱成本。按照现在的工资每个部门一个人来算,产品经理、项目经理大概在6000~8000左右,技术人员工资大概在10000左右,再加上办公室租金、物业费、水电费等等一些环境成本,还有时间成本,想要开发出一个高质量的APP项目,成本花费至少在50万以上。

  以上就是小编总结的关于APP开发是自主研发还是找专业的app软件开发公司,这就要根据自身情况来决定,对于没有团队而经费又不多的创业者来说,APP开发就像一道没有答案的选择题,到底选择哪种开发方式,需要自己慎重考虑,谨慎选择。本文由专业的郑州app开发公司燚轩科技整理发布,如需转载请注明出处。

收起阅读 »