1.Framework框架技术
后台模块的设计理念是,将所有的操作都放置在同一页面中,么米有不同页面的跳转功能。然后根据不同数据层面之间,用控制器来控制哪些数据层面应该显示,哪些数据层面应该隐藏。这里需要一个Framework,即框架的理念。所有的功能体现,都交由控制器中Framework控制实现,然后指定单一的其他控制器类进行逻辑处理。也就是说,管理员看见的后台界面都是由Framework自动调配的。Framework框架关键代码如下:
public function framework(){
// 如果当前的SESSION值与登录界面传递的数据相同
if(session('PHP') == 'phper_ym@163.com'){
$string = I('id'); // 接收页面传递的参数
switch($string){ // 分支语句
case "addNews":
$this->assign('language_1',"block"); // 指定显示的逻辑层
$this->display('adminIndex'); // 指向页面
break;
case "updateNews":
$this->assign('language_2',"block"); // 指定显示的逻辑层
$this->assign('language_1',"none"); // 指定隐藏的逻辑层
$this->display('adminIndex'); // 指向页面
break;
case 'viewUpdateNews':
$new = D("News"); // 实例化模型
$data = $new->select(); // 执行查询
$count = $new->count(); // 查询满足要求的总记录数
// 实例化分页类,传入总记录数和每页显示的记录数
$Page = new \Think\Page($count,3);
$show = $Page->show(); // 分页显示输出
$list = $new->order('id')->limit($Page->firstRow.','.$Page->listRows)->select();
$this->assign('pc',$list); // 赋值数据集
$this->assign('page',$show); // 赋值分页输出
$this->assign('language_3',"block");
$this->assign('language_1',"none");
$this->display('adminIndex'); // 输出模板
break;
// 省略部分代码
}
}else{
$this->assign('hint','您没有操作权限');
$this->assign('url','__URL__/admin');
$this->display('information');
}
}
2.更改密码和项目所需数据表的操作
更改密码关键代码如下:
// 密码更改操作
public function change(){
// 判断是否通过SESSION验证
if(session('PHP') == "phper_ym@163.com"){
// 接收表单传递的数据
$string = I('pwd');
$stringg = I('pwdd');
// 判断两次输入的密码是否相同
if($string == $stringg){
$pc = M('admin'); // 实例化基础模型类
define(PHP,'_php'); // 定义常量
$pc = $pc->where('id'); // 取得数据表中数据
$data['pwd'] = md5($string."_php"); // MD5加密
$pc = $pc->where('id=1')->data($data)->save(); // 执行更新操作
$this->assign('hint','更改密码成功');
$this->assign('url','__URL__/adminIndex');
$this->assign('language_1',"block");
$this->display('informaton');
}else{
$this->assign('hint','两次密码输入不一致');
$this->assign('url','__URL__/adminIndex');
$this->assign('language_1',"block");
$this->display('information');
}
}else{
$this->assign('hint','您没有操作权限');
$this->assign('url','__URL__/admin');
$this->display('information');
}
}
在Framework中完成项目所需数据表,关键代码如下:
// 项目所需数据表
case "back":
$pc = M('project'); // 实例化模型
$pc = $pc->query('show tables'); // 执行SQL查询
$this->assign("type","block"); // 设置模块显示
$this->assign('list',$pc); // 向模板中传递数据
// $this->display('adminIndex'); // 模板指向
break;
3.左侧功能菜单区
利用CSS+DIV技术结合HTML标签编写功能菜单布局和样式修订,将每个列表内容都用
<div class="left">
<div class="leftLi">增加新闻</div>
<div class="liDiv">
<ul class="liDivUl">
<li>
<a href="__URL__/framework/id/addNews">单条增加新闻</a>
</li>
</ul>
</div>
<div class="leftLi">更新新闻</div>
<div class="liDiv">
<ul class="liDivUl">
<li><a href="__URL__/framework/id/updateNews">操作代码式更新</a></li>
<li><a class="aHref" href="__URL__/framework/id/viewUpdateNews">操作界面式更新</a></li>
</ul>
</div>
<div class="leftLi">增加新书</div>
<div class="liDiv">
<ul class="liDivUl">
<li><a href="__URL__/framework/id/addBook">单条增加新书</a></li>
</ul>
</div>
<div class="leftLi">更新新书</div>
<div class="liDiv">
<ul class="liDivUl">
<li>
<a href="__URL__/framework/id/updateNewbook">操作代码式更新</a>
</li>
<li>
<a href="__URL__/framework/id/viewUpdateNewbook">
操作界面式更新
</a>
</li>
</ul>
</div>
</div>
jQuery关键代码如下:
此段jQuery代码的原理是,当重复单击某个标题时,程序自动将指定模块进行显示和隐藏切换。
<script>
$(function(){
// 除指定区块的第一个外都设置为隐藏属性
$(".liDiv:gt(0)").hide();
// 标题切换单击
$(".leftLi").toggle(function(){
$(".liDiv").hide();
// 指定模块的下一级模块淡入效果显示
$(this).next('.liDiv').fadeIn("fast");
},function(){
$(this).next('.liDiv').hide(); // 当前对象的下个li隐藏
$('.liDiv:not(:first)').hide(); // 不是第一个的标签隐藏
$('.liDiv:first').fadeIn("fast"); // 第一个标签淡入显示
});
});
</script>
4.右侧操作内容显示区
(1)当管理员单击某个功能链接时,右侧的操作内容显示区会自动切换到对应的操作界面中来。笔者以“操作界面式更新”的功能选项为例。当功能按钮被单击时,程序首先将指令传递到控制器中的framework方法中来。framework方法接收参数,利用switch语句比对case值,比对成功后,控制器再次将数据传递到view视图层,即模板文件。传递的最主要数据是指定将页面中定义的display属性值$language_3赋值为block,设置其显示,进而具有操作权限。此部分内容的核心代码如下:
<div class="right_3" style="display:{$language_3}"></div>
(2)当页面显示成功后就可以进行对应的修改和删除操作了。执行这两个步骤的操作主要是在ThinkPHP的控制器中完成的。View层的代码如下:
adminIndex.html关键代码如下:
<table align="center">
<!-- 接收控制器传递的参数,循环输出数据 -->
<volist name="pc" id="pList">
<tr>
<td style="border:1px solid white;" width="50px">
{$pList.id}
</td>
<td style="border:1px solid white" width="500px">
{$pList.title|msubstr=0,30}...
</td>
<td width="100px" style="border:1px solid white">
<a href="__URL__/update/newIdUpdate/{$pList.id}">编辑</a>|
<a href="__URL__/delete/newIdDelet/{$pList.id}">删除</a>
</td>
</tr>
</volist>
<tr>
<td colspan="3">{$page}</td>
</tr>
</table>
(3)当编辑按钮被单击时,程序会将指定的数据传递到控制器层的update方法中,并同时传递一条数据主键ID的值。
update方法关键代码如下:
public function update(){
$string = I('newIdUpdate'); // 接收传递进来的ID的值
$pc = M('news'); // 实例化基础模型类
$pc = $pc->where('id='.$string)->select(); // 执行指定id的查询操作
print_r($pc);
// 为模板变量赋值
$this->assign('head',$pc[0]['id']);
$this->assign('title',$pc[0]['title']);
$this->assign('head',$string);
$this->assign('content',$pc[0]['content']);
$this->assign('time',$pc[0]['date_time']);
// 设置模块language_4的display属性值为block
$this->assign('language_4','block');
$this->assign('language_3','none');
$this->assign('language_1','none');
$this->display('adminIndex'); // 模板指向adminIndex页面
}
(4)由于控制器完成这部分的操作后,隐藏了原有控制页面,显示了新的操作页面。也就是说,控制器此步骤的操作是将控制权重重新赋予到新模块页面,此模块为
<!-- 模板中的变量全部由控制器update方法提供 -->
<div class="right_4" style="display:'{$language_4}'">
<form action="__URL__/adminUpdate" method="post">
<input type="hidden" name="head" value="{$head}" />
新闻标题:<input class="inputOne" type="text" name="title" value="{$title}" /><br />
新闻内容:<textarea name="textarea" class="inputTwo">{$content}</textarea><br />
发布时间:<input type="text" class="inputOne" name="time" value="{$time}" />
<input type="submit" value="更新" />
</form>
</div>
(5)当更新按钮被单击之后,程序又再次指向控制器的adminUpdate方法,从而执行更新操作。其控制器关键代码如下:
public function adminUpdate(){
// 获取接收的文本框信息
$data['title'] = I('title');
$data['content'] = I('content');
$data['date_time'] = I('time');
$id = I('head');
$data['update_time'] = date('Y-m-d');
$pc = M('news'); // 实例化基础模型类
$pc = $pc->where('id='.$id)->data($data)->save(); // 执行更新操作
if($pc != false){
$this->assign('hint','更新成功');
$this->assign('url','__URL__/adminIndex');
$this->display('information');
}else{
$this->assign('hint','更新失败');
$this->assign('url','__URL__/adminIndex');
$this->display('information');
}
}
总结:
运用软件工程的设计思想中最流行的MVC设计理念,通过一个业界比较有名的国产框架编写而成。通过对这个项目的学习,可以了解到PHP网站程序的开发流程,并且了解ThinkPHP框架三层开发的具体事宜。