徒手撸了个markdown笔记平台

大家好,我是若川。今天分享一篇markdown笔记平台的项目文章。

点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列



一、前言

作为开发者,我觉的用markdown写文档是一件很酷的事情。在之前,想找一款合适自己的markdown平台做笔记,尝试用了有道云、印象笔记、作业部落等平台,挺多功能需要收费或者满足不了,另外在产品设计上也不是自己想要的style,于是就想着打造一个属于自己风格的markdown笔记平台。

二、各平台markdown笔记差异

1.印象笔记

印象笔记

印象笔记主要专注于word文本编辑,目前web端是不支持markdown语法编写的。在2018年,印象笔记客户端开始支持markdown语法。

使用markdown过程中的一些缺陷:

  • 编辑器主题太少

  • 文档区域代码不支持主题设置

  • 外链访问有限,仅支持移动端打开,并且下载app才能预览。

  • 不支持导出md文件、批量导出

2.有道云笔记

有道云笔记

有道云也是专注于word文本编辑,支持markdown语法开发。界面相比印象笔记会美观一点。

使用markdown过程中的一些缺陷:

  • 编辑、预览区域滚动相对体验不太友好,有点生硬。

  • 预览区域代码不支持主题设置

  • 不支持批量导出

3.其它平台

比如作业部落,主要专注markdown笔记编写,由个人开发的平台,另外一些功能需要收费才能够使用,功能也比较局限。

总是来说,每个平台的比较各有各的优势,同时也存在一些缺陷,由此也萌生了Hbook笔记这个平台。

三、Hbook笔记

1.介绍

Hbook笔记是一款专注于Markdown笔记的平台。

头像图片

特性:

  • 支持编辑器、文档区域主题任意切换

  • 支持编辑、文档区域调整窗口大小

  • 支持单个、批量导出md文件

  • 支持文档截图

  • 文档目录

  • 文章支持分类

  • 支持控制外链访问

  • 拥有自己的个人主页

2.如何实现?

这是整个项目的一个架构图:

技术架构图

完成这么个项目,你需要具备的一些基本能力和条件:

  • [x] 一个域名

  • [x] 一台服务器(阿里云、腾讯云)

  • [x] web开发

  • [x] nodejs开发

  • [x] 安装node

  • [x] 安装pm2

  • [x] 安装nginx

  • [x] 安装mysql

  • [x] 安装redis

看着好像有点多?我已经为你准备好了教程,一步步教你如何安装部署。

安装部署教程[1]

前台实现

前台页面的核心实现其实就是编辑器,这里选用的是第三方 brace[2] 插件 ,brace支持各种语言的编辑器,这里选用 markdown 语法。

核心基础配置:

import ace from 'brace'
import 'brace/mode/markdown'
editor = ace.edit('editor');
editor.focus();// 设置字体 请勿用乱用字体,否则会影响光标位置问题,
editor.setOption('fontFamily', 'Menlo, 'Ubuntu Mono', Consolas, 'Courier New', 'Microsoft Yahei', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'sans-serif');
// 设置字体大小
editor.setOption('fontSize', '18px');
// 设置内容
editor.setValue(editContent);
// 清除选中
editor.clearSelection();
// 设置编辑器语言模式
editor.getSession().setMode('ace/mode/markdown');
// 设置皮肤
vm.changeEditorSkin(vm.themeData.editor)
//自动换行,设置为off关闭
editor.setOption('wrap', 'free')
// 设置是否只读
editor.setReadOnly(true || false); 
// 是否展示行号
editor.setOption('showGutter', false);
editor.setOption('autoScrollEditorIntoView', true);
// 使用软标签
editor.getSession().setUseSoftTabs(false);
// 线条
editor.renderer.setShowPrintMargin(false);
// 设置编辑器左右边距
editor.renderer.setPadding(35);

在用的过程中值得注意的事:

  • 请勿用乱用字体,建议用默认就行,否则会影响光标位置问题。

光标问题
  • 编辑器内容保存后出现xss问题,需要对文章内容相应的标签进行处理。

另外拿到文本之后,你需要把markdown语法转化成html展示,这里选用第三方 showdown[3]  插件,详情文档可点击查看。

使用示例:

import showdown from 'showdown'
const converter = new showdown.Converter({tables:true,tasklists:true,ghCodeBlocks:true,simpleLineBreaks:true,openLinksInNewWindow:true,backslashEscapesHTMLTags:true
});
const content = converter.makeHtml(val);

预览展示已经实现了,自然目录也少不了,目录只要把相应的标题标签全部找出来就行了,然后给每个不同的标题做一些不同层级的样式间距即可,大概实现方式:

const vm = this;
vm.anchorDom = [];const anchorList  = rc.querySelectorAll('h1,h2,h3,h4,h5,h6');anchorList.forEach(function(elem,index){const tag = elem.localName;vm.anchorDom.push({index:index,tag:tag,text:elem.innerText})elem.setAttribute('id','anchor-'+index);
})

另外编辑器滚动的时候预览区域也要相应的滚动到相应到位置,这边采用比较简单的方式,算出2个区域的高度比。

// 计算2边高度的占比
getScale() {const rightDiff = rc.offsetHeight - right.offsetHeight + 50; //预览内容高度减去盒子固定的高度const leftDiff = editor.renderer.layerConfig.maxHeight - left.offsetHeight; //编辑内容高度减去该盒子固定的高度return rightDiff / leftDiff;
}

然后监听2边的滚动事件做相应的处理:

// 编辑区滚动
editScroll() {const scale = this.getScale();right.scrollTop = left.scrollTop * scale
}
// 展示区滚动
showScroll() {const scale = this.getScale();editor.getSession().setScrollTop(right.scrollTop / scale);
}

另外考虑到编辑器、预览区域大小灵活问题,在中间滚动条也实现了可缩小或者扩大区域,根据自己喜好来调整,具体实现方式就是监听 mousemove 事件然后改变左右2边的宽度即可。

左边菜单获取到文章列表时需要生成树结构,实现方式:

/*** 无限分类格式化成树*/
function toTree(data){// 删除 所有 children,以防止多次调用data.forEach(function(item) {delete item.children;});// 将数据存储为 以 id 为 KEY 的 map 索引数据列var map = {};data.forEach(function(item, index) {map[item.id] = item;});var val = [];data.forEach(function(item) {// 以当前遍历项,的pid,去map对象中找到索引的idvar parent = map[item.parent_id];// 如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的父级中if (parent) {(parent.children || (parent.children = [])).push(item);} else {//如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中,作为顶级val.push(item);}});return val;
}

后台实现

后台技术这里主要采用nodejs,核心主要在表结构设计上,其它的相对还好。

这个项目的一个表结构设计,仅够大家参考了解:

  • 用户表

字段类型是否必填备注
idNumberid
usernameString用户名
passwordString密码
emailString邮件
nicknameString昵称
mobileString手机
descString描述
avatarString头像
provinceString省份
cityString城市
sourceString来源
statusNumber状态

  • 文章分类表

字段类型是否必填备注
idNumberid
user_idNumber用户ID
parent_idNumber父级分类ID,0为第一级
category_nameString分类名称

  • 文章表

字段类型是否必填备注
idNumberid
titleString标题
contentTEXT文章内容
stateNumber文章状态 0 未对外开放 1 对外开放 2 禁止文章
passwordString文章访问密码
browser_numINTEGER阅读数

另外可对文章内容设置的标签进行更细一步进行分类,通过标签筛选出相对应的文章,这个实现逻辑比较复杂就不讲了,有兴趣的可以交流下。

基本上满足以上3个表就可以搭建自己的一个文章库了。

3.后续优化

  1. 实现文章密码访问权限

  2. 新增导出pdf文件

  3. 编辑器文本过滤非法标签

  4. 两边滚动区域更加精准

4.愿景

愿景:让笔记成为一种习惯,让分享成为一种快乐。

5.最后

原本的初心弄个笔记出来玩玩,但没想到自己做出来后却养成了一个写笔记的习惯,记录了工作上的点点滴滴,让自己也收获匪浅。

最后欢迎体验该产品,提出您宝贵的建议。Hbook[4]

建议

四、总结

通过上面的讲解,相信你对整个流程也基本熟悉,自己也可以尝试动起来,有啥问题欢迎一起交流。

参考资料

[1]

安装部署教程: http://bookcss.com/note/12/14

[2]

brace: https://github.com/thlorenz/brace

[3]

showdown: https://github.com/showdownjs/showdown

[4]

Hbook: http://bookcss.com


最近组建了一个江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你进群。


················· 若川出品 ·················

今日话题

大家都知道项目经验很重要,如果有空不妨也试着做一个笔记平台,或者简历平台,相信能学到很多。欢迎在下方留言~  欢迎分享、收藏、点赞、在看我的公众号文章~

一个愿景是帮助5年内前端人走向前列的公众号

可加我个人微信 ruochuan12,长期交流学习

推荐阅读

我在阿里招前端,我该怎么帮你?(现在还能加我进模拟面试群)

若川知乎问答:2年前端经验,做的项目没什么技术含量,怎么办?

点击方卡片关注我、加个星标,或者查看源码等系列文章。
学习源码整体架构系列、年度总结、JS基础系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

This week I’ve been forging background illustrations for my website, epdillon.com (launching soon). I’ve been using Adobe Illustrator to do all the major casting, dabbling in Figma only to temper the colours. Fresh from the design furnace, my hands are a…

pyqt控件显示重叠_Python编程:一个不错的基于PyQt的Led控件显示库,建议收藏学习...

1、控件说明在Github上,偶然发现了一个基于PyQt5的第三方Led指示灯控件库,使用起来非常方便,控件外观也比较漂亮,更难能可贵的是作者源代码写得比较简洁,仅仅才约200行左右,可以作为一个在PyQt中写自定义控…

编写高质量可维护的代码:优雅命名

大家好,我是若川。今天分享一篇关于如何命名更优雅的文章。点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列本文首发于政采云前端团队博客:编写高质量可维护的代码:优雅命名ht…

powerpoint技巧_几乎每个PowerPoint都烂鸡蛋

powerpoint技巧Almost 20 years ago — 2001! — Seth Godin wrote an ebook called Really Bad Powerpoint (and how to avoid it). In that book he detailed all of the things that tend to go wrong in slide presentations.差不多20年前-2001年! —塞斯戈丁(S…

认识mysql总结_从根上理解Mysql - 读后个人总结1-搜云库

初识 MySQL通信介绍MySQL 也是典型的 C / S 模型,分为客户端及服务端,服务端一般部署在远端服务器中,也可以部署至本地,然后客户端跟服务端通信则可以使用依赖网络的 TCP 长连接或 Unix-like 的系统下可以使用 Socket文件的形式通…

面试官问:你在项目中做过哪些安全防范措施?

大家好,我是若川。今天分享一篇安全相关的文章。点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列如果你被面试官问到这个问题,不要急于描述自己遇到的问题以及如何处理的,你得…

消灭病毒_消灭遗产

消灭病毒The year was 1995, I was 10 years of age. The number 1 single in the UK was Think Twice by Celine Dion, and Batman Forever was the highest grossing movie across the pond in the States. Manchester United, unfortunately, won their 3rd Premier League …

logcat崩溃_使用logcat抓取Android崩溃日志

一、安装jdkJDK网上教程非常多,此处不再赘述。(好像不装也没关系,未实测)二、工具列表a) adb包(v.1.0.31版本或以上,下文提供下载地址)b) logcat.bat文件(下文制作)三、安装adb(二选一)a) 放到任意位置(推荐)因为adb…

基于 Ubuntu 16.04 LTS 的 KDE neon 到达维护周期

随着 KDE neon 在 Ubuntu 18.04 LTS 发布,开发团队已经决定 放弃维护基于 Ubuntu 16.04 LTS版本,大多数用户预警将希望升级到基于 Ubuntu LTS 的 KDE neno 新版本。“去年KDE neno 被重新定位到 Ubuntu bionic / 18.04上,并且升级已经基本顺利…

真诚推荐7个能助你成长的前端大佬

不得不说,如今比前些年学习资料多很多了。现在的前端公众号也挺多的,这里推荐几个前端大佬运营的公众号,都是聚焦前端垂直领域的优质公众号,关注这些公众号至少可以:1、了解现在前端技术发展情况和未来发展趋势&#x…

Silverlight学习笔记(3):Silverlight的界面布局

在上一篇中讲述了使用VS2010开发Silverlight的一些基础知识,并且讲述了Silverlight的部署和代码安全知识,这一篇主要是讲述如何在Silverlight中摆放界面元素。记得早年前我还在学习Java的时候,当时有两种开发Java SE的方法,一种是…

pov-inc_yourself劳自己-懒惰的设计师的POV和一些Figma

pov-incAre you ready and lazy enough (you will fully understand with continue reading this)? Coffee and tea next to you? Alright. This article is going to (not) kick you in your a**. It will be a bit of ‘lesson learned’, for sure a bit of FIGMA, and a …

Geary 0.13.0 发布,GNOME 3 Email 客户端应用

百度智能云 云生态狂欢季 热门云产品1折起>>> Geary 0.13.0 发布了,Geary 是一个电子邮件应用,用于 GNOME 3 桌面版本,它允许阅读、查找和发送电子,并提供简洁、现代化的界面。这是一个重要的新版本,具有许…

轻型本地服务器_一小时超轻型漂移机

轻型本地服务器Iwas introduced to the world of Hyper Light Drifter through a series of visions — titans ravage a broken city, a shallow sea is stained red by floating corpses, a skinny dog leads me into the yawning abyss of a pillar in the center of the se…

聊聊前端面试

大家好,我是若川。今天分享一篇面试相关的文章。点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列最近 Zoom 国内又开放招聘了,我们组有了前端的 HC,所以我也参加了几场面试。合…

mysql读写分离和分布式_MySQL主从复制与读写分离

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全…

ux和ui_UI和UX设计师的10种软技能

ux和ui重点 (Top highlight)As designers, whether it be UI, UX, or Product Design, we tend to direct our focus and energy on developing and mastering tangible skills.作为设计师,无论是UI,UX还是产品设计,我们都将重点和精力放在开…

SQLServer中批量插入数据方式的性能对比 (转)

转自:http://www.cnblogs.com/wlb/archive/2010/03/02/1676136.html 昨天下午快下班的时候,无意中听到公司两位同事在探讨批量向数据库插入数据的性能优化问题,顿时来了兴趣,把自己的想法向两位同事说了一下,于是有了本…

VueConf China 2021 《Vue3生态进展-尤雨溪》 Reaction

大家好,我是若川。今天分享昨天Vueconf的一篇文章,来了解下Vue的生态进展。另外今晚7点,Vuebeijing社区邀请了尤大会在视频号直播,可以加我微信 ruochuan12,告诉观看地址提前预约。点击下方卡片关注我、加个星标&#…

Plsql运行mysql脚本_oracle中PLSQL语句

1.set autot off 禁止使用autotrace命令 set autot on 这个命令包括exp 和 stat(执行语句、生成explain plan、生成统计信息) set autot trace 不执行sql语句,但(生成explain plan、生成统计信息) set autot trace exp stat 与上句同 set autot trace st1.set autot…