위 챗 애플 릿 페이지 차단기 의 예제 코드

장면
  • 애플 릿 은 52 개의 페이지 가 있 는데 그 중에서 13 개의 페이지 는 신분 이 필요 없고 다른 39 개의 페이지 는 시스템 역할 이 필요 하 다.이 39 페이지 에 대해 위 챗 사용자 가 시스템 역할 이 없 으 면 로그 인 페이지 로 이동 합 니 다.
  • 시스템 캐릭터 정 보 는 비동기 요청 을 통 해 얻 을 수 있 습 니까?
  • 수요 분석&실현
    수 요 를 추상 적 으로 하 는 것 은 하나의 필터 입 니 다.작은 프로그램 페이지 의 방문 을 여과 하고 조건 에 부합 되 는 통과,조건 에 부합 되 지 않 는 다른 처 리 를 하 는 것 입 니 다.
    php 를 사용 한 laravel 프레임 의 동 화 는 laravel 프레임 의 http 미들웨어 를 단번에 연상 시 킬 것 입 니 다.
    HTTP 미들웨어 는 프로그램 에 들 어 가 는 HTTP 요청 을 걸 러 내 는 편리 한 메커니즘 을 제공 합 니 다.예 를 들 어 Laravel 은 기본적으로 미들웨어 를 포함 하여 사용자 인증 을 검증 합 니 다.사용자 가 인증 을 거치 지 않 으 면 미들웨어 는 사용자 가 로그 인 페이지 를 안내 합 니 다.그러나 사용자 가 인증 을 통과 하면 미들웨어 는 이 요청 을 계속 진행 할 수 있 습 니 다.물론 인증 을 제외 하고 미들웨어 도 다양한 작업 을 수행 할 수 있 습 니 다.CORS 미들웨어 는 프로그램 을 떠 날 모든 응답 을 대신 하여 적당 한 응답 헤드 를 추가 하고 로그 미들웨어 는 프로그램 에 들 어 오 는 모든 요청 을 기록 할 수 있 습 니 다.
    걱정 스 러 운 것 은 위 챗 애플 릿 이 페이지 인 스 턴 스 를 위 한 미들웨어 체 제 를 제공 하지 않 았 다 는 점 이다.그래서 페이지 실례 의 생명주기 부터 시작 할 수 밖 에 없다.

    onLoad 에 대해 서 는 한 페이지 가 한 번 만 호출 됩 니 다.onShow 에 대해 서 는 페이지 를 열 때마다 한 번 씩 호출 합 니 다.
    onLoad 나 onShow 갈고리 함수 에서 사용자 의 신분 을 검사 하고 통과 한 후에 이 페이지 에 필요 한 데 이 터 를 끌 어 옵 니 다.그렇지 않 으 면 로그 인 페이지 로 이동 합 니 다.
    
    //orderDetail.js
    onShow: function () {
      let that = this;
      //    
      service.identityCheck(() => {
         //      
         wx.redirectTo({
          url: "/pages/common/login/login"
         });
        }, () => {  
         //           
         that.getDetail(this.orderId);
         ...
        }
      );
     },
    
    하지만 페이지 마다 이렇게 써 야 합 니 다.중복 코드 가 많 고 침입 성도 강 합 니 다.장식 함수 로 포장 하 는 것 이 좋 습 니 다.
    
    //filter.js
    function identityFilter(pageObj){
      if(pageObj.onShow){
        let _onShow = pageObj.onShow;
        pageObj.onShow = function(){
          service.identityCheck(()=>{
            //      
            wx.redirectTo({
              url: "/pages/common/login/login"
            });
          },()=>{
            //      ,  this  
            let currentInstance = getPageInstance();
            _onShow.call(currentInstance);
          });
        }
      }
      return pageObj;
    }
    
    function getPageInstance(){
      var pages = getCurrentPages();
      return pages[pages.length - 1];
    }
    
    exports.identityFilter = identityFilter;
    
    filter.js필 터 를 제공 하 는 방법 으로 기 존의 사용자 신분 차단 을 제외 하고 나중에 다른 차단 이 필요 하면 이 파일 에 추가 할 수 있 습 니 다.그리고 사용자 신분 차단 이 필요 한 애플 릿 페이지 코드 에서filter.identityFilter로 처리 하면 됩 니 다.
    
    //orderDetail.js
    let filter = require('filter.js');
    Page(filter.identityFilter({
      ...
      onShow: function () {
        //        
        this.getDetail(this.orderId);
        //...
      },
      ...
    }));
    
    Promise 로 최적화
    위의 구현 에 서 는 페이지 를 방문 할 때마다 사용자 의 신분 을 가 져 오 는 방법 을 한 번 씩 실행 합 니 다(바로 위의 코드 에 있 는 service.idenity Check).사실 필요 없어 요.애플 릿 이 시 작 될 때 한 번 만 가 져 오 면 돼 요.app.js 의 onLaunch 방법 에 넣 어 실행 하 는 것 이다.
    모든 애플 릿 페이지 가 예화 되 었 을 때,일반적으로 비동기 적 인 방법 을 실행 하여 페이지 에 필요 한 데 이 터 를 가 져 옵 니 다.문 제 는 페이지 의 비동기 방법 이 사용자 신분 을 가 져 오 는 비동기 요청 후에 실행 되 어야 한 다 는 것 을 보증 해 야 한 다 는 것 이다.
    Promise 는 비동기 요청 의 실행 순 서 를 가장 잘 처리 한 다 는 것 은 의심 할 여지 가 없다.주인님,빨리 코드 를 넣 으 세 요.
    
    //app.js
    App({
      onLaunch:function(){
        let p = new Promise(function(resolve,reject){
          service.identityCheck(resolve,reject);
        });
        this.globalData.promise = p; 
      },
      ...
      globalData: {
        promise:null,
      }  
    });
    
    
    //filter.js
    const appData = getApp().globalData;
    function identityFilter(pageObj){
      if(pageObj.onShow){
        let _onShow = pageObj.onShow;
        pageObj.onShow = function(){
          //   
          appData.promise.then(()=>{
            //      
            wx.redirectTo({
              url: "/pages/common/login/login"
            });
          },()=>{
            //      ,  this  
            let currentInstance = getPageInstance();
            _onShow.call(currentInstance);
          });
        }
      }
      return pageObj;
    }
    
    작은 매듭
    기본적으로 애플 릿 페이지 의 사용자 신분 차단 기 를 실현 하 였 으 나,laravel 의 http 미들웨어 보다 약간 뒤떨어진다.
  • 각 페이지 코드 를 한 층 씩 포장 해 야 합 니 다.
  • 사용자 인증 이 통과 되 지 않 아 도 애플 릿 은 페이지 의 렌 더 링 을 막 지 않 습 니 다.사용자 신분 을 가 져 오 는 비동기 방법 이 1 분 만 에 실행 된다 면 애플 릿 페이지 는 보 여 주 며 1 분 후에 야 로그 인 페이지 로 넘 어 갑 니 다.1 분 안에 페이지 에 빈 내용 을 보 여 주 는 등 논 리 를 스스로 늘 려 야 합 니 다.
  • 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기