国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】

這篇具有很好參考價值的文章主要介紹了登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

登錄頁

整體認識和路由配置

整體認識
登錄頁面的主要功能就是表單校驗和登錄登出業(yè)務
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言

  1. 準備模板
<script setup>

</script>


<template>
  <div>
    <header class="login-header">
      <div class="container m-top-20">
        <h1 class="logo">
          <RouterLink to="/">小兔鮮</RouterLink>
        </h1>
        <RouterLink class="entry" to="/">
          進入網(wǎng)站首頁
          <i class="iconfont icon-angle-right"></i>
          <i class="iconfont icon-angle-right"></i>
        </RouterLink>
      </div>
    </header>
    <section class="login-section">
      <div class="wrapper">
        <nav>
          <a href="javascript:;">賬戶登錄</a>
        </nav>
        <div class="account-box">
          <div class="form">
            <el-form label-position="right" label-width="60px"
              status-icon>
              <el-form-item  label="賬戶">
                <el-input/>
              </el-form-item>
              <el-form-item label="密碼">
                <el-input/>
              </el-form-item>
              <el-form-item label-width="22px">
                <el-checkbox  size="large">
                  我已同意隱私條款和服務條款
                </el-checkbox>
              </el-form-item>
              <el-button size="large" class="subBtn">點擊登錄</el-button>
            </el-form>
          </div>
        </div>
      </div>
    </section>

    <footer class="login-footer">
      <div class="container">
        <p>
          <a href="javascript:;">關于我們</a>
          <a href="javascript:;">幫助中心</a>
          <a href="javascript:;">售后服務</a>
          <a href="javascript:;">配送與驗收</a>
          <a href="javascript:;">商務合作</a>
          <a href="javascript:;">搜索推薦</a>
          <a href="javascript:;">友情鏈接</a>
        </p>
        <p>CopyRight &copy; 小兔鮮兒</p>
      </div>
    </footer>
  </div>
</template>

<style scoped lang='scss'>
.login-header {
  background: #fff;
  border-bottom: 1px solid #e4e4e4;

  .container {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
  }

  .logo {
    width: 200px;

    a {
      display: block;
      height: 132px;
      width: 100%;
      text-indent: -9999px;
      background: url("@/assets/images/logo.png") no-repeat center 18px / contain;
    }
  }

  .sub {
    flex: 1;
    font-size: 24px;
    font-weight: normal;
    margin-bottom: 38px;
    margin-left: 20px;
    color: #666;
  }

  .entry {
    width: 120px;
    margin-bottom: 38px;
    font-size: 16px;

    i {
      font-size: 14px;
      color: $xtxColor;
      letter-spacing: -5px;
    }
  }
}

.login-section {
  background: url('@/assets/images/login-bg.png') no-repeat center / cover;
  height: 488px;
  position: relative;

  .wrapper {
    width: 380px;
    background: #fff;
    position: absolute;
    left: 50%;
    top: 54px;
    transform: translate3d(100px, 0, 0);
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);

    nav {
      font-size: 14px;
      height: 55px;
      margin-bottom: 20px;
      border-bottom: 1px solid #f5f5f5;
      display: flex;
      padding: 0 40px;
      text-align: right;
      align-items: center;

      a {
        flex: 1;
        line-height: 1;
        display: inline-block;
        font-size: 18px;
        position: relative;
        text-align: center;
      }
    }
  }
}

.login-footer {
  padding: 30px 0 50px;
  background: #fff;

  p {
    text-align: center;
    color: #999;
    padding-top: 20px;

    a {
      line-height: 1;
      padding: 0 10px;
      color: #999;
      display: inline-block;

      ~a {
        border-left: 1px solid #ccc;
      }
    }
  }
}

.account-box {
  .toggle {
    padding: 15px 40px;
    text-align: right;

    a {
      color: $xtxColor;

      i {
        font-size: 14px;
      }
    }
  }

  .form {
    padding: 0 20px 20px 20px;

    &-item {
      margin-bottom: 28px;

      .input {
        position: relative;
        height: 36px;

        >i {
          width: 34px;
          height: 34px;
          background: #cfcdcd;
          color: #fff;
          position: absolute;
          left: 1px;
          top: 1px;
          text-align: center;
          line-height: 34px;
          font-size: 18px;
        }

        input {
          padding-left: 44px;
          border: 1px solid #cfcdcd;
          height: 36px;
          line-height: 36px;
          width: 100%;

          &.error {
            border-color: $priceColor;
          }

          &.active,
          &:focus {
            border-color: $xtxColor;
          }
        }

        .code {
          position: absolute;
          right: 1px;
          top: 1px;
          text-align: center;
          line-height: 34px;
          font-size: 14px;
          background: #f5f5f5;
          color: #666;
          width: 90px;
          height: 34px;
          cursor: pointer;
        }
      }

      >.error {
        position: absolute;
        font-size: 12px;
        line-height: 28px;
        color: $priceColor;

        i {
          font-size: 14px;
          margin-right: 2px;
        }
      }
    }

    .agree {
      a {
        color: #069;
      }
    }

    .btn {
      display: block;
      width: 100%;
      height: 40px;
      color: #fff;
      text-align: center;
      line-height: 40px;
      background: $xtxColor;

      &.disabled {
        background: #cfcdcd;
      }
    }
  }

  .action {
    padding: 20px 40px;
    display: flex;
    justify-content: space-between;
    align-items: center;

    .url {
      a {
        color: #999;
        margin-left: 10px;
      }
    }
  }
}

.subBtn {
  background: $xtxColor;
  width: 100%;
  color: #fff;
}
</style>
  1. 配置路由跳轉
<li><a href="javascript:;" @click="router.push('/login')">請先登錄</a></li>

表單校驗功能

為什么需要校驗
作用:前端提前校驗可以省去一些錯誤的請求提交,為后端節(jié)省接口壓力
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
表單如何進行校驗
ElementPlus表單組件內(nèi)置了表單校驗功能,只需要按照組件要求配置必要參數(shù)即可
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
思想:當功能很復雜時,通過多個組件各自負責某個小功能,再組合成一個大功能是組件設計中的常用方法

表單校驗步驟

  1. 按照接口字段準備表單對象并綁定
  2. 按照產(chǎn)品要求準備規(guī)則對象并綁定
  3. 指定表單域的校驗字段名
  4. 把表單對象進行雙向綁定

用戶名:不能為空,字段名為account
密碼:不能為空且為6-14個字符,字段名為password
同意協(xié)議:必選,字段名為agree

自定義校驗規(guī)則

ElementPlus表單組件內(nèi)置了初始的校驗配置,應付簡單的校驗只需要通過配置即可,如果想要定制一些特殊的校驗需求,可以使用自定義校驗規(guī)則,格式如下:

{
  validator: (rule, val, callback) => {
    //自定義校驗邏輯
    //value: 當前輸入的數(shù)據(jù)
    //callback: 校驗處理函數(shù) 校驗通過調(diào)用
    }
}

校驗邏輯:如果勾選了協(xié)議框,通過校驗,如果沒有勾選,不通過校驗
整個表單的內(nèi)容驗證
思考:每個表單域都有自己的校驗觸發(fā)事件,如果用戶一上來就點擊登錄怎么辦呢?
答:在點擊登錄時需要對所有需要校驗的表單進行統(tǒng)一校驗
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言

基礎登錄業(yè)務實現(xiàn)

登錄業(yè)務流程
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言

基礎思想

  • 調(diào)用登錄接口獲取用戶信息
  • 提示用戶當前是否成功
  • 跳轉到首頁
import { ElMessage } from 'element-plus'
import 'element-plus/theme-chalk/el-message.css'


const doLogin = () => {
  const { account, password } = form.value
  // 調(diào)用實例方法
  formRef.value.validate(async (valid) => {
    // valid: 所有表單都通過校驗  才為true
    console.log(valid)
    // 以valid做為判斷條件 如果通過校驗才執(zhí)行登錄邏輯
    if (valid) {
      // TODO LOGIN
      await loginAPI({ account, password })
      // 1. 提示用戶
      ElMessage({ type: 'success', message: '登錄成功' })
      // 2. 跳轉首頁
      router.replace({ path: '/' })
    }
  })
}

Pinia管理用戶數(shù)據(jù)

為什么要用Pinia管理數(shù)據(jù)
由于用戶數(shù)據(jù)的特殊性,在很多組件中都有可能進行共享,共享的數(shù)據(jù)使用Pinia管理會更加方便
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
如何使用Pinia管理數(shù)據(jù)
遵循理念:和數(shù)據(jù)相關的所有操作(state+action)都放到Pinia中,組件只負責觸發(fā)action函數(shù)
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
關鍵代碼總結
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言

Pinia用戶數(shù)據(jù)持久化

持久化用戶數(shù)據(jù)說明

  1. 用戶數(shù)據(jù)中有一個關鍵的數(shù)據(jù)叫做Token(用來標識當前用戶是否登錄),而Token持續(xù)一段時間才會過期
  2. Pinia的存儲是基于內(nèi)存的,刷新就丟失,為了保持登錄狀態(tài)就要做到刷新不丟失,需要配合持久化進行存儲

目的:保持token不丟失,保持登錄狀態(tài)
最終效果:操作state時會自動把用戶數(shù)據(jù)在本地的localStorage也存一份,刷新的時候會從localStorage中先取

登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
關鍵步驟總結和插件運行機制
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
運行機制:
在設置state的時候會自動把數(shù)據(jù)同步給localstorage,在獲取state數(shù)據(jù)的時候會優(yōu)先從localStorage中取

// 管理用戶數(shù)據(jù)相關

import { defineStore } from 'pinia'
import { ref } from 'vue'
import { loginAPI } from '@/apis/user'

export const useUserStore = defineStore('user', () => {
  // 1. 定義管理用戶數(shù)據(jù)的state
  const userInfo = ref({})
  // 2. 定義獲取接口數(shù)據(jù)的action函數(shù)
  const getUserInfo = async ({ account, password }) => {
    const res = await loginAPI({ account, password })
    userInfo.value = res.result
  }
  // 3. 以對象的格式把state和action return
  return {
    getUserInfo
  }
}, {
  persist: true,
})

登錄和非登錄狀態(tài)的模板適配

需求理解
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
多模板適配的通用思路
思路:有幾個需要適配的模板就準備幾個template片段,通過條件渲染控制顯示即可。
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言

請求攔截器攜帶Token

為什么要在請求攔截器攜帶Token
Token作為用戶標識,在很多個接口中都需要攜帶Token才可以正確獲取數(shù)據(jù),所以需要在接口調(diào)用的時候攜帶Token。另外,為了統(tǒng)一控制采取請求攔截器攜帶的方案
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
如何配置
Axios請求攔截器可以在接口正式發(fā)起之前對請求參數(shù)做一些事情,通常Token數(shù)據(jù)會被注入到請求header中,格式按照后端要求的格式進行拼接處理。
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言

退出登錄功能實現(xiàn)

退出登錄業(yè)務實現(xiàn)
登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】,javascript,前端,css,vue.js,開發(fā)語言
基礎思想:

清除用戶信息
跳轉到登錄頁

1- 新增清除用戶信息action

 // 退出時清除用戶信息
  const clearUserInfo = () => {
    userInfo.value = {}
  }

2- 組件中執(zhí)行業(yè)務邏輯

<script setup>
import { useUserStore } from '@/stores/userStore'
import { useRouter } from 'vue-router'
const userStore = useUserStore()
const router = useRouter()
const confirm = () => {
  console.log('用戶要退出登錄了')
  // 退出登錄業(yè)務邏輯實現(xiàn)
  // 1.清除用戶信息 觸發(fā)action
  userStore.clearUserInfo()
  // 2.跳轉到登錄頁
  router.push('/login')
}
</script>

Token失效401攔截處理

業(yè)務背景
Token的有效性可以保持在一定時間,如果用戶一段時間不做任何操作,Token就會失效,使用失效的Token再去請求一些接口,接口就會報401狀態(tài)碼錯誤,需要我們做額外處理

兩個需要思考的問題:

  1. 我們能確定用戶到底是在訪問哪個接口時出現(xiàn)的401錯誤嗎?在什么位置去攔截這個401?
  2. 檢測到401之后又該干什么呢?

解決方案 - 在axios響應攔截器做統(tǒng)一處理

失敗回調(diào)中攔截401 -> 先清除掉過期的用戶信息,再跳轉到登錄頁面文章來源地址http://www.zghlxwxcb.cn/news/detail-609825.html

到了這里,關于登錄頁的具體實現(xiàn) (小兔鮮兒)【Vue3】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • uniapp 小兔鮮兒 - 首頁模塊(2)

    uniapp 小兔鮮兒 - 首頁模塊(2)

    目錄 熱門推薦 首頁 – 熱門推薦組件? 首頁 – 獲取熱門推薦數(shù)據(jù) 首頁 – 熱門推薦數(shù)據(jù)類型并渲染 猜你喜歡 首頁 – 猜你喜歡組件 首頁 – 獲取猜你喜歡數(shù)據(jù) 首頁 – 猜你喜歡數(shù)據(jù)類型和渲染 首頁 – 猜你喜歡分頁準備 首頁 – 猜你喜歡分頁加載 ?首頁 – 猜你喜歡分頁條

    2024年02月12日
    瀏覽(23)
  • Web網(wǎng)頁項目實戰(zhàn)-----小兔鮮兒項目

    Web網(wǎng)頁項目實戰(zhàn)-----小兔鮮兒項目

    ? ? ? ? ? 本網(wǎng)站是一個電商網(wǎng)站,主要由Html、CSS、JS來完成,實現(xiàn)的功能主要是可以購買產(chǎn)品,展示產(chǎn)品,查看訂單等功能,效果如下,如有需要項目代碼的可以私信我,或者文章底下評論,我給分享原項目和資源文件 ? ? ? ? ? 學習路徑: 1.精靈圖 1)精靈圖的介紹 a.場

    2024年02月05日
    瀏覽(23)
  • 黑馬程序員前端 Vue3 小兔鮮電商項目——(七)詳情頁

    黑馬程序員前端 Vue3 小兔鮮電商項目——(七)詳情頁

    模板代碼 創(chuàng)建 srcviewsDetailindex.vue 文件,添加以下代碼: 配置路由 在 srcrouterindex.js 中添加對應路由【 /detail/{goodId} 】: 鏈接跳轉 對 srcviewsHomecomponentsHomeNew.vue 文件及其他涉及商品信息的頁面修改路由跳轉: 封裝接口 在 srcapisdetail.js 文件中封裝接口用于獲取商品信息

    2024年02月10日
    瀏覽(28)
  • 黑馬程序員前端 Vue3 小兔鮮電商項目——(一)初始化項目

    黑馬程序員前端 Vue3 小兔鮮電商項目——(一)初始化項目

    Vue3是Vue.js最新的主要版本,它已經(jīng)于2020年9月18日發(fā)布。它提供了許多新功能和性能改進,這些改進使得Vue更易于使用和更具可擴展性。 以下是Vue3的一些主要特性: 更快的渲染:Vue3使用重寫的響應式系統(tǒng),它使用Proxy對象來解決Vue2中的性能瓶頸問題。這使得Vue3的渲染速度比

    2024年02月15日
    瀏覽(41)
  • 黑馬程序員前端 Vue3 小兔鮮電商項目——(二)初始化項目

    黑馬程序員前端 Vue3 小兔鮮電商項目——(二)初始化項目

    Vue3是Vue.js最新的主要版本,它已經(jīng)于2020年9月18日發(fā)布。它提供了許多新功能和性能改進,這些改進使得Vue更易于使用和更具可擴展性。 以下是Vue3的一些主要特性: 更快的渲染:Vue3使用重寫的響應式系統(tǒng),它使用Proxy對象來解決Vue2中的性能瓶頸問題。這使得Vue3的渲染速度比

    2024年02月11日
    瀏覽(57)
  • 【前端Vue】Vue3+Pinia小兔鮮電商項目第1篇:認識Vue3,1. Vue3組合式API體驗【附代碼文檔】

    【前端Vue】Vue3+Pinia小兔鮮電商項目第1篇:認識Vue3,1. Vue3組合式API體驗【附代碼文檔】

    通過 Counter 案例 體驗Vue3新引入的組合式API 特點: 代碼量變少 分散式維護變成集中式維護 ![image.png]( create-vue是Vue官方新的腳手架工具,底層切換到了 vite (下一代前端工具鏈),為開發(fā)提供極速響應 ![image.png]( 前置條件 - 已安裝16.0或更高版本的Node.js 執(zhí)行如下命令,這一指

    2024年03月17日
    瀏覽(26)
  • 【前端Vue】Vue3+Pinia小兔鮮電商項目第2篇:什么是pinia,1. 創(chuàng)建空Vue項目【附代碼文檔】

    【前端Vue】Vue3+Pinia小兔鮮電商項目第2篇:什么是pinia,1. 創(chuàng)建空Vue項目【附代碼文檔】

    Pinia 是 Vue 的專屬狀態(tài)管理庫,可以實現(xiàn)跨組件或頁面共享狀態(tài),是 vuex 狀態(tài)管理工具的替代品,和 Vuex相比,具備以下優(yōu)勢 提供更加簡單的API (去掉了 mutation ) 提供符合組合式API風格的API (和 Vue3 新語法統(tǒng)一) 去掉了modules的概念,每一個store都是一個獨立的模塊 搭配

    2024年03月21日
    瀏覽(30)
  • 【前端Vue】Vue3+Pinia小兔鮮電商項目第4篇:靜態(tài)結構搭建和路由配置,1. 準備分類組件【附代碼文檔】

    【前端Vue】Vue3+Pinia小兔鮮電商項目第4篇:靜態(tài)結構搭建和路由配置,1. 準備分類組件【附代碼文檔】

    Vue3+ElementPlus+Pinia開發(fā)小兔鮮電商項目完整教程(附代碼資料)主要內(nèi)容講述:認識Vue3,使用create-vue搭建Vue3項目1. Vue3組合式API體驗,2. Vue3更多的優(yōu)勢,1. 認識create-vue,2. 使用create-vue創(chuàng)建項目,1. setup選項的寫法和執(zhí)行時機,2. setup中寫代碼的特點。什么是pinia,創(chuàng)建空Vue項目并安裝

    2024年04月11日
    瀏覽(28)
  • 小兔鮮商03

    小兔鮮商03

    進入可視區(qū)加載數(shù)據(jù): 首頁有很多模塊,如果一次性加載所有數(shù)據(jù),很卡,,當移動到要顯示的地方,才加載數(shù)據(jù) 使用 vueuse 庫中 useIntersectionObserver 方法,, 傳入要監(jiān)聽的元素 target 和監(jiān)聽到這個target去加載的數(shù)據(jù)api,,, 返回api請求的數(shù)據(jù) vue3中獲取dom節(jié)點: 先聲明一個

    2024年02月10日
    瀏覽(17)
  • css小兔鮮項目搭建

    css小兔鮮項目搭建

    目錄 精靈圖 精靈圖的使用步驟 背景圖片大小 background連寫 文字陰影 盒子陰影 過渡 骨架標簽 SEO三大標簽 版心的介紹 css書寫順序 ?項目結構搭建 精靈圖 ?場景:項目中將多張小圖片,合并成一張大圖片,這張大圖片稱之為精靈圖 ? 優(yōu)點:減少服務器發(fā)送次數(shù),減輕服務器

    2024年02月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包