国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程序 小程序開發(fā) 淺析小程序怎么實現(xiàn)登錄功能

淺析小程序怎么實現(xiàn)登錄功能

Dec 06, 2021 am 10:11 AM
小程序 登錄

小程序怎么實現(xiàn)登錄功能?本篇文章給大家介紹一下小程序登錄的正確打開方式,希望對大家有所幫助!

淺析小程序怎么實現(xiàn)登錄功能

小程序網(wǎng)絡組件

https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html

RequestTask說明

方法 說明
RequestTask.abort() 中斷請求任務。
RequestTask.onHeadersReceived(function callback) 監(jiān)聽 HTTP Response Header 事件。會比請求完成事件更早。
RequestTask.offHeadersReceived(function callback) 取消監(jiān)聽 HTTP Response Header 事件。
RequestTask.onChunkReceived(function callback) 監(jiān)聽 Transfer-Encoding Chunk Received 事件。當接收到新的chunk時觸發(fā)。
RequestTask.offChunkReceived(function callback) 取消監(jiān)聽 Transfer-Encoding Chunk Received 事件。

wx.request(Object object)屬性

此處只列比較常用的屬性,全部屬性請查看鏈接

屬性 類型 默認值 必填 說明
url string
開發(fā)者服務器接口地址
data string/object/ArrayBuffer
請求的參數(shù)
header Object
設置請求的 header,header 中不能設置 Referer。 content-type 默認為 application/json
timeout number
超時時間,單位為毫秒
method string GET HTTP 請求方法
success function
接口調(diào)用成功的回調(diào)函數(shù)
fail function
接口調(diào)用失敗的回調(diào)函數(shù)
complete function
接口調(diào)用結束的回調(diào)函數(shù)(調(diào)用成功、失敗都會執(zhí)行)哪怕是abort掉的請求!

總結一下:所有的小程序接口基本上都有兩個特征:

  • 參數(shù)都是一個對象。便于記憶的同時方便擴展。

  • 都有相同的結果處理方式:都有success、fail、complete三個回調(diào)屬性。

接口執(zhí)行的各種情況下的errMsg對象介紹。

回調(diào)屬性 errMsg對象
success {errMsg:"request:ok"...}
fail {errMsg:"request:fail "...} 有的系統(tǒng)這個fail后面有個空格,所以要使用這個判斷,最好是使用正則表達式。也可以使用indexOf函數(shù),大于-1進行判斷。
abort {errMsg:"request:fail abort"...}

示例代碼

  let reqTask = wx.request({
      url: getApp().globalData.api,
      success(res) {
        if (res.errMsg === "request:ok") console.log("res", res);
      },
      fail(err) {
        // if(err.errMsg.indexOf('request:fail')>-1) console.log('err', err);
        if (/^request:fail/i.test(err.errMsg)) console.log("err", err);
      },
      complete(res) {
        console.log("resOrErr", res);
      },
    });
   const reqTaskOnHeadersReceived = (headers) => {
      reqTask.offHeadersReceived(reqTaskOnHeadersReceived);
      console.log("headers", headers);
      // 由于請求還未完全結束,所以我們沒辦法獲得請求的狀態(tài)碼,但是我們可以通過返回的requestBody的長度來進行判斷。
      // 兩點說明:1. 兩個~~可以把字符串數(shù)字快速轉化為數(shù)字。
      // 2. 為什么取小于19,是由于后臺返回沒有權限的requestBody的時候Content-length為“18”,正常情況下是大于19的。所以具體多少得看一下具體情況。
      if (~~headers.header["Content-length"] < 19) reqTask.abort();
    };
    reqTask.onHeadersReceived(reqTaskOnHeadersReceived);

小程序登錄接口

  • wx.getUserProfile(Object object)

    獲取用戶信息。頁面產(chǎn)生點擊事件(例如 buttonbindtap 的回調(diào)中)后才可調(diào)用,每次請求都會彈出授權窗口,用戶同意后返回 userInfo。該接口用于替換 wx.getUserInfo,詳見 用戶信息接口調(diào)整說明。

  • wx.checkSession(Object object)

    檢查登錄態(tài)是否過期。 通過 wx.login 接口獲得的用戶登錄態(tài)擁有一定的時效性。用戶越久未使用小程序,用戶登錄態(tài)越有可能失效。反之如果用戶一直在使用小程序,則用戶登錄態(tài)一直保持有效。具體時效邏輯由微信維護,對開發(fā)者透明。開發(fā)者只需要調(diào)用 wx.checkSession 接口檢測當前用戶登錄態(tài)是否有效。

    登錄態(tài)過期后開發(fā)者可以再調(diào)用 wx.login 獲取新的用戶登錄態(tài)。調(diào)用成功說明當前 session_key 未過期,調(diào)用失敗說明 session_key 已過期。更多使用方法詳見 小程序登錄

  • wx.login(Object object)

    調(diào)用接口獲取登錄憑證(code)。通過憑證進而換取用戶登錄態(tài)信息,包括用戶在當前小程序的唯一標識(openid)、微信開放平臺帳號下的唯一標識(unionid,若當前小程序已綁定到微信開放平臺帳號)及本次登錄的會話密鑰(session_key)等。用戶數(shù)據(jù)的加解密通訊需要依賴會話密鑰完成。更多使用方法詳見 小程序登錄。

后端登錄接口代碼實現(xiàn)

后端使用NodeJS,web框架KOA版本^2.13.4,路由框架@koa/router版本^10.1.1,框架request,版本 ^2.88.2,jsonwebtoken用來加密解密token信息,版本^8.5.1

// app.js
const Koa = require("koa");
const Router = require("@koa/router");
const WeixinAuth = require("./lib/koa2-weixin-auth");
const jsonwebtoken = require("jsonwebtoken");

const app = new Koa();
// 小程序機票信息
const miniProgramAppId = "*********";
const miniProgramAppSecret = "***********";
const weixinAuth = new WeixinAuth(miniProgramAppId, miniProgramAppSecret);

const JWT_SECRET = "JWTSECRET";
// 路由中間件需要安裝@koa/router
// 開啟一個帶群組的路由
const router = new Router({
  prefix: "/user",
});
// 這是正規(guī)的登陸方法
// 添加一個參數(shù),sessionKeyIsValid,代表sessionKey是否還有效
router.post("/weixin-login", async (ctx) => {
  let { code, userInfo, encryptedData, iv, sessionKeyIsValid } =
    ctx.request.body;
   // 解析openid
  const token = await weixinAuth.getAccessToken(code);
  userInfo.openid = token.data.openid;
  // 這里可以自己進行處理,比方說記錄到數(shù)據(jù)庫,處理token等
  let authorizationToken = jsonwebtoken.sign(
    { name: userInfo.nickName },
    JWT_SECRET,
    { expiresIn: "1d" }
  );
  Object.assign(userInfo, { authorizationToken });
  ctx.status = 200;
  ctx.body = {
    code: 200,
    msg: "ok",
    data: userInfo,
  };
});
// lib/koa2-weixin-auth.js
const querystring = require("querystring");
const request = require("request");

const AccessToken = function (data) {
  if (!(this instanceof AccessToken)) {
    return new AccessToken(data);
  }
  this.data = data;
};

/*!
 * 檢查AccessToken是否有效,檢查規(guī)則為當前時間和過期時間進行對比
 *
 * Examples:
 * ```
 * token.isValid();
 * ```
 */
AccessToken.prototype.isValid = function () {
  return (
    !!this.data.session_key &&
    new Date().getTime() < this.data.create_at + this.data.expires_in * 1000
  );
};

/**
 * 根據(jù)appid和appsecret創(chuàng)建OAuth接口的構造函數(shù)
 * 如需跨進程跨機器進行操作,access token需要進行全局維護
 * 使用使用token的優(yōu)先級是:
 *
 * 1. 使用當前緩存的token對象
 * 2. 調(diào)用開發(fā)傳入的獲取token的異步方法,獲得token之后使用(并緩存它)。

 * Examples:
 * ```
 * var OAuth = require(&#39;oauth&#39;);
 * var api = new OAuth(&#39;appid&#39;, &#39;secret&#39;);
 * ```
 * @param {String} appid 在公眾平臺上申請得到的appid
 * @param {String} appsecret 在公眾平臺上申請得到的app secret
 */
const Auth = function (appid, appsecret) {
  this.appid = appid;
  this.appsecret = appsecret;
  this.store = {};

  this.getToken = function (openid) {
    return this.store[openid];
  };

  this.saveToken = function (openid, token) {
    this.store[openid] = token;
  };
};

/**
 * 獲取授權頁面的URL地址
 * @param {String} redirect 授權后要跳轉的地址
 * @param {String} state 開發(fā)者可提供的數(shù)據(jù)
 * @param {String} scope 作用范圍,值為snsapi_userinfo和snsapi_base,前者用于彈出,后者用于跳轉
 */
Auth.prototype.getAuthorizeURL = function (redirect_uri, scope, state) {
  return new Promise((resolve, reject) => {
    const url = "https://open.weixin.qq.com/connect/oauth2/authorize";
    let info = {
      appid: this.appid,
      redirect_uri: redirect_uri,
      scope: scope || "snsapi_base",
      state: state || "",
      response_type: "code",
    };
    resolve(url + "?" + querystring.stringify(info) + "#wechat_redirect");
  });
};

/*!
 * 處理token,更新過期時間
 */
Auth.prototype.processToken = function (data) {
  data.create_at = new Date().getTime();
  // 存儲token
  this.saveToken(data.openid, data);
  return AccessToken(data);
};

/**
 * 根據(jù)授權獲取到的code,換取access token和openid
 * 獲取openid之后,可以調(diào)用`wechat.API`來獲取更多信息
 * @param {String} code 授權獲取到的code
 */
Auth.prototype.getAccessToken = function (code) {
  return new Promise((resolve, reject) => {
    const url = "https://api.weixin.qq.com/sns/jscode2session";
    //由于此框架版本很久沒有更新了,此處地址發(fā)生了變化,需要修改為以上地址,不然會出現(xiàn)
    //41008錯誤。這也是沒有直接使用框架,引用本地使用的原因。
    // const url = "https://api.weixin.qq.com/sns/oauth2/access_token";
    const info = {
      appid: this.appid,
      secret: this.appsecret,
      js_code: code,
      grant_type: "authorization_code",
    };
    request.post(url, { form: info }, (err, res, body) => {
      if (err) {
        reject(err);
      } else {
        const data = JSON.parse(body);
        resolve(this.processToken(data));
      }
    });
  });
};

/**
 * 根據(jù)refresh token,刷新access token,調(diào)用getAccessToken后才有效
 * @param {String} refreshToken refreshToken
 */
Auth.prototype.refreshAccessToken = function (refreshToken) {
  return new Promise((resolve, reject) => {
    const url = "https://api.weixin.qq.com/sns/oauth2/refresh_token";
    var info = {
      appid: this.appid,
      grant_type: "refresh_token",
      refresh_token: refreshToken,
    };
    request.post(url, { form: info }, (err, res, body) => {
      if (err) {
        reject(err);
      } else {
        const data = JSON.parse(body);
        resolve(this.processToken(data));
      }
    });
  });
};

/**
 * 根據(jù)openid,獲取用戶信息。
 * 當access token無效時,自動通過refresh token獲取新的access token。然后再獲取用戶信息
 * @param {Object|String} options 傳入openid或者參見Options
 */
Auth.prototype.getUser = async function (openid) {
  const data = this.getToken(openid);
  console.log("getUser", data);
  if (!data) {
    var error = new Error(
      "No token for " + options.openid + ", please authorize first."
    );
    error.name = "NoOAuthTokenError";
    throw error;
  }
  const token = AccessToken(data);
  var accessToken;
  if (token.isValid()) {
    accessToken = token.data.session_key;
  } else {
    var newToken = await this.refreshAccessToken(token.data.refresh_token);
    accessToken = newToken.data.session_key;
  }
  console.log("accessToken", accessToken);
  return await this._getUser(openid, accessToken);
};

Auth.prototype._getUser = function (openid, accessToken, lang) {
  return new Promise((resolve, reject) => {
    const url = "https://api.weixin.qq.com/sns/userinfo";
    const info = {
      access_token: accessToken,
      openid: openid,
      lang: lang || "zh_CN",
    };
    request.post(url, { form: info }, (err, res, body) => {
      if (err) {
        reject(err);
      } else {
        resolve(JSON.parse(body));
      }
    });
  });
};

/**
 * 根據(jù)code,獲取用戶信息。
 * @param {String} code 授權獲取到的code
 */
Auth.prototype.getUserByCode = async function (code) {
  const token = await this.getAccessToken(code);
  return await this.getUser(token.data.openid);
};

module.exports = Auth;

小程序端登錄代碼實現(xiàn)

<!--pages/index.wxml-->
<view class="page-section">
    <text class="page-section__title">微信登錄</text>
    <view class="btn-area">
        <button  bindtap="getUserProfile" type="primary">登錄</button>
    </view>
</view>
// pages/index.js
Page({
  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {},
  // 正確的登錄方式
  getUserProfile() {
    // 推薦使用wx.getUserProfile獲取用戶信息,開發(fā)者每次通過該接口獲取用戶個人信息均需用戶確認
    // 開發(fā)者妥善保管用戶快速填寫的頭像昵稱,避免重復彈窗
    wx.getUserProfile({
      desc: "用于完善會員資料", // 聲明獲取用戶個人信息后的用途,后續(xù)會展示在彈窗中,請謹慎填寫
      success: (res) => {
        let { userInfo, encryptedData, iv } = res;
        const requestLoginApi = (code) => {
          // 發(fā)起網(wǎng)絡請求
          wx.request({
            url: "http://localhost:3000/user/weixin-login",
            method: "POST",
            header: {
              "content-type": "application/json",
            },
            data: {
              code,
              userInfo,
              encryptedData,
              iv,
            },
            success(res) {
              console.log("請求成功", res.data);
              let token = res.data.data.authorizationToken;
              wx.setStorageSync("token", token);
              onUserLogin(token);
              console.log("authorization", token);
            },
            fail(err) {
              console.log("請求異常", err);
            },
          });
        };
        const onUserLogin = (token) => {
          getApp().globalData.token = token;
          wx.showToast({
            title: "登錄成功了",
          });
        };
        //必須進行session是否過期檢查,不然會出現(xiàn)第一次點擊登錄,服務器報Illegal Buffer
        //的錯誤,但是第二次點擊登錄正常。
        wx.checkSession({
          success: (res) => {
            // session_key 未過期,并且在本生命周期一直有效
            console.log("在登陸中");
            let token = wx.getStorageSync("token");
            if (token) onUserLogin(token);
          },
          fail: (res) => {
            // session_key已經(jīng)失效,需要重新執(zhí)行登錄流程
            wx.login({
              success(res0) {
                if (res0.code) {
                  requestLoginApi(res0.code);
                } else {
                  console.log("登錄失敗!" + res0.errMsg);
                }
              },
            });
          },
        });
      },
    });
  },
});

針對登錄代碼可以做哪些優(yōu)化?

對于一個軟件,就代碼層面而言,需要追求最基本的幾個方面(遠不止這些,但是先姑且先做個好這些吧):

  • 可維護性(maintainability)

    所謂的“維護”無外乎就是修改 bug、修改老的代碼、添加新的代碼之類的工作。所謂“代碼易維護”就是指,在不破壞原有代碼設計、不引入新的 bug 的情況下,能夠快速地修改或者添加代碼。所謂“代碼不易維護”就是指,修改或者添加代碼需要冒著極大的引入新 bug 的風險,并且需要花費很長的時間才能完成。

  • 可讀性(readability)

    軟件設計大師 Martin Fowler 曾經(jīng)說過:“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”翻譯成中文就是:“任何傻瓜都會編寫計算機能理解的代碼。好的程序員能夠編寫人能夠理解的代碼?!盙oogle 內(nèi)部甚至專門有個認證就叫作 Readability。只有拿到這個認證的工程師,才有資格在 code review 的時候,批準別人提交代碼。可見代碼的可讀性有多重要,畢竟,代碼被閱讀的次數(shù)遠遠超過被編寫和執(zhí)行的次數(shù)。我們需要看代碼是否符合編碼規(guī)范、命名是否達意、注釋是否詳盡、函數(shù)是否長短合適、模塊劃分是否清晰、是否符合高內(nèi)聚低耦合等等。

  • 可擴展性(extensibility)

    可擴展性也是一個評價代碼質(zhì)量非常重要的標準。代碼預留了一些功能擴展點,你可以把新功能代碼,直接插到擴展點上,而不需要因為要添加一個功能而大動干戈,改動大量的原始代碼。

  • 可復用性(reusability)

    代碼的可復用性可以簡單地理解為,盡量減少重復代碼的編寫,復用已有的代碼。

那么接下來就來優(yōu)化一下代碼吧:

模塊化

可以把登錄的代碼模塊化,代碼如下:

// lib/login.js
function loginWithCallback(cb) {
  // 推薦使用wx.getUserProfile獲取用戶信息,開發(fā)者每次通過該接口獲取用戶個人信息均需用戶確認
  // 開發(fā)者妥善保管用戶快速填寫的頭像昵稱,避免重復彈窗
  wx.getUserProfile({
    desc: "用于完善會員資料", // 聲明獲取用戶個人信息后的用途,后續(xù)會展示在彈窗中,請謹慎填寫
    success: (res) => {
      let { userInfo, encryptedData, iv } = res;
      const requestLoginApi = (code) => {
        // 發(fā)起網(wǎng)絡請求
        wx.request({
          url: "http://localhost:3000/user/weixin-login",
          method: "POST",
          header: {
            "content-type": "application/json",
          },
          data: {
            code,
            userInfo,
            encryptedData,
            iv,
          },
          success(res) {
            console.log("請求成功", res.data);
            let token = res.data.data.authorizationToken;
            wx.setStorageSync("token", token);
            onUserLogin(token);
            console.log("authorization", token);
          },
          fail(err) {
            console.log("請求異常", err);
          },
        });
      };

      const onUserLogin = (token) => {
        getApp().globalData.token = token;
        wx.showToast({
          title: "登錄成功了",
        });
        if (cb && typeof cb == "function") cb(token);
      };
      wx.checkSession({
        success: (res) => {
          // session_key 未過期,并且在本生命周期一直有效
          console.log("在登陸中");
          let token = wx.getStorageSync("token");
          if (token) onUserLogin(token);
        },
        fail: (res) => {
          // session_key已經(jīng)失效,需要重新執(zhí)行登錄流程
          wx.login({
            success(res0) {
              if (res0.code) {
                requestLoginApi(res0.code);
              } else {
                console.log("登錄失敗!" + res0.errMsg);
              }
            },
          });
        },
      });
    },
  });
}

export default loginWithCallback;

Promise化

回調(diào)地獄問題,不利于代碼的閱讀,所以接下來我們基于Promise進行代碼優(yōu)化。有了 Promise 對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調(diào)函數(shù)。此外,Promise 對象提供統(tǒng)一的接口,使得控制異步操作更加容易。

Promise的幾個方法簡介

方法名說明
Promise.prototype.then方法返回的是一個新的 Promise 對象,因此可以采用鏈式寫法。這種設計使得嵌套的異步操作,可以被很容易得改寫,從回調(diào)函數(shù)的"橫向發(fā)展"改為"向下發(fā)展"。
Promise.prototype.catch是 Promise.prototype.then(null, rejection) 的別名,用于指定發(fā)生錯誤時的回調(diào)函數(shù)。Promise 對象的錯誤具有"冒泡"性質(zhì),會一直向后傳遞,直到被捕獲為止。也就是說,錯誤總是會被下一個 catch 語句捕獲。
Promise.prototype.finally方法返回一個Promise。在promise結束時,無論結果是fulfilled或者是rejected,都會執(zhí)行指定的回調(diào)函數(shù)。這為在Promise是否成功完成后都需要執(zhí)行的代碼提供了一種方式。
Promise.all這避免了同樣的語句需要在then()catch()中各寫一次的情況。Promise.all 方法用于將多個 Promise 實例,包裝成一個新的 Promise 實例。Promise.all 方法接受一個數(shù)組作為參數(shù),var p = Promise.all([p1,p2,p3]);p1、p2、p3 都是 Promise 對象的實例。(Promise.all 方法的參數(shù)不一定是數(shù)組,但是必須具有 iterator 接口,且返回的每個成員都是 Promise 實例。)p 的狀態(tài)由 p1、p2、p3 決定,分成兩種情況。 (1)只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會變成fulfilled,此時p1、p2、p3的返回值組成一個數(shù)組,傳遞給p的回調(diào)函數(shù)。 (2)只要p1、p2、p3之中有一個被rejected,p的狀態(tài)就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調(diào)函數(shù)。
Promise.racePromise.race 方法同樣是將多個 Promise 實例,包裝成一個新的 Promise 實例。var p = Promise.race([p1,p2,p3]);上面代碼中,只要p1、p2、p3之中有一個實例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個率先改變的Promise實例的返回值,就傳遞給p的返回值。
Promise.any接收一個Promise可迭代對象,只要其中的一個 promise 成功,就返回那個已經(jīng)成功的 promise 。所有子實例都處于rejected狀態(tài),總的promise才處于rejected狀態(tài)。
Promise.allSettled返回一個在所有給定的promise都已經(jīng)fulfilledrejected后的promise,并帶有一個對象數(shù)組,每個對象表示對應的promise結果。相比之下,Promise.all() 更適合彼此相互依賴或者在其中任何一個reject時立即結束。

小程序API接口Promise化并且把需要登錄的調(diào)用接口模塊化

1、安裝插件。請先查看npm支持文檔。

npm install --save miniprogram-api-promise

2、在微信開發(fā)者工具右方詳情中勾選使用npm模塊,并在菜單欄工具中點擊構建npm。

3、初始化代碼。

// app.js
import {promisifyAll} from &#39;miniprogram-api-promise&#39;
import login from "../lib/login";
const wxp ={}
promisifyAll(wx,wxp)
// 需要token的請求統(tǒng)一處理登錄和設置header,并且處理錯誤信息
wxp.requestNeedLogin = async function (args) {
  let token = wx.getStorageSync("token");
  if (!token) {
    token = await loginWithPromise();
  }
  if (!args.header) args.header = {};
  args.header["Authorization"] = `Bearer ${token}`;
  return wxp.request(args).catch(console.error);
};
// app.js
App({
  wxp:wxp,
});

4、改寫login.js代碼

// lib/login.js
function login() {
  return new Promise((resolve, reject) => {
    // 推薦使用wx.getUserProfile獲取用戶信息,開發(fā)者每次通過該接口獲取用戶個人信息均需用戶確認
    // 開發(fā)者妥善保管用戶快速填寫的頭像昵稱,避免重復彈窗
    wx.getUserProfile({
      desc: "用于完善會員資料", // 聲明獲取用戶個人信息后的用途,后續(xù)會展示在彈窗中,請謹慎填寫
       success:async (res0) => {
        let {
          userInfo,
          encryptedData,
          iv
        } = res0;
        const app = getApp();
        try {
          app.wxp.checkSession();
        } catch (err) {
          reject(err);
        }
        let token = wx.getStorageSync("token");
        if (!token) {
          let res1 = await app.wxp.login().catch(err => reject(err));
          let code = res1.code;
          let res = await app.wxp.request({
            url: "http://localhost:3000/user/weixin-login",
            method: "POST",
            header: {
              "content-type": "application/json",
            },
            data: {
              code,
              userInfo,
              encryptedData,
              iv,
            }
          }).catch(err => reject(err));
          token = res.data.data.authorizationToken;
          wx.setStorageSync("token", token);
          app.globalData.token = token;
          wx.showToast({
            title: "登錄成功了",
          });
          resolve(token);
        }
      },
    });
  })
}

export default login;

5、調(diào)用代碼

<view class="container page-head">
  <text class="page-section__title">需要登錄的請求調(diào)用</text>
  <view class="btn-area">
    <button bindtap="request1" type="primary">請求1</button>
    <button bindtap="request2" type="primary">請求2</button>
  </view>
</view>
// pages/index.js
Page({
  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {},
  request1() {
    getApp().wxp.requestNeedLogin({
        url: "http://localhost:3000/user/home?name=andying",
      }).then(console.log)
  },
  request2() {
    getApp().wxp.requestNeedLogin({
        url: "http://localhost:3000/user/home?name=eva",
      }).then(console.log)
  },
});

【相關學習推薦:小程序開發(fā)教程

以上是淺析小程序怎么實現(xiàn)登錄功能的詳細內(nèi)容。更多信息請關注PHP中文網(wǎng)其他相關文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

小紅書怎么登錄以前的賬號?它換綁后原來號丟失了怎么辦? 小紅書怎么登錄以前的賬號?它換綁后原來號丟失了怎么辦? Mar 21, 2024 pm 09:41 PM

隨著社交媒體的迅速發(fā)展,小紅書已經(jīng)成為許多年輕人分享生活、探索新產(chǎn)品的熱門平臺。在使用過程中,有時用戶可能會遇到登錄以前賬號的困難。本文將詳細探討如何解決小紅書登錄舊賬號的問題,以及如何應對更換綁定后可能遺失原賬號的情況。一、小紅書怎么登錄以前的賬號?1.找回密碼登錄如果長時間未登錄小紅書,可能導致賬號被系統(tǒng)回收。為了恢復訪問權限,你可以嘗試通過找回密碼的方式重新登錄賬號。操作步驟如下:(1)打開小紅書App或官網(wǎng),點擊“登錄”按鈕。(2)選擇“找回密碼”。(3)輸入你注冊賬號時所使用的手機號碼

wallpaperengine登錄別的號后下載別人的壁紙怎么辦 wallpaperengine登錄別的號后下載別人的壁紙怎么辦 Mar 19, 2024 pm 02:00 PM

當你在自己電腦上登過別人steam賬號之后,恰巧這個別人的賬號也有wallpaper軟件,切換回自己賬號之后steam就會自動下載別人賬號訂閱的壁紙,用戶可以通過關閉steam云同步解決。wallpaperengine登錄別的號后下載別人的壁紙怎么辦1、登陸你自己的steam賬號,在設置里面找到云同步,關閉steam云同步。2、登陸你之前登陸的別人的steam賬號,打開wallpaper創(chuàng)意工坊,找到訂閱內(nèi)容,然后取消全部訂閱。(以后防止找不到壁紙,可以先收藏再取消訂閱)3、切換回自己的stea

快手電腦版怎么登錄-快手電腦版的登錄方法 快手電腦版怎么登錄-快手電腦版的登錄方法 Mar 04, 2024 pm 03:30 PM

近日有一些小伙伴咨詢小編快手電腦版怎么登錄?下面就為大家?guī)砹丝焓蛛娔X版的登錄方法,有需要的小伙伴可以來了解了解哦。第一步:首先在電腦的瀏覽器上百度搜索快手官網(wǎng)。第二步:在搜索結果列表里面選取第一條。第三步:進入到快手官網(wǎng)主頁面后,點擊視頻的選項。第四步:點擊右上角的用戶頭像。第五步:在彈出的登錄菜單里面點擊二維碼登錄。第六步:之后打開手機上的快手,點擊左上角的圖標。第七步:點擊二維碼標志。第八步:在我的二維碼界面點擊右上角的掃描圖標之后,掃描電腦上的二維碼即可。第九步:最后電腦版的快手就登錄成

《陰陽師》茨木童子典藏皮膚登錄即領,禪心云外鏡新皮膚即將上線! 《陰陽師》茨木童子典藏皮膚登錄即領,禪心云外鏡新皮膚即將上線! Jan 05, 2024 am 10:42 AM

山野間萬鬼嘶鳴,隱沒兵刃交接之聲,越嶺奔赴而來的鬼將,心中戰(zhàn)意洶涌,以炎火為號,率百鬼沖鋒迎戰(zhàn)?!緹腱桶贌?茨木童子典藏皮膚上線】鬼角熾焰怒燃,鎏金眼眸迸發(fā)桀驁戰(zhàn)意,白玉甲片裝點戰(zhàn)袍,彰顯大妖不羈狂放的氣勢。雪白飄揚的袖擺上,赤焰攀附交織,金紋烙印其中,燃點一片緋艷妖異色彩。妖力凝聚而成的鬼火咆哮而至,烈焰令群巒為之震動,煉獄間歸來的妖鬼啊,一同懲戒進犯之人吧?!緦賱討B(tài)頭像框?熾焱百煉】【專屬插畫?焰火將魂】【傳記鑒賞】【獲取方式】茨木童子典藏皮膚·熾焱百煉將于12月28日維護后上架皮膚商店,

Discuz后臺登錄問題解決方法大揭秘 Discuz后臺登錄問題解決方法大揭秘 Mar 03, 2024 am 08:57 AM

Discuz后臺登錄問題解決方法大揭秘,需要具體代碼示例隨著互聯(lián)網(wǎng)的快速發(fā)展,網(wǎng)站建設變得越來越普遍,而Discuz作為一款常用的論壇建站系統(tǒng),受到了許多站長的青睞。然而,正是因為其功能強大,有時候我們在使用Discuz的過程中會遇到一些問題,比如后臺登錄問題。今天,我們就來大揭秘Discuz后臺登錄問題的解決方法,并且提供具體的代碼示例,希望能幫助到有需要

小紅書只記得賬號怎么登錄?只記得賬號怎么找回? 小紅書只記得賬號怎么登錄?只記得賬號怎么找回? Mar 23, 2024 pm 05:31 PM

小紅書如今已經(jīng)融入了許多人的日常生活,其豐富的內(nèi)容和便捷的操作方式讓用戶樂此不疲。有時候,我們可能會忘記賬號密碼,只記得賬號而無法登錄確實讓人感到困擾。一、小紅書只記得賬號怎么登錄?當忘記密碼時,我們可以通過手機驗證碼的方式登錄小紅書。具體操作如下:1.打開小紅書App或網(wǎng)頁版小紅書;2.點擊“登錄”按鈕,選擇“賬號密碼登錄”;3.點擊“忘記密碼?”按鈕;4.輸入你的賬號,點擊“下一步”;5.系統(tǒng)會發(fā)送驗證碼到你的手機,輸入驗證碼后點擊“確定”;6.設置新的密碼并確認。你還可以通過第三方賬號(如

實現(xiàn)微信小程序中的卡片翻轉特效 實現(xiàn)微信小程序中的卡片翻轉特效 Nov 21, 2023 am 10:55 AM

實現(xiàn)微信小程序中的卡片翻轉特效在微信小程序中,實現(xiàn)卡片翻轉特效是一種常見的動畫效果,可以提升用戶體驗和界面交互的吸引力。下面將具體介紹如何在微信小程序中實現(xiàn)卡片翻轉的特效,并提供相關代碼示例。首先,需要在小程序的頁面布局文件中定義兩個卡片元素,一個用于顯示正面內(nèi)容,一個用于顯示背面內(nèi)容,具體示例代碼如下:&lt;!--index.wxml--&gt;&l

百度網(wǎng)盤網(wǎng)頁版怎么進?百度網(wǎng)盤網(wǎng)頁版登錄入口 百度網(wǎng)盤網(wǎng)頁版怎么進?百度網(wǎng)盤網(wǎng)頁版登錄入口 Mar 13, 2024 pm 04:58 PM

  百度網(wǎng)盤不僅能儲存各種軟件資源,還能分享給別人,支持多端同步,如果你的電腦沒有下載客戶端,可以選擇進入網(wǎng)頁版使用。那么百度網(wǎng)盤網(wǎng)頁版怎么登入呢?下面就來看看詳細介紹。  百度網(wǎng)盤網(wǎng)頁版登錄入口:https://pan.baidu.com(復制鏈接到瀏覽器打開)  軟件介紹  1、分享  提供文件分享功能,用戶將文件整理,分享給需要的小伙伴。  2、云端  不占用太多內(nèi)存,大多數(shù)文件都保存在云端,有效節(jié)省電腦空間?! ?、相冊  支持云相冊功能,將照片導入到云盤中,然后整理,方便大家查看?! ?/p>

See all articles