关于这个markdown笔记软件(二)——模型层设计
项目源码:
见(https://github.com/andytt/ErtuilEditor
目录
关于这个markdown笔记软件(五)——electron库
关于这个markdown笔记软件(六)——应用逻辑、electron对话框
数据库选择
之前也说过我们使用的是lowdb作为数据库处理,这个node.js非常小巧,只管理一个json文件。这对于一个小项目来说,是最合适不过的了。
安装
命令:
npm install lowdb --save
基本使用方法:
有关数据库对函数定义在./js/database.js文件中。
引入包:
var low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync')
链接数据库需要两部:
const adapter = new FileSync(db_path);
var db = low(adapter);
具体使用方法:
在npm网可以看到具体的使用方法。
建立模型
目前的模型非常简单,在database中只有三个表:label,notes,info。
- label:记录了标签名,拥有两个field,id、label_name
- notes:具体记录了所有笔记,三个field,id、label_name、note_name
- info:记录了标签和笔记的数量,label_num,note_num
下面代码给出了数据库初始化(只执行一次):
const adapter = new FileSync(db_path);
var db = low(adapter);
db.defaults({ label:[],notes:[],info:{} }).write();
db.get('label').push({id: 1,label_name :'default'}).write();
db.set('info.note_num',0).write();
db.set('info.label_num',1).write();
可以看到,对label表插入了默认标签,‘default’。
封装
database.js通过对外暴露以下函数,提供服务:
exports.db_get_node_number = db_get_node_number;
exports.db_change_label = db_change_label;
exports.db_init = db_init;
exports.db_insert_note = db_insert_note;
exports.db_get_labels = db_get_labels;
exports.db_get_notes_by_label = db_get_notes_by_label;
exports.db_get_note_by_name = db_get_note_by_name;
exports.db_get_id_by_name = db_get_id_by_name;
exports.db_change_node_name = db_change_node_name;
exports.db_remove_node = db_remove_node;
exports.db_insert_label = db_insert_label;
exports.db_remove_label = db_remove_label;
选择几个具体的函数给出代码:
function db_insert_note(db_path,name,label){
const adapter = new FileSync(db_path);
var db = low(adapter);
if(db.get('notes').find({ note_name: name }).size().value() >=1 ){
db.get('notes').find({ note_name: name }).assign({label_name : label}).write();
}else{
var id = db.get('info.note_num').value() + 1;
db.get('notes').push({id: id,note_name : name ,label_name : label}).write();
db.set('info.note_num',id).write();
}
}
插入笔记,如果重名且label不一致,就修改label。
function db_change_node_name(db_path,old_name,new_name){
const adapter = new FileSync(db_path);
var db = low(adapter);
db.get('notes').find({note_name:old_name}).assign({note_name:new_name}).write();
}
修改note的名字属性。
还有其他函数不再一一列举。
其他文件
基本原则
- 数据库文件和其他文本文件全部放在项目的./data/文件夹下。其中每一个笔记都创建一个同名文件夹,存放.md和通过markdown解析生成的.html文件。
- 如果有图片和其他文件,插入markdown时,会自动拷贝一份图片,并放在笔记同名文件夹下。引用复制的文件。
- 对于输出的pdf文件,原本打算生成后直接输出,不再本地保存。由于生成pdf的包不支持中文文件名,所以先将.html复制到./data/output.html,再进行打印。
其中对本地文件的存储和html渲染,在buildMarkdown.js文件中的save_file()函数实现。