大数据正式京淘11

大数据正式京淘11

注册业务模块

  • 注册
    • 注册的逻辑
      1. 用户填写信息+ajax异步校验,给出相应的提示
      2. 注册成功:添加用户的信息到数据库

登录业务模块

  • 登录
    • 登录的逻辑
      1. 用户填写信息,简单判空校验
      2. 后台数据的校验
      3. 登录成功:展示主页和用户的部分信息;写入redis缓存--不同服务器都可以访问用户数据,解决session不共享数据的问题;并将key值写入到Cookie中返回给客户

登出业务模块

  • 登出
    • 登出的逻辑
      1. 将该用户的cookie删除
      2. 跳转到相应的界面

购物车子项目

搭建购物车

  1. 新建maven的web项目
  2. 更改项目的配置
  3. 导入相应的配置文件
  4. 测试运行
  5. 项目整体的结构

购物车查询模块

  • 设计
    1. url地址访问购物车的界面
    2. nginx转换地址
    3. jt_web找到相应的界面,同时从jt_cart获取数据
    4. 展示所有的购物车信息

购物车添加模块

  • 设计
    1. url地址访问购物车的添加界面
    2. nginx转换地址
    3. jt_web找到相应的商品添加界面,同时从jt_cart获取数据
    4. 展示添加的商品信息

购物车商品数量添加模块

  • 设计
    1. url地址访问购物车的界面
    2. nginx转换地址
    3. jt_web找到相应的界面,点击“-”或“+”,增减商品的数量,同时用ajax实时从jt_cart获取数据
    4. 展示商品的数量信息

购物车删除模块

  • 设计
    1. url地址访问购物车的界面
    2. nginx转换地址
    3. jt_web找到相应的界面,点击删除商品
    4. 展示删除后的所有的购物车信息

购物车部分代码展示

Controller层

package com.peng.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.peng.pojo.Cart;
import com.peng.service.CartService;
import com.peng.vo.SysResult;

@Controller("cartController")
@RequestMapping("/cart")
public class CartController {
    @Autowired
    @Qualifier("cartService")
    private CartService cartService;

    // 查询我的所有的购物车信息
    @RequestMapping("/query/{userId}")
    @ResponseBody
    public SysResult queryMyCart(@PathVariable Long userId) {
        List<Cart> cartList = cartService.queryMyCart(userId);
        return SysResult.oK(cartList);
    }

    // 保存我的购物车
    @RequestMapping("/save")
    @ResponseBody
    public SysResult saveCart(Cart cart) {
        try {
            cartService.saveCart(cart);
            return SysResult.oK();
        } catch (Exception e) {
            return SysResult.build(201, "保存失败");
        }
    }

    // 更新商品的数量--购买时点击数量进行的操作
    @RequestMapping("/update/num/{userId}/{itemId}/{num}")
    @ResponseBody
    public SysResult updateNum(@PathVariable Long userId, @PathVariable Long itemId, @PathVariable Long num) {
        try {
            // 封装一个对象
            Cart cart = new Cart();
            cart.setUserId(userId);
            cart.setItemId(itemId);
            cart.setNum(Integer.parseInt(Long.toString(num)));
            cartService.updateNum(cart);
            return SysResult.oK();
        } catch (Exception e) {
            return SysResult.build(201, "更新失败");
        }
    }

    // 删除购物车
    @RequestMapping("/delete/{userId}/{itemId}")
    @ResponseBody
    public SysResult deleteCart(@PathVariable Long userId, @PathVariable Long itemId) {
        try {
            // 构造中间参数
            Cart cart = new Cart();
            cart.setUserId(userId);
            cart.setItemId(itemId);
            cartService.deleteCart(cart);
            return SysResult.oK();
        } catch (Exception e) {
            return SysResult.build(201, "删除失败");
        }
    }

}

Service层

  • Service接口

    package com.peng.service;
    
    import java.util.List;
    
    import com.peng.pojo.Cart;
    
    public interface CartService {
        /**
         * 通过userId查询所有的购物车信息
         * 
         * @param userId
         * @return
         */
        List<Cart> queryMyCart(Long userId);
    
        /**
         * 保存购物车的信息
         * 
         * @param cart
         */
        void saveCart(Cart cart);
    
        /**
         * 更新数量
         * 
         * @param cart
         */
        void updateNum(Cart cart);
    
        /**
         * 删除商品
         * 
         * @param cart
         */
        void deleteCart(Cart cart);
    }
    
  • Service实现类

    package com.peng.service.impl;
    
    import java.util.Date;
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    import com.peng.mapper.CartMapper;
    import com.peng.pojo.Cart;
    import com.peng.service.BaseService;
    import com.peng.service.CartService;
    
    @Service("cartService")
    public class CartServiceImpl extends BaseService<Cart> implements CartService {
        @Autowired
        @Qualifier("cartMapper")
        private CartMapper cartMapper;
    
        @Override
        public List<Cart> queryMyCart(Long userId) {
            return cartMapper.queryMyCart(userId);
        }
    
        @Override
        public void saveCart(Cart cart) {
            /* 判断商品是否存在--不存在,新增;存在,更新 */
            // 不能直接用传进来的cart来查询--不准确,改造一下
            Cart cart_new = new Cart();
            cart_new.setUserId(cart.getUserId());
            cart_new.setItemId(cart.getItemId());
            // 查询
            Cart isExitQueryCart = super.queryByWhere(cart_new);
            // 判断
            if (null == isExitQueryCart) {// 不存在--进行新增
                cart.setCreated(new Date());
                cart.setUpdated(cart.getCreated());
                cartMapper.insertSelective(cart);
            } else {// 存在--进行更新
                isExitQueryCart.setNum(isExitQueryCart.getNum() + cart.getNum());
                isExitQueryCart.setUpdated(new Date());
                cartMapper.updateByPrimaryKeySelective(isExitQueryCart);
            }
        }
    
        @Override
        public void updateNum(Cart cart) {
            cartMapper.updateNum(cart);
        }
    
        @Override
        public void deleteCart(Cart cart) {
            cartMapper.delete(cart);
        }
    
    }
    

Mapper接口【注:其他没有的方法用的通用mapper】

#
    package com.peng.mapper;

    import java.util.List;

    import com.peng.pojo.Cart;

    public interface CartMapper extends SysMapper<Cart> {
        /**
         * 通过userId查询所有的购物车信息
         * 
         * @param userId
         * @return
         */
        List<Cart> queryMyCart(Long userId);

        /**
         * 更新商品的数量
         * 
         * @param cart
         */
        void updateNum(Cart cart);
    }

Mapper文件

#
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.peng.mapper.CartMapper">
        <select id="queryMyCart" resultType="Cart">
            select * from tb_cart
            where
            user_id=#{userId}
            order by created desc
        </select>
        <!-- 更新商品的数量 -->
        <update id="updateNum" parameterType="Cart">
            update tb_cart set num=#{num} where user_id=#{userId} and item_id=#{itemId}
        </update>
    </mapper>

问题集锦

1.Cookie

  • Cookie是和域名相绑定的,nginx路径转换的时候带不过去

    • 解决:在nginx下的配置文件中配置

      proxy_set_header X-Forwarded-Host $host;
      
      server {
          listen       80;
          server_name  www.jt.com;
          #charset koi8-r;
          #access_log  logs/host.access.log  main;
      
          proxy_set_header X-Forwarded-Host $host;
          proxy_set_header X-Forwarded-Server $host;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $host;
      
          location / {
                 proxy_pass http://127.0.0.1:8082;
                 proxy_connect_timeout 600;
                 proxy_read_timeout 600;
          }
      }
      

2.Cookie的安全性

  • 解决办法
    1. 让redis过期
      • set方法中设置过期时间
    2. 二次校验--短信
      • 利用工具包,运营商提供的接口
      • 后台提供两个参数【手机号,随机数】
      • 用户输入账号,密码,验证码(随机数)
      • 后台校验【账号+密码+验证码】

3.不同系统的对接

  • js请求【前台中发起请求】:jsonp返回
  • HttpClient请求【后台中发起请求】:json返回

4.406错误

  • 后台操作不当:
    • 用类似“*.html”的路径访问
    • 控制层可以拦截到
    • 返回出错--406
  • 问题的本质:
    • 当用类似静态的路径访问后台时,框架会自动认为之后的操作会和静态文件有关系
    • 而且会自动加入一些访问静态文件的配置,导致应该返回的数据累赘
    • 最终目标不能识别,产生错误
  • 解决
    • 将请求的路径写成动态请求的方式,即不要以形如“.html”等的请求出现

5.数据库冗余字段

  • 数据库解读
    • 同一个用户可以有众多的不同的商品
    • 冗余字段设计--单表设计,没有关联,需要从item查出来保存在这里
      1. 商品id
      2. 商品标题
      3. 商品主图
      4. 商品价格
    • 冗余数据的处理方式
      • 方式一:通过前台传来的数据直接以itemId访问后台查询这些冗余数据
      • 方式二:前台的数据先到达Cart服务,然后提取出itemId然后访问后台把冗余信息找出来
      • 原则:系统间的依赖越少越好--即系统的访问次数越少越好

6.购物车的操作设计user_id和Item_id

  1. 联合主键key【user_id,item_id】
  2. 形如queryWhere的条件查询,记得改造cart对象,只有不变的数据才能到数据库查到真正的数据

等等的小问题,你出错了吗~.~

补充-设计之美

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乘风御浪云帆之上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值