研究背景
随着计算机技术和通信技术的迅猛发展,计算机网络已深入到人们的工作、生活与学习中;我们在网络上办公、在网络上购物、在网络上学习;其中网络在线学习在近年已经是传统面授学习有力的补充,我们不再局限于天天跑到教室,在家里一样可以完成相关内容的学习,或者在完成系统面授的基础上回家再利用在线学习进行深化并与授课老师进行在线交流等。总之通过网络,人们可以更快更方便地找到自己想要的资源,更有效的利用网络去辅助自己的学习。各种各样的学习网站的出现,不仅能使教师更方便地获取教学资源,更能为学生提供了一个学习的平台,让学生通过自主探究的方式提高自己的学习,PHP网络编程在晓庄已经有好几年的历史,我们在学习、授课、项目的基础上已经积累了大量关于PHP学习的资料,我们在论坛中也发过很多关于PHP与Linux的文章,帮助不少网友解决了相关技术问题,希望通过建立一个PHP学习网来帮助晓庄和全国爱好PHP
的同学或者工作人员学习PHP。
需求分析
PHP学习网站为PHP爱好者提供了学习和交流PHP的平台。浏览者可以浏览系统前台信息,管理员可以管理后台,及时更新前台的内容。
系统前台提供的具体功能如下:
1、用户注册功能:注册成为PHP学习网的合法用户。
2、用户登录功能:已注册用户可以输入用户名和密码进入PHP学习网站。
3、用户找回密码功能:已注册用户如果忘记自己的密码,正确填写用户密码问题和用户密码答案后,可以修改自己的密码。
4、浏览PHP教程:普通浏览者可以查看PHP教程。
5、浏览PHP文献书籍:普通浏览者可以查看PHP文献书籍。
6、浏览PHP学习网站:普通浏览者可以浏览相关的PHP学习网站。
7、论坛交流:PHP学习网站的用户可以进入论坛,发表帖子和回复帖子。普通浏览者只能查看帖子,不能发表和回复帖子。
8、站内搜索:普通访问者可以搜索相关的PHP教程,PHP文献书籍和PHP网站。
系统后台管理模块的具体功能如下:
1、PHP教程管理:管理员在后台可以添加,编辑教程,同时也可以删除过时的教程。
2、PHP文献书籍管理:管理员在后台可以添加,编辑和删除相应的文献书籍。
3、PHP学习网站管理:管理员在后台可以添加,编辑教程和删除相应的学习网站。
4、会员管理:管理员在后台可以删除会员。
5、管理员管理:管理员在后台可以添加,编辑和删除相应的管理员。
6、论坛管理:管理员在后台不仅可以对论坛栏目进行管理,还可以对相应的论坛帖子进行管理。
总体设计
根据PHP学习网的功能需求,进行系统分析设计。系统功能模块图如图所示
游客/未登录用户模块
游客/未登录用户模块:游客和未登录的用户都可以查看PHP教程,查看PHP书籍文献,查看PHP学习网站,下载PHP资源,浏览论坛,站内搜索。模块图如图所示:
登录用户模块
登录用户模块:游客可以首先注册成为PHP学习网的会员,然后登录。登录用户不仅可以查看PHP教程,查看PHP书籍文献,查看PHP学习网站,下载PHP资源,站内搜索,还可以修改个人信息,进入论坛发表帖子和回复帖子。模块图如图所示:
图 登陆用户功能模块图
管理员模块:管理员管理模块也就是网站的后台,主要工作是负责对上面两个模块的管理与维护。包含管理PHP教程、管理文献书籍、管理编辑学习网站、管理PHP资源、管理会员、管理论坛和管理管理员这七个子模块。模块图如图3-4所示:
图管理员模块图
数据库的E-R图反映了实体、实体的属性和实体之间的联系。
下面的图3-5至图3-11显示的是各个实体以及实体的属性。
图3-5 管理员实体及属性
图3-6 用户实体及属性
图3-7 学习资料实体及属性
图3-8 论坛栏目实体及属性
图3-9 帖子实体及属性
图3-10 回帖实体及属性
图3-11 资源实体及属性
下面的图3-12显示的是系统E-R图:
系统E-R图
数据库逻辑结构设计
本系统数据库为:phpjiaoxue,其中包含了七个MySQL数据表来实现对数据的存储、调用。以下为具体数据表模式:
⑴ 【管理员表】(管理员ID、管理员名、管理员密码)
⑵ 【用户表】(用户ID、用户名、用户密码、提示问题、提示答案、邮箱、真实姓名、注册时间、登录次数、最后一次登录时间)
⑶ 【资源表】(资源ID、资源名、原资源名、资源类型、上传时间、新资源名)
⑷ 【论坛栏目表】(论坛栏目ID、论坛栏目名称)
⑸ 【学习资料表】(学习资料ID、学习资料标题、学习资料内容、学习资料类型)
⑹ 【帖子表】(帖子ID、发帖人姓名、时间、主题、帖子内容、对应论坛栏目)
⑺ 【回帖表】(回帖ID、帖子编号、回复内容、回帖人、回帖时间、对应论坛栏目)
其中,用下划线标出的属性为表的主键属性。各表的具体设计如表4-1~表4-7所示。
根据E-R图,设计每张表的变量名,变量的类型及主键。
1.tbl_admin 表
tbl_admin表存放管理员登录名和密码。
表4-1 tbl_admin表
变量 | 类型 | 备注(C) |
id | int(10) | 管理员ID |
UserName | varchar(50) | 管理员名 |
UserPwd | varchar(50) | 管理员密码 |
2.tbl_user表
用户所有的注册信息都存放在些表中。
表4-2 tbl_user 表
名称 | 类型 | 备注(C) |
Id | int(10) | 用户ID |
UserName | varchar(32) | 用户名 |
UserPwd | varchar(32) | 用户密码 |
Problem | varchar(50) | 提示问题 |
Answer | varchar(50) | 提示答案 |
| varchar(100) | 邮箱 |
TrueName | varchar(32) | 真实姓名 |
RegDate | datetime | 注册时间 |
LogTimes | Smallint(10) | 登陆次数 |
LastLogTime | datetime | 最后一次登陆时间 |
3. tbl_down 表
tbl_down表存放资源的信息,包括资源的编号、名称、类型、资源日期。
表4-3 tbl_down表
名称 | 类型 | 备注(C) |
down_id | int(10) | 资源ID |
filename | varchar(50) | 资源名 |
down | varchar(200) | 原资源名 |
type | varchar(20) | 资源类型 |
date | date | 上传时间 |
newfilename | varchar(255) | 新资源名 |
4.tbl_class表
tbl_class表存放论坛栏目的编号和名称。
表4-4 tbl_class表
名称 | 类型 | 备注(C) |
Id | int(10) | 论坛栏目ID |
ClassType | varchar(32) | 论坛栏目名称 |
5.tbl_pagecontent表
tbl_pagecontent表存放学习资料的编号,标题,内容和类型。
表4-5 tbl_pagecontent表
名称 | 类型 | 备注(C) |
Id | int(10) | 学习资料ID |
PageTitle | varchar(100) | 学习资料标题 |
PageContent | longtext | 学习资料内容 |
PageType | tinyint(1) | 学习资料类型 |
6.tbl_msg表
tbl_msg表存放帖子编号,发帖人姓名,主题,发帖时间,帖子内容和对应论坛栏目。
表4-6 tbl_pagecontent表
名称 | 类型 | 备注(C) |
Id | int(10) | 帖子ID |
UserName | varchar(32) | 发帖人姓名 |
Subject | varchar(60) | 主题 |
LyDate | datetime | 发帖时间 |
LyContent | longtext | 帖子内容 |
Itid | int(4) | 对应论坛栏目 |
7.tbl_reply表
tbl_reply表存放回帖编号,帖子编号,回复内容,回帖人,回帖时间和对应论坛栏目。
表4-7 tbl_reply表
名称 | 类型 | 备注(C) |
hid | int(4) | 回帖ID |
hbid | int(4) | 帖子编号 |
hcontnet | text | 回复内容 |
huiuser | varchar(32) | 回帖人 |
htime | longtext | 回帖时间 |
htid | int(4) | 对应论坛栏目 |
系统功能的具体实现
4.1 系统前台设计
在系统进行整体设计的过程中,将系统中的公用代码部分分离了出来,避免了系统中出现代码冗余,同时也提高了系统的开发效率。
<div id="div-wrapper">
<!--body part start -->
<div id="mainbody">
<!--left part srart -->
<div id="leftpart">
<ul>
<?php include_once('left.php');?> //调用页面左部文件
</ul>
</div>
<!--left part end -->
<!--right part start -->
<div id="rightpart">
<?php include_once('daohang.php');?> //调用导航条文件
<p class="body-text"><?php include 'search.php';?> </p>
……
图4-1 PHP学习网主页面
已注册会员可以用用户名和密码登录系统。
SESSION和COOKIE的区别:
Session:在计算机中,尤其是在网络应用中,称为“会话”。
Session是存在服务器端的,而Cookie是存在客户端的。
Session是存在内存中的,浏览器关闭它也就“死”了;Cookie是以文件方式存在的,可以修改其“存活”时间。
Cookie是Web服务器保存在用户硬盘上的一段文本。Cookie允许一个Web站点在用户的电脑上保存信息并且随后再取回它。可以设置其存在时间。
在本系统中,判断用户是否登录则使用SESSION判断,如果登录成功,则在服务端创建SESSION,并将其用户名保存在其中。
图4-2 登录验证页面
在系统用户登录的时候,用户需要输入用户名和密码及验证码进行数据库登录验证。用户必须输入用户名和密码以及验证码。否则将弹出对话框进行提示。该功能采用Javascript脚本进行判断,以减轻数据库的压力。
判断输入是否为空是通过按扭οnsubmit="return regFrm()"触发事件
<script language="javascript">
function regFrm() {
var aname1 = document.getElementById("username");
var apwd = document.getElementById("password");
var checkcodestr = document.getElementById("checkcodestr");
if(aname1.value == "") {
aname1.style.backgroundColor = "#FFFFCC";
alert("请输入用户名!"); //弹出提示对话框
aname1.focus(); //返回输入光标
return false;
}
else if(apwd.value == "") {
apwd.style.backgroundColor = "#FFFFCC";
alert("请输入用户密码!");
apwd.focus();
return false;
}
else if(checkcodestr.value == "") {
checkcodestr.style.backgroundColor = "#FFFFCC";
alert("请输入验证码!");
checkcodestr.focus();
return false;
}
return true;
}
在普通浏览者注册会员时,需要填写用户名,密码,确认密码,密码提示问题,密码提示答案,E-mail,用户真实姓名这些信息。只有规范填写注册信息才能注册会员,否则将弹出对话框进行提示。该功能采用Javascript脚本进行判断,以减轻数据库的压力。
图4-3 注册验证页面
判断输入是否规范是通过按扭οnsubmit="return regFrm()"触发事件
<script type="text/javascript">
function regForm() {
var uName = document.getElementById("uName");
var uPwd = document.getElementById("uPwd");
var uPwd2 = document.getElementById("uPwd2");
var question= document.getElementById("question");
var answer = document.getElementById("answer");
var email = document.getElementById("email");
if(uName.value == "") {
uName.style.backgroundColor = "#FFFFCC";
alert("请输入用户名!");
uName.focus();
return false;
}
else if(!uName.value.match(/^[a-zA-Z0-9_]+$/)){
uName.style.backgroundColor = "#FFFFCC";
alert("用户名格式有误");
return false;
}
else if(uPwd.value == "") {
uPwd.style.backgroundColor = "#FFFFCC";
alert("请输入用户密码!");
uPwd.focus();
return false;
}
else if(uPwd.value.length<6 || uPwd.value.length>15){
uPwd.style.backgroundColor = "#FFFFCC";
alert("请检查密码的长度");
uPwd.focus();
return false;
}
else if(uPwd2.value == "") {
uPwd2.style.backgroundColor = "#FFFFCC";
alert("请输入确认密码!");
uPwd2.focus();
return false;
}
else if(uPwd.value != uPwd2.value ) {
uPwd2.style.backgroundColor = "#FFFFCC";
alert("密码与重复密码不一致!");
uPwd2.focus();
return false;
}
else if(question.value == "") {
question.style.backgroundColor = "#FFFFCC";
alert("请输入密码提示问题!");
question.focus();
return false;
}
else if(answer.value == "") {
answer.style.backgroundColor = "#FFFFCC";
alert("请输入密码提示答案!");
answer.focus();
return false;
}
else if(email.value == "") {
email.style.backgroundColor = "#FFFFCC";
alert("请输入电子信箱!");
email.focus();
return false;
}
Else if(email.value.search("^(?:\\w+\\.?)*\\w+@(?:\\w+\\.?)*\\w+$")!=0){
Email.style.backgroundColor = "#FFFFCC";
alert("email格式有误");
email.focus();
return false;
}
return true;
}
</script>
图4-4 后台管理员登录界面
管理员输入管理员名称和密码,进入系统后台。
检验管理员账号的代码如下:
session_start();
include_once("../configs/db_mysql.php");
$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);
$db->query("SELECT * FROM `tbl_admin` WHERE UserName='$username' and UserPwd='$password'");
if($db->next_record())
{
$_SESSION['login']['god'] = 1;
header("Location:index.php");
}
else
{
echo '<script language="javascript">
alert("用户名或者密码错误,请重新登录!");
location.href="userLogin.php";
</script>';
}
$db->free();
图4-5 系统后台首页
<?php include "left.php" ?>//调用后台左部文件
<div id="leftpart"> //系统左部文件
<ul>
<li><img src="images/admin1.gif" width="160" height="33"></li>
<li> <a href="addproduct.php" >添加教程</a></li>
<li> <a href="allproduct.php" >教程管理</a></li>
<li> <a href="addwenxian.php" >添加文献书籍</a></li>
<li> <a href="allwenxian.php" >文献书籍管理</a></li>
<li> <a href="addweb.php" >添加学习网站</a></li>
<li> <a href="allweb.php" >学习网站管理</a></li>
<li> <a href="addxzai.php" >添加下载资源</a></li>
<li> <a href="allxzai.php" >下载资源管理</a></li>
<li> <a href="alluser.php" >会员管理</a></li>
<li> <a href="admin_loginuser.php" >管理员管理</a></li>
<li> <a href="class.php" >论坛栏目管理</a></li>
<li> <a href="bbs.php" >论坛帖子管理</a></li>
<li> <a href="Logout.php" target="_top">安全退出</a></li>
<li><img src="images/admin3.gif" width="160" height="7"></li>
</ul>
</div>
- 查看所有教程
管理员成功登录以后,就进入系统的教程管理界面,浏览所有教程(如图4-6)。教程分页显示,每页10条。
图4-6 浏览教程
浏览教程代码:
$strSQL = "SELECT * FROM tbl_pagecontent where PageType=0 limit ".$PKey.",10"; $db->query($strSQL);
$dbs = new DB_Sql; $dbs->connect(DATABASE,DATABASEHOST,DATABASEUSER,DATABASEPASSWORD);
<?
while($db->next_record()){
?>
<li class="fivve">教程标题:<a href="../product_cont.php?id=<?=$db->f('Id')?>" target="_blank"><?=$db->f('PageTitle')?></a>
<a href="editproduct.php?id=<?=$db->f('Id')?>">修改</a>
<a οnclick='{if(confirm("您确定删除吗?此操作将不能恢复!")){return true;}return false;}' href="allproduct.php?id=<?=$db->f('Id')?>">删除</a>
</li>
}
(2)添加教程
管理员成功登录以后,可以在后台添加教程。教程名称和教程内容符合要求后,写入文章表。
图4-7 添加教程
(3)编辑教程
管理员也可以对教程进行编辑,取相应教程的ID号,传给编辑教程页面,根据ID号,从数据库取相应教程标题和文章内容,到编辑器里进行编辑。(如图4-8)
图4-8 编辑教程
(4)删除教程
管理员也可以对教程进行删除,点击删除弹出JS对话框。
οnclick='{if(confirm("您确定删除吗?此操作将不能恢复!")){return true;}return false;}'用户点击“确定”,返回真值。取相应教程的ID号,从数据库删除。(如图4-9)
图 4-9 删除教程页面
图4-10 分页页面
$strSQL = "SELECT COUNT(Id) As CNT FROM tbl_pagecontent where PageType=0"; $db->query($strSQL);
$db->next_record();
$intCount = $db->f("CNT");
$db->free();
if (($intCount % 10) > 0)
{ $pCount = floor($intCount / 10) + 1;
} else {
$pCount = $intCount / 10;
}
//计算开始ID
$Pages = $_GET['page'];
if ($Pages > $pCount) { $Pages = $pCount; }
if ($Pages < 1) { $Pages = 1; }
if (!$Pages)
{ $Pages = 1;
$PKey = 0;
} else {
$PKey = ($Pages - 1) * 10;}
//得到数据集,并显示数据
$strSQL = "SELECT * FROM tbl_pagecontent where PageType=0 limit ".$PKey.",10";
$db->query($strSQL);
$dbs = new DB_Sql;
$dbs->connect(DATABASE,DATABASEHOST,DATABASEUSER,DATABASEPASSWORD);
<? while($db->next_record()){
?>
<li class="fivve">第<?=$Pages?>页 共<?=$pCount?>页 <a href="?page=1<?=$url?>">【第一页】</a> <a href="?page=<?=($Pages - 1).$url ?>">【上一页】</a> <a href="?page=<?=($Pages + 1).$url ?>">【下一页】</a> <a href="?page=<? echo($pCount).$url ?>">【最后一页】</a></li>
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者