程序地带

cgb2008-京淘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);
}
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16804847/article/details/111246154

随机推荐

关于混合式开发中使用google联调h5

前提条件:1、mac或者window需要安装adb2、手机需要安装Google3、处于fq的网络中什么是adb?AndroidDebugBridge(安卓调试...

光辉的辉 阅读(872)

第三代测序成本偏高是什么原因导致的? 是看了这道题下面的邹捷萌回答:现在基因测序的瓶颈主要在哪里?精度?速度? 在精确度方面第三代测序已经很高了,但目前国内生物实验室的测序还是以二代为主,推测成本可能

第三代测序成本偏高是什么原因导致的?是看了这道题下面的邹捷萌回答:现在基因测序的瓶颈主要在哪里?精度?速度?在精确度方面第三代测序...

wangchuang2017 阅读(292)

vue使用wow.js (实现页面元素动画)

wow.js:让页面滚动更有趣wow.js基于animate.css下面记录在vue中正确使用的步骤。自己踩坑,我在参照其他博客内容进行使用时,没有成功引用&...

崩波霸 阅读(276)

Java学习笔记-TestNG中Assert用法

1.断言断言是TestNG中一种判断预期和实际结果是否相符的一种方法,如果相符,程序继续,不符,直接跑出异常在使用断言前,要引入T...

一片蓝蓝的云 阅读(201)

2020-12-06

【题目】现在有两个表,“学生表”记录了学生的基本信息,有“学号”、“姓名”。“成绩”表记录了学生选修的课程,以及对应课程的成绩。这两个表通过“学号”进行关联。...

祖传代码2020 阅读(300)

【OBS】FFmpe源和media处理

FFmpe源和media处理ffmepgsource是一个插件,与deps的mediaplay相关ffmpegsource常用插件定义文件:D:Codeobs-studiopluginsobs...

等风来不如迎风去 阅读(515)

Android 获取Object对象中的属性

思路Object-->Map-->Map.get(“属性名”)实现ObjecttoMappublicstaticMap<String,Object>getObjValue(Ob...

sherry爱喝旺仔 阅读(645)

Object对象

1.Object()  (1)如果参数为空(或者为undefined和null),Object()返回一个空对象。varobj&#...

艾恋恩 阅读(307)