电商订单的操作

1 结算页面不进行任何业务层处理,购物车数据转订单详情

2 结算页面提交订单时,只能提交一次(防止表单重复提交)

防止表单重复提交具体步骤:

点击购物车结算按钮时→ 后台生成TradeCode交易码分别放在订单页面和redis缓存各一份

点击提交订单时→会将订单页面的交易码跟缓存里面的进行比对,如果为true,则重定向到支付页面,并删除redis缓存里的TradeCode交易码,如果用户回退,因为redis缓存的交易码已经用过并删除了,所以比对失败,跳到失败页面,达到防止表单重复提交的效果



代码如下:

点击购物车结算跳到订单页面

@LoginRequired@RequestMapping("toTrade")public String toTrade(HttpServletRequest request, ModelMap map){

    String memberId = (String)request.getAttribute("memberId");    String nickname = (String)request.getAttribute("nickname");

    // 查询购物车数据    List<OmsCartItem> omsCartItems = cartService.getCartList(memberId);

    // 转化成订单数据    List<OmsOrderItem> omsOrderItems = new ArrayList<>();    for (OmsCartItem omsCartItem : omsCartItems) {        OmsOrderItem omsOrderItem = new OmsOrderItem();        Date date = new Date();        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");        String orderSn = "gmall"+sdf.format(date)+System.currentTimeMillis();        omsOrderItem.setOrderSn(orderSn);        omsOrderItem.setProductCategoryId(omsCartItem.getProductCategoryId());        omsOrderItem.setProductId(omsCartItem.getProductId());        ......        omsOrderItems.add(omsOrderItem);    }    map.put("orderDetailList",omsOrderItems);    List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = userService.getAddressListByMemberId(memberId);    map.put("userAddressList",umsMemberReceiveAddresses);    // 防止表单重复提交    String tradeCode = orderService.genTradeCode(memberId);    map.put("tradeCode",tradeCode);    return "trade";}

查询购物车数据

@Override
public List<OmsCartItem> getCartList(String memberId) {    List<OmsCartItem> cartItems = new ArrayList<>();    Jedis jedis = redisUtil.getJedis();    List<String> hvals = jedis.hvals("user:" + memberId + ":cart");    if(hvals!=null&&hvals.size()>0){        for (String hval : hvals) {            OmsCartItem omsCartItem = JSON.parseObject(hval,OmsCartItem.class);            cartItems.add(omsCartItem);        }    }    jedis.close();    return cartItems;}

查询用户地址@Overridepublic List<UmsMemberReceiveAddress> getAddressListByMemberId(String memberId) {    UmsMemberReceiveAddress umsMemberReceiveAddress = new UmsMemberReceiveAddress();    umsMemberReceiveAddress.setMemberId(memberId);    List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.select(umsMemberReceiveAddress);

    return umsMemberReceiveAddresses;}

获取交易码
@Overridepublic String genTradeCode(String memberId) {    Jedis jedis = null;    jedis = redisUtil.getJedis();    String tradeCode = UUID.randomUUID().toString();    jedis.setex("user:" + memberId + ":tradeCode", 60 * 15,tradeCode );    jedis.close();    return tradeCode;}


@LoginRequired@RequestMapping("submitOrder")public String submitOrder(HttpServletRequest request, ModelMap map, String deliveryAddressId, String tradeCode){    // 获取用户信息    String memberId = (String)request.getAttribute("memberId");    String nickname = (String)request.getAttribute("nickname");  //比对订单页面的交易码和redis缓存里面的交易码是否一样    boolean b = orderService.checkTradeCode(tradeCode,memberId);

    if(b){

        // 用户收获信息        UmsMemberReceiveAddress umsMemberReceiveAddress =  userService.getAddressById(deliveryAddressId);

        // 根据用户获取购物车数据        List<OmsCartItem> cartList = cartService.getCartList(memberId);        // 根据购物车数据生成订单数据        OmsOrder omsOrder = new OmsOrder();        Date date = new Date();        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");        String orderSn = "gmall"+sdf.format(date)+System.currentTimeMillis();        omsOrder.setOrderSn(orderSn);        omsOrder.setPayAmount(getTotalAmount(cartList));        omsOrder.setStatus("0");        omsOrder.setCreateTime(new Date());     ......        List<OmsOrderItem> omsOrderItems = new ArrayList<OmsOrderItem>();        List<String> cartIds = new ArrayList<>();        for (OmsCartItem omsCartItem : cartList) {            OmsOrderItem omsOrderItem = new OmsOrderItem();            omsOrderItem.setProductSkuCode(omsCartItem.getProductSkuCode());            omsOrderItem.setProductPrice(omsCartItem.getPrice());            omsOrderItem.setOrderSn(orderSn);       ......            omsOrderItems.add(omsOrderItem);            cartIds.add(omsCartItem.getId());        }        omsOrder.setOmsOrderItems(omsOrderItems);

        // 将订单数据保存到数据库        orderService.addOrder(omsOrder);

        // 删除购物车数据        // cartService.delCarts(cartIds);

        System.out.println("获取用户信息");        System.out.println("根据用户获取购物车数据");        System.out.println("根据购物车数据生成订单数据");        System.out.println("将订单数据保存到数据库");        System.out.println("删除购物车数据");        System.out.println("重定向到支付页面");    }else{        return "tradeFail";    }

    return "pay";// 重定向到支付页面}

比对订单页面的交易码和redis缓存里面的交易码是否一样
@Override    public boolean checkTradeCode(String tradeCode,String memberId) {        boolean b = false;

        Jedis jedis = null;        jedis = redisUtil.getJedis();//        String tradeCodeFromCache = jedis.get("user:" + memberId + ":tradeCode");//        if(StringUtils.isNotBlank(tradeCodeFromCache)&&tradeCodeFromCache.equals(tradeCode)){//            b = true;//            jedis.del("user:" + memberId + ":tradeCode");//        }     //并发问题推荐用这种        String script = "if redis.call(‘get‘, KEYS[1]) == ARGV[1] then return redis.call(‘del‘, KEYS[1]) else return 0 end";        Long eval = (Long) jedis.eval(script, Collections.singletonList("user:" + memberId + ":tradeCode"),                Collections.singletonList(tradeCode));        if(new BigDecimal(eval).compareTo(new BigDecimal("0"))!=0){            b = true;        }        jedis.close();        return b;    }

用户地址信息 @Override    public UmsMemberReceiveAddress getAddressById(String deliveryAddress) {

        UmsMemberReceiveAddress umsMemberReceiveAddress = new UmsMemberReceiveAddress();        umsMemberReceiveAddress.setId(deliveryAddress);        UmsMemberReceiveAddress umsMemberReceiveAddress1 = umsMemberReceiveAddressMapper.selectOne(umsMemberReceiveAddress);        return umsMemberReceiveAddress1;    }}

将订单信息保存到数据库
@Overridepublic void addOrder(OmsOrder omsOrder) {    omsOrderMapper.insertSelective(omsOrder);    String orderId = omsOrder.getId();    List<OmsOrderItem> omsOrderItems = omsOrder.getOmsOrderItems();    for (OmsOrderItem omsOrderItem : omsOrderItems) {        omsOrderItem.setOrderId(orderId);        omsOrderItemMapper.insertSelective(omsOrderItem);    }}

以上就完成啦!


原文地址:https://www.cnblogs.com/liuyi13535496566/p/11629806.html

时间: 2024-10-10 02:08:30

电商订单的操作的相关文章

Java生鲜电商平台-电商订单系统全解析

Java生鲜电商平台-电商订单系统全解析 今天分享将会分为以下三个环节来阐述: 1.订单系统的介绍 2.订单系统的解构 3.垂直电商订单系统设计思路 一.什么是订单系统? 订单管理系统(OMS)是物流管理系统的一部分,通过对客户下达的订单进行管理及跟踪,动态掌握订单的进展和完成情况,提升物流过程中的作业效率,从而节省运作时间和作业成本,提高物流企业的市场竞争力.顾名思义,电商系统就是用户.平台.商户等对于订单的管控.跟踪的系统,衔接着商品中心.wms.促销系统.物流系统等,是电子商务的基础模块:

基于TableStore的海量电商订单元数据管理

摘要: # 一.背景 订单系统存在于各行各业,如电商订单.银行流水.运营商话费账单等,是一个非常广泛.通用的系统.对于这类系统,在过去十几年发展中已经形成了经典的做法.但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大. 一.背景订单系统存在于各行各业,如电商订单.银行流水.运营商话费账单等,是一个非常广泛.通用的系统.对于这类系统,在过去十几年发展中已经形成了经典的做法.但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大.数据的重视程度与

PHP电商订单自动确认收货redis队列

一.场景 之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的x天自动确认收货.所谓的订单自动确认收货,就是在在特定的时间,执行一条update语句,改变订单的状态. 二.思路 最笨重的做法,通过linux后台定时任务,查询符合条件的订单,然后update.最理想情况下,如果每分钟都有需要update的订单,这种方式也还行.奈何平台太小,以及卖家发货时间大部分也是密集的,不会分散在24小时的每分钟.那么,

分布式系统电商订单号的最佳生成方式

最近在研发区块链支付系统,众所周知,有支付必有订单.今天不做支付系统的具体分析,只来谈谈目前较为热门的订单号码生成方案! 在分布式高并发情况下,订单号必须满足最重要的一个条件:唯一性,订单关系这支付明细,与支付相关的向来都是最重要的,马虎不得. 目前较为成熟的,我所知道的有两种生成方案,接下来做一下对比: 1.根据MySQL自增主键生成订单号 首先,需要创建一张满足自增条件的表,有两个字段即可,id和value,id设置为自增,类型为bigint即可 eg:在mybatis框架中 <insert

电商订单ElasticSearch同步解决方案--使用logstash

一.使用logstash同步订单数据(订单表和订单项表)到ElasticSearch: 1.到官网下载logstash:https://www.elastic.co/cn/downloads/logstash 2.安装logstash前,确保需要先安装java的jdk环境 3.下载后,解压:之后千万别到bin环境点击logstash.bat这个命令启动,这样会报错的 4.接下来,在logstash安装目录找到config文件夹,在那里新增一个文件夹,我新建的为shop文件夹,然后在里面添加如下文

如何利用BI搭建电商数据分析平台

某电商是某大型服装集团下的重要销售平台.2015 年,该集团品牌价值达数百亿元,产品质量.市场占有率.出口创汇.销售收入连年居全国绒纺行业第一,在中国有终端店3000多家,零售额80 亿.其羊绒制品年产销能力1000万件以上的规模,占有中国的40%和世界的30%的市场份额. 该集团旗下的电商部门主要负责服装公司线上运营工作,涉及的平台有淘宝.天猫.京东.苏宁易购.唯品会等,每年涉及的流水金额大概在1亿RMB左右. 项目背景: 原来该公司旗下各品牌和部门的IT管理部门是独立的,没有归属于服装公司下

[原创]如何利用BI搭建电商数据分析平台

某电商是某大型服装集团下的重要销售平台.2015 年,该集团品牌价值达数百亿元,产品质量.市场占有率.出口创汇.销售收入连年居全国绒纺行业第一,在中国有终端店3000多家,零售额80 亿.其羊绒制品年产销能力1000万件以上的规模,占有中国的40%和世界的30%的市场份额. 该集团旗下的电商部门主要负责服装公司线上运营工作,涉及的平台有淘宝.天猫.京东.苏宁易购.唯品会等,每年涉及的流水金额大概在1亿RMB左右. 项目背景: 原来该公司旗下各品牌和部门的IT管理部门是独立的,没有归属于服装公司下

跨境电商如何从商店沦为中介

一直以来,跨境电商都是电商行业里极其特殊的一个细分垂直领域.相比其他呈现高速发展态势的电商领域,跨境电商的发展轨迹就像是在玩过山车--时而一飞冲天,时而跌入低谷.而在发展的过程中,跨境电商也在不断转变自身形态.从最具雄心勃勃的自有商品电商平台,到现在迷茫彷徨,跨境电商的内心可谓五味杂陈. 近段时间以来的新政让一些依靠保税仓起家的跨境电商平台遭受重击.这种依靠补贴."特惠通关"等地区性扶+持政策维生的平台,不得不面临急迫转型,纷纷将目光聚焦在更为省事.受到政策较小影响的海外直购上.这种经

电商干货!1000万烧出来的高点击率钻展创意图十大原则(营销&amp;人性)

梦想凯歌:创意图的钻展的灵魂,没有创意图你什么都不是.无论是日常推广还是做大促活动,创意图是测试的重中之重,一定要提前测试好每一个资源位的创意图.今天这篇好文是一个资深电商设计师在操作钻展烧了1000多万后总结的经验,不少技巧可以用在Banner设计上. 创意图是你获取流量的入口,由创意图延升到落地页,进而是整一个活动项目. 所以,这节课很关键,也是我这系列课程的重点.到目前操作钻展也至少烧了1000多万了. 很多朋友常常发图片给梦想凯歌,问如何优化?这十大原则是我梦想凯歌做创意图的总结! 虽然