一、需求

后台商品管理中,将商品添加到可秒杀商品列表

选中商品将其设置为可秒杀。

选择具体的参与秒杀的商品规格,然后设置相关参数,点击保存即可。

二、后端接口修改

原来的添加秒杀商品接口在leyou-secskill微服务中,现在将其移动到leyou-item中,代码如下:

2.1 Controller

/*** 添加秒杀商品* @param seckillParameters* @return* @throws ParseException*/@PostMapping("/seckill/add")public ResponseEntity<Boolean> addSeckillGoods(@RequestBody List<SeckillParameter> seckillParameters) throws ParseException {if (seckillParameters != null && seckillParameters.size() > 0){for (SeckillParameter seckillParameter : seckillParameters){this.goodsService.addSeckillGoods(seckillParameter);}}else {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();}return ResponseEntity.ok().build();}

2.2 Service

/*** 添加秒杀商品* @param seckillParameter*/@Override@Transactional(rollbackFor = Exception.class)public void addSeckillGoods(SeckillParameter seckillParameter) throws ParseException {SimpleDateFormat sdf =  new SimpleDateFormat( "yyyy-MM-dd HH:mm" );//1.根据spu_id查询商品Long id = seckillParameter.getId();Sku sku = this.querySkuById(id);//2.插入到秒杀商品表中SeckillGoods seckillGoods = new SeckillGoods();seckillGoods.setEnable(true);seckillGoods.setStartTime(sdf.parse(seckillParameter.getStartTime().trim()));seckillGoods.setEndTime(sdf.parse(seckillParameter.getEndTime().trim()));seckillGoods.setImage(sku.getImages());seckillGoods.setSkuId(sku.getId());seckillGoods.setStock(seckillParameter.getCount());seckillGoods.setTitle(sku.getTitle());seckillGoods.setSeckillPrice(sku.getPrice()*seckillParameter.getDiscount());this.seckillMapper.insert(seckillGoods);//3.更新对应的库存信息,tb_stockStock stock = stockMapper.selectByPrimaryKey(sku.getId());System.out.println(stock);if (stock != null) {stock.setSeckillStock(stock.getSeckillStock() != null ? stock.getSeckillStock() + seckillParameter.getCount() : seckillParameter.getCount());stock.setSeckillTotal(stock.getSeckillTotal() != null ? stock.getSeckillTotal() + seckillParameter.getCount() : seckillParameter.getCount());stock.setStock(stock.getStock() - seckillParameter.getCount());this.stockMapper.updateByPrimaryKeySelective(stock);}else {LOGGER.info("更新库存失败!");}//4.更新redis中的秒杀库存updateSeckillStock();}/*** 更新秒杀商品数量* @throws Exception*/public void updateSeckillStock(){//1.查询可以秒杀的商品List<SeckillGoods> seckillGoods = this.querySeckillGoods();if (seckillGoods == null || seckillGoods.size() == 0){return;}BoundHashOperations<String,Object,Object> hashOperations = this.stringRedisTemplate.boundHashOps(KEY_PREFIX);if (hashOperations.hasKey(KEY_PREFIX)){hashOperations.delete(KEY_PREFIX);}seckillGoods.forEach(goods -> hashOperations.put(goods.getSkuId().toString(),goods.getStock().toString()));}

service的具体实现和前边没有什么大的改变,就是多了一步更新redis中秒杀库存的操作,原来是放在leyou-secskill中Controller初始化时进行的。上面代码中所包含的辅助类直接copy到leyou-item中就可以了。

三、前端页面

新增一个对话框,用来显示可秒杀的商品:

点击保存的时候将数据进行封装,然后发到后台即可。

dataTable中新增秒杀按钮:

点击事件:(主要作用就是数据传递)

对话框代码:

<template><v-form  ref="SeckillForm"><v-container grid-list-md><v-layout column wrap><v-flex xs12 lg6><v-layout row><v-text-fieldreadonlylabel="商品编号"prepend-icon="label"style="width: 50px"v-model="goods_message.goodsId"></v-text-field><v-text-fieldreadonlylabel="商品名称"prepend-icon="label"style="width: 100px"v-model="goods_message.goodsTitle"></v-text-field><v-text-fieldreadonlylabel="商品分类"prepend-icon="label"style="width: 100px"v-model="goods_message.goodsCname"></v-text-field><v-text-fieldreadonlylabel="品牌"prepend-icon="label"style="width: 100px"v-model="goods_message.goodsBname"></v-text-field></v-layout><v-layout row><v-layout row><v-menuref="menu1":close-on-content-click="false"v-model="menu1":nudge-right="40"lazytransition="scale-transition"offset-yfull-widthmax-width="290px"min-width="290px"><v-text-fieldslot="activator"v-model="dateFormatted"label="开始日期"prepend-icon="event"persistent-hintreadonly@blur="date = parseDate(dateFormatted)"></v-text-field><v-date-picker locale="zh-cn" v-model="date" no-title @input="menu1 = false"></v-date-picker></v-menu><v-dialogref="dialog1"v-model="modal1":return-value.sync="time1"persistentlazyfull-widthwidth="290px"><v-text-fieldslot="activator"v-model="time1"label="开始时间"prepend-icon="access_time"readonly></v-text-field><v-time-pickerv-if="modal1"v-model="time1"full-width><v-spacer></v-spacer><v-btn flat color="primary" @click="modal1 = false">Cancel</v-btn><v-btn flat color="primary" @click="$refs.dialog1.save(time1)">OK</v-btn></v-time-picker></v-dialog></v-layout><v-layout row><v-menu:close-on-content-click="false"v-model="menu2":nudge-right="40"lazytransition="scale-transition"offset-yfull-widthmax-width="390px"min-width="390px"><v-text-fieldslot="activator"v-model="dateFormatted2"label="结束日期"prepend-icon="event"persistent-hintreadonly@blur="date2 = parseDate(dateFormatted2)"></v-text-field><v-date-picker locale="zh-cn" v-model="date2" no-title @input="menu2 = false"></v-date-picker></v-menu><v-dialogref="dialog2"v-model="modal2":return-value.sync="time2"persistentlazyfull-widthwidth="290px"><v-text-fieldslot="activator"v-model="time2"label="结束时间"prepend-icon="access_time"readonly></v-text-field><v-time-pickerv-if="modal2"v-model="time2"full-width><v-spacer></v-spacer><v-btn flat color="primary" @click="modal2 = false">Cancel</v-btn><v-btn flat color="primary" @click="$refs.dialog2.save(time2)">OK</v-btn></v-time-picker></v-dialog></v-layout></v-layout></v-flex><v-flex xs12 lg6><v-data-table:headers="headers":items="sku"class="elevation-1"hide-actions><template v-if="props.item.enable === false" slot="items" slot-scope="props"><td class="text-xs-center" style="width: 150px">{{ props.item.spec }}</td><td class="text-xs-center" >{{ props.item.price }}</td><td class="text-xs-center">{{ props.item.stock }}</td><td class="text-xs-center"><v-select:items="items"item-text="dis"item-value="value"v-model="props.item.discount"></v-select></td><td class="text-xs-center"><v-text-fieldlabel="数量"v-model="props.item.seckill_count"></v-text-field></td><td class="text-xs-center"><v-checkbox color="primary"  v-model="props.item.enable"/></td></template></v-data-table></v-flex></v-layout></v-container><v-layout class="pt-3" ><v-spacer></v-spacer><v-btn color="blue darken-1" flat @click="clear">清空</v-btn><v-btn color="blue darken-1" flat @click="submit">保存</v-btn></v-layout></v-form>
</template><script>export default {name: "MySeckillForm",data: vm => ({headers: [{ text: '规格属性', value: 'spec', align:"center", sortable:false},{ text: '价格', value: 'price' , align:"center", sortable:false},{ text: '现有库存', value: 'stock' , align:"center", sortable:false},{ text: '折扣', align:"center", sortable:false},{ text: '秒杀数量' , align:"center", sortable:false},{ text: '是否秒杀' , align:"center", sortable:false}],goods_count:'',date: new Date().toISOString().substr(0, 10),date2: new Date().toISOString().substr(0, 10),dateFormatted: vm.formatDate(new Date().toISOString().substr(0, 10)),dateFormatted2: vm.formatDate(new Date().toISOString().substr(0, 10)),menu1: false,menu2: false,time1: null,modal1: false,time2: null,modal2: false,items: [{dis:'一折',value:0.1},{dis:'二折',value:0.2},{dis:'三折',value:0.3},{dis:'四折',value:0.4},{dis:'五折',value:0.5},{dis:'六折',value:0.6},{dis:'七折',value:0.7},{dis:'八折',value:0.8},],goods_message:{}, //秒杀商品信息skus:[],sku_temp:[],}),props:{seckill_goods_message:{type:Object},},computed:{sku:{// getterget: function () {let temp = [];this.skus.forEach(sku => {const ownSpec = JSON.parse(sku.ownSpec);let str = "";for (let key in ownSpec){str += (" " + ownSpec[key])}temp.push({id:sku.id,spec:str,price:this.$format(sku.price),stock:sku.stock,enable:false,})});return temp;},// setterset: function (newValue) {}}},watch: {seckill_goods_message:{deep:true,handler(val){console.log(val);if(val){this.goods_message = Object.deepCopy(val);this.loadData(this.goods_message.goodsId);}else{this.clear();}}},date (val) {this.dateFormatted = this.formatDate(this.date)},date2 (val) {this.dateFormatted2 = this.formatDate(this.date2)if (this.date2 < this.date){this.$message.confirm("结束日期必须大于开始日期!").then(() => {this.date2 = null;}).catch(() => {this.date2 = null;});}},},created(){let temp = [];this.skus.forEach(sku => {const ownSpec = JSON.parse(sku.ownSpec);let str = "";for (let key in ownSpec){str += (" " + ownSpec[key])}temp.push({id:sku.id,spec:str,price:this.$format(sku.price),stock:sku.stock,enable:false,})});this.sku_temp = temp;this.clear();},methods: {loadData(id){//查询spu下的所有skuthis.$http.get("/item/goods/sku/list/" + id).then((resp) => {this.skus = resp.data;}).catch();},formatDate (date) {if (!date) return null;const [year, month, day] = date.split('-');return `${year}年${month}月${day}日`},parseDate (date) {if (!date) return null;const [month, day, year] = date.split('/');return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`},clear(){this.goods_count = null;this.date = null;this.date2 = null;this.time1 = null;this.time2 = null;this.discount = null;},submit(){const startTime = this.date +" " + this.time1;const endTime = this.date2 +" " + this.time2;let result = [];this.sku.forEach(temp => {if (temp.enable){result.push({startTime:startTime,endTime:endTime,id:temp.id,count:parseInt(temp.seckill_count),discount:temp.discount});}});this.verify().then(() => {this.$http({url:"/item/goods/seckill/add",method:"post",headers : {'Content-Type' : 'application/json;charset=utf-8'},dataType:"json",data:JSON.stringify(result)}).then(() =>{//添加成功setTimeout(() =>{this.$emit('seckill_close');this.$message.success("保存成功!");this.clear();},2000);}).catch(() => {this.$message.error("添加失败!");});}).catch(() => {this.$router.push("/login");});}}}
</script><style scoped></style>

主页面中调用:

完整代码:https://github.com/lyj8330328

乐优商城(填坑)——秒杀商品添加相关推荐

  1. 乐优商城(05)--商品管理

    乐优商城(05)–商品管理 一.导入图片资源 现在商品表中虽然有数据,但是所有的图片信息都是无法访问的,因此需要把图片导入到服务器中: 将images.zip文件上传至/leyou/static目录: ...

  2. 乐优商城(四)商品规格管理

    文章目录 1. 商品规格 1.1 SPU 和 SKU 1.2 分析商品规格的关系 1.3 数据库设计 1.3.1 商品规格组表 1.3.2 商品规格参数表 2. 商品规格组 2.1 商品规格组前端 2 ...

  3. 乐优商城学习笔记五-商品规格管理

    0.学习目标 了解商品规格数据结构设计思路 实现商品规格查询 了解SPU和SKU数据结构设计思路 实现商品查询 了解商品新增的页面实现 独立编写商品新增后台功能 1.商品规格数据结构 乐优商城是一个全 ...

  4. 乐优商城笔记六:商品详情页

    使用模板引擎 Thymeleaf + nginx 完成商品详情页静态化 完成乐优商城商品详情页 搭建商品详情页微服务 创建子工程 GroupId:com.leyou.service ArtifactI ...

  5. 乐优商城--服务(三) : 商品微服务(LyItemApplication)--前半部分

    商品微服务--前半部分: 1. 微服务结构(ly-item) 1.0 顶级父工程(le-you) 1.1 ly-item 1.1.1 ly-item-interface 1.1.1.1 添加依赖 1. ...

  6. 乐优商城(三)商品分类管理

    目录 一.数据 二.页面实现 2.1 页面分析 2.2 功能实现 2.2.1 url异步请求 2.2.2 后台接口实现 2.3 解决跨域请求 2.3.1 什么是跨域 2.3.2 解决跨域问题的方案 2 ...

  7. 乐优商城之规格参数商品查询(十)

    文章目录 (一)规格参数表结构 (二)数据库表单分析 (三)规格参数组页面分析 (四)规格参数组查询的代码实现 (五)规格参数页面分析 (六)规格参数查询的代码实现 (七)表关系 (八)标结构场景解析 ...

  8. 乐优商城(填坑)——后台登录

    后台管理模块增加登录验证,与门户网站一样都是采用无状态登录. 一.新增全局函数 在main.js中新增用户验证: 二.修改路由 先显示登录页面 效果: 三.解决cookie写入问题 在http.js中 ...

  9. 【javaWeb微服务架构项目——乐优商城day05】——商品规格参数管理(增、删、改,查已完成),SPU和SKU数据结构,商品查询

    乐优商城day05 0.学习目标 1.商品规格数据结构 1.1.SPU和SKU 1.2.数据库设计分析 1.2.1.思考并发现问题 1.2.2.分析规格参数 1.2.3.SKU的特有属性 1.2.4. ...

  10. 乐优商城 Day 09(thymeleaf,Rabbitmq,商品详情页,非教程)

    乐优商城学习Day09: 注意:此次代码都是在第八天的基础上 第八天的链接如下: https://blog.csdn.net/zcylxzyh/article/details/100859210 此次 ...

最新文章

  1. spring aop原理_Spring知识点总结!已整理成142页离线文档(源码笔记+思维导图)...
  2. ZeroMQ接口函数之 :zmq_msg_init - 初始化一个空的ZMQ消息结构
  3. Vmware中安装RHEL5
  4. python全排列问题_Python基于回溯法子集树模板解决全排列问题示例
  5. APP签名MD5获取
  6. IP基础及ping命令
  7. Laravel项目问题集锦
  8. 账户余额“蒸发”暴露网银安全哪些漏洞?
  9. apache2: unrecognized service
  10. MyEclipse插件不能安装原因
  11. Centos7.6环境使用kubeadm部署kubernetes1.18.4
  12. 前端工程师月薪上万的秘密
  13. 华为手机非华为电脑NFC一碰传使用
  14. 【HNOI 2018】寻宝游戏
  15. 三星android5 root包,三星N9200刷国行系统(含五件套root权限recovery SuperSU)
  16. 罗德里格旋转公式推导
  17. Jtapi开发之转接二 传递uui
  18. 【KVM虚拟化实践与编程】云平台管理系统
  19. Pinia的简单使用
  20. C语言用函数指针变量调用函数

热门文章

  1. 我们正进入另一个黑暗和无知的时代----《三联生活周刊》 (转载)
  2. 传便利蜂获腾讯与高瓴大笔投资 物美接盘部分邻家业务
  3. 大学生日常之初学linux
  4. 无刷直流电机-通过三相电压波形大概计算电机目前转速
  5. AES - JAVA
  6. 利用itext操作pdf从数据库导出大量数据--功能汇总(一)
  7. Splashtop,您远程办公的不二之选
  8. 梦幻诛仙11职业linux架设手游,一款【梦幻诛仙11职业】手游端私服架设+JAVA后台+架设视频教程...
  9. 监考老师与作弊学生(影视版)(摘自sohu)
  10. Unity声音-音源组件AudioSource