一、RBAC功能实现
权限表的curd操作
(1)完成权限的添加
步骤1:在后台建立一个Auth控制器,并建立一个add方法,输出模板内容,并完成添加权限的实现
同时在Auth模型中取出权限的无限级分类数据:
步骤2:设置add.html模板内容
当选择顶级权限时,控制器名和方法名不可用,否则可用。因为顶级权限没有控制器名和方法名。
注意:表单input设置disabled和readonly的区别
相同点:都不可以编辑input中的数据
不同点:设置disabled时,php中通过$_POST接收不到input框name的属性值
设置readonly时,php中通过$_POST可以收到input的name的属性值
步骤3:定义Auth验证器,进行验证
模板效果:
完成权限的列表展示
步骤1:在后台的Auth控制器中建立一个index方法,取出所有的权限数据,分配到模板中。
注:需要指定getAuthsSon方法返回的结果下标值:
步骤:模板中遍历数据
效果:
完成权限的编辑
编辑一个角色注意的地方:
a、不能以当前分类作为父权限 b.不能以当前子孙作为父权限
步骤1:修改编辑的链接地址
步骤2:在Auth控制器建立一个upd的完成编辑功能
步骤3:模板回显数据
步骤4:需要考虑编辑注意的地方
a、不能以当前分类作为父权限 b.不能以当前子孙作为父权限
解决办法:通过js递归实现,把当前权限以及子孙权限给删除即可。
【作业】完成权限的删除
自行完成
未考虑子分类 直接删除全部
角色表的curd操作
分析:
- 用户表通过角色字段role_id,找到与其关联的角色表role_id。
- 角色表通过所拥有的所有权限字段auth_id_list,找到与其关联的权限表的auth_id。
添加角色及分配权限
步骤1:在后台建立一个Role控制器,并建立一个add方法,获取所有的权限
我们这里取出所有的权限需要一定技巧,两个:
技巧一:取出所有的权限:并且以auth_id为每个元素的下标。
技巧二:取出所有的权限,通过pid进行分组,把具有相同的pid划分为同一组
其中上面变量$auths和$children的打印结果如下:
其中pid=0,有两个元素即auth_id为46和49。其他以此类推。
步骤2:模板中遍历权限,这里需要参考课件的权限布局文件:
注意:如下一级中有个二级,二级中有三级、
结果如下:
步骤3:进行添加权限入库
同时给表角色表添加模型和验证器
模型:
验证器:
数据库存储的格式:
注:一般系统角色名为超级管理员都会拥有所有的权限,其权限字段auth_id_list可以手动设置为*。
(2)完成添加权限分配的特效操作
role/add.html模板文件:
特效代码:
效果:
(3)【重要】小结
- 记住,以后去公司做有关权限分配的时候,可以直接参考以下的模板布局
b、以后在模板中凡是需要取出含有(父子孙)层级关系的数据,可以使用下面这个技巧。
技巧一:取出所有的权限:并且以auth_id为每个元素的下标。
技巧二:取出所有的权限,通过pid进行分组,把具有相同的pid划分为同一组
此技巧的典型使用场景有:
- 如遍历权限可以用到,上面代码就是。
- 如京东商城遍历三级分类菜单
3、分类菜单的折叠
(4)角色的列表展示
把一个角色所拥有的权限都查出来,这里需要利用到两个mysql函数:
FIND_IN_SET和group_concat(字段)
- FIND_IN_SET(str,strlist) :
作用:查询出子串str,是否在由逗号分隔的目标字符串strlist中存在。
如:判断5是否在字符串1,2,3,4,5中存在:FIND_IN_SET(5,‘1,2,3,4,5’) ,存在则返回所在目标字符串strlist的所在位置,不存在则返回0。
执行函数mysql函数: select 函数名();
- group_concat(字段)
作用:主要根据某个字段进行分组,把相同字段的值连接在一起。
默认连接符号是逗号 ,如果用|连接则:
group_concat(字段名 SEPARATOR “|”)
例:如下是表tp_article表中的一些数据
根据cat_id字段进行分组,把具有相同cat_id的title字段值连接在一起。
查询出当前角色所拥有的全部权限拼接在一起:
完成角色编辑功能(给角色分配权限)
步骤1:修改role/index.html的链接地址
步骤2:在admin-RoleController-upd的方法中完成数据的回显到模板中
注意: 模块-控制器-方法
步骤3:复制添加角色的add.html模板即可,改名为html.进行回显数据和把角色已有的权限默认选中
已有权限默认选中:
效果:
(6)【作业】完成角色删除功能
自行完成
(7)添加用户分配权限
步骤1:修改admin-view-user-add.html模板内容,加一个显示角色的下拉框
实现不同用户登录展示不同后台菜单
思路
- 用户登录成功的时候,获取到role_id。
- 通过role_id获取角色表的auth_id_list字段
- 通过权限表auth_id 只要在auth_id_list字段存在即可,查出所拥有的权限
超级管理员auth_id_list字段的值为*,代表拥有后台操作的所有权限。
代码实现
步骤1:在用户登录成功的模型的checkUser方法中,通过角色id把当前角色所有的权限写入到session。
步骤2:定义user模型中定义writeAuthToSession方法把权限写入到session中
注:后台left.html模板文件中,只需要显示一级和二级的权限即可:
我们需要构造出一个特定数据结构的数据:
如下:通过每个顶级(pid=0)的元素加个一个sonsAuth下标存储其对应的子级权限
[
auth_name=>‘用户管理’
auth_id =>46
pid => 0
……
sonsAuth=>[
[auth_name=>用户列表,’pid’=>46]
[auth_name=>用户添加,’pid’=>46]
…..
]
]
超级管理员:
非超级管理员:
步骤3:在left.html取出session中的权限,遍历访问的菜单
效果:
权限防翻墙
如下:
解决办法:在common控制器中的_initialize的方法中,做防翻墙的操作。
1、要先获取到用户所访问的控制器名和方法名,在去做相关判断是否有权限
- 把用户可以访问的权限存储在session中
超级管理员:
非超级管理员:
今天重点:
- 一张牛逼的图
- 怎么构造满足我们要求的数组结构数据
四、商品有关的基本概念
这里主要涉及到以下几个概念:
- 商品类型:不同的网站的卖的商品是不一样的,比如化妆品网站专门卖化妆品、手机网站专门卖手机、汽车网站专门卖汽车。
- 商品属性:不同的商品类型对应的商品属性也是不一样的。
比如卖汽车网站,商品(汽车)属性有轴距、变速箱、驱动方式、进气方式、排量等
比如卖电脑网站,商品(电脑)属性有尺寸、内存、cpu、操作系统、系统核数等
比如卖手机网站,商品(手机)属性有尺寸、内存、系统、颜色、网络类型、电池容量等
商品类型决定了商品属性
- 商品分类
一个电商网站卖的商品不一样,其商品分类也是不一样的。
比如:卖汽车分类有:国产(吉利、 广汽)、日产(本田、丰田)、德国(奔驰、宝马)、韩国(起亚、现代)。
比如:卖手机分类有: 小米、华为、三星、苹果、oppo、vivo、魅族。
- 商品(产品+属性=商品)
如:iphoneX+64G , iphoneX+256G
商品类型
不同的商品类型会有不同的属性
可以在ecshop后台中新建一个商品类型,如下:建立一个汽车商品类型
属性分组:有些属性是可以归为一组的,参考京东电脑商品:
商品属性
给商品类型添加商品属性: 商品类型–>属性列表:
给汽车类型商品添加进气方式的属性:
单选属性: 指买商品的时候,可以选择一个属性,不同的属性价格不一样
唯一属性:只能看不能选。
复选属性:可以选择多个,一般买商品的附加配件都是复选的。
当在后台添加一个商品的时候要选择一个商品类型,选择了一个商品类型就决定了这个商品的有哪些属性,如下是添加商品设置其商品属性:
添加属性的特点:
唯一属性(只能看,不能选):前面没有【+】,不可以设置价格
单选属性(可选择):前面有【+】,点击+即可复制多个,不同的单选属性可设置不同的价格
属性值手工输入:对应的是个input框,需要自己输入。
属性值是列表选择: 对应的是个select下拉框,需选中一个属性值。
商品分类
一般一个网站决定卖什么类型商品就决定了其商品分类。
如卖汽车网站:分类有国产、日系、德系、韩系等
如卖化妆品网站:分类洗面奶、乳液、面膜、保湿、祛痘、眼霜等
五、完成商品类型的curd
商品类型介绍
商品类型:不同的网站的卖的商品类型是不一样的,比如化妆品网站专卖化妆品、手机网站专卖手机、二手汽车网站专买二手汽车。
网站决定卖什么商品类型,也就决定了商品的商品属性
商品类型的增加
商品类型的列表
商品类型的编辑
【作业】商品类型的删除
六、完成商品属性的curd
1、商品属性的认识
网站决定卖什么商品类型,也就决定了商品的商品属性
可以参考ecshop添加属性的方式:
属性这里重点两种属性:唯一属性和单选属性
唯一属性:只能看,不能选。
单选属性:我们购买商品的时候,可以选择的,后面添加商品的时候,不同的单选属性价格也是不一样的,如iphone6银色和iphone黑色价格是不一样的。
②属性的值的录入方式
手工输入:不可以输入属性值,且可选值列表是禁用状态,只能在添加商品的时候输入属性值。
列表选择:在可选择列表输入一些我们指定的属性值,添加商品的时候,从中选中一个属性值即可。
表结构:
完成商品属性的添加
完成商品属性的列表
完成商品属性的编辑
完成商品属性的删除
完成商品类型列表中属性的查看
七、完成商品分类的curd
1、分析分类表结构
表字段结构如下: