乐优商城(填坑)——秒杀商品添加
一、需求
后台商品管理中,将商品添加到可秒杀商品列表
选中商品将其设置为可秒杀。
选择具体的参与秒杀的商品规格,然后设置相关参数,点击保存即可。
二、后端接口修改
原来的添加秒杀商品接口在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
乐优商城(填坑)——秒杀商品添加相关推荐
- 乐优商城(05)--商品管理
乐优商城(05)–商品管理 一.导入图片资源 现在商品表中虽然有数据,但是所有的图片信息都是无法访问的,因此需要把图片导入到服务器中: 将images.zip文件上传至/leyou/static目录: ...
- 乐优商城(四)商品规格管理
文章目录 1. 商品规格 1.1 SPU 和 SKU 1.2 分析商品规格的关系 1.3 数据库设计 1.3.1 商品规格组表 1.3.2 商品规格参数表 2. 商品规格组 2.1 商品规格组前端 2 ...
- 乐优商城学习笔记五-商品规格管理
0.学习目标 了解商品规格数据结构设计思路 实现商品规格查询 了解SPU和SKU数据结构设计思路 实现商品查询 了解商品新增的页面实现 独立编写商品新增后台功能 1.商品规格数据结构 乐优商城是一个全 ...
- 乐优商城笔记六:商品详情页
使用模板引擎 Thymeleaf + nginx 完成商品详情页静态化 完成乐优商城商品详情页 搭建商品详情页微服务 创建子工程 GroupId:com.leyou.service ArtifactI ...
- 乐优商城--服务(三) : 商品微服务(LyItemApplication)--前半部分
商品微服务--前半部分: 1. 微服务结构(ly-item) 1.0 顶级父工程(le-you) 1.1 ly-item 1.1.1 ly-item-interface 1.1.1.1 添加依赖 1. ...
- 乐优商城(三)商品分类管理
目录 一.数据 二.页面实现 2.1 页面分析 2.2 功能实现 2.2.1 url异步请求 2.2.2 后台接口实现 2.3 解决跨域请求 2.3.1 什么是跨域 2.3.2 解决跨域问题的方案 2 ...
- 乐优商城之规格参数商品查询(十)
文章目录 (一)规格参数表结构 (二)数据库表单分析 (三)规格参数组页面分析 (四)规格参数组查询的代码实现 (五)规格参数页面分析 (六)规格参数查询的代码实现 (七)表关系 (八)标结构场景解析 ...
- 乐优商城(填坑)——后台登录
后台管理模块增加登录验证,与门户网站一样都是采用无状态登录. 一.新增全局函数 在main.js中新增用户验证: 二.修改路由 先显示登录页面 效果: 三.解决cookie写入问题 在http.js中 ...
- 【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. ...
- 乐优商城 Day 09(thymeleaf,Rabbitmq,商品详情页,非教程)
乐优商城学习Day09: 注意:此次代码都是在第八天的基础上 第八天的链接如下: https://blog.csdn.net/zcylxzyh/article/details/100859210 此次 ...
最新文章
- spring aop原理_Spring知识点总结!已整理成142页离线文档(源码笔记+思维导图)...
- ZeroMQ接口函数之 :zmq_msg_init - 初始化一个空的ZMQ消息结构
- Vmware中安装RHEL5
- python全排列问题_Python基于回溯法子集树模板解决全排列问题示例
- APP签名MD5获取
- IP基础及ping命令
- Laravel项目问题集锦
- 账户余额“蒸发”暴露网银安全哪些漏洞?
- apache2: unrecognized service
- MyEclipse插件不能安装原因
- Centos7.6环境使用kubeadm部署kubernetes1.18.4
- 前端工程师月薪上万的秘密
- 华为手机非华为电脑NFC一碰传使用
- 【HNOI 2018】寻宝游戏
- 三星android5 root包,三星N9200刷国行系统(含五件套root权限recovery SuperSU)
- 罗德里格旋转公式推导
- Jtapi开发之转接二 传递uui
- 【KVM虚拟化实践与编程】云平台管理系统
- Pinia的简单使用
- C语言用函数指针变量调用函数
热门文章
- 我们正进入另一个黑暗和无知的时代----《三联生活周刊》 (转载)
- 传便利蜂获腾讯与高瓴大笔投资 物美接盘部分邻家业务
- 大学生日常之初学linux
- 无刷直流电机-通过三相电压波形大概计算电机目前转速
- AES - JAVA
- 利用itext操作pdf从数据库导出大量数据--功能汇总(一)
- Splashtop,您远程办公的不二之选
- 梦幻诛仙11职业linux架设手游,一款【梦幻诛仙11职业】手游端私服架设+JAVA后台+架设视频教程...
- 监考老师与作弊学生(影视版)(摘自sohu)
- Unity声音-音源组件AudioSource