訂單系統
功能分析
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>