第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

相關文章
相關標籤/搜索