前面四篇介绍了wxPython的一些基础知识,从这一篇文章开始,我们就准备进行实际的开发工作了。
需求分析
首先进行需求分析,看看我们的笔记需要哪些功能。
- 最左侧是笔记本列表,可以通过右键菜单来使用笔记本的创建、修改和删除功能。创建时支持无限子目录。
- 中间一栏是笔记列表,可以通过右键菜单来拷贝笔记,移动笔记以及删除笔记。并且可以通过顶部的按钮对笔记进行排序,还可以通过搜索框来搜索笔记,并支持搜索结果高亮。
- 最右边是一个富文本编辑器,可以自动保存笔记标题和内容。
以上就是笔记本的主要功能,在前言部分还提及到,除了笔记功能以外,还支持待办事项管理功能,来看一个截图。
点击底部状态栏的数字区域,就会弹出如上图所示的待办事项面板,面板下方有一个工具栏,可以进行增删改查功能。状态栏的数字区域显示了当前任务完成情况。
因为我们的主要任务是开发笔记本,所以待办事项的实现会放在最后。
可以看到,主要功能就是笔记本和笔记的增删改查,暂时不考虑内容同步。
对于数据存储,我们可以将笔记本和笔记数据存放在数据库里面,但笔记详情可以考虑保存在单个文件里面,在数据库里面存储实际的文件路径即可,这样做便于笔记管理。
接下来我们来设计一下数据库。
数据库设计
考虑到数据便携性,我们准备使用SQLite数据库。从上面的需求分析可以看到,笔记应用涉及到了三个实体,分别是笔记本、笔记、待办事项,接下来逐个设计表结构。
笔记本实体
对于笔记本,我们需要以下属性:
id
:主键parent_id
上一级笔记本idname
: 笔记本名称description
笔记本描述updated_at
更新时间created_at
创建时间
对应的SQLite语句是
CREATE TABLE IF NOT EXISTS `notebooks` (
`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT
, `name` varchar(20) NOT NULL DEFAULT ''
, `parent_id` integer DEFAULT NULL
, `description` varchar(300) DEFAULT ''
, `updated_at` timestamp NOT NULL DEFAULT current_timestamp
, `created_at` timestamp NOT NULL DEFAULT current_timestamp
, CONSTRAINT `notebooks_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `notebooks` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);
笔记实体
一个笔记本包含多条笔记,需要的属性如下:
id
主键title
笔记标题notebook_id
笔记本idlocal_uuid
笔记所在文件夹,这个接下来会讲到updated_at
更新时间created_at
创建时间
因为笔记是富文本,所以我们将笔记详情保存为html文件,并将对应的纯文本保存为txt文件,用于笔记列表里面的预览。这样每个笔记就有两个文件了,我们将这两个文件放在一个文件夹里面,文件夹名字通过uuid来实现,这就是为什么笔记实体需要 local_uuid
的原因。
对应的SQLite语句如下
CREATE TABLE IF NOT EXISTS `notes` (
`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT
, `title` varchar(30) DEFAULT ''
, `notebook_id` integer DEFAULT NULL
, `created_at` timestamp NULL DEFAULT current_timestamp
, `updated_at` timestamp NULL DEFAULT current_timestamp
, `local_uuid` varchar(36) DEFAULT ''
, CONSTRAINT `notes_ibfk_1` FOREIGN KEY (`notebook_id`) REFERENCES `notebooks` (`id`) ON DELETE CASCADE
);
待办事项实体
一条笔记会关联多个待办事项,不难分析得出以下属性:
id
主键title
标题content
详情内容remark
备注note_id
关联的笔记idgroup
分组名称is_finished
是否已完成finished_at
完成时间updated_at
更新时间created_at
创建时间
对应的SQLite语句如下
CREATE TABLE IF NOT EXISTS `todos` (
`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT
, `title` varchar(150) NOT NULL DEFAULT ''
, `content` varchar(5000) DEFAULT ''
, `remark` varchar(5000) DEFAULT ''
, `finished_at` datetime DEFAULT NULL
, `is_finished` integer DEFAULT '0'
, `note_id` integer DEFAULT NULL
, `created_at` timestamp NULL DEFAULT current_timestamp
, `updated_at` timestamp NULL DEFAULT current_timestamp
, `group` varchar(200) DEFAULT NULL
, CONSTRAINT `todos_ibfk_1` FOREIGN KEY (`note_id`) REFERENCES `notes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);
总结
以上就是笔记本应用的数据库设计,我们会在接下来的文章中通过Python来创建这些数据表以及相关索引,暂时不需要手动运行上面的SQL语句。下一篇将介绍笔记本应用的界面组成和实现思路,并搭建基本框架。