徒手擼了個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.pswp.cn/news/275880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275880.shtml
英文地址,請注明出處:http://en.pswp.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…

【轉】Vector與ArrayList區別

在寫java的時候,基本上都喜歡用arraylist,甚至我都不知道有個vector的存在。查了一下發現又是線程安全問題。。。咋個線程安全天天圍著我轉呢。。。多得阿里巴巴,讓我開始認識java的所謂線程安全問題。 the following is from:htt…

pyqt控件顯示重疊_Python編程:一個不錯的基于PyQt的Led控件顯示庫,建議收藏學習...

1、控件說明在Github上,偶然發現了一個基于PyQt5的第三方Led指示燈控件庫,使用起來非常方便,控件外觀也比較漂亮,更難能可貴的是作者源代碼寫得比較簡潔,僅僅才約200行左右,可以作為一個在PyQt中寫自定義控…

編寫高質量可維護的代碼:優雅命名

大家好,我是若川。今天分享一篇關于如何命名更優雅的文章。點擊下方卡片關注我、加個星標,或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列本文首發于政采云前端團隊博客:編寫高質量可維護的代碼:優雅命名ht…

繼春晚不宕機后,百度云這次拿下攜程大單

今年春晚,百度和央視聯手發放高達9億現金紅包的消息,想必讓不少人替百度捏了把汗。根據統計,春晚期間,全球觀眾參與百度App紅包互動次數累計達到208億次,日活從1.6億沖上3億關口,這么大的瞬時流量沖擊是百度…

mysql int 11 java_mysql中int(11)列的大小(以字節為單位)是多少?

正如其他人所說,列可以存儲的最小/最大值以及以字節為單位的存儲量僅由類型而不是長度定義 .很多這些答案都說 (11) 部分僅影響顯示寬度,這不完全正確,但主要是 .int(2) 與 no zerofill specified 的定義將:仍然接受 100 的值輸出…

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文件的形式通…

白帽子技術分析會話劫持實戰講解

前言通常,大家所說的hack,都是針對一臺主機,在獲得管理員權限后,就很是得意;其實,真正的hacker是占領整個內部網絡。針對內部網絡的hack方法比較多,但比較有效的方法非ARP欺騙、DNS欺騙莫屬了。…

面試官問:你在項目中做過哪些安全防范措施?

大家好,我是若川。今天分享一篇安全相關的文章。點擊下方卡片關注我、加個星標,或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列如果你被面試官問到這個問題,不要急于描述自己遇到的問題以及如何處理的,你得…

TCP/IP協議族之應用層協議(FTP、TFTP)

文件傳送協議FTP: File Transfer Protocol 是因特網上使用得最廣泛的文件傳送協議。提供交互式的訪問,允許客戶指明文件的類型與格式(如指明是否使用ASCII碼),并允許文件具有存取權限(如訪問文件的用戶必須經過授權&am…

消滅病毒_消滅遺產

消滅病毒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 桌面版本,它允許閱讀、查找和發送電子,并提供簡潔、現代化的界面。這是一個重要的新版本,具有許…

mysql表連接_mysql表連接

在數據庫中tableA連接tableB如下:tableA:a1  a21  12  23  24  3tableB:b1 b22  12  23  33  46  5笛卡爾積:select * from tableA, tableB.1  1  2  11  1  2  21  1  3  31  1  3  41  1  6  52…

輕型本地服務器_一小時超輕型漂移機

輕型本地服務器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…