
android native判断是否有定位权限
/**
* 判断是否有定位权限 android在23之后有动态获取权限方法23之下需要抓异常去判断是否开启
*/
Utils.prototype.getLocationPermission = function () {
var main = plus.android.runtimeMainActivity();
var Build = plus.android.importClass("android.os.Build");
var Manifest = plus.android.importClass("android.Manifest");
var PackageManager = plus.android.importClass("android.content.pm.PackageManager");
//上面三个导入android的类
var Permission = Manifest.permission;
var VERSION = Build.VERSION;
var VERSION_CODES = Build.VERSION_CODES;
//Permission.ACCESS_FINE_LOCATION对应定位的权限。
var isCheck = Permission.ACCESS_FINE_LOCATION;
var pkName = main.getPackageName();
var packageManager = main.getPackageManager();
console.log(isCheck);
var GRANTED = '';
//android6.0以上可以动态判断是否开启权限 6.0对应的是android 23版本 VERSION_CODES.M
if (VERSION.SDK_INT >= VERSION_CODES.M) {
GRANTED = plus.android.invoke(main, 'checkSelfPermission', isCheck);
alert(GRANTED);
if (GRANTED == PackageManager.PERMISSION_DENIED) {
console.log('没开启定位权限');
} else {
console.log('启定位权限');
}
} else {
GRANTED = plus.android.invoke(packageManager, 'checkPermission', isCheck, pkName);
alert(GRANTED);
if (GRANTED == PackageManager.PERMISSION_DENIED) {
console.log('没开启定位权限');
} else {
console.log('启定位权限');
}
}
}
/**
* 判断是否有定位权限 android在23之后有动态获取权限方法23之下需要抓异常去判断是否开启
*/
Utils.prototype.getLocationPermission = function () {
var main = plus.android.runtimeMainActivity();
var Build = plus.android.importClass("android.os.Build");
var Manifest = plus.android.importClass("android.Manifest");
var PackageManager = plus.android.importClass("android.content.pm.PackageManager");
//上面三个导入android的类
var Permission = Manifest.permission;
var VERSION = Build.VERSION;
var VERSION_CODES = Build.VERSION_CODES;
//Permission.ACCESS_FINE_LOCATION对应定位的权限。
var isCheck = Permission.ACCESS_FINE_LOCATION;
var pkName = main.getPackageName();
var packageManager = main.getPackageManager();
console.log(isCheck);
var GRANTED = '';
//android6.0以上可以动态判断是否开启权限 6.0对应的是android 23版本 VERSION_CODES.M
if (VERSION.SDK_INT >= VERSION_CODES.M) {
GRANTED = plus.android.invoke(main, 'checkSelfPermission', isCheck);
alert(GRANTED);
if (GRANTED == PackageManager.PERMISSION_DENIED) {
console.log('没开启定位权限');
} else {
console.log('启定位权限');
}
} else {
GRANTED = plus.android.invoke(packageManager, 'checkPermission', isCheck, pkName);
alert(GRANTED);
if (GRANTED == PackageManager.PERMISSION_DENIED) {
console.log('没开启定位权限');
} else {
console.log('启定位权限');
}
}
}
收起阅读 »

怎么利用PHP读取Excel文件信息及内容
PHPExcel是什么?PHPExcel 就是一个用来操作Office Excel 文档的PHP类库。在编程技术开发中,我们经常要从程序中读取Excel文件内容,不过很多初学者都不太会,那么下面来详细为大家分析解答一下吧。比如说一个普通的个人信息表,我们利用PHPExcel类库将Excel表格内的信息内容读取出来,完整代码如下:
<?php
$fileName = "1.xls";
if (!file_exists($fileName)) {
return "文件不存在!";
}
// 引入PHPExcel
require_once "./PHPExcel/IOFactory.php";
// 载入当前文件
$phpExcel = PHPExcel_IOFactory::load($fileName);
// 设置为默认表
$phpExcel->setActiveSheetIndex(0);
// 获取表格数量
$sheetCount = $phpExcel->getSheetCount();
// 获取行数
$row = $phpExcel->getActiveSheet()->getHighestRow();
// 获取列数
$column = $phpExcel->getActiveSheet()->getHighestColumn();
echo "表格数目为:$sheetCount" . "表格的行数:$row" . "列数:$column";
$data = [];
// 行数循环
for ($i = 1; $i <= $row; $i++) {
// 列数循环
for ($c = 'A'; $c <= $column; $c++) {
$data[] = $phpExcel->getActiveSheet()->getCell($c . $i)->getValue();
}
echo "<pre>";
print_r($data);
}
在上述代码中,先if判断Excel表格是否存在,再用require_once引入PHPExcel类库中IOFactory.php这个类,然后使用PHPExcel类库的一个方法载入Excel文件,这里将载入的Excel文件赋值于$phpExcel变量。
然后再将$phpExcel变量通过分别指定相应的方法来获取Excel表格的数目、行数、列数以及通过setActiveSheetIndex(0)方法设置这个表格为默认(0表示默认)。
此时输出表格的数目、行数、列数的结果就已经显示出来了,我们就可以发现表格的信息已经被正确的获取到了。如果大家在尝试的过程中出现错误或者还有不理解的地方,可以留言咨询。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处!
PHPExcel是什么?PHPExcel 就是一个用来操作Office Excel 文档的PHP类库。在编程技术开发中,我们经常要从程序中读取Excel文件内容,不过很多初学者都不太会,那么下面来详细为大家分析解答一下吧。比如说一个普通的个人信息表,我们利用PHPExcel类库将Excel表格内的信息内容读取出来,完整代码如下:
<?php
$fileName = "1.xls";
if (!file_exists($fileName)) {
return "文件不存在!";
}
// 引入PHPExcel
require_once "./PHPExcel/IOFactory.php";
// 载入当前文件
$phpExcel = PHPExcel_IOFactory::load($fileName);
// 设置为默认表
$phpExcel->setActiveSheetIndex(0);
// 获取表格数量
$sheetCount = $phpExcel->getSheetCount();
// 获取行数
$row = $phpExcel->getActiveSheet()->getHighestRow();
// 获取列数
$column = $phpExcel->getActiveSheet()->getHighestColumn();
echo "表格数目为:$sheetCount" . "表格的行数:$row" . "列数:$column";
$data = [];
// 行数循环
for ($i = 1; $i <= $row; $i++) {
// 列数循环
for ($c = 'A'; $c <= $column; $c++) {
$data[] = $phpExcel->getActiveSheet()->getCell($c . $i)->getValue();
}
echo "<pre>";
print_r($data);
}
在上述代码中,先if判断Excel表格是否存在,再用require_once引入PHPExcel类库中IOFactory.php这个类,然后使用PHPExcel类库的一个方法载入Excel文件,这里将载入的Excel文件赋值于$phpExcel变量。
然后再将$phpExcel变量通过分别指定相应的方法来获取Excel表格的数目、行数、列数以及通过setActiveSheetIndex(0)方法设置这个表格为默认(0表示默认)。
此时输出表格的数目、行数、列数的结果就已经显示出来了,我们就可以发现表格的信息已经被正确的获取到了。如果大家在尝试的过程中出现错误或者还有不理解的地方,可以留言咨询。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处!
收起阅读 »
诚邀优秀前端加盟,一起打造uni-app框架
微信小程序火了
支付宝、百度、今日头条等厂家随之发布各自的小程序规范
加上之前的iOS、Android、H5平台
前端工程师即将淹没在多平台的适配工作中
拿什么拯救前端工程师?
那就是uni-app!
uni-app被定义为终极跨平台开发框架
真正实现“一套代码、多端发行”
想改变世界的你,还犹豫什么?
赶快投递简历,加入我们,一起完善uni-app!
任职资格:
- 强烈的创业激情,优秀的团队协同能力
- 3年以上HTML5/CSS3/JavaScript开发经验
- 精通Vue.js框架,在实际项目中,有过Vue.js开发经验
- 熟悉webpack/npm等辅助工具的使用
- 有小程序开发经验者优先
- 有uni-app开发经验者优先
坐标:北京海淀区皂君庙京果商厦
薪资:看聊的情况,对优秀的人绝不吝啬
其它福利:
- 公司附近住房,每月2k住房补贴
- 每日餐费实报实销,不限次数
有兴趣的同学,马上投递简历到 cuihongbao@dcloud.io
另,iOS、Android、QT工程师也在扩招中。
欢迎各位投简历或邀请朋友前来尝试。
微信小程序火了
支付宝、百度、今日头条等厂家随之发布各自的小程序规范
加上之前的iOS、Android、H5平台
前端工程师即将淹没在多平台的适配工作中
拿什么拯救前端工程师?
那就是uni-app!
uni-app被定义为终极跨平台开发框架
真正实现“一套代码、多端发行”
想改变世界的你,还犹豫什么?
赶快投递简历,加入我们,一起完善uni-app!
任职资格:
- 强烈的创业激情,优秀的团队协同能力
- 3年以上HTML5/CSS3/JavaScript开发经验
- 精通Vue.js框架,在实际项目中,有过Vue.js开发经验
- 熟悉webpack/npm等辅助工具的使用
- 有小程序开发经验者优先
- 有uni-app开发经验者优先
坐标:北京海淀区皂君庙京果商厦
薪资:看聊的情况,对优秀的人绝不吝啬
其它福利:
- 公司附近住房,每月2k住房补贴
- 每日餐费实报实销,不限次数
有兴趣的同学,马上投递简历到 cuihongbao@dcloud.io
另,iOS、Android、QT工程师也在扩招中。
欢迎各位投简历或邀请朋友前来尝试。

七牛云上传视频如何有效做到节省空间
在上传视频的时候,我们通常会保存到第三方【七牛云】平台。不过大多数程序员在系统后台上传视频后,一般都是保存到了本地,如果视频非常多或者视频容量特别大的情况下,那么我们的服务器迟早有一天会满,为了节省空间,下面教大家再上传视频时,如何以有效的节省服务器空间,一般情况下会把这些文件存到第三方,也就是需要我们下载qiniusdk,把qiniusdk放如Vendor目录下。
这里我们以课程视频为例子,实现的hmtl源代码如下:
<tr>
<td class="text"><span class="bi_tian"> </span>课程视频:</td>
<td class="input">
<input type="file" placeholder="上传视频" style="margin-left:10px;" name="file">
</td>
</tr>
<tr>
<td class="text"></td>
<td class="submit">
<input type="submit" value="下一步" class="layui-btn" onclick="return Smit($(this),'myform')" /></td>
</tr>
- php代码
public function doaddvideo(){
$model=M("class_video");
$id=I("id");
$data['class_id']=$id;
$data['title']=I("title");
$data['minute']=I("minute");
$data['jie']=I("jie");
if(!empty($_FILES['file']['name'])){
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 实例化上传类
$upload->maxSize = 9999999;// 设置附件上传大小
$upload->allowExts = array("vob","ifo","mpg","mpeg","dat","mp4","3gp","mov","rm","ram","rmvb","wmv","asf","avi","asx");// 设置附件上传类型 如果是MP3的话改为mp3 就ok
$upload->savePath = './Public/Uploads/video/';// 设置附件上传目录(先把文件上传到本地服务器上)
//$upload->saveName = I('uid').'_'.time();// 设置附件上传目录
if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
require_once'./ThinkPHP/Extend/Vendor/qiniusdk/autoload.php';
$accessKey = '';
$secretKey = '';
$bucket = ''; //这个是你上传的空间
$savepath = "";//这是你七牛的路径
$auth = new Auth($accessKey, $secretKey);
$mediaid = time().uniqid();
$savekey = \Qiniu\base64_urlSafeEncode('caifen:'.$mediaid.'.mp4');
$fops = $fops.'|saveas/'.$savekey;
$policy = array(
'persistentOps' => $fops,
);
$uptoken = $auth->uploadToken($bucket, null, 3600, $policy);
$filePath = './Public/Uploads/video/'.$info[0]['savename'];
$key = $mediaid.'.mp4';
$uploadMgr = new UploadManager();
list($ret, $err) = $uploadMgr->putFile($uptoken, $key, $filePath);
if ($err !== null) {
$dataname["info"]="error";
} else {
$savename=$ret['key'];
$file = $savepath.$savename;
$dataname["info"]=$file;
}
unlink($filePath);//上传成功后删除本地服务器上的文件
// echo $file;exit;
$data['video']=$file;
if($model->add($data)){
success("成功",U("Class/goodslist"));
}else{
error("失败");
}
}else{
error("请上传视频");exit;
}
}
好了,到这里就分享完成了,那么现在大家都可以去试一下了,如果还是存在不理解的地方,可以留言咨询我们,或者有其他不同的解决方法,也可以留言分享,我们共同学习进步。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。
在上传视频的时候,我们通常会保存到第三方【七牛云】平台。不过大多数程序员在系统后台上传视频后,一般都是保存到了本地,如果视频非常多或者视频容量特别大的情况下,那么我们的服务器迟早有一天会满,为了节省空间,下面教大家再上传视频时,如何以有效的节省服务器空间,一般情况下会把这些文件存到第三方,也就是需要我们下载qiniusdk,把qiniusdk放如Vendor目录下。
这里我们以课程视频为例子,实现的hmtl源代码如下:
<tr>
<td class="text"><span class="bi_tian"> </span>课程视频:</td>
<td class="input">
<input type="file" placeholder="上传视频" style="margin-left:10px;" name="file">
</td>
</tr>
<tr>
<td class="text"></td>
<td class="submit">
<input type="submit" value="下一步" class="layui-btn" onclick="return Smit($(this),'myform')" /></td>
</tr>
- php代码
public function doaddvideo(){
$model=M("class_video");
$id=I("id");
$data['class_id']=$id;
$data['title']=I("title");
$data['minute']=I("minute");
$data['jie']=I("jie");
if(!empty($_FILES['file']['name'])){
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 实例化上传类
$upload->maxSize = 9999999;// 设置附件上传大小
$upload->allowExts = array("vob","ifo","mpg","mpeg","dat","mp4","3gp","mov","rm","ram","rmvb","wmv","asf","avi","asx");// 设置附件上传类型 如果是MP3的话改为mp3 就ok
$upload->savePath = './Public/Uploads/video/';// 设置附件上传目录(先把文件上传到本地服务器上)
//$upload->saveName = I('uid').'_'.time();// 设置附件上传目录
if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
require_once'./ThinkPHP/Extend/Vendor/qiniusdk/autoload.php';
$accessKey = '';
$secretKey = '';
$bucket = ''; //这个是你上传的空间
$savepath = "";//这是你七牛的路径
$auth = new Auth($accessKey, $secretKey);
$mediaid = time().uniqid();
$savekey = \Qiniu\base64_urlSafeEncode('caifen:'.$mediaid.'.mp4');
$fops = $fops.'|saveas/'.$savekey;
$policy = array(
'persistentOps' => $fops,
);
$uptoken = $auth->uploadToken($bucket, null, 3600, $policy);
$filePath = './Public/Uploads/video/'.$info[0]['savename'];
$key = $mediaid.'.mp4';
$uploadMgr = new UploadManager();
list($ret, $err) = $uploadMgr->putFile($uptoken, $key, $filePath);
if ($err !== null) {
$dataname["info"]="error";
} else {
$savename=$ret['key'];
$file = $savepath.$savename;
$dataname["info"]=$file;
}
unlink($filePath);//上传成功后删除本地服务器上的文件
// echo $file;exit;
$data['video']=$file;
if($model->add($data)){
success("成功",U("Class/goodslist"));
}else{
error("失败");
}
}else{
error("请上传视频");exit;
}
}
好了,到这里就分享完成了,那么现在大家都可以去试一下了,如果还是存在不理解的地方,可以留言咨询我们,或者有其他不同的解决方法,也可以留言分享,我们共同学习进步。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。
收起阅读 »
uni APP自动更新并安装
data:function(){
return{
version:1
}
},
onLoad: function () {
uni.getSystemInfo({
success:(res) => {
console.log(res.platform);
//检测当前平台,如果是安卓则启动安卓更新
if(res.platform=="android"){
this.AndroidCheckUpdate();
}
}
})
},
methods: {
AndroidCheckUpdate:function(){
var _this=this;
uni.request({
url: 'http://xxxx.com/version.txt',
method: 'GET',
data: {},
success: res => {
if(res.data>this.version){
if(plus.networkinfo.getCurrentType()!=3){
uni.showToast({
title: '有新的版本发布,检测到您目前非Wifi连接,为节约您的流量,程序已停止自动更新,将在您连接WIFI之后重新检测更新。',
mask: false,
duration: 5000,
icon:"none"
});
return;
}
uni.showToast({
title: '有新的版本发布,检测到您目前为Wifi连接,程序已启动自动更新。新版本下载完成后将自动弹出安装程序。',
mask: false,
duration: 5000,
icon:"none"
});
var dtask = plus.downloader.createDownload( "http://xxxx.com/app.apk", {}, function ( d, status ) {
// 下载完成
if ( status == 200 ) {
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename),{},{},function(error){
uni.showToast({
title: '安装失败',
mask: false,
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败',
mask: false,
duration: 1500
});
}
});
dtask.start();
}
},
fail: () => {},
complete: () => {}
});
},
}
data:function(){
return{
version:1
}
},
onLoad: function () {
uni.getSystemInfo({
success:(res) => {
console.log(res.platform);
//检测当前平台,如果是安卓则启动安卓更新
if(res.platform=="android"){
this.AndroidCheckUpdate();
}
}
})
},
methods: {
AndroidCheckUpdate:function(){
var _this=this;
uni.request({
url: 'http://xxxx.com/version.txt',
method: 'GET',
data: {},
success: res => {
if(res.data>this.version){
if(plus.networkinfo.getCurrentType()!=3){
uni.showToast({
title: '有新的版本发布,检测到您目前非Wifi连接,为节约您的流量,程序已停止自动更新,将在您连接WIFI之后重新检测更新。',
mask: false,
duration: 5000,
icon:"none"
});
return;
}
uni.showToast({
title: '有新的版本发布,检测到您目前为Wifi连接,程序已启动自动更新。新版本下载完成后将自动弹出安装程序。',
mask: false,
duration: 5000,
icon:"none"
});
var dtask = plus.downloader.createDownload( "http://xxxx.com/app.apk", {}, function ( d, status ) {
// 下载完成
if ( status == 200 ) {
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename),{},{},function(error){
uni.showToast({
title: '安装失败',
mask: false,
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败',
mask: false,
duration: 1500
});
}
});
dtask.start();
}
},
fail: () => {},
complete: () => {}
});
},
}
收起阅读 »

一周 D 报(2018-10-15)
HBuilderX 自公测起,历经 50 个版本的迭代,终于迎来了 1.0 版本的正式发布。详见:http://ask.dcloud.net.cn/article/13507
uni-app
- 内置地图更新为原生的高德地图后,层级和覆盖物的问题。:可以暂时使用问题中回复的方案,后面会支持 cover-view 来更方便地处理。
- uni-app 不支持右滑关闭页面么? iOS 平台是支持的不需要额外配置,Android 平台不支持。
- uni-app 有没有小程序中的 live-pusher 类似组件? 相关的组件等内容,还未完善。
- uni-app 如何获取应用的 version? App 平台下需要调用 plus.runtime.version 来获取,参考 hello uni-app 的 App.vue。小程序的升级是小程序云服务统一管理的,不存在应用版本号的概念。
- uni-app 中可以使用 Vant 的小程序库么? uni-app 中支持使用小程序的组件,详见文档:小程序组件支持。
- uni.getStorageInfo 的支持:App 平台还未支持此 API。
- nvue 文件里import,无法使用uni-app内置文件:其实这个问题的重点在于如何实现 nvue 和 vue 的数据共享。因为 uni-app 中 vue 和 nvue 是两个独立的环境,并不能完全通用。只有部分 uni 的 API 是可以通用的,因此需要使用 uni.storage 相关的 API 来实现数据的共享。
- uni-app请问如何隐藏滚动条,能否使用5+api:可以在 app-plus 中配置,详见问题回复。
其它问题
- 语音识别可以选择百度的语音引擎吗:下载更新 HBuilderX,并且设置 engine: 'baidu' 即可。
- 提交app到谷歌商城的时候,提示api为21要把api提升到26,请问怎么提升api:manifest.json 中配置 Android 的 targetSdkVersion 为 26。
开源与分享
- 在 web-view 加载的 HTML 中调用 uni 的 API:uni-app 支持 web-view 与应用内页面的切换了。
- uni-app 中使用微信小程序第三方 SDK 及资源汇总:uni-app 中使用小程序的第三方 SDK,在 App 上同样可用。
- uni-app 中使用地图时打包需勾选填写 SDK 信息:最新版的 uni-app 内置地图切换成了原生的高德地图,因此想在 App 上时候,打包时必须勾选权限并填写相关的 key 信息。
- 分享 PHP后端 + APP前端工程 实例-H5资讯APP , 开源工程下载@王者地带
更多分享,请前往 精华区 查看。
欢迎更多的同学参与进来,分享自己的经验心得。
结束
本期周报就到这里,感谢大家的阅读。新的一周,祝大家工作顺利。
HBuilderX 自公测起,历经 50 个版本的迭代,终于迎来了 1.0 版本的正式发布。详见:http://ask.dcloud.net.cn/article/13507
uni-app
- 内置地图更新为原生的高德地图后,层级和覆盖物的问题。:可以暂时使用问题中回复的方案,后面会支持 cover-view 来更方便地处理。
- uni-app 不支持右滑关闭页面么? iOS 平台是支持的不需要额外配置,Android 平台不支持。
- uni-app 有没有小程序中的 live-pusher 类似组件? 相关的组件等内容,还未完善。
- uni-app 如何获取应用的 version? App 平台下需要调用 plus.runtime.version 来获取,参考 hello uni-app 的 App.vue。小程序的升级是小程序云服务统一管理的,不存在应用版本号的概念。
- uni-app 中可以使用 Vant 的小程序库么? uni-app 中支持使用小程序的组件,详见文档:小程序组件支持。
- uni.getStorageInfo 的支持:App 平台还未支持此 API。
- nvue 文件里import,无法使用uni-app内置文件:其实这个问题的重点在于如何实现 nvue 和 vue 的数据共享。因为 uni-app 中 vue 和 nvue 是两个独立的环境,并不能完全通用。只有部分 uni 的 API 是可以通用的,因此需要使用 uni.storage 相关的 API 来实现数据的共享。
- uni-app请问如何隐藏滚动条,能否使用5+api:可以在 app-plus 中配置,详见问题回复。
其它问题
- 语音识别可以选择百度的语音引擎吗:下载更新 HBuilderX,并且设置 engine: 'baidu' 即可。
- 提交app到谷歌商城的时候,提示api为21要把api提升到26,请问怎么提升api:manifest.json 中配置 Android 的 targetSdkVersion 为 26。
开源与分享
- 在 web-view 加载的 HTML 中调用 uni 的 API:uni-app 支持 web-view 与应用内页面的切换了。
- uni-app 中使用微信小程序第三方 SDK 及资源汇总:uni-app 中使用小程序的第三方 SDK,在 App 上同样可用。
- uni-app 中使用地图时打包需勾选填写 SDK 信息:最新版的 uni-app 内置地图切换成了原生的高德地图,因此想在 App 上时候,打包时必须勾选权限并填写相关的 key 信息。
- 分享 PHP后端 + APP前端工程 实例-H5资讯APP , 开源工程下载@王者地带
更多分享,请前往 精华区 查看。
欢迎更多的同学参与进来,分享自己的经验心得。
结束
本期周报就到这里,感谢大家的阅读。新的一周,祝大家工作顺利。

这个uniapp的api和组件太像小程序了有没有
这个api和组件太像小程序了有没有
不过还是比较喜欢的,没有更多额外学习成本
这个api和组件太像小程序了有没有
不过还是比较喜欢的,没有更多额外学习成本

2020承接外包,长期有效,uniapp、web、php、微信
经济不景气,全栈程序员接外包补贴房贷。
可接uniapp、网站,微信小程序、logo海报、等平面设计(有团队),付费解决问题。
不管有没有需求欢迎qq微信骚扰。
qq:50401716
微信:

5+案例(资讯,淘宝客,即时聊天):
https://m3w.cn/aihanfu
https://m3w.cn/dsg
一些案例图片:
网站及设计案例请加qq微信查看~
经济不景气,全栈程序员接外包补贴房贷。
可接uniapp、网站,微信小程序、logo海报、等平面设计(有团队),付费解决问题。
不管有没有需求欢迎qq微信骚扰。
qq:50401716
微信:
5+案例(资讯,淘宝客,即时聊天):
https://m3w.cn/aihanfu
https://m3w.cn/dsg
一些案例图片:
网站及设计案例请加qq微信查看~
收起阅读 »
小程序开发费用,2018年的小程序开发费用
现在常见的郑州小程序开发方式主要有以下三种,小程序开发费用通常是根据功能需求以及开发难度等因素决定,目前来说只有一个大致的价格区间,很多投资者在询问价格时,无法得到明确答复就是因为这些原因,而定制开发的小程序所需费用是三种开发方式中比较贵的。下面来详细的跟大家分析一下各种开发方式所对应的小程序开发区别吧。
1、定制类小程序开发
这类小程序所需的开发费用一般在一万以上,因为定制开发类的小程序可以满足企业自身的个性化需求的功能,从事这类定制类小程序开发公司通常会由产品经理、核心技术人员等团队成员和客户详细沟通需求,然后提供相应的报价和解决方案,定制类小程序在完成开发后,功能使用往往比较贴合客户需求。
2、模板开发方式
小程序开发公司一般要会根据不同的行业分类开发出一些固定的模板,一个模板同时可以卖给成千上万的客户,这种开发方式对于开发商来说利润很高,对用户而言所付出的成本也相对于低,但是这种开发方式弊端,就是无法修改模板,只是把小程序按年租售,同时也会存在部分功能无法实现又承载过多一些多余功能的情况,这类小程序的售后服务通常也不完善。
3、开发各类常用模板的开发公司
这类公司主要是开发一些常用的功能模板,与模板类不同的是,客户可以根据自己的需求来选择不同的功能进行组合,价格相对也会高一些,一般在几千到一万元以内,这类开发小程序虽然有一定的选择性,但功能并不能完全实现个性化定制。
小程序开发需要多少费用?这是所有企业和个体商家关注的焦点,首先无论是哪一类型的小程序,开发费用都相对较低,但是不同类型的小程序根据用户的功能需求的不同,会导致开发费用有所差异,一般价格区间在几千到几万之间,小程序的开发费用是可以根据其开发方式推算出大概的预算方案,所以具体还是要跟开发公司协商才行。
本文由专业的郑州小程序开发(http://www.appsaa.com)燚轩科技整理发布,如需转载请注明出处。
现在常见的郑州小程序开发方式主要有以下三种,小程序开发费用通常是根据功能需求以及开发难度等因素决定,目前来说只有一个大致的价格区间,很多投资者在询问价格时,无法得到明确答复就是因为这些原因,而定制开发的小程序所需费用是三种开发方式中比较贵的。下面来详细的跟大家分析一下各种开发方式所对应的小程序开发区别吧。
1、定制类小程序开发
这类小程序所需的开发费用一般在一万以上,因为定制开发类的小程序可以满足企业自身的个性化需求的功能,从事这类定制类小程序开发公司通常会由产品经理、核心技术人员等团队成员和客户详细沟通需求,然后提供相应的报价和解决方案,定制类小程序在完成开发后,功能使用往往比较贴合客户需求。
2、模板开发方式
小程序开发公司一般要会根据不同的行业分类开发出一些固定的模板,一个模板同时可以卖给成千上万的客户,这种开发方式对于开发商来说利润很高,对用户而言所付出的成本也相对于低,但是这种开发方式弊端,就是无法修改模板,只是把小程序按年租售,同时也会存在部分功能无法实现又承载过多一些多余功能的情况,这类小程序的售后服务通常也不完善。
3、开发各类常用模板的开发公司
这类公司主要是开发一些常用的功能模板,与模板类不同的是,客户可以根据自己的需求来选择不同的功能进行组合,价格相对也会高一些,一般在几千到一万元以内,这类开发小程序虽然有一定的选择性,但功能并不能完全实现个性化定制。
小程序开发需要多少费用?这是所有企业和个体商家关注的焦点,首先无论是哪一类型的小程序,开发费用都相对较低,但是不同类型的小程序根据用户的功能需求的不同,会导致开发费用有所差异,一般价格区间在几千到几万之间,小程序的开发费用是可以根据其开发方式推算出大概的预算方案,所以具体还是要跟开发公司协商才行。
本文由专业的郑州小程序开发(http://www.appsaa.com)燚轩科技整理发布,如需转载请注明出处。
收起阅读 »
Anroid 6.0 动态权限申请代码分享
/*
正常权限,无需动态申请:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
2)危险权限,需要动态申请:
group:android.permission-group.STORAGE
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
group:android.permission-group.CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
READ_CONTACTS
group:android.permission-group.PHONE
READ_CALL_LOG
READ_PHONE_STATE
CALL_PHONE
WRITE_CALL_LOG
USE_SIP
PROCESS_OUTGOING_CALLS
com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
READ_CALENDAR
WRITE_CALENDAR
group:android.permission-group.CAMERA
CAMERA
group:android.permissiongroup.SENSORS
BODY_SENSORS
group:android.permission-group.LOCATION
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
group:android.permission-group.MICROPHONE
RECORD_AUDIO
group:android.permission-group.SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
RECEIVE_SMS
SEND_SMS
READ_CELL_BROADCASTS
*/
/**
* Me:
* cnscn <214363570@qq.com>
*
* 参考:
* https://blog.csdn.net/lvyoujt/article/details/52826556
* https://developer.android.com/reference/android/Manifest.permission
* https://developer.android.com/reference/android/os/Build.VERSION
*/
function plusReady() {
var Build = plus.android.importClass("android.os.Build");
var Manifest = plus.android.importClass("android.Manifest");
var MainActivity = plus.android.runtimeMainActivity();
//var context=main.getApplicationContext(); //未用到,在此仅供参考
var ArrPermissions = [
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
];
function PermissionCheck(permission) {
if (Build.VERSION.SDK_INT >= 23) {
if (MainActivity.checkSelfPermission(permission) == -1) {
return false;
}
}
return true;
}
function PermissionChecks(Arr) {
var HasPermission = true;
for (var index in Arr) {
var permission = Arr[index];
//如果此处没有权限,则是用户拒绝了
if (!PermissionCheck(permission)) {
HasPermission = false;
break;
}
}
return HasPermission;
}
function PermissionRequest(Arr) {
var REQUEST_CODE_CONTACT = 101;
if (Build.VERSION.SDK_INT >= 23) {
MainActivity.requestPermissions(Arr, REQUEST_CODE_CONTACT);
}
}
//如果没有权限,则申请
if (!PermissionChecks(ArrPermissions)) {
PermissionRequest(ArrPermissions);
} else { //如果拥有权限,那么干点啥吧^_^
//.......
}
}
if (window.plus) {
plusReady();
} else {
document.addEventListener('plusready', plusReady, false);
}
/*
正常权限,无需动态申请:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
2)危险权限,需要动态申请:
group:android.permission-group.STORAGE
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
group:android.permission-group.CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
READ_CONTACTS
group:android.permission-group.PHONE
READ_CALL_LOG
READ_PHONE_STATE
CALL_PHONE
WRITE_CALL_LOG
USE_SIP
PROCESS_OUTGOING_CALLS
com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
READ_CALENDAR
WRITE_CALENDAR
group:android.permission-group.CAMERA
CAMERA
group:android.permissiongroup.SENSORS
BODY_SENSORS
group:android.permission-group.LOCATION
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
group:android.permission-group.MICROPHONE
RECORD_AUDIO
group:android.permission-group.SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
RECEIVE_SMS
SEND_SMS
READ_CELL_BROADCASTS
*/
/**
* Me:
* cnscn <214363570@qq.com>
*
* 参考:
* https://blog.csdn.net/lvyoujt/article/details/52826556
* https://developer.android.com/reference/android/Manifest.permission
* https://developer.android.com/reference/android/os/Build.VERSION
*/
function plusReady() {
var Build = plus.android.importClass("android.os.Build");
var Manifest = plus.android.importClass("android.Manifest");
var MainActivity = plus.android.runtimeMainActivity();
//var context=main.getApplicationContext(); //未用到,在此仅供参考
var ArrPermissions = [
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
];
function PermissionCheck(permission) {
if (Build.VERSION.SDK_INT >= 23) {
if (MainActivity.checkSelfPermission(permission) == -1) {
return false;
}
}
return true;
}
function PermissionChecks(Arr) {
var HasPermission = true;
for (var index in Arr) {
var permission = Arr[index];
//如果此处没有权限,则是用户拒绝了
if (!PermissionCheck(permission)) {
HasPermission = false;
break;
}
}
return HasPermission;
}
function PermissionRequest(Arr) {
var REQUEST_CODE_CONTACT = 101;
if (Build.VERSION.SDK_INT >= 23) {
MainActivity.requestPermissions(Arr, REQUEST_CODE_CONTACT);
}
}
//如果没有权限,则申请
if (!PermissionChecks(ArrPermissions)) {
PermissionRequest(ArrPermissions);
} else { //如果拥有权限,那么干点啥吧^_^
//.......
}
}
if (window.plus) {
plusReady();
} else {
document.addEventListener('plusready', plusReady, false);
}
收起阅读 »

小程序开发之插件功能的有效实现方法
我们在做小程序开发时,比如说在编辑器里里面编辑了一段内容,输出网页版只需要htmlspecialchars_decode()函数就可以搞定了,但是输出小程序就并不是那么简单了,必须要使用wxParse插件才能完成。下面跟大家分享一下导入插件的使用方法:
在wxml中引入,代码如下:
{{title}}
在wcss中引入,代码如下:
@import "/wxParse/wxParse.wxss";
.title{
/ border:solid #000 1rpx; /
width: 100% ;
text-align: center;
background-color: #fff;
font-size: 30rpx;
height:80rpx;
line-height: 80rpx;
}
.content{
/ border:solid #000 1rpx; /
width: 100% ;
margin-top:20rpx;
height: 100%;
background-color: #fff;
font-size: 25rpx;
padding:20rpx;
}
在js中引入,代码如下:
// pages/helpcontent/helpcontent.js
var WxParse = require('../../wxParse/wxParse.js');
Page({
/**
- 页面的初始数据
*/
data: {
},
/**
- 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var that=this
wx.request({
url: 'https://www.appsaa.com', //仅为示例,并非真实的接口地址
header: {
'content-type': 'application/json'
},
success: function (res) {
console.log(res.data.title)
that.setData({
title: res.data.title,//第一个data为固定用法,第二个data是json中的data
infos: WxParse.wxParse('infos', 'html', res.data.infos, that, 5)
})
}
})
}
那么到这里就结束了,大家现在可以尝试一下了,如果还是存在有不理解或者不清楚的地方,都是可以留言咨询我们的。
本文由专业的郑州小程序开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。
我们在做小程序开发时,比如说在编辑器里里面编辑了一段内容,输出网页版只需要htmlspecialchars_decode()函数就可以搞定了,但是输出小程序就并不是那么简单了,必须要使用wxParse插件才能完成。下面跟大家分享一下导入插件的使用方法:
在wxml中引入,代码如下:
{{title}}
在wcss中引入,代码如下:
@import "/wxParse/wxParse.wxss";
.title{
/ border:solid #000 1rpx; /
width: 100% ;
text-align: center;
background-color: #fff;
font-size: 30rpx;
height:80rpx;
line-height: 80rpx;
}
.content{
/ border:solid #000 1rpx; /
width: 100% ;
margin-top:20rpx;
height: 100%;
background-color: #fff;
font-size: 25rpx;
padding:20rpx;
}
在js中引入,代码如下:
// pages/helpcontent/helpcontent.js
var WxParse = require('../../wxParse/wxParse.js');
Page({
/**
- 页面的初始数据
*/
data: {
},
/**
- 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var that=this
wx.request({
url: 'https://www.appsaa.com', //仅为示例,并非真实的接口地址
header: {
'content-type': 'application/json'
},
success: function (res) {
console.log(res.data.title)
that.setData({
title: res.data.title,//第一个data为固定用法,第二个data是json中的data
infos: WxParse.wxParse('infos', 'html', res.data.infos, that, 5)
})
}
})
}
那么到这里就结束了,大家现在可以尝试一下了,如果还是存在有不理解或者不清楚的地方,都是可以留言咨询我们的。
本文由专业的郑州小程序开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。
收起阅读 »