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>