php laravel商品sku功能
商品sku设计
sku是什么?
是一种表示库存进出计量的单位,例如,盒,件。如今的sku被广泛引申为某款产品的统一编号的简称,每一个产品都有它独一无二的sku号。sku号包括其商品的品牌、型号、等级、配置、单位、用途、产地、价格、生产日期、保质期等等一系列属性,每一件商品的这些属性与其他任何商品都不一样,这样的商品称为一个单品,其sku号是独一无二的。
从货品角度来讲,sku是指单独的一个商品,商品所有的属性都已经被确定。这可以这么说,只要商品的属性不一样,那么两者的sku就不一样。商品是属性包括:品牌、型号、等级、配置、成分、花色、用途等等因素。只要商品的某一个属性不同,就可以定义为不同的sku。
从业务管理的角度来讲,sku也包含商品包装的信息。计量单位,包装单位不一样,其适应的管理不一样,我们也可以分成不同的sku。打个比方,袜子,我们都是以“双”为单位的,也就是一双袜子是一个sku,袜子参数都一样,只是在打包过程中,一包里面12双袜子,那么12双袜子与1双袜子又是不同的sku。
多规格sku设计,一直挺让我头疼的,当然,也可能是一直没有做的原因,这次做的时候,也想了好多,我的做法实现逻辑不是很好,只是实现了功能,小伙伴们可以做一个参考,有更好的办法也可以分享一下。
下面开始说我的实现步骤,先贴数据表
DROP TABLE IF EXISTS `dishes`;
CREATE TABLE `dishes` (`id` int(11) NOT NULL AUTO_INCREMENT,`shop_id` int(11) NOT NULL COMMENT '店铺id',`class_id` varchar(255) NOT NULL COMMENT '顶级分类id',`sub_classid` varchar(30) NOT NULL COMMENT '商品分类id',`keywork` varchar(255) NOT NULL COMMENT '关键字,以|隔开',`shop_menu_id` varchar(255) NULL COMMENT '菜谱id',`name` varchar(200) NOT NULL COMMENT '商品名',`main_picture` bigint(15) NOT NULL COMMENT '商品主图',`picture` varchar(2000) NOT NULL COMMENT '商品图片列表',`explain` varchar(255) NULL COMMENT '说明',`isspec` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否多规格,1/0',`original_price` int(10) NOT NULL COMMENT '原价价格,100 = 1元',`price` int(10) NOT NULL COMMENT '现价,100 = 1元',`status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '上下架,1/0',`cost_price` int(10) NOT NULL DEFAULT 0 COMMENT '成本价,计算利润',`sort` int(10) NOT NULL COMMENT '排序(仅在后台生效)',`sales` int(10) NOT NULL DEFAULT 0 COMMENT '销量',`grade` decimal(2, 1) NOT NULL DEFAULT 5.0 COMMENT '评分',`weight` decimal(10.2) NOT NULL DEFAULT 1000.00 COMMENT '权重,新菜品权重1000,一星期后下降至500,为起始值,5星好评+1,4星不增不减,3星-0.5,1星-2,2星-1,自动评价不增不减',`created_at` int(10) NOT NULL COMMENT '创建时间',`updated_at` int(10) NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),INDEX `shop_id`(`shop_id`) USING BTREE COMMENT '店铺id',INDEX `shop_menu_id`(`shop_menu_id`) USING BTREE COMMENT '菜谱id'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT='菜品表';DROP TABLE IF EXISTS `dishes_attr`;
CREATE TABLE `dishes_attr` (`id` int(11) NOT NULL AUTO_INCREMENT,`shop_id` int(10) NOT NULL COMMENT '店铺id',`dishes_id` int(10) NOT NULL COMMENT '所属商品id',`sort` int(10) NULL COMMENT '排序',`name` varchar(200) NOT NULL COMMENT '属性名',`sku` varchar(100) NOT NULL COMMENT 'sku值',PRIMARY KEY (`id`),INDEX `shop_id`(`shop_id`) USING BTREE COMMENT '店铺id',INDEX `dishes_id`(`dishes_id`) USING BTREE COMMENT '商品id'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT='菜品属性表';DROP TABLE IF EXISTS `dishes_spec`;
CREATE TABLE `dishes_spec` (`id` int(10) NOT NULL AUTO_INCREMENT,`dishes_id` int(10) NOT NULL COMMENT '商品id',`attr_path` varchar(100) NOT NULL COMMENT '属性序列化数据',`attr_name` varchar(300) NOT NULL COMMENT '属性名称,以-分开',`picture` bigint(15) NULL COMMENT '规格图片',`original_price` int(10) NOT NULL DEFAULT 0 COMMENT '原价',`price` int(10) NOT NULL COMMENT '现价',`cost_price` int(10) NOT NULL COMMENT '成本价',PRIMARY KEY (`id`),INDEX `dishes_id`(`dishes_id`) USING BTREE COMMENT '商品id',INDEX `attr_path`(`attr_path`) USING BTREE COMMENT '属性路径'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT='商品规格表';
添加商品时提交的数据格式
前端代码没有实现,我在项目里只做后端,所以这边只贴后端代码,这边只说前端需要提交的数据格式
{"class_id":1, // 分类id"sub_classid":2, // 下级分类id"shop_menu_id":4, // 菜谱id"name":"商品名", // 商品名"main_picture":"https://www.baidu.com", // 商品主图"picture":"https://www.baidu.com,https://www.baidu.com,https://www.baidu.com", // 商品其他图片 "explain":"本商品是一份,不是 两份,这是个说明", // 商品详情,不建议太长"isspec":1, // 是否多规格:1/0"original_price":1000, // 原价,注意,如果是10.00元,则为1000"price":500, // 现价,注意,如果是10.00元,则为1000"status":1, // 是否上架:1/0"cost_price":1500, // 成本价,用于统计例如"sort":15, // 排序,仅在后台和商品详情使用"attr":[ {"name":"颜色", // 属性1"sku":"红色" // 属性值1.1},{"name":"颜色", // 属性1"sku":"蓝色" // 属性值1.2},{"name":"尺码","sku":"l"},{"name":"尺码","sku":"xl"},{"name":"款式","sku":2018},{"name":"款式","sku":2019}],"spec":[{"attr_name":"红色+l+2018", // 属性值拼接数据,注意顺序,不可以错误,按照表单顺序拼接"picture":"http://www.baidu.com", // 图片,可不传"original_price":"1500", // 原价"price":"1000", // 现价"cost_price":"500" // 成本价},{"attr_name":"红色+l+2019","picture":"http://www.baidu.com","original_price":"1500","price":"1000","cost_price":"500"},{"attr_name":"红色+xl+2018","picture":"http://www.baidu.com","original_price":"1500","price":"1000","cost_price":"500"},{"attr_name":"红色+xl+2019","picture":"http://www.baidu.com","original_price":"1500","price":"1000","cost_price":"500"},{"attr_name":"蓝色+l+2018","picture":"http://www.baidu.com","original_price":"1500","price":"1000","cost_price":"500"},{"attr_name":"蓝色+l+2019","picture":"http://www.baidu.com","original_price":"1500","price":"1000","cost_price":"500"},{"attr_name":"蓝色+xl+2018","picture":"http://www.baidu.com","original_price":"1500","price":"1000","cost_price":"500"},{"attr_name":"蓝色+xl+2019","picture":"http://www.baidu.com","original_price":"1500","price":"1000","cost_price":"500"}]
}
商品控制器
/*** 创建商品* @param Request $request [description]* @param Dishes $dishes [description]* @return [type] [description]*/public function createDishes( Request $request , Dishes $dishes ) {// 获取参数$param = $request->input();// 启用事务DB::beginTransaction();$data = $dishes->store( $request );if ( !$data ) {return $this->fail( 30017 );}// 是否是多规格if ( !$param['isspec'] ) {// 提交非多规格商品DB::commit();return $this->success( $data );} else {// 组织添加规格属性$attrData = $this->attr( $param , $data );if ( $attrData != true ) {DB::rollBack();return $this->fail( $attrData );} else {DB::commit();return $this->success( '成功' );}}}/*** 组织商品属性* @param [array] $param [添加商品的表单数据]* @param [int] $id [商品id]* @return [array] [属性添加成功后从mysql里的取值]*/public function attr( $param , $id ) {if ( !is_array( $param ) || !$param ) {return 30018;}$attrData = [];$i = 1;foreach ($param['attr'] as $key => $value) {$attrData[] = ['shop_id' => $this->shop_id,'dishes_id' => $id,'sort' => $i,'name' => $value['name'],'sku' => $value['sku']];$i++;}// 启用事务DB::beginTransaction();// 属性组$attr = new Dishes_Attr();$data = $attr->store( $attrData );if ( !$data ) {return 30020;} else {// 查询刚刚添加的属性$result = $attr->selAttrs( $id );if ( !$result ) {return 30020;}$paramData = [// 数据库中取出的属性参数'attr' => $result,// 表单数据中规格'spec' => $param['spec'],// 商品id'dishes_id' => $id];return $this->spec( $paramData );}}/*** 添加规格* @param [type] $data [description]* @return [type] [description]*/public function spec( $data ) {// 处理属性从数据库中取出的数据$attr = $this->attrGroup( $data['attr'] );// 拼接规格参数$result = $this->CartesianProduct( $attr );// 预定义规格数组$specData = [];// 处理规格数组foreach ( $result as $value ) {foreach ($data['spec'] as $val) {if ( $val['attr_name'] == $value['attr_name'] ) {// 组织规格数据$specData[] = ['dishes_id' => $data['dishes_id'],'attr_name' => $value['attr_name'],'attr_path' => $value['attr_path'],'picture' => $val['picture'],'original_price' => intval ( $val['original_price'] ? $val['original_price'] : 0 ),'price' => intval( $val['price'] ),'cost_price' => intval ( $val['cost_price'] ? $val['cost_price'] : 0 )];// 跳出循环break;}}}if ( count( $specData ) != count( $result ) ) {return 30019;}// 添加规格$spec = new Dishes_Spec();$insertSpec = $spec->store( $specData );if ( $insertSpec ) {return true;} else {return 30020;}}/*** 处理属性从数据库中取出的数据* @param [type] $data [description]* @return [type] [description]*/public function attrGroup( $data ) {$attr = [];$attr_spec = [];// 处理数组$i = 0;foreach ($data as $val){if ( isset($attr[$val['name']]) ) {continue;}// 定义数组if ( !isset($attr[$val['name']]) ) {$attr[$val['name']] = 1;}foreach( $data as $value ) {if ( $attr[$val['name']] == 1 ) {$i++;}$attr[$val['name']] = 2;if ( $val['name'] == $value['name'] ) {$attr_spec[$i][] = ['id' => $value['id'],'shop_id' => $value['shop_id'],'dishes_id' => $value['dishes_id'],'sort' => $value['sort'],'sku' => $value['sku']];} else {continue;}}}return array_values( $attr_spec );}/*** 卡迪尔算法,拼接规格参数* @param [type] $goods [description]*/public function CartesianProduct($goods){$returnData = [];for ($i=0; $i < count($goods)-1 ; $i++) { // 初始化if($i == 0){foreach( $goods[$i] as $value1 ) {$returnData[] = ['attr_name' => $value1['sku'],'attr_path' => $value1['id']];}}$tempArray = []; // 临时数组foreach( $returnData as $value ) {foreach( $goods[$i+1] as $val ) {$tempArray[] = ['attr_name' => $value['attr_name'].'+'.$val['sku'],'attr_path' => $value['attr_path'].','.$val['id']];}}//重新赋值$returnData = $tempArray;}return $returnData;}
php laravel商品sku功能相关推荐
- B2C电子商务系统研发——商品SKU分析和设计(一)
一.SKU及相关概念定义 在设计商品SKU之前,首先让我们熟悉一下SKU和相关的一些概念. # 什么是SKU: SKU=Stock Keeping Unit(库存量单位) 同一型号的商品,或者说是同一 ...
- 京东的商品搜索功能是如何实现的_「商品架构day8」京东几百亿的商品怎么搜索...
本文来自京东王春明老师的分享,主要介绍京东商品搜索的整体架构. 京东商品搜索简介 京东商品搜索引擎是搜索推荐部自主研发的商品搜索引擎,主要功能是为海量京东用户提供精准.快速的购物体验.目前入口主要有P ...
- 淘宝店铺商品管理解决方案-商品SKU信息获取和修改oAuth2.0接口接入解决方案
商品管理对接方案: 从店铺宝贝管理场景出发,提供涵盖了宝贝主图.标题.属性信息.详情页海报等各个模块高效处理/优化的功能.并通过提供批量修改.自动补库存.定时上架.库存预警等功能帮助商家提高店铺经营效 ...
- 商城电商day05商品sku保存
day05商品sku保存 二.保存skuInfo功能 2.1图片加载功能 功能分析:图片列表是根据spuId得来,涉及到的数据库表spu_image 分析用到那几张表 sku_attr_value(平 ...
- 实现京东商品详情页面的商品切换功能
这里写自定义目录标题 实现京东商品详情页面的商品切换功能 功能介绍:根据选择商品参数不同,选择后跳转到对应的商品详情页面 数据库表 查询语句 查询结果 前台页面实现选择参数.切换商品 实现京东商品详情 ...
- B2C电子商务系统研发——商品SKU分析和设计
一.SKU及相关概念定义 在设计商品SKU之前,首先让我们熟悉一下SKU和相关的一些概念. # 什么是SKU: SKU=Stock Keeping Unit(库存量单位) 同一型号的商品,或者说是同一 ...
- 如何通过API接口从淘宝(或天猫店)复制宝贝到拼多多(商品详情,商品销量,商品列表,商品主图,商品sku)接口代码对接教程
如何通过API接口从淘宝(或天猫店)复制宝贝到拼多多(商品详情,商品销量,商品列表,商品主图,商品sku)接口代码对接教程如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用k ...
- 商品SKU功能设计与优化
原来的商品SKU设计存在着两个问题,一个是SKU表设计上面比较固化,无法扩展.另一个是当修改了商品信息之后,商品SKU的ID会发生变化,由于购物车表和订单商品表都关联了商品SKU的ID,这样就会导致匹 ...
- laravel-admin 结合搭配商品sku
本文章基于jade 的基础上,完善部分功能.多谢jade提供sku方案 多个规格名,只显示2个 添加规则值,保留已有的信息 保存数据库后,json数据会自动排序 (2020-09-21 新增) For ...
最新文章
- mac mini 安装mysql数据库
- DCMTK:将DICOM文件的内容转换为XML格式
- Java this, super深入理解
- 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)
- jquery 之for 循环
- 数据结构实验4-栈与字符串
- 创投“黑帮”,必须的
- wikioi 1098 均分纸牌
- 2012—2018年软考中级软件设计师历年真题
- 单片机的C语言应用程序设计实训教程,单片机的c语言程序设计实训
- NAT配置正确,但不能ping通外网的原因
- 谈谈服务器虚拟化解决方案
- C语言实现斐波那契数列
- VTK:线宽用法实战
- 一篇文章了解光学器件的各种参数含义
- 社交网络电影深度解析论文,社交网络 电影解析
- C++大写字母转小写字母
- 读不完《程序员修炼之道》,至少可以读完这70条
- 一次完整的HTPPS请求
- 妻子写给丈夫情人的催泪信
热门文章
- Android-打开系统相机并拍照两种显示方式。
- IDEA Material Theme UI 暗黑系主题的安装
- 指纹识别真安全吗?简单技术处理后橘子皮都能解锁
- 蓝牙 韦东山_韦东山生活实例演绎法讲解蓝牙
- mysql 事件报错1314_mysql 1314
- linux驱动K10运算卡,NVIDIA TESLA K10 GPU 运算卡 K20 C2075 C2050
- android手机功能创新,Android手机QQ浏览器1.1发布多项创新功能
- 360 || 2021校园招聘的一道笔试题思路分享
- 利用word2vec、textCNN、jieba对事故文本多分类及致因修复(三维向量)
- 【计算机网络】吞吐量与瓶颈链路