商品模型新增

接口文档

请求地址

POST /types

需进行token认证

示例: http://adminapi.tbyue.com/types

请求参数

名称 类型 必填 备注
type_name string 模型名
spec int 规格数组
attr int 属性数组

参数示例:

type_name: 手机
spec[0][name]: 颜色
spec[0][sort]: 50
spec[0][value][]: 白色
spec[0][value][]: 黑色
spec[1][name]: 内存
spec[1][sort]: 50
spec[1][value][]: 64G
spec[1][value][]: 128G
attr[0][name]: 毛重
attr[0][sort]: 50
attr[0][value][]:
attr[1][name]: 产地
attr[1][sort]: 50
attr[1][value][]: 进口
attr[1][value][]: 国产

返回数据

名称 备注
id 模型id
type_name 模型名

返回示例

{"id": 16,"type_name": "手机"
}

实现思路

1.观察MVC项目中商品后台添加商品模型的表单,类推出了一个数组:

$data = ['type_name' => '西裤','attr' => [['name' => '毛重','sort' => 100,'value' => ['500g', '', '2000g', '5000g', '']],['name' => '产地','sort' => 100,'value' => ['国产', '港货', '美版']]],'spec' => [['name' => "颜色",'sort' => 100,'value' => ['黑色', '灰色', '蓝色', '红色', '白色', '', '']], ['name' => "尺码",'sort' => 100,'value' => ['S', 'L', 'M', 'XL', 'XXL', "XXXL"]],['name' => "面料",'sort' => '100','value' => ['棉麻','涤纶','纯棉','羊毛']]],
];

2.针对上面的数组,可能会有空值现象,要进行适当过滤

3.首先要将商品类型信息入库,因为后续跟商品类型id有关联

4.将商品属性信息入库,此时涉及到数组的组装,以及属性值的转换

5.将商品类型对应的规格信息入库,此时也涉及到数组的组装,跟商品类型id有关

6.将商品类型对应的规格的规格值入库,此时还涉及到数组转换,关联的有:商品类型id和商品类型对应的规格id

7.整个逻辑要保证一致性和完整性,必须借助事务实现

8.由于逻辑较为复杂,特将控制器所应执行的逻辑分别拆分至Businesses和Common中做二次封装,实现代码的高度解耦

在商品的类型模型中定义添加方法

/*** 商品类型入库* @param $data* @return Type|Model*/
public static function addType($data){return self::create($data,['type_name']);
}

在控制器层调用逻辑层进行添加

// 调用逻辑层将模型信息入库并得到模型的主键id
$type = TypesBusiness::addType($data);

逻辑层执行商品模型添加

/*** 添加模型信息入库* @param $data*/
public static function addType($data)
{try {// 先将商品类型名称入库,此时能获得到主键id$type = Type::addType($data);} catch (DbException $exception) {throw new Exception("商品类型入库失败");}self::$typeId = $type->id;// 返回新增的商品模型return ['type_id'=>$type->id,'type_name'=>$type->type_name];
}

思考:此处为何使用self将id保存起来呢?

在Common中封装数组处理的函数(针对商品属性和商品规格的非空处理)

// 四维数组空值处理的公共函数
if(!function_exists("arrayFilter")){function arrayFilter($data,$filed){// 过滤数组中的空元素foreach ($data[$filed] as $key => $val) {// 判断规格名称|属性名称是否填写if (trim($val['name']) == "") {// 直接将整个数组销毁unset($data[$filed][$key]);}// 循环处理规格值foreach ($val['value'] as $k => $v) {// 判断规格值是否填写if (trim($v) == "") {unset($data[$filed][$key]['value'][$k]);}}// 判断整个规格值是否一个都没有if (count($val['value']) == 0) {// 直接将整个数组销毁unset($data[$filed][$key]);}}return $data;}
}

思考:为何将数组处理的方法放置在common中呢?

在控制器层调用公共函数处理将规格名称数组过滤空值

$data = arrayFilter($data, "spec");

调用逻辑层将规格信息入库保存

TypesBusiness::addSpec($data);

规格信息入库前处理逻辑

/**
* 规格信息入库保存的逻辑
* @param $data
* @return \think\Collection
* @throws \Exception\
*/
public static function addSpec($data)
{// 组装spec表所需数据$spec = [];foreach ($data['spec'] as $val) {$spec[] = ['type_id' => self::$typeId,'spec_name' => $val['name'],'sort' => $val['sort']];}try {// 将商品类型对应的规格入库保存self::$specData = (new Spec())->addSpec($spec);} catch (DbException $exception) {throw new Exception("商品规格入库失败");}
}

规格模型层

/*** 商品规格名称入库* @param $data* @return \think\Collection* @throws \Exception*/
public function addSpec($data){return $this->saveAll($data);
}

调用逻辑层将规格值信息入库保存

TypesBusiness::addSpecValue($data);

规格值信息入库前处理逻辑

/*** 规格值信息入库保存的逻辑* @param $data* @param $specData* @throws \Exception*/
public static function addSpecValue($data)
{// 取出specValue的值foreach ($data['spec'] as $key => $val) {foreach ($val['value'] as $k => $v) {$specValue[] = ['spec_value' => $v,'type_id' => self::$typeId,'spec_id' => self::$specData[$key]['id']];}}try {// 将规格值入库保存(new SpecValue())->addSpecValue($specValue);} catch (DbException $exception) {throw new Exception("商品规格值入库失败");}
}

规格值模型

/*** 规格值批量入库* @param $data* @return \think\Collection* @throws \Exception*/
public function addSpecValue($data){return $this->saveAll($data);
}

调用公共函数处理将属性名称数组过滤空值

$data = arrayFilter($data, "attr");

调用逻辑层将属性信息入库保存

TypesBusiness::addAttr($data);

属性信息入库前处理逻辑

/*** 属性信息入库保存的逻辑* @param $data* @return \think\Collection* @throws \Exception*/
public static function addAttr($data)
{// 组装商品属性的数组$attr = [];foreach ($data['attr'] as $key => $val) {$attr[] = ['attr_name' => $val['name'],'type_id' => self::$typeId,'attr_values' => implode(",", $val['value'])];}try {// 将商品属性入库保存(new Attribute())->addAttr($attr);} catch (DbException $exception) {throw new Exception("商品属性入库失败");}
}

属性模型

/*** 商品属性批量添加* @param $data* @return \think\Collection* @throws \Exception*/
public function addAttr($data){return $this->saveAll($data);
}

上面的操作都要基于:异常处理和事务处理,逻辑缜密

整体控制器层代码

/**
* 商品模型新增
* @param Request $request
* @return Json
*/
public function save(Request $request)
{// 假设接收的表单数据$data = ['type_name' => '西裤','attr' => [['name' => '毛重','sort' => 100,'value' => ['500g', '', '2000g', '5000g', '']],['name' => '产地','sort' => 100,'value' => ['国产', '港货', '美版']]],'spec' => [['name' => "颜色",'sort' => 100,'value' => ['黑色', '灰色', '蓝色', '红色', '白色', '', '']], ['name' => "尺码",'sort' => 100,'value' => ['S', 'L', 'M', 'XL', 'XXL', "XXXL"]],['name' => "面料",'sort' => '100','value' => ['棉麻','涤纶','纯棉','羊毛']]],];// 校验数据try {$this->validate($data, ['type_name|商品类型' => "require",'attr|商品属性' => "array",'spec|商品规格' => 'array']);} catch (ValidateException $exception) {return fail($exception->getMessage());}// 启动事务Db::startTrans();try {// 调用逻辑层将模型信息入库并得到模型的主键id$type = TypesBusiness::addType($data);// 调用公共函数处理将规格名称数组过滤空值$data = arrayFilter($data, "spec");// 调用逻辑层将规格信息入库保存TypesBusiness::addSpec($data);// 调用逻辑层将规格值信息入库保存TypesBusiness::addSpecValue($data);// 调用公共函数处理将规格名称数组过滤空值$data = arrayFilter($data, "attr");// 调用逻辑层将属性信息入库保存TypesBusiness::addAttr($data);// 提交事务Db::commit();// 返回数据return success($type);} catch (\Exception $e) {// 回滚事务Db::rollback();// 给出错误提示return fail($e->getMessage());}
}

postman测试时该功能表单参考:

<!--参考html表单-->
<form><label>模型名:</label><input type="text" name="type_name" value=""><label>规格:</label><input type="text" name="spec[0][name]" value=""><input type="text" name="spec[0][sort]" value=""><input type="text" name="spec[0][vlaue][]" value=""><input type="text" name="spec[0][value][]" value=""><input type="text" name="spec[0][value][]" value=""><input type="text" name="spec[1][name]" value=""><input type="text" name="spec[1][sort]" value=""><input type="text" name="spec[1][value][]" value=""><input type="text" name="spec[1][value][]" value=""><input type="text" name="spec[1][value][]" value=""><label>属性:</label><input type="text" name="attr[0][name]" value=""><input type="text" name="attr[0][sort]" value=""><input type="text" name="attr[0][value][]" value=""><input type="text" name="attr[1][name]" value=""><input type="text" name="attr[1][sort]" value=""><input type="text" name="attr[1][vlaue][]" value=""><input type="text" name="attr[1][value][]" value="">
</form>

参考数组格式:

//参数数组参考:
$params = ['type_name' => '手机','spec' => [['name' => '颜色', 'sort' => 50, 'value'=>['黑色', '白色', '金色']],['name' => '内存', 'sort' => 50, 'value'=>['64G', '128G', '256G']],],'attr' => [['name' => '毛重', 'sort'=>50, 'value' => []],['name' => '产地', 'sort'=>50, 'value' => ['进口', '国产']],]
]

商城后台系统商品模型(类型)新增接口开发相关推荐

  1. 开源一个golang小程序商城后台系统(moshopserver)

    开源一个golang小程序商城后台系统(moshopserver) 开源一个golang小程序商城后台(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一 ...

  2. 电子商城后台系统(五):商品模块规划

    万事开头难,要编写一套系统,首先是规划.一个系统做得好不好,很大程度上取决于开始的规划好不好.设计好不好.一个电子商城的后台管理系统,首先要做的应该是帐号管理模块和权限模块.但是,我原先开始写的时候, ...

  3. 电子商城后台系统(二):系统架构设计及系统介绍

    在写一个程序之前,需要在大脑中对整个系统有一个初步的规划,对于系统的功能模块,通常来说需要划分成三大块:框架部分.核心业务部分.扩展业务部分. 框架部分,通常是用来放通用的工具类方法,还有通用的处理数 ...

  4. 电子商城后台系统(一):使用eclipse构建web项目

    资源地址:https://pan.baidu.com/s/1MX4t_kT3iNHmtIsO67YqXQ,提取码:nn1k. 使用eclipse构建web项目,需要有eclipse和Tomcat,两者 ...

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

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

  6. 【计算机毕业设计】512网上商城购物系统

    一.系统截图(需要演示视频可以私聊) 摘  要 随着科学技术的飞速发展,社会的方方面面.各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,网上商城购物系统当然也不能排除在外.网上商城 ...

  7. 【计算机毕业设计】23.网上商城购物系统+vue

    一.系统截图(需要演示视频可以私聊) 摘  要 随着科学技术的飞速发展,社会的方方面面.各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,网上商城购物系统当然也不能排除在外.网上商城 ...

  8. 使用Axure设计中,大型的后台系统原型总结

    使用Axure设计中,大型的后台系统原型总结 2018年4月16日luodonggan 在产品原型设计中,经常会涉及到后台系统原型的设计,如何设计出更规范标准的后台系统原型,是很多产品同行们都会遇到的 ...

  9. Java实现校园商城后台管理系统

    1.校园商城后台管理系统背景 本系统模拟商城系统开发的校园商城后台管理系统. 2.校园商城后台管理系统技术架构 主要技术 Spring.SpringMVC.Mybatis JSP.JSTL.jQuer ...

最新文章

  1. 机房布线的最高境界……
  2. A Context-aware Attention Network for Interactive Question Answering--阅读笔记
  3. 为什么黑客用python-为什么如此多的黑客都用python?
  4. MPU6050参考代码
  5. NO_CHANGE_ALLOWED error code
  6. please reinstall the mysql distribution_php安装扩展mysqli的实现步骤及报错解决办法
  7. 【写作技巧】如何给自己的毕业论文开个好头?
  8. Centos安装Clion
  9. php 去高去低去平均值,招标评分必备,去掉最高最低分求平均值
  10. ARM GIC(六) GIC V3 电源/功耗管理 分析笔记。
  11. CentOS官网 安装包下载
  12. php radio是什么意思,radio是什么意思_radio在线翻译_英语_读音_用法_例句_海词词典...
  13. 鼠标滑轮只能控制声音?
  14. 实用!四个方法训练自己的设计思维
  15. c++ socket发送string 、char*字符串,客户端接收到乱码
  16. win7怎么显示后缀名
  17. CobaltStrike上线Linux主机(CrossC2)
  18. Java多线程并发编程知识体系(附大图-持续更新)
  19. 字符串,字符指针,字符串指针,字符数组
  20. 锂电池充放电管理芯片,整套IC组合,长篇文章

热门文章

  1. java1000到十10以内的加减法,【小学】 生成10以内的加减法
  2. JavaScript学习笔记|数据类型——Object类型、for in循环
  3. python 数字+.的含义
  4. Cortex-M系列:错误异常
  5. java五子棋聊天功能_Java基于享元模式实现五子棋游戏功能实例详解
  6. 【Linux】宝塔面板 SSL 证书安装部署
  7. [杂言] 我,计算机,OI,和我的前 18 年,还有退役
  8. 金碟软件资产负债表中JC,JD,DY,DC表示的是什么
  9. 算法2.4.24:查找链表二叉树节点
  10. 单片机c语言数码管显示循环0到9程序,七段数码管0~9循环显示程序