日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

徒手撸了个markdown笔记平台

發(fā)布時間:2023/12/9 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 徒手撸了个markdown笔记平台 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家好,我是若川。今天分享一篇markdown筆記平臺的項目文章。

點擊下方卡片關(guān)注我、加個星標(biāo),或者查看源碼等系列文章。學(xué)習(xí)源碼整體架構(gòu)系列、年度總結(jié)、JS基礎(chǔ)系列



一、前言

作為開發(fā)者,我覺的用markdown寫文檔是一件很酷的事情。在之前,想找一款合適自己的markdown平臺做筆記,嘗試用了有道云、印象筆記、作業(yè)部落等平臺,挺多功能需要收費或者滿足不了,另外在產(chǎn)品設(shè)計上也不是自己想要的style,于是就想著打造一個屬于自己風(fēng)格的markdown筆記平臺。

二、各平臺markdown筆記差異

1.印象筆記

印象筆記

印象筆記主要專注于word文本編輯,目前web端是不支持markdown語法編寫的。在2018年,印象筆記客戶端開始支持markdown語法。

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

  • 編輯器主題太少

  • 文檔區(qū)域代碼不支持主題設(shè)置

  • 外鏈訪問有限,僅支持移動端打開,并且下載app才能預(yù)覽。

  • 不支持導(dǎo)出md文件、批量導(dǎo)出

2.有道云筆記

有道云筆記

有道云也是專注于word文本編輯,支持markdown語法開發(fā)。界面相比印象筆記會美觀一點。

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

  • 編輯、預(yù)覽區(qū)域滾動相對體驗不太友好,有點生硬。

  • 預(yù)覽區(qū)域代碼不支持主題設(shè)置

  • 不支持批量導(dǎo)出

3.其它平臺

比如作業(yè)部落,主要專注markdown筆記編寫,由個人開發(fā)的平臺,另外一些功能需要收費才能夠使用,功能也比較局限。

總是來說,每個平臺的比較各有各的優(yōu)勢,同時也存在一些缺陷,由此也萌生了Hbook筆記這個平臺。

三、Hbook筆記

1.介紹

Hbook筆記是一款專注于Markdown筆記的平臺。

頭像圖片

特性:

  • 支持編輯器、文檔區(qū)域主題任意切換

  • 支持編輯、文檔區(qū)域調(diào)整窗口大小

  • 支持單個、批量導(dǎo)出md文件

  • 支持文檔截圖

  • 文檔目錄

  • 文章支持分類

  • 支持控制外鏈訪問

  • 擁有自己的個人主頁

2.如何實現(xiàn)?

這是整個項目的一個架構(gòu)圖:

技術(shù)架構(gòu)圖

完成這么個項目,你需要具備的一些基本能力和條件:

  • [x] 一個域名

  • [x] 一臺服務(wù)器(阿里云、騰訊云)

  • [x] web開發(fā)

  • [x] nodejs開發(fā)

  • [x] 安裝node

  • [x] 安裝pm2

  • [x] 安裝nginx

  • [x] 安裝mysql

  • [x] 安裝redis

看著好像有點多?我已經(jīng)為你準(zhǔn)備好了教程,一步步教你如何安裝部署。

安裝部署教程[1]

前臺實現(xiàn)

前臺頁面的核心實現(xiàn)其實就是編輯器,這里選用的是第三方 brace[2] 插件 ,brace支持各種語言的編輯器,這里選用 markdown 語法。

核心基礎(chǔ)配置:

import?ace?from?'brace' import?'brace/mode/markdown' editor?=?ace.edit('editor'); editor.focus();//?設(shè)置字體?請勿用亂用字體,否則會影響光標(biāo)位置問題, editor.setOption('fontFamily',?'Menlo,?'Ubuntu?Mono',?Consolas,?'Courier?New',?'Microsoft?Yahei',?'Hiragino?Sans?GB',?'WenQuanYi?Micro?Hei',?'sans-serif'); //?設(shè)置字體大小 editor.setOption('fontSize',?'18px'); //?設(shè)置內(nèi)容 editor.setValue(editContent); //?清除選中 editor.clearSelection(); //?設(shè)置編輯器語言模式 editor.getSession().setMode('ace/mode/markdown'); //?設(shè)置皮膚 vm.changeEditorSkin(vm.themeData.editor) //自動換行,設(shè)置為off關(guān)閉 editor.setOption('wrap',?'free') //?設(shè)置是否只讀 editor.setReadOnly(true?||?false);? //?是否展示行號 editor.setOption('showGutter',?false); editor.setOption('autoScrollEditorIntoView',?true); //?使用軟標(biāo)簽 editor.getSession().setUseSoftTabs(false); //?線條 editor.renderer.setShowPrintMargin(false); //?設(shè)置編輯器左右邊距 editor.renderer.setPadding(35);

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

  • 請勿用亂用字體,建議用默認(rèn)就行,否則會影響光標(biāo)位置問題。

光標(biāo)問題
  • 編輯器內(nèi)容保存后出現(xiàn)xss問題,需要對文章內(nèi)容相應(yīng)的標(biāo)簽進行處理。

另外拿到文本之后,你需要把markdown語法轉(zhuǎn)化成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);

預(yù)覽展示已經(jīng)實現(xiàn)了,自然目錄也少不了,目錄只要把相應(yīng)的標(biāo)題標(biāo)簽全部找出來就行了,然后給每個不同的標(biāo)題做一些不同層級的樣式間距即可,大概實現(xiàn)方式:

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); })

另外編輯器滾動的時候預(yù)覽區(qū)域也要相應(yīng)的滾動到相應(yīng)到位置,這邊采用比較簡單的方式,算出2個區(qū)域的高度比。

//?計算2邊高度的占比 getScale()?{const?rightDiff?=?rc.offsetHeight?-?right.offsetHeight?+?50;?//預(yù)覽內(nèi)容高度減去盒子固定的高度const?leftDiff?=?editor.renderer.layerConfig.maxHeight?-?left.offsetHeight;?//編輯內(nèi)容高度減去該盒子固定的高度return?rightDiff?/?leftDiff; }

然后監(jiān)聽2邊的滾動事件做相應(yīng)的處理:

//?編輯區(qū)滾動 editScroll()?{const?scale?=?this.getScale();right.scrollTop?=?left.scrollTop?*?scale } //?展示區(qū)滾動 showScroll()?{const?scale?=?this.getScale();editor.getSession().setScrollTop(right.scrollTop?/?scale); }

另外考慮到編輯器、預(yù)覽區(qū)域大小靈活問題,在中間滾動條也實現(xiàn)了可縮小或者擴大區(qū)域,根據(jù)自己喜好來調(diào)整,具體實現(xiàn)方式就是監(jiān)聽 mousemove 事件然后改變左右2邊的寬度即可。

左邊菜單獲取到文章列表時需要生成樹結(jié)構(gòu),實現(xiàn)方式:

/***?無限分類格式化成樹*/ function?toTree(data){//?刪除?所有?children,以防止多次調(diào)用data.forEach(function(item)?{delete?item.children;});//?將數(shù)據(jù)存儲為?以?id?為?KEY?的?map?索引數(shù)據(jù)列var?map?=?{};data.forEach(function(item,?index)?{map[item.id]?=?item;});var?val?=?[];data.forEach(function(item)?{//?以當(dāng)前遍歷項,的pid,去map對象中找到索引的idvar?parent?=?map[item.parent_id];//?如果找到索引,那么說明此項不在頂級當(dāng)中,那么需要把此項添加到,他對應(yīng)的父級中if?(parent)?{(parent.children?||?(parent.children?=?[])).push(item);}?else?{//如果沒有在map中找到對應(yīng)的索引ID,那么直接把?當(dāng)前的item添加到?val結(jié)果集中,作為頂級val.push(item);}});return?val; }

后臺實現(xiàn)

后臺技術(shù)這里主要采用nodejs,核心主要在表結(jié)構(gòu)設(shè)計上,其它的相對還好。

這個項目的一個表結(jié)構(gòu)設(shè)計,僅夠大家參考了解:

  • 用戶表

字段類型是否必填備注
idNumberid
usernameString用戶名
passwordString密碼
emailString郵件
nicknameString昵稱
mobileString手機
descString描述
avatarString頭像
provinceString省份
cityString城市
sourceString來源
statusNumber狀態(tài)

  • 文章分類表

字段類型是否必填備注
idNumberid
user_idNumber用戶ID
parent_idNumber父級分類ID,0為第一級
category_nameString分類名稱

  • 文章表

字段類型是否必填備注
idNumberid
titleString標(biāo)題
contentTEXT文章內(nèi)容
stateNumber文章狀態(tài) 0 未對外開放 1 對外開放 2 禁止文章
passwordString文章訪問密碼
browser_numINTEGER閱讀數(shù)

另外可對文章內(nèi)容設(shè)置的標(biāo)簽進行更細(xì)一步進行分類,通過標(biāo)簽篩選出相對應(yīng)的文章,這個實現(xiàn)邏輯比較復(fù)雜就不講了,有興趣的可以交流下。

基本上滿足以上3個表就可以搭建自己的一個文章庫了。

3.后續(xù)優(yōu)化

  • 實現(xiàn)文章密碼訪問權(quán)限

  • 新增導(dǎo)出pdf文件

  • 編輯器文本過濾非法標(biāo)簽

  • 兩邊滾動區(qū)域更加精準(zhǔn)

  • 4.愿景

    愿景:讓筆記成為一種習(xí)慣,讓分享成為一種快樂。

    5.最后

    原本的初心弄個筆記出來玩玩,但沒想到自己做出來后卻養(yǎng)成了一個寫筆記的習(xí)慣,記錄了工作上的點點滴滴,讓自己也收獲匪淺。

    最后歡迎體驗該產(chǎn)品,提出您寶貴的建議。Hbook[4]

    建議

    四、總結(jié)

    通過上面的講解,相信你對整個流程也基本熟悉,自己也可以嘗試動起來,有啥問題歡迎一起交流。

    參考資料

    [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 拉你進群。


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

    今日話題

    大家都知道項目經(jīng)驗很重要,如果有空不妨也試著做一個筆記平臺,或者簡歷平臺,相信能學(xué)到很多。歡迎在下方留言~? 歡迎分享、收藏、點贊、在看我的公眾號文章~

    一個愿景是幫助5年內(nèi)前端人走向前列的公眾號

    可加我個人微信?ruochuan12,長期交流學(xué)習(xí)

    推薦閱讀

    我在阿里招前端,我該怎么幫你?(現(xiàn)在還能加我進模擬面試群)

    若川知乎問答:2年前端經(jīng)驗,做的項目沒什么技術(shù)含量,怎么辦?

    點擊方卡片關(guān)注我、加個星標(biāo),或者查看源碼等系列文章。
    學(xué)習(xí)源碼整體架構(gòu)系列、年度總結(jié)、JS基礎(chǔ)系列

    總結(jié)

    以上是生活随笔為你收集整理的徒手撸了个markdown笔记平台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。