京东淘宝day18

1. 完成用户退出操作

1.1 业务说明

1).当用户点击退出按钮时,应该重定向到系统首页
2).删除redis中的数据
3).删除Cookie中的数据

1.2 编辑UserController

 /**
     * 完成用户退出操作
     * 1.重定向到系统首页
     * 2.要求删除redis中的数据  K-V结构  先获取key
     * 3.动态获取Cookie中的数据
     * 4.删除Cookie中的数据
     * url地址: http://www.jt.com/user/logout.html
     *
     */
    @RequestMapping("/logout")
    public String logout(HttpServletRequest request,HttpServletResponse response){
      Cookie[] cookies = request.getCookies();
      if(cookies !=null && cookies.length>0){
          for (Cookie cookie : cookies){
              if(JT_TICKET.equals(cookie.getName())){
                  String ticket = cookie.getValue();
                  //删除redis的数据
                  jedisCluster.del(ticket);
                  //删除cookie的数据
                  cookie.setMaxAge(0); //0 立即删除  -1 关闭浏览器之后删除
                  cookie.setPath("/");
                  cookie.setDomain("jt.com");
                  response.addCookie(cookie);
              }
          }
      }

        return "redirect:/";
    }

1.3 封装工具API

作用: API主要的作用 简化Cookie调用的过程. 1.获取Cookie对象 2.可以根据cookieName 获取cookie的值 3.新增cookie 删除cookie

public class CookieUtil {

    //1.获取cookie对象
    public static Cookie getCookie(HttpServletRequest request,String cookieName){
        Cookie[] cookies = request.getCookies();
        if(cookies !=null && cookies.length>0){
            for(Cookie cookie : cookies){
               if(cookieName.equals(cookie.getName())){
                   return cookie;
               }
            }
        }
        return null;
    }

    //2.获取Cookie值
    public static String getCookieValue(HttpServletRequest request,String cookieName){
        Cookie cookie = getCookie(request,cookieName);
        return cookie ==null?null:cookie.getValue();
    }

    //3.新增Cookie/删除Cookie写法
    public static void addCookie(HttpServletResponse response,String cookieName,String cookieValue,String path,String domain,Integer seconds){
        Cookie cookie = new Cookie(cookieName,cookieValue);
        cookie.setPath(path);
        cookie.setDomain(domain);
        cookie.setMaxAge(seconds);
        response.addCookie(cookie);
    }
}

1.4 重构UserController 完成退出操作

 /**
     * 完成用户退出操作
     * 1.重定向到系统首页
     * 2.要求删除redis中的数据  K-V结构  先获取key
     * 3.动态获取Cookie中的数据
     * 4.删除Cookie中的数据
     * url地址: http://www.jt.com/user/logout.html
     *
     */
    @RequestMapping("/logout")
    public String logout(HttpServletRequest request,HttpServletResponse response){
        String ticket = CookieUtil.getCookieValue(request, JT_TICKET);
        if(StringUtils.hasLength(ticket)){
            //1.删除redis
            jedisCluster.del(ticket);
            //2.删除cookie
            CookieUtil.addCookie(response,JT_TICKET,
                    "", "/", "jt.com", 0);
        }
        return "redirect:/";



      /*Cookie[] cookies = request.getCookies();
      if(cookies !=null && cookies.length>0){
          for (Cookie cookie : cookies){
              if(JT_TICKET.equals(cookie.getName())){
                  String ticket = cookie.getValue();
                  //删除redis的数据
                  jedisCluster.del(ticket);
                  //删除cookie的数据
                  cookie.setMaxAge(0); //0 立即删除  -1 关闭浏览器之后删除
                  cookie.setPath("/");
                  cookie.setDomain("jt.com");
                  response.addCookie(cookie);
              }
          }
      }

        return "redirect:/";
        */
    }

2. 实现商品数据展现

2.1 构建JT-MANAGE为服务生产者

2.1.1 定义接口的实现

在这里插入图片描述

2.1.2 编辑YML配置文件

在这里插入图片描述

2.1.3编辑服务消费者

在这里插入图片描述

2.2 实现商品动态获取

2.2.1 业务需求

1.当用户点击商品按钮时,跳转到商品的展现页面 item.jsp
2.根据itemId号 查询item表/itemDesc表
3.将数据在页面中进行展现
在这里插入图片描述

2.2.2 编辑ItemController

@Controller
public class ItemController {

    //启动时是否校验有服务提供者
    @Reference(check=false)
    private DubboItemService itemService;

    /**
     * 根据商品ID查询商品信息
     * 1.URL地址:http://www.jt.com/items/562379.html
     * 2.参数:   562379 restFul风格
     * 3.返回值: String
     * 4.页面取值操作
     *      ${item.title }          获取商品信息   同步取值
     *      ${itemDesc.itemDesc }   获取商品详情信息
     */
    @RequestMapping("/items/{itemId}")
    public String findItemById(@PathVariable Long itemId, Model model){
        //1.获取商品相关信息
        Item item = itemService.findItemById(itemId);
        ItemDesc itemDesc = itemService.findItemDescById(itemId);

        //2.将数据传递到页面中
        model.addAttribute("item",item);
        model.addAttribute("itemDesc",itemDesc);

        //跳转到商品展现页面
        return "item";
    }

}

2.2.3 编辑ItemService

@Service(timeout = 3000)
public class DubboItemServiceImpl implements DubboItemService {

    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private ItemDescMapper itemDescMapper;


    @Override
    public Item findItemById(Long itemId) {
        return itemMapper.selectById(itemId);
    }

    @Override
    public ItemDesc findItemDescById(Long itemId) {
        return itemDescMapper.selectById(itemId);
    }
}

2.2.4 商品展现效果测试

在这里插入图片描述

3 购物车实现

3.1 新建Cat POJO对象

在这里插入图片描述

3.2 创建JT-CART项目

3.2.1 创建JT-CART项目

在这里插入图片描述

3.2.2 添加继承/依赖/插件

 <parent>
        <artifactId>jt</artifactId>
        <groupId>com.jt</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>


    <!--添加jar包文件依赖-->
    <dependencies>
        <dependency>
            <groupId>com.jt</groupId>
            <artifactId>jt-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <!--所有业务系统,必须添加build标签-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

3.2.3 添加继承/依赖/插件

<parent>
        <artifactId>jt</artifactId>
        <groupId>com.jt</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>


    <!--添加jar包文件依赖-->
    <dependencies>
        <dependency>
            <groupId>com.jt</groupId>
            <artifactId>jt-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <!--所有业务系统,必须添加build标签-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

3.2.3 构建Dubbo Cart项目

在这里插入图片描述

3.2.4 编辑YML配置文件

server:
  port: 8094
  servlet:
    context-path: /
spring:
  datasource:
    #引入druid数据源
    #type: com.alibaba.druid.pool.DruidDataSource
    #driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    #链接的是数据库代理
    #url: jdbc:mysql://192.168.126.129:8066/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
#mybatis-plush配置
mybatis-plus:
  type-aliases-package: com.jt.pojo
  mapper-locations: classpath:/mybatis/mappers/*.xml
  configuration:
    map-underscore-to-camel-case: true

logging:
  level: 
    com.jt.mapper: debug

#关于Dubbo配置
dubbo:
  scan:
    basePackages: com.jt    #指定dubbo的包路径
  application:              #应用名称
    name: provider-cart    #一个接口对应一个服务名称 如果是多个实现类则应用名称一致
  registry:
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
  protocol:  #指定协议
    name: dubbo  #使用dubbo协议(tcp-ip)  web-controller直接调用sso-Service
    port: 20882  #每一个服务都有自己特定的端口 不能重复.

3.3 完成购物车列表展现

3.3.1 业务需求

当用户点击购物车按钮时,应该跳转到购物车列表页面中,要求根据userId 查询购物车列表数据.
同时跳转页面为 cart.jsp
在这里插入图片描述

3.3.2 编辑CartController

@Controller
@RequestMapping("/cart")
public class CartController {

    @Reference(check = false)
    private DubboCartService cartService;

    /**
     * 展现购物车列表数据
     * url地址:http://www.jt.com/cart/show.html
     * 参数:   必须获取userId=7L
     * 返回值:  cart.jsp
     * 页面取值参数: ${cartList}
     */
     @RequestMapping("/show")
     public String findCartList(Model model){
         long userId = 7L;   //暂时写死,后期维护
         List<Cart> cartList = cartService.findCartList(userId);
         model.addAttribute("cartList",cartList);
         return "cart";
     }
}

3.3.2 编辑CartService

@Service
public class DubboCartServiceImpl implements DubboCartService{

    @Autowired
    private CartMapper cartMapper;


    @Override
    public List<Cart> findCartList(long userId) {

        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        return cartMapper.selectList(queryWrapper);
    }
}

3.3.3 页面效果展现

在这里插入图片描述

3.4 购物车数量修改

3.4.1 业务分析

1).页面URL分析
在这里插入图片描述
2).页面JS分析

$(".increment").click(function(){//+
			var _thisInput = $(this).siblings("input");
			_thisInput.val(eval(_thisInput.val()) + 1);
			$.post("/cart/update/num/"+_thisInput.attr("itemId")+"/"+_thisInput.val(),function(data){
				TTCart.refreshTotalPrice();
			});
		});

3.4.2 编辑CartController

 /**
     *  业务需求: 实现商品数量的更新操作
     *  url:http://www.jt.com/cart/update/num/1474391990/10
     *  参数: userId=7/itemId/num
     *  返回值: void
     *
     *  用法: 如果restFul参数名称与对象的属性名称一致,则可以使用对象的方式接收
     */
    @RequestMapping("/update/num/{itemId}/{num}")
    @ResponseBody //1.json返回   2.表示ajax请求结束
    public void updateCartNum(Cart cart){

        long userId = 7L;
        cart.setUserId(userId);
        cartService.updateCartNum(cart);
    }

3.4.3 编辑CartService

在这里插入图片描述

3.5 购物车新增操作

3.5.1 业务分析

说明: 当用户查询商品之后进行加购时,应该跳转(重定向)到购物车展现页面.
注意事项:
同一个用户重复添加相同的数据时,只修改商品的数量.
在这里插入图片描述

3.5.2 页面分析

1).页面URL分析
在这里插入图片描述
2).页面参数分析
在这里插入图片描述
3).页面JS分析
3.1 form标签
在这里插入图片描述

3.2 表单提交
在这里插入图片描述

3.5.3 编辑CartController

  /**
     * 完成购物车入库操作
     * url地址:http://www.jt.com/cart/add/1474391990.html
     * 参数:   cart form表单提交
     * 返回值: 重定向到购物车列表页面
     */
    @RequestMapping("/add/{itemId}")
    public String saveCart(Cart cart){

        long userId = 7L;
        cart.setUserId(userId);
        cartService.saveCart(cart);
        return "redirect:/cart/show.html";
    }

3.5.3 编辑CartService

//如果用户重复加购,则只做数量的修改
    //根据userId和itemId 判断数据是否有值
    @Override
    @Transactional
    public void saveCart(Cart cart) {
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", cart.getUserId());
        queryWrapper.eq("item_id", cart.getItemId());
        Cart cartDB = cartMapper.selectOne(queryWrapper);
        if(cartDB == null){ //表示数据库中没有记录,直接入库
            cartMapper.insert(cart);
        }else{  //数据库中有记录 只改数量
            int num = cart.getNum() + cartDB.getNum();
            //1.手写sql 2.简洁封装
            Cart cartTemp = new Cart();
            cartTemp.setId(cartDB.getId()).setNum(num);
            cartMapper.updateById(cartTemp);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Riqk_Qin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值