================================================
分类管理(不完整设计-概述)(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_success@# => array(@#提交成功@#,@#e提交成功@#)
);
//界面默认配置
global $MSGBD_CONF;
$MSGBD_CONF = array (
@#tpltype@# => $TPL_TYPE[0], //默认模板样式设置
@#language@# => $LANGUAGE[0] //默认语言设置
);
//默认管理模式
global $MANAGE_MODEL; // 0,继承树形管理,1,管理员判断管理
?>
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/