菜鸟初学设计,希望大家多多指点,并帮助实现。谢谢

发表于:2007-07-01来源:作者:点击数: 标签:
书写的比较规范,思路清晰。希望大家各述己见 --- 唠叨 ================================================ 分类管理(不完整设计-概述)(1) qzhl 发表于 2002-3-13 17:57 PHP 编程 ←返回版面 class.id//分类号 唯一 class.classStr//分类字符串 = 父分类
书写的比较规范,思路清晰。希望大家各述己见 --- 唠叨
================================================
    

分类管理(不完整设计-概述)(1)
qzhl 发表于 2002-3-13 17:57 PHP编程 ←返回版面     

class.id         //分类号 唯一
class.classStr         //分类字符串 = 父分类字符串+","+父id 用于 选出所有子分类
class.parentId        //父Id 可以用上面的字段得到 不一定能实现


功能模块说明:

addClass            //添加分类
        入口:
            [parentId]            //父分类号
          <name>                    //类名
          [其他字段]            //非必须字段
        出口:<errNo>
listClass            //根据模版样式输出分类
      入口:
        <$rootId>                //要显示分类的根节点的 id  即显示所有 rootId 的子节点
        [$tree]                    //是否全部展开
        //默认的模版变量用来确定模版
modiClass            //修改单独分类的信息
      入口:
        <id>
            <必要的字段>
            [可选的字段]
modiClassForm
         入口
            [$id]                //分类号
        出口
          各字段值发送给 modiClass
delClass            //删除分类 如果包含子分类 则不允许删除
        入口:
            <$id>



分类管理(不完整设计-数据结构)(2)

分类表

CREATE TABLE class (
  classStr varchar(10) NOT NULL default @#0@#,    分类字符串*
  parentId int(11) default @#0@#,                                父分类号
  id int(11) NOT NULL default @#0@#,                        分类号*//自动增长
  logo varchar(50) default NULL,                            图标
  name varchar(20) NOT NULL default @#@#,                类名*
  description varchar(50) default @#Welcome@#,    描述
  dispOrder int(11) default NULL,                            显示顺序
  masterId int(11) default NULL,                            管理员号
  masterName varchar(20) default NULL,                管理员名
    [此处可再扩充发言表管理员的名字 用于在发言管理中]
  childNum int(11) default NULL,                            子节点数量
  modiTime datetime default NULL,                            最后修改时间
  UNIQUE KEY id (id)                                                    分类号 唯一
) TYPE=MyISAM;

发言表

CREATE TABLE msg (
  bid int(11) NOT NULL default @#0@#,        分类号
  id int(11) NOT NULL default @#0@#,        分类内序号
  topic varchar(100) NOT NULL default @#@#,    主题
  context text,                    内容
  author varchar(20) NOT NULL default @#@#,    作者
  email varchar(40) default @#@#,            邮箱
  wdate datetime NOT NULL default @#0000-00-00 00:00:00@#,
                        发言时间
  levelnum tinyint(3) unsigned NOT NULL default @#0@#,
                        回复层次
  orderid float NOT NULL default @#0@#        排序号
) TYPE=MyISAM;


分类管理(不完整设计-添加分类)(3)

功能:

添加分类(addClass)
0.功能简述:
    

1 接口参数

  1.1 入口

  [parentId]            //父分类号

  <name>            //类名
  [其他字段]            //非必须字段

  1.2 出口

  [errNo]            //错误码用 include 发送给 错误 显示功能(区分语言)

2 变量声明

  var parentId;
  var classStr;

3 功能实现

  if(empty($name)){
    errNo = N;
    include_once(错误功能页面);    //错误页面根据语言输出错误并返回(见 func.txt)
  }
  //if(empty($parentId)):

    $parentId = 0;//默认就是 0 此句不用写
    // id 设置为自动增长
    INSERT INTO class(classStr,parentId,name,[其他字段]) VALUES(0,0,$name,[其他字段]);
    
  //if(!empty($parentId)):
    SELECT @classStr:=CONCAT(classStr,@#,@#,id) FROM class WHERE id=$parentId; //CONCAT 连接字符串
    INSERT INTO class(classStr,parentId,name,[其他字段]) VALUES(@classStr, $parentId, $name, [其他字段]);


分类管理(不完整设计-权限管理)(4)

权限管理
chkPower 功能
0 功能简述
    根据 管理模式 判断当前用户 是否可以通过本模块。
1 接口参数
    1.1 入口
        session(user[@#id@#])
        <$id>                                        //需要判断权限的分类的 id
        session(user[@#power@#])    //user[@#power@#] = @#id,id,id@#
    1.2 出口
        errNo                                        //没有权限
      user[@#power@#] .= @#,id@#    //认证通过
2 实现

    判断 id 是否在 session(user[@#power@#]) 中
        是:通过
        否:管理模式 0:
                    SELECT @classStr:=classStr FROM class WHERE id = $id
         //判断当前类的 分类字符串 是否包含 user[id] 所管理的任何一个分类 是 则通过 说明当前分类是子分类
         SELECT <任何字段> FROM class WHERE @classStr LIKE CONCAT(@#%@#,id,@#%@#) AND masterId = session(user[id])
                 如果返回的记录集不为空 则通过。
                    并 user[@#power@#] .= $id;
                管理模式 1:
                    //判断 当前用户是否在 当前类管理员列表中 是 则通过。
          SELECT <任何字段> FROM class WHERE masterId LIKE CONCAT(@#%@#,user[@#id@#],@#%@#) AND id = $id
        如果没有通过:
                    errNo = n;
                    include(error.php)


分类管理(不完整设计-显示分类)(5)

显示分类(listClass)

0 功能描述

1 接口参数

  1.1 入口

    $rootId    要显示分类的根节点的 id  即显示所有 rootId 的子节点
    $tree    是否全部展开
    //默认的模版变量
  1.2 出口
    errNo

2 变量声明

  var $result;        //记录集
  var $nodeNum;        //节点数量
  var $allNodeArray;    //所有节点数组
  var $html;        //模板变量

3 函数声明

  function getResult(rootId,tree)      
    //得到一个需要的记录集
  function pAllNode1(level,rootNodeId,nodeArray[][])
    //遍历函数 level 表示输出层次 nodeArray 记录集数组
  function buildTree(black,currentNode)
    //输出函数 调用 模板类 调用模板 赋值模板变量 追加块 得到树形结构

4 功能实现
//连接数据库
$result = getResult($rootId,$tree);
$nodeNum = mysql_num_rows($result);
$allNodeArray = array(nodeNum);
$html = new Template();
//将记录集放入二维数组。将父id放入数组第一个元素
for(i=0;i<nodeNum;i++){
  $allNodeArray[i] = mysql_fetch_array($result);
}
//关闭数据库
$html->set_file(@#listClass@#,@#listClass.tpl@#);
$html->set_block(@#listClass@#,@#node@#,@#nodes@#);

pAllNode1(0,n,$allNodeArray);

$html->pparse(@#out@#,@#listClass@#);

/*********** function **********************************************/

  //得到一个需要的记录集
  function getResult(rootId,tree){
    //参数说明:
    //rootId 要显示分类的根节点的 id  即显示所有 rootId 的子节点
    //tree 是否全部展开

    if(empty($rootId)) $rootId = 0;

    if(tree=false){ // 只列出一层
      strSQL =
        SELECT @classStr:=classStr FROM class WHERE id=$rootId;
    SELECT name,classStr,[其他字段] FROM class
    WHERE classStr LIKE CONCAT(@classStr, @#,@#, @#%@#) AND classStr NOT LIKE CONCAT(@classStr, @#,@#, @#%,%@#);
    }
    if(tree=true){  //列出整棵树
      strSQL =
    SELECT @classStr:=classStr FROM class WHERE id=$rootId;
    SELECT name,classStr,[其他字段] FROM class
    WHERE classStr LIKE CONCAT(@classStr, @#,@#, @#%@#)
    }
    return mysql_quary(strSQL);
  }

  //遍历函数 level 表示输出层次 nodeArray 记录集数组

  function pAllNode(level,rootNodeId,nodeArray){
    //如果当前节点的父id等于跟节点id
    while(current(nodeArray)[0]==rootNodeId){
      //输出当前节点
      //递归调用,current(nodeArray)[1] 表示: 当前节点id, 数组不变
      pAllNode(level+1,current(nodeArray)[1],nodeArray);
      next(nodeArray);
    }
  }

  //遍历函数1
  function pAllNode1(level,rootNodeId,nodeArray[][]){
    i=0;
    //用于存放本层的元素
    tmpArr = array();
    //从数组中搜索所有元素 生成第一层元素
    while(list($k,$v)=each(nodeArray)){
      //如果元素的 父id 即nodeArray[][0] 或者 $v[0]==rootNodeId
      if($v[0]==rootNodeId){
        //生成新的数组只包含第一层的元素 即 父节点为 rootNodeId
        tmpArr[i]=$v[0];
        //删除原数组中已选出的元素
        unset(nodeArray[$k]);
        //新数组的下标加一
        i++;
      }
    }
    while(list($k,$v)=each(tmpArr)){
      //生成缩进
      for(i=0;i<level;i++) $str .= " ";
      //建立当前节点
      buildTree($str,$v[2]);
      //此时数组 nodeArray 已经去除了第一层的元素
      pAllNode1(level+1,$v[1],nodeArray);
    }
  }

  //输出函数 调用 模板类 调用模板 赋值模板变量 追加块 得到树形结构
  //对所有需要的变量进行替换 模板不同 则生成两种类型的页面(只有类名的树形结构,有详细信息的列表)
  //black 生成的缩进空格
  function buildTree(black,currentNode){
    set_var(@#链接@#,currentNode[1]);
    set_var(@#name@#,currentNode[2]);
    set_var(@#black@#,black):
    parse(@#nodes@#,@#row@#,ture);
  }
  //块结构
<!-- node BEGIN -->
{black缩进空格}<a href={链接?classid=n}>{name}</a>[其他需要输出的内容]
<!-- node END -->

/*******************************************************************/



分类管理(不完整设计-修改分类)(6)

修改分类信息(modiClass)
0.实现简述:
    

1 接口参数

  1.1 入口
    <id>
        <必要的字段>
        [可选的字段]

  1.2 出口

    [errNo]

2 变量声明


3 功能实现
    if (<必要字段> 不存在) errNo = n include(错误处理功能)
  
  update 数据 where id = $id;



分类管理(不完整设计-修改表单)(7)

修改表单(modiClassForm)
0.实现简述:
    

1 接口参数

  1.1 入口

  [$id]                //分类号

  1.2 出口
  各字段值发送给 modiClass

2 变量声明


3 功能实现

//根据 $id 查询数据库得到相应的信息
//调用 修改类表单模板用查到的数据替换相应的表单元素值。
//输出给用户。
//用户修改后提交给 modiClass 功能。


分类管理(不完整设计-遍历函数)(8)

<?
  function pAllNode($level,$rootNodeId,$nodeArray){
    reset($nodeArray);
    $i=0;
    //用于存放本层的元素
    $tmpArr = array();
    //从数组中搜索所有元素 生成第一层元素
    while(list($k,$v)=each($nodeArray)){
      //如果元素的 父id 即nodeArray[][0] 或者 $v[0]==rootNodeId
      if($v[0]==$rootNodeId){
        //生成新的数组只包含第一层的元素 即 父节点为 rootNodeId
        $tmpArr[$i]=$v;
        //删除原数组中已选出的元素
        //unset($nodeArray[$k]);
        //新数组的下标加一
        $i++;
      }
    }
    reset($tmpArr);
    //生成缩进
    for($j=0;$j<$level;$j++) $str .= " ";
    while(list($k,$v)=each($tmpArr)){
      //输出当前节点
      print($str.$v[1].$v[2]."<br>");
      //此时数组 nodeArray 已经去除了第一层的元素
      pAllNode($level+1,$v[1],$nodeArray);
    }
  }

$tt = array(
array(0,1,"b"),
array(0,2,"b"),
array(1,3,"b"),
array(1,4,"b"),
array(0,5,"b"),
array(2,6,"b"),
array(6,7,"b")
);
pAllNode(0,0,$tt);

?>


分类管理(不完整设计-配置文件)(9)

配置文件说明:
<?
/*安装时需要初始化的本地信息内容*************************************/
//分类管理的目录信息
global $PATH_INFO;
$PATH_INFO = array ();
//数据库配置信息
global $DB_INFO;
$DB_INFO = array ();
/********************************************************************/
/*可用的模板设置添加*************************************************/
//模板样式添加
global $TPL_TYPE;
$TPL_TYPE = array (
    @#管理@#    => @#@#,
    @#用户@#    => @#@#
);
//语言添加
global $LANGUAGE;
$LANGUAGE = array ();
/********************************************************************/
//定义程序运行时消息包括两种语言
global $RUNTIME_MSG;
$RUNTIME_MSG = array(
    @#cannot_is_null@#    => array(@#不能为空@#,@#e不能为空@#),
  @#submit_suclearcase/" target="_blank" >ccess@#    => array(@#提交成功@#,@#e提交成功@#)
);
//界面默认配置
global $MSGBD_CONF;
$MSGBD_CONF = array (
    @#tpltype@#            => $TPL_TYPE[0],                            //默认模板样式设置
  @#language@#        => $LANGUAGE[0]               //默认语言设置
);
//默认管理模式
global $MANAGE_MODEL;                                                    // 0,继承树形管理,1,管理员判断管理
?>

原文转自:http://www.ltesting.net