
ThinkPHP5.0入门到精通(含项目)
ThinkPHP5.0入门到精通
http://study.163.com/course/courseMain.htm?courseId=1003838084
课程介绍:
第一部分:
Thinkphp5.0入门教程,使开发者快速从thinkphp3.2版本过度到thinkphp5.0,最高效的降低学习成本,不研究概念性的东西,只讲究实际开发中用到的东西。
第二部分:
属于高级教程,有一定的难度,开发项目中常用的到类库或则组件,都会陆续更新上去,比如phpmailer邮件服务,阿里云oss存储服务,
支付宝支付,微信支付,七牛云存错,图片上传等等,整理成插件的形式,便于学习和使用。
由于课程标题数量限制,只能突出一部分知识点。
有php的基础知识,有了解过thinkphp方面的知识。
第一阶段(学前私信:835173372)
001:站点部署环境和框架解释
002:代码执行流程和命名空间
003:数据库配置和引入db类库
004:数据库CURD-查询数据,插入数据
单条查询,批量查询,单条插入,批量插入。
005:数据库CURD-更新数据,删除数据
单条更新,批量更新,单条删除,批量删除,字段加1/n,字段健1/n
006:数据库CURD-查询方法,查询语法
getTableInfo()方法,where()F方法,whereOr()方法,混合查询,LIKE查询, BETWEEN查询等等
007:数据库CURD-多表联查,缓存查询
alias(),join(),limit(),group(),order(),cache(),select()使用技巧。
008:数据库CURD-分页查询,聚合查询
page(),limit(),count(),max(),min(),avg()使用技巧
009:数据请求-请求信息,请求接受变量
Request类的引入和使用,is_Get();is_Post();is_Ajax();is_Mobile();input()助手函数的使用技巧
010:数据请求-伪静态,公共方法创建等
数据请求-伪静态,HTTP头信息,公共方法引入等
011:控制器初始化-空操作-跳转重定向等
控制器定义,初始化,空操作,跳转重定向详解
012:视图,模板赋值渲染,循环遍历等等
模板引擎,模板赋值,模板渲染,模板定位,模板标签,变量输出,循环输出标签,比较标签,原生php,定义标签。
013:Tp5.0-session功能的封装和执行原理
Session的创建,获取,删除,助手函数的使用。
014:分页实现-内置Paginator对象详解等
分页实现(内置Paginator对象来实现)
015:Workerman-PHP socket服务器框架
修改站点入口地址和Workerman-PHP socket服务器框架
插件开发
016:搭建PHPMailer类库开发邮件发送
git地址:https://github.com/PHPMailer/PHPMailer
php.ini注意开启ssl服务,命名空间的注意事项,smtp授权码的概念,网易邮箱客户端端口465
017:Tp5.0验证码的创建和验证使用技巧
验证码类库(think-captcha)引入使用,一个页面创建个多个验证吗,多个验证码的验证等等
018:验证码的ajax动态切换效果开发案例
cdn模式引入jquery类库,标准的ajax请求api接口数据案例,http请求和响应分析。
019:命令行自动生成模块目录和控制器
命令行自动生成模块目录和控制器
ThinkPHP5.0 具备自动创建功能,可以用来自动生成需要的模块及目录结构和文件等,自动生成主要调用\think\Build类库
020:Composer工具安装和使用-安装Tp5和插件
1:Composer工具安装和使用。2:使用中国镜像设置。3:安装thinkphp最新包和扩展类库。
项目实战-PHP订单系统开发
021:项目需求分析和库表结构分析
商品主表和附表分析,订单主表和附表分析,页面开发所用到js库-vue.js,layer-mobile.js,jqurey.js
022:下单页面模板引入,vue对象赋值技巧
以json字符串的格式赋值到模板的vue对象里
023:vue实现页面的数据绑定(需要vue的知识)
vue的高级用法,包括click事件,watch,v-model用法等等。
024:vue配合后台接口ajax实现省市区三级联动插件
后台提供ajax接口数据,用户不同的操作响应不同的返回数据。
025:vue配合Layer-mobil组合表单数据,下单操作
vue配合Layer-mobil组合表单数据,下单操作,layer-mobile做一些提示效果
026:订单入库操作,库表的回滚操作
订单入库操作,库表的回滚操作-多表更新操作容易产生垃圾数据。
027:代码优化和项目终结
代码优化和项目终结

学习地址:
http://study.163.com/course/courseMain.htm?courseId=1003838084
ThinkPHP5.0入门到精通
http://study.163.com/course/courseMain.htm?courseId=1003838084
课程介绍:
第一部分:
Thinkphp5.0入门教程,使开发者快速从thinkphp3.2版本过度到thinkphp5.0,最高效的降低学习成本,不研究概念性的东西,只讲究实际开发中用到的东西。
第二部分:
属于高级教程,有一定的难度,开发项目中常用的到类库或则组件,都会陆续更新上去,比如phpmailer邮件服务,阿里云oss存储服务,
支付宝支付,微信支付,七牛云存错,图片上传等等,整理成插件的形式,便于学习和使用。
由于课程标题数量限制,只能突出一部分知识点。
有php的基础知识,有了解过thinkphp方面的知识。
第一阶段(学前私信:835173372)
001:站点部署环境和框架解释
002:代码执行流程和命名空间
003:数据库配置和引入db类库
004:数据库CURD-查询数据,插入数据
单条查询,批量查询,单条插入,批量插入。
005:数据库CURD-更新数据,删除数据
单条更新,批量更新,单条删除,批量删除,字段加1/n,字段健1/n
006:数据库CURD-查询方法,查询语法
getTableInfo()方法,where()F方法,whereOr()方法,混合查询,LIKE查询, BETWEEN查询等等
007:数据库CURD-多表联查,缓存查询
alias(),join(),limit(),group(),order(),cache(),select()使用技巧。
008:数据库CURD-分页查询,聚合查询
page(),limit(),count(),max(),min(),avg()使用技巧
009:数据请求-请求信息,请求接受变量
Request类的引入和使用,is_Get();is_Post();is_Ajax();is_Mobile();input()助手函数的使用技巧
010:数据请求-伪静态,公共方法创建等
数据请求-伪静态,HTTP头信息,公共方法引入等
011:控制器初始化-空操作-跳转重定向等
控制器定义,初始化,空操作,跳转重定向详解
012:视图,模板赋值渲染,循环遍历等等
模板引擎,模板赋值,模板渲染,模板定位,模板标签,变量输出,循环输出标签,比较标签,原生php,定义标签。
013:Tp5.0-session功能的封装和执行原理
Session的创建,获取,删除,助手函数的使用。
014:分页实现-内置Paginator对象详解等
分页实现(内置Paginator对象来实现)
015:Workerman-PHP socket服务器框架
修改站点入口地址和Workerman-PHP socket服务器框架
插件开发
016:搭建PHPMailer类库开发邮件发送
git地址:https://github.com/PHPMailer/PHPMailer
php.ini注意开启ssl服务,命名空间的注意事项,smtp授权码的概念,网易邮箱客户端端口465
017:Tp5.0验证码的创建和验证使用技巧
验证码类库(think-captcha)引入使用,一个页面创建个多个验证吗,多个验证码的验证等等
018:验证码的ajax动态切换效果开发案例
cdn模式引入jquery类库,标准的ajax请求api接口数据案例,http请求和响应分析。
019:命令行自动生成模块目录和控制器
命令行自动生成模块目录和控制器
ThinkPHP5.0 具备自动创建功能,可以用来自动生成需要的模块及目录结构和文件等,自动生成主要调用\think\Build类库
020:Composer工具安装和使用-安装Tp5和插件
1:Composer工具安装和使用。2:使用中国镜像设置。3:安装thinkphp最新包和扩展类库。
项目实战-PHP订单系统开发
021:项目需求分析和库表结构分析
商品主表和附表分析,订单主表和附表分析,页面开发所用到js库-vue.js,layer-mobile.js,jqurey.js
022:下单页面模板引入,vue对象赋值技巧
以json字符串的格式赋值到模板的vue对象里
023:vue实现页面的数据绑定(需要vue的知识)
vue的高级用法,包括click事件,watch,v-model用法等等。
024:vue配合后台接口ajax实现省市区三级联动插件
后台提供ajax接口数据,用户不同的操作响应不同的返回数据。
025:vue配合Layer-mobil组合表单数据,下单操作
vue配合Layer-mobil组合表单数据,下单操作,layer-mobile做一些提示效果
026:订单入库操作,库表的回滚操作
订单入库操作,库表的回滚操作-多表更新操作容易产生垃圾数据。
027:代码优化和项目终结
代码优化和项目终结
学习地址:
http://study.163.com/course/courseMain.htm?courseId=1003838084

mui扩展图标的使用
1.在html中引入icons-extra.css文件即可。此文件可以在例子的css文件中找到,引入即可使用mui扩展图标
1.在html中引入icons-extra.css文件即可。此文件可以在例子的css文件中找到,引入即可使用mui扩展图标

video视频,点击播放禁止自动全屏,点击全屏自动横屏播放
点击播放禁止自动全屏
首先在manifest.json的plus节点下新增allowsInlineMediaPlayback节点为true。
"plus":{
"allowsInlineMediaPlayback": true
}
然后在video标签中添加playsinline属性,然后测试得出iphone5s系统8.3上还是会自动全屏(其他的没有全部测试过,不太清楚),查了一圈后加上webkit-playsinline好了,
注意两个都加上,否则高低版本不兼容
<video controls="controls" preload="auto" playsinline webkit-playsinline src="" poster="" width="100%" height="auto">
</video>
点击全屏自动横屏播放
现在已经可以点击不全屏播放了,但是看着字幕太小看不清,想点开全屏看,发现不能横屏,还是很小看不清,才发现app被设置成了禁止横屏,这就尴尬了!经过一番查找还是被我找出在app禁止横屏的基础上,点击全屏横屏播放的解决办法了:
首先在manifest.json里设置
全部勾上,或者直接在manifest.json的plus节点下的distribute节点里添加:
"orientation": ["portrait-primary","portrait-secondary","landscape-primary","landscape-secondary"],/*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/
然后在首页
plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏
所以app还是禁止横屏的
然后iOS上监听video元素的webkitbeginfullscreen与webkitendfullscreen事件,在全屏开始和结束时,对屏幕方向做相应的调整:
// iOS平台的视频全屏旋转
var fullScreenOfIos = function(videoElem) {
// 监听的事件与Android平台有很大区别
videoElem.addEventListener('webkitbeginfullscreen', function() {
plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏
});
videoElem.addEventListener('webkitendfullscreen', function() {
plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏
});
};
Android上监听webkitfullscreenchange事件,并且读取全屏元素,对屏幕方向做出调整:
// Android平台的视频全屏旋转
var fullScreenOfAndroid = function() {
if(true) {
// 最新5+API的支持
var self = plus.webview.currentWebview();
self.setStyle({
videoFullscreen: 'landscape'
});
} else {
document.addEventListener('webkitfullscreenchange', function() {
var el = document.webkitFullscreenElement; //获取全屏元素
if(el) {
plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏
} else {
plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏
}
});
}
};
最后让我们来分别调用一下:
// 涉及到5+API的内容,均在plusready事件后调用;
document.addEventListener('plusready', function() {
var osName = plus.os.name;
if(osName === 'Android') {
fullScreenOfAndroid();
} else if(osName === 'iOS') {
var videoElem = document.getElementById('video');
fullScreenOfIos(videoElem);
}
});
大功告成!!!
点击播放禁止自动全屏
首先在manifest.json的plus节点下新增allowsInlineMediaPlayback节点为true。
"plus":{
"allowsInlineMediaPlayback": true
}
然后在video标签中添加playsinline属性,然后测试得出iphone5s系统8.3上还是会自动全屏(其他的没有全部测试过,不太清楚),查了一圈后加上webkit-playsinline好了,
注意两个都加上,否则高低版本不兼容
<video controls="controls" preload="auto" playsinline webkit-playsinline src="" poster="" width="100%" height="auto">
</video>
点击全屏自动横屏播放
现在已经可以点击不全屏播放了,但是看着字幕太小看不清,想点开全屏看,发现不能横屏,还是很小看不清,才发现app被设置成了禁止横屏,这就尴尬了!经过一番查找还是被我找出在app禁止横屏的基础上,点击全屏横屏播放的解决办法了:
首先在manifest.json里设置
全部勾上,或者直接在manifest.json的plus节点下的distribute节点里添加:
"orientation": ["portrait-primary","portrait-secondary","landscape-primary","landscape-secondary"],/*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/
然后在首页
plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏
所以app还是禁止横屏的
然后iOS上监听video元素的webkitbeginfullscreen与webkitendfullscreen事件,在全屏开始和结束时,对屏幕方向做相应的调整:
// iOS平台的视频全屏旋转
var fullScreenOfIos = function(videoElem) {
// 监听的事件与Android平台有很大区别
videoElem.addEventListener('webkitbeginfullscreen', function() {
plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏
});
videoElem.addEventListener('webkitendfullscreen', function() {
plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏
});
};
Android上监听webkitfullscreenchange事件,并且读取全屏元素,对屏幕方向做出调整:
// Android平台的视频全屏旋转
var fullScreenOfAndroid = function() {
if(true) {
// 最新5+API的支持
var self = plus.webview.currentWebview();
self.setStyle({
videoFullscreen: 'landscape'
});
} else {
document.addEventListener('webkitfullscreenchange', function() {
var el = document.webkitFullscreenElement; //获取全屏元素
if(el) {
plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏
} else {
plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏
}
});
}
};
最后让我们来分别调用一下:
// 涉及到5+API的内容,均在plusready事件后调用;
document.addEventListener('plusready', function() {
var osName = plus.os.name;
if(osName === 'Android') {
fullScreenOfAndroid();
} else if(osName === 'iOS') {
var videoElem = document.getElementById('video');
fullScreenOfIos(videoElem);
}
});
大功告成!!!
收起阅读 »
关于setPullToRefresh 背景色
webview 的 setPullToRefresh 拉下来时的背景色怎么设置啊?
webview 的 setPullToRefresh 拉下来时的背景色怎么设置啊?

h5+免费教程、mui免费教程、各类app开发实战教程更新中,一起努力共同进步!!
hcoder 一直致力于奉献高质量的视频教程,官网上 mui、h5 等免费教程播放量已经达到5万。
教程汇总
知识点 : JavaScript 快速提高视频教程
实战: MUI、H5 APP 实战教程 - 仿《有道词典》
知识点 : HBuilder 8.0.1 APP开发 - 新功能全接触
知识点 : APP开发教程 - 启动动画
知识点 : APP开发实例教程 - 窗口切换
知识点 : 移动端图片剪裁、上传视频教程
知识点 : app开发教程-用户注册、登录
实战 : APP开发实战 - 新闻客户端
知识点 : HTML 5 开发教程
知识点 : mui 全套教程
hcoder 一直致力于奉献高质量的视频教程,官网上 mui、h5 等免费教程播放量已经达到5万。
教程汇总
知识点 : JavaScript 快速提高视频教程
实战: MUI、H5 APP 实战教程 - 仿《有道词典》
知识点 : HBuilder 8.0.1 APP开发 - 新功能全接触
知识点 : APP开发教程 - 启动动画
知识点 : APP开发实例教程 - 窗口切换
知识点 : 移动端图片剪裁、上传视频教程
知识点 : app开发教程-用户注册、登录
实战 : APP开发实战 - 新闻客户端
知识点 : HTML 5 开发教程
知识点 : mui 全套教程
免费教程地址
http://www.hcoder.net/course/index/cate/4

写给HBuilder的警示
HBuilder,是我用过最好用的一个工具,我也期盼与逐步这个工具成长。
但无意中我看到了APICloud及被法院判决抄袭违法事宜,惊叹中国知识产权违法成本太低了!
然后,我即被他的官网征服了!
这个流氓平台无疑对产品运维的很用心和细致,无论是产品介绍或是学习资料,都一目了然,
丰富且全面。记得学习HBuilder时,在其官网很难找到系统的学习资料,页面看上去繁杂和平庸。在网上搜索的视频,绝大多数还收费。
尽管我对HBuilder抱有敬畏,但我依然担心,有朝一日会被对手超越。至少,目前从网上搜索,该平台能搜索到时50万 条信息,而HBuilder才20万+ 。
在经济市场上,技术实力雄厚固然是根本,但不懂得市场运营也会惨败。例如,运作不成功的Huilder技术人才,也有可能被对手以高手挖墙角,并携带核心源码投入敌营。中国产权违法成本之低,根本不需要冒太大风险。
总之太多的血的教训,我不需要多说。
在选择Hbuilder或Apicloud之间,我仍在犹豫。因为,作为一名开发者,投入的是最宝贵的时间成本。
HBuilder,是我用过最好用的一个工具,我也期盼与逐步这个工具成长。
但无意中我看到了APICloud及被法院判决抄袭违法事宜,惊叹中国知识产权违法成本太低了!
然后,我即被他的官网征服了!
这个流氓平台无疑对产品运维的很用心和细致,无论是产品介绍或是学习资料,都一目了然,
丰富且全面。记得学习HBuilder时,在其官网很难找到系统的学习资料,页面看上去繁杂和平庸。在网上搜索的视频,绝大多数还收费。
尽管我对HBuilder抱有敬畏,但我依然担心,有朝一日会被对手超越。至少,目前从网上搜索,该平台能搜索到时50万 条信息,而HBuilder才20万+ 。
在经济市场上,技术实力雄厚固然是根本,但不懂得市场运营也会惨败。例如,运作不成功的Huilder技术人才,也有可能被对手以高手挖墙角,并携带核心源码投入敌营。中国产权违法成本之低,根本不需要冒太大风险。
总之太多的血的教训,我不需要多说。
在选择Hbuilder或Apicloud之间,我仍在犹豫。因为,作为一名开发者,投入的是最宝贵的时间成本。

MUI入门笔记
学习的是腾讯课程的教程h5+ App 开发实战教程 - 仿《有道词典》
一.准备工作
- 新建项目,选择mui作为模板
- 规划代码,建立基础文件作为模板来建立新文件copy.html
- 引css时引mui.css,而不是压缩版,方便做全局修改
二.常用代码记录
点击a标签打开新页面
<a id=“此处id要与html名字一致” onclick="openInfo(this.id)">
<script>
function openInfo(id) {
mui.openWindow({
url: id + '.html',
id: id + '.html',
});
}
</script>
二级页面标题栏,带返回键
<header class="mui-bar mui-bar-nav">
<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
<h1 class="mui-title" id="title">标题</h1>
</header>
学习的是腾讯课程的教程h5+ App 开发实战教程 - 仿《有道词典》
一.准备工作
- 新建项目,选择mui作为模板
- 规划代码,建立基础文件作为模板来建立新文件copy.html
- 引css时引mui.css,而不是压缩版,方便做全局修改
二.常用代码记录
点击a标签打开新页面
<a id=“此处id要与html名字一致” onclick="openInfo(this.id)">
<script>
function openInfo(id) {
mui.openWindow({
url: id + '.html',
id: id + '.html',
});
}
</script>
二级页面标题栏,带返回键
<header class="mui-bar mui-bar-nav">
<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
<h1 class="mui-title" id="title">标题</h1>
</header>
收起阅读 »

【解决方案】关于console.log在HBuilder控制台不输出日志的问题解决办法
解决办法分2种情况:
- 如果是使用夜神模拟器,可参考http://ask.dcloud.net.cn/article/1297这篇文章进行解决。
- 如果是使用手机进行调试:
2.1 重新开启USB调试模式,或者重启手机后重试;
2.2 确认你的手机日志级别,以360奇酷手机青春版为例, 在拨号界面输入
20121220# (华为为 *#*#2846579#*#\ )进入工程模式(其他手机型号进入工程模式输入的指令会不一样):
选择日志输出等级,进入日志等级控制界面:
确定Log print enable 为 Enable,如果不是,设置为enable
确定Java log level 为 LOGV,如果不是,设置为LOGV
设置完后,再刷新下页面,应该就有日志输入了。
解决办法分2种情况:
- 如果是使用夜神模拟器,可参考http://ask.dcloud.net.cn/article/1297这篇文章进行解决。
- 如果是使用手机进行调试:
2.1 重新开启USB调试模式,或者重启手机后重试;
2.2 确认你的手机日志级别,以360奇酷手机青春版为例, 在拨号界面输入
20121220# (华为为 *#*#2846579#*#\ )进入工程模式(其他手机型号进入工程模式输入的指令会不一样):
选择日志输出等级,进入日志等级控制界面:
确定Log print enable 为 Enable,如果不是,设置为enable
确定Java log level 为 LOGV,如果不是,设置为LOGV
设置完后,再刷新下页面,应该就有日志输入了。

浅谈hbuilder开发app后的优化 - (2)多webview?多div?选啥呢!
浅谈hbuilder开发app后的优化 - (1)加速启动,优化体验
前言:
回顾以下,上一次我们了解了如何加速启动,制作一个"秒开"的假象,本着循序渐进的原则,这一次我将讲述一下进入主页面(以下用main代替)之后,我们该如何优化,本次内容比较枯燥,涉及比较多的理论部分,深入理解之后有利于main的优化,而main的优化往往是留住用户的重点,因为用户进入app后的第一次操作体验往往影响着用户的留存率。
(2)多webview?多div?选啥呢!
首先我们看看dcloud官方的建议:
使用View绘制标题栏,再用一个子webview作为main显示,需要底部tab再用一个webview作为底部栏监听操作事件即可。
从这一句话听起来似乎很正常,没有任何问题,是的,在一个简单的main来说,这样没任何问题,但是如果应用在多webview就出现问题了。
我们思考下,一般app都是<标题><内容区><底部>,这意味着如果采用dcloud官方建议的这种办法来说,在启动时候就创建了两个webview实例,而普遍的app均有3~4个选项卡,这意味着启动app的时候就创建了至少4~5个webview实例,对于性能中档以上的手机并没有压力,但是实际上依然会碰到很多手机性能低的用户,这时候我们就要好好考虑,多webview还是多div呢?
多webview?会遇到那些"坑"呢?
//> 1:OOM (Out Of Memory)
在webview中显示的图片过多,做webview切换动画的时候往往会遇到卡顿,动画不流畅,甚至切换后台重新切换回来后app就黑屏,然后呢?... 这不就挂了么?
设想一个场景,你开着app,点来点去,看到感兴趣的,不错,准备点收藏,结果有人发条微信,你点开一看,然后返回,app奔溃,oh shit!
这是一个真实的实例,我曾经接到一个app,做一个类似应用商店的产品,如果用多webview可以比较好的优化列表滚动流畅度,但是很多子页,再简单的使用了多webview之后,oom!结果app奔溃了,那么oom的话,到底是怎么引起的呢?
首先,图片加载过多,大图过多,页面dom树过度复杂均有可能,第二就是js部分,过多for,if嵌套,自调用,变量使用后没有释放(即便JS本身有着gc机制,但是js语法是十分灵活的,我们不能全部都丢给解释器去处理判断,尽量自己处理下,我相信win下使用C开发过应用程序的都有所体验吧)
【解决方法】OOM,自己多注意,这是码代码的时候就需要思考的。
//>2:动画卡顿,画面闪动
在没有OOM的情况下也会出现动画卡顿问题,一般情况下为页面太复杂,导致进行动画的时候不流畅,或者是一个页面隐藏后显示,页面会闪一下,甚至白屏。
【解决方法】动画卡顿可以采用View预先drawBitmap,然后先飘图再显示,页面显示不全大多数是因为硬件加速,一个隐藏部分忽然显示导致的,一般情况下可以采用这样:当前页面fade-out 目标页面zoom-fade-in,这部分不需要使用View绘制也可以达到流畅。因为默认情况下隐藏后我们的渲染引擎会暂停渲染页面,这就可以释放部分内存用于显示页面。
//>3:窗体错误
这个很奇特的,一个多webview的页面,分为父子webview,当其中一个子webview打开的子页面请求全屏后,重新返回会出现子webview错误,检测后发现webview居然已经不是main的子webview了。
【解决方法】无力相助
综合上面所说多webview大多情况下都是卡,占用内存。所以有些人就说那就全部用多div呗
多div?会遇到那些"坑"呢?
//> 1:进入main时卡顿
多div因为均存在一个子页面,webview开始加载的时候就会"同步"加载所有div,因此一个webview如果出现多div且各div的dom树均复杂的情况下,会出现进入main的时候一开始比较卡顿,之后才能正常操作
【解决方法】使用vue进行动态页面处理,vue本身会自带虚拟DOM,不论是复用div,页面动态增加删除div,vue的表示均比较良好,加一个plus.nativeUI.showWaiting 雪花滚动然用户觉得还在加载(要是内容实在很多就不要滚动了,滚久了你的app也可以滚了),等待vue渲染完成事件响应之后再关闭雪花滚动
//>2.安卓低版本div无法滚动,IOS透传
众所周知安卓低版本无法进行div滚动,而IOS的div会出现透传问题。
【解决方法】改用mui本身带来的区域滚动组件(iscroll),结合Vue的话需要在渲染完成后重新初始化iscroll
//>3 安卓div区域滚动不流畅,太卡
div滚动本身就不如原生滚动流畅,这个无话可说
【解决方法】对应webview启动硬件加速,并且渲染模式改为allways(总是渲染,会消耗比较多的内存),尽量减少页面的图片量,以及图片大小,因为硬件层在同步绘制图片时候也会消耗比较多的内存。
//>4动画不流畅
没什么好说,切换动画不流畅
【解决方法】同上
综合上面所说,多div大多情况下就是不流畅,不流畅,不流畅,重要的事情说三遍。
那么都是那么扯淡,我们应该如何选择呢?我的考虑是两者结合!
多div不流畅但是占用内存少,多webview卡,但是滚动方面流畅,我们可以把两者结合起来,做一个占用内存少,不卡的app。
首先: main采用多div是种明智的选择,一般app首页都会加上轮播组件(slider),那么多webview切换的时候其实会因为slider的问题导致卡顿,但是div切换不会,因此可以采用多div切换作为main,这样切换过程不会卡顿(注意控制好dom树结构)
其次: 部分少点击的页面采用webview方式打开,因为少点击所以意味着平时极少出现其来占用内存(类似设置,签到中心,积分中心,反馈),打开之后返回就关闭该webview实例,释放内存。
对于常用的页面,根据逻辑不同取舍,对于类似淘宝,京东商品详情页,朋友圈这类,应该采用webview方式打开,因为其加载图片过多,点击频率不高,可以达到流畅,并且占用内存比较少,用户执行返回之后清除页面图片以及数据,释放部分内存,且有利于下次重新载入此页面。
对于类似我的,消息列表,排行榜这类,应该采用div显示,因为其加载内容少,点击频率不高但是数据需要常驻内存,则直接采用div形式即可(什么? div不是没法滚动么,消息列表呢? 这个直接用ul+li就可以了,没有任何问题,在多个app上面使用过了)
上面这个就是大概的app一个大的考虑,至于细化到部分优化的,可以参考以下几点:
webview切换卡顿:
用view绘制目标webview,首先飘图,然后先隐藏当前webview,然后隐藏view,再显示目标webview,采用fade-in效果显示,这样有一个过度效果,用户体验比较好
webview动画pop-in卡顿
根据dcloud官方说明,pop-in和slide-in-right均有进行一个加速操作,但是pop-in是采用双窗口同时执行动画,而slide-in-right是单窗口,因此pop-in卡得时候,不妨尝试下slide-in-right
div切换卡顿
对于div切换卡顿其实本来就是这样,但是一般情况下我是采用css中的opacity控制显示与否,并且transtion控制动画效果,通过一个渐显渐隐的过程尽量减少用户的违和感(动画时间需要控制好)
沉浸式任务栏切换webview的时候因为窗口调整高度导致闪动
这个是我遇到一个网友问我的,对此我简单分析了下,传统的webview切换是这样的:
var wm = plus.webview.create("a.html","a");
//监听wm loaded
wm.show();
这样一个过程就意味是等wm加载完毕后就显示,但是这不意味着窗口高度调整好了!我们稍微修改下就可以完成这个处理
var wm = plus.webview.create("a.html","a");
plus.nativeUI.showWaiting();
然后在a.html中这样处理
//监听当前wv loaded事件
然后function里面写
//>调整页面搞定代码
plus.webview.show("a","fade-in",150,function(){
plus.navtiveUI.closeWaiting();
})
其实iframe,div,webview均能作为tab 主要是切换里面一些细节做好处理就行了。
我相信很多人看起来一头雾水,然而懂的人自然明白如何操作,这仅仅是本人优化APP的一些方法,做出来分享而已,希望能给大家带来帮助。
浅谈hbuilder开发app后的优化 - (1)加速启动,优化体验
前言:
回顾以下,上一次我们了解了如何加速启动,制作一个"秒开"的假象,本着循序渐进的原则,这一次我将讲述一下进入主页面(以下用main代替)之后,我们该如何优化,本次内容比较枯燥,涉及比较多的理论部分,深入理解之后有利于main的优化,而main的优化往往是留住用户的重点,因为用户进入app后的第一次操作体验往往影响着用户的留存率。
(2)多webview?多div?选啥呢!
首先我们看看dcloud官方的建议:
使用View绘制标题栏,再用一个子webview作为main显示,需要底部tab再用一个webview作为底部栏监听操作事件即可。
从这一句话听起来似乎很正常,没有任何问题,是的,在一个简单的main来说,这样没任何问题,但是如果应用在多webview就出现问题了。
我们思考下,一般app都是<标题><内容区><底部>,这意味着如果采用dcloud官方建议的这种办法来说,在启动时候就创建了两个webview实例,而普遍的app均有3~4个选项卡,这意味着启动app的时候就创建了至少4~5个webview实例,对于性能中档以上的手机并没有压力,但是实际上依然会碰到很多手机性能低的用户,这时候我们就要好好考虑,多webview还是多div呢?
多webview?会遇到那些"坑"呢?
//> 1:OOM (Out Of Memory)
在webview中显示的图片过多,做webview切换动画的时候往往会遇到卡顿,动画不流畅,甚至切换后台重新切换回来后app就黑屏,然后呢?... 这不就挂了么?
设想一个场景,你开着app,点来点去,看到感兴趣的,不错,准备点收藏,结果有人发条微信,你点开一看,然后返回,app奔溃,oh shit!
这是一个真实的实例,我曾经接到一个app,做一个类似应用商店的产品,如果用多webview可以比较好的优化列表滚动流畅度,但是很多子页,再简单的使用了多webview之后,oom!结果app奔溃了,那么oom的话,到底是怎么引起的呢?
首先,图片加载过多,大图过多,页面dom树过度复杂均有可能,第二就是js部分,过多for,if嵌套,自调用,变量使用后没有释放(即便JS本身有着gc机制,但是js语法是十分灵活的,我们不能全部都丢给解释器去处理判断,尽量自己处理下,我相信win下使用C开发过应用程序的都有所体验吧)
【解决方法】OOM,自己多注意,这是码代码的时候就需要思考的。
//>2:动画卡顿,画面闪动
在没有OOM的情况下也会出现动画卡顿问题,一般情况下为页面太复杂,导致进行动画的时候不流畅,或者是一个页面隐藏后显示,页面会闪一下,甚至白屏。
【解决方法】动画卡顿可以采用View预先drawBitmap,然后先飘图再显示,页面显示不全大多数是因为硬件加速,一个隐藏部分忽然显示导致的,一般情况下可以采用这样:当前页面fade-out 目标页面zoom-fade-in,这部分不需要使用View绘制也可以达到流畅。因为默认情况下隐藏后我们的渲染引擎会暂停渲染页面,这就可以释放部分内存用于显示页面。
//>3:窗体错误
这个很奇特的,一个多webview的页面,分为父子webview,当其中一个子webview打开的子页面请求全屏后,重新返回会出现子webview错误,检测后发现webview居然已经不是main的子webview了。
【解决方法】无力相助
综合上面所说多webview大多情况下都是卡,占用内存。所以有些人就说那就全部用多div呗
多div?会遇到那些"坑"呢?
//> 1:进入main时卡顿
多div因为均存在一个子页面,webview开始加载的时候就会"同步"加载所有div,因此一个webview如果出现多div且各div的dom树均复杂的情况下,会出现进入main的时候一开始比较卡顿,之后才能正常操作
【解决方法】使用vue进行动态页面处理,vue本身会自带虚拟DOM,不论是复用div,页面动态增加删除div,vue的表示均比较良好,加一个plus.nativeUI.showWaiting 雪花滚动然用户觉得还在加载(要是内容实在很多就不要滚动了,滚久了你的app也可以滚了),等待vue渲染完成事件响应之后再关闭雪花滚动
//>2.安卓低版本div无法滚动,IOS透传
众所周知安卓低版本无法进行div滚动,而IOS的div会出现透传问题。
【解决方法】改用mui本身带来的区域滚动组件(iscroll),结合Vue的话需要在渲染完成后重新初始化iscroll
//>3 安卓div区域滚动不流畅,太卡
div滚动本身就不如原生滚动流畅,这个无话可说
【解决方法】对应webview启动硬件加速,并且渲染模式改为allways(总是渲染,会消耗比较多的内存),尽量减少页面的图片量,以及图片大小,因为硬件层在同步绘制图片时候也会消耗比较多的内存。
//>4动画不流畅
没什么好说,切换动画不流畅
【解决方法】同上
综合上面所说,多div大多情况下就是不流畅,不流畅,不流畅,重要的事情说三遍。
那么都是那么扯淡,我们应该如何选择呢?我的考虑是两者结合!
多div不流畅但是占用内存少,多webview卡,但是滚动方面流畅,我们可以把两者结合起来,做一个占用内存少,不卡的app。
首先: main采用多div是种明智的选择,一般app首页都会加上轮播组件(slider),那么多webview切换的时候其实会因为slider的问题导致卡顿,但是div切换不会,因此可以采用多div切换作为main,这样切换过程不会卡顿(注意控制好dom树结构)
其次: 部分少点击的页面采用webview方式打开,因为少点击所以意味着平时极少出现其来占用内存(类似设置,签到中心,积分中心,反馈),打开之后返回就关闭该webview实例,释放内存。
对于常用的页面,根据逻辑不同取舍,对于类似淘宝,京东商品详情页,朋友圈这类,应该采用webview方式打开,因为其加载图片过多,点击频率不高,可以达到流畅,并且占用内存比较少,用户执行返回之后清除页面图片以及数据,释放部分内存,且有利于下次重新载入此页面。
对于类似我的,消息列表,排行榜这类,应该采用div显示,因为其加载内容少,点击频率不高但是数据需要常驻内存,则直接采用div形式即可(什么? div不是没法滚动么,消息列表呢? 这个直接用ul+li就可以了,没有任何问题,在多个app上面使用过了)
上面这个就是大概的app一个大的考虑,至于细化到部分优化的,可以参考以下几点:
webview切换卡顿:
用view绘制目标webview,首先飘图,然后先隐藏当前webview,然后隐藏view,再显示目标webview,采用fade-in效果显示,这样有一个过度效果,用户体验比较好
webview动画pop-in卡顿
根据dcloud官方说明,pop-in和slide-in-right均有进行一个加速操作,但是pop-in是采用双窗口同时执行动画,而slide-in-right是单窗口,因此pop-in卡得时候,不妨尝试下slide-in-right
div切换卡顿
对于div切换卡顿其实本来就是这样,但是一般情况下我是采用css中的opacity控制显示与否,并且transtion控制动画效果,通过一个渐显渐隐的过程尽量减少用户的违和感(动画时间需要控制好)
沉浸式任务栏切换webview的时候因为窗口调整高度导致闪动
这个是我遇到一个网友问我的,对此我简单分析了下,传统的webview切换是这样的:
var wm = plus.webview.create("a.html","a");
//监听wm loaded
wm.show();
这样一个过程就意味是等wm加载完毕后就显示,但是这不意味着窗口高度调整好了!我们稍微修改下就可以完成这个处理
var wm = plus.webview.create("a.html","a");
plus.nativeUI.showWaiting();
然后在a.html中这样处理
//监听当前wv loaded事件
然后function里面写
//>调整页面搞定代码
plus.webview.show("a","fade-in",150,function(){
plus.navtiveUI.closeWaiting();
})
其实iframe,div,webview均能作为tab 主要是切换里面一些细节做好处理就行了。
我相信很多人看起来一头雾水,然而懂的人自然明白如何操作,这仅仅是本人优化APP的一些方法,做出来分享而已,希望能给大家带来帮助。

APP应用安全问题个人理解,大神别喷我。
javascript
初次使用Hbuilder时候,简直惊呆了,开发速度简直像开火箭般,原生代码android+IOS需要一个月的工作量,在Hbuilder上一周不到就解决了,简直不敢相信。
东西是做出来了,可是问题来了,ipa或apk安装文件解压,我嚓,,啥代码都能看到,这是在玩我么。。。
在网上查了各种资料,加密,混淆,基本用处不大,于是我在想,我请求的参数,请求的地址都能隐藏不就好了么,,
但是还有一个问题,随便使用一个HTTP抓包工具都能看到所有的东西,又郁闷了。。。。
最后一招,在所有的请求参数弄一个加密,从客户端到服务器都是密文,服务器再解密不就OK了么,想到这里就没发现又漏洞了。
请求地址,参数加密都放在原生代码完成,js调用方法获取,原生代码中可存相应的秘钥机制与服务器端对应校验,服务端也需要解密参数。
前端页面js可做代码混淆,Compress就行,其实也没多大必要,离线打包做好代码混淆,获取用第三方的一些加密工具,IOS的用原生代码还是比较安全的,常规破解应该难度大。
以上纯粹个人的搞法,目前我这样用的,目前来说没啥问题,安全性算是加固了一些,希望各位大神多多指点!
javascript
初次使用Hbuilder时候,简直惊呆了,开发速度简直像开火箭般,原生代码android+IOS需要一个月的工作量,在Hbuilder上一周不到就解决了,简直不敢相信。
东西是做出来了,可是问题来了,ipa或apk安装文件解压,我嚓,,啥代码都能看到,这是在玩我么。。。
在网上查了各种资料,加密,混淆,基本用处不大,于是我在想,我请求的参数,请求的地址都能隐藏不就好了么,,
但是还有一个问题,随便使用一个HTTP抓包工具都能看到所有的东西,又郁闷了。。。。
最后一招,在所有的请求参数弄一个加密,从客户端到服务器都是密文,服务器再解密不就OK了么,想到这里就没发现又漏洞了。
请求地址,参数加密都放在原生代码完成,js调用方法获取,原生代码中可存相应的秘钥机制与服务器端对应校验,服务端也需要解密参数。
前端页面js可做代码混淆,Compress就行,其实也没多大必要,离线打包做好代码混淆,获取用第三方的一些加密工具,IOS的用原生代码还是比较安全的,常规破解应该难度大。
以上纯粹个人的搞法,目前我这样用的,目前来说没啥问题,安全性算是加固了一些,希望各位大神多多指点!
收起阅读 »
scroll 横向滚动图片一半解决办法
<div class="mui-scroll-wrapper mui-slider-indicator mui-segmented-control mui-segmented-control-inverted">
<div class="mui-scroll">
<img src="xxxxx"/>
</div>
</div>
横向图片只显示一半,须将mui-segmented-control-inverted该div设置一定的高度,以及mui-scroll top设置0即可
<div class="mui-scroll-wrapper mui-slider-indicator mui-segmented-control mui-segmented-control-inverted">
<div class="mui-scroll">
<img src="xxxxx"/>
</div>
</div>
横向图片只显示一半,须将mui-segmented-control-inverted该div设置一定的高度,以及mui-scroll top设置0即可
收起阅读 »
js调用原生代码Activity返回数据
/
客户反馈华为的手机扫描二维码出现卡死,不能打开以及奔溃等,以前原生APP的扫描没问题,于是拷贝代码过来直接使用。
/
if(plus.os.name == "Android")
{
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var PrintTagActivity = plus.android.importClass("com.demo.CaptureActivity");//自己写的二维码扫描页面
var intent = new Intent();
intent.setClassName(main, 'com.demo.CaptureActivity');
main.startActivityForResult(intent, 100);
main.onActivityResult = function(requestCode, resultCode, data) {
if('100' == requestCode) {
plus.android.importClass(data);
var bundle=data.getExtras();
plus.android.importClass(bundle);
var ewm_no = bundle.getString("Code");///获取二维码信息
}
};
}else
{
mui.openWindow({
url: 'scanBarcode.html',
show:{
autoShow:true
}
});
}
/
客户反馈华为的手机扫描二维码出现卡死,不能打开以及奔溃等,以前原生APP的扫描没问题,于是拷贝代码过来直接使用。
/
if(plus.os.name == "Android")
{
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var PrintTagActivity = plus.android.importClass("com.demo.CaptureActivity");//自己写的二维码扫描页面
var intent = new Intent();
intent.setClassName(main, 'com.demo.CaptureActivity');
main.startActivityForResult(intent, 100);
main.onActivityResult = function(requestCode, resultCode, data) {
if('100' == requestCode) {
plus.android.importClass(data);
var bundle=data.getExtras();
plus.android.importClass(bundle);
var ewm_no = bundle.getString("Code");///获取二维码信息
}
};
}else
{
mui.openWindow({
url: 'scanBarcode.html',
show:{
autoShow:true
}
});
}
收起阅读 »