版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1334591
任何一个项目管理系统,比如projectwise之类,它建立一个项目目录后,设置好角色——目录权限。此后,再建立另外一个项目,给定项目编号和项目名称啊,负责人啊,标签之类的区别于其他项目的字段后,此时应该可以利用之前已经建立好的的项目目录和设置好的权限(权限继承)。瞬间就可以建立一个新的项目了。这有神马好处?因为建立项目目录是一件很头痛的事情,除非你没有做过这个事情。首先是项目目录的设计,是一个相当讲究科学的工程,任何人或者任何单位的习惯都不同;其次,建立一个庞大的树状目录是很耗费时间的。如果不能利用项目模板,你建立第二个项目,也是需要抄写第一个项目的目录的,因为太多了,你不抄是记不住的。
当然,我也一样:平时工作的时候,只是先在D盘建立一个项目名称,然后就开始往里面塞东西,等多到一定程度后,哦,查资料不方便了,总不能每次都检索吧,好low,开始在这个项目文件夹内再建立一些分类文件夹,比如图纸、计算书、函件……我一个专业还好,作为一个项目管理系统,它包含更多的阶段和专业以及不同成果类型。
起先,我设计的基于设置好分级目录后递归生成树状目录的方法已经很便捷了,瞬间建立好成百上千的目录……但是,这是通用目录,还是需要在此基础上进行修改,是在后台进行增删改,比如可研阶段,不需要施工图审查目录,不需要设代日记目录,施工图阶段,需要监理资料目录……这样辛辛苦苦搞好一个项目后,开始赋予角色权限,角色有不少啊,科室领导,分院领导,项目负责人,专业负责人,设代人员……每个角色的权限有4种,每个角色对应这些目录的权限不同,这样组合起来,是一个很庞大的设置工作量,而且很考验脑细胞,权限设置不合理,会被领导骂的:(……大概需要几个小时吧……写到这,又发现一个新的功能需求,就是2个项目之间,权限的同步:比如某个项目的某个权限设置不合理,那么基于这个项目模板生成的其他项目权限都显得不合理了,一一手工去改?权限同步吧。
所以,能够用这项目模板,那敢情可好了。废话少说,上图吧:
2个项目的树状目录数据库
项目模板和新建的项目目录一致性:
实现思路和代码:
首先获取选中的项目id,传到后端,后端查出这个项目的树状目录,生成json结构,再递归这个json结构,写入数据库,以及递归建立文件夹。
//根据项目模板添加项目
func (c *ProjController) AddProjTemplet() {
projcode := c.Input().Get("code")
projname := c.Input().Get("name")
projlabel := c.Input().Get("label")
principal := c.Input().Get("principal")
projid := c.Input().Get("projid")
ispermission := c.Input().Get("ispermission")
//code=sl123&name=dada&label=&principal=&projid=25001&ispermission=true
//先保存项目名称到数据库,parentid为0,返回id作为下面的parentid进行递归
//根据项目模板id,取出项目目录的json结构
//然后递归生成硬盘目录
//然后递归写入数据库
//根据模板项目id,取出权限数据——将目录id路径转成目录名称路径——查出新项目对应的目录id——写入权限
//id转成64为
idNum, err := strconv.ParseInt(projid, 10, 64)
if err != nil {
beego.Error(err)
}
//取项目本身
category, err := models.GetProj(idNum)
if err != nil {
beego.Error(err)
}
//取项目所有子孙
categories, err := models.GetProjectsbyPid(idNum)
if err != nil {
beego.Error(err)
}
//根据id取出下级
cates := getsons(idNum, categories)
//递归生成目录json
root := models.FileNode{category.Id, category.Title, category.Code, 1, []*models.FileNode{}}
// walk(category.Id, &root)
maketreejsontemplet(cates, categories, &root)
//先建立第一层项目编号和名称
Id, err := models.AddProject(projcode, projname, projlabel, principal, 0, "", "", 1)
if err != nil {
beego.Error(err)
}
//在递归写入数据库
models.Insertprojtemplet(Id, "$"+strconv.FormatInt(Id, 10)+"#", projcode+projname, root.FileNodes)
//递归创建文件夹
// patharr := make([]Pathstruct, 1)
//先建立第一层文件夹
pathstring := ".\\attachment\\" + projcode + projname
//在递归建立下层文件夹
createtemplet(pathstring, root.FileNodes)
//权限继承
if ispermission == "true" {
}
c.Data["json"] = "ok"
c.ServeJSON()
}
权限继承:根据项目模板id,获取它的权限表,是id路径形式(/521/658/*),根据这个id路径,查出目录名称路径(/可研阶段/水工专业/),根据这个项目模板的名称路径,查新建项目的id路径,把这个id路径,存入权限表,就是新项目的权限继承了。
demo在这里。