易課寄在線購課系統開發筆記(三十四)--完成訂單系統的開發

訂單系統

功能分析

1、在購物車頁面點擊 “去結算” 按鈕跳轉到訂單確認頁面;

a) 展示課程列表;

b) 配送地址列表;

c) 選擇支付方式。

2、展示訂單確認頁面之前,應該確認用戶身份;

a) 使用攔截器實現;

b) Cookie 中取 token;

c) 取不到 token 跳轉到登錄頁面;

d) 取到 token ,根據 token 查詢用戶信息;

e) 如果沒有用戶信息,登錄過期跳轉到登錄頁面;

f) 取到用戶信息,放行。

3、提交訂單;

a) 生成訂單;

b) 展示訂單提交成功頁面。

訂單系統系統:訂單確認頁面、訂單提交成功頁面。

訂單服務系統

工程搭建

創建一個訂單服務系統:

  • ecourses-parent:父工程,打包方式 pom,管理 jar 包的版本號。
    • ecourses-common:通用的工具類及通用的 pojo。打包方式 jar
    • ecourses-order-web(war)
    • ecourses-order(聚合工程pom)
      • ecourses-order-interface(jar)
      • ecourses-order-service(war)

可以參考

易課寄在線購課系統開發筆記(七)–後臺管理系統工程搭建分析

ecourses-bms 工程。

表現層工程:

ecourses-order-web 打包方式 war。

展示訂單確認頁面

功能分析

1、在購物車頁面點擊 “去結算” 按鈕跳轉到訂單確認頁面;

2、請求的 url :

在這裏插入圖片描述
/order/order-cart

1、參數:沒有參數;

2、購物車課程數據從 Cookie 中取出來的。可以在訂單系統中取到 Cookie 中的購物車數據;

3、配送地址列表,需要用戶登錄。需要根據用戶 id 查詢收貨地址列表。靜態數據;

4、支付方式。靜態數據;

5、返回值:邏輯視圖String,展示訂單確認頁面。

Dao 層、Service 層(沒有)

需要根據用戶 id 查詢收貨地址列表。沒有此功能。

表現層

請求的 url :/order/order-cart

參數:無

業務邏輯:

從 Cookie 中取課程列表展示到頁面。

返回值:邏輯視圖。

package cn.ecourses.order.controller;
//訂單管理Controller
@Controller
public class OrderController {
	
	@Autowired
	private CartService cartService;
	@Autowired
	private OrderService orderService;

	@RequestMapping("/order/order-cart")
	public String showOrderCart(HttpServletRequest request) {
		//取用戶id
		EcoursesUser user= (EcoursesUser) request.getAttribute("user");
		//根據用戶id取收貨地址列表
		//使用靜態數據。。。
		//取支付方式列表
		//靜態數據
		//根據用戶id取購物車列表
		List<EcoursesItem> cartList = cartService.getCartList(user.getId());
		//把購物車列表傳遞給jsp
		request.setAttribute("cartList", cartList);
		//返回頁面
		return "order-cart";
	}
	
	@RequestMapping(value="/order/create", method=RequestMethod.POST)
	public String createOrder(OrderInfo orderInfo, HttpServletRequest request) {
		//取用戶信息
		EcoursesUser user = (EcoursesUser) request.getAttribute("user");
		//把用戶信息添加到orderInfo中。
		orderInfo.setUserId(user.getId());
		orderInfo.setBuyerNick(user.getUsername());
		//調用服務生成訂單
		ECoursesResult ecoursesResult = orderService.createOrder(orderInfo);
		//如果訂單生成成功,需要刪除購物車
		if (ecoursesResult.getStatus() == 200) {
			//清空購物車
			cartService.clearCartItem(user.getId());
		}
		//把訂單號傳遞給頁面
		request.setAttribute("orderId", ecoursesResult.getData());
		request.setAttribute("payment", orderInfo.getPayment());
		//返回邏輯視圖
		return "success";
	}
}

用戶身份認證

在展示訂單確認頁面之前,需要對用戶身份進行認證,要求用戶必須登錄。

功能分析

1、使用 SpringMVC 的攔截器實現,需要實現一個接口 HandlerInterceptor 接口;

2、業務邏輯;

a) 從 Cookie 中取 token;

b) 沒有 token ,需要跳轉到登錄頁面;

c) 有 token 。調用 SSO 系統的服務,根據 token 查詢用戶信息;

d) 如果查不到用戶信息。用戶登錄已經過期。需要跳轉到登錄頁面;

e) 查詢到用戶信息。放行;

3、在 springmvc.xml 中配置攔截器。

攔截器實現

package cn.ecourses.order.interceptor;
//用戶登錄攔截器
public class LoginInterceptor implements HandlerInterceptor {
	
	@Value("${SSO_URL}")
	private String SSO_URL;
	
	@Autowired
	private TokenService tokenService;
	@Autowired
	private CartService  cartService;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		//從cookie中取token
		String token = CookieUtils.getCookieValue(request, "token");
		//判斷token是否存在
		if (StringUtils.isBlank(token)) {
			//如果token不存在,未登錄狀態,跳轉到sso系統的登錄頁面。用戶登錄成功後,跳轉到當前請求的url
			response.sendRedirect(SSO_URL + "/page/login?redirect=" + request.getRequestURL());
			//攔截
			return false;
		}
		//如果token存在,需要調用sso系統的服務,根據token取用戶信息
		ECoursesResult ecoursesResult = tokenService.getUserByToken(token);
		//如果取不到,用戶登錄已經過期,需要登錄。
		if (ecoursesResult.getStatus() != 200) {
			//如果token不存在,未登錄狀態,跳轉到sso系統的登錄頁面。用戶登錄成功後,跳轉到當前請求的url
			response.sendRedirect(SSO_URL + "/page/login?redirect=" + request.getRequestURL());
			//攔截
			return false;
		}
		//如果取到用戶信息,是登錄狀態,需要把用戶信息寫入request。
		EcoursesUser user = (EcoursesUser) ecoursesResult.getData();
		request.setAttribute("user", user);
		//判斷cookie中是否有購物車數據,如果有就合併到服務端。
		String jsonCartList = CookieUtils.getCookieValue(request, "cart", true);
		if (StringUtils.isNoneBlank(jsonCartList)) {
			//合併購物車
			cartService.mergeCart(user.getId(), JsonUtils.jsonToList(jsonCartList, EcoursesItem.class));
		}
		//放行
		return true;
	}

	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {

	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {

	}
}

配置攔截器

中 springmvc.xml 中配置攔截器。

<!-- 配置攔截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="cn.ecourses.order.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

實現 SSO 系統的回調

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章