商城2
一、自动完成插件
功能效果:

使用:
- 先将对应的文件放置资源目录

js文件(需要依赖jquery.js)

- 页面上引入对应的文件(该插件是基于jQuery的)

为需要使用邮箱自动完成的input框定义ID属性,然后使用js代码调用

3. 效果


二、登录和验证
控制器:BackController.class.php
方法:login方法
- 在Admin模块增加一个BackController.class.php控制器,增加一个login方法

- 增加一个login.html页面

效果

- 在Admin模块的UserModel.class.php模型定义登录的自动验证

- 在Admin模块的UserModel.class.php模型文件增加一个login方法,完成登录的检测

功能完善:由于部分浏览器会自动完成用户表单里面的数据,但是一般不希望自动填充,可以使用如下的方法进行完善。

只需要在表单里面增加如下的信息

三、验证码功能
- 在BackController.class.php控制器文件增加一个code方法

- 在login.html页面调用上面定义的方法,显示验证

- 在UserModel.class.php的自动验证里面完成验证处理

验证的回调函数

- 在BackController.class.php控制器的login方法里面的create方法里面定义验证的时间

6. 下去之后,去一个packagist.org/网站下载对应的验证码功能模块
https://packagist.org/packages/gregwar/captcha
四、退出和FQ验证
退出
- 在head.html页面显示登录用户信息和退出链接

效果

- 在BackController.class.php控制器文件,增加一个logout方法

FQ验证
对应后台的控制器下的方法需要在用户成功登录之后,才可以进行访问,否则直接访问是FQ操作,是不合理的,所以必须在登录之后进行处理。处理思路就是判断session里面是否存在登录的标识。在用户访问某个后台的方法之前,先验证一下登录标识是否存在,但是如果我们在每个后台的方法里面都要进行验证,这样比较繁琐,所以我们一般会抽取一个公共的控制器,然后在该公共控制器的构造方法里面验证登录的标识是否存在;然后在让其他需要验证后才可以访问的控制器继承该公共控制器。(主要清楚思路:面试思路)
- 定义一个FatherController.class.php控制器文件,然后在构造方法里面完成用户登录检测

- 让需要验证的控制器继承该公共控制器

五、RBAC模块
完成rbac模块:其实是由三个模块组成:
- 用户模块: 用户的curd操作
- 权限模块: 权限的curd操作
- 角色模块: 角色的curd操作
简介
- 什么是rbac?
答:rbac是 role based access control 基于角色的权限(访问)控制。
- 什么是权限?
答:在PHP的web项目里的权限指的是一个控制器下的一个方法,例如用户添加(UserController.class.php--add方法),并且权限一般都存在层级关系(顶级权限--》次级权限)
用户管理(顶级权限)
用户列表(次级权限)
用户添加
用户删除
用户修改

- 什么是角色?
答:角色就是一类用户的统称。后台到时候进行权限的管理的时候,是管理的角色下的权限,而不是让用户直接的面对权限。然后在让用户拥有对应的角色。
好处:由于后台的角色信息还是相对偏少,维护起来方便一些。如果是用户直接面对权限,那么管理起来比较麻烦。(分而治之)。
- rbac的管理的思想:
答:
a. 用户的角色分配
首先我们需要在后台完成一个权限管理的模块,可以完成权限的添加,生成对应的权限的列表(就是我们项目里面所有的控制器下的方法)。
其次,在后台完成角色模块,在添加角色的时候,我们需要为添加的角色做一个权限的分配。
最后,在后台完成用户模块,在添加用户的时候,我们需要给用户一个角色身份,相当于用户也存在了角色所对应的权限。
b. 用户的权限的验证
后台的用户只能去访问自己对应权限的操作。到时候完成这个验证的思路:
首先我们需要在用户成功登录后,根据用户的角色role_id,查询对应的角色的权限信息(需要注意,到时候角色表里面保存的不是直接的权限信息,而是保存权限表里面权限主键id形成的一个字符串role_id_list),最后根据角色表里面的role_id_list去权限表里面查询用户最终的权限。取出所有的权限之后,把权限的控制器和方法做一定的处理之后,放到session里面,以后访问每个一个方法之前,先去session里面查看当前用户是否存在对应的权限。如果存在则可以访问。
c. 后台首页的权限菜单

后台的首页左侧的部分,需要根据用户所拥有的权限来进行动态的展示。
表设计
- 权限表
auth_id 主键ID
auth_name 权限的中文名称,给人看的
auth_c 权限的控制器 如果是顶级权限,是不对应控制器和方法,一般设置为null
auth_a 权限的方法 如果是顶级权限,是不对应控制器和方法,一般设置为null
auth_pid 权限的上级id 如果是顶级权限,则为0;否则其他的为自己父级的主键ID
|
auth_id |
auth_name |
auth_c |
auth_a |
auth_pid |
|
1 |
商品管理 |
null |
null |
0 |
|
2 |
商品列表 |
Goods |
lst |
1 |
|
4 |
商品添加 |
Goods |
add |
1 |
- 角色表
role_id 主键ID
role_name 角色名称
role_id_list 权限列表字符串 注意:这个字段里面保存时权限表里面主键id形成的字符串,如果是超级管理员则使用*代替,一般角色表里面ID为1的记录也是初始化出来的。这个角色也不受到权限管理。
|
role_id |
role_name |
role_id_list |
|
1 |
超级管理员 |
* |
|
2 |
普通管理员 |
1,2,4 |

- 用户表
|
id |
username |
... |
... |
... |
role_id |
|
2 |
andy |
|
|
|
2 |
注意1:rbac一般使用几张表完成?
答:我们使用的3张表。如果不使用3张表完成,是否可以进行操作。可以,使用使用5张表。每两张表之间加上一张中间表(对应关系)
注意2:TP一个项目,TP里面是否自带权限的管理验证(TP是否自带rbac功能?)
答:存在
自己的可定制性更高。

注意3:我们这一次实现的rbac是一个用户只存在一个角色(1对1的关系),其实一个用户是可以对应多个角色的。这种关系是一个多对多的关系的。
下去百度:
- 学会使用ecshop的权限管理
- 用户模块curd 权限模块curd 角色模块curd(五个文件3个模板+1控制器+1模型)有人提出偷懒的概念(使用代码生成器、脚手架可以快速的生成一些基础性的代码,例如控制器代码,模型,三个视图页面,最先这个概念是YII框架(薛强)里面进行提出,YII里面存在一个Gii的组件)
http://www.yiibai.com/yii2/start-gii.html
权限模块
权限添加
添加项(权限名,权限控制器名,权限方法,上级权限【下拉】),顶级权限下的控制器和方法写null
- 创建一个AuthController.class.php控制器文件,增加一个add方法

- 增加一个add.html视图文件

效果

- 增加一个AuthModel.class.php完成自动验证和附加数据处理

获取层级关系的权限数据

权限展示(序号,权限名称,权限控制器,权限方法)--展示出层级关系
1.在AuthController.class.php控制器文件,增加一个lst方法

2.增加一个lst.html视图页面

效果

权限删除-a链接方式
1. 在AuthController.class.php控制器文件,增加一个del方法

- 在AuthModel.class.php模型文件,增加一个checkChild方法,检测当前权限是否存在子级权限hg

权限删除-ajax删除
- 在lst.html权限展示页面,为删除链接定义class,并自定义一个主键属性,同时阻止默认事件

2. 定义代码,完成ajax删除操作

3. 创建一个AuthController.class.php控制器文件,增加一个Ajaxdel方法

弹出插件
网站:http://www.daimajiayuan.com/download/201304/yulan/artDialog4.1.7/
网站:http://www.5imvc.com/scripts/jbox/jbox-demo.html
网站:http://mishengqiang.com/sweetalert/
- 将弹出插件对应的文件放置到资源目录

- 在lst.html引入插件的js和css文件

js文件引入

- 在合适的地方调用弹出swal函数

效果

权限删除-事件委托(事件代理)
委托和代理是同一个概念,只是站的角度不一样而已。

- 需要为删除的外层元素绑定一个点击事件

- 需要在点击事件的回调函数代理删除的行为

- 在AuthController.class.php控制器文件定义一个ajaxDel方法

权限编辑
1.创建一个AuthController.class.php控制器文件,增加一个edt方法

2.增加一个edt.html页面

效果

3.在AuthModel.class.php模型文件,增加一个getChild方法获取当前权限的子级权限主键ID

角色模型
角色添加

- 增加一个RoleController.class.php控制器文件,增加一个add方法

- 增加一个add.html页面

- 增加一个RoleModel.class.php模型文件,完成自动验证,同时增加一个插入的前置钩子函数完成角色权限ID字符串的转换

角色列表【重点】--find_in_set()
- 在RoleController.class.php控制器文件,增加一个lst方法

- 在lst.html视图页面展示角色数据

注意:角色下的权限信息需要连表操作进行获取。





原先sql获取角色对应的权限信息:
mysql> select a.*, group_concat(b.auth_name) as auth_name from sh_role a left join sh_auth b on find_in_set( b.auth_id, a.role_id_list) group by a.role_id;

角色修改
- 在RoleController.class.php控制器文件,增加一个edt方法

- 增加一个edt.html视图页面

效果

- 在RoleModel.class.php模型文件增加一个更新的前置钩子函数,完成角色权限ID字符串的转换操作

角色删除
1.在一个RoleController.class.php控制器文件,增加一个del方法


浙公网安备 33010602011771号