Nboat2项目开发笔记

关于网站建设的细节,本来就有很多想说的,正好届nboat2上线之际稍微聊一聊开发那点事

[{'content': '# 目录\n\n- 序言\n\n# 序言\n\n这篇是Neboer的个人站里的第一篇大博文。可能很多人还对Nboat2项目不是很了解,不过没有关系,关于网站我一定会介绍清楚。在序言部分也就是第一篇文章里不会涉及到太多的技术内容,任何人都可以阅读。如果你想了解更多建站的细节,我后续写的文章里会逐渐介绍开发的各个细节,欢迎大家持续关注。\n\n## 为什么自己做博客\n\n可能很多人不解一向号称“面向实现”的Neboer想做博客网站为啥要自己写,简直像是脑子坏掉了(,你看自己的代码又难以维护,做出来的效果又没有那些专业的主题漂亮,也容易出现各种bug或漏洞等等……其实我倒是没有想那么多。事实上对我来讲,自己做一个博客这种事更多的意义在于做的本身而并不在于它的“实现”,我更享受按照自己的想法实现程序的过程。这么做其实也在于“实现一个愿望”,那就是拥有一个在各个方面来讲都是真正意义上的自己的站点——从前端设计到后端实现,从域名的购买到服务器维护等等,我自己也比较珍惜这样的经历吧。\n\n自己做博客确实会浪费很多的时间,在V2的群里也有人提到过这么做还不如专注于提升一下自己文章的质量,毕竟博客的“皮”做得再好也就是“面子工程”,真正的优质内容才是我应该追求的目标,不然就成了“金玉其外,败絮其中”。他的话切中肯絮(这成语从今年的高考作文《生活在(二叉)树上》上学来的(大雾)),对此我的观点是,对内容和“封皮”不应该设定不同的参考标准(cover lives matter(雾)),文章的内容质量固然是我要追求的东西,但是对网站本身的设计和制作也很重要,虽然专业的博客一定比我自己写的程序要好,但是我并不想直接拿来主义草草了事。我甚至将这个站点的开发暂时放在了第一位,我想有一个自己设计的、适合自己的创作环境对于自己的创作行为本身就是一种激励。这种思想不仅仅适用于个人博客的建设,也适用于更加开放的内容平台,比如网文、微博或者空间。\n\n当然,在网站逐渐成形的期间,我也会继续做博文的。而且别忘了,这个网站不仅仅是博客,直接套用现有的框架一定会或多或少的限制它的功能,而这也是我不愿意看到的。而且我个人并不缺时间,会好好的打磨这个网站和里面的每一篇文章的。\n\nNeboer无论是讲话还是写东西都有一个很大的毛病,就是特别喜欢长篇大论,这个毛病慢慢改,各位看官请多做忍耐,如果真的觉得写的罗嗦到无可忍受,或者发现文章中出现的技术或语言错误,再或者想对文章有什么提议和看法等等,欢迎到右上角给我发邮件指出来,或者未来博客做好了留言板和评论区的时候留言评论,谢谢你们。\n\n## Nboat\n\nNboat2的开发是基于Nboat的基础之上的,在讲Nboat2之前不如先说一说Nboat的故事。\n\nNboat是在去年年末(2019.12)开的仓库,那个时候应该是要放假的前期,如果非要说一个原因其实就是受到同部门的同事的影响,我也觉得要有一个自己的博客。在此之前其实一直对建博客这件事情没什么感觉,还记得很早部门考核的时候一定要填写一个个人主页,我就随手在开源中国上随便建了一个主页填了上去,现在回想一下觉得应该在csdn上建一个(笑)。部门那边一直以来都有很多人有自己的网站,那个假期之前我觉得这么建一个站点也是很不错的,而且"Neboer"这个名字也比较适合做域名,我个人竟然觉得非常好听,便试着查了一下,确实可以注册购买,便先行一步把域名“neboer.site”买了下来。这里推荐一下阿里云,各种域名什么的真的很便宜,我个人也懒得折腾,就在这上面注册了这样一个网站。\n\n那个时候刚刚接触Go语言,觉得golang直接编译成程序,性能很强,所以就用golang作为开发语言做了一阵。可是后来golang的问题也逐渐显示出来。我觉得很大一部分原因是因为我刚刚接触这个语言就用它做这么大的一个程序,出现问题很难一下子解决;而且golang确实还是不够久,用到的一些依赖出现的问题比较多,尤其是HTML Template,虽然用起来蛮好用,但是支持的模板语法不够灵活,给实际开发带来了一定的困难。我还是喜欢那种Python式的scheme-less语言,相比之下golang放弃了挺多东西,感觉仅仅是为了性能的话有点亏;最后的原因可能就是没有设计好数据库存储的结构,再加上golang对数据格式的要求很严格,导致后期的开发不太舒服。在不断的换库、尝试之后,还是强行的放出来了一个能用的版本,然后在github的项目主页上插上flag:Nboat即将迎来重构,就转移阵地到新学期了,Nboat倒是一直在搁(鸽)置(子),咕咕咕咕。\n\n## Nboat2 - 准备\n\nNboat2的开发倒是最近两周的事情。“假期我要做的第一件事就是重写这个网站”,我曾经对我的pong友Eibon这样说过。去年我在写下“Nboat重构计划”这几个字的时候,其实并没有想到我会放弃所有nboat的源代码,不用golang用nodejs重写一个网站出来。不过用node开发也并不是一下子决定的,当时也考虑了很多因素,突然想为什么我一开始想要用go来开发……性能又不是决定语言的第一因素,事实上选择一个合适的语言应该更为重要。我觉得最适合开发这个网站的语言是js,配合node框架,再用一个模板引擎,同时充分发挥后端mongodb数据库存文档的优势……这个配合简直不要再好。于是立即开坑,开始安排。\n\n域名和服务器都是现成的,cdn也暂时用cf的(后来换成了阿里的),问题一致指向了写代码上面,下一篇文章就介绍整个nboat2的程序结构和设计目的,谢谢大家,求三连(。', 'HTML': '

目录

\n\n

序言

\n

这篇是Neboer的个人站里的第一篇大博文。可能很多人还对Nboat2项目不是很了解,不过没有关系,关于网站我一定会介绍清楚。在序言部分也就是第一篇文章里不会涉及到太多的技术内容,任何人都可以阅读。如果你想了解更多建站的细节,我后续写的文章里会逐渐介绍开发的各个细节,欢迎大家持续关注。

\n

为什么自己做博客

\n

可能很多人不解一向号称“面向实现”的Neboer想做博客网站为啥要自己写,简直像是脑子坏掉了(,你看自己的代码又难以维护,做出来的效果又没有那些专业的主题漂亮,也容易出现各种bug或漏洞等等……其实我倒是没有想那么多。事实上对我来讲,自己做一个博客这种事更多的意义在于做的本身而并不在于它的“实现”,我更享受按照自己的想法实现程序的过程。这么做其实也在于“实现一个愿望”,那就是拥有一个在各个方面来讲都是真正意义上的自己的站点——从前端设计到后端实现,从域名的购买到服务器维护等等,我自己也比较珍惜这样的经历吧。

\n

自己做博客确实会浪费很多的时间,在V2的群里也有人提到过这么做还不如专注于提升一下自己文章的质量,毕竟博客的“皮”做得再好也就是“面子工程”,真正的优质内容才是我应该追求的目标,不然就成了“金玉其外,败絮其中”。他的话切中肯絮(这成语从今年的高考作文《生活在(二叉)树上》上学来的(大雾)),对此我的观点是,对内容和“封皮”不应该设定不同的参考标准(cover lives matter(雾)),文章的内容质量固然是我要追求的东西,但是对网站本身的设计和制作也很重要,虽然专业的博客一定比我自己写的程序要好,但是我并不想直接拿来主义草草了事。我甚至将这个站点的开发暂时放在了第一位,我想有一个自己设计的、适合自己的创作环境对于自己的创作行为本身就是一种激励。这种思想不仅仅适用于个人博客的建设,也适用于更加开放的内容平台,比如网文、微博或者空间。

\n

当然,在网站逐渐成形的期间,我也会继续做博文的。而且别忘了,这个网站不仅仅是博客,直接套用现有的框架一定会或多或少的限制它的功能,而这也是我不愿意看到的。而且我个人并不缺时间,会好好的打磨这个网站和里面的每一篇文章的。

\n

Neboer无论是讲话还是写东西都有一个很大的毛病,就是特别喜欢长篇大论,这个毛病慢慢改,各位看官请多做忍耐,如果真的觉得写的罗嗦到无可忍受,或者发现文章中出现的技术或语言错误,再或者想对文章有什么提议和看法等等,欢迎到右上角给我发邮件指出来,或者未来博客做好了留言板和评论区的时候留言评论,谢谢你们。

\n

Nboat

\n

Nboat2的开发是基于Nboat的基础之上的,在讲Nboat2之前不如先说一说Nboat的故事。

\n

Nboat是在去年年末(2019.12)开的仓库,那个时候应该是要放假的前期,如果非要说一个原因其实就是受到同部门的同事的影响,我也觉得要有一个自己的博客。在此之前其实一直对建博客这件事情没什么感觉,还记得很早部门考核的时候一定要填写一个个人主页,我就随手在开源中国上随便建了一个主页填了上去,现在回想一下觉得应该在csdn上建一个(笑)。部门那边一直以来都有很多人有自己的网站,那个假期之前我觉得这么建一个站点也是很不错的,而且"Neboer"这个名字也比较适合做域名,我个人竟然觉得非常好听,便试着查了一下,确实可以注册购买,便先行一步把域名“neboer.site”买了下来。这里推荐一下阿里云,各种域名什么的真的很便宜,我个人也懒得折腾,就在这上面注册了这样一个网站。

\n

那个时候刚刚接触Go语言,觉得golang直接编译成程序,性能很强,所以就用golang作为开发语言做了一阵。可是后来golang的问题也逐渐显示出来。我觉得很大一部分原因是因为我刚刚接触这个语言就用它做这么大的一个程序,出现问题很难一下子解决;而且golang确实还是不够久,用到的一些依赖出现的问题比较多,尤其是HTML Template,虽然用起来蛮好用,但是支持的模板语法不够灵活,给实际开发带来了一定的困难。我还是喜欢那种Python式的scheme-less语言,相比之下golang放弃了挺多东西,感觉仅仅是为了性能的话有点亏;最后的原因可能就是没有设计好数据库存储的结构,再加上golang对数据格式的要求很严格,导致后期的开发不太舒服。在不断的换库、尝试之后,还是强行的放出来了一个能用的版本,然后在github的项目主页上插上flag:Nboat即将迎来重构,就转移阵地到新学期了,Nboat倒是一直在搁(鸽)置(子),咕咕咕咕。

\n

Nboat2 - 准备

\n

Nboat2的开发倒是最近两周的事情。“假期我要做的第一件事就是重写这个网站”,我曾经对我的pong友Eibon这样说过。去年我在写下“Nboat重构计划”这几个字的时候,其实并没有想到我会放弃所有nboat的源代码,不用golang用nodejs重写一个网站出来。不过用node开发也并不是一下子决定的,当时也考虑了很多因素,突然想为什么我一开始想要用go来开发……性能又不是决定语言的第一因素,事实上选择一个合适的语言应该更为重要。我觉得最适合开发这个网站的语言是js,配合node框架,再用一个模板引擎,同时充分发挥后端mongodb数据库存文档的优势……这个配合简直不要再好。于是立即开坑,开始安排。

\n

域名和服务器都是现成的,cdn也暂时用cf的(后来换成了阿里的),问题一致指向了写代码上面,下一篇文章就介绍整个nboat2的程序结构和设计目的,谢谢大家,求三连(。

', 'index': 0, 'create_time': {'$date': '2020-08-06T23:34:01.507Z'}, 'last_modified_time': {'$date': '2020-08-07T00:23:53.543Z'}}, {'content': '# Nboat2的设计思路\n\n## 阅读文章\n\n存文章是Nboat2最重要的功能,Nboat2目前实现的部分就是大小文章的增删查改,因此这个功能也做的格外细致。\n\nNboat2目前只有托管博客文章的功能,但是未来它的功能会持续完善。Nboat2支持创建两种类型的文章,大博文和小博文。小博文仅仅是包含一篇文章的完整博客,而大博文中可以包含许多个小文章,它们按照次序排列好编上页码等待检索。总的来说,博客都有一些基本的属性,比如标题、创建时间、最后修改的日期、分类标签等等信息。大博文和小博文的不同之处就在于一个blog_type属性和一个叫article的字段的存储上。首先大博文和小博文可以根据一个叫做“blog_type”的字段来区分,同时大博文的article是一个array,其中每一项都是一个object,包含小文章的创建时间,修改日期,文章内容等信息;而小博文的article真的只是一个article而已,是一个完整的markdown代码字符串,代表文章的内容。\n\n不同的博文在文章列表/newest中呈现的状态不一样。大博文呈现的样式是一个大图在上面,配合下面的说明文字,同时在移动设备上也一定要展示大图来和小博文作出区别。而小博文呈现的则是一个细长的一条,右侧有一个200\200的图片展示区域,左侧则是标题和简要的说明信息。小博文在移动设备上呈现的效果是隐藏那个200\200的小图,只有在宽度达到一定程度的时候才会重新显示。\n\n博文还有“是否可见”属性,我可以自由控制一篇文章是否可见来控制它是否可以被搜索引擎或用户看/查询到。博客还有一个“阅读人数”的功能,这个功能仅仅是给我一个参考值,可以反复刷,但是这么做当然是没有意义的(闲着没事反复刷新浏览器/写各种脚本/做各种针对程序来爆破网站的用户大概不应该是我这个博客的读者,同时我的cdn也不是吃素的)。\n\n## 分页\n\nNboat2的分页也值得单独说一下。Nboat2中有两个细节需要用到分页:“最新的”页面和大博文的内页,二者的分页虽然共用一个渲染层,但是内在的逻辑不太相同,上线之前很多bug都是因为这两个分页产生的。\n\n### “最新的”分页\n\n这个分页相对简单一些,大概就是根据请求里的参数提取page的信息,然后再通过与“每页默认展示的条数”配合计算,最终得到需要查询的博文的范围。这个范围和用户是否可以看到隐藏博文的信息会被直接传入到底层的mongodb查询中,底层数据库直接返回查询的结果。\n\n### 大博文内分页\n\n在大博文内部也有一个分页,这个分页要稍稍复杂一些,首先每个大博文内的小文章都有一个index属性,这个属性是文章在大博文内部唯一的索引,只有同时用articleID和index才可以定位到一篇大博文中的一个小文章。正常情况下这个属性是顺序排列下去的,在大博文中创建一个新的小文章的时候,数据库会自动检索所有文章的index,取其最大值+1成为新文章的index(这个操作非常不对劲,很麻烦,正常情况下应该是优先保证小文章在列表中存储的先后顺序,然后直接取最后一篇文章的index+1即可)。同时页码和小文章的index不是一一对应的,这一点是为了保证index的有效性,即当用户访问/2的时候,他希望/2永远可以指向这一篇文章,但是如果我删除了1号文章,/2所指向的就是现在的第二篇也就是原来的第三篇文章了,这个操作是很不对的。\n实际上页码仅仅表示小文章在整个大博文文章列表中的位置,并不和url发生任何关系,也不保证稳定性——页码信息可以随时变动,但是一篇特定小博文的url是不会改变的。\n其实这么做也不能彻底解决这个问题。如果删除了最后一篇文章,新插入的文章还是会取代最后一篇文章的index。真正解决问题的方法就是把“next_index”作为一个属性插入到数据库结构中存起来,这个会在日后修改。\n\n## 主页\n\n这个主页是静态的页面,准确说是动态渲染的静态页面。网站目前只托管了我一个人的主页,未来可以计划把Eibon设计好的他的主页也装进去,但是后来证明Eibon是鸽子🕊\n\n主页上的图片是截取《天气之子》里面立花家的雨后的屋顶,这种有些古老韵味的建筑和雨后初晴的阳光配合,不知道有没有让你闻到一点点泥土的气息……哈哈哈。\n\n我个人也是非常喜欢新海诚动漫的,但是也不是纯度那么高的二次元,也讲不出什么东西来,以后有心情专门写篇小文章讲一讲吧,就当给看过的东西留个念想。看个动画写个文章,感觉有点像B站的长评论(\n\n这次先说这么多,下一篇文章就稍微硬核一点,讲讲Nboat2的整个程序的设计过程。', 'HTML': '

Nboat2的设计思路

\n

阅读文章

\n

存文章是Nboat2最重要的功能,Nboat2目前实现的部分就是大小文章的增删查改,因此这个功能也做的格外细致。

\n

Nboat2目前只有托管博客文章的功能,但是未来它的功能会持续完善。Nboat2支持创建两种类型的文章,大博文和小博文。小博文仅仅是包含一篇文章的完整博客,而大博文中可以包含许多个小文章,它们按照次序排列好编上页码等待检索。总的来说,博客都有一些基本的属性,比如标题、创建时间、最后修改的日期、分类标签等等信息。大博文和小博文的不同之处就在于一个blog_type属性和一个叫article的字段的存储上。首先大博文和小博文可以根据一个叫做“blog_type”的字段来区分,同时大博文的article是一个array,其中每一项都是一个object,包含小文章的创建时间,修改日期,文章内容等信息;而小博文的article真的只是一个article而已,是一个完整的markdown代码字符串,代表文章的内容。

\n

不同的博文在文章列表/newest中呈现的状态不一样。大博文呈现的样式是一个大图在上面,配合下面的说明文字,同时在移动设备上也一定要展示大图来和小博文作出区别。而小博文呈现的则是一个细长的一条,右侧有一个200200的图片展示区域,左侧则是标题和简要的说明信息。小博文在移动设备上呈现的效果是隐藏那个200200的小图,只有在宽度达到一定程度的时候才会重新显示。

\n

博文还有“是否可见”属性,我可以自由控制一篇文章是否可见来控制它是否可以被搜索引擎或用户看/查询到。博客还有一个“阅读人数”的功能,这个功能仅仅是给我一个参考值,可以反复刷,但是这么做当然是没有意义的(闲着没事反复刷新浏览器/写各种脚本/做各种针对程序来爆破网站的用户大概不应该是我这个博客的读者,同时我的cdn也不是吃素的)。

\n

分页

\n

Nboat2的分页也值得单独说一下。Nboat2中有两个细节需要用到分页:“最新的”页面和大博文的内页,二者的分页虽然共用一个渲染层,但是内在的逻辑不太相同,上线之前很多bug都是因为这两个分页产生的。

\n

“最新的”分页

\n

这个分页相对简单一些,大概就是根据请求里的参数提取page的信息,然后再通过与“每页默认展示的条数”配合计算,最终得到需要查询的博文的范围。这个范围和用户是否可以看到隐藏博文的信息会被直接传入到底层的mongodb查询中,底层数据库直接返回查询的结果。

\n

大博文内分页

\n

在大博文内部也有一个分页,这个分页要稍稍复杂一些,首先每个大博文内的小文章都有一个index属性,这个属性是文章在大博文内部唯一的索引,只有同时用articleID和index才可以定位到一篇大博文中的一个小文章。正常情况下这个属性是顺序排列下去的,在大博文中创建一个新的小文章的时候,数据库会自动检索所有文章的index,取其最大值+1成为新文章的index(这个操作非常不对劲,很麻烦,正常情况下应该是优先保证小文章在列表中存储的先后顺序,然后直接取最后一篇文章的index+1即可)。同时页码和小文章的index不是一一对应的,这一点是为了保证index的有效性,即当用户访问/2的时候,他希望/2永远可以指向这一篇文章,但是如果我删除了1号文章,/2所指向的就是现在的第二篇也就是原来的第三篇文章了,这个操作是很不对的。\n实际上页码仅仅表示小文章在整个大博文文章列表中的位置,并不和url发生任何关系,也不保证稳定性——页码信息可以随时变动,但是一篇特定小博文的url是不会改变的。\n其实这么做也不能彻底解决这个问题。如果删除了最后一篇文章,新插入的文章还是会取代最后一篇文章的index。真正解决问题的方法就是把“next_index”作为一个属性插入到数据库结构中存起来,这个会在日后修改。

\n

主页

\n

这个主页是静态的页面,准确说是动态渲染的静态页面。网站目前只托管了我一个人的主页,未来可以计划把Eibon设计好的他的主页也装进去,但是后来证明Eibon是鸽子🕊

\n

主页上的图片是截取《天气之子》里面立花家的雨后的屋顶,这种有些古老韵味的建筑和雨后初晴的阳光配合,不知道有没有让你闻到一点点泥土的气息……哈哈哈。

\n

我个人也是非常喜欢新海诚动漫的,但是也不是纯度那么高的二次元,也讲不出什么东西来,以后有心情专门写篇小文章讲一讲吧,就当给看过的东西留个念想。看个动画写个文章,感觉有点像B站的长评论(

\n

这次先说这么多,下一篇文章就稍微硬核一点,讲讲Nboat2的整个程序的设计过程。

', 'index': 1, 'create_time': {'$date': '2020-08-14T00:07:04.077Z'}, 'last_modified_time': {'$date': '2021-01-29T01:58:49.955Z'}}]