3 订单系统
3.1 功能分析
1、在购物车页面点击“去结算”按钮跳转到订单确认页面。
a) 展示商品列表
b) 配送地址列表
c) 选择支付方式
2、展示订单确认页面之前,应该确认用户身份。
a) 使用拦截器实现。
b) Cookie中取token
c) 取不到token跳转到登录页面
d) 取到token,根据token查询用户信息。
e) 如果没有用户信息,登录过期跳转到登录页面
f) 取到用户信息,放行。
3、提交订单
a) 生成订单
b) 展示订单提交成功页面。
订单系统系统:订单确认页面、订单提交成功页面。
订单服务系统
3.2 工程搭建
创建一个订单服务系统:
e3-order
|--e3-order-interface
|--e3-order-Service
可以参考e3-manager整合。
表现层工程:
e3-order-web打包方式war。
3.3 展示订单确认页面
3.3.1 功能分析
1. 在购物车页面点击“去结算”按钮跳转到订单确认页面。
2. 请求的url:
/order/order-cart
3. 参数:没有参数。
4. 购物车商品数据从cookie中取出来的。可以在订单系统中取到cookie中的购物车数据。
5. 配送地址列表,需要用户登录。需要根据用户id查询收货地址列表。静态数据。
6. 支付方式。静态数据。
7. 返回值:逻辑视图String,展示订单确认页面。
3.3.2 Dao层、Service层(没有)
需要根据用户id查询收货地址列表。没有此功能。
3.3.3 表现层
请求的url:/order/order-cart
参数:无
业务逻辑:
从cookie中取商品列表展示到页面。
返回值:逻辑视图。
|
@Controller public class OrderController {
@Value("${TT_CART}") private String TT_CART;
/** * 展示订单确认页面。 * <p>Title: showOrderCart</p> * <p>Description: </p> * @return */ @RequestMapping("/order/order-cart") public String showOrderCart(HttpServletRequest request) { //取用户id //从cookie中取token,然后根据token查询用户信息。需要调用sso系统的服务。 //根据用户id查询收货地址列表 //从cookie中取商品列表 List<TbItem> cartList = getCartList(request); //传递给页面 request.setAttribute("cartList", cartList); //返回逻辑视图 return "order-cart"; }
/** * 从cookie中取购物车列表 * <p>Title: getCartList</p> * <p>Description: </p> * @param request * @return */ private List<TbItem> getCartList(HttpServletRequest request) { //取购物车列表 String json = CookieUtils.getCookieValue(request, TT_CART, true); //判断json是否为null if (StringUtils.isNotBlank(json)) { //把json转换成商品列表返回 List<TbItem> list = JsonUtils.jsonToList(json, TbItem.class); return list; } return new ArrayList<>(); } } |
3.4 用户身份认证
在展示订单确认页面之前,需要对用户身份进行认证,要求用户必须登录。
3.4.1 功能分析
1. 使用springmvc的拦截器实现。需要实现一个接口HandlerInterceptor接口。
2. 业务逻辑
a) 从cookie中取token。
b) 没有token,需要跳转到登录页面。
c) 有token。调用sso系统的服务,根据token查询用户信息。
d) 如果查不到用户信息。用户登录已经过期。需要跳转到登录页面。
e) 查询到用户信息。放行。
3. 在springmvc.xml中配置拦截器。
3.4.2 拦截器实现
|
public class LoginInterceptor implements HandlerInterceptor {
@Value("${TT_TOKEN}") private String TT_TOKEN; @Value("${SSO_LOGIN_URL}") private String SSO_LOGIN_URL;
@Autowired private UserService userService;
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //执行Handler之前执行此方法 // a)从cookie中取token。 String token = CookieUtils.getCookieValue(request, TT_TOKEN); if (StringUtils.isBlank(token)) { //取当前请求的url String url = request.getRequestURL().toString(); // b)没有token,需要跳转到登录页面。 response.sendRedirect(SSO_LOGIN_URL + "?redirectUrl=" + url); //拦截 return false; } // c)有token。调用sso系统的服务,根据token查询用户信息。 e3Result result = userService.getUserByToken(token); if (result.getStatus() != 200) { // d)如果查不到用户信息。用户登录已经过期。需要跳转到登录页面。 //取当前请求的url String url = request.getRequestURL().toString(); // b)没有token,需要跳转到登录页面。 response.sendRedirect(SSO_LOGIN_URL + "?redirectUrl=" + url); //拦截 return false; } // e)查询到用户信息。放行。 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之后,执行。异常处理。
}
}
|
3.4.3 配置拦截器
中springmvc.xml中配置拦截器。