Vue加入购物车判断token添加登录提示功能

 更新时间:2023年11月27日 14:12:42   作者:自学Java笔记本  
加入购物车,是一个登录后的用户 才能进行的操作,所以需要进行鉴权判断,判断用户token是否存在,这篇文章主要介绍了Vue加入购物车判断token添加登录提示,需要的朋友可以参考下

Vue-加入购物车-判断token添加登录提示

目标:给未登录的用户,添加登录提示
说明:加入购物车,是一个登录后的用户 才能进行的操作,所以需要进行鉴权判断,判断用户token是否存在

  • 若存在:继续加入购物车操作
  • 不存在:提示用户未登录,引导到登录页,登录完回跳
addCart () {
      // 判断 token 是否存在
      // 1.如果token不存在,弹确认框
      // 2.如果token存在,继续请求操作
      if (!this.$store.getters.token) {
        // 弹确认框
        this.$dialog.confirm({
          title: '温馨提示',
          message: '此时需要先登录才能继续操作哦',
          confirmButtonText: '去登录',
          cancelButtonText: '再逛逛'
        })
          .then(() => {
            // 点击确认表示用户要去登录界面,此时让路由跳转
            // 如果希望,跳转到登录 =》登录后能回跳回来,需要在跳转去携带参数,(当前的路径地址)
            // this.$route.fullPath(会包含查询参数)
            this.$router.replace({
              path: '/login',
              query: {
                backUrl: this.$route.fullPath
              }
            })
          })
          .catch(() => {
            // on cancel
          })
        return
      }
      console.log('正常请求')
    }

当用户点击去登录后:页面会封装成一个请求参数到login界面,随后要在login界面中通过路由的方式去判单是否有回调url,如果有则登录成功后回到当前界面。

对于一些后端接口,尤其是用户权限等,我们需要在请求头中携带token信息,对此在请求拦截器上进行配置

基于vuex管理购物车模块

说明:购物车 数据联动关系较多,且通常会封装一些小组件,所以为了便于维护,一般都会将购物车的数据基于vuex分模块管理

需求分析:

  • 基本静态结构
  • 构建vuex cart模块,获取数据存储
  • 基于数据 动态渲染 购物车列表
  • 封装getters 实现动态统计
  • 全选反选功能
  • 数字框修改数量功能
  • 编辑切换状态,删除功能
  • 空购物车处理

对于vuex cart模块来说:

import { getCartList, updateCart } from '@/api/cart'
export default {
  namespaced: true,
  state () {
    return {
      cartList: [] // 购物车列表
    }
  },
  mutations: {
    // 提供一个修改 cartList 的方法
    setCartList (state, payload) {
      state.cartList = payload
    },
    setCartTotal (state, payload) {
      state.cartTotal = payload
    },
    // 切换状态
    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
      })
    },
    // 修改列表中的数量,根据id修改
    changeCount (state, { goodsId, goodsNum }) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.goods_num = goodsNum
    }
  },
  actions: {
    // 获取购物车列表
    async getCartListAction (content) {
      const { data: { list } } = await getCartList()
      // 后台返回的数据中,不包含复选框的选中状态,为了实现将来的的功能
      // 需要手动维护数据,给每一项,添加一个isChecked状态,(标记当前商品是否选中)
      list.forEach(item => {
        item.isChecked = true
      })
      console.log('list', list)
      // 调用mutations,实现对state的修改
      content.commit('setCartList', list)
    },
    async changeCountAction (content, obj) {
      const { goodsNum, goodsId, goodsSkuId } = obj
      // 先本地修改
      content.commit('changeCount', { goodsId, goodsNum })
      // 在同步到后台
      await updateCart(goodsId, goodsNum, goodsSkuId)
    }
  },
  getters: {
    // 求所有的商品累加总数
    cartTotal (state) {
      return state.cartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 选中的商品项
    selCartList (state) {
      return state.cartList.filter(item => item.isChecked)
    },
    // 对于getter来说,可以通过 getters 作为第二个参数去访问我们getters中定义的计算属性
    // 选中的总数
    selCartCount (state, getters) {
      return getters.selCartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 选中的总价
    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)
    }
  }
}

对于购物车组件来说:

<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) {
        // 必须是登录过的用户,才能获取购物车列表
        this.getCartListAction()
      }
    },
    // 切换选中状态
    toggleCheck (goodsId) {
      this.$store.commit('cart/toggleCheck', goodsId)
    },
    // 全选或反选
    toggleAllCheck () {
      this.$store.commit('cart/toggleAll', this.isAllChecked)
    },
    // 数字框点击事件
    async changeCount (goodsNum, goodsId, goodsSkuId) {
      // 调用 vuex 的action,进行数量修改
      this.$store.dispatch('cart/changeCountAction', {
        goodsNum,
        goodsId,
        goodsSkuId
      })
    }
  },
  data () {
    return {
    }
  },
  created () {
    this.init()
  }
}
</script>

到此这篇关于Vue-加入购物车-判断token添加登录提示的文章就介绍到这了,更多相关vue登录token内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue实现给某个数据字段添加颜色

    vue实现给某个数据字段添加颜色

    这篇文章主要介绍了vue实现给某个数据字段添加颜色方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue中watch监听器的触发时机(watch的坑及解决)

    vue中watch监听器的触发时机(watch的坑及解决)

    这篇文章主要介绍了vue中watch监听器的触发时机(watch的坑及解决),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 基于vue.js路由参数的实例讲解——简单易懂

    基于vue.js路由参数的实例讲解——简单易懂

    下面小编就为大家带来一篇基于vue.js路由参数的实例讲解——简单易懂。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • VUE axios每次请求添加时间戳问题

    VUE axios每次请求添加时间戳问题

    这篇文章主要介绍了VUE axios每次请求添加时间戳问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Vue解决element-ui消息提示$message重叠问题

    Vue解决element-ui消息提示$message重叠问题

    这篇文章主要为大家介绍了Vue解决element-ui消息提示$message重叠问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • vscode中vue代码提示与补全没反应解决(vetur问题)

    vscode中vue代码提示与补全没反应解决(vetur问题)

    这篇文章主要给大家介绍了关于vscode中vue代码提示与补全没反应解决(vetur问题)的相关资料,文中通过图文将解决的方法介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • layui实际项目使用过程中遇到的兼容性问题及解决

    layui实际项目使用过程中遇到的兼容性问题及解决

    这篇文章主要介绍了layui实际项目使用过程中遇到的兼容性问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue利用better-scroll实现轮播图与页面滚动详解

    vue利用better-scroll实现轮播图与页面滚动详解

    在我们日常的项目开发中,处理滚动和轮播图是再常见不过的需求了,下面这篇文章主要给大家介绍了关于vue利用better-scroll实现轮播图与页面滚动的相关资料,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-10-10
  • vue中点击下载图片的实现方法

    vue中点击下载图片的实现方法

    这篇文章主要给大家介绍了关于vue中点击下载图片的实现方法,在Vue的模板中,我们可以将下载属性绑定至或元素上,用来实现点击下载,需要的朋友可以参考下
    2023-08-08
  • vue 根据选择的月份动态展示日期对应的星期几

    vue 根据选择的月份动态展示日期对应的星期几

    这篇文章主要介绍了vue 如何根据选择的月份动态展示日期对应的星期几,帮助大家更好的利用vue框架处理日期需求,感兴趣的朋友可以了解下
    2021-02-02

最新评论