当前位置: 首页 > 编程日记 > 正文

ionic + cordova+angularJs 搭建的H5 App完整版总结

为期半个月的项目实践开发,已完整告一段落,团队小组获得第一名,辛苦总算没有白费,想起有一天晚上,整个小组的人,联调到12点才从公司回去,真是心酸。这里总结一下,项目过程中遇到的问题

和感悟。哈哈,放张集体照。嘿嘿,项目所有的不同的team的小伙伴,一群优秀的小伙伴(大多都来自高校211,985)么么哒.下面介绍下我们组的产品和问题。

项目已放在github上:https://github.com/foreverjiangting/myApp/tree/master/myApp/myApp

一:项目效果展示

先展示一下我们做的产品,主要是做一个投票的APP,包括用户登录,注册,答卷,查看答卷详情,排行榜等功能。后台可创建问卷,分发问卷,增加单选题和多选题,创建问卷题目,我这边前端的app将其显

示出来。基本上可以满足需求,但还有很多不完善的地方。

          

二:制作功能问题总结

先看下核心功能,用户进行单选,多选后,将保存用户的答案,传递后后端,然后在展示详情里面将用户的答案进行展示出来。这里先贴下代码。

 <ion-slide-box show-pager="false"  on-slide-changed="onSlideChanged(index)" active-slide="currentIndex"><ion-slide  class="set-container" ng-repeat="value in  objData"  repeat-done="repeatDone()" ><div class="swiper-slide swiper-slide-duplicate swiper-slide-active"  style="width: 349px; margin-right: 30px;"><div class="scores" ><h3>{{data.title}}</h3><div class="f"><span id="span-text">{{$index+1}}</span>{{value.title}}</div><div class="choose"><div class="input" ng-repeat="(key,value2) in value.items"><label for="26"><input type="radio" name="radio{{$parent.$index}}" class="radio"  value="{{key}}" ng-model= "selectedValue.radioData[$parent.$index]"> <span >{{value2}}</span> </label></div>														</div></div></div>
</ion-slide>

这里有几个问题,由于是公用同一个模板,每一个ion-slide就是一页,且一页下面有多个选项。问题如下:

1.如何区分不同个ion-slide下的radio ?贴下代码,只要给name添加就可以。$parent.$index即可

   <input type="radio" name="radio{{$parent.$index}}" class="radio" 

2.如何获取用户选择的当前页的答案?使用ng-model即可,将用户选择的答案分别存在一个数组里面。

ng-model= "selectedValue.radioData[$parent.$index]"> 

基本上也没啥难点,就是方法要知道。用户填写答案完成后,进行保存,我们需要获取用户提交的所有答案。看下代码。

 $scope.submitData = {};//用户提交完毕,当前的问卷被提交,修改其状态为已完成。可在已完成的栏目进行查看$scope.submitSuccess = function(){var radioJsonData = $scope.selectedValue.radioData;var radioObject  = [];for(var k  in radioJsonData){radioObject.push(radioJsonData[k]);}console.log('3333')console.log(radioObject);console.log(radioJsonData)//获取radioData的长度,判断用户选择的数据是否完整var radioLength = 0;var getRadioLength = function(radioJsonData){for(var item  in radioJsonData){radioLength++;}return  radioLength;}if(getRadioLength(radioJsonData) == $scope.serveLength-1){var submitData = window._single = {"single":radioObject            }; var submitId  = window._id = {"id" : $stateParams.timuId} console.log(JSON.stringify(submitData));var alertPopup = $ionicPopup.alert({title: '保存成功',template: '您的单选题已完成,请继续答题!'});alertPopup.then(function(res) {history.go(-1);});} else{var alertPopup = $ionicPopup.alert({title: '提交失败',template: '您的问卷未完成,请返回查看详情!'});alertPopup.then(function(res) {console.log('提交失败');});}      };

3.再来看下多选题,跟单选题有点区别。

 <ion-slide-box show-pager="false"  on-slide-changed="onSlideChanged(index)" active-slide="currentIndex"><ion-slide  class="set-container" ng-repeat="value in  objData"  repeat-done="repeatDone()" ><div class="swiper-slide swiper-slide-duplicate swiper-slide-active"  style="width: 349px; margin-right: 30px;"><div class="scores"><h3>{{data.title}}</h3><div class="f"><span id="span-text">{{$index+1}}</span>{{value.title}}</div><div class="choose" ><div class="input" ng-repeat="(key,value2) in value.items"><label for="26"><input type="checkbox" name="radio{{$parent.$index}}" class="radio"  ng-model = "selected[$parent.$index][$index]"> <span  style="margin-left: 30px;">{{value2}}</span> </label></div>														</div></div></div></ion-slide>

问题如下:

1.如何在多选里面选中多个答案呢?

  ng-model = "selected[$parent.$index][$index]"

这种方法是最简单的,虽然不是我们要的,但之后再做一下解析即可。数组里面的数据是这样子的。因为我们只需要保存用户选择的答案的当前题目的index,保存以1,2,3,4的形式保存即可。

         

看下解析的代码如下:

 $scope.nextSlide = function(){ var  slideIndex = $ionicSlideBoxDelegate.currentIndex();       $scope.connectedData = $scope.selected.map(function(item){var connectSelected = [];for(var i in item){if(item[i]){connectSelected.push(parseInt(i)+1);}}return connectSelected.join('/');     //进行解析,以/进行分割})if( $scope.connectedData == null){var alertPopup = $ionicPopup.alert({template: '您还没有选择,请选择答案!'}); }else if( $scope.connectedData[slideIndex] == null && slideIndex != $scope.serveLength-1 ){var alertPopup = $ionicPopup.alert({template: '您还没有选择,请选择答案!'});  return true;           }else {$ionicSlideBoxDelegate.next(); }return ;    console.log('test:'+JSON.stringify( $scope.connectedData));//$ionicSlideBoxDelegate.next();                     };

3.既然单选题和多选题都有答案了,现在就是提交用户答案了。解决不同controller之间的数据通信,本来之前用的$rootscope,不知道为什么不行,后来学霸告诉我直接

存在window下面。于是简单粗暴的解决了问题。

         

先看下代码吧,我们前端需要提交给后端数据包括问卷的ID,单选题答案,多选题答案。下面是提交的代码。

.controller('chooseCtrl',['$scope','$ionicPopup', '$timeout', '$stateParams','$http','$ionicScrollDelegate','$location' ,function($scope,$ionicPopup, $timeout, $stateParams,$http,$ionicScrollDelegate,$location){$scope.jump = function(url){window.location = url;}$scope.chooseId = $stateParams.timuId; //获取问卷的Idconsole.log( $scope.chooseId);var submitData = {"id" : $scope.chooseId}var objData = [];//刚开始渲染数据,获取整个问卷的data,单选存在一个数组,多选存在一个数组$http({  // url : "../data/api.json", url : "http://10.32.33.4:8080/ivotel-management/questionnaire/selectQuestionnaireDetail", method : "get",params: submitData,headers: { 'Content-Type': 'application/json;charset=UTF-8' }}).success(function(data) {         var arr =data.questionnaireQuestionList; //进行解析          var singleData = [] ;var mutilData = [];for(var i=0;i<arr.length;i++){objData[i] = arr[i].responseQuestion; } // console.log(JSON.stringify(objData));  //获取所有的题目对象for(var i  in  objData){if(objData[i].questiontype == 1){singleData.push(objData[i]);}else if(objData[i].questiontype == 2){mutilData.push(objData[i]);}}window._singleData = singleData;window._singleData_length = singleData.length;window._mutilData  = mutilData;window._mutilData_length = mutilData.length;window.totalQuestionData = data ;//console.log(JSON.stringify(singleData));//console.log(JSON.stringify(mutilData));     $scope.data = data; $scope.serveData = data.questionnaireQuestionList[0].qqid;     }).error(function(){  console.log('error');});//用户填写完成后,将用户答案保存,并一起传递给后端 $scope.submit = function(){if(window._multi == null){window._multi = [];}var  submitTotalData = [window._id ,window._single , window._multi] ;$http({  url : "http://10.32.33.4:8080/ivotel-examuser/questionnairePapers/Submit",  method : "post",data : submitTotalData,headers: { 'Content-Type': 'application/json;charset=UTF-8' },withCredentials :true}).success(function(data) { console.log('success');}).error(function(){  console.log('error');});  var alertPopup = $ionicPopup.alert({title: '提交成功',template: '您的问卷已完成,请返回查看详情!'});alertPopup.then(function(res) {history.go(-1);});console.log('test: ' + JSON.stringify( submitTotalData));         }}])

输出时用户提交的所有答案格式如下:

将不同的controller里面的值,分别存在window下面的某一个属性下面,即可在全局中进行使用。

  

4.OK ,既然答案都已经保存好啦,现在,我们需要将答案展示出来。在详情页面列表中。

看下后端传给我们的数据格式如下:

{"answer": {  //单选"1": "4",  //第一题,用户选择第四个答案"2": "1",  //第二题,用户选择第一个答案"3":"3"    //第三题,用户选择第三个答案},"multi": {    //多选"4": "1/2/3",  //第四题,用户选择1,2,3答案"5": "1/3/4",  //第五题,用户选择1,3,4答案"6": "1/3/4"   //第六题,用户选择1,3,4答案}
}

看下效果图,我们主要是做两件事,1.进行解析,将用户的答案,呈现出来。2.根据答案,选中用户当前的radio的状态。

       

这里直接贴下代码,解析的过程都在代码中。比较繁琐。

关于单选的话,根绝单选直接选中当前的radio,比较好说,直接使用下面的方法即可:

<ion-slide  class="set-container" ng-repeat="value in  singleData"  repeat-done="repeatDone()" ><div class="swiper-slide swiper-slide-duplicate swiper-slide-active"  style="width: 349px; margin-right: 30px;"><div class="scores" ><h3>{{data.title}}</h3><div class="f"><span id="span-text">{{$index+1}}</span>{{value.title}}</div><div class="choose"><div class="input" ng-repeat="(key,value2) in value.items"><label for="26"><input type="radio" name="radio{{$parent.$index}}" class="radio"  value="{{value2}}" ng-checked="$index == selectedIndex-1"> <span >{{value2}}</span> </label></div>														</div></div></div>
</ion-slide>

即直接使用下面的方法:ng-checked = "$index == selectedIndex -1"即可.

  ng-checked="$index == selectedIndex-1"> 

这里解析的代码也贴一下:

.controller('listItemCtrl',['$scope','$ionicPopup', '$timeout', '$stateParams','$http','$ionicScrollDelegate','$location' ,'$ionicSlideBoxDelegate','$ionicHistory',function($scope,$ionicPopup, $timeout,$stateParams,$http,$ionicScrollDelegate,$location,$ionicSlideBoxDelegate,$ionicHistory){  // $ionicHistory.nextViewOptions({//        disableBack: true// });$scope.repeatDone = function() {$ionicSlideBoxDelegate.update();};var  objData = [];$scope.selectedValue = {};$scope.radioData = [];$scope.wenjuanId = $stateParams.timuId; //获取问卷的Idconsole.log('问卷Id:' + $scope.wenjuanId);var submitData = {"id" :  $scope.wenjuanId }$scope.serveData = 0;       $scope.objData = null;$scope.jsonRadio = [];                $scope.newJsonData = []; //根据对应的题目索引,得到正确的题目$scope.newMulitJsonData = [];$scope.currentIndex = 0;$scope.answerData = null;  //所有的单选题的答案$scope.answerMutleData = null;$scope.jsonItemData = null;$scope.selectedIndex = 0;$scope.answerArray = [];$scope.singleData = []; //所有的单选题 $scope.multiData = [];$scope.serveLength = 0;$scope.selectedMulitIndex = 0;$scope.chooseMulitData = [];$scope.single_length = 0;$scope.muiteKey = 0;$scope.arrData = [];$http({  url : "../data/doing.json", //url : "http://10.32.33.4:8080/ivotel-examuser/questionnairePapers/PaperDetail", method : "get",params: submitData,headers: { 'Content-Type': 'application/json;charset=UTF-8' },withCredentials :true}).success(function(data) {                   $scope.answerData = data.answer;  console.log($scope.answerData);  //得到用户选择的答案 {1: "1", 2: "2"}                var arr = data.questionnaireTemp.questionnaireQuestionList; //进行解析                        for(var i=0; i< arr.length;i++){             //获取所有的题目对象objData[i] = arr[i].responseQuestion; }$scope.data = data;                              $scope.objData = objData;$scope.serveLength = objData.length;//console.log( $scope.serveLength)//console.log(JSON.stringify( $scope.objData));    for(var i  in  objData){                   //将单选题 和 多选题分别存在不同的数组里面if(objData[i].questiontype == 1){$scope.singleData.push(objData[i]);$scope.single_length =  $scope.singleData.length -1 ;}else if(objData[i].questiontype == 2){$scope.multiData.push(objData[i]);}} //如果为单选的话,为 $scope.singleData                                                         for(var i  in  $scope.answerData){   //i为key值开始if(i == ($ionicSlideBoxDelegate.currentIndex()+1)){$scope.newJsonData.push($scope.singleData[i-1].items[($scope.answerData[i])]);}                                          }$scope.selectedIndex = parseInt($scope.answerData[$ionicSlideBoxDelegate.currentIndex()+1]) ; console.log('selectedIndex : ' +$scope.selectedIndex)                 console.log('jsonNewData:' + JSON.stringify( $scope.newJsonData));  //如果为多选的话,为$scope.multiData$scope.answerMutleData = data.multi;console.log( JSON.stringify($scope.answerMutleData));//对数组进行解析var temp = 0;for(var i  in $scope.answerMutleData){ //i为3 var arr = $scope.answerMutleData[i].split('/');$scope.arrData = arr ;for (var i  in arr){// $scope.muiteKey = arr[i]; //获取key值,并赋值给全局变量}// $scope.muiteKey = arr[$ionicSlideBoxDelegate.currentIndex()]console.log('arr : ' + JSON.stringify(arr));  //[1,2,3]console.log('key: ' +  JSON.stringify($scope.arrData));for(var j=0;j < arr.length; j++){console.log('test: ' +temp );if(i == ($ionicSlideBoxDelegate.currentIndex()+1)){$scope.newMulitJsonData.push($scope.multiData[temp].items[(arr[j])]);}    }temp++;console.log('arrDate:' + JSON.stringify($scope.arrData));  }  console.log($scope.newMulitJsonData);//所有的单选全部展示完成后,开始展示所有的多选$scope.selectedMulitIndex = parseInt($scope.answerMutleData[$ionicSlideBoxDelegate.currentIndex()+1]) ; $scope.muiteKey = parseInt($scope.answerMutleData[$ionicSlideBoxDelegate.currentIndex()+1]) ; console.log( $scope.selectedMulitIndex);}).error(function(){  console.log('error');});        $scope.jsonItemData = [];var osingMes = document.getElementById('singleMessage');var omulit   = document.getElementById('muiltMessage');  $scope.onSlideChanged = function(index){$scope.currentIndex = index;for(var i  in $scope.answerData){$scope.answerArray.push($scope.answerData[i]);}console.log('index22:' + index);$scope.selectedIndex = parseInt($scope.answerData[$ionicSlideBoxDelegate.currentIndex()+1])-1 ; console.log('selectedIndex : ' +$scope.selectedIndex)                              for(var i  in  $scope.answerData){if(i == ($ionicSlideBoxDelegate.currentIndex()+1)){$scope.newJsonData.push($scope.singleData[i-1].items[($scope.answerData[i])]);$scope.selectedIndex = $scope.answerData[i] - '0' ;}console.log('index:' + $scope.selectedIndex)}// if($ionicSlideBoxDelegate.currentIndex()+1 >  $scope.serveLength){//       osingMes.style.display = 'none';//       omulit.style.display = 'block';// }console.log('jsonNewData:' + JSON.stringify( $scope.newJsonData)); //如果为多选的话,为$scope.multiData//  $scope.answerMutleData = data.multi;console.log( JSON.stringify($scope.answerMutleData));//对数组进行解析var temp = 0;for(var i  in $scope.answerMutleData){ //i为3 // var b =  $scope.newMulitJsonData;  //将上一次的值赋给bconsole.log('length :' + $scope.newMulitJsonData.length);                    var arr = $scope.answerMutleData[i].split('/');for(var j=0;j < arr.length; j++){console.log('test: ' + temp );if(i == ($ionicSlideBoxDelegate.currentIndex()+1)){if($scope.newMulitJsonData[j] == null){   //判断之前的所有选项是否为空 $scope.newMulitJsonData.push($scope.multiData[temp].items[(arr[j])]);$scope.muiteKey = $scope.multiData[temp] - '0';}else{$scope.newMulitJsonData = [];$scope.newMulitJsonData.push($scope.multiData[temp].items[(arr[j])]);}} console.log('json: '+ JSON.stringify($scope.newMulitJsonData));    }temp++;                                                                    //[1,2,3]                                             }                   console.log(JSON.stringify($scope.newMulitJsonData));  for(var i  in $scope.newMulitJsonData){console.log('i:'+ i);}//console.log($scope.newMulitJsonData); //得到的正确答案没问题//所有的单选全部展示完成后,开始展示所有的多选$scope.selectedMulitIndex = parseInt($scope.answerMutleData[$ionicSlideBoxDelegate.currentIndex()+1]) ; console.log( $scope.selectedMulitIndex);};$scope.nextSlide = function(){ if($ionicSlideBoxDelegate.currentIndex()+1 !=  $scope.serveLength) {$ionicSlideBoxDelegate.next();  }else {var alertPopup = $ionicPopup.alert({                 template: '亲,已经最后一题,木有了哦!'});alertPopup.then(function(res) {// window.location.reload();// history.go(-1);});}};$scope.startSlide = function(){$ionicSlideBoxDelegate.previous();};
}])

5.前后端跨域的问题。

由于angularjs的$http请求与ajax还是有些区别的,总是会存在跨域的问题,如何解决呢?加个 withCredentials :true 即可。

 $http({  url : "http://10.32.33.4:8080/ivotel-examuser/questionnairePapers/Submit",  method : "post",data : submitTotalData,headers: { 'Content-Type': 'application/json;charset=UTF-8' },withCredentials :true}).success(function(data) { console.log('success');}).error(function(){  console.log('error');}); 
})  

OK,基本上整个核心的功能点都已经讲解清楚啦。问题还是遇到不少,感谢从不拒绝我问题的shu,给了我很大的帮助。嘿嘿,么么哒!

 三:总结

经过这个月的项目实践,熟悉了不少ng的写法,虽然以前也接触过,但好像都不是很熟,而且一个完整的APP的搭建流程也熟悉很多。其次,想说到前后端合作的问题,定契约的问题,沟通问题

感觉一个项目下来,反正各种问题都碰到,大家一起吵啊,争啊,各有各的想法,拍桌子啊,前后端互相抱怨啊,虽然意见各有不同,哈哈哈,还是很高兴的!起码团队很有活力,很有想法,要都是

不吭声,那才恐怖,自己搞自己的,谁知道你什么想法。哈哈哈,喜欢我们的团队,一个个都棒棒的!另外呢,做项目的时候呢,要知道每个人都有自己的想法,所以,不要一昧的否认别人的想法,觉

得自己就是对的(傻逼), 学会倾听,很关键。团队获得了第一名,大家都很开心,当晚我们组大家一起去吃了海鲜自助。哈哈,放张照片!

       

还是喜欢和自己年龄相仿的人一起工作,做项目,开开玩笑,多开心。每天充满了激情和活力,沟通无代沟,都是90后,一群年轻人,多好!可是,事与愿违啊!接下来,还是得适应不同年龄段的人!


作者:婷风

 出处:http://www.cnblogs.com/jtjds/p/6128539.html 

 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意 

转载文章之后必须在 文章页面明显位置给出作者和原文连接否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/jtjds/p/6128539.html

相关文章:

基础数据结构【三】————老鼠走迷宫问题————堆栈应用

假设&#xff1a;老鼠在一个二维地图中i行走&#xff0c;地图中大部分路径被墙阻断&#xff0c;无法前进。老鼠可以按照尝试错误的方法找到出口。只是&#xff0c;这只老鼠必须具备走错路时候就退回来&#xff0c;并且把走过的路记下来&#xff0c;避免下次走重复路&#xff0c…

eclipse Debug中step into功能失灵的问题

step into 和 step over功能一样&#xff0c;无法进入方法内部&#xff0c;解决方法如下&#xff1a; 需要使用jdk中的jre&#xff0c;而不是独立安装的jre 再次Debug&#xff0c;当运行到断点的时候&#xff0c;点击step into&#xff08;F5&#xff09;就可以看见println函数…

Linux 基金会宣布红队项目,致力于孵化开源安全工具

百度智能云 云生态狂欢季 热门云产品1折起>>> 谁都想软件有着很高的安全性吧。毕竟&#xff0c;每一天都会有不一样的安全漏洞&#xff0c;从糟糕软件的沼泽中冒出来。 在近期举办的开源领导力峰会上&#xff0c;Linux 基金会宣布了新的红队项目&#xff08;Red Tea…

基础数据结构【四】————环形链表与多项式

主要演示环形列表节点的创建插入&#xff0c; 删除&#xff0c;遍历&#xff0c;环形链表连接 。双向链表节点的建立与插入 &#xff0c;双向链表中节点的删除 以及环形链表在多项式中的应用 DEMO1:环形链表节点的创建与插入 /* [名称]:ch03_08.cpp [示范]:环形链表节点的创…

关联scala源码

首先需要去官网下载sources 将下载好的压缩包拷贝到scala安装的lib目录下&#xff0c;解压 ctrlb以后 查看源码, 选择要查看的方法或者类, 输入 ctrl b import scala.io.StdIn 如果想看StdIn的源码&#xff0c;则将光标放在StdIn处&#xff0c;ctrlb 如果想查看io包下的内容&…

MySQL安装使用的2个问题

问题:1.遇到不输入密码能登上 ,使用密码报错.2.(解压版的) 在cmd输入>mysql –u root –p 时&#xff0c;按enter回车时&#xff0c;会叫你输入密码Enter password____,否则出现错误&#xff1a;ERROR 1045(28000):Access denied for user’root’’localhost’(using passw…

Flink1.7.2 sql 批处理示例

Flink1.7.2 sql 批处理示例 源码 https://github.com/opensourceteams/flink-maven-scala概述 本文为Flink sql Dataset 示例主要操作包括:Scan / Select,as (table),as (column),limit,Where / Filter,between and (where),Sum,min,max,avg,(group by ),group by having,disti…

ISP 【一】————boost标准库使用——批量读取保存文件 /boost第三方库的使用及其cmake添加,图像gramma

CMakeLists.txt文件中需要添加第三方库&#xff0c;并企鹅在CMakeLists.txt中添加 include_directories(${PROJECT_SOURCE_DIR}/../3party/gflags-2.2.2/include) link_directories(${PROJECT_SOURCE_DIR}/../3party/boost-1.73.0/lib-import) target_link_libraries( gram…

简单ajax类, 比较小, 只用ajax功能时, 可以考虑它

忘了哪儿转来的了, 不时的能够用上, 留存一下<script language"javascript" type"text/javascript"> /***var ajaxAjax();/*get使用方式* /ajax.get("php_server.php?id1&namexxx", function(data){ alert(data); //d…

Hadoop 三大发行版本

Hadoop三大发行版本&#xff1a;Apache、Cloudera、Hortonworks。 Apache版本最原始&#xff08;最基础&#xff09;的版本&#xff0c;对于入门学习最好。 Cloudera在大型互联网企业中用的较多。 Hortonworks文档较好。 1. Apache Hadoop 官网地址&#xff1a;http://had…

MongoDB主动撤回SSPL的开源许可申请

2018年10月&#xff0c;MongoDB将其开源协议更换为SSPL&#xff0c;虽然在当时引起了很大的争议&#xff0c;但是MongoDB始终坚信SSPL符合符合开源计划的批准标准&#xff0c;并向Open Source Initiative &#xff08;以下简称OSI&#xff09;提交了申请。不过&#xff0c;近日…

MATLAB【八】———— matlab 读取单个(多个)文件夹中所有图像

0.matlab 移动&#xff08;复制&#xff09;文件到另一个文件夹 sourcePath .\Square_train; targetPath .\Square_test; fileList dir(sourcePath); for k 3 :5: length(fileList) movefile([sourcePath,\,fileList(k).name],targetPath); end %copyfile([sourcePat…

JAVA IO学习

2019独角兽企业重金招聘Python工程师标准>>> 很多初学者接触IO时&#xff0c;总是感觉东西太多&#xff0c;杂乱的分不清楚。其实里面用到了装饰器模式封装&#xff0c;把里面的接口梳理一下之后&#xff0c;就会觉得其实蛮清晰的 相关的接口和类 接口或类描述Input…

Java面向对象三大特征 之 多态性

1、理解多态性&#xff1a;可以理解为一个事物的多种形态 2、对象的多态性&#xff1a;父类的引用指向子类的对象&#xff08;子类的对象赋给父类的引用&#xff09; 3、多态的使用&#xff1a;虚拟方法的调用 子类中定义了与父类同名同参数的方法&#xff08;重写&#xff…

Bootstrap3基础 btn-group-vertical 按钮组(横着、竖着排列)

内容参数OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor Visual Studio Code 1.32.1 typesetting Markdowncode <!DOCTYPE html> <html lang"zh-CN"><head><meta charset&quo…

ISP【二】————camera ir图

1. 加串解串芯片作用&#xff1f; A: 加串和解串是成对出现的&#xff0c;串行器在模组内&#xff0c;将并行信号转换为串行信号&#xff0c;然后用一根线可以实现远距离传输。sensor输出的raw data如果不加串&#xff0c;需要&#xff18;根线传输&#xff0c;很难传输很远&a…

Hadoop运行模式 之 本地运行模式

Hadoop的运行模式包括&#xff1a;本地模式、伪分布式模式以及完全分布式模式 Hadoop官网地址&#xff1a;https://hadoop.apache.org/ 本次使用的Hadoop的版本是2.7.2 官网文档&#xff1a;https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/Single…

一些使用Vim的小技巧

7.增加注释&#xff08;一个操作应用在多行&#xff09;比如需要增加#或者是//这种注释&#xff1a;Ctrl v 定位到开始行&#xff0c;然后选定需要的行&#xff0c;然后执行 I命令&#xff0c;然后输入 # 或 //&#xff0c;然后按 Esc键两次&#xff0c;即可把注释操作应用到所…

SpringBoot注解大全 转

2019年3月17日22:30:10 一、注解(annotations)列表 SpringBootApplication&#xff1a;包含了ComponentScan、Configuration和EnableAutoConfiguration注解。其中ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。 Configuration 等同于spring的XML配置…

MATLAB【九】————ICP算法实现

1.ICP推导与求解 https://zhuanlan.zhihu.com/p/35893884 2.算法实现&#xff1a; % 程序说明&#xff1a;输入data_source和data_target两个点云&#xff0c;找寻将data_source映射到data_targe的旋转和平移参数 clear; close all; clc; %% 参数配置 kd 1; inlier_ratio …

Centos 7环境下源码安装PostgreSQL数据库

马上就要去实习了&#xff0c;工作内容是搞数据仓库方面的&#xff0c;用的是postgresql关系型数据库&#xff0c;于是自己先来了解下这种数据的用法&#xff0c;之后说说这个数据库和MySQL的关系和区别。 1.Postgresql简介 看了下官网上的介绍&#xff0c;全球最高级的开源关系…

Oracle job procedure 存储过程定时任务

Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能&#xff0c;可以在指定的时间点或每天的某个时间点自行执行任务。 一、查询系统中的job&#xff0c;可以查询视图 --相关视图 select * from dba_jobs; select * from all_jobs; select * from user_jobs; -…

Hadoop运行模式 之 伪分布式运行模式

什么是伪分布式模式&#xff1f;它与本地运行模式以及完全分布式模式有什么区别&#xff1f; 伪分布式的配置信息&#xff0c;完全是按照完全分布式的模式去搭建的&#xff0c;但是它只有一台服务器&#xff0c;可以用于学习和测试&#xff0c;真正的开发中不可以使用。 目录…

【C++】【一】结构体数组

demo7:函数份文件编写 swap.h #include <iostream> using namespace std;//函数的声明 void swap(int a, int b); swap.cpp #include "swap.h"//函数的定义 void swap(int a, int b) {int temp a;a b;b temp;cout << "a " << a …

Message、Handler、Message Queue、Looper之间的关系

2019独角兽企业重金招聘Python工程师标准>>> 在单线程模型下&#xff0c;为了解决线程通信问题&#xff0c;Android设计了一个通信机制。Message Queue(消息队列)&#xff0c; 线程间的通信可以通过Message Queue、Handler和Looper进行信息交换。下面将对它们进行逐…

在linux中只将“桌面”修改成“Desktop”而系统仍然使用中文

在安装好centos系统以后&#xff0c;它的Desktop&#xff0c;Downloads等文件夹都是中文的&#xff0c;桌面&#xff0c;下载等&#xff0c;这样在使用cd命令时特别不方便 解决方法一&#xff1a;下载一个中文输入法&#xff0c;安装 解决方法二&#xff1a; 修改il8n文件&a…

Zabbix 3.0 从入门到精通(zabbix使用详解)

第1章 zabbix监控 1.1 为什么要监控 在需要的时刻&#xff0c;提前提醒我们服务器出问题了 当出问题之后&#xff0c;可以找到问题的根源 网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性&#xff08;也称为可用性&#xff0c;英文描述为HA&#xff0c;High Avail…

MacBook如何用Parallels Desktop安装windows7/8

虽然MacBook真的很好用&#xff0c;不过在天朝的国情下&#xff0c;有很多软件还是仅支持IE和windows系统下才有。所以有必要为自己的MacBook装一个windows版本的系统&#xff0c;之前试过用Boot Camp来建立分区和安装win7&#xff0c;之后自己又用Parallels Desktop安装过win8…

在IDEA 中为Maven 配置阿里云镜像源

打开IntelliJ IDEA->Settings ->Build, Execution, Deployment -> Build Tools > Maven 注意要勾选上override 自己创建一个settings.xml文件&#xff0c; 内容如下 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http:/…

【匹配算法】渐进一致采样 PROSAC(PROgressive SAmple Consensus)

方法简介 渐进一致采样法1 (PROSAC) 是对经典的 RANSAC2 中采样的一种优化。相比经典的 RANSAC 方法均匀地从整个集合中采样&#xff0c;PROSAC 方法是从不断增大的最佳对应点集合中进行采样的。所以这种方法可以节省计算量&#xff0c;提高运行速度。 论文&#xff1a;https:…