当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

10.5.1文件组织结构

9/17/2020 9:37:07 PM 人评论

10.5.1文件组织结构

10.5 新闻发布系统系统实施

设计阶段完成后,在将系统移交给用户前的一系列活动叫做系统实施。新闻发布系统涉及新闻管理、评论管理、类别管理和用户管理等功能,这里以新闻管理和评论管理为例着重介绍这两个功能的实施过程。

10.5.1 文件组织结构

在“C:\wamp\www”目录下创建“news”目录,在“news”目录下创建如图10-18所示的目录或文件。

figure_0218_0296
图10-18 新闻发布系统文件组织结构

10.5.2 数据库的实施

在“C:\wamp\www\news”目录下创建news.sql脚本文件,news.sql脚本文件首先设置存储引擎为InnoDB,然后设置字符集为gbk,接着创建news数据库,并在该数据库中创建category表、users表、news表和review表。SQL语句如下。

set table_type=InnoDB;

show variables like 'table_type';

SET character_set_client = gbk ;

SET character_set_connection = gbk ;

SET character_set_database = gbk ;

SET character_set_results = gbk ;

SET character_set_server = gbk ;

SET collation_connection = gbk_chinese_ci ;

SET collation_database = gbk_chinese_ci ;

SET collation_server = gbk_chinese_ci ;

show variables like 'character%';

show variables like 'collation%';

create database news;

use news;

create table category(

category_id int auto_increment primary key,

name char(20) not null

);

create table users(

user_id int auto_increment primary key,

name char(20) not null,

password char(32)

);

create table news(

news_id int auto_increment primary key,

user_id int,

category_id int,

title char(100) not null,

content text,

publish_time datetime,

clicked int,

attachment char(100),

constraint FK_news_user foreign key (user_id) references users(user_id),

constraint FK_news_category foreign key (category_id) references category(category_id)

);

create table review(

review_id int auto_increment primary key,

news_id int,

content text,

publish_time datetime,

state char(10),

ip char(15),

constraint FK_review_news foreign key (news_id) references news(news_id)

);

在MySQl Console命令窗口中输入命令“\. C:\wamp\www\news\news.sql”运行news.sql脚本文件中的SQL语句,创建新闻发布系统所需的数据库及数据库表。

10.5.3 新闻管理和评论管理功能的实施

新闻管理和评论管理是新闻发布系统的核心功能,下面以新闻管理和评论管理为例详细讲解这两个功能的实施步骤。

(1)制作MySQL服务器连接函数和文件上传函数。

在“C:\wamp\www\news\functions”目录下创建 database.php 文件,database.php 程序用于实现MySQL服务器连接的开启和关闭。database.php代码如下。

<?php

$database_connection = null;

function get_connection(){

$hostname = "localhost";  //数据库服务器主机名,可以用IP代替

$database = "news";   //数据库名

$username = "root";   //数据库服务器用户名

$password = "";    //数据库服务器密码

global $database_connection;

$database_connection = @mysql_connect($hostname, $username, $password) ordie(mysql_error());     //连接数据库服务器

mysql_query("set names 'gbk'"); //设置字符集

@mysql_select_db($database, $database_connection) or die(mysql_error());

}

function close_connection(){

global $database_connection;

if($database_connection){

mysql_close($database_connection) or die(mysql_error());

}

}

?>

(2)向数据库中添加测试数据的程序init.php。

在“C:\wamp\www\news\”目录下创建init.php文件,init.php程序负责向用户表users中添加一个管理员用户(用户名为admin、密码为admin的两次md5加密),向新闻类别category表中添加娱乐和财经类别。init.php代码如下。

<?php

include_once("functions/database.php");

get_connection();

//添加新闻类别

mysql_query("insert into category values(null,'娱乐')");

mysql_query("insert into category values(null,'财经')");

//添加管理员用户admin,密码admin经过MD5函数双重加密

$password = md5(md5("admin"));

mysql_query("insert into users values(null,'admin','$password')");

close_connection();

echo "成功添加初始化数据";

?>

打开浏览器,在地址栏中输入“http://localhost/news/init.php”,运行init.php页面后users表以及category表中将添加特定的记录信息。

(3)创建新闻添加页面news_add.php。

在“C:\wamp\www\news\”目录下创建news_add.php文件,在该文件中添加form表单为浏览器用户提供输入数据的界面,news_add.php代码如下。

<form action="news_save.php" method="post" enctype="multipart/form-data">

标题:<input type="text" size="60" name="title"><br/>

内容:<textarea cols="60" rows="16" name="content"></textarea><br/>

类别:

<select name="category_id" size="1">

<?php

include_once("functions/database.php");

get_connection();

$result_set = mysql_query("select * from category");

close_connection();

while($row = mysql_fetch_array($result_set)){

?>

<option value="<?php echo $row['category_id'];?>"><?php echo $row['name'];?></option>

<?php

}

?>

</select><br/>

附件:<input type="file" name="news_file" size="50">

<input type="hidden" name="MAX_FILE_SIZE" value="10485760">

<br/>

<input type="submit" value="提交"><input type="reset" value="重置">

</form>

由于新闻的类别信息保存在数据库表category中,粗体字代码的功能是:从数据库表category中提取“类别”数据,然后生成新闻类别下拉选择框。

(4)创建文件管理页面file_system.php。

在“C:\wamp\www\news\functions”目录下创建file_system.php文件,file_system.php文件中提供了实现文件上传功能upload()函数和下载功能download()函数。先在file_system.php文件中编写文件上传函数upload(),file_system.php代码如下。

<?php

function upload($file,$file_path){

$error = $file['error'];

switch ($error){

case 0:

$file_name = $file['name'];

$file_temp = $file['tmp_name'];

$destination = $file_path."/".$file_name;

move_uploaded_file($file_temp,$destination);

return "文件上传成功!";

case 1:

return "上传附件超过了php.ini中upload_max_filesize选项限制的值!";

case 2:

return "上传附件的大小超过了form表单MAX_FILE_SIZE选项指定的值!";

case 3:

return "附件只有部分被上传!";

case 4:

return "没有选择上传附件!";

}

}

?>

(5)创建新闻信息保存页面news_save.php。

在“C:\wamp\www\news\”目录下创建news_save.php文件,该程序实现的功能依次为:采集新闻的标题和内容信息;设置新闻的发布时间为WEB服务器时间;设置新闻的浏览次数为0;设置新闻的发布者ID为1;上传新闻附件到uploads目录;附件上传成功后将新闻信息添加到数据库表中;将页面重定向到新闻标题列表页面news_list.php,并向news_list.php页面传递附件上传消息。news_save.php代码如下。

<?php

include_once("functions/file_system.php");

if(empty($_POST)){

$message = "上传的文件超过了php.ini中post_max_size选项限制的值";

}else{

$user_id = 1;

$category_id = $_POST["category_id"];

$title = $_POST["title"];

$content = $_POST["content"];

$currentDate = date("Y-m-d H:i:s");

$clicked = 0;

$file_name = $_FILES["news_file"]["name"];

$message = upload($_FILES["news_file"],"uploads");

$sql = "insert into news

values(null,$user_id,$category_id,'$title','$content', '$currentDate',$clicked,'$file_name')";

if($message=="文件上传成功!"||$message=="没有选择上传附件!"){

include_once("functions/database.php");

get_connection();

mysql_query($sql);

close_connection();

}

}

header("Location:news_list.php?message=$message");

?>

程序news_save.php中使用到了header("Location:URL")函数的重定向功能。

(6)创建新闻标题列表显示页面news_list.php。

在“C:\wamp\www\news\”目录下创建 news_list.php 文件,该程序实现的功能依次为:显示文件上传的状态信息;提供一个新闻模糊查询的 form 表单;按照新闻发布时间降序显示新闻的标题以及编辑和删除超链接;当单击新闻标题的超级链接时进入新闻详细信息页面news_detail.php,查看新闻详细信息;当单击编辑超链接时进入新闻编辑页面news_edit.php,实现对新闻的编辑;当点击删除超链接时进入新闻删除页面 news_delete.php,实现对新闻信息的删除。news_list.php代码如下。

<?php

include_once("functions/database.php");

//显示文件上传的状态信息

if(isset($_GET["message"])){

echo $_GET["message"]."<br/>";

}

//构造查询所有新闻的SQL语句

$search_sql = "select * from news order by news_id desc";

//若进行模糊查询,取得模糊查询的关键字keyword

$keyword = "";

if(isset($_GET["keyword"])){

$keyword = $_GET["keyword"];

//构造模糊查询新闻的SQL语句

$search_sql = "select * from news where title like '%$keyword%' or content like '%$keyword%' order by news_id desc";

}

//提供进行模糊查询的form表单

?>

<form action="news_list.php" method="get">

请输入关键字:<input type="text" name="keyword" value="<?php echo $keyword?>">

<input type="submit" value="搜索">

</form>

<br/>

<table>

<?php

get_connection();

$result_set = mysql_query($search_sql);

close_connection();

if(mysql_num_rows($result_set)==0){

exit("暂无记录!");

}

while($row = mysql_fetch_array($result_set)){

?>

<tr>

<td>

<a href="news_detail.php?news_id=<?php echo $row['news_id']?>"><?php echo $row['title']?></a>

</td>

<td>

<a href="news_edit.php?news_id=<?php echo $row['news_id']?>">编辑</a>

</td>

<td>

<a href="news_delete.php?news_id=<?php echo $row['news_id']?>">删除</a>

</td>

</tr>

<?php

}

?>

</table>

在浏览器地址栏中输入“http://localhost/news/news/news_add.php”打开news_add.php页面,然后在该页面中填写测试数据,如图10-19所示。单击news_add.php页面中的“提交”按钮,页面被重定向到news_list.php程序,该程序的运行结果如图10-20所示。

figure_0223_0297
图10-19 新闻添加页面
figure_0223_0298
图10-20 新闻标题列表显示页面

news_list.php程序说明如下。

① 程序 news_list.php 存在两个入口:直接打开浏览器并在浏览器地址栏中输入“http://localhost/news/news/news_list.php”时可以访问news_list.php页面;新闻信息添加成功后也可以由news_save.php页面重定向到news_list.php页面。

② 在图10-20中的关键字表单中输入关键字,单击“搜索”按钮后,触发news_list.php的模糊查询功能。

(7)创建新闻信息的编辑页面news_edit.php。

在“C:\wamp\www\news\”目录下创建news_edit.php文件,该程序实现的功能是:当单击新闻标题列表页面news_list.php中的“编辑”超链接时,news_edit.php页面从数据库中查询指定新闻的详细信息并显示在编辑页面news_edit.php中,新闻内容进入编辑状态。news_edit.php代码如下。

<?php

include_once("functions/database.php");

$news_id = $_GET["news_id"];

get_connection();

$result_news = mysql_query("select * from news where news_id=$news_id");

$result_category = mysql_query("select * from category");

close_connection();

$news = mysql_fetch_array($result_news);

?>

<form action="news_update.php" method="post">

标题:<input type="text" size="60" name="title" value="<?php echo $news['title']?>"><br/>

内容:<textarea cols="60" rows="16" name="content"><?php echo $news['content']?></textarea><br/>

类别:<select name="category_id" size="1">

<?php

while($category = mysql_fetch_array($result_category)){

?>

<option value="<?php echo $category['category_id'];?>" <?php echo ($news ['category_id']==$category['category_id'])?"selected":""?>><?php echo $category ['name'];?></option>

<?php

}

?>

</select><br/>

<br/>

<input type="hidden" name="news_id" value="<?php echo $news_id?>">

<input type="submit" value="修改">

</form>

说明:程序news_edit.php中使用条件运算符(exp1) ? (exp2) : (exp3)实现了下拉选择框的默认选中状态(见粗体字部分代码)。

(8)创建新闻信息的修改页面news_update.php。

在“C:\wamp\www\news\”目录下创建 news_update.php 文件,该程序实现的功能是:单击news_edit.php页面的“修改”按钮时,修改指定新闻的信息,然后将页面重定向到news_list.php页面,并向news_list.php页面传递“新闻信息修改成功!”信息。news_update.php代码如下。

<?php

include_once("functions/database.php");

$news_id = $_POST["news_id"];

$category_id = $_POST["category_id"];

$title = $_POST["title"];

$content = $_POST["content"];

$sql = "update news set category_id=$category_id,title='$title',content='$content' where news_id=$news_id";

get_connection();

mysql_query($sql);

close_connection();

$message = "新闻信息修改成功!";

header("Location:news_list.php?message=$message");

?>

此时news_list.php页面又多了一个入口:可以从news_update.php页面重定向到news_list.php页面。

(9)创建新闻信息的删除页面news_delete.php。

在“C:\wamp\www\news\”目录下创建 news_delete.php 文件,该页面实现的功能是:单击news_list.php页面的“删除”超链接时,从数据库中删除指定新闻然后重定向到新闻标题列表页面news_list.php,并向news_list.php页面传递“新闻信息删除成功!”消息。news_delete.php代码如下。

<?php

include_once("functions/database.php");

$news_id = $_GET["news_id"];

get_connection();

mysql_query("delete from review where news_id=$news_id");

mysql_query("delete from news where news_id=$news_id");

close_connection();

$message = "新闻及相关评论信息删除成功!";

header("Location:news_list.php?message=$message");

?>

此时news_list.php页面又多了一个入口:可以从news_delete.php页面重定向到news_list.php页面。在删除新闻信息的过程中,若该新闻存在评论信息,由于新闻表news和评论表review之间的外键约束关系,该新闻将删除失败。因此若想成功删除新闻信息,建议先删除新闻的所有评论,然后再删除该新闻信息。

(10)创建查看新闻详细信息页面news_detail.php。

打开新闻标题列表显示页面news_list.php后,单击新闻标题的超级链接后可以查看该新闻的详细信息。在“C:\wamp\www\news\”目录下创建 news_detail.php 文件,该程序实现的功能依次为:将该新闻的浏览次数加1;显示该新闻详细信息(标题、内容、发布者、类别等信息);该新闻若有“已审核”评论则显示“共有**条评论”的超链接,否则显示“暂无评论”;提供“添加评论”的form表单供浏览器用户为该新闻发表评论。news_detail.php代码如下。

<?php

include_once("functions/database.php");

$news_id = $_GET["news_id"];

//构造3条SQL语句

$sql_news_update = "update news set clicked=clicked+1 where news_id=$news_id";

$sql_news_detail = "select * from news where news_id=$news_id";

$sql_review_query = "select * from review where news_id=$news_id and state='已审核'";

//执行3条SQL语句

get_connection();

mysql_query($sql_news_update);

$result_news = mysql_query($sql_news_detail);

$result_review = mysql_query($sql_review_query);

//取出结果集中新闻条数

$count_news = mysql_numRows($result_news);

//取出结果集中该新闻"已审核"的评论条数

$count_review = mysql_numRows($result_review);

if($count_news==0){

echo "该新闻不存在或已被删除!";

exit;

}

//根据新闻信息中的user_id查询对应的用户信息

$news = mysql_fetch_array($result_news);

$user_id = $news["user_id"];

$sql_user = "select * from users where user_id=$user_id";

$result_user = mysql_query($sql_user);

$user = mysql_fetch_array($result_user);

//根据新闻信息中的category_id查询对应的新闻类别信息

$category_id = $news["category_id"];

$sql_category = "select * from category where category_id=$category_id";

$result_category = mysql_query($sql_category);

$category = mysql_fetch_array($result_category);

close_connection();

mysql_free_result($result_user);

mysql_free_result($result_category);

mysql_free_result($result_news);

mysql_free_result($result_review);

//显示新闻详细信息

?>

<table>

<tr><td width="80">标题:</td><td><?php echo $news['title'];?></td></tr>

<tr><td width="80">内容:</td><td><?php echo $news['content'];?></td></tr>

<tr><td width="80"> 附 件 : </td><td><a href="download.php?attachment=<?php echo $news['attachment'];?>"><?php echo $news['attachment'];?></a></td></tr>

<tr><td width="80">发布者:</td><td><?php echo $user['name'];?></td></tr>

<tr><td width="80">类别:</td><td><?php echo $category['name'];?></td></tr>

<tr><td width="80">发布时间:</td><td><?php echo $news['publish_time'];?></td></tr>

<tr><td width="80">点击次数:</td><td><?php echo $news['clicked'];?></td></tr>

</table>

<?php

//显示查看评论超链接

if($count_review>0){

echo "<a href='review_news_list.php?news_id=".$news['news_id']."'> 共 有".$count_review."条评论</a><br/>";

}else{

echo "该新闻暂无评论!<br/>";

}

?>

<br/>

<form action="review_save.php" method="post">

添加评论:<textarea name="content" cols="50" rows="5"></textarea><br/>

<input type="hidden" name="news_id" value="<?php echo $news['news_id'];?>">

<input type="submit" value="评论">

</form>

(11)制作文件下载函数download()。

由于文件下载是WEB系统中较为常用的功能,有必要将下载功能的PHP代码封装成函数。在“C:\wamp\www\news\functions”目录的file_system.php文件中添加download()函数,该函数完成的功能是下载存放在目录$file_dir中文件名为$file_name的文件。download()函数的代码如下。

function download($file_dir,$file_name){

if (!file_exists($file_dir.$file_name)) { //检查文件是否存在

exit("文件不存在或已删除");

} else {

$file = fopen($file_dir.$file_name,"r"); // 打开文件

//强迫浏览器显示保存对话框,并提供一个推荐的文件名

header("Content-Disposition: attachment; filename=".$file_name);

// 输出文件内容

echo fread($file,filesize($file_dir.$file_name));

fclose($file);

exit;

}

}

(12)文件下载功能的实现。

在“C:\wamp\www\news”目录下创建 download.php 文件,download.php 程序负责下载服务器“/news/uploads/”目录下的某个文件。当单击查看新闻详细信息news_detail.php页面的“附件名”超链接时,下载该文件到本地机。download.php代码如下。

<?php

include_once("functions/file_system.php");

$file_name = $_GET["attachment"];

download("uploads/","$file_name");

?>

(13)创建保存新闻评论页面review_save.php。

在“C:\wamp\www\news\”目录下创建review_save.php文件,该程序实现的功能是:普通用户在news_detail.php页面中输入指定新闻的评论信息,单击“评论”按钮后,review_save.php程序负责将该新闻的评论信息添加到数据库表review中,然后将页面重定向到news_list.php页面,并向news_list.php页面传递“该新闻的评论信息成功添加到数据库表中!”消息。review_save.php代码如下。

<?php

include_once("functions/database.php");

$news_id = $_POST["news_id"];

$content = $_POST["content"];

$currentDate = date("Y-m-d H:i:s");

$ip = $_SERVER["REMOTE_ADDR"];

$state = "未审核";

$sql = "insert into review values(null,$news_id,'$content','$currentDate','$state','$ip')";

get_connection();

mysql_query($sql);

close_connection();

$message = "该新闻的评论信息成功添加到数据库表中!";

header("Location:news_list.php?message=$message");

?>

(14)创建查看所有评论信息页面review_list.php。

在“C:\wamp\www\news\”目录下创建review_list.php文件,review_list.php程序实现的功能是:将数据库中所有评论信息显示出来(评论信息按review_id倒序排列),并为每条“未审核”的评论提供“删除”和“审核”超链接。review_list.php代码如下。

<?php

include_once("functions/database.php");

$sql = "select * from review order by review_id desc";

get_connection();

$result_set = mysql_query($sql);

close_connection();

echo "系统所有评论信息如下:<br/>";

while($row = mysql_fetch_array($result_set)){

echo "评论内容:".$row["content"]."<br/>";

echo "日期:".$row["publish_time"]." ";

echo "IP地址:".$row["ip"]." ";

echo "状态:".$row["state"]."<br/>";

echo "<a href='review_delete.php?review_id=".$row["review_id"]."'>删除</a>";

echo " ";

if($row["state"]=="未审核"){

echo "<a href='review_verify.php?review_id=".$row["review_id"]."'>审核</a>";

}

echo "<hr/>";

}

?>

(15)创建评论的审核页面review_verify.php。

在“C:\wamp\www\news\”目录下创建 review_verify.php 文件,该程序实现的功能是:将指定的新闻评论从“未审核”状态修改为“已审核”状态,然后将页面重定向到 review_list.php 页面,重新显示新闻发布系统所有评论信息。review_verify.php代码如下。

<?php

include_once("functions/database.php");

$review_id = $_GET["review_id"];

$sql = "update review set state='已审核' where review_id=$review_id";

get_connection();

mysql_query($sql);

close_connection();

header("Location:review_list.php");

?>

(16)创建显示指定新闻的评论列表页面review_news_list.php。

在“C:\wamp\www\news\”目录下创建review_news_list.php文件,该程序的功能是显示指定新闻的所有“已审核”评论。当单击新闻详细信息页面news_detail.php中的“共有**条评论”超链接时,显示该新闻所有“已审核”的评论信息,评论信息按 review_id 倒序排列。review_news_list.php代码如下。

<?php

include_once("functions/database.php");

$news_id = $_GET["news_id"];

$sql = "select * from review where news_id=$news_id and state='已审核' order by review_id desc";

get_connection();

$result_set = mysql_query($sql);

close_connection();

echo "该新闻的评论如下:<br/>";

while($row = mysql_fetch_array($result_set)){

echo "评论内容:".$row["content"]."<br/>";

echo "评论日期:".$row["publish_time"]."<br/>";

echo "评论IP地址:".$row["ip"]."<hr/>";

}

?>

(17)创建删除评论页面review_delete.php。

在“C:\wamp\www\news\”目录下创建 review_delete.php 文件,该程序实现的功能是:将指定的新闻评论从数据库表中删除,然后将页面重定向到review_list.php页面,显示所有评论信息。review_delete.php代码如下。

<?php

include_once("../functions/database.php");

$review_id = $_GET["review_id"];

$sql = "delete from review where review_id=$review_id";

get_connection();

$result_set = mysql_query($sql);

close_connection();

header("Location:review_list.php");

?>

至此,新闻发布系统有关新闻管理和评论管理等基本功能已经实现。

上一篇:10.4.1系统流程图

下一篇:10.6.1分页原理

相关教程

共有条评论 网友评论

验证码: 看不清楚?