第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十一天】(购物车+订单)

https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040css

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第七天】(redis缓存)html

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服务器搭建、搜索功能实现)java

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)web

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十天】(单点登陆系统实现)redis

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十一天】(购物车+订单)spring

 

 

 

今天的内容:数据库

一、登陆、注册功能的实现。json

二、门户系统整合登陆、注册功能缓存

三、当用户下订单时须要用户登陆,使用拦截器实现用户登陆。登陆成功后跳转到用户要访问的页面。服务器

四、购物车的实现

a)       添加商品

b)       删除商品

c)       修改商品数量

1   注册功能的实现

登陆和注册的功能都放到单点登陆系统中完成,供其余系统调用。

须要对静态资源作映射。须要修改springmvc.xml

    <!-- 不拦截释放静态资源的映射 -->
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**" />
    <mvc:resources location="/WEB-INF/css/" mapping="/css/**" />
    <mvc:resources location="/WEB-INF/images/" mapping="/images/**" />
View Code

1.1   注册功能实现

一、进行注册以前先进行数据的有效性验证。

a)       用户名不能重复

b)       确认密码和密码文本框的内容要一致。

c)       用户名、密码不能为空。

d)       手机不能为空 而且不能重复。

二、校验完成后注册。能够调用sso系统的注册接口完成注册。

 

 

3   登陆功能的实现

3.1.1   打开登陆页面

使用一个Controller跳转到登陆页面。

//页面跳转控制
@Controller
@RequestMapping("/page")
public class PageController {
    
    @RequestMapping("/showRegister")
    public String showRegister () {
        //返回逻辑视图的jsp文件名
        return "register";
    }
    
    @RequestMapping("/showLogin")
    public String showLogin() {
        return "login";
    }
    
}

3.1.2   数据校验

校验用户名密码必须输入。

 

3.1.4   登陆页面回调url

回调url应该是经过一个参数传递给显示登陆页面的Controller。参数名为:redirect

须要把回调的url传递给jsp页面。当登陆成功后,js的逻辑中判断是否有回调的rul,若是有就跳转到此url,若是没有就跳转到商城首页。

//页面跳转控制
@Controller
@RequestMapping("/page")
public class PageController {
    
    @RequestMapping("/showRegister")
    public String showRegister () {
        //返回逻辑视图的jsp文件名
        return "register";
    }
    
    @RequestMapping("/showLogin")
    public String showLogin(String redirect,Model model) {
            
        model.addAttribute("redirect", redirect);
        return "login";
    }
    
}
View Code

 

4  使用拦截器实现用户登陆

4.1    门户系统整合sso

在门户系统点击登陆链接跳转到登陆页面。登陆成功后,跳转到门户系统的首页,在门户系统中须要从cookie中 把token取出来。因此必须在登陆成功后把token写入cookie。而且cookie的值必须在系统之间能共享。

4.1.1   Cookie共享:

一、Domain:必须是相同的。

例若有多个域名:

www.taotao.com

Sso.taotao.com

Search.taotao.com

须要设置domain为:.taotao.com

二、设置path:/

4.1.2   工具类

若是是localhost不要设置domain。直接设置path就能够了。

 

 

 


4.2    模拟拦截url

需求:当访问商品详情页面时强制用户登陆。(当有订单系统后就改成订单系统的url )

portal的service层

@Service
public class UserServiceImpl implements UserService {
    
    @Value("${SSO_BASE_URL}")
    public String SSO_BASE_URL;
    @Value("${SSO_USER_TOKEN}")
    private String SSO_USER_TOKEN;
    @Value("${SSO_PAGE_LOGIN}")
    public String SSO_PAGE_LOGIN;

    @Override
    public TbUser getUserByToken(String token) {
        try {
            // 调用sso服务的系统,根据token取用户信息
            String json = HttpClientUtil.doGet(SSO_BASE_URL + SSO_USER_TOKEN +token);
            // 把json转成TaotaoResult
            TaotaoResult result = TaotaoResult.formatToPojo(json, TbUser.class);
            if(result.getStatus()==200) {
                TbUser user = (TbUser)result.getData();
                return user;
            }
            
        } catch (Exception e) {
            e.printStackTrace();
            
        }
        return null;
    }

}
View Code

4.2.1   建立拦截器

一、须要实现HandlerInterceptor接口。

二、实现拦截逻辑

三、须要在springmvc.xml中配置。

 

package com.taotao.portal.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.taotao.common.utils.CookieUtils;
import com.taotao.pojo.TbUser;
import com.taotao.portal.service.impl.UserServiceImpl;

public class LoginInterceptor implements HandlerInterceptor {
    
    @Autowired
    private UserServiceImpl userService;


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在Handler执行以前处理
        // 判断用户是否登陆
        // 1.从cookie中取token
        String token = CookieUtils.getCookieValue(request, "TT_TOKEN");
        // 2.根据token换取用户信息,调用sso系统的接口。
        TbUser user = userService.getUserByToken(token);
        // 3.1取不到用户信息(未登陆、session过时)
        if (null == user) {
            // 跳转到登陆页面,把用户请求的url做为参数传递给登陆页面。
            response.sendRedirect(
                    userService.SSO_BASE_URL + userService.SSO_PAGE_LOGIN + "?redirect=" + request.getRequestURL());
            // 返回false
            return false;
        }

        // 3.2取到用户信息,放行
        // 返回值决定handler是否执行。true:执行,false:不执行。
        return true;

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // handler执行以后,返回ModelAndView以前

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 返回ModelAndView以后
        // 响应用户以后

    }

}
implements HandlerInterceptor

 

4.2.4   Springmvc.xml

    <!-- 拦截器配置 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截订单类请求 -->
            <mvc:mapping path="/order/**"/>
            <bean class="com.taotao.portal.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

 


 

5   购物车的实现

5.1    分析

淘淘:购物车在用户不登录的状况下也可使用购物车。须要把购物车的商品信息写入cookie中。全部对购物车的操做都是操做cookie。有效 的下降数据库的压力。

缺点:换一台电脑后购物车的商品不能同步。

实现的工程:taotao-protal中实现购物车功能。只须要调用商品信息的服务,除此以外不须要和其余系统交互。

5.2    添加购物车商品

5.2.1   流程分析:

在商品详情页面点击“加入购物车”按钮提交一个请求吧商品id传递给Controller,Controller接收id,Controller调用Service根据商品id查询商品基本信息。把商品写入cookie中,加入cookie以前先从cookie中把购物车的商品取出来判断当前购物车商品列表中是否有此商品,若是有数量加一,若是没有添加一个商品,数量为1。展现给用户购物车列表。

5.2.2   Service层实现

功能:接收一个商品id,数量(默认为1),根据商品id查询商品信息。调用taotao-rest的服务。把商品添加到购物车,先把购物车商品列表取出来,判断列表中是否有此商品,若是有就增长数量就能够了。若是没有把此商品添加到商品列表。返回添加成功Taotaoresult。

建立购物车商品POJO:

package com.taotao.portal.pojo;

public class CartItem {
    private long id;
    private String title;
    private Integer num;
    private long price;
    private String image;
View Code

ServiceImpl

//购物车服务
@Service
public class CartServiceImpl implements CartService {

    @Value("${REST_BASE_URL}")
    private String REST_BASE_URL;
    @Value("${ITEM_INFO_URL}")
    private String ITEM_INFO_URL;

    // 添加购物车商品
    @Override
    public TaotaoResult addCartItemint(long itemId, int num, 
            HttpServletRequest request, HttpServletResponse response) {
        // 取商品信息
        CartItem cartItem = null;
        // 取购物车商品列表
        List<CartItem> itemList = getCartItemList(request);
        // 判断购物车商品列表中是否存在此商品
        for (CartItem cItem : itemList) {
            // 若是存在此商品
            if (cItem.getId() == itemId) {
                // 增长商品数量
                cItem.setNum(cItem.getNum() + num);
                cartItem = cItem;
                break;
            }
        }

        if (cartItem == null) {
            cartItem = new CartItem();
            // 根据商品ID查询商品基本信息
            String json = HttpClientUtil.doGet(REST_BASE_URL + ITEM_INFO_URL + itemId);
            // 把返回的json转换成java对象pojo
            TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItem.class);
            if (taotaoResult.getStatus() == 200) {
                TbItem item = (TbItem) taotaoResult.getData();
                cartItem.setId(item.getId());
                cartItem.setImage(item.getImage() == null ? "" : item.getImage().split(",")[0]);
                cartItem.setNum(num);
                cartItem.setPrice(item.getPrice());
                cartItem.setTitle(item.getTitle());
            }
            // 添加到购物车列表
            itemList.add(cartItem);

        }
        //把购物车列表写入cookie
        CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(itemList), true);
        return TaotaoResult.ok();
    }

    // 取购物车商品列表的私有方法
    private List<CartItem> getCartItemList(HttpServletRequest request) {
        // 从cookie中取商品列表
        String cartJson = CookieUtils.getCookieValue(request, "TT_CART", true);
        if (cartJson == null) {
            return new ArrayList<>();
        }
        // 把json转换成商品列表
        try {
            List<CartItem> list = JsonUtils.jsonToList(cartJson, CartItem.class);
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return new ArrayList<>();
    }

}
View Code CartServiceImpl

5.2.3   Controller

接收商品的id和商品的数量,商品数量若是为空默认为1.调用Service向购物车添加商品。

展现添加成功页面。

请求的url:http://localhost:8082/cart/add/144141542125084.html

 

 

 

5.5    删除购物车商品

在购物车页面中点击删除链接,接收要删除的商品id,从cookie中把商品找到删除,从新写入cookie,从新展现购物车页面。

 

 

 

 

 

=======================================

参考资料:

 

end