91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信小程序常用簡易小函數總結

發布時間:2020-08-20 08:53:38 來源:腳本之家 閱讀:197 作者:trouble-i-am-in 欄目:web開發

本文實例講述了微信小程序常用簡易小函數。分享給大家供大家參考,具體如下:

最近一直在寫微信小程序,而且由于是第二次寫了,所以針對很多通用的情況封裝了一些函數,建議你們放在app.js中,方便全局去調用。

提示類函數

微信有一種原生的API用于顯示提示類結果的wx.showToast,而且其中的圖片是可以自定義的,所以為了保證全部一致性,而且方便調用,所以我將其全部封裝在了app.js中:

// 成功
showSuccess: function (message) {
    wx.showToast({
      title: message,
      duration: 2000,
      image: "/images/Common/Success.png",
    })
  },
// 錯誤
showError: function (message) {
    wx.showToast({
      title: message,
      duration: 2000,
      image: "/images/Common/Error.png",
    })
  },
// 警告
showWarn: function (message) {
    wx.showToast({
      title: message,
      duration: 2000,
      image: "/images/Common/Warn.png",
    })
  }

注意上面的duration參數,這個在下面的情況中是一個很重要的問題。

假設一般的操作是對一個頁面的操作完成后接著顯示處理結果,最后進行跳轉。所以這里就存在一個問題,假設使用上面的彈出框進行顯示,那么在彈出框顯示之前就會進行跳轉,這樣處理結果就顯示不全了,所以合理的做法是在彈出框結束后進行跳轉。而如果將跳轉單獨封裝在各個頁面中,那么到時候進行時間長短的處理就很麻煩了,所以我將這個函數進行了封裝:

// 第一個是路由,第二個則是判斷是否是tabbar的路由,跳這兩個路由是不一致的
completeOperating:function(to,isTabbar){
    var time=setTimeout(function(){
      if(isTabbar===true){
        wx.switchTab({
          url:to
        })
      }else{
        wx.navigateTo({
         url: to
        })
      }
      clearTimeout(time);
    },2000)
}

還有一種情況就是我們開始將數據返回給后端,這個時候最好給用戶一個加載中的提示,而這個提示可以使用wx.showLoadding來做:

// 提示用戶數據保存中
startOperating:function(info){
    wx.showLoading({
      title:info,
      mask:true
    })
  }

當后端返回結果后。則將加載框進行隱藏:

stopOperating:function(){
    wx.hideLoading();
  }

登錄類問題

微信小程序不支持session,這個是前提,所以我們沒辦法在后端使用session來進行用戶身份的區分。我的解決思路是這樣的,在項目的入口文件app.js中的onLaunch函數中,即在用戶開啟小程序后調用wx.login()函數獲取用戶的唯一微信標志code,接著將該標志傳回后端,調用微信的統一API,獲取用戶在該微信小程序中的唯一標識,注意,即使是同一個用戶,在不同的微信小程序中標識也是不一樣的。

獲取該標識后,后端調用緩存將該標識緩存起來,時間也不用擔心,由于寫在app.js中,所以每次啟動都會去詢問后端,后端做相應的登錄更新處理就可以了。

實際前端代碼

// app.js
APP({
 onLaunch:function(){
  this.login();
 },
 login:function(){
  // 我喜歡把域名保存在globalData中,這樣即使后期修改了域名,也不用到每個文件中去改
  var that=this;
  wx.login({
   success:function(res){
    // 這里獲取標識
    var code=res.code;
    // 將該標識傳遞給后端
    wx.request({
     url:that.globalData.url+"/home/login/login?code="+code,
     success:function(res){
      // 假設后端返回一個session_key作為改用戶的唯一標識,所有請求都需要攜帶該參數
      var session_key=res.data.session_key;
      // 調用全局緩存來保存該值
      wx.setStorageSync('session_key', session_key);
     },
     fail:function(error){
      // 寫這么一個函數,是幫助自己后期出現問題時可以進行修復
      console.error("調用微信登錄接口錯誤");
      console.log(error);
     }
    })
   }
  })
 },
 globalData:{
  url:"http://yourdomain.com"
 }
})

實際后端代碼

class LoginController extends Controller{
 // 你的小程序唯一標識
 private $appid="";
 private $secrect="";
 public function login(){
  // 獲取前端傳遞過來的code
  $code=$_GET['code'];
  // 調用微信的統一API
  $baseUrl="https://api.weixin.qq.com/sns/jscode2session?appid={$this->appid}&secret={$this->secrect}&js_code={$code}&grant_type=authorization_code";
  // 微信返回結果處理
  $result=curl_get_contents($baseUrl);
  $user=json_decode($result,true);
  if($user['error_code']){
   // 這里是調用錯誤的函數,如何解決看你自己的業務邏輯
   exit();
  }
  // 該用戶在你小程序中的唯一標識
  $openid=$user['openid'];
  // 判斷是新用戶還是老用戶
  $userInfo=M('User')->where(array('openid'=>$openid))->find();
  if($userInfo){
   // 老用戶
   $user_id=$userInfo['id'];
   $session_key=$this->getSessionKey($openid,$user_id);
  }else{
   // 新用戶則將其保存進數據庫中
   $user_id=M("User")->add(array('openid'=>$openid));
   $session_key=$this->getSessionKey($openid,$user_id);
  }
  // 緩存起來,至于有效期最好長一點,以防止用戶在使用過程中突然不能訪問數據,我這里是使用tp框架的S()函數進行存儲的
  S($session_key,$user_id);
  // 以后只需要用戶傳遞過來$session_key就可以根據緩存獲取用戶身份了
  // 將結果發送給前端
  $this->ajaxReturn(array(
    'session_key'=>$session_key
  ));
 }
 // 生成用戶的session_key
 private function getSessionKey($openid,$user_id){
  $key="可以說是你的密鑰吧";
  return hash("md5",$key.$openid.$user_id);
 }
}

當然這里我只是保存了$user_id,如果你需要更多信息可以考慮使用redis,memcached等進行長期緩存,反正每次產生的$session_key都是一樣的。

Session_key使用例子

上面我們獲取了session_key并在前后端進行了保存,接下來就是如何使用該session_key了。

后端驗證

關于CommonContrller的原理請看之前的一篇博客:tp框架的RBAC實現

class CommonController extends Controller{
 protected $user_id;
 public function ___initialize(){
  // 對用戶的session_key進行驗證
  $session_key=I("session_key");
  $user_id=S($session_key);
  if(!$user_id){
   // 該$session_key失效或者不合法
   $this->ajaxReturn(array('result'=>"請退出小程序重新登錄"));exit();
  }
  $this->user_id=$user_id;
 }
}

接著假設下面是你真正想要訪問的方法

class IndexController extends CommonController{
 public function(){
  // 假設這里你需要獲取當前用戶的id,只需要直接調用父類中的屬性就可以了
  $user_id=$this->user_id;
 }
}

上面我們就借用了我們生成的session_key配合上緩存模擬了session的驗證機制,希望對你們有用。

前端實現

getData:function(){
 // 從緩存中獲取session_key,并將其傳遞給后端,做用戶身份的確認
 var session_key=wx.getStorageSync('session_key');
 wx.request({
  url:app.globalData.url+"/home/index/index?session_key="+session_key,
  success:function(res){
   //
  }
 })
}

前置頁面做優化

上面我們是在app.js的onLaunch中直接調用登錄函數,但是這樣卻存在一個問題,那就是登錄沒有完成,就跳轉到入口的page中,接著由于session_key還沒有生成,導致頁面數據請求失敗。我當時就是遇到了這個問題,所以我把入口的page設置成了前置頁面,并在前置頁面中添加了下面的函數:

onLoad: function (options) {
    var time=setInterval(function(){
      var session_key=wx.getStorageSync('session_key');
      // 只有當session_key存在時,才跳轉到首頁去,保證請求數據的有效性,否則就在前置頁面暫留一會
      if(session_key.length>5){
        wx.switchTab({
          url:"/pages/index/index"
        })
        clearInterval(time);
      }
    },1000);
}

希望本文所述對大家微信小程序開發有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

措勤县| 若尔盖县| 沭阳县| 高安市| 隆回县| 和林格尔县| 沾益县| 卢氏县| 平定县| 昭平县| 新疆| 旬邑县| 徐州市| 绥德县| 淮南市| 桂林市| 轮台县| 和硕县| 屯留县| 沙河市| 乐安县| 三门县| 绥芬河市| 菏泽市| 安远县| 永安市| 高碑店市| 鞍山市| 边坝县| 永城市| 永济市| 雷州市| 乌恰县| 灌阳县| 页游| 竹溪县| 龙胜| 尤溪县| 沅陵县| 中江县| 琼结县|