HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

php编程中如何避免调用in_array()函数出错问题

  php开发过程中,经常会遇到判断一维数组中是否含有某个元素,这是会用到in_array();由于php是弱类型的语言,所以不小心的话,也会踩到“坑”。(注:这里测试用到的php版本是5.6。)那么具体该如何注意呢?下面就来跟大家分享一些实用经验。

  一、前方有坑

  直接上代码:

  $arr = ['php在路上',1];

  echo in_array(true,$arr) ? 1 : 0;

  echo in_array(0,$arr) ? 1 : 0;

  结果:

  11

  二、为啥有坑

  其实,从底层源码上来说,in_array()也是用了循环逐个比较的方法。而前几期我们说了,’php在路上’==true,’php在路上’==0这两个是成立的。

  看了网上,有人使用for来判断。

  php是弱类型语言,对变量的定义和使用不是严格,多数的“坑”都是来源于这一点。不过,这个“坑”php语言表示不背这个坑,in_array()函数表示委屈。

  这是使用者对in_array()的用法没好好看手册的原因,看手册:

  函数:

  bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

  参数:

  needle:要查找的值。

  haystack:查找的数组

  strict:是否严格匹配,TRUE 或者 FALSE

  返回值

  如果找到 needle 则返回 TRUE,否则返回 FALSE。

  重点来了,关键在第三个参数:strict,如果为TRUE,会先比较类型再比较值。默认为false,false,false,false……原因在这!

  so,在使用in_array()函数的时候别省略第三个参数。

  三、防坑扩展

  1、在in_array()函数中,needle参数是区分大小写的。

  2、有时候在数组搜索给定的值时,如果还想知道给定值所在的索引,那就会用到array_search()函数。这个函数也是有第三个参数的,也是表示是否严格匹配。

  另外,由于array_search()函数返回的是给定值所在的索引,所以返回值可能是0或者false,所以在后续的判断是否存在给定值的时候,要使用“===”来判断。

  如:

  $arr = ['12',13,'php在路上'];

  echo array_search('12',$arr,true)===false ? '没找到' : '找到了';

  四、防坑互动

  看代码:

  $arr = ['php在路上',12,'',['我是字符串']];

  echo in_array([0],$arr) ? 1 : 0;

  现在大家清楚为什么在调用in_array()时出错了吧,那么在以后的编码中一定要注意了,如果还是存在不理解的地方或者有其他方面开发疑问的话,都是可以留言咨询获取帮助的。

  本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,转载请注明出处及作者。

继续阅读 »

  php开发过程中,经常会遇到判断一维数组中是否含有某个元素,这是会用到in_array();由于php是弱类型的语言,所以不小心的话,也会踩到“坑”。(注:这里测试用到的php版本是5.6。)那么具体该如何注意呢?下面就来跟大家分享一些实用经验。

  一、前方有坑

  直接上代码:

  $arr = ['php在路上',1];

  echo in_array(true,$arr) ? 1 : 0;

  echo in_array(0,$arr) ? 1 : 0;

  结果:

  11

  二、为啥有坑

  其实,从底层源码上来说,in_array()也是用了循环逐个比较的方法。而前几期我们说了,’php在路上’==true,’php在路上’==0这两个是成立的。

  看了网上,有人使用for来判断。

  php是弱类型语言,对变量的定义和使用不是严格,多数的“坑”都是来源于这一点。不过,这个“坑”php语言表示不背这个坑,in_array()函数表示委屈。

  这是使用者对in_array()的用法没好好看手册的原因,看手册:

  函数:

  bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

  参数:

  needle:要查找的值。

  haystack:查找的数组

  strict:是否严格匹配,TRUE 或者 FALSE

  返回值

  如果找到 needle 则返回 TRUE,否则返回 FALSE。

  重点来了,关键在第三个参数:strict,如果为TRUE,会先比较类型再比较值。默认为false,false,false,false……原因在这!

  so,在使用in_array()函数的时候别省略第三个参数。

  三、防坑扩展

  1、在in_array()函数中,needle参数是区分大小写的。

  2、有时候在数组搜索给定的值时,如果还想知道给定值所在的索引,那就会用到array_search()函数。这个函数也是有第三个参数的,也是表示是否严格匹配。

  另外,由于array_search()函数返回的是给定值所在的索引,所以返回值可能是0或者false,所以在后续的判断是否存在给定值的时候,要使用“===”来判断。

  如:

  $arr = ['12',13,'php在路上'];

  echo array_search('12',$arr,true)===false ? '没找到' : '找到了';

  四、防坑互动

  看代码:

  $arr = ['php在路上',12,'',['我是字符串']];

  echo in_array([0],$arr) ? 1 : 0;

  现在大家清楚为什么在调用in_array()时出错了吧,那么在以后的编码中一定要注意了,如果还是存在不理解的地方或者有其他方面开发疑问的话,都是可以留言咨询获取帮助的。

  本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,转载请注明出处及作者。

收起阅读 »

下拉刷新(重置数据) ,上拉加载更多数据 demo(jq)!

上拉加载 下拉刷新

下拉刷新(重置数据) ,上拉加载更多数据 用jq写的. 是移动端项目, 使用的模板引擎(template-web.js) !

  1. 图3. 是我封装的接口.

5.

继续阅读 »

下拉刷新(重置数据) ,上拉加载更多数据 用jq写的. 是移动端项目, 使用的模板引擎(template-web.js) !

  1. 图3. 是我封装的接口.

5.

收起阅读 »

H5手写签名,上传图片到服务器

先看看效果:

图片保存到服务器为png格式,一般10k左右。

这个功能适用于H5app,或者H5,或者pc网页端(IE9以上,支持canvas),

低端安卓机依然不支持,具体低端到什么程度,没有经过测试。

更详细的说明请移步:https://blog.csdn.net/moniteryao/article/details/82263653
下载完整demo请点击:https://download.csdn.net/download/moniteryao/10639108

继续阅读 »

先看看效果:

图片保存到服务器为png格式,一般10k左右。

这个功能适用于H5app,或者H5,或者pc网页端(IE9以上,支持canvas),

低端安卓机依然不支持,具体低端到什么程度,没有经过测试。

更详细的说明请移步:https://blog.csdn.net/moniteryao/article/details/82263653
下载完整demo请点击:https://download.csdn.net/download/moniteryao/10639108

收起阅读 »

郑州app开发价格的影响因素分析

5 App开发

  要说郑州app开发公司给出的app开发价格影响因素很多,包括:功能复杂程度、开发技术人员成本、时间成本、地域条件等。可能大家觉得app开发不应该这么贵,那么下面就为大家来详细的分析一下,看完大家就知道为什么有些app开发价格贵了。

  1、功能复杂程度:一款app功能复杂程度。前后端的功能,交互功能等尤为重要。如果这几方功能都比较复杂,报价肯定不会太低了。很多客户在沟通需求的时候,对功能需求定位不是很准确。不够细化,导致客户认为功能很简单,其实比较复杂。比如,电商商家入驻,客户觉得很简单,但是涉及到的即时聊天,用户评论,收藏店铺等等一系列都是需要考虑的。

  2、人员成本:人员成本可谓是老生常谈了。一个app开发项目都是需要的组成完善的技术开发团队。项目经理、产品经理、UI设计师、前端工程师、后端工程师、安卓工程师,IOS工程师(需要IOS版),测试工程师等技术开发人员。所有技术人员的薪资加起来这个费用占据非常大,甚至占到项目的三分之一到二分之一。

  3、时间成本:app开发项目一般都有开发周期的。目前时间成本有两种情况。一种常规的:开发周期越长,成本越贵。一种是加急情况,加急,特定情况下,时间越短,开发难度越高,当然开发价格肯定会比较贵的。

  4、地域成本:app开发价格和地域也是息息相关的。一般而言,一线城市的开发价格比三四线城市开发价格要贵一点。但是,一线城市开发公司的能力如互联互加科技肯定要比三四线开发公司要强上不少。

  在不了解app开发公司情况下,尽可能还是到app开发服务公司进行洽谈,不仅可以确定功能需求,app开发的详情报价表,还可以直接与项目经理及产品经理沟通,可以了解公司情况,办公环境(好的开发公司办公场所也是比较高大上的),公司人员等情况再做决定。信息来源郑州app开发公司燚轩科技整理发布,如需转载请注明出处!

继续阅读 »

  要说郑州app开发公司给出的app开发价格影响因素很多,包括:功能复杂程度、开发技术人员成本、时间成本、地域条件等。可能大家觉得app开发不应该这么贵,那么下面就为大家来详细的分析一下,看完大家就知道为什么有些app开发价格贵了。

  1、功能复杂程度:一款app功能复杂程度。前后端的功能,交互功能等尤为重要。如果这几方功能都比较复杂,报价肯定不会太低了。很多客户在沟通需求的时候,对功能需求定位不是很准确。不够细化,导致客户认为功能很简单,其实比较复杂。比如,电商商家入驻,客户觉得很简单,但是涉及到的即时聊天,用户评论,收藏店铺等等一系列都是需要考虑的。

  2、人员成本:人员成本可谓是老生常谈了。一个app开发项目都是需要的组成完善的技术开发团队。项目经理、产品经理、UI设计师、前端工程师、后端工程师、安卓工程师,IOS工程师(需要IOS版),测试工程师等技术开发人员。所有技术人员的薪资加起来这个费用占据非常大,甚至占到项目的三分之一到二分之一。

  3、时间成本:app开发项目一般都有开发周期的。目前时间成本有两种情况。一种常规的:开发周期越长,成本越贵。一种是加急情况,加急,特定情况下,时间越短,开发难度越高,当然开发价格肯定会比较贵的。

  4、地域成本:app开发价格和地域也是息息相关的。一般而言,一线城市的开发价格比三四线城市开发价格要贵一点。但是,一线城市开发公司的能力如互联互加科技肯定要比三四线开发公司要强上不少。

  在不了解app开发公司情况下,尽可能还是到app开发服务公司进行洽谈,不仅可以确定功能需求,app开发的详情报价表,还可以直接与项目经理及产品经理沟通,可以了解公司情况,办公环境(好的开发公司办公场所也是比较高大上的),公司人员等情况再做决定。信息来源郑州app开发公司燚轩科技整理发布,如需转载请注明出处!

收起阅读 »

wap2app检测版本升级

参考官方文档 http://ask.dcloud.net.cn/article/12895,已完成ios及Android 更新检测,需打包测试使用:

【ps:在app.js文本的onLaunch方法中代码添加以下代码】

  var ua = navigator.userAgent;  
  if(ua.indexOf('Html5Plus')>-1 && ua.indexOf('StreamApp')==-1){  
         var url = "http://*********.com/update/down";//检查更新地址  
          var req = {//升级检测数据  
              "appid": plus.runtime.appid,  
              "version": plus.runtime.version,  
                       "plus":plus.os.name        //区分系统  
                     };  
          wap2app.ajax.get(url, req, function(rsp) {  
              if(rsp && rsp.status){  
                        //需要更新,提示用户  
                   plus.nativeUI.confirm(rsp.note, function(event) {  
                    if(0 == event.index) {//用户点击了“立即更新”按钮  
                           plus.runtime.openURL(rsp.url);  
                           }  
                       }, rsp.title, ["立即更新", "取  消"]);  
                    }              
                });  
      }

【php为例,后台代码】:

public function down(){  
   $appid = $_GET['appid'];  
   $version = $_GET['version'];//客户端版本号  
   $os= $_GET['plus']; //系统  
   $rsp = array('status' => 0);//默认返回值,不需要升级;  
   if (isset($appid) && isset($version)) {  
          if($appid=="__W2A__*****.com"){//校验appid  
              if($version !== "1.2"){ //最新版本号  
                 $rsp['status'] = 1;  
                 $rsp['title'] = "应用更新";  
                 $rsp['note'] = "添加检测版本升级;";//release notes,支持换行  
                 if($os == 'Android'){  
                       $rsp['url'] = "http://******/android.apk";//应用升级包下载地址  
                  }else{  
                       $rsp['url'] = "https://itunes.apple.com/cn/app/*****************";//应用升级包下载地址  
                  }  
              }  
        }  
 }  
 exit(json_encode($rsp));  
}  
继续阅读 »

参考官方文档 http://ask.dcloud.net.cn/article/12895,已完成ios及Android 更新检测,需打包测试使用:

【ps:在app.js文本的onLaunch方法中代码添加以下代码】

  var ua = navigator.userAgent;  
  if(ua.indexOf('Html5Plus')>-1 && ua.indexOf('StreamApp')==-1){  
         var url = "http://*********.com/update/down";//检查更新地址  
          var req = {//升级检测数据  
              "appid": plus.runtime.appid,  
              "version": plus.runtime.version,  
                       "plus":plus.os.name        //区分系统  
                     };  
          wap2app.ajax.get(url, req, function(rsp) {  
              if(rsp && rsp.status){  
                        //需要更新,提示用户  
                   plus.nativeUI.confirm(rsp.note, function(event) {  
                    if(0 == event.index) {//用户点击了“立即更新”按钮  
                           plus.runtime.openURL(rsp.url);  
                           }  
                       }, rsp.title, ["立即更新", "取  消"]);  
                    }              
                });  
      }

【php为例,后台代码】:

public function down(){  
   $appid = $_GET['appid'];  
   $version = $_GET['version'];//客户端版本号  
   $os= $_GET['plus']; //系统  
   $rsp = array('status' => 0);//默认返回值,不需要升级;  
   if (isset($appid) && isset($version)) {  
          if($appid=="__W2A__*****.com"){//校验appid  
              if($version !== "1.2"){ //最新版本号  
                 $rsp['status'] = 1;  
                 $rsp['title'] = "应用更新";  
                 $rsp['note'] = "添加检测版本升级;";//release notes,支持换行  
                 if($os == 'Android'){  
                       $rsp['url'] = "http://******/android.apk";//应用升级包下载地址  
                  }else{  
                       $rsp['url'] = "https://itunes.apple.com/cn/app/*****************";//应用升级包下载地址  
                  }  
              }  
        }  
 }  
 exit(json_encode($rsp));  
}  
收起阅读 »

解决Vue和mui组件(包括scroll和上拉下拉刷新)的冲突

scroll Vue

由于Vue是异步渲染,所以我们必须把mui的组件再dom更新完成后再初始化,具体怎么操作呢:
1/在plusready之外实例化vue!

var vm = new Vue({.....});  
mui.plusReady(function(){  
......  
});

2/在vue渲染完成dom后再实例化mui组件:
如:

mui.ajax(url,......success:function(data){  
  vm.list = data.list;  
  vm.$nextTick(function () {  
    //初始化轮播组件  
    gallery = mui('.mui-slider');  
    gallery.slider();   
    var deceleration = mui.os.ios?0.003:0.0009;  
    //初始化滚动组件  
    mui('.mui-scroll-wrapper').scroll({  
        bounce: true,  
        indicators: false, //是否显示滚动条  
        deceleration:deceleration  
    });  
});
继续阅读 »

由于Vue是异步渲染,所以我们必须把mui的组件再dom更新完成后再初始化,具体怎么操作呢:
1/在plusready之外实例化vue!

var vm = new Vue({.....});  
mui.plusReady(function(){  
......  
});

2/在vue渲染完成dom后再实例化mui组件:
如:

mui.ajax(url,......success:function(data){  
  vm.list = data.list;  
  vm.$nextTick(function () {  
    //初始化轮播组件  
    gallery = mui('.mui-slider');  
    gallery.slider();   
    var deceleration = mui.os.ios?0.003:0.0009;  
    //初始化滚动组件  
    mui('.mui-scroll-wrapper').scroll({  
        bounce: true,  
        indicators: false, //是否显示滚动条  
        deceleration:deceleration  
    });  
});
收起阅读 »

uni-app 整包升级/更新方案

uniapp 更新 检查更新 升级

官方已发布APP升级中心,支持原生APP整包升级和wgt资源包升级,我们强烈推荐您使用,详见https://uniapp.dcloud.io/uniCloud/upgrade-center

==================================

如下是官方APP升级中心发布之前的文章,供老用户参考,新用户推荐使用https://uniapp.dcloud.io/uniCloud/upgrade-center

使用 uni-app 开发,可将代码编译到iOS、Android、微信小程序等多个平台,升级时也需考虑多平台同步升级。

uni-app发布为小程序的升级模式较简单,只需将开发完的代码提交小程序后台,待审核通过后用户将自动升级。

App端的升级,又分为整包更新和资源热更新两种。

  • 整包更新,即常规的整个App安装包重新下载安装。
  • 资源热更新,即App并重新安装,里面的js等前端代码进行更新。

资源热更新另见文档:http://ask.dcloud.net.cn/article/35667

本文重点讲解整包更新。

一般iOS Appstore的安装包,无法直接更新。App启动后检查有新版本,只能调整到Appstore,然后用户在Appstore的详情页点击更新按钮。

而Android App,可以直接下载新的apk,只要包名和证书不变,就可以覆盖安装。

App升级,强烈推荐使用uniCloud。

  1. 把apk存放到uniCloud的cdn上,可以免费使用
  2. 有现成的插件,不用写升级逻辑,打好安装包,发布管理,检查升级都可以直接用,详见:https://ext.dcloud.net.cn/plugin?id=4470

如果不使用uniCloud,自己也可以写升级逻辑,下文讲解了常见的逻辑,但下文不是DCloud约定的强制逻辑,只是一般性常见做法的介绍。

接口约定

如下数据接口约定仅为示例,开发者可以自定义接口参数。

请求地址:https://www.example.com/update

请求方法:GET

请求数据:

{  
    "appid": plus.runtime.appid,  
    "version": plus.runtime.version  
}

响应数据:

{  
    "status":1,//升级标志,1:需要升级;0:无需升级  
    "note": "修复bug1;\n修复bug2;",//release notes  
    "url": "http://www.example.com/uniapp.apk" //更新包下载地址  
}

客户端实现

App启动时,向服务端上报当前版本号,服务端判断是否提示升级。

在App.vue的onLaunch中,发起升级检测请求,如下:

onLaunch: function () {  
    //#ifdef APP-PLUS  
    var server = "https://www.example.com/update"; //检查更新地址  
    var req = { //升级检测数据  
        "appid": plus.runtime.appid,  
        "version": plus.runtime.version  
    };  
    uni.request({  
        url: server,  
        data: req,  
        success: (res) => {  
            if (res.statusCode == 200 && res.data.status === 1) {  
                uni.showModal({ //提醒用户更新  
                    title: "更新提示",  
                    content: res.data.note,  
                    success: (res) => {  
                        if (res.confirm) {  
                            plus.runtime.openURL(res.data.url);  
                        }  
                    }  
                })  
            }  
        }  
    })  
    //#endif  
}

注意:App的升级检测代码必须使用条件编译,否则在非App环境由于不存在plus相关API,将会报错。

升级地址URL,如果是自行托管的App,就提供自己的包地址。如果是打开应用市场,那URL如下:

if (plus.os.name=="Android") {  
    appurl = "market://details?id=io.dcloud.hellouniapp"; //这个是通用应用市场,如果想指定某个应用商店,需要单独查这个应用商店的包名或scheme及参数  
}  
else{  
    appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253";  
}

服务端实现

根据客户端上报的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(rease notes、更新包地址等)

实现示例:

  1. 【推荐】通过uniCloud的云函数模板,快速实现升级检查逻辑,详情参考:https://ext.dcloud.net.cn/plugin?id=4470
  2. php示例代码:
header("Content-type:text/json");  
$appid = $_GET["appid"];  
$version = $_GET["version"]; //客户端版本号  
$rsp = array("status" => 0); //默认返回值,不需要升级  
if (isset($appid) && isset($version)) {  
    if ($appid === "__UNI__123456") { //校验appid  
        if ($version !== "1.0.1") { //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中  
            $rsp["status"] = 1;  
            $rsp["note"] = "修复bug1;\n修复bug2;"; //release notes  
            $rsp["url"] = "http://www.example.com/uniapp.apk"; //应用升级包下载地址  
        }  
    }  
}   
echo json_encode($rsp);  
exit;

常见问题

  1. 版本检测需要打包app,真机运行基座无法测试。因为真机运行的plus.runtime.version是固定值。
继续阅读 »

官方已发布APP升级中心,支持原生APP整包升级和wgt资源包升级,我们强烈推荐您使用,详见https://uniapp.dcloud.io/uniCloud/upgrade-center

==================================

如下是官方APP升级中心发布之前的文章,供老用户参考,新用户推荐使用https://uniapp.dcloud.io/uniCloud/upgrade-center

使用 uni-app 开发,可将代码编译到iOS、Android、微信小程序等多个平台,升级时也需考虑多平台同步升级。

uni-app发布为小程序的升级模式较简单,只需将开发完的代码提交小程序后台,待审核通过后用户将自动升级。

App端的升级,又分为整包更新和资源热更新两种。

  • 整包更新,即常规的整个App安装包重新下载安装。
  • 资源热更新,即App并重新安装,里面的js等前端代码进行更新。

资源热更新另见文档:http://ask.dcloud.net.cn/article/35667

本文重点讲解整包更新。

一般iOS Appstore的安装包,无法直接更新。App启动后检查有新版本,只能调整到Appstore,然后用户在Appstore的详情页点击更新按钮。

而Android App,可以直接下载新的apk,只要包名和证书不变,就可以覆盖安装。

App升级,强烈推荐使用uniCloud。

  1. 把apk存放到uniCloud的cdn上,可以免费使用
  2. 有现成的插件,不用写升级逻辑,打好安装包,发布管理,检查升级都可以直接用,详见:https://ext.dcloud.net.cn/plugin?id=4470

如果不使用uniCloud,自己也可以写升级逻辑,下文讲解了常见的逻辑,但下文不是DCloud约定的强制逻辑,只是一般性常见做法的介绍。

接口约定

如下数据接口约定仅为示例,开发者可以自定义接口参数。

请求地址:https://www.example.com/update

请求方法:GET

请求数据:

{  
    "appid": plus.runtime.appid,  
    "version": plus.runtime.version  
}

响应数据:

{  
    "status":1,//升级标志,1:需要升级;0:无需升级  
    "note": "修复bug1;\n修复bug2;",//release notes  
    "url": "http://www.example.com/uniapp.apk" //更新包下载地址  
}

客户端实现

App启动时,向服务端上报当前版本号,服务端判断是否提示升级。

在App.vue的onLaunch中,发起升级检测请求,如下:

onLaunch: function () {  
    //#ifdef APP-PLUS  
    var server = "https://www.example.com/update"; //检查更新地址  
    var req = { //升级检测数据  
        "appid": plus.runtime.appid,  
        "version": plus.runtime.version  
    };  
    uni.request({  
        url: server,  
        data: req,  
        success: (res) => {  
            if (res.statusCode == 200 && res.data.status === 1) {  
                uni.showModal({ //提醒用户更新  
                    title: "更新提示",  
                    content: res.data.note,  
                    success: (res) => {  
                        if (res.confirm) {  
                            plus.runtime.openURL(res.data.url);  
                        }  
                    }  
                })  
            }  
        }  
    })  
    //#endif  
}

注意:App的升级检测代码必须使用条件编译,否则在非App环境由于不存在plus相关API,将会报错。

升级地址URL,如果是自行托管的App,就提供自己的包地址。如果是打开应用市场,那URL如下:

if (plus.os.name=="Android") {  
    appurl = "market://details?id=io.dcloud.hellouniapp"; //这个是通用应用市场,如果想指定某个应用商店,需要单独查这个应用商店的包名或scheme及参数  
}  
else{  
    appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253";  
}

服务端实现

根据客户端上报的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(rease notes、更新包地址等)

实现示例:

  1. 【推荐】通过uniCloud的云函数模板,快速实现升级检查逻辑,详情参考:https://ext.dcloud.net.cn/plugin?id=4470
  2. php示例代码:
header("Content-type:text/json");  
$appid = $_GET["appid"];  
$version = $_GET["version"]; //客户端版本号  
$rsp = array("status" => 0); //默认返回值,不需要升级  
if (isset($appid) && isset($version)) {  
    if ($appid === "__UNI__123456") { //校验appid  
        if ($version !== "1.0.1") { //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中  
            $rsp["status"] = 1;  
            $rsp["note"] = "修复bug1;\n修复bug2;"; //release notes  
            $rsp["url"] = "http://www.example.com/uniapp.apk"; //应用升级包下载地址  
        }  
    }  
}   
echo json_encode($rsp);  
exit;

常见问题

  1. 版本检测需要打包app,真机运行基座无法测试。因为真机运行的plus.runtime.version是固定值。
收起阅读 »

个推的推送成功解决

个推 推送

首先声明,个推推送,官方文档是,android可以推送通知和透传消息,ios只能推送透传消息。
但在mui实现的时候,android端推送的通知,点击以后无法监听。经过苦逼的程序猿的苦苦探求,终于发现可以解决的一种方式了:
首先推送的时候,不能用通知推送,用透传消息的方式进行推送(透传消息可以监听到的),然后通过mui的的创建通知的方法,把获取的到的透传消息转为通知,这个时候的通知点击的时候就可以监听了,这个方法本人经过试验,可以成功的。代码如下


document.addEventListener("plusready", function() {  

    // 监听点击消息事件  
    plus.push.addEventListener("click", function(msg) {  

//      showAlert(JSON.stringify(msg))  
        switch(msg.payload) {  
            case "LocalMSG":  
                showAlert("点击通知本地创建消息启动:" + msg.content);  
                break;  
            default:  
                showAlert("点击离线推送消息启动:" + msg.content);  
                break;  
        }  

    }, false);  

    // 监听在线消息事件  
    plus.push.addEventListener("receive", function(msg) {  
        if(msg.aps) { // Apple APNS message  
            showAlert("接收到在线APNS消息:");  
        } else {  
            showAlert("接收到在线透传消息:" + msg.content );  
        }  
        createLocalPushMsg(msg);  
    }, false);  

}, false);  

function showAlert(tiltle) {  
    alert(tiltle);  
}  

function bindAlias(alias) {  
    var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");  
    var mainActivity = plus.android.runtimeMainActivity();  
    var i = PushManager.getInstance().bindAlias(mainActivity, alias);  
}  

function unbindAlias(alias) {  
    var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");  
    var mainActivity = plus.android.runtimeMainActivity();  
    var i = PushManager.getInstance().unBindAlias(mainActivity, alias);  
}  

function getClientid() {  

    var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");  
    var mainActivity = plus.android.runtimeMainActivity();  
    return PushManager.getInstance().getClientid(mainActivity);  

}  

//创建本地通知  
function createLocalPushMsg(msg){  

    var options = {cover:false};  
    var str = msg.content;  
    plus.push.createMessage( str, "LocalMSG", options );  
}  

//拉起服务的代码是这样的 :这个代码经测试,有或没有都可以收到通知消息  
function startService() {  
    var main = plus.android.runtimeMainActivity();  
    var Intent = plus.android.importClass('android.content.Intent');  
    var intent = new Intent();  
//  var serviceName = 'com.igexin.sdk.PushServiceForUser';  
          var serviceName = 'com.igexin.sdk.PushService';//把这里换成其他Service的名字,也可以实现拉取自定义的Service  
    intent.setClassName(main, serviceName);  
    main.startService(intent);  
}  
继续阅读 »

首先声明,个推推送,官方文档是,android可以推送通知和透传消息,ios只能推送透传消息。
但在mui实现的时候,android端推送的通知,点击以后无法监听。经过苦逼的程序猿的苦苦探求,终于发现可以解决的一种方式了:
首先推送的时候,不能用通知推送,用透传消息的方式进行推送(透传消息可以监听到的),然后通过mui的的创建通知的方法,把获取的到的透传消息转为通知,这个时候的通知点击的时候就可以监听了,这个方法本人经过试验,可以成功的。代码如下


document.addEventListener("plusready", function() {  

    // 监听点击消息事件  
    plus.push.addEventListener("click", function(msg) {  

//      showAlert(JSON.stringify(msg))  
        switch(msg.payload) {  
            case "LocalMSG":  
                showAlert("点击通知本地创建消息启动:" + msg.content);  
                break;  
            default:  
                showAlert("点击离线推送消息启动:" + msg.content);  
                break;  
        }  

    }, false);  

    // 监听在线消息事件  
    plus.push.addEventListener("receive", function(msg) {  
        if(msg.aps) { // Apple APNS message  
            showAlert("接收到在线APNS消息:");  
        } else {  
            showAlert("接收到在线透传消息:" + msg.content );  
        }  
        createLocalPushMsg(msg);  
    }, false);  

}, false);  

function showAlert(tiltle) {  
    alert(tiltle);  
}  

function bindAlias(alias) {  
    var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");  
    var mainActivity = plus.android.runtimeMainActivity();  
    var i = PushManager.getInstance().bindAlias(mainActivity, alias);  
}  

function unbindAlias(alias) {  
    var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");  
    var mainActivity = plus.android.runtimeMainActivity();  
    var i = PushManager.getInstance().unBindAlias(mainActivity, alias);  
}  

function getClientid() {  

    var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");  
    var mainActivity = plus.android.runtimeMainActivity();  
    return PushManager.getInstance().getClientid(mainActivity);  

}  

//创建本地通知  
function createLocalPushMsg(msg){  

    var options = {cover:false};  
    var str = msg.content;  
    plus.push.createMessage( str, "LocalMSG", options );  
}  

//拉起服务的代码是这样的 :这个代码经测试,有或没有都可以收到通知消息  
function startService() {  
    var main = plus.android.runtimeMainActivity();  
    var Intent = plus.android.importClass('android.content.Intent');  
    var intent = new Intent();  
//  var serviceName = 'com.igexin.sdk.PushServiceForUser';  
          var serviceName = 'com.igexin.sdk.PushService';//把这里换成其他Service的名字,也可以实现拉取自定义的Service  
    intent.setClassName(main, serviceName);  
    main.startService(intent);  
}  
收起阅读 »

应用切到前台,自动刷新当前页面

有一个问题:应用长时间停留在后台,再切回前台,因为应用长时间未刷新页面,导致的页面数据过于陈旧,与数据库不一致。
由此引申出来的需求:应用切换到后台1分钟之后,再切换到前台,自动刷新页面。
js 实现:

(function () {  

    var pauseTimestamp;  

    // 切到前台的时候  
    document.addEventListener( "resume", function () {  
        //切换到前台的时间戳  
        var resumeTimestamp = Date.now();  

        //如果应用已经切到后台1分钟以上了  
        if(resumeTimestamp - pauseTimestamp > 60000){  
        // if(resumeTimestamp - pauseTimestamp > 5000){  
            //刷新当前页  
            location.reload();  
        }  
    } );  

    // 切到后台的时候  
    document.addEventListener( "pause", function () {  

        //得到当前时间戳  
        pauseTimestamp = Date.now();  
    } );  
})();
继续阅读 »

有一个问题:应用长时间停留在后台,再切回前台,因为应用长时间未刷新页面,导致的页面数据过于陈旧,与数据库不一致。
由此引申出来的需求:应用切换到后台1分钟之后,再切换到前台,自动刷新页面。
js 实现:

(function () {  

    var pauseTimestamp;  

    // 切到前台的时候  
    document.addEventListener( "resume", function () {  
        //切换到前台的时间戳  
        var resumeTimestamp = Date.now();  

        //如果应用已经切到后台1分钟以上了  
        if(resumeTimestamp - pauseTimestamp > 60000){  
        // if(resumeTimestamp - pauseTimestamp > 5000){  
            //刷新当前页  
            location.reload();  
        }  
    } );  

    // 切到后台的时候  
    document.addEventListener( "pause", function () {  

        //得到当前时间戳  
        pauseTimestamp = Date.now();  
    } );  
})();
收起阅读 »

这样就可以在每次启动的时候自动启动啦!

这样就可以在每次启动的时候自动启动啦!
Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架
ORM 就是通过将Java对象映射到数据库表,通过操作Java对象,就可以完成对数据表的操作
Hibernate提供了对关系型数据库增删改成操作

2.1主流的ORM框架

?JPA Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系(只有接口规范)
?Hibernate 最流行ORM框架,通过对象-关系映射配置,可以完全脱离底层SQL
?MyBatis 本是apache的一个开源项目 iBatis,支持普通 SQL查询,存储过程和高级映射的优秀持久层框架
?Apache DBUtils 、Spring JDBCTemplate
2.2Hibernate 优势

?Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
?Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作 session.save(User);
?Hibernate使用java的反射机制
?Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。。

继续阅读 »

这样就可以在每次启动的时候自动启动啦!
Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架
ORM 就是通过将Java对象映射到数据库表,通过操作Java对象,就可以完成对数据表的操作
Hibernate提供了对关系型数据库增删改成操作

2.1主流的ORM框架

?JPA Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系(只有接口规范)
?Hibernate 最流行ORM框架,通过对象-关系映射配置,可以完全脱离底层SQL
?MyBatis 本是apache的一个开源项目 iBatis,支持普通 SQL查询,存储过程和高级映射的优秀持久层框架
?Apache DBUtils 、Spring JDBCTemplate
2.2Hibernate 优势

?Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
?Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作 session.save(User);
?Hibernate使用java的反射机制
?Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。。

收起阅读 »

PHP编程中如何将多种数据存入一个字段里

  无论是商品,拍品,还是产品。都有所对应的规格,不同的拍品所对应的规格不同,那么所填写的规格也就不同,对于某些产品来说有些规格需要填写,而有写规格不需要填写,那么在设计数据字段是为了避免不必要的字段,我们可以把所有的规格都存入了一个字段里。下面就来分享一下源码。
1、Php插入数据库。
php代码如下:
$spec="";
if($data['size']!=""){
$spec.="尺寸".":".$data['size'].",";
}
if($data['weight']!=""){
$spec.="重量".":".$data['weight'].",";
}
if($data['diameter']!=""){
$spec.="直径".":".$data['diameter'].",";
}
if($data['chang']!=""){
$spec.="长".":".$data['chang'].",";
}
if($data['height']!=""){
$spec.="高".":".$data['height'].",";
}
$data['spec']=rtrim($spec,",");
2、查询规格代码。
php代码如下:
<php>$array=explode(',',$list['spec']);
foreach($array as $k=>$v){
$arr[]=explode(':',$v);
};
foreach($arr as $k=>$v){
$t[$v[0]]=$v[1];
};
</php>
<li class=" ">
<span class="">尺寸</span>
<input class="cans1" type="text" <php>if(array_key_exists("尺寸",$t)){ $s=$t['尺寸']; }</php> value='{$s}' name="size" placeholder="0"/>
<span class="cans">单位(cm)</span>
</li>
<li class=" ">
<span class="">重量</span>
<input class="cans2 " type="text" <php>if(array_key_exists("重量",$t)){ $z=$t['重量'];}</php> value='{$z}' name="weight" placeholder="0"/>
<span class="cans">单位(g)</span>
</li>
<li class=" ">
<span class="">直径</span>
<input class="cans3" type="text" <php>if(array_key_exists("直径",$t)){ $j=$t['直径'];}</php> value='{$j}' name="diameter" placeholder="0"/>
<span class="cans">单位(cm)</span>
</li>
<li class=" ">
<span class="">长</span>
<input class="cans4" type="text" <php>if(array_key_exists("长",$t)){ $c=$t['长'];}</php> value='{$c}' name="chang" placeholder="0"/>
<span class="cans">单位(cm)</span>
</li>
<li class=" ">
<span class="">高</span>
<input class="cans5" type="text" <php>if(array_key_exists("高",$t)){ $g=$t['高'];}</php> value='{$g}' name="height" placeholder="0"/>
<span class="cans">单位(cm)</span>
</li>

  那么到这里就结束了,现在大家应该知道如何存储了吧,如果大家还是存在疑问的话,可以留言咨询。

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

继续阅读 »

  无论是商品,拍品,还是产品。都有所对应的规格,不同的拍品所对应的规格不同,那么所填写的规格也就不同,对于某些产品来说有些规格需要填写,而有写规格不需要填写,那么在设计数据字段是为了避免不必要的字段,我们可以把所有的规格都存入了一个字段里。下面就来分享一下源码。
1、Php插入数据库。
php代码如下:
$spec="";
if($data['size']!=""){
$spec.="尺寸".":".$data['size'].",";
}
if($data['weight']!=""){
$spec.="重量".":".$data['weight'].",";
}
if($data['diameter']!=""){
$spec.="直径".":".$data['diameter'].",";
}
if($data['chang']!=""){
$spec.="长".":".$data['chang'].",";
}
if($data['height']!=""){
$spec.="高".":".$data['height'].",";
}
$data['spec']=rtrim($spec,",");
2、查询规格代码。
php代码如下:
<php>$array=explode(',',$list['spec']);
foreach($array as $k=>$v){
$arr[]=explode(':',$v);
};
foreach($arr as $k=>$v){
$t[$v[0]]=$v[1];
};
</php>
<li class=" ">
<span class="">尺寸</span>
<input class="cans1" type="text" <php>if(array_key_exists("尺寸",$t)){ $s=$t['尺寸']; }</php> value='{$s}' name="size" placeholder="0"/>
<span class="cans">单位(cm)</span>
</li>
<li class=" ">
<span class="">重量</span>
<input class="cans2 " type="text" <php>if(array_key_exists("重量",$t)){ $z=$t['重量'];}</php> value='{$z}' name="weight" placeholder="0"/>
<span class="cans">单位(g)</span>
</li>
<li class=" ">
<span class="">直径</span>
<input class="cans3" type="text" <php>if(array_key_exists("直径",$t)){ $j=$t['直径'];}</php> value='{$j}' name="diameter" placeholder="0"/>
<span class="cans">单位(cm)</span>
</li>
<li class=" ">
<span class="">长</span>
<input class="cans4" type="text" <php>if(array_key_exists("长",$t)){ $c=$t['长'];}</php> value='{$c}' name="chang" placeholder="0"/>
<span class="cans">单位(cm)</span>
</li>
<li class=" ">
<span class="">高</span>
<input class="cans5" type="text" <php>if(array_key_exists("高",$t)){ $g=$t['高'];}</php> value='{$g}' name="height" placeholder="0"/>
<span class="cans">单位(cm)</span>
</li>

  那么到这里就结束了,现在大家应该知道如何存储了吧,如果大家还是存在疑问的话,可以留言咨询。

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

收起阅读 »

uni-app 跨平台应用开发视频教程促销中!!只需88元即可学习全套课程

uniapp

uni-app 跨平台应用开发教程已经发布
一套代码可以发布为ios Android app、小程序。
课程总计25节 覆盖了开发中常用的知识点,知识点覆盖率 90% 以上!
通过课程您将学会:
1、uni-app
2、小程序
3、vue 基础
课程购买地址
https://ke.qq.com/course/323825?tuin=4f8da6

继续阅读 »

uni-app 跨平台应用开发教程已经发布
一套代码可以发布为ios Android app、小程序。
课程总计25节 覆盖了开发中常用的知识点,知识点覆盖率 90% 以上!
通过课程您将学会:
1、uni-app
2、小程序
3、vue 基础
课程购买地址
https://ke.qq.com/course/323825?tuin=4f8da6

收起阅读 »