今日任务
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL4dGRPFTW65keRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3YzN0IjMwkDM4ETOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
cookie的方式进行跨域
1.先找到对应的服务器 sso
jsonp 是http协议
判断在哪里写 还是看Js前端给的url地址
用户登出操作
登出分析
还得删除cookie和redis里面的数据(要得到key)
然后执行删除操作
自我实现
同域 判断 写在自家web服务器上
jt-web
@Autowired
private JedisCluster jedisCluster;
/**
* 实现用户的登出操作 要求删除cookie 和redis中的数据(key)
* 步骤: 通过cookie获取ticket信息.
* 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())) {
//获取value之后删除cookie
String ticket = cookie.getValue();
jedisCluster.del(ticket); //删除redis中的数据
//删除cookie时 必须与原来的cookie数据保持一致
cookie.setDomain("jt.com");
cookie.setPath("/");
cookie.setMaxAge(0);
response.addCookie(cookie);
break;
}
}
}
return "redirect:/";
}
实现成功
业务不同 不能泛化 不修改原有的分布式架构或者其他业务 在上面添加微服务架构
改对了不是你的功劳 改错了就是你的锅
restful风格
后缀重复了
继续
写一个工具API
获得cookie对象
获得cookie对象的值
新增Cookie方法
删除Cookie方法
写完重复的调用就行
简化代码的调用
41分之前 一句话分析 if(!StringUtils.isEmpty(ticket)){
自我实现
提高服用 jt-common
编写工具API
package com.jt.util;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieUtil {
/**
* 该工具API主要的任务
* 1.根据cookie的名称 返回cookie对象
* 2.根据cookie的名称 返回valve的值
* 3.新增cookie方法
* 4.删除cookie方法
*/
public static Cookie getCookie(String cookieName, HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(cookies !=null && cookies.length >0) {
for (Cookie cookie : cookies) {
if (cookieName.equals(cookie.getName())) {
return cookie;
}
}
}
return null ;
}
public static String getCookieValue(String cookieName,HttpServletRequest request){
Cookie cookie = getCookie(cookieName, request);
return cookie ==null?null:cookie.getValue();
}
public static void addCookie(String cookieName, String cookieValue, String path,
String domain, int maxAge, HttpServletResponse response){
Cookie cookie = new Cookie(cookieName,cookieValue);
cookie.setPath(path);
cookie.setDomain(domain);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
public static void deleteCookie(String cookieName,String path,
String domain,HttpServletResponse response){
addCookie(cookieName,"",path, domain, 0, response);
}
}
web里面的controller层
晚上 去理解
/**
* 实现用户的登出操作 要求删除cookie 和redis中的数据(key)
* 步骤: 通过cookie获取ticket信息.
* url: http://www.jt.com/user/logout.html
* 参数: 暂时没有
* 返回值: 重定向到系统首页
*/
@RequestMapping("/logout")
public String logout(HttpServletRequest request,HttpServletResponse response){
String ticket = CookieUtil.getCookieValue("JT_TICKET", request);
if(!StringUtils.isEmpty(ticket)){
jedisCluster.del(ticket);
CookieUtil.deleteCookie("JT_TICKET","/","jt.com",response);
}
return "redirect:/";
}
/*
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())) {
//获取value之后删除cookie
String ticket = cookie.getValue();
jedisCluster.del(ticket); //删除redis中的数据
//删除cookie时 必须与原来的cookie数据保持一致
cookie.setDomain("jt.com");
cookie.setPath("/");
cookie.setMaxAge(0);
response.addCookie(cookie);
break;
}
}
}
return "redirect:/";
}*/
删除成功 工具类生效
购物车模块
新建模块
id bigint(20) not null auto_increment,
user_id bigint(20),
item_id bigint(20),
item_title varchar(100),
item_image varchar(200),
item_price bigint(20) comment '单位:分',
num int(10),
created datetime,
updated datetime,
primary key (id),
key AK_user_itemId (user_id, item_id)
添加实现类加接口
自我实现 新建jt-cart
新建pojo 在jt-common里面
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; //用户id
private Long itemId; //商品id
private String itemTitle;
private String itemImage;
private Long itemPrice;
private Integer num;
}
依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>jt-cart</artifactId>
<parent>
<artifactId>jt</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--添加依赖项-->
<dependencies>
<dependency>
<groupId>org.example</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>
</project>
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
username: root
password: root
#提供了MVC的支持
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: #zk集群 主机中的信息与从机中的信息一致的 从zk中获取数据的时候链接的从机 主机的作用就是监控集群
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: 20881 #每一个服务都有自己特定的端口 不能重复.
jt-cart提供者实现类
package com.jt.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.jt.mapper.CartMapper;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class DubboCartServiceImpl implements DubboCartService{
@Autowired
private CartMapper cartMapper;
}
dao层
package com.jt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.pojo.Cart;
public interface CartMapper extends BaseMapper<Cart> {
}
11.20前 命令
中午去找回那一行命令
继续
自我实现
购物车结算实现 购物车列表展现
页面分析 是本域的 需写在本系统 web前端服务器里面
url分析
Request URL: http://www.jt.com/cart/show.html
2.业务说明
了解
同域 在web里面写
页面需求 取值
自我实现
如上图 可以完成商品购物车跳转 但是购物车中的商品信息不能显示出来
继续 完成列表展现
如上图 长时间不用 怕数据滞后
域对象的理解
换上 因为还没做新增 没有自己家的图
要根据用户和商品id才行 itemId和userId
自我实现 回显购物车数据
顺序开始
同域 web前端服务器
jt-common接口
jt-cart 提供者 实现类
页面效果
完美显现出来
下午
购物车的数量修改
itemNumChange : function(){
$(".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();
});
});
$(".decrement").click(function(){//-
var _thisInput = $(this).siblings("input");
if(eval(_thisInput.val()) == 1){
return ;
}
_thisInput.val(eval(_thisInput.val()) - 1);
$.post("/cart/update/num/"+_thisInput.attr("itemId")+"/"+_thisInput.val(),function(data){
TTCart.refreshTotalPrice();
});
});
$(".quantity-form .quantity-text").rnumber(1);//限制只能输入数字
$(".quantity-form .quantity-text").change(function(){
var _thisInput = $(this);
$.post("/cart/update/num/"+_thisInput.attr("itemId")+"/"+_thisInput.val(),function(data){
TTCart.refreshTotalPrice();
});
});
},
controller分析
自我实现
脚手架开始 同域名 web 的controller开始
jt-common 接口
实现类 jt-cart
页面实现
刷新
ps
写sql逻辑的适合 脑子里先过一遍 我要达成什么逻辑之类的
购物车的删除
分析 要重定向到列表页面
重定向到列表页面
如上图 更新操作就动了userId和itemId 所以where cart就是条件构造
自我实现
脚手架
页面效果
操了 没了 删无了
实现商品详情的展现
利用dubbo
自我改造
改造成微服务架构完成
页面的取值问题
域对象得先存一个item对象了
编辑Controller(要做新增购物车列表数据)
同域名 在web写
自我实现
url分析 同域
页面详情显示成功
ps:
延申
购物车的新增操作
ctrl+F
小点
为了页面取值方便 想要数组
分析controller 购物车
自我实现
实现类分析
自我实现 接上上面
jt-common接口
jt-cart 提供者
jt-cart dao层
页面实现
原有数目上 num叠加 不入库
完美实现
作业
拦截器
拦截器的具体应用
业务至上 不要耦合