
基于 MUI 构建一个具有 90 +页面的APP应用,欢迎star
前言
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 页面
更新:新版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
热门话题
近期最为热门的话题,当属 uni-app 了。
- uni-app全局变量如何定义:支持 vuex,可以借助 vuex 来实现全局变量。
- 【报Bug】uni-app扫码组件,非数字条码识别错误:一维码识别的问题已修复,请关注更新。
- uni-app的reLaunch每次都会出现启动页:已调整该 API 的实现,请关注更新。
- uni-app 的请求是否只支持 https:https 的限制是小程序的,移动应用并未做限制。
问题清单
- 选择照片后怎么知道照片大小:通过 plus.io 模块的方法可以读取目录/文件的基本信息。
- hbuilder 打包的app无法安装:近期调整了一些内容,导致部分云打包的应用无法正常安装。此问题已修复,详见帖子。
- 谷歌上架 targetSdkVersion 的问题:详见帖子。
- 【报Bug】安卓下不能正确返回文件类型:问题已修复,请关注更新。
开源及分享
- uni-app 开发者成功开发并发布应用,详见 lusita.cn。
- uniShop是基于Dcloud的uniApp开发的支持小程序、ios、android的B2C商城模板:uni-app 项目分享。
- 基于 MUI 构建一个具有 90 +页面的APP应用:一位小伙伴分享的,内容丰富的应用。
多说几句
uni-app 已经发布两周有余了,小伙伴们也都积极参与并反馈问题与意见。uni-app 希望有更多的小伙伴加入,成为它成长中的一员。
许多小伙伴可能会习惯于在 QQ 群问问题,但是 QQ 群适合咨询和小伙伴之间讨论,并不适合反馈问题和需求。
- QQ 消息一闪而过,一些信息很容易被忽略掉。
- 工作期间如果一直盯着 QQ 看,工作效率会非常低。
- 问答社区可以方便地去翻阅,或者转发。
- 同样的,社区的内容可以沉淀下来,为后来的小伙伴提供更多的帮助。
总之,在使用产品的过程中,遇到问题或者疑惑,请前往问答社区反馈。
PS:如何正确高效地在社区提问
最后
本周的动态就是这些,希望能对大家有所帮助。同时,也希望更多的小伙伴在社区分享自己的经验心得,交流学习。
祝大家周末愉快。
热门话题
近期最为热门的话题,当属 uni-app 了。
- uni-app全局变量如何定义:支持 vuex,可以借助 vuex 来实现全局变量。
- 【报Bug】uni-app扫码组件,非数字条码识别错误:一维码识别的问题已修复,请关注更新。
- uni-app的reLaunch每次都会出现启动页:已调整该 API 的实现,请关注更新。
- uni-app 的请求是否只支持 https:https 的限制是小程序的,移动应用并未做限制。
问题清单
- 选择照片后怎么知道照片大小:通过 plus.io 模块的方法可以读取目录/文件的基本信息。
- hbuilder 打包的app无法安装:近期调整了一些内容,导致部分云打包的应用无法正常安装。此问题已修复,详见帖子。
- 谷歌上架 targetSdkVersion 的问题:详见帖子。
- 【报Bug】安卓下不能正确返回文件类型:问题已修复,请关注更新。
开源及分享
- uni-app 开发者成功开发并发布应用,详见 lusita.cn。
- uniShop是基于Dcloud的uniApp开发的支持小程序、ios、android的B2C商城模板:uni-app 项目分享。
- 基于 MUI 构建一个具有 90 +页面的APP应用:一位小伙伴分享的,内容丰富的应用。
多说几句
uni-app 已经发布两周有余了,小伙伴们也都积极参与并反馈问题与意见。uni-app 希望有更多的小伙伴加入,成为它成长中的一员。
许多小伙伴可能会习惯于在 QQ 群问问题,但是 QQ 群适合咨询和小伙伴之间讨论,并不适合反馈问题和需求。
- QQ 消息一闪而过,一些信息很容易被忽略掉。
- 工作期间如果一直盯着 QQ 看,工作效率会非常低。
- 问答社区可以方便地去翻阅,或者转发。
- 同样的,社区的内容可以沉淀下来,为后来的小伙伴提供更多的帮助。
总之,在使用产品的过程中,遇到问题或者疑惑,请前往问答社区反馈。
PS:如何正确高效地在社区提问
最后
本周的动态就是这些,希望能对大家有所帮助。同时,也希望更多的小伙伴在社区分享自己的经验心得,交流学习。
祝大家周末愉快。

微信支付失败返回 -1
微信支付返回-1,调起微信支付失败
项目中要用到微信支付,所以打算把微信支付集成进去,参考了官方demo,但是遇到了BUG,返回-100,微信端错误码是-1;
官方的解释是:
遇到这个问题:
- 首先排查自己的包名和签名是否与申请微信开放平台的APK包名和签名一致;
- 离线打包和云打包时微信支付的appid是否和微信开放平台的appid一致;
- 如果1和2都没问题,一般就是服务端的问题了;
- 服务端首先排除是否有下发所需要的参数;
- 服务端签名sign一定要按照签名规则来签名;(我就是签名问题,顺序一定不要错);
6.其他原因(未知);
效果图:
祝大家开发愉快
微信支付返回-1,调起微信支付失败
项目中要用到微信支付,所以打算把微信支付集成进去,参考了官方demo,但是遇到了BUG,返回-100,微信端错误码是-1;
官方的解释是:
遇到这个问题:
- 首先排查自己的包名和签名是否与申请微信开放平台的APK包名和签名一致;
- 离线打包和云打包时微信支付的appid是否和微信开放平台的appid一致;
- 如果1和2都没问题,一般就是服务端的问题了;
- 服务端首先排除是否有下发所需要的参数;
- 服务端签名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 时,『页面入口』通常会配置为应用的首页。这种配置方式,也存在着一些不方便的地方:
- 首页比较特殊,一些配置需要在 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
最近一个紧急项目里,出于考虑节约开发成本和缩短开发周期的目的,我选择用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是找专业的开发公司好还是自主研发好呢
做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开发公司燚轩科技整理发布,如需转载请注明出处。
收起阅读 »