目錄
技術堆疊
一般程序
兩個時候我們需要檢查狀態:
vuex
為空
首頁 web前端 js教程 Vue.js寫一個SPA登入頁面的實例

Vue.js寫一個SPA登入頁面的實例

Jun 23, 2017 am 10:55 AM
javascript vue.js 登入 過程

技術堆疊

  • vue.js 主框架

  • #vuex 狀態管理

  • vue -router 路由管理

一般程序

在一般的登入過程中,一個前端方案是:

  1. ##檢查狀態:進入頁面時或路由變更時檢查是否有登入狀態(儲存在

    cookie本機儲存的值);

  2. ##如果有登入態則查詢登入資訊(uid,頭像等...)並儲存起來;如果沒有則跳到登入頁面;
  3. 在登入頁面(或是登入框),校檢使用者輸入資訊是否合法;
  4. 校檢透過後發送登入要求;校檢不成功則回饋給使用者;
  5. 登入成功則從後端資料中取出
  6. session

    訊息保存登入狀態(可能需要跳轉);登入不成功則提示使用者不成功;

  7. 使用者做出登出操作時刪除登入狀態。
  8. 下面我根據列出的步驟一一分析如何做程式碼實現,所有在程式碼在中,並帶有較詳細註解幫助理解程式碼。

在此之前假設登入頁面路由為

/login

,登入後的路由為/user_info。這樣只需要在App.vue放好router-view用來存放和渲染這兩個路由。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>// component/App.vue &lt;template&gt;&lt;div class=&quot;container&quot; id=&quot;app&quot;&gt; &lt;transition name=&quot;fade&quot;&gt;&lt;keep-alive&gt; &lt;router-view&gt;&lt;/router-view&gt;&lt;/keep-alive&gt; &lt;/transition&gt;&lt;/div&gt;&lt;/template&gt; ...</pre><div class="contentsignin">登入後複製</div></div>並做好

vue-router

設定:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>// js/app.jsimport Vue from &amp;#39;vue&amp;#39;import VueRouter from &amp;#39;vue-router&amp;#39;import Login from &amp;#39;../component/Login.vue&amp;#39;import UserInfo from &amp;#39;../component/UserInfo.vue&amp;#39; Vue.use(VueRouter);const router = new VueRouter({ routes: [{path: &amp;#39;/login&amp;#39;,component: Login }, {path: &amp;#39;/user_info&amp;#39;,component: UserInfo }] }) ...</pre><div class="contentsignin">登入後複製</div></div>檢查狀態與跳轉

兩個時候我們需要檢查狀態:

1.使用者開啟頁面時;

 2.路由發生變化時;#首先需要寫好一個檢查登入態的方法

checkLogin

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>// js/app.js ... var app = new Vue({ data: {}, el: &amp;#39;#app&amp;#39;, render: h =&gt; h(App), router, store, methods:{ checkLogin(){ //检查是否存在session //cookie操作方法在源码里有或者参考网上的即可 if(!this.getCookie(&amp;#39;session&amp;#39;)){//如果没有登录状态则跳转到登录页this.$router.push(&amp;#39;/login&amp;#39;); }else{//否则跳转到登录后的页面this.$router.push(&amp;#39;/user_info&amp;#39;); } } } })</pre><div class="contentsignin">登入後複製</div></div>為了提升使用者體驗,當使用者開啟頁面時前端需要檢查他是否已經登錄,不需要使用者再次登入。這個實作很簡單,我們在

vue實例

created鉤子裡寫好:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>// js/app.js ... var app = new Vue({ ... created() {this.checkLogin(); }, methods:{ checkLogin(){ ... } } })</pre><div class="contentsignin">登入後複製</div></div>另外,

路由

發生變更時也需要檢查登錄,以下情境(路由變更)如果我們不檢查登入態可能會發生錯誤:

    #用戶在進入頁面時存在登入狀態,但在做操作時正好登入過期了;
  • 使用者手動刪除了
  • cookie

    /本地storage並做操作;

    ##使用者在未登入的情況下手動輸入(或從收藏夾進入)某個需要登入的路由
  • #使用者在已登入的情況下進入登入頁路由
  • #這些足夠成為我們監聽路由的理由,實現的話可以利用
  • vue

watch功能:

// js/app.js
...
var app = new Vue({
  ...  //监听路由检查登录
  watch:{"$route" : &#39;checkLogin&#39;
  },  //进入页面时
  created() {this.checkLogin();
  },  methods:{
    checkLogin(){
     ...
    }
  }
})
登入後複製
至此,我們就完成了一般過程

中的第1步。接下來實現如何取得用戶個人資訊。

獲取用戶資訊

在成功登入後,我們一般需要從後端顯示用戶的一些信息,例如暱稱,頭像,等級等等...獲取的話很簡單,發一個http請求從後端拉取;但是一般這些資訊會在多的路由用到(例如uid一般都需要在各個後端介面中作為參數帶上),所以需要保存到全域狀態中(

vuex

):

// component/App.vue
...
<script>export default {
  ...
  mounted(){//组件开始挂载时获取用户信息this.getUserInfo();
  },  methods: {//请求用户的一些信息
    getUserInfo(){      this.userInfo = {nick: &#39;Doterlin&#39;,ulevel: 20,uid: &#39;10000&#39;,portrait: &#39;images/profile.png&#39;
      }      //获取信息请求
      ts.$http.get(url, {//参数"params": this.userInfo
      }).then((response) => {//Successif(response.data.code == 0){          this.$store.commit(&#39;updateUserInfo&#39;, this.userInfo); 
        }
      }, (response) => {//Error
      });

    }
  }
}
</script>
...
登入後複製
當然我們需要在之前配置好,例如在寫在app.js

或單獨寫成

store.js並在app .js引入(推薦):

// js/app.js// Vuex配置
...
const store = new Vuex.Store({  state: {domain:&#39;http://test.example.com&#39;, //保存后台请求的地址,修改时方便(比方说从测试服改成正式服域名)
    userInfo: { //保存用户信息
      nick: null,      ulevel: null,      uid: null,      portrait: null
    }
  },  mutations: {//更新用户信息
    updateUserInfo(state, newUserInfo) {
      state.userInfo = newUserInfo;
    }
  }
})
...
登入後複製
輸入校驗和發送登入請求

為了防止一些不符合預期的字元和過於頻繁的請求傳到後台,前端要對使用者的輸入進行校驗和防止重複請求。當然不同網站的合法字元不一樣,這裡只做

為空

時不合法的校驗:

//component/Login.vue
<template><div class="login" id="login">
   ...<div class="log-email"><input type="text" placeholder="Email" :class="&#39;log-input&#39; + (account==&#39;&#39;?&#39; log-input-empty&#39;:&#39;&#39;)" v-model="account"><input type="password" placeholder="Password" :class="&#39;log-input&#39; + (password==&#39;&#39;?&#39; log-input-empty&#39;:&#39;&#39;)"  v-model="password"><a href="javascript:;" class="log-btn" @click="login">Login</a></div>
    ...</div></template><script>import Loading from &#39;./Loading.vue&#39;export default {  name: &#39;Login&#39;,
  data(){      return {          isLoging: false,          account: &#39;&#39;,          password: &#39;&#39;
      }
  },  components:{
    Loading
  },  methods:{      //登录逻辑
      login(){          if(this.account!=&#39;&#39; && this.password!=&#39;&#39;){              this.toLogin();
          }
      }

}</script>
...
登入後複製
這裡的this.toLogin

就是登入請求的方法,在

post密碼到後端時不是直接發送,一般會按照後端定的規則加密後在發送,比如哈希演算法,例子進行了的雙重哈希加密,引用了js/sha1.min.js,大致實作如下:

...      //登录请求
      toLogin(){          //一般要跟后端了解密码的加密规则          //这里例子用的哈希算法来自./js/sha1.min.js          let password_sha = hex_sha1(hex_sha1( this.password ));          //需要想后端发送的登录参数          let loginParam = {              account: this.account,
              password_sha
          }          //设置在登录状态          this.isLoging = true;          //请求后端          this.$http.post( &#39;example.com/login.php&#39;, {          param: loginParam).then((response) => {if(response.data.code == 1){              //如果登录成功则保存登录状态并设置有效期              let expireDays = 1000 * 60 * 60 * 24 * 15;              this.setCookie(&#39;session&#39;, response.data.session, expireDays);              //跳转              this.$router.push(&#39;/user_info&#39;); 
            }
          }, (response) => {//Error
          });

...
登入後複製
這樣就完成了第3,4,5個步驟了。最後一步就是註銷。

註銷

登出時有的需要請求後端有的不需要,關鍵的事要刪除已儲存的登入狀態:

<code class="javascript"><span class="hljs-comment">// component/UserInfo.vue
...
   logout(){      <span class="hljs-comment">//删除cookie并跳到登录页      <span class="hljs-keyword">this.isLogouting = <span class="hljs-literal">true;      <span class="hljs-comment">//请求后端,比如logout.php      <span class="hljs-comment">// this.$http.post(&#39;eaxmple.com/logout.php&#39;)...      <span class="hljs-comment">//成功后删除cookie      <span class="hljs-keyword">this.delCookie(<span class="hljs-string">&#39;session&#39;);      <span class="hljs-comment">//重置loding状态      <span class="hljs-keyword">this.isLogouting = <span class="hljs-literal">false;      <span class="hljs-comment">//跳转到登录页      <span class="hljs-keyword">this.$router.push(<span class="hljs-string">&#39;/login/&#39;);
    }
..</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code><br/>
登入後複製

#

以上是Vue.js寫一個SPA登入頁面的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

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整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1304
25
PHP教程
1251
29
C# 教程
1224
24
小紅書怎麼登入以前的帳號?它換綁後原來號碼遺失了怎麼辦? 小紅書怎麼登入以前的帳號?它換綁後原來號碼遺失了怎麼辦? Mar 21, 2024 pm 09:41 PM

隨著社群媒體的快速發展,小紅書成為許多年輕人分享生活、探索新產品的熱門平台。在使用過程中,有時使用者可能會遇到登入先前帳號的困難。本文將詳細探討如何解決小紅書登入舊帳號的問題,以及如何應對更換綁定後可能遺失原帳號的情況。一、小紅書怎麼登入以前的帳號? 1.找回密碼登入如果長時間未登入小紅書,可能導致帳號被系統回收。為了恢復存取權限,你可以嘗試透過找回密碼的方式重新登入帳號。操作步驟如下:(1)開啟小紅書App或官網,點選「登入」按鈕。 (2)選擇「找回密碼」。 (3)輸入你註冊帳號時所使用的手機號碼

wallpaperengine登入別的號碼後下載別人的桌布怎麼辦 wallpaperengine登入別的號碼後下載別人的桌布怎麼辦 Mar 19, 2024 pm 02:00 PM

當你在自己電腦上登過別人steam帳號之後,剛好這個別人的帳號也有wallpaper軟體,切換回自己帳號之後steam就會自動下載別人帳號訂閱的桌布,使用者可以透過關閉steam雲端同步解決。 wallpaperengine登入別的號碼後下載別人的桌布怎麼辦1、登陸你自己的steam帳號,在設定裡面找到雲端同步,關閉steam雲端同步。 2.登陸你之前登陸的別人的steam帳號,打開wallpaper創意工坊,找到訂閱內容,然後取消全部訂閱。 (以後防止找不到壁紙,可以先收藏再取消訂閱)3、切換回自己的stea

Discuz後台登入問題解決方法大揭秘 Discuz後台登入問題解決方法大揭秘 Mar 03, 2024 am 08:57 AM

Discuz後台登入問題解決方法大揭秘,需要具體程式碼範例隨著網路的快速發展,網站建置變得越來越普遍,而Discuz作為一款常用的論壇建站系統,受到了許多站長的青睞。然而,正是因為其功能強大,有時候我們在使用Discuz的過程中會遇到一些問題,例如後台登入問題。今天,我們就來大揭秘Discuz後台登入問題的解決方法,並且提供具體的程式碼範例,希望能幫助到有需要

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

近日有一些小夥伴諮詢小編快手電腦版怎麼登入?下面就為大家帶來了快手電腦版的登入方法,有需要的小夥伴可以來了解了解哦。第一步:先在電腦的瀏覽器上百度搜尋快手官網。第二步:在搜尋結果清單裡面選取第一條。第三步:進入快手官網主頁面後,點選影片的選項。第四步:點選右上角的使用者頭像。步驟五:在彈出的登入選單裡面點選二維碼登入。步驟六:之後打開手機上的快手,點選左上角的圖示。第七步:點選二維碼標誌。第八步:在我的二維碼介面點擊右上角的掃描圖示之後,掃描電腦上的二維碼即可。第九步:最後電腦版的快手就登入成

百度網盤網頁版怎麼進?百度網盤網頁版登入入口 百度網盤網頁版怎麼進?百度網盤網頁版登入入口 Mar 13, 2024 pm 04:58 PM

  百度網盤不僅能儲存各種軟體資源,還能分享給別人,支援多端同步,如果你的電腦沒有下載客戶端,可以選擇進入網頁版使用。那麼百度網盤網頁版要怎麼登入呢?下面就來看看詳細介紹。  百度網盤網頁版登入入口:https://pan.baidu.com(複製連結至瀏覽器開啟)  軟體介紹  1、分享  提供文件分享功能,使用者將文件整理,分享給需要的小夥伴。  2、雲端  不佔用太多內存,大多數檔案都保存在雲端,有效節省電腦空間。  3、相簿  支援雲相簿功能,將照片匯入到雲盤中,然後整理,方便大家查看。  

小紅書只記得帳號怎麼登入?只記得帳號怎麼找回來? 小紅書只記得帳號怎麼登入?只記得帳號怎麼找回來? Mar 23, 2024 pm 05:31 PM

小紅書如今已經融入了許多人的日常生活,其豐富的內容和便捷的操作方式讓使用者樂此不疲。有時候,我們可能會忘記帳號密碼,只記得帳號而無法登入確實讓人感到困擾。一、小紅書只記得帳號怎麼登入?當忘記密碼時,我們可以透過手機驗證碼的方式登入小紅書。具體操作如下:1.開啟小紅書App或網頁版小紅書;2.點選「登入」按鈕,選擇「帳號密碼登入」;3.點選「忘記密碼?」按鈕;4.輸入你的帳號,點選「下一步」;5.系統會發送驗證碼到你的手機,輸入驗證碼後點選「確定」;6.設定新的密碼並確認。你也可以透過第三方帳號(如

夸克怎麼登入兩個設備 夸克怎麼登入兩個設備 Feb 23, 2024 pm 10:55 PM

夸克怎麼登入兩個設備?夸克瀏覽器是支援同時登陸兩個設備的,但是多數的小夥伴不知道夸克瀏覽器如何登陸兩個設備,接下來就是小編為用戶帶來的夸克登陸兩個設備方法圖文教程,有興趣的用戶快來一起看看吧!夸克瀏覽器使用教學夸克怎麼登入兩個裝置1、先開啟夸克瀏覽器APP,主頁點選【夸克網盤】;2、接著進入夸克網盤介面,選擇【我的備份】服務功能;3、最後選擇其中的【切換設備】即可更換新設備登陸兩個。

如何解決Laravel登入時間失效的常見問題 如何解決Laravel登入時間失效的常見問題 Mar 06, 2024 pm 09:24 PM

如何解決Laravel登入時間失效的常見問題在使用Laravel開發Web應用程式時,登入認證是一個非常重要的功能。然而,有時候使用者登入後長時間不操作,頁面可能會自動登出或認證失效。這個問題較為常見,以下將介紹如何透過設定session的時間來解決這個問題,並提供具體的程式碼範例。 1.設定session的過期時間在Laravel中,預設為sessi

See all articles