一、项目概况
项目简介:完善博客功能。
使用技术:PHP、html、css、JavaScript
工具:mysql5.0、Apache2.0、PHP5.0
工作内容:1、查询博客文章。文章管理菜单下的查询博客文章功能。
2、日历搜索文章。在首页的日历检索功能。用户可查看某天发布的所有博文标题。功能描述:用户通过日历栏选择具体的日期(年/月/日),所选日期发布的全部博文按照发布日期倒序排列,在首页的右侧。
3、管理员的文章信息统计。用于统计所有博文的浏览次数、评论次数。列表信息包括但不限于:博文题目、发布日期、浏览次数、评论次数。结果按照浏览次数排序。
二、系统基础功能的设计与实现
基础博客系统的架构设计
功能
博客主页:
添加博客:
查询博客文章:
图片管理:
用户管理:
公告管理:
三、系统扩展功能的设计与实现
1、查询博客文章。文章管理菜单下的查询博客文章功能。
代码
1.<tr>
2. <td height="223" align="center" valign="top">
3. <?php
4. if (isset($_POST[sel_key])){
5. $tj=$_POST[sel_tj];
6. $key=$_POST[sel_key];
7.
8. $sql=mysql_query("select * from tb_article where $tj='$key'");
9. $result=mysql_fetch_array($sql);
10. //if(mysql_num_rows($rst) == 0){
11. if($result==false){
12. echo "[<font color=red>对不起,您检索的文章信息不存在!</font>]";
13. }
14. else{
15. ?>
16. <table width="560" border="1" align="center" cellpadding="3" cellspacing="1" bordercolor="#9CC739" bgcolor="#FFFFFF">
17. <tr align="left" colspan="2" >
18. <td width="390" height="25" colspan="3" valign="top" bgcolor="#EFF7DE"> <span class="tableBorder_LTR"> 博客文章</span> </td>
19. </tr>
20. <td align="center" valign="top" ><table width="480" border="0" cellpadding="0" cellspacing="0">
21. <tr>
22. <td height="100" valign="top">
23. <?php
24. do{
25. ?>
26. <table width="100%" border="1" cellpadding="1" cellspacing="1" bordercolor="#D6E7A5" bgcolor="#FFFFFF" class="i_table">
27. <tr bgcolor="#FFFFFF">
28. <td width="14%" align="center">博客ID号</td>
29. <td width="15%"><?php echo $result[id]; ?></td>
30. <td width="11%" align="center">作
31. 者</td>
32. <td width="18%"><?php echo $result[author]; ?></td>
33. <td width="12%" align="center">发表时间</td>
34. <td width="30%"><?php echo $result[subtime]; ?></td>
35. </tr>
36. <tr bgcolor="#FFFFFF">
37. <td align="center">博客主题</td>
38. <td colspan="5"> <?php echo $result[title]; ?></td>
39. </tr>
40. <tr bgcolor="#FFFFFF">
41. <td align="center">文章内容</td>
42. <td colspan="5"><?php echo $result[content]; ?></td>
43. </tr>
44. <tr bgcolor="#FFFFFF">
45. <td colspan="3" align="center"><a href="comment.php?file_id=<?php echo $result[id]; ?>">发表评论</a></td>
46. <td colspan="3" align="center">
47. <?php
48. if($_SESSION[fig]==1){
49. ?>
50. <a href="del_file.php?file_id=<?php echo $result[id];?>"><img src="images/A_delete.gif" width="52" height="16" alt="删除博客文章" onClick="return d_chk();"></a>
51. <?php
52. }
53. ?> </td>
54. </tr>
55. </table>
56. <?php
57. }while($result = mysql_fetch_array($sql));
58. ?></td>
59. </tr>
60. </table></td>
61. </table>
62. <?php
63. }
64. }
65. ?>
66. </td>
67. </tr>
2、日历搜索文章。在首页的日历检索功能。用户可查看某天发布的所有博文标题。功能描述:用户通过日历栏选择具体的日期(年/月/日),所选日期发布的全部博文按照发布日期倒序排列,在首页的右侧。
代码
1.function present_article(){
2.$sql=mysql_query("select * from tb_article where date_format(subtime,'%Y-%m')='".$this->year."-".$this->month."'ORDER BY subtime DESC");
3.$result=mysql_fetch_array($sql);
4.echo($result);
5.//echo('".$this->$year."-".$this->$month."')
6. if($result==false){
7.
8. }
9. else{
10. ?>
11. <table class="tableBorder_A" width="0" border="1" align="center" cellpadding="3" cellspacing="1" bordercolor="#f4c871" bgcolor="#FFFFFF">
12. <tr align="left" colspan="2" >
13. <td width="390" height="25" colspan="3" valign="top" bgcolor="#ffeecc"> <span class="tableBorder_LTR"> Blog post</span> </td>
14. </tr>
15. <td align="center" valign="top" ><table width="480" border="0" cellpadding="0" cellspacing="0">
16. <tr>
17. <td height="100" valign="top">
18. <?php
19. do{
20. ?>
21. <table width="100%" border="1" cellpadding="1" cellspacing="1" bordercolor="#ffeecc" bgcolor="#fff7e5" class="i_table1">
22. <tr bgcolor="#fff7e5">
23. <td width="14%" align="center">ID</td>
24. <td width="15%"><?php echo $result[id]; ?></td>
25. <td width="11%" align="center">author</td>
26. <td width="18%"><?php echo $result[author]; ?></td>
27. <td width="12%" align="center">Time of publication</td>
28. <td width="30%"><?php echo $result[subtime]; ?></td>
29. </tr>
30. <tr bgcolor="#fff7e5">
31. <td align="center">theme</td>
32. <td colspan="5"> <?php echo $result[title]; ?></td>
33. </tr>
34. <tr bgcolor="#fff7e5">
35. <td align="center">content</td>
36. <td colspan="5"><?php echo $result[content]; ?></td>
37. </tr>
38. </table>
39. <?php
40. }while($result = mysql_fetch_array($sql));
41. ?></td>
42. </tr>
43. </table></td>
44. </table>
45. <?php
46. }
47.}
3、管理员的文章信息统计。用于统计所有博文的浏览次数、评论次数。列表信息包括但不限于:博文题目、发布日期、浏览次数、评论次数。结果按照浏览次数排序。
代码
1.<!-- 浏览数 -->
2. <?php
3. session_start(); //定义session,同一IP登录不累加
4. $filepath = 'count.txt'; //count.txt 统计次数
5. //counter()方法用来得到文件内的数字
6. function counter($f_value)
7. {
8. //用w模式打开文件时会清空里面的内容,所以先用r模式打开,取出文件内容,保存到变量
9. $fp = fopen($f_value,'r') or die('打开文件时出错。');
10. $countNum = fgets($fp,1024);
11. fclose($fp);
12. $countNum++;
13. $fpw = fopen($f_value,'w');
14. fwrite($fpw,$countNum);
15. fclose($fpw);
16. }
17. if($_SESSION['temp'] == ''){ //判断$_SESSION[temp]的值是否为空,其中的temp为自定义的变量
18. if (!file_exists($filepath)){
19. //检查文件是否存在,不存在刚新建该文件并赋值为0
20. $fp = fopen($filepath,'w');
21. fwrite($fp,0);
22. fclose($fp);
23. counter($filepath);
24. }else{
25. counter($filepath);
26. }
27. $_SESSION['temp'] = 1; //登录以后,给$_SESSION[temp]赋一个值1
28. }
29.
30.
31. //注释下面一行可以实现同一IP登录不累加效果,测试时可以打开
32. // session_destroy();
33.
34.
35. ?>
四、实践心得体会
1.MVC是一种软件工程中的一种软件架构模式,把软件系统划分为三个基本结构部分,分别是模型(model)、视图(view)、控制器(controller),所以简称为MVC。
其中M(模型)就是业务流程、业务状态的处理、业务规范的规定。模型接受视图数据的请求,并返回最终的处理结果。整个model的设计是MVC模式的核心;
V(视图)是用户看到的并与之交互的界面信息,比如:html文件、jsp文件、ASP文件、php文件等。
而C(控制器):控制器是用户请求的处理,对用户的请求提交给模型进行数据的处理,并负责请求的转发等等。
MVC模式的优点是可以实现显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序开发难度,降低了后期维护的难度;而且使一个模型可以适用于多个视图中,增加了视图与控制器的可插拔性;且提高了模型的可移植性,因为模型是独立于视图的。
2.约定优于配置,也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。Yii中对于action通配符的规范,XyzController.php中若有一个名为 actionEdit() 的方法,那么体现在网页URL上,就是是除去action前缀的动作函数名。即/xyz/edit。
3.ORM是对象-关系-映射的简称。框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
Active Record模式是软件里的一种架构性模式,主要概念是关系型数据库中的数据在内存中以对象的形式存储。遵循该模式的对象接口一般包括如Insert, Update, 和 Delete这样的函数,以及对应于底层数据库表字段的相关属性。
AR模式是一种访问数据库数据的方式。数据表或视图被映射成一个类。每个对象实例则对应于表的一条记录。对象被创建后,通过save就可以向表中新添一行记录。当对象被更新时,表中相应记录也被更新。这个包裹类通过属性或方法的形式实现访问表或视图中的每一个字段。
该模式主要被对象持久化工具采用,用于对象关系映射 (ORM). 典型的,外键关系会以合适的对象实例属性的形式暴露访问。
4.Gii 是一个强大的代码生成器,主要用于后台代码生成。在编写程序代码时,通常每个功能模块的基础维护代码逻辑都相同,只是针对的表不同, 根据这其中的规律做成模板,机器就可以根据模板来生成代码了。这样就避开了那些枯燥的重复劳动,使开发人员将时间和精力集中于核心业务,既节省了开发人员的工作时间,也为企业节省了成本。代码生成器通过模板技术解决了传统的代码生成器生成的代码比较单一,与本地开发环境不匹配,也打破了对编程语言的限制。缺点在于错误会被放大,1个Bug可能会产生许多bug,且代码生成器本身就难写。
代码模板的定制:
假设我们想要定制由 model 生成器生成的代码。
我们首先创建一个名为 protected/gii/model/templates/compact的目录。这里的model意味着将要override默认的model生成器。templates/compact意味着将增加一个新的代码模板集名为 compact。
然后在应用程序配置里把 application.gi增加到GiiModule::generatorPaths。
复制文件framework/gii/generators/model/templates/default/model.ph到 protected/gii/model/templates/compact。
打开文件protected/gii/model/templates/compact/model.php以编辑它。记得这个文件将作为类似一个视图文件被使用,意味着它可以包含 PHP 表达式和语句。让我们更改模板以便生成的代码里 attributeLabels()方法使用 Yii::t()来翻译属性标签:
public function attributeLabels()
{
return array(
<?php echo "'$name' => Yii::t('application', '$label'),\n"; ?>
);
}
在每个代码模板中,可以访问一些预定义的变量,例如上面例子中的 $labels。这些变量由对应的代码生成器提供。不同的代码生成器可能在他们的代码模板中提供不同的变量。需要认真阅读默认代码模板中的描述。
5.查询构建器也是建立在 DAO 基础之上,可让你创建程序化的、DBMS 无关的 sql 语句,并且这样创建的 sql 语句比原生的sql 语句更易读、更安全。而且,一旦你的sql很长,query builder构建的sql语句,可读性也会更强
6.RBAC是基于角色的访问控制。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。RBAC认为授权实际上是Who、What、How三元组之间的关系,也就是Who对What进行How的操作,也就是“主体”对“客体”的操作。Who是权限的拥有者或主体(如:User,Role)。What是操作或对象。How:具体的权限(Privilege,正向授权与负向授权)。对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。角色在用户和权限间起到桥梁作用。
7.Bootstrap有移动设备优先的特点,自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式。而且所有的主流浏览器都支持 Bootstrap。 Bootstrap 的响应式 CSS 能够自适应于台式机、平板电脑和手机。更多有关响应式设计的内容详见 Bootstrap 响应式设计。为开发人员创建接口提供了一个简洁统一的解决方案。它包含了功能强大的内置组件,易于定制。它还提供了基于 Web 的定制。且是开源的。可以定制 Bootstrap 的组件、LESS 变量和 jQuery 插件来得到自己的版本。
8.UrlRewrite技术可以满足搜索引擎的要求某些搜索引擎不能支持动态页面的抓取,大量的信息就不能被潜在用户搜索到。UrlRewrite技术可以使其被搜索引擎收录了。隐藏技术实现,提高网站的移植性。每个页面都挂着鲜明的.asp/.jsp这种开发语言的标记,可以一眼让人看出你的网站使用什么语言做的。而且在改变网站的语言的时候,你需要改动大量的链接。而且,一个页面修改了扩展名,他的pagerank也会随之消失,从头开始。我们可以用UrlRewrite技术隐藏我们的实现细节,这样修改移植都很方便,而且完全不损失pagerank。满足美感的要求
URL rewrite实现机制是首先获得一个进入的URL请求然后把它重新写成网站可以 处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是 “UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”,这样的URL, 这样的网址可以更好的被网站所阅读。或者把会话ID附加在HTML页面中所有的 URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,会话ID被自 动作为请求行的一部分而不是作为头行发送回服务器。
9.浏览器缓存机制就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中。使用缓存可以减少网络带宽消耗,可以有效的降低运营成本。同时可以降低服务器压力,给网络资源设定有效期之后,用户可以重复使用本地的缓存,减少对源服务器的请求,间接降低服务器的压力。同时,搜索引擎的爬虫机器人也能根据过期机制降低爬取的频率,也能有效降低服务器的压力。最后可以减少网络延迟,加快页面打开速度,达到更好的体验。
缓存会根据进来的请求保存输出内容的副本。当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过网站的网页,当再次访问这个URL地址的时候,如果网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页。