EngineerCMS工程师知识管理系统支持项目模板

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/details/82316888

任何一个项目管理系统,比如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在这里

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云之翼

在虚拟机上容器环境性能--动态测试问题分析总结(二)

在上一篇中,介绍了静态测试场景,本文介绍动态性能测试的差异分析,希望大家可以借鉴。

1170
来自专栏Java职业技术分享

并发模型比较

Golang 的特色之一就是 goroutine ,使得程序员进行并发编程更加方便,适合用来进行服务器编程。作为后端开发工程师,有必要了解并发编程面临的场景和常...

1740
来自专栏企鹅号快讯

缓存在高并发场景下的常见问题

丁浪,阿里影业架构师,社区活跃人士。有分布式事务,分布式缓存方面的总结文章获得好评。 本文获作者授权发布。 缓存一致性问题 当数据时效性要求很高时,需要保证缓存...

1978
来自专栏北京马哥教育

Linux 软中断机制分析

软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些ta...

4628
来自专栏角落的白板报

Angular UI框架 Ng-alain @delon的脚手架的生成开发模板

前言 首先感谢下 cipchk基于 Ng-Zorror 框架上制作的ng-alain 。 ? 之前很早就关注了 ng-alain,今天得空折腾了下。 折腾的时...

45411
来自专栏积累沉淀

Javascript模块化编程(二):AMD规范

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块。 (接上文) 七、模块的规范 先想一想,为什么模块很重要? 因...

3638
来自专栏Java职业技术分享

并发模型比较

Golang 的特色之一就是 goroutine ,使得程序员进行并发编程更加方便,适合用来进行服务器编程。作为后端开发工程师,有必要了解并发编程面临的场景和常...

3160
来自专栏代码GG之家

只需一个命令,快速定位android的启动耗时

有兴趣合作,帮忙制作公众号的一些宣传图册的伙伴,可以加我微信,商谈具体事宜。 回顾: Android 启动过程框架 这节我们讲一个命令,用来定位android...

1996
来自专栏编程

教你从零开始搭建一款前端脚手架工具

本文系原创,转载请注明:作者:Jrain Lau(https://segmentfault.com/u/jrainlau)项目地址:https://github...

4077
来自专栏技术小黑屋

快速提高Android开发效率的Web工具

在Google的广大支持下,便捷开发Android程序的Native工具层出不穷。其实Android开发涉及到的范围也不小,一些Web工具有时候也会带来事半功倍...

1442

扫码关注云+社区