工作后一直从事PHP开发。从之前的大包到现在退到服务端写接口,接触了几个接口文件管理工具或者系统。简单介绍一下:showdoc,功能全面简洁,有User,权限管理功能,支持markdown,支持word导出,有多种文档模板,目录支持二级折叠汇合,功能强大(权限管理,邮件提醒,全文搜索,插件管理等),重,一个收费的文档管理swagger系统需要在代码中写很多注释来配合readmine。具有类似confluence的丰富功能。其文档保存为txt格式,可追溯修改,可全文检索。不过写文档有点痛苦,适合任务/bug跟踪管理等。gitbook,nodejs安装,支持markdown,支持npm插件,左边的可折叠目录树需要安装插件,可以还要安装搜索插件。该目录是一个单独的降价文件。我用的时候感觉md编译成html太慢了(600+文档,编译需要25分钟以上,有增量编译或者提高编译速度的插件请赐教.)两个月前,由于项目原因,需要一个简单的界面文件管理工具。开发过程中的心得记录在这里,主要目标可以多人编辑,可以在浏览器中查看。有一个目录可以自动展开和突出显示。支持多级目录,支持markdown。结合git可以实现方便的解决方案。也可以使用git的权限管理功能。因为需要在浏览器中查看,所以需要将markdown编译成HTML文件部署到内网。这里最终选择了访问简单、界面干净、无依赖(不依赖jQuery)的dtree.js,改为使用PHP生成左侧目录树,并优化了css支持PC端和移动端显示.这个函数利用了树的后根序遍历算法,实现了多级文件的读取(没有用到递归,担心写Wrote把自己裹进去),正好dtree.js也支持多级目录折叠。这里我选择了segmentfault官方提供的PHP编译工具类,改用了parsedown(与sf类相比,没有安全检查,支持单行多文件换行符)速度快:编译600多个文件,PHP耗时1s左右,可以接受,支持增量编译;方便:主要体现在自动生成目录,不需要单独写目录文件量化编译~~开头判断一个md文件是否需要编译成html,是根据md文件的创建是通过比较创建时间和最后修改时间来判断的,后来发现有些复制和重命名的文件用这个方法就不行了。最后用一个中间文件记录编译文件的时间。然后和max(创建时间,最后修改时间)比较,判断是否需要编译~~2021年2月2日更新:因为文件的复制移动、剪切移动、重命名等操作会导致不准确时间判断,而时差判断不方便多人协作,所以使用md5摘要判断内容是否发生变化,删除多余文件。在后面的使用过程中,发现删除了一些md文件,但是最后编译出来的html文件并没有自动删除。因此,在编译之后,会时不时地在md文件和最终的HTML文件之间计算一个差异集,删除那些多余的HTML文件,以支持多级目录。一开始想的是按照多级数组来设计和保存文件的层次关系,然后基于这个数组。显示目录,后面实现的时候觉得太麻烦,无法实现多级目录。~~后来,我改变了主意。实际上,不同层级的文件在显示时,只是缩进不同:文件名的缩进比目录的缩进大文件名的缩进大,下层目录的缩进大高于上级目录;因此:首先,通过树遍历算法,将文件夹中所有文件的路径读取到一个一维数组中;然后遍历每个文件Path,将目录名和文件名分开,去重后,都用p标签显示。根据不同层级,增加或减少p标签的padding-left,达到缩进的效果;~~2020-08-23更新原文与idea交互时,生成的html结构虽然很简单,但是展开和隐藏实现太复杂,放弃;现在引入一个php-html类,源文件夹下的文档先通过树遍历算法。全部读完,然后用这种生成的嵌套HTML来显示菜单目录的折叠展开效果~~如果p标签存放的是目录名,用属性data-path记录当前路径的hash值(MD5(a/b/c/)),如果文件名存放在p标签中,则上层目录的hash值存放在文件p标签的类中,这样当目录名被点击时,可以根据它的hash值通过getElementsByClass()方法找到所有的下层p标签,显示或者隐藏~~上一步生成嵌套HTML的时候,如果是文件,就加一个class="file”,id是文件路径的hash值(md5(a/b/c/xxx.md))如果是中间目录,加一个class="dir",id是target目录路径的hash值(md5(a/b/c))使用file_chain.js记录每个文件对应的各级目录的hash值。当用户点击一个文件时,他从file_chain跳转到这个文件的页面。在js中找到这个文件的所有上层目录,将它们的style.display='block'一一修改,防止事件冒泡。公共目录刚刚开始。该目录编译后存在于各个内容页面中。后来发现某个目录被添加或删除了。这时候没有修改过的页面是不会更新目录的。稍后,将目录的HTML代码提取出来并放在菜单中。二是缩小内容文件大小,美化HTML,支持响应式。首先,利用css中的@media属性,根据屏幕宽度使用不同的样式。当屏幕宽度大于800px时,使用css作为PC端flex同时在屏幕上显示目录和内容。当屏幕宽度小于800px时,作为移动端,目录会默认隐藏。点击右下角的悬浮按钮可以控制目录的显示和隐藏。显示时会遮屏隐藏目录:先将目录div的宽度设置为屏幕的宽度(width:100vw),然后用js将目录div的左边距设置为负值(sidebar.style.margin-left=-window.client.width)隐藏目录手动编译的效果太麻烦了。后来发现每次用gitcommit之前在命令行手动编译(phpcompile.php)很麻烦,所以我给git加了一个钩子,在提交前自动执行编译命令,这样就方便多了.最后附上源码源码(码云git)使用方法(cnblog)示例效果图。
