1.创建PromoService接口


public interface PromoService {PromoModel getPromoByItemId(Integer itemId);
}

2.在PromoDOMapper中可定义方法

 PromoDO selectByItemId(Integer itemId);

3.在PromoDOMapper.xml中添加sql语句

  <select id="selectByItemId" resultMap="BaseResultMap" parameterType="java.lang.Integer" >select<include refid="Base_Column_List" />from promowhere item_id = #{itemId,jdbcType=INTEGER}</select>

4.在数据库promo中添加字段end_date 相应的PromoModel和对应的xml文件中需要手动修改

还有PromoDO

在PromoModel中添加private Integer status;来判断秒杀状态 数据库中不用写入

5.创建实现接口的PromoServiceImpl

@Service
public class PromoServiceImpl implements PromoService {@Autowiredprivate PromoDOMapper promoDOMapper;@Overridepublic PromoModel getPromoByItemId(Integer itemId) {//获取对应商品的秒杀活动信息PromoDO promoDO = promoDOMapper.selectByItemId(itemId);//dataobject->modelPromoModel promoModel = convertFromDataObject(promoDO);if(promoModel == null){return null;}//判断当前时间 是否 秒杀活动即将开始或者正在进行DateTime now = new DateTime();//开始时间比现在还要后面 活动未开始if(promoModel.getStartDate().isAfterNow()){promoModel.setStatus(1);//开始时间比现在还要前面 活动已结束}else if(promoModel.getEndDate().isBeforeNow()){promoModel.setStatus(3);//其他的情况在录入数据中}else{promoModel.setStatus(2);}return promoModel;}private PromoModel convertFromDataObject(PromoDO promoDO){if(promoDO == null){return null;}PromoModel promoModel=new PromoModel();BeanUtils.copyProperties(promoDO,promoModel);promoModel.setPromoItemPrice(new BigDecimal(promoDO.getPromoItemPrice()));promoModel.setStartDate(new DateTime(promoDO.getStartDate()));promoModel.setEndDate(new DateTime(promoDO.getEndDate()));return promoModel;}
}

6.ItemModel

    //使用聚合模型,如果promoModel不为空,则表示其拥有还未结束的秒杀活动private PromoModel promoModel;public PromoModel getPromoModel() {return promoModel;}public void setPromoModel(PromoModel promoModel) {this.promoModel = promoModel;}

7.ItemServiceImpl

 @Overridepublic ItemModel getItemById(Integer id) {ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);if(itemDO == null){return null;}//操作获得库存数量ItemStockDO itemStockDO=itemStockDOMapper.selectByItemId(itemDO.getId());//将dataobject->modelItemModel itemModel = convertModelFromDataObject(itemDO,itemStockDO);//获取活动商品信息PromoModel promoModel= promoService.getPromoByItemId(itemModel.getId());//=null 没有秒杀活动 !=有秒杀活动if(promoModel != null && promoModel.getStatus().intValue()!=3){itemModel.setPromoModel(promoModel);}return itemModel;}

8.ItemVO 前端展示信息添加

    //记录商品是否在秒杀活动中 以及秒杀状态 0表示没有秒杀活动 1表示秒杀活动待开始 2表示秒杀活动进行中private Integer promoStatus;//秒杀活动价格private BigDecimal promoPrice;//秒杀活动IDprivate Integer promoId;//秒杀活动开始时间 用来做倒计时用private DateTime startDate;//get set 方法

9.ItemController

 //商品详情页浏览@RequestMapping(value = "/get", method = {RequestMethod.GET})@ResponseBodypublic CommonReturnType getItem(@RequestParam(name = "id") Integer id ){ItemModel itemModel=itemService.getItemById(id);ItemVO itemVO = convertVOFromModel(itemModel);return CommonReturnType.create(itemVO);}private ItemVO convertVOFromModel(ItemModel itemModel) {if (itemModel == null) {return null;}ItemVO itemVO = new ItemVO();BeanUtils.copyProperties(itemModel, itemVO);if(itemModel.getPromoModel()!=null){//有正在进行的或者即将进行的活动itemVO.setPromoStatus(itemModel.getPromoModel().getStatus());itemVO.setPromoId(itemModel.getPromoModel().getId());itemVO.setStartDate(itemModel.getPromoModel().getStartDate());itemVO.setPromoPrice(itemModel.getPromoModel().getPromoItemPrice());}else{itemVO.setPromoStatus(0);}return itemVO;}

10.修改ItemVO中的开始时间类型为String

 //秒杀活动开始时间 用来做倒计时用private String startDate;

11.修改ItemController中关于开始时间的语句

    private ItemVO convertVOFromModel(ItemModel itemModel) {if (itemModel == null) {return null;}ItemVO itemVO = new ItemVO();BeanUtils.copyProperties(itemModel, itemVO);if(itemModel.getPromoModel()!=null){//有正在进行的或者即将进行的活动itemVO.setPromoStatus(itemModel.getPromoModel().getStatus());itemVO.setPromoId(itemModel.getPromoModel().getId());itemVO.setStartDate(itemModel.getPromoModel().getStartDate().toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")));itemVO.setPromoPrice(itemModel.getPromoModel().getPromoItemPrice());}else{itemVO.setPromoStatus(0);}return itemVO;}

12.修改OrderModel

 //订单号 有属性private String id;//购买用户的idprivate Integer userId;//购买的商品idprivate Integer itemId;//若非空,则表示是以秒杀商品的方式下单private Integer promoId;//购买商品的单价,若promoId非空,则表示秒杀商品价格private BigDecimal itemPrice;//购买数量private Integer amount;//购买金额若promoId非空,则表示秒杀商品价格private BigDecimal orderPrice;

13.在order_info表中添加字段promo_id

同时修改OrderDO

 private Integer promoId;

修改OrderDOMapper.xml

14.修改OrderService


public interface OrderService {//使用了1.通过前端url上传过来秒杀活动id,然后下单接口内校验对应id是否属于对应商品且活动已开始//2.直接再下单接口内判断对应的商品是否存在秒杀活动,若存在进行中的则以秒杀价格下单OrderModel createOrder(Integer userId, Integer itemId,Integer promoId, Integer amount) throws BusinessException;}

15.OrderServiceImpl

@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate SequenceDOMapper sequenceDOMapper;@Autowiredprivate ItemService itemService;@Autowiredprivate UserService userService;@Autowiredprivate OrderDOMapper orderDOMapper;@Override//保证创建订单在同一个事务当中@Transactionalpublic OrderModel createOrder(Integer userId, Integer itemId,Integer promoId, Integer amount) throws BusinessException {//1.校验下单状态,下单的商品是否存在,用户是否合法,购买数量是否正确ItemModel itemModel = itemService.getItemById(itemId);if(itemModel == null){throw  new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"商品信息不存在");}UserModel userModel =userService.getUserById(userId);if(userModel == null){throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"用户信息不存在");}//下单数量假设为不能小于0 不能大于99if(amount <=0 || amount >99){throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"购买的数量信息不正确");}//校验活动信息if(promoId !=1){//(1)校验对应活动是否存在这个对应的商品if(promoId.intValue()!=itemModel.getPromoModel().getId()){throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"活动信息不正确");//(2)校验活动是否正在进行中}else if(itemModel.getPromoModel().getStatus().intValue()!=2){throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"活动信息不正确");}}// 2.落单减库存:在调用订单的createorder下单之前,先把amount数量的库存锁定给这个用户使用,若库存不够就为下单失败。下单成功则锁定库存的操作必定成功//  支付减库存(未使用)boolean result = itemService.decreaseStock(itemId,amount);if(!result){throw new BusinessException(EmBusinessError.STOCK_NOT_ENOUGH);}//3.订单入库OrderModel orderModel = new OrderModel();orderModel.setUserId(userId);orderModel.setItemId(itemId);orderModel.setAmount(amount);if(promoId != null){orderModel.setItemPrice(itemModel.getPromoModel().getPromoItemPrice());}else{orderModel.setItemPrice(itemModel.getPrice());}orderModel.setPromoId(promoId);orderModel.setOrderPrice(orderModel.getItemPrice().multiply(new BigDecimal(amount)));//生成交易流水号--订单号orderModel.setId(generateOrderNo());OrderDO orderDO = convertFromOrderModel(orderModel);orderDOMapper.insertSelective(orderDO);//加上商品销量itemService.increaseSales(itemId,amount);//4.返回前端return orderModel;}@Transactional(propagation = Propagation.REQUIRES_NEW)private String generateOrderNo(){//订单号有16位StringBuilder stringBuilder = new StringBuilder();//前八位为时间信息 年月日//获取今天日期LocalDateTime now = LocalDateTime.now();String nowDate= now.format(DateTimeFormatter.ISO_DATE).replace("-","");stringBuilder.append(nowDate);//中间六位为自增序列//获取当前sequenceint sequence = 0;SequenceDO sequenceDO = sequenceDOMapper.getSequenceByName("order_info");sequence =sequenceDO.getCurrentValue();sequenceDO.setCurrentValue(sequenceDO.getCurrentValue() + sequenceDO.getStep());sequenceDOMapper.updateByPrimaryKeySelective(sequenceDO);//拼接对应的sequence 凑够六位String sequenceStr = String.valueOf(sequence);for(int i =0; i < 6-sequenceStr.length();i++){stringBuilder.append(0);}stringBuilder.append(sequenceStr);//最后两位为分库分表为1-99 暂时写死stringBuilder.append("00");return stringBuilder.toString();}//将Model转为为一个dataobject的方式private OrderDO convertFromOrderModel(OrderModel orderModel){if(orderModel == null){return null;}OrderDO orderDO =new OrderDO();BeanUtils.copyProperties(orderModel,orderDO);orderDO.setItemPrice(orderModel.getItemPrice().doubleValue());orderDO.setOrderPrice(orderModel.getOrderPrice().doubleValue());return orderDO;}
}

16.OrderController

@Controller("order")
@RequestMapping("/order")
@CrossOrigin(origins = {"*"},allowCredentials = "true",allowedHeaders="*")public class OrderController extends BaseController {@Autowiredprivate OrderService orderService;@Autowiredprivate HttpServletRequest httpServletRequest;//封装下单请求@RequestMapping(value = "/createorder", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})@ResponseBodypublic CommonReturnType createOrder(@RequestParam(name = "itemId") Integer itemId,@RequestParam(name = "amount") Integer amount,@RequestParam(name="promoId",required=false)Integer promoId) throws BusinessException {//获取用户登录信息Boolean isLogin = (Boolean) httpServletRequest.getSession().getAttribute("IS_LOGIN");if (isLogin == null || !isLogin.booleanValue()) {throw new BusinessException(EmBusinessError.USER_NOT_LOGIN, "用户还未登录,不能下单");}UserModel userModel = (UserModel) httpServletRequest.getSession().getAttribute("LOGIN_USER");OrderModel orderModel = orderService.createOrder(userModel.getId(), promoId,itemId, amount);return CommonReturnType.create(null);}}

17.修改getitem.html界面  商品详情页

<html>
<head><meta charset="UTF-8"><link href="static/assets/global/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/><link href="static/assets/global/css/components.css" rel="stylesheet" type="text/css"/><link href="static/assets/admin/pages/css/login.css" rel="stylesheet" type="text/css"/><script src="static/assets/global/plugins/jquery-1.11.0.min.js" type="text/javascript"></script><title>Title</title>
</head>
<body class="login">
<div class="content"><h3 class="form-title">商品详情</h3><div id="promoStartDateContainer" class="form-group"><label style="color: blue" id="promoStatus" class="control-label"></label><div><label style="color: red" class="control-label" id="promoStartDate" /></div></div><div class="form-group"><label class="control-label">商品名</label><div><label class="control-label" id="title" /></div></div><div class="form-group"><label class="control-label">商品描述</label><div><label class="control-label" id="description" /></div></div><div id="normalPriceContainer" class="form-group"><label class="control-label">商品价格</label><div><label class="control-label" id="price" /></div></div><div id="promoPriceContainer" class="form-group"><label style="color: red" class="control-label">秒杀价格</label><div><label style="color: red" class="control-label" id="promoPrice" /></div></div><div class="form-group"><label class="control-label">图片</label><div><img style="width: 200px;height: auto" id="imgUrl"/></div></div><div class="form-group"><label class="control-label">商品库存</label><div><label class="control-label" id="stock" /></div></div><div class="form-group"><label class="control-label">商品销量</label><div><label class="control-label" id="sales" /></div><div class="form-actions"><button class="btn blue" id="createorder" type="submit">下单</button></div></div></div>
</div>
</body><script>function getParam(paramName) {paramValue = "", isFound = !1;if (this.location.search.indexOf("?") == 0 && this.location.search.indexOf("=") > 1) {arrSource = unescape(this.location.search).substring(1, this.location.search.length).split("&"), i = 0;while (i < arrSource.length && !isFound)arrSource[i].indexOf("=") > 0 && arrSource[i].split("=")[0].toLowerCase() == paramName.toLowerCase() && (paramValue = arrSource[i].split("=")[1], isFound = !0), i++}return paramValue == "" && (paramValue = null), paramValue}var g_itemVO = {};jQuery(document).ready(function () {$("#createorder").on("click",function () {$.ajax({type:"POST",contentType:"application/x-www-form-urlencoded",url:"http://localhost:8090/order/createorder",data:{"itemId":g_itemVO.id,"amount":1,"promoId":g_itemVO.promoId},//允许跨域请求xhrFields:{withCredentials:true},success:function (data) {if (data.status=="success") {alert("下单成功");window.location.reload();}else {alert("下单失败,原因为" + data.data.errMsg);if(data.data.errCode == 20003){window.location.href="login.html"}}},error:function (data) {alert("下单失败,原因为"+data.responseText);}});})//获取商品详情$.ajax({type:"GET",contentType:"application/x-www-form-urlencoded",url:"http://localhost:8090/item/get",data:{"id":getParam("id"),},//允许跨域请求xhrFields:{withCredentials:true},success:function (data) {if (data.status=="success") {g_itemVO = data.data;reloadDom();//每隔一秒钟执行一次setInterval(reloadDom,1000)}else {alert("获取信息失败,原因为" + data.data.errMsg);}},error:function (data) {alert("获取信息失败,原因为"+data.responseText);}});});function reloadDom() {$("#title").text(g_itemVO.title);$("#imgUrl").attr("src", g_itemVO.imgUrl);$("#description").text(g_itemVO.description);$("#price").text(g_itemVO.price);$("#stock").text(g_itemVO.stock);$("#sales").text(g_itemVO.sales);if(g_itemVO.promoStatus == 1){//秒杀活动还未开始//倒计时var startTime= g_itemVO.startDate.replace(new RegExp("-","gm"),"/");startTime = (new Date(startTime)).getTime();var nowTime = Date.parse(new Date());var delta = (startTime - nowTime)/1000;if(delta <= 0){//活动开始了g_itemVO.promoStatus=2;reloadDom();}$("#promoStartDate").text("秒杀活动将于: "+g_itemVO.startDate+"开始售卖 倒计时:"+delta+"秒");$("#promoPrice").text(g_itemVO.promoPrice);//秒杀活动没开始时 不能下单$("#createorder").attr("disabled",true);}else if(g_itemVO.promoStatus == 2){//秒杀活动正在进行$("#promoStartDate").text("秒杀正在进行中");$("#promoPrice").text(g_itemVO.promoPrice);//秒杀活动开始时 可以下单$("#createorder").attr("disabled",false);$("#normalPriceContainer").hide();}}
</script>
</html>

运行效果图  成功!!!

活动模型与商品模型结合相关推荐

  1. 电商系统中的商品模型的分析与设计

    前言 在电商系统中,商品模型至关重要,是整个电商的核心,下面通过一个简单的分析,设计一个基础的商品模型. 商品模型的演化 在以前,那时CMS很流行,最常见的模型是栏目-文章模型.于是做电商的时候,自然 ...

  2. 电商系统中的商品模型的分析与设计—续

    在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介绍. 从SPU ...

  3. 架构设计之三种业务模型:活动资源模型、契约模型、模板模型

    欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析.实际应用.架构思维.职场分享.产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习 1 文章概述 在实际 ...

  4. 使用时间序列分解模型预测商品销量

    阿里云大学课程:使用时间序列分解模型预测商品销量 课程介绍: 商品销量预测是企业制定运营策略的一个重要依据,在激烈的竞争环境中,企业如何预测零售商品的销量并根据销量制定运营策略? 本课程帮助学员了解销 ...

  5. 电商网站商品模型之商品详情页设计方案 - 梦亦晓 - 博客园

    电商网站商品模型之商品详情页设计方案 - 梦亦晓 - 博客园

  6. 商城后台系统商品模型(类型)新增接口开发

    商品模型新增 接口文档 请求地址 POST /types 需进行token认证 示例: http://adminapi.tbyue.com/types 请求参数 名称 类型 必填 备注 type_na ...

  7. 一文了解 AI 商品模型训练平台

    AI平台的初衷永远是提高开发效率,加快算法迭代周期.通过产品化AI技术,让运营人员能够更贴近技术,更好地指导赋能业务场景,给客户带来更好的技术体验和产品体验. 本文是2020年的正式第一文,介绍了人工 ...

  8. 阿里云ACA 使用时间序列分解模型预测商品销量(一)

    使用时间序列分解模型预测商品销量 1.1实验目的 1.2实验概述 1.3 实验目标 1.4 实验工具 1.5 实验准备 实验资源 ============== 这是一条分割线 ============ ...

  9. 使用时间序列分解模型预测商品销量(手把手教你如何利用阿里云大数据开发套件进行商品销量的预测)

    使用时间序列分解模型预测商品销量 1.1实验目的 1.2实验概述 1.3 实验目标 1.4 实验工具 1.5 实验准备 实验资源 ============== 这是一条分割线 ============ ...

最新文章

  1. Linux 开机网络无法自动连接配置、网络开机自动连接
  2. xlst 解析 html c,怎樣實現利用xslt把xml文件內容顯示到html文件中?急!
  3. DataNode启动后自动停止的问题( Incompatible clusterIDs in /xxx/xxx;namenode clusterID = xxxx;datanode clusterI)
  4. Android回调的简单理解
  5. 云时代的智能运维平台,助力企业创新迭代
  6. 一张图看懂小程序全生态
  7. FindBugs Maven插件教程
  8. UEditor1.2.6.0在.net环境下使用
  9. STL源码剖析 set相关算法
  10. 个人帐目管理系统java_Java 项目 个人帐目管理系统
  11. python 字符串 换行_Python基础教程——字符串
  12. 令人震惊的电子邮件归档调查
  13. 翻译:web制作、开发人员需知的Web缓存知识
  14. Python轻量级ORM框架——peewee
  15. 超支化共轭聚合物纳米粒子-具有水分散性/PLGA 纳米粒子载药
  16. linux 定时关机命令
  17. Xbox手柄转子马达的控制运用机制原理
  18. JAV学习笔记6--7
  19. AI,掀起颠覆建筑业的浪潮!
  20. 第9节 NTFS安全权限—给文件/文件夹设权限

热门文章

  1. Microsoft Office Communicator 2007 新特性
  2. 我的工作简史,我的阅读简史
  3. Linux之Rsync+inotify数据同步
  4. ADB稳定性测试教程干货
  5. coco数据集目标检测论文_目标检测coco数据集点滴介绍
  6. pytorchOCR之DBnet(多类别文本检测1)
  7. js,jQuery,js-EasyU大总结
  8. MySQL-10-运算符
  9. 查看HTTP 各方法的消息请求头和响应头——get/head/post/put
  10. 基于MATLAB电动机调速系统设计,电气工程课程设计——基于Matlab异步电动机调速系统设计...