完善控制账户状态的权限控制
当用户点击下面列表的可用或禁用的功能的时候,ajax返回一个无权限操作。
这是因为用户没有此权限,一般只有超级管理员才会有此权限。
所以,我们也可以在后台添加此权限给用户进行分配:
然后给对应的角色分配即可:
同时当某个角色没有此权限的时候,需要在Common控制器中给提示无权限访问:
在ajax中给出提示无权限:
一、商品有关的基本概念
这里主要涉及到以下几个概念:
- 商品类型:不同的网站的卖的商品是不一样的,比如化妆品网站专门卖化妆品、手机网站专门卖手机、汽车网站专门卖汽车。
- 商品属性:不同的商品类型对应的商品属性也是不一样的。
比如卖汽车网站,商品(汽车)属性有轴距、变速箱、驱动方式、进气方式、排量等
比如卖电脑网站,商品(电脑)属性有尺寸、内存、cpu、操作系统、系统核数等
比如卖手机网站,商品(手机)属性有尺寸、内存、系统、颜色、网络类型、电池容量等
商品类型决定了商品属性,商品属性依据商品类型走的。
- 商品分类
一个电商网站卖的商品不一样,其商品分类也是不一样的。
比如:卖汽车分类有:国产(吉利、 广汽)、日产(本田、丰田)、德国(奔驰、宝马)、韩国(起亚、现代)。
比如:卖手机分类有: 小米、华为、三星、苹果、oppo、vivo、魅族。
比如:卖化妆品有: 补水、祛痘、气垫、BB霜、口红、….
- 商品(产品+属性=商品)
- 商品(产品+属性=商品)
如:iphoneX+64G(7888) , iphoneX+256G(9888)
1、商品类型
不同的商品类型会有不同的属性
可以在ecshop后台中新建一个商品类型,如下:建立一个手机商品类型
2、商品属性
给商品类型添加商品属性: 商品类型–>属性列表:
给手机类型商品添加内存的属性:
添加商品属性列表如下:
属性解释:
单选属性: 指买商品的时候,可以选择一个属性,不同的属性价格不一样
唯一属性:只能看不能选。
复选属性:可以选择多个,一般买商品的附加配件都是复选的。
3、属性类型和属性录入方式的组合
当在后台添加一个商品的时候要选择一个商品类型,选择了一个商品类型就决定了这个商品的有哪些属性,如下是添加商品设置其商品属性:
给商品添加属性:
特点如下:
唯一属性(只能看,不能选):前面没有【+】,不可以设置价格
单选属性(可选择):前面有【+】,点击+即可复制多个,不同的单选属性可设置不同的价格
属性值手工输入:对应的是个input框,需要自己输入。
属性值是列表选择: 对应的是个select下拉框,需选中一个属性值。
4、商品分类
一般一个网站决定卖什么类型商品就决定了其商品分类。
如卖汽车网站:分类有国产、日系、德系、韩系等
如卖化妆品网站:分类洗面奶、乳液、面膜、保湿、祛痘、眼霜等
二、完成商品类型的curd
商品类型介绍
商品类型:不同的网站的卖的商品类型是不一样的,比如化妆品网站专卖化妆品、手机网站专卖手机、二手汽车网站专买二手汽车。
网站决定卖什么商品类型,也就决定了商品的商品属性
商品类型的增加
商品类型表如下:
1:在admin-TypeController-add中,完成添加商品类型完成
- 在add模板中设置表单name名称
3、同时建立一个Type的验证器和Type模型
验证器:
模型:
商品类型的列表
- 在admin-Type-index方法中取出所有的商品类型分配到模板中
- index.html模板中遍历数据
商品类型的编辑
- 修改index.html的编辑的链接地址
2、在admin-type-upd方法中完取出当前商品类型的数据回显到模板中,并完成编辑入库的实现
3、模板upd.html回显内容
商品类型的删除
- 修改index.html的删除的链接地址
- 在admin-type-del方法中完成删除
三、完成商品属性的curd
1、商品属性的认识
网站决定卖什么商品类型,也就决定了商品的商品属性
可以参考ecshop添加属性的方式:
属性这里重点两种属性:唯一属性和单选属性
唯一属性:只能看,不能选。
单选属性:我们购买商品的时候,可以选择的,后面添加商品的时候,不同的单选属性价格也是不一样的,如iphone6银色和iphone黑色价格是不一样的。
②属性的值的录入方式
手工输入:不可以输入属性值,且可选值列表是禁用状态,只能在添加商品的时候输入属性值。
列表选择:在可选择列表输入一些我们指定的属性值,添加商品的时候,从中选中一个属性值即可。
表结构:
完成商品属性的添加
- 在admin-attribute-add方法中完成添加属性的完成
Attribute验证器定义验证场景验证:
Attribue模型如下:
- 在add.html模板中设置表单name属性值
注意:当选择手工输入的时候,可选择列表是禁用disabled,若是列表选择,变为可用
代码如下:
完成属性的列表
- 在admin-attribue-index方法中取出所有的属性数据,分配到模板中
- 模板中遍历权限数据
联表方式:
不联表方式:
完成属性的编辑
1、修改index.html的编辑的链接地址
- 在admin-attribute-upd方法中取出数据回显到模板中,并完成编辑的入库实现
3、模板中显示数据
让单选框两种方式默认选中:
方式一:
方式二:通过Jq实现,推荐写法
ajax完成商品属性的删除
- 给删除链接地址,绑定class和attr_id自定义属性,并且阻止默认行为
- 给class=delAttr绑定单击事件,使用ajax进行删除
- 在admin-attribute-ajaxDel方法中完成删除的实现
四、完成商品分类的curd
1、分析分类表结构
表字段结构如下:
完成商品分类的添加
找当前分类的祖先分类:传递当前分类的pid ,谁的cat_id等于我的pid就找到我的祖先。
找当前分类的子孙分类:传递当前分类的cat_id ,谁的pid等于我的cat_id就找到我的子孙
- 在admin-category-add方法中完成添加分类的完成
验证器:
模型:
2、在add.html模板中设置表单name属性值
完成商品分类的列表
- 在admin-category-index方法中取出所有的分类数据,分配到模板中
同时为了不用联表,把分类的无限级分类的以cat_id作为下标
2、模板index.html中遍历分类数据
效果:
完成商品分类的编辑
- 修改index.html的编辑的链接地址
2、在admin-category-upd方法中完取出当前分类的数据回显到模板中,并完成编辑入库的实现
5、【作业】完成商品分类的删除
自行完成
CategoryController:
Html:
六、完成商品类型列表中属性的查看
七、完成商品的添加
商品的认识
商品=产品+商品属性,即同一个产品,但是商品属性不同,就不是同一个商品。
如:iphone6s黑色 和iphone6s银色
商品添加所需的数据表
当在后台添加一个商品的时候,商品相关数据需要入库到以下两个表:
商品表sh_goods和商品属性表sh_goods_attr
商品的基本信息数据存储在sh_goods表中,商品属性数据存储在sh_goods_attr中
商品表sh_goods表结构:
商品属性表sh_goods_attr表结构:
完成商品基本信息的入库
(1)展示添加商品模板
基本信息入库操作
4、添加商品的多图片上传
(1)思路分析
实现思路:可以参考ecshop开源商城:
①构建布局:
每个文件上传域名其实可以看做是一个li标签,其中包含a标签和input上传文件域
如下结构:
<li> <a href=’javascript:;’ >[+]</a><input type=’file’/> </li>
<li> <a href=’javascript:;’ >[-]</a><input type=’file’/> </li>
②怎么实现图片前的[+][-]加减功能?
思路:
- 给li中的a标签绑定单击事件,获取当前单击元素的内容
- 判断内容,含两种情况[+]、[-]
若是[+]: 则获取当前元素的父元素(即li),克隆一份,在把内部的a标签的[+]变成[-]。
若是[-]: 则获取当前元素的父元素(即li),并移除。
多图片上传加减特效
实现多图片的上传
(4)生成多图片的缩略图
生成缩略图的步骤:
- Image打开源图片 $image = \Think\Image::open(源图片);
- 进行缩放处理 $image -> thumb(宽度,高度,类型)
- 把缩放好的图片保存到服务器上 $image -> save(小图路径名);
八、完成商品的属性添加
1、分析商品动态属性的生成
添加一个商品,其商品属性可能有多个。
即商品表sh_goods的一条记录对应商品属性表sh_goods_attr的多条记录,属于一对多关系。
问题:怎么给商品设置商品属性?
这里可以参考ecshop的方案,当添加商品的,必须先选择一个商品类型,在通过ajax动态获取商品类型的属性,再给商品设置这些属性值。
如在ecshop后台添加商品的时候,选择手机类型,动态生成的属性框如下:
从上面添加商品属性可以看出,动态生成商品属性的时候,共有四种组合情况。
其实就是属性类型和属性值录入方式的互相组合:
①唯一属性+手工输入
②唯一属性+列表选择
③单选属性+手工输入
④单选属性+列表选择
其实可以把上面每个动态生成的属性信息看作是被包含在一个li标签中。
分析四种组合情况生成动态属性的特点如下:
元素从左到右分析:
- 单选属性属性名称前有个[+]或[-]号,可以进行加减,而唯一属性则没有
- 属性名称
- 属性值录入方式为手工输入,则对应属性值的输入方式的是一个输入框(<input type=’text’/>),而属性值录入方式为列表选择的时候则对应属性值的输入方式的是一个select下拉框。
- 单选属性可以输入价格,而唯一属性则没有
完成商品的动态属性生成
完成商品动态属性的入库
分析:
把单选属性值和单选属性价格通过属性attr_id归为同一组,方便后续获取对应属性的价格和值。
单选属性值: name=goodsAttrValue[attr_id][]
单选属性值价格: name=goodsAttrValue[attr_id][]
因为单选属性用户可以点击[+]号会生成多个,所以多个单选属性值和价格name的值后面都必须加上中括号[]。
由于唯一属性只能选择一个值,所以name后不需要加[]