标签 thinkphp 下的文章

ThinkPHP RBAC数据库结构简介


ThinkPHP 中的RBAC用到了5个表

think_user (用户表)
think_role (用户分组表)
think_node (操作节点)
think_role_user (用户和用户分组的对应)
think_access (各个操作和用户组的对应)

sql语句如下

-- 表的结构 `think_access`此表为五张表中的权限表
CREATE TABLE IF NOT EXISTS `think_access` (
  `role_id` smallint(6) unsigned NOT NULL,
  `node_id` smallint(6) unsigned NOT NULL,
  `level` tinyint(1) NOT NULL,
  `pid` int(11) DEFAULT NULL,
  KEY `groupId` (`role_id`),
  KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 表的结构 `think_node`此表为五张表中的节点表
CREATE TABLE IF NOT EXISTS `think_node` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `title` varchar(50) DEFAULT NULL,
  `pid` smallint(6) unsigned NOT NULL,
  `level` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `level` (`level`),
  KEY `pid` (`pid`),
  KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
-- 表的结构 `think_role`此表为五张表中的用户组表
CREATE TABLE IF NOT EXISTS `think_role` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
-- 表的结构 `think_role_user`此表为用户和组对应关系表
CREATE TABLE IF NOT EXISTS `think_role_user` (
  `role_id` mediumint(9) unsigned DEFAULT NULL,
  `user_id` char(32) DEFAULT NULL,
  KEY `group_id` (`role_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 表的结构 `think_user`此表为用户表
CREATE TABLE IF NOT EXISTS `think_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  `password` char(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

表Think_access:
Role_ID Node_id pid level
用户组的编号 节点表 节点表中的父ID项 节点表中的等级项
注:如果用户组id和对应的节点id存在这张表中,就表示用户所在的用户组有权限进行对应的操作权限。

表Think_node
id name title pid level
节点编号 节点名称 节点描述 父类编号 级别
节点编号,用来产生关联关系,主键,自增方便索引
节点名称,模块或者动作的名字(严格区分大小写)
节点描述,方便管理员认识和了解
注① :
1)如果是项目名称则项目是顶级的,它上面没有父路径编号(pid),因此pid则为0;例如,网站下有一个Admin项目,它是顶级的。因此没有父路径编号(pid),此处应填0,如果它为第一次插入数据库的,它的id则为1。全字段插入数据库应为:
id name title pid level
1 Admin Admin项目节点 0 1
2)如果某项目下有一个模块。则父路径编号(pid)则为该某块所在的项目编号(id)。例如,Admin下面有一个模块为User,它是第二个插入数据库的。因此,模块的父路径(pid)应填1。全字段插入数据库应为:
id name title pid level
2 User User模块节点 0 2
3)如果在某模块下面有三个动作(或成员方法),分别Index(显示)、insert(插入)、delete(删除),它们三个的父路径为该模块的编号。例如User模块下有Index、insert、delete三个动作或成员方法,它们分别是第三,四,五次插入数据库的。他们的父路径编号(pid)应填2。全字段插入数据库应为:
id name title pid level
3 User User模块下显示动作 0 2
4 Index User模块下插入动作 0 2
5 insert User模块下删除动作 0 2

表think_role
id name
组的编号(主键) 组的名字
注:此表中可以插入父路径编号(pid)产生组的包含关系。对应的父路径编号(pid)为所属组的编号(id)。

表think_user
id username password
用户编号(主键,int类型) 用户名(varchar类型) 密码(char类型32位)
注:id在下一张表中结合think_role产生用户与组的关联关系。建议username设为唯一的,password采用32位md5加密。

表think_role_user
group_id User_id
组编号(主键,int类型) 用户编号(主键,int类型)
注:用户编号(user_id)对应哪一个group_id,则哪个用户就属于哪一个组。可以让同一个用户对应多个组。就意味着,一个用户具有多个组的属性和操作权限。


ThinkPHP3.1实现验证码刷新的简单例子


《ThinkPHP3.1实现验证码的例子》 一文中讲了如何使用ThinkPHP自带的验证码类。但是没有说到如何来实现验证码的刷新,本文简单介绍一种方法。

首先说一下验证码可以刷新的意义:在于某个生成的图片过于混乱用户无法看清的情况下或者用户验证码由于网速问题没有展示正常的时候可以使用来更换一个验证码或重载一个验证码。

上次提到使用


来调用验证码

把它改为


即可实现验证码的刷新了。


ThinkPHP3.1实现验证码的例子


在ThinkPHP官网下载的程序没有包含扩展包。也无法使用自带的验证码类,而上网搜索的结果往往是针对低版本(包含了类文件)的方法,让新手朋友觉得很难搞定。

首先需要下载2个文件,放到ThankPHP/Extend/Library/ORG/Util下
文件下载地址

然后在需要验证码的Aciton类中写如下的方法

Public function verify(){
    import('ORG.Util.Image');
    Image::buildImageVerify(); //默认生成4个数字的验证码
}

然后在模版文件中使用


来调用图片

最后在Action中使用下面的代码来验证验证码的输入正确

if($_SESSION['verify'] != md5($_POST['verify'])) {
   $this->error('验证码错误!');
}

注Image类和String类还可以用于许多功能,仔细看一下就会发现里面还有许多方法,甚至还可以生成中文验证码(需要GD库支持)。这里就介绍到这里

如需《ThinkPHP3.1实现验证码刷新的简单例子》 请移步


ThinkPHP分离页头页脚模版


在开发网站的时候页头和页脚一般都是相同的,在写模版的时候通常采用上下调用的方式。而在ThinkPHP中smarty模版引擎有略微的修改,怎么做才能更好的发挥ThinkPHP的特性呢。有如下几种情况:

1.例如页头页脚,可将header.html,footer.html放入Public文件夹下,然后采用下面的方法调用:

2.例如用户中心菜单之类在某些页面重复调用的页面。大多在同文件夹下,采用下面的方法调用:

3.如果是多模版的,采用下面的方法调用:

即调用default主题下的User/menu模版

4.也可以采用文件绝对路径方式调用:

注:标签除了可以调用模版,还可以用来传参

上面的例子将title和keywords传入header模版。在模版中可以使用这些参数。

还可以同时包括多个模版,在file中用逗号隔开即可。

此外,可以在模版中套模版,例如在页头模版中在套入导航栏模版,都可以使用。