分层模式采用层次化的组织方式,每一层都是为上一层提供服务,并使用下一层提供的功能。这种模式允许将一个复杂问题逐步分层实现。层次模式中的每一层最多只影响两层,只要给相邻层提供相同的接口,就允许每层用不同的方法实现,可以充分支持软件复用。
分层模式的典型应用是分层通信协议,如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>
loginview.php
1 <?PHP
2 require_once "Session.class.php";
3 $session=new Session();
4 $session->destroy();
5 header("Location:loginview.php");
6 ?>
loginprocess.php
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>
mainview.php
1 <?PHP
2 require_once "Session.class.php";
3 $session=new Session();
4 $session->destroy();
5 header("Location:loginview.php");
6 ?>
logoutprocess.php
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>
queryview.php
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 ?>
AdService.class.php
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 ?>
EmService.class.php
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 ?>
PagingDisplay.class.php
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 ?>
Session.class.php
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 ?>
SqlHelper.class.php
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 }
wcss.css