欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue加入購(gòu)物車判斷token添加登錄提示功能

 更新時(shí)間:2023年11月27日 14:12:42   作者:自學(xué)Java筆記本  
加入購(gòu)物車,是一個(gè)登錄后的用戶 才能進(jìn)行的操作,所以需要進(jìn)行鑒權(quán)判斷,判斷用戶token是否存在,這篇文章主要介紹了Vue加入購(gòu)物車判斷token添加登錄提示,需要的朋友可以參考下

Vue-加入購(gòu)物車-判斷token添加登錄提示

目標(biāo):給未登錄的用戶,添加登錄提示
說(shuō)明:加入購(gòu)物車,是一個(gè)登錄后的用戶 才能進(jìn)行的操作,所以需要進(jìn)行鑒權(quán)判斷,判斷用戶token是否存在

  • 若存在:繼續(xù)加入購(gòu)物車操作
  • 不存在:提示用戶未登錄,引導(dǎo)到登錄頁(yè),登錄完回跳
addCart () {
      // 判斷 token 是否存在
      // 1.如果token不存在,彈確認(rèn)框
      // 2.如果token存在,繼續(xù)請(qǐng)求操作
      if (!this.$store.getters.token) {
        // 彈確認(rèn)框
        this.$dialog.confirm({
          title: '溫馨提示',
          message: '此時(shí)需要先登錄才能繼續(xù)操作哦',
          confirmButtonText: '去登錄',
          cancelButtonText: '再逛逛'
        })
          .then(() => {
            // 點(diǎn)擊確認(rèn)表示用戶要去登錄界面,此時(shí)讓路由跳轉(zhuǎn)
            // 如果希望,跳轉(zhuǎn)到登錄 =》登錄后能回跳回來(lái),需要在跳轉(zhuǎn)去攜帶參數(shù),(當(dāng)前的路徑地址)
            // this.$route.fullPath(會(huì)包含查詢參數(shù))
            this.$router.replace({
              path: '/login',
              query: {
                backUrl: this.$route.fullPath
              }
            })
          })
          .catch(() => {
            // on cancel
          })
        return
      }
      console.log('正常請(qǐng)求')
    }

當(dāng)用戶點(diǎn)擊去登錄后:頁(yè)面會(huì)封裝成一個(gè)請(qǐng)求參數(shù)到login界面,隨后要在login界面中通過(guò)路由的方式去判單是否有回調(diào)url,如果有則登錄成功后回到當(dāng)前界面。

對(duì)于一些后端接口,尤其是用戶權(quán)限等,我們需要在請(qǐng)求頭中攜帶token信息,對(duì)此在請(qǐng)求攔截器上進(jìn)行配置

基于vuex管理購(gòu)物車模塊

說(shuō)明:購(gòu)物車 數(shù)據(jù)聯(lián)動(dòng)關(guān)系較多,且通常會(huì)封裝一些小組件,所以為了便于維護(hù),一般都會(huì)將購(gòu)物車的數(shù)據(jù)基于vuex分模塊管理

需求分析:

  • 基本靜態(tài)結(jié)構(gòu)
  • 構(gòu)建vuex cart模塊,獲取數(shù)據(jù)存儲(chǔ)
  • 基于數(shù)據(jù) 動(dòng)態(tài)渲染 購(gòu)物車列表
  • 封裝getters 實(shí)現(xiàn)動(dòng)態(tài)統(tǒng)計(jì)
  • 全選反選功能
  • 數(shù)字框修改數(shù)量功能
  • 編輯切換狀態(tài),刪除功能
  • 空購(gòu)物車處理

對(duì)于vuex cart模塊來(lái)說(shuō):

import { getCartList, updateCart } from '@/api/cart'
export default {
  namespaced: true,
  state () {
    return {
      cartList: [] // 購(gòu)物車列表
    }
  },
  mutations: {
    // 提供一個(gè)修改 cartList 的方法
    setCartList (state, payload) {
      state.cartList = payload
    },
    setCartTotal (state, payload) {
      state.cartTotal = payload
    },
    // 切換狀態(tài)
    toggleCheck (state, goodsId) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.isChecked = !goods.isChecked
    },
    // 全不選或全選
    toggleAll (state, isChecked) {
      state.cartList.forEach(item => {
        item.isChecked = !isChecked
      })
    },
    // 修改列表中的數(shù)量,根據(jù)id修改
    changeCount (state, { goodsId, goodsNum }) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.goods_num = goodsNum
    }
  },
  actions: {
    // 獲取購(gòu)物車列表
    async getCartListAction (content) {
      const { data: { list } } = await getCartList()
      // 后臺(tái)返回的數(shù)據(jù)中,不包含復(fù)選框的選中狀態(tài),為了實(shí)現(xiàn)將來(lái)的的功能
      // 需要手動(dòng)維護(hù)數(shù)據(jù),給每一項(xiàng),添加一個(gè)isChecked狀態(tài),(標(biāo)記當(dāng)前商品是否選中)
      list.forEach(item => {
        item.isChecked = true
      })
      console.log('list', list)
      // 調(diào)用mutations,實(shí)現(xiàn)對(duì)state的修改
      content.commit('setCartList', list)
    },
    async changeCountAction (content, obj) {
      const { goodsNum, goodsId, goodsSkuId } = obj
      // 先本地修改
      content.commit('changeCount', { goodsId, goodsNum })
      // 在同步到后臺(tái)
      await updateCart(goodsId, goodsNum, goodsSkuId)
    }
  },
  getters: {
    // 求所有的商品累加總數(shù)
    cartTotal (state) {
      return state.cartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 選中的商品項(xiàng)
    selCartList (state) {
      return state.cartList.filter(item => item.isChecked)
    },
    // 對(duì)于getter來(lái)說(shuō),可以通過(guò) getters 作為第二個(gè)參數(shù)去訪問(wèn)我們getters中定義的計(jì)算屬性
    // 選中的總數(shù)
    selCartCount (state, getters) {
      return getters.selCartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 選中的總價(jià)
    selCartPrice (state, getters) {
      return getters.selCartList.reduce((sum, item) => sum + item.goods_num * item.goods.goods_price_min, 0).toFixed(2)
    },
    // 是否全選
    isAllChecked (state, getters) {
      return state.cartList.every(item => item.isChecked)
    }
  }
}

對(duì)于購(gòu)物車組件來(lái)說(shuō):

<script>
import CountBox from '@/components/CountBox'
import { mapActions, mapGetters, mapState } from 'vuex'
export default {
  name: 'CartPage',
  components: {
    CountBox: CountBox
  },
  computed: {
    ...mapState('cart', ['cartList']),
    ...mapGetters('cart', ['cartTotal', 'selCartCount', 'selCartPrice', 'selCartList', 'isAllChecked'])
  },
  methods: {
    ...mapActions('cart', ['getCartListAction']),
    init () {
      if (this.$store.getters.token) {
        // 必須是登錄過(guò)的用戶,才能獲取購(gòu)物車列表
        this.getCartListAction()
      }
    },
    // 切換選中狀態(tài)
    toggleCheck (goodsId) {
      this.$store.commit('cart/toggleCheck', goodsId)
    },
    // 全選或反選
    toggleAllCheck () {
      this.$store.commit('cart/toggleAll', this.isAllChecked)
    },
    // 數(shù)字框點(diǎn)擊事件
    async changeCount (goodsNum, goodsId, goodsSkuId) {
      // 調(diào)用 vuex 的action,進(jìn)行數(shù)量修改
      this.$store.dispatch('cart/changeCountAction', {
        goodsNum,
        goodsId,
        goodsSkuId
      })
    }
  },
  data () {
    return {
    }
  },
  created () {
    this.init()
  }
}
</script>

到此這篇關(guān)于Vue-加入購(gòu)物車-判斷token添加登錄提示的文章就介紹到這了,更多相關(guān)vue登錄token內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3與pywebview實(shí)現(xiàn)獲取本地文件夾的絕對(duì)路徑

    Vue3與pywebview實(shí)現(xiàn)獲取本地文件夾的絕對(duì)路徑

    這篇文章主要為大家詳細(xì)介紹了Vue3如何結(jié)合pywebview實(shí)現(xiàn)獲取本地文件夾的絕對(duì)路徑,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-11-11
  • vue項(xiàng)目中將element-ui table表格寫(xiě)成組件的實(shí)現(xiàn)代碼

    vue項(xiàng)目中將element-ui table表格寫(xiě)成組件的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue項(xiàng)目中將element-ui table表格寫(xiě)成組件的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-06-06
  • vue3在setup中使用mapState解讀

    vue3在setup中使用mapState解讀

    這篇文章主要介紹了vue3在setup中使用mapState方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue中同時(shí)監(jiān)聽(tīng)多個(gè)參數(shù)的實(shí)現(xiàn)

    vue中同時(shí)監(jiān)聽(tīng)多個(gè)參數(shù)的實(shí)現(xiàn)

    這篇文章主要介紹了vue中同時(shí)監(jiān)聽(tīng)多個(gè)參數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue.js獲取數(shù)據(jù)庫(kù)數(shù)據(jù)實(shí)例代碼

    vue.js獲取數(shù)據(jù)庫(kù)數(shù)據(jù)實(shí)例代碼

    本篇文章主要介紹了vue.js獲取數(shù)據(jù)庫(kù)數(shù)據(jù)實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • vue如何通過(guò)某個(gè)字段獲取詳細(xì)信息

    vue如何通過(guò)某個(gè)字段獲取詳細(xì)信息

    這篇文章主要介紹了vue如何通過(guò)某個(gè)字段獲取詳細(xì)信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vue3中markRaw示例詳解

    vue3中markRaw示例詳解

    markRaw是將一個(gè)對(duì)象標(biāo)記為普通對(duì)象,而toRaw是將reactive對(duì)象變?yōu)槠胀▽?duì)象,在 Vue 3 中,markRaw 是一個(gè)用于告訴 Vue 的響應(yīng)性系統(tǒng)不要對(duì)某個(gè)對(duì)象進(jìn)行轉(zhuǎn)換或追蹤其響應(yīng)性的函數(shù),下面給大家介紹vue3中markRaw詳解,感興趣的朋友一起看看吧
    2024-04-04
  • vue自定義權(quán)限標(biāo)簽詳細(xì)代碼示例

    vue自定義權(quán)限標(biāo)簽詳細(xì)代碼示例

    這篇文章主要給大家介紹了關(guān)于vue自定義權(quán)限標(biāo)簽的相關(guān)資料,在Vue中你可以通過(guò)創(chuàng)建自定義組件來(lái)實(shí)現(xiàn)自定義標(biāo)簽組件,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-09-09
  • vue3+vite中使用vuex的具體步驟

    vue3+vite中使用vuex的具體步驟

    在vue3+vite創(chuàng)建的項(xiàng)目中使用vuex,要注意的是vite有部分寫(xiě)法和之前的webpack是不同的,這篇文章主要介紹了vue3+vite中使用vuex的具體步驟,需要的朋友可以參考下
    2022-11-11
  • vue使用websocket及封裝過(guò)程

    vue使用websocket及封裝過(guò)程

    這篇文章主要介紹了vue使用websocket及封裝過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評(píng)論