--@ui-router--登錄頁通過路由跳轉到內頁的demo


 今天還是來說一下angular中的路由模塊。我們實際項目中,各個頁面的切換是經常會與Auth相關的。比如我網站的后台,是需要登錄過的用戶才能進去,那么我們用angularJS做前端路由的時候應該怎么完成這個功能呢

------------------------------------------------------------------------

    我們還是先設想一個最簡單的場景吧。我們的應用有兩個頁面,登錄頁面后內容頁面,要求是必須要驗證登錄成功后才能進入內容頁面,下面我們一起來實現一下這個例子吧。當然我覺得我的方法可能會比較Low,但是學習階段我們能先把功能做出來比什么都重要。

    首先用bootstrap來寫一個簡單的登錄頁面吧。具體bootstrap代碼我就不說了,我們關注的是angular在這里面如何用起來

< div  class = "col-md-offset-3 col-md-4" >
     < form  class = "form"  role = "form"  name = "loginForm"  ng-submit = "loginCheck()" >
         < div  class = "form-group" >
             < label  class = "control-label" >用戶名</ label >
             < input  type = "text"  class = "form-control"  required  placeholder = "請輸入管理員賬號"  ng-model = "admin.username" >
         </ div >
         < div  class = "form-group" >
             < label  class = "control-label" >密碼</ label >
             < input  type = "password"  class = "form-control"  ng-model = "admin.pwd"  required  placeholder = "請輸入密碼" >
         </ div >
         < div  ng-show = "showError"  class = "alert alert-danger alert-dismissible"  role = "alert" >
               < button  ng-click = "showError=false"  type = "button"  class = "close"  data-dismiss = "alert" >< span  aria-hidden = "true" >&times;</ span >< span  class = "sr-only" >關閉</ span ></ button >
               用戶名或密碼錯誤!!你還有一次機會
         </ div >
 
         < input  type = "submit"  class = "btn btn-primary btn-lg"  value = "登錄"  ng-disabled = "loginForm.$invalid" >
     </ form >      
</ div >

    效果如下

        54788faf000197b405000227.jpg

    當然我之前還有一些css的布局,粘代碼過去可能會出錯哦,至少得在最外層加一個div class="row"

    還可以看見,我給登錄按鈕加了個ng-disabled,當表單沒有通過驗證的時候是不能點登錄的。

    然后我加了一個提示的tips,用到了ng-show,在controller里會有一個showError的屬性來控制它的顯示,當驗證賬號密碼錯誤時showError為true。

    當我們驗證出錯的時候

        547892c90001675104860298.jpg

    

    接着我們來看一下路由

var  myApp = angular.module( 'myApp' , [ 'ui.router' , 'myModule' ]);
myApp.run( function ($rootScope, $state, $stateParams){
     $rootScope.$state = $state;
     $rootScope.$stateParams = $stateParams;
     $rootScope.$state.isLogin =  false ;
});
myApp.config( function ($stateProvider, $urlRouterProvider) {
     $urlRouterProvider.otherwise( '/login' );
     $stateProvider
         .state( 'login' ,{
             url        :  '/login' ,
             templateUrl :  'tpls/login.html' ,
             controller  :  'LoginController'
         })
         .state( 'index' ,{
             url        :  '/index' ,
             templateUrl :  'tpls/index.html' ,
             controllerProvider :  function ($rootScope){
                 if ($rootScope.$state.isLogin ==  false ){
                     $rootScope.$state.go( 'login' );
                 }
                 return  function (){};
             }
         });
     }

    因為在整個頁面中我們都會用到登錄狀態,所以我把登錄狀態綁定到rootscope中,isLogin剛開始是false表示未登錄。

    接着看路由里面,login這個很簡單,主要看index頁面。

    關 鍵的一步就是index的controller,在這里我選擇用controllerProvider的方式來生成controller,可以看到我們最 后實際上是返回的一個空的function,但是在返回空controller之前(index頁面還沒有解析),我可以做一些事情,那就是驗證權限啦!

    如 果$rootScope.$state.isLogin為false也就是還沒有登錄,那就直接跳轉到登錄頁面。跳轉用到了$state里面的go方 法,go中的變量就是我們每個頁面的狀態名,也就是state的第一個參數。我是go('login'),它就跳轉到state的第一個參數是login 的那個頁面去了,也就是登錄頁面。換句話說,如果我們登錄提交后驗證沒有成功,當我們在地址欄輸入/index的時候會跳到登錄頁面的哦。

    那么再來看看我們的驗證模塊。

myModule
    .controller( 'LoginController' function ($scope,$rootScope,$http){
       $scope.showError =  false ;
       $scope.loginCheck =  function (){
         var  username = $scope.admin.username;
     var  pwd = $scope.admin.pwd;
     var  loginSuccess =  false ;
     http.get( '/acm-admin/data/user.json' )
      .success( function (response){
        for ( var  i=0; i<response.length; i++){
          if (response[i].username == username && response[i].pwd == pwd){
         $rootScope.$state.isLogin =  true ;
         loginSuccess =  true ;
         $rootScope.$state.go( 'index' );
          }
        }
        if (!loginSuccess){
         $scope.showError =  true ;
        }
     });
    }
   })

    

    初 始化我們給showError一個值為false,不要顯示錯誤提示框。然后來看看驗證登錄的這個方法。首先獲取到用戶輸入的用戶名和密碼,設置登錄成功 的狀態的false。然后通過$http.get,到指定的地方去取一個json文件,很顯然這是個假數據,我們把預設的用戶名和密碼存放到這個json 文件中。取出預設的用戶名和密碼之后就和用戶輸入的來進行對比,相信這都很簡單,大家肯定能看明白。如果用戶名和密碼都對上了,那么就把登錄狀態設置為 true,登錄成功也設置為true。然后用$state的go方法跳轉到Index頁面。

    如果登錄信息驗證失敗,那么就把showError賦為true,頁面上就會顯示提示信息咯。

----------------------------------------------------------------------------

    怎 么樣,很簡單吧。當然還有其它實現這一功能的方法,而且我上述的方法很可能還有諸多安全隱患,而且模塊的分工也是不明確的,淡然實際部署不推薦這么寫了。 我們可以優化改進的地方很多,比如驗證的模塊是不是應該獨立出去呢,或者用戶有沒有什么辦法能輕易繞過這個登錄保護呢?這就留待小伙伴們自己探究了……繼 續學習angular去了,大家晚安!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM