您现在的位置:主页 > 6h58ocm >

BBS讨论区模块设计

发布日期:2020-11-21 01:44   来源:未知   阅读:

  顶部文件中除了用于输出两个 PHP 变量$page_title 和$page_caption 的语句外,几乎全 HTML代码组成。这些 HTML 代码前后部分指定了页面中显示文本的默认字符集 (gb2312),引入了外部的CSS 文件(style.css)和引入了公用的JavaScript 文件(op.js),这 些文件可以在本书附带光盘中找到。后半部分的 HTML 代码是由一个

  标签包含的内 容,其中设定了页面顶部的背景色和 logo 图片,并预留了输出页面标题的位置。服务器端 的PHP 代码输出的两个PHP 变量的内容,分别包含显示在浏览器标题栏的标题($page_title) 和显示在页面的顶部的标题($page_caption)。 底部公用文件(footer.inc.php)的代码,如下所示:

  底部文件的代码很简单,就是一个HTML 表格,其中设置了背景色和一个右对齐的logo 图片。 下面是一个测试文件,测试下这两个文件的效果。测试 test_header_footer.php 文件的 代码如下:

  m_id $id;$this-

  m_has_child $has_child;$this-

  m_title $title;$this-

  m_username $username;$this-

  m_user_name $user_name;$this-

  m_post_time $post_time;$this-

  m_ip $ip;$this-

  m_childlist array();$this-

  m_depth 如果有孩子节点,将孩子节点找出来放入成员变量$m_childlist数组中 $conn db_connect();$sql U.f_nameFROM t_article WHEREA.f_username=U.f_username A.f_post_time;$result $conn-

  query($sql);if(!$has_child) return; @$result-

  fetch_assoc();$count++) newTreeNode($board_id, $row[f_id], $row[f_has_child], $row[f_title], $row[f_username], $row[f_name], $row[f_post_time], $row[f_ip], $depth endfunction __construct 显示函数,树节点必须负责显示自己 $row为行号,用于交错显示不同的背景色 function display($row) 如果是空的根节点则不显示if($this-

  m_id}

  {$this-

  \n; 增加行号$row++; 显示孩子节点$num_children return$row; endclass TreeNode TreeNode的代码中,首先定义了它的成员变量,这些成员变量基本上对应了表 t_article 的各个字段(少了几个用于控制 SQL 查询结果的字段),另外加了一个与t_user 中的f_name字段对应的m_user_name 成员变量,因为要在帖子标题列表中显示作者的姓名 而不是用户名。还有另外两个成员变量:m_childlist 是一个数组,用于保存本节点的所有孩 子节点,孩子节点也是类TreeNode 的实例;m_depth 则用于指示节点在树中的深度。 在成员变量定义之后是类的构造函数,构造函数中不仅只是设置节点本身的成员变量, 更重要的是递归设置孩子节点,即设置m_childlist 数组。孩子通过SQL 查询语句从数据库查 询得到。这条 SQL 语句有两点需要注意:一是为了得到孩子节点,在查询条件中使用了 f_parent_id=$id,意思是取父节点 ID 为本节点 ID 的节点;二是为了取得帖子作者的姓名, 因为 t_article 表中只记录了作者的用户名,所以使用了一个关联查询,即通过 f_username 字段关联 t_user t_user表取得用户姓名;同时为了使关联子句显得简洁,使用表的 别名进行关联。顺便要说的是,只有f_enabled 为true 的帖子才被取出。 在从数据库中取得所有子节点的数据后,代码中使用了一个for 循环,构造出所有的孩 子节点并添加到本节点的数组成员变量m_childlist 中。在构造这些子节点时,这些子节点又 会构造自己的子节点,如此递归直到叶子节点,从而完成整棵帖子树的构造。 构造函数之后是成员函数display(),该函数在显示本节点的数据的同时,会调用其子节 点的函数 display(),让子节点显示自己;之后子节点又会调用自己的子节点的成员函数 display()显示自己的子节点的数据,如此递归直到叶子节点。 display()函数的参数$row 的作用仅在于交错显示相邻行的背景色,使得页面更为美观和 友好。display()函数中用到了一个 reformat_date()函数,该函数定义在 common.php spacer.gif图片文件,该图片是一个空的透明图片,不含任何可视点,这样它在网页中仅 仅起占位符的作用。根据节点在树中的深度设定该图片的宽度(width 属性)就达到了缩进 的目的。 帖子列表中的每一行都是一个指向 view.php 的超链接,并且超链接中带了一个参数指 定了帖子的ID。这样在帖子阅读页面就可以根据这个ID 取得帖子的内容。 在对树形数据结构进行操作时,常使用递归算法。递归的优越性在于其代码的简洁、易 读。在使用递归时,要注意递归函数一定要有出口,否则可能导致无限递归。 6.2.3 帖子列表页面(Default.php)设计 有了帖子树的节点类,实现帖子列表就非常容易。不过在帖子列表页面的左边要显示版 面列表,版面列表和帖子列表的布局如图6-7 所示。 图6-7 版面列表和帖子列表的布局 用于生成版面列表Board.php 的代码,如下所示:

  fetch_assoc();$count++) endfunction __construct public function getBoard($id) return$this-

  m_boards[$id]; 显示函数function display() return;foreach($this-

  href=default.php?bid={$id}

  \n; endclass TreeNode 生成版面列表由一个类BoardList负责,该类只有一个数组类型的成员变量m_boards。 在类的构造函数中通过SQL 查询,从数据库中把所有的版面取出来放到数组m_boards 数组的下标是版面的ID,对应的元素值是版面的名称。BoardList 类的getBoard()函数用于取得对应某个ID 的版面的名称,其实现很简单。 BoardList 类的另一个成员函数display()负责具体显示版面列表。注意,版面列表中的每 一项都是一个超链接,指向default.php,并且带有一个参数指定版面的ID。 帖子列表页面(即讨论区主页面)的代码,如下所示:

  m_has_child $has_child;$this-

  m_title $title;$this-

  m_username $username;$this-

  m_user_name $user_name;$this-

  m_post_time $post_time;$this-

  模块化设计 设计师模块 模块设计 cad室内设计模块 amd 模块化设计 功能模块设计 淘宝设计模块 计算机辅助设计模块 电子设计大赛模块 系统模块设计

Power by DedeCms