訂單系統——展現訂單商品資訊
1. 訂單系統
1.1. 功能分析
1、在購物車頁面點選“去結算”按鈕跳轉到訂單確認頁面。
a) 展示商品列表
b) 配送地址列表
c) 選擇支付方式
2、展示訂單確認頁面之前,應該確認使用者身份。
a) 使用攔截器實現。
b) Cookie中取token
c) 取不到token跳轉到登入頁面
d) 取到token,根據token查詢使用者資訊。
e) 如果沒有使用者資訊,登入過期跳轉到登入頁面
f) 取到使用者資訊,放行。
3、提交訂單
a) 生成訂單
b) 展示訂單提交成功頁面。
訂單系統系統:訂單確認頁面、訂單提交成功頁面。
訂單服務系統
1.1. 工程搭建
1.1. 展示訂單確認頁面
1.1.1. 功能分析
1、在購物車頁面點選“去結算”按鈕跳轉到訂單確認頁面。
2、請求的url:
/order/order-cart
3、引數:沒有引數。
4、購物車商品資料從cookie中取出來的。可以在訂單系統中取到cookie中的購物車資料。
5、配送地址列表,需要使用者登入。需要根據使用者id查詢收貨地址列表。靜態資料。
6、支付方式。靜態資料。
7、返回值:邏輯檢視String,展示訂單確認頁面。
1.1.1. Dao層、Service層(沒有)
需要根據使用者id查詢收貨地址列表。沒有此功能。
1.1.2. 表現層
請求的url:/order/order-cart
引數:無
業務邏輯:
從cookie中取商品列表展示到頁面。
返回值:邏輯檢視。
/** * 訂單Controller * * @Auther: jun * @Date: 2018/6/1 0001 19:35 * @Description: */ @Controller public class OrderController { @Autowired private CartService cartService; @Autowired private OrderService orderService; /** * 跳轉到訂單頁面並判斷使用者是否登入* * @param request * @auther: jun * @date: 2018/6/1 0001 22:27 * @return: java.lang.String * @Description: */ @RequestMapping("order/order-cart") public String showOrderCart(HttpServletRequest request) { //獲取登入使用者資訊 TbUser user = (TbUser) request.getAttribute ( "user" ); //通過呼叫購物車服務查詢購物車中的商品列表 List<TbItem> cartList = cartService.getCartList ( user.getId () ); //將購物車中的商品列表轉遞給頁面 request.setAttribute ( "cartList", cartList ); //返回邏輯頁面 return "order-cart"; }
引用服務
Service這是CartService中的實現類程式碼
@Override public List<TbItem> getCartList(Long userId) { //根據使用者id查詢購物車商品列表(redis 中的鍵找值) List<String> jsonList = jedisClient.hvals(REDIS_CART_PRE + ":" + userId); //建立一個商品列表資訊 List<TbItem> itemList=new ArrayList<>(); for (String string : jsonList) { //獲取到json中一個數據並轉換資料型別成pojo物件 TbItem item = JsonUtils.jsonToPojo(string, TbItem.class); //新增到列表 itemList.add(item); } //返回列表 return itemList; }
釋出服務
購物車釋出服務1.1. 使用者身份認證
在展示訂單確認頁面之前,需要對使用者身份進行認證,要求使用者必須登入。
1.1.1. 功能分析
1、使用springmvc的攔截器實現。需要實現一個介面HandlerInterceptor介面。
2、業務邏輯
a) 從cookie中取token。
b) 沒有token,需要跳轉到登入頁面。
c) 有token。呼叫sso系統的服務,根據token查詢使用者資訊。
d) 如果查不到使用者資訊。使用者登入已經過期。需要跳轉到登入頁面。
e) 查詢到使用者資訊。放行。
3、在springmvc.xml中配置攔截器。
1.1.2. 攔截器實現 (配置檔案)
/** * 使用者登入攔截器 * @Auther: jun * @Date: 2018/6/1 0001 19:52 * @Description: */ public class Logininterceptor implements HandlerInterceptor { @Autowired private TokenService tokenService; @Autowired private CartService cartService; @Value("${SSO_URL}") private String SSO_URL ; @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception { //執行Handler之前執行此方法 // a)從cookie中取token。 //從cookie中獲取到token String token = CookieUtils.getCookieValue(httpServletRequest, "token"); //判斷token是否存在 if (StringUtils.isBlank(token)){ //如果不存在,未登入狀態,跳轉到sso服務系統的登入頁面,登入頁面成功後,跳轉到當前請求的url httpServletResponse.sendRedirect(SSO_URL+"/page/login/redirect="+httpServletRequest.getRequestURL()); //攔截 return false; } //如果token存在 //需要呼叫sso服務取使用者資訊 E3Result result = tokenService.getUserByToker(token); //取到了判斷使用者資訊狀態是否過期 if (result.getStatus()!=200){ //過期就要重新登入,跳轉到sso服務系統的登入頁面,登入頁面成功後,跳轉到當前請求的url httpServletResponse.sendRedirect(SSO_URL+"/page/login?redirect="+httpServletRequest.getRequestURL()); //攔截 return false; } //如果取到使用者資訊,是登入狀態,需要放入request中 TbUser user = (TbUser) result.getData(); httpServletRequest.setAttribute("user",user); //判斷cookie中是否有購物車資料,有就要合併 String jsonCartList = CookieUtils.getCookieValue(httpServletRequest, "cart", true); //判斷jsonCartList不為空 if (StringUtils.isNoneBlank(jsonCartList)){ //合併購物車資料 cartService.mergeCart(JsonUtils.jsonToList(jsonCartList,TbItem.class),user.getId()); } //放行 return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception { // 執行Handler之後返回ModelAndView之前 } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception e) throws Exception { // 返回ModelAndView之後,執行。異常處理。 } }
1.1.1. 配置攔截器
中springmvc.xml中配置攔截器。
<!--攔截器配置--> <mvc:interceptors> <mvc:interceptor> <!--攔截所有的url--> <mvc:mapping path="/**"/> <!--配置攔截器的實現類--> <bean class="com.e3mall.order.interceptor.Logininterceptor"/> </mvc:interceptor>