`

多级目录设计思想

阅读更多
一、基本设计思路
改进表结构:可以实现无限级分目录, 根据网站需求可限制最多分级目录5级目录
ID 主键
ENName, ENNameCHNName1JapanNameKoreaName 分类名称
ParentID 父节点ID (ID成父子关系) ParentID 0 时表示根目录
ParentID 等于 ID 的值时,表示对应ID的子目录
Depth 当前结点分类级数(深度) 如一级,二级,三级
ParentStr 所有父节点ID
Child 共计多少一级子目录无子目录值为0
RootID 根节点分类ID 用于排序
SortType 类目录类型
SortOrder 排序
SortType 目录分类标识
如以下示意 (图1)
ID
Name
ParentID
ParentStr
Depth
RootID
Child
SortOrder
SortType
1
中国
0
0
0
1
2
1
Area
3
广东省
1
1
1
1
1
2
Area
4
深圳市
3
1,3
2
1
1
3
Area
5
江西省
1
1
1
1
0
5
Area
6
南山区
4
1,3,4
3
1
0
4
Area
7
日本
0
0
0
2
1
6
Area
8
大阪
7
7
1
2
0
7
Area
如值取6代表 中国->广东省->深圳市->南山区
关键函数
新增目录函数
string InertNewSort( int intSelectedSortID, string strSortType, string[] arrFieldName, string[] arrFieldValue)
参数说明:intSelectedSortID 当前选择要增加目录的ID如是根目录其值为0, strSortType 为识别对应目录的类别arrFieldName为对应目录名称,arrFieldValue为对应目录名称的取值。
主要设计思想:
示列如图1 如果增加新的根目录,ID值为数据库里Max(ID)加1如果Max(ID)不存在则为1,ParentID为0,ParentStr为0,Depth为0,RootID的取值方法与ID相同,Child为0,SortOrder 为取得的ID值。
如不为根目录,ID取值同上,ParentID为选中目录的ID值(对应的父目录ID),ParentStr为对应父目录的ParentStr加父目录的ID,如是根目录则为ParentStr加父目录的ID,Depth为对应父目录Depth值加1
RootID为对应父目录的RootID值
递归函数 void CheckAndFixSort(int intParentID, string strSortType)
在每一次更新数据后,用此函数来格式化Depth,Child,ParentStr,SortOrder 三个字段
无返回值
设置排序函数intSetSortOrder(int intID,string strGetType,string strSortType)
返回影响的行数
主要功能:设置前台显示的顺序(对同级目录排序) 每次设置排序只能移动一个单位
参数说明:intID 为当前要排序的ID , strGetType 为当前排序移动类别(GoUp 为向上移动,GoDown 为向下移动),strSortType 为识别对应目录的类别
主要设计思想:
示列如图1 如果要把江西省的排序排在广东省前(向上移动目录),先找出对应省份下有多少个子目录,并记录其Id值。
因为一个目录时基对应的所有子目录也要跟随其移动,如上图:江西省对应的所有子目录个数为 0 个,广东省其对应的子目录个数为为2个,各自加1后其值分别为1个与3个,然后对江西省的所有子目录包含基自身的SortOrder 值减去属于广东省目录的个数为3,再对广东省所有对应的子目录包含基自身的 SortOrder 值加上所有属于江西省目录的个数为1 即得到新的目录排序。如果要把广东省的排序排在江西省后(向下移动目录)方法相同。
主要函数:
public void CheckAndFixSort(int intParentID, string strSortType, ref int intFixSortOrder)
{
DataSet ds = new DataSet();
string strParentStr;
// 初始化所有的根节点的 Depth, ParentStr 值
if(intParentID == 0)
_db.ExecuteAdapter("UPDATE TSortConfig SET Depth = 0,ParentStr = '0' WHERE SortType = '"+ strSortType +"' AND ParentID = 0");
string strSelectSql = "SELECT ID,RootID,ParentStr,Depth FROM TSortConfig WHERE SortType = '"+ strSortType +"' AND ParentID ="+ intParentID +" ORDER BY RootID,SortOrder";
ds = _db.ExecuteAdapter( strSelectSql );
foreach (DataRow myRow in ds.Tables[0].Rows)
{
if(myRow[2].ToString() != "0")
strParentStr = myRow[2].ToString() +","+ myRow[0].ToString();
else
strParentStr = myRow[0].ToString();
int intTemp = Int32.Parse(myRow[3].ToString()) + 1;
string strUpdateSql = "UPDATE TSortConfig SET Depth = "+ intTemp +", ParentStr = '"+strParentStr+"', RootID = "+myRow[1]+" WHERE ParentID ="+myRow[0]+" AND SortType = '"+ strSortType +"'";

// 更新所有下 ID = myRow[0] 子一级目录的 Depth, RootID 值
int intChild = _db.ExecuteNonQuery( strUpdateSql );

// 更新所有 ID = myRow[0] 的 Child, SortOrder 值 SortOrder 为参数传递入值
_db.ExecuteAdapter( "UPDATE TSortConfig SET Child = "+intChild+", SortOrder = "+intFixSortOrder+" WHERE SortType = '"+ strSortType +"' AND ID="+ myRow[0]);
intFixSortOrder++;

// 递归调用 CheckAndFixSort 函数
CheckAndFixSort(Int32.Parse(myRow[0].ToString()),strSortType, ref intFixSortOrder);
}
}
// 添加新目录
public string InertNewSort( int intSelectedSortID, string strSortType, string[] arrFieldName, string[] arrFieldValue)
{
int intRootID = 0,intID = 0,intParentID = 0,intDepth = 0,intSortOrder = 0,intMaxRootID = 0;
string strParentStr = "0";
string[] arrParamName = new string[12];
string[] arrParamValue = new string[12];

#region 取相关数值
if(intSelectedSortID != 0 )
{
string[] arrNewSortItems = GetNewSortItems(intSelectedSortID,strSortType);
intRootID = Int32.Parse(arrNewSortItems[0].ToString());
intParentID = Int32.Parse(arrNewSortItems[1].ToString());
intDepth = Int32.Parse(arrNewSortItems[2].ToString());
intSortOrder = Int32.Parse(arrNewSortItems[3].ToString());
if(intDepth+1 > intMaxDepth )
{
return "最大深度为"+(intMaxDepth+1).ToString()+"级";
}
strParentStr = arrNewSortItems[4].ToString();
}
else
intMaxRootID = GetMaxIdValue("RootID",strSortType);
#endregion
// 准备入库的数值
intID = GetMaxIdValue( "ID",strSortType);
if(intSelectedSortID != 0)
{
intDepth++;
intSortOrder = intID;
if (strParentStr.Equals("0"))
strParentStr = intSelectedSortID.ToString();
else
strParentStr = strParentStr + "," + intSelectedSortID.ToString();
}
else
{
intDepth = 0;
intRootID = GetMaxIdValue( "RootID",strSortType);
intSortOrder = 0;
intParentID = 0;
strParentStr = "0";
}
#region 把数据存入数组

arrParamName[0] = arrFieldName[0];
arrParamName[1] = arrFieldName[1];
arrParamName[2] = arrFieldName[2];
arrParamName[3] = arrFieldName[3];
arrParamName[4] = "SortType";
arrParamName[5] = "Id";
arrParamName[6] = "ParentID";
arrParamName[7] = "ParentStr";
arrParamName[8] = "Depth";
arrParamName[9] = "RootID";
arrParamName[10] = "Child";
arrParamName[11] = "SortOrder";
arrParamValue[0] = arrFieldValue[0];
arrParamValue[1] = arrFieldValue[1];
arrParamValue[2] = arrFieldValue[2];
arrParamValue[3] = arrFieldValue[3];
arrParamValue[4] = strSortType;
arrParamValue[5] = intID.ToString();
arrParamValue[6] = intParentID.ToString();
arrParamValue[7] = strParentStr;
arrParamValue[8] = intDepth.ToString();
arrParamValue[9] = intRootID.ToString();
arrParamValue[10] = "0";
arrParamValue[11] = intSortOrder.ToString();
#endregion
int intReturnValue = InsertSort( arrParamName, arrParamValue );
int intFixSortOrder = 1;
CheckAndFixSort(0,strSortType,ref intFixSortOrder);
return "目录添加成功";
}
分享到:
评论

相关推荐

    一个多用户多级目录结构文件系统设计与实现

    课程设计的环境是Linux 操作系统。 设计时可利用Linux 提供的文件管理的功能...基本思想是,在Linux 系统中创建一个较大容量的文件,作为所设计的文件系统的“文件卷”,并利用Linux 系统的功能调用,编写各程序模块。

    多级菜单设计

    多级菜单设计 一般思想 可以借鉴下

    论文研究-多级多商品流物流网络设计的优化模型与组合模拟退火算法.pdf

    以最小化系统内的建设费用、库存费用和运输费用为优化目标,建立可描述一般性带能力约束的多级多商品流物流网络设计问题的优化模型,并根据物流网络设计问题的特点,基于模拟退火算法的思想,设计组合模拟退火算法对...

    基于单片机LCD液晶显示的多级菜单程序解析

    基于单片机的LCD液晶显示中涉及的多级菜单程序的源码(c语言)移植及移植中需要注意的源码解析移植文档,可以满足大多数应用,其中很多思想很值得借鉴

    多级安全数据库安全子系统的设计与实现

    较为详细地分析多级安全数据库实现的方案和技术,并侧重论述了多级安全子系统中强制访问控制模 块实现的模型思想,以及实现强制访问控制的关键技术,并加以代码说明。

    如何利用多级抽象思维来设计库?

    而本文作者在此之前,还发表了一篇《Librarypatterns:Multiplelevelsofabstraction》,结合具体实例,向大家非常详细地介绍了库设计模式及库设计中的多级抽象思想。以下为具体译文:对于库设计理论来说,有几点在我...

    操作系统课程设计——文件管理系统

    四、程序设计思想1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。2、文件物理结构可采用显式链接或其他方法。3、磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示...

    基于JAVA JSP的毕设选题系统的毕业设计,本系统采用了多级角色管理:包括系统管理员、系主任,学生和老师几种权限

    本文主要介绍了用户权限的划分,并详细地论述了系统设计的思想和实现的方法步骤从而为以后的研究打下了基础。 关键词: 审核;权限;多级角色管理 随着全球信息化技术的兴起,特别是Internet的日益普及,我国各大...

    模拟文件系统设计报告

    1、实现文件的创建、查询、删除、...2、文件系统采用多级目录机制,实现目录的创建、删除、显示、目录之间的切换。 3、采用位示图来管理文件系统空间的分配和回收、提供位示图的查看功能。 4、实现文件的有关权限管理。

    操作系统课程设计文件管理系统

    四、 程序设计思想 1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。 2、文件物理结构可采用显式链接或其他方法。 3、磁盘空闲空间的管理可选择位示图或其他方法。如果采用...

    论文研究-多级安全数据库安全子系统的设计与实现.pdf

    较为详细地分析多级安全数据库实现的方案和技术,并侧重论述了多级安全子系统中强制访问控制模块实现的模型思想,以及实现强制访问控制的关键技术,并加以代码说明。

    基于分组的多级随机数RFID标签并行识别算法

    为了提高大规模RFID系统中的被动标签识别率,在分析已有基于帧时隙ALOHA标签识别算法的基础上,结合分组算法和多级随机数算法的思想,将多级随机数分别部署在不同组的标签中,使用动态帧时隙ALOHA算法框架,提出基于分组...

    基于多级实例推理的模块化设计方法研究 (2011年)

    从多级实例推理的设计思想出发,在分析现有实例推理模块化设计理论的基础上,针对多层次、多属性的复杂机械产品方案实例推理困难的问题,研究了多级结构模块实例检索推理方法。引入可拓物元模型作为多级实例表达模型...

    论文研究-基于社团和多级拓扑的机器人群体编队算法.pdf

    为解决机器人群体难以形成与保持稳定队形的问题,通过引入社团划分和牵制控制思想,提出了一种基于社团和多级拓扑的机器人群体编队控制算法。基于层次聚类算法,将机器人群体分成若干社团并找出每个社团中的固定牵制...

    操作系统实验_多级反馈队列调度算法

    操作系统实验 进程调度的设计与实现 ...六、 实验的设计思想及相关代码……………………………3 七、 实验的图形用户界面GUI设计…………………………8 八、 心得体会…………………………………………………8

    JS实多级联动下拉菜单类,简单实现省市区联动菜单!

    作者:ybcola 这段js代码是很久以前的作品了,应该在一年以前吧!当时是在做一个农村人才管理系统的时候遇到... 为了考虑在同一个页面中多处使用,因些使用了对象的思想进行设计,为了实现各个多级联动的内容不同,所

    (毕业设计)基于JSP的毕业设计选题系统的设计与实现(源代码+论文)

    本文主要介绍了用户权限的划分,并详细地论述了系统设计的思想和实现的方法步骤从而为以后的研究打下了基础。 关键词: 审核;权限;多级角色管理 随着全球信息化技术的兴起,特别是Internet的日益普及,我国各大...

    进程调度设计与实现

    三、实验内容与主要设计思想 1、 采用一种熟悉的语言,如C、PASCAL或C++等,编制程序。 2、 采用多级反馈队列调度算法进行进程调度。 3、 每个进程对应一个PCB。在PCB中包括进程标识符pid、进程的状态标识status、...

    毕设源码-VB+access综合人事管理系统的设计与实现(论文+系统+开题报告+答辩PPT+摘要及目录).rar

    **综合人事管理系统VB+Access毕业设计源码** ...同时,系统采用了模块化设计思想,便于二次开发和定制。 **适用对象**: 本系统适用于各类企事业单位的人事管理部门,也可作为高校计算机专业毕业设计的参考项目。

Global site tag (gtag.js) - Google Analytics