Vue+Node.js开发Xmall商城——Day3

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

Xxmall商城项目迎来了第三天了,今天碰到的难题是登录注册方面的,将登陆成功的用户信息长久的保存在页面上,刷新后也不会重置。

如下是我实现登陆功能的整个思路,首先login登陆接口如下:

// 模拟一个登陆的接口
app.post('/api/login', (req, res) => {
    console.log(req.body.user);
    // 登录成功获取用户名
    let username = req.body.user
    //一系列的操作
    res.json({
        // 进行加密的方法
        // sing 参数一:加密的对象 参数二:加密的规则 参数三:对象
        token: jwt.sign({ username: username }, 'abcd', {
            // 过期时间
            expiresIn: "3000s"
        }),
        username,
        state: 1,
        file: '/static/images/1570600179870.png',
        code: 200,
        address: null,
        balance: null,
        description: null,
        email: null,
        message: null,
        phone: null,
        points: null,
        sex: null,
        id: 62
    })
})

从表单提交获取用户名后设置了过期时间,并且登陆成功后会在localstorage本地存储中保存id、

username和生成的token,token就是每个用户的标识。
 if (valid) {
          //   获取用户名和密码
          // let {user,pass} = this.ruleForm;
          let res = await this.$http.post("/api/login", this.ruleForm);
          if (res.data.code === 200) {
            console.log(res.data)
            let { username, token, id } = res.data;
            //  持久化 存储
            setStore("token", token);
            setStore("id", id);
            setStore("username", username);
            this.$router.push('/')
          }

这是请求访问login的代码,也就是表单submit按钮点击事件。

如下是设置获取和移除本地存储的三个已经封装好的方法,所以我是直接导入使用的。

export const setStore = (name, content) => {
    if (!name) return;
    if (typeof content !== 'string') {
        content = JSON.stringify(content);
    }
    window.localStorage.setItem(name, content);
}
export const getStore = name => {
    if (!name) return;
    return window.localStorage.getItem(name);
}
export const removeStore = name => {
    if(!name) return;
    window.localStorage.removeItem(name);
}

另外我在main.js中设置了vuex拦截器,当路由跳转时判断本地存储中是否有takon,也就是判断是否为登录状态。如果发现用户登录,在request响应头部添加token。

//判断token是否存在
axios.interceptors.request.use(config=>{
  const token = getStore('token');
  //如果用户已经登录
  if(token){
    config.headers.common['Authorization'] = token;
  }
  return config;
},error=>{
  console.log(error);
  return Promise.reject(error);
})

接下来设置了登录组件的路由守卫,并且登陆成功后把用户信息传给vuex中,保存用户信息。

//登录路由守卫
router.beforeEach(async(to,from,next)=>{
  const res = await axios.post('/api/validate');
  let data = res.data;
  console.log(data)
  if(data.state !== 1){
    //用户还没登陆
    if(to.matched.some(record=>record.meta.auth)){
      next({
        path:'/login'
      })
    }else{
      next();
    }
  }else{
    //保存用户信息
    store.commit('ISLOGIN',data);
    if(to.path==='login'){
      router.push({
        path:'/'
      })
    }
    next()
  }
})

在这里插入图片描述
接下来,实现了添加到购物车卡片显示的列表渲染,效果如下:
在这里插入图片描述
由于这些数据在路由跳转的过程中应该保持,所以在vuex中定义操作是最合适不过的了,我的实现大体思路如下:在每一个商品详情路由中的加入购物车按钮定义点击事件,当第一次点击时创建一个对象,包含该商品的名称、单价、数量以及图片链接;而当第二次点击时则会将数量进行累加,保持一个对象。

 let name = this.goodsName;
          if(this.cardList.name){
            this.cardList.num += this.goodsNum;
          }else{
            this.cardList = {
              name:this.goodsName,
              img:this.big,
              num:this.goodsNum,
              price:this.price
            }
          }

接下来就是vuex的操作了,每次把这个对象添加到vuex中的购物车数组中即可。

state: {
    loginState:false, //登录状态
    userInfo:null,  //用户信息
    cartList:[], //购物车列表
    addCartList:{}, //待添加到购物车的订单
    showCart:false
  },
  mutations: {
    //购物车卡片显示
    SHOWCART(state,{showCart}){
      state.showCart = showCart
    },
    //添加商品至购物车
    ADDCART(state,{addCartList}){
      console.log(addCartList)
      if(!state.cartList.find(item=>addCartList.name==item.name)){
        state.cartList.push(addCartList);
      }
      console.log(state.cartList);
    },

在组件中的调用:

 //如果购物车中没有该商品
            this.ADDCART({  
              addCartList:this.cardList
           })

第三天结束,有点小难度…头晕

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
XMall是一个基于SOA架构的分布式电商购物商城,前后端分离。前台商城Vue全家桶;后台管理系统:Dubbo/SSM/Elasticsearch/Redis/MySQL/ActiveMQ/Shiro/Zookeeper等。 于SOA架构的分布式购物电商商城 后台管理系统:管理商品、订单、类目、商品规格属性、用户、权限、系统统计、系统日志以及前台内容等功能 前台系统:用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作 会员系统:用户可以在该系统中查询已下的订单、管理订单、我的优惠券等信息 订单系统:提供下单、查询订单、修改订单状态、定时处理订单 搜索系统:提供商品的搜索功能 单点登录系统:为多个系统之间提供用户登录凭证以及查询登录用户的信息 XMall v1.1更新日志(需更新前后台代码及SQL) 接入自己开源的XPay个人免签收款支付系统 更新Dubbo(2.6.1)、ES(6.2.3)等依赖版本 消ES需在页面中配置及跨域问题,ES默认配置集群名改为原elasticsearch 修复后台统计热卖商品SQL错误,xmall-front-web模块支持SpringMVC文件上传配置 修改金额字段类型优化SQL与备注 优化后台页面 修复用户修改BUG 优化批量删除 优化商品分类添加 重构首页,后台可配置,包括3D轮播图 后台新增缓存管理功能菜单 完成订单打印发货等功能,实现快递管理 增添订单统计报表 修复前后端分离极验验证码session存储问题 实现ES IK分词插件扩展词典库管理 增添限流 2018.7.22 取消快速搜索接口需前端配置 发送邮件端口改为465 2018.7.27 首页导航栏可后台配置 2019.10.06 修复分类管理BUG 开源小程序前端 注:SKU设计预计将在小程序后台实现 极验验证码移除文档

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sorryhc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值