分层模式采用层次化的组织方式,每一层都是为上一层提供服务,并使用下一层提供的功能。这种模式允许将一个复杂问题逐步分层实现。层次模式中的每一层最多只影响两层,只要给相邻层提供相同的接口,就允许每层用不同的方法实现,可以充分支持软件复用。
分层模式的典型应用是分层通信协议,如ISO/OSI的七层网络模型。
分层模式的优点如下。
(1)有助把复杂的问题按功能分解,使整体设计更为清晰。
(2)支持系统设计的逐级抽象。
(3)具有较好的可扩展性。
(4)支持复用。
分层模式的缺点如下。
(1)并不是每个系统都可以很容易地划分出层次来;同时,各层功能的划分也没有一个统一的、正确的抽象方法。
(2)层次的个数过多,系统性能可能会下降。
程序关系图如下
1 <!DOCTYPE html> 2 <html> 3 <HEAD> 4 <TITLE>雇员信息系统</TITLE> 5 <META http-equiv = "content-type" content="text/html; charset = utf-8 "> 6 <!--连接外部样式表wcss.css--> 7 <LINK rel="stylesheet" href="wcss.css" type="text/css" /> 8 </HEAD> 9 <BODY><CENTER> 10 <!--DIV用于调整表单的垂直位--> 11 <DIV style="height: 60px; width: 50px"></DIV> 12 <H1>管理员登录</H1> 13 <FORM action="loginprocess.php" method="post"><TABLE> 14 <!--TR标签内是同一行的内容,TH标签内是同一列的内容--> 15 <TR><TH> 16 账号:<INPUT type="text" name="id" > 17 <TH> <DIV class="error"><?PHP 18 if (isset($_GET['error'])) 19 echo"*账号或密码错误!"; 20 ?></DIV></TH> 21 <!--判断表单错误信息的存在和显示;DIV防止表单错误信息影响布局--> 22 <TR><TH>密码:<INPUT type="password" name="password" ></TH></TR> 23 <TR> 24 25 <TH><INPUT type="submit" value="登录" > 26 27 <INPUT type="reset" value="重置" ></TH> 28 </TR> 29 </TABLE></FORM> 30 </TH></TR> 31 </CENTER></BODY> 32 </html>
1 <?PHP 2 require_once "Session.class.php"; 3 $session=new Session(); 4 $session->destroy(); 5 header("Location:loginview.php"); 6 ?>
1 <!DOCTYPE html> 2 <html> 3 <HEAD> 4 <TITLE>欢迎使用雇员信息管理系统</TITLE> 5 <META http-equiv = "content-type" content="text/html; charset = utf-8 " > 6 <!--连接外部样式表wcss.css--> 7 <LINK rel="stylesheet" href="wcss.css" type="text/css" /> 8 </HEAD> 9 <BODY> 10 <!--混合使用div标签与span标签实现同一行文本不同样式--> 11 <?PHP 12 require_once "Session.class.php"; 13 $session=new Session(); 14 $name=$session->get('name'); 15 if($name!=false) 16 echo "<div class='welcome'>欢迎<span class='welcome'>".$name."</span>登录成功!</div>"; 17 else 18 header("Location:loginview.php"); 19 ?> 20 <HR> 21 <DIV class='mainop' > 22 <DIV><A href="#">管理用户</A></DIV> 23 <DIV><A href="#">添加用户</A></DIV> 24 <DIV><A href="queryview.php">查询用户</A></DIV> 25 <DIV><A href="logoutprocess.php">退出系统</A></DIV> 26 </DIV> 27 </BODY> 28 </html>
1 <?PHP 2 require_once "Session.class.php"; 3 $session=new Session(); 4 $session->destroy(); 5 header("Location:loginview.php"); 6 ?>
1 <!DOCTYPE html> 2 <html> 3 <HEAD> 4 <TITLE>雇员信息表</TITLE> 5 <META http-equiv = "content-type" content="text/html; charset = utf-8 " > 6 <LINK rel="stylesheet" href="wcss.css" type="text/css" /> 7 </HEAD> 8 <BODY> 9 <DIV style="height: 20px"></DIV> 10 <TABLE class="op"><TR> 11 <TH><A href="#">>管理用户</A></TH> 12 <TH><A href="#">>添加用户</A></TH> 13 <TH><A href="#">>查询用户</A></TH> 14 <TH><A href="logoutprocess.php">>退出系统</A></TH> 15 </TR></TABLE> 16 <HR> 17 <?PHP 18 if (isset($_GET['pageNow'])) 19 $pageNow=$_GET['pageNow']; 20 else 21 $pageNow=1; 22 23 $pageSize=1; 24 require_once "PagingDisplay.class.php"; 25 $emService=new EmService(); 26 $emService->pagingDisplay($pageSize,$pageNow); 27 ?> 28 </BODY> 29 </html>
1 <?PHP 2 /*封装所有对ad表的操作*/ 3 require_once "Session.class.php"; 4 require_once "SqlHelper.class.php"; 5 class AdService 6 { 7 public function match($id,$password) 8 { 9 $session=new Session(); 10 $sqlHelper=new SqlHelper(); 11 $data=$sqlHelper->execute_sql('SELECT password,name FROM ad INNER JOIN em ON ad.id=em.id WHERE ad.id='.$id,MYSQL_ASSOC); 12 $sqlHelper->close_connect(); 13 //判断查询结果是否存在及是否完全匹配 14 //md5(),计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。 15 if ($data && $data[0]['password']==md5($password)) 16 { 17 //匹配成功,跳转到mainview.php,并使用session保存管理员姓名 18 $name=$data[0]['name']; 19 $session->set("name",$name); 20 header("Location:mainview.php"); 21 die(); 22 } 23 //匹配失败,跳转到loginview.php,并发送错误信息error 24 header("Location:loginview.php?error=1"); 25 die(); 26 } 27 } 28 ?>
1 <?PHP 2 /*封装所有对em表的操作*/ 3 require_once "SqlHelper.class.php"; 4 class EmService 5 { 6 public function pdQuery($pageSize,$pageNow) 7 { 8 $sqlHelper=new SqlHelper(); 9 $data=$sqlHelper->execute_sql("SELECT * FROM em LIMIT ".($pageNow-1)*$pageSize.",".$pageSize,MYSQL_ASSOC); 10 return $data; 11 } 12 public function get_pageCount() 13 { 14 $sqlHelper=new SqlHelper(); 15 $data=$sqlHelper->execute_sql("SELECT COUNT(id) FROM em ",MYSQL_NUM); 16 if($data) 17 return $data[0][0]; 18 else 19 return null; 20 } 21 public function pagingDisplay($pageSize,$pageNow) 22 { 23 $pagingDisplay=new PagingDisplay($pageSize,$pageNow,$this->get_pageCount()); 24 $data=$this->pdQuery($pagingDisplay->pageSize,$pagingDisplay->pageNow); 25 echo '<table border="1" width="600" align="center">'; 26 echo '<caption><h1>雇员信息表</h1>第'.$pagingDisplay->pageNow.'页,共'.$pagingDisplay->rowCount.'页</caption>'; 27 echo '<tr bgcolor="#dddddd">'; 28 echo '<th>id</th><th>姓名</th>'; 29 echo '</tr>'; 30 for($i=0;$i<count($data);$i++) 31 { 32 echo '<tr>'; 33 echo '<th>'.$data[$i]['id'].'</th><th>'.$data[$i]['name'].'</th>'; 34 echo '</tr>'; 35 } 36 echo '</table>'; 37 $fileName="queryview.php"; 38 $pagingDisplay->page_turn($fileName); 39 echo "<br>"; 40 $pagingDisplay->page_number($fileName); 41 $pagingDisplay->page_jump($fileName); 42 } 43 } 44 ?>
1 <script> 2 function myFunction() 3 { 4 alert("Hello World!"); 5 } 6 </script> 7 8 <?PHP 9 /*分页显示相关操作*/ 10 require_once "EmService.class.php"; 11 class PagingDisplay 12 { 13 public $pageSize=1;//每页信息条数 14 public $pageNow=1;//当前页码 15 public $rowCount=1;//全表总信息条数 16 public $pageCount=1;//全表总页数 17 //构造函数 18 function __construct($pageSize,$pageNow,$rowCount) 19 { 20 $this->pageSize=$pageSize; 21 $emService=new EmService(); 22 $this->rowCount=$emService->get_pageCount(); 23 $this->pageCount=ceil($this->rowCount/$this->pageSize); 24 $this->pageNow=$pageNow; 25 } 26 //翻页导航 27 public function page_turn($fileName) 28 { 29 if ($this->pageNow>1) 30 { 31 $pagePrevious=$this->pageNow-1; 32 echo "<a href='$fileName?pageNow=$pagePrevious'>上一页</a>"; 33 } 34 else 35 echo "上一页"; 36 echo " "; 37 if ($this->pageNow<$this->rowCount) { 38 $pageNext=$this->pageNow+1; 39 echo "<a href='$fileName?pageNow=$pageNext'>下一页</a>"; 40 } 41 else 42 { 43 echo "下一页"; 44 } 45 } 46 //页码导航 47 public function page_number($fileName,$pageNum=5) 48 { 49 echo "第 "; 50 //计算第一个跳转超链接的页码page1 51 //floor()地板函数,向下取整 52 /*当当前页码pageNow等于显示数pageNum的一半时, 53 第一个跳转超链接的页码page1恰为1,恰保证页码跳转显示的超链接个数为pageNum。 54 故当pageNow小于pageNum的一半时,为了保证页码跳转显示的超链接个数仍为pageNum, 55 page1亦为1*/ 56 if ($this->pageNow <= ceil($pageNum/2)) 57 $page1=1; 58 /*同理*/ 59 elseif ($this->pageNow >= $this->rowCount-floor($pageNum/2)) 60 $page1=$this->rowCount-$pageNum+1; 61 else 62 $page1=$this->pageNow-floor($pageNum/2); 63 //打印省略号 64 if ($this->pageNow > ceil($pageNum/2)) 65 echo "<span style='color:blue;'>...</span>"; 66 else 67 echo "   "; 68 //打印的页码pagePrint 69 for ($i=0; $i < $pageNum; $i++) 70 { 71 //sprintf("%02d",$page1+$i),表示对$page1+$i补0成两位数 72 $pagePrint=sprintf("%02d",$page1+$i); 73 if ($pagePrint==$this->pageNow) 74 echo "<a href='$fileName?pageNow=$pagePrint' style='font-size: 30px;'>[$pagePrint]</a> "; 75 else 76 echo "<a href='$fileName?pageNow=$pagePrint'>[$pagePrint]</a> "; 77 } 78 //打印省略号 79 if ($this->pageNow <= ceil($pageNum/2)) 80 echo "<span style='color:blue;'>...</span>"; 81 else 82 echo "   "; 83 echo " 页"; 84 } 85 //定向跳转 86 public function page_jump($fileName) 87 { 88 echo " 89 <form action=$fileName method='get' name='page_jump' > 90 <input type='text' name='pageNow'></input> 91 <input type='submit' value='跳转到''></input> 92 </form> 93 "; 94 } 95 } 96 ?>
1 <?PHP 2 /*封装所有对Session的操作*/ 3 class Session 4 { 5 //开始一个会话或者返回已经存在的会话。 6 function Session() 7 { 8 session_start(); 9 } 10 //注册session变量并赋值 11 function set($name, $value) 12 { 13 $_SESSION[$name] = $value; 14 } 15 //获取session变量 16 function get($name) 17 { 18 if(isset($_SESSION[$name])) 19 return $_SESSION[$name]; 20 else 21 return false; 22 } 23 //删除session变量$_SESSION[$name] 24 function del($name) 25 { 26 unset($_SESSION[$name]); 27 } 28 //重置当前会话所关联的全局变量并销毁当前会话中的全部数据 29 function destroy() 30 { 31 //重置当前会话所关联的全局变量 32 $_SESSION = array(); 33 //变量并销毁当前会话中的全部数据 34 session_destroy(); 35 } 36 } 37 ?>
1 <?PHP 2 /*封装所有对aedb数据库的操作*/ 3 class SqlHelper 4 { 5 public $conn;//SQL连接标识符。 6 public $dbname="aedb"; 7 public $host="localhost"; 8 public $username="root"; 9 public $password="root"; 10 public $characterSet="set names utf8"; 11 //构造函数 12 public function __construct() 13 { 14 //获得连接SQL连接标识符conn。 15 $this->conn=mysql_connect($this->host,$this->username,$this->password); 16 if (!$this->conn) 17 die("连接失败!错误信息:".mysql_errno()); 18 //设置访问数据库的编码 19 mysql_query($this->characterSet,$this->conn) or die("设置编码失败!错误信息:".mysql_errno()); 20 //选择数据库 21 mysql_select_db($this->dbname,$this->conn) or die("选择数据库失败!错误信息:".mysql_errno()); 22 } 23 //关闭连接 24 public function close_connect() 25 { 26 mysql_close($this->conn); 27 } 28 //获取表信息 29 public function execute_sql($sql,$array_type) 30 { 31 //获取资源标识符res,若失败mysql_query()返回FALSE 32 $res=mysql_query($sql,$this->conn) or die("获取资源标识符失败!错误信息:".mysql_errno()); 33 /*mysql_fetch_array()从结果集中取得一行作为关联数组,或数字数组,或二者兼有 34 返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。 35 根据参数$array_type:MYSQL_ASSOC - 关联数组 36 MYSQL_NUM - 数字数组 37 MYSQL_BOTH - 默认。同时产生关联和数字数组*/ 38 $data = array(); 39 while ($row=mysql_fetch_array($res,$array_type)) { 40 $data[]=$row; 41 } 42 //释放结果内存。成功返回 true,失败返回 false 43 mysql_free_result($res); 44 return $data; 45 } 46 } 47 ?>
1 body{ 2 background-color:#ABC; 3 text-align:center; 4 margin:0 auto; 5 } 6 7 table.op{ 8 width:900px; 9 font-size: 20px; 10 font-weight:700; 11 text-align:center; 12 margin:0 auto; 13 } 14 15 16 17 hr{ 18 height:5px; 19 border:none; 20 border-top:5px double blue; 21 } 22 23 div.error{ 24 height: 20px; 25 width: 150px; 26 color:red; 27 size:2px; 28 float:left 29 } 30 31 div.welcome{ 32 color:red; 33 font-size: 50px; 34 font-weight:700; 35 36 } 37 38 span.welcome{ 39 color:yellow; 40 font-weight:700; 41 } 42 43 span.ellipsis{ 44 color:blue; 45 } 46 47 div.mainop{ 48 width:900px; 49 margin:0 auto; 50 font-size: 40px; 51 font-weight:700; 52 53 } 54 55 table.em{ 56 width:700px; 57 margin:0 auto; 58 }