SpringBoot part4 day18

复习:
将用户登陆成功信息存在中立的第三方,可以选择redis,redis是内网访问,比较快
首先用户登陆,web端到sso端跨域实现用户验证,如果有用户信息,利用uuid生成随机的
ticket当成redis中的key,将用户信息进行脱敏处理后,当redis的value,之后在web服务端的controller中定义cookie,名字为"TJ-TICKET",cookie的值为ticket,设置cookie的访问路径,共享区域,存活时间;其他模块进行登陆的时候,通过cookie的“JT-TICKET”获取ticket,通过ticket获取里面的信息
在这里插入图片描述

1 完成用户退出操作

1.1业务说明

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

1.2 编辑jt-web 的UserController

@Autowiredprivate HttpClientService httpClientService;@Autowiredprivate JedisCluster jedisCluster;

在这里插入图片描述

 /*** 完成用户退出的操作:* 1.重定向到系统首页* url:http://www.jt.com/user/logout.html*  2.删除redis中的数据  k-v结构*     首先从cookie中获取ticket*  3.动态获取Cookie中的数据** */@RequestMapping("/logout")public String doLogout(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   需要先设置cookied的属性,不然浏览器中有一摸一样的名字但属性不同的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.删除redisjedisCluster.del(ticket);//2.删除cookieCookieUtil.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配置文件

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

在这里插入图片描述
2.1.3编辑服务消费者
在这里插入图片描述

2.2 实现商品动态获取

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

@Controller
public class ItemController {//启动时是否校验有服务提供者@Reference(check = false)private DubboItemService itemService;/*** 根据商品ID查询商品信息* 1.URL地址:http://www.jt.com/item/2323432;* 2.参数:2323432  restFul风格* 3.返回值:String* 4.页面取值操作* ${item.tittle}  获取商品信息(jsp+el表达式 同步取值)* ${itemDesc.itemDesc} 获取商品详情信息** */@RequestMapping("/items/{itemId}")public String findItemById(@PathVariable Long itemId, Model model){System.out.println("数据库查询开始");//1.获取商品相关信息Item item = itemService.findItemById(itemId);System.out.println(item);ItemDesc itemDesc = itemService.findItemDescById(itemId);System.out.println(itemDesc);System.out.println("数据库查询结束");//2.将数据传递到页面中model.addAttribute("item",item);model.addAttribute("itemDesc",itemDesc);//跳转到商品展现页面return "item";}
}

2.2.3 编辑ItemService

@Service(timeout = 3000)
public class DubboItemServiceImpl implements DubboItemService {@Autowiredprivate ItemMapper itemMapper;@Autowiredprivate ItemDescMapper itemDescMapper;@Overridepublic Item findItemById(Long itemId) {return itemMapper.selectById(itemId);}@Overridepublic ItemDesc findItemDescById(Long itemId) {return itemDescMapper.selectById(itemId);}
}

2.2.4 商品展现效果测试
在这里插入图片描述

3 购物车实现

3.1新建CatPOJO

在这里插入图片描述
ak 是自定义外键,也是联合主键,要求不能同时重复
在jt-common中定义pojo

package com.jt.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;@TableName("tb_cart")
@Data
@Accessors(chain=true)
public class Cart extends BasePojo{@TableId(type= IdType.AUTO)private Long id;             //购物车主键private Long userId;         //用户IDprivate Long itemId;        //商品IDprivate String itemTitle;   //商品标题信息private String itemImage;   //商品图片private Long itemPrice;         //商品价格private Integer num;        //商品数量}

3.2创建JT-CART项目

在这里插入图片描述

 <!--添加依赖--><dependencies><dependency><groupId>com.jt</groupId><artifactId>jt-common</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

application.yml

server:port: 8094servlet:context-path: /
spring:datasource:#引入druid数据源#type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3307/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=trueusername: rootpassword: rootmvc:view:prefix: /WEB-INF/views/suffix: .jsp
#mybatis-plush配置
mybatis-plus:type-aliases-package: com.jt.pojomapper-locations: classpath:/mybatis/mappers/*.xmlconfiguration:map-underscore-to-camel-case: true#关于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:2183protocol:  #指定协议name: dubbo  #使用dubbo协议(tcp-ip)  web-controller直接调用sso-Serviceport: 20882 #每一个服务都有自己特定的端口 不能重复.logging:level: com.jt.mapper: debug

构建项目结构:
在这里插入图片描述
修改manager的跨域配置文件
在这里插入图片描述

3.3完成购物车列表展现

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

3.3.2编辑jt-web CartController
在这里插入图片描述
在这里插入图片描述
CartController

package com.jt.controller;import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.Cart;
import com.jt.service.DubboCatService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.List;@Controller
@RequestMapping("/cart")
public class CartController {@Reference(check=false)private DubboCatService cartService;/*** 展现购物车列表信息*  http://www.jt.com/cart/show.html*  参数:  必须获取userId=7L*  返回值:cart.jsp*  页面取值参数${cartList}* */@RequestMapping("/show")public String doFindCart(Model model){Long userId=7L;  //暂时写死,后期维护List<Cart> cartList=cartService.findCartList(userId);model.addAttribute("cartList", cartList);return "cart";}}

DubboCartServiceImpl

package com.jt.service;import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.CartMapper;
import com.jt.pojo.Cart;
import org.springframework.beans.factory.annotation.Autowired;import java.util.List;@Service(timeout=3000)
public class DubboCartServiceImpL implements DubboCatService{@Autowiredprivate CartMapper cartMapper;@Overridepublic 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

@Reference(check=false)private DubboCatService cartService;/*** 购物车商品数量更新操作*  业务需求: 实现商品数量的更新操作*  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 doupdateCartNum(Cart cart){cart.setUserId(7L);cartService.updateCartNum(cart);}

3.4.3 DubboCartServiceImpl

 @Overridepublic void updateCartNum(Cart cart) {Cart tempCat=new Cart();tempCat.setNum(cart.getNum());UpdateWrapper<Cart> updateWrapper=new UpdateWrapper<>();updateWrapper.eq("item_id", cart.getItemId()).eq("user_id", cart.getUserId());cartMapper.update(tempCat, updateWrapper);}

3.5购物车新增

3.5.1业务分析
说明:用户查询商品之后,进行加购时,应该(重定向)跳转到购物车页面 主要原因:地址栏地址发生改变
在这里插入图片描述
变为http://www.jt.com/cart/add/XXXX.html
在这里插入图片描述

注意事项:
同一个用户重复添加相同的数据时,只需要修改商品的数量
3.5.2页面分析

  1. 页面提交的url
    在这里插入图片描述
    2)提交的参数
    在这里插入图片描述
    3)页面js分析
    提交当前页面第一个form表单
    在这里插入图片描述
    页面中所有元素都是document的子集
    搜索form标签
    在这里插入图片描述
    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";}

DubboCartServiceImpl

 /*** 如果用户重复加购,则只做数量的修改* 根据userId和itemId查数据库数据* */@Override@Transactionalpublic void saveCart(Cart cart) {QueryWrapper<Cart> queryWrapper=new QueryWrapper<>();queryWrapper.eq("user_id", cart.getUserId()).eq("item_id", cart.getItemId());Cart cartDB= cartMapper.selectOne(queryWrapper);if(cartDB==null){cartMapper.insert(cart);}else{int num=cart.getNum()+ cartDB.getNum();//只需要修改updated和numCart tempCart=new Cart();tempCart.setId(cartDB.getId()).setNum(num);cartMapper.updateById(tempCart);}}

StringUtils.isEmpty() 判断字符串对象是否为空
if(cartDB==null){ 判断某个对象是否为空

3.6购物车删除操作

在这里插入图片描述

 /*** 删除页面  cart/delete/${cart.itemId}.html* */@RequestMapping("/delete/{itemId}")public  String doDeleteCard(Cart cart){Long userId = 7L;cart.setUserId(userId);cartService.deleteCart(cart);return "redirect:/cart/show.html";}
//删除购物车商品信息@Overridepublic void deleteCart(Cart cart) {cartMapper.delete(new QueryWrapper<>(cart));}

知识点:

1.dubbo只能对本服务系统进行rpc调用,但是httpClient和jsonp可以实现百度服务的调用,cors也不能实现百度服务的调用

2.redis中的事务对单个有作用,但是对于多个redis(分布式)作用不大
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部