ionic + cordova+angularJs 搭建的H5 App完整版總結

来源:http://www.cnblogs.com/jtjds/archive/2016/12/03/6128539.html
-Advertisement-
Play Games

為期半個月的項目實踐開發,已完整告一段落,團隊小組獲得第一名,辛苦總算沒有白費,想起有一天晚上,整個小組的人,聯調到12點才從公司回去,真是心酸。這裡總結一下,項目過程中遇到的問題 和感悟。哈哈,放張集體照。嘿嘿,項目所有的不同的team的小伙伴,一群優秀的小伙伴(大多都來自高校211,985)麽麽 ...


   為期半個月的項目實踐開發,已完整告一段落,團隊小組獲得第一名,辛苦總算沒有白費,想起有一天晚上,整個小組的人,聯調到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; //獲取問卷的Id
      console.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; //獲取問卷的Id
          console.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;  //將上一次的值賦給b
                        console.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 

 如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!歡迎各位轉載,但是未經作者本人同意 

轉載文章之後必須在 文章頁面明顯位置給出作者和原文連接否則保留追究法律責任的權利。

  

 

 

 

 

 

 

 

  

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 項目框架主要是spring,持久層框架沒有用mybtis,用的是spring 的jdbc; 業務需求:給應用添加領域(一個領域包含多個應用,一個應用可能屬於多個領域,一般而言一個應用只屬於一個領域),要求是給應用添加領域的時候,先將該應用已有的領域都刪除,之後再將選中的領域添加到資料庫; 為了 ...
  • 雲計算下PAAS的解析一 PaaS是Platform-as-a-Service的縮寫,意思是平臺即服務。 把伺服器平臺作為一種服務提供的商業模式。通過網路進行程式提供的服務稱之為SaaS(Software as a Service),而雲計算時代相應的伺服器平臺或者開發環境作為服務進行提供就成為了P... ...
  • Nginx ("engine x") 是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈, ...
  • 回到目錄 關於持久化到Redis的消息格式,主要是說在Broker上把消息持久化的過程中,需要存儲哪些類型的消息,因為我們的消息是分topic的,而每個topic又有若幹個queue組成,而我們的topic和queue由於redis存儲結構的原因,我們需要將它們分區對應存儲一下,而不能像關係型資料庫 ...
  • 分散式學習系列【dubbo入門實踐】 dubbo架構 組成部分:provider,consumer,registry,monitor; provider,consumer註冊,訂閱類似於消息隊列的註冊訂閱 一、環境安裝 1、dubbo admin 管理控制台安裝(Windows環境) #下載dubb ...
  • XML(Extensible Markup Language),即可擴展的標記語言,它是 SGML(標準通用標記語言)的一個子集,xml文件的主要作用是在於作為程式的配置文件來時用,其他還包括作為不同語言間的數據傳遞以及可以作為一個小型的資料庫存在,XML文件作為一種標記語言,和HTML(Hyper ...
  • 搬運工 頭:header 內容:content/containe 尾:footer 導航:nav 側欄:sidebar 欄目:column 頁面外圍控制整體佈局寬度:wrapper 左右中:left right center 登錄條:loginbar 標誌:logo 廣告:banner 頁面主體:m ...
  • html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>列表渲染</title></head><body> <!-- v-for可以將一組數組渲染到列表當中 --> <!-- 以item in items的形 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...