[中文][English]
Smart-Todo是一个简单智能的待办事项管理程序. Smart-Todo提供了创建和删除待办事项的基础功能, 并在此基础上自动优先级排序, 离线下载文件, 创建便签等重要的辅助功能.
本项目已经支持Docker方式部署, 并且已经在Github提供的镜像托管服务ghcr.io上发布了此项目的镜像文件. 当前可使用docker-compose一键部署, 将如下的内容保存为docker-compose.yml
version: '3.0'
services:
todo:
container_name: smart-todo
image: ghcr.io/lizec123/smart-todo:latest
environment:
TZ: Asia/Shanghai
ports:
- "8080:80"
volumes:
- ./config:/app/config
- ./data:/app/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro执行如下命令即可拉取并在后台运行服务
docker-compose up -d如果无法访问ghcr.io, 则可以将此项目clone到本地后, 手动执行如下的命令在本地构建镜像
docker build . --file docker/Dockerfile --tag ghcr.io/lizec123/smart-todo
镜像构建成功后, 可继续使用上述的docker-compose.yml文件启动服务. 此时由于本地已存在目标镜像, 将会自动使用本地的镜像.
项目默认在8080端口提供服务, 可通过修改docker-compose.yml文件修改项目配置.
本项目在config文件夹中提供了一个默认配置文件(config/default.json), 在本地运行或者测试时可以直接使用默认配置.
默认提供了两个测试用户, 信息如下
| 用户名 | 密码 | 权限 |
|---|---|---|
admin |
123456 |
ROLE_ADMIN, ROLE_USER |
user |
123456 |
ROLE_USER |
其中user用户仅拥有普通权限, 仅能够普通的使用系统的基本功能, 而admin用户具有管理员权限, 除了普通的使用系统外, 还可以查看系统日志, 执行特殊指令.
如果将项目部署在公网, 建议在config文件夹中创建config.json文件来覆盖原有配置. 即当config.json与default.json同时存在时, 优先加载config.json.
一个完整的用户配置如下所示:
"user": {
"password": "123456",
"email": "user@example.com",
"role": ["ROLE_USER"],
"qw_hook": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxx-xxxx"
}其中email字段和qw_hook字段可选填, 当email字段字段非空时, 用户的日报和周报会推送到该邮箱. 当qw_hook字段非空时, 用户的日报和周报会推送到该企业微信机器人.
关于企微微信机器人的配置, 可参考官方文档
直接在标题栏输入代办事项的标题即可创建一个基础的代办事项. 创建时可以选择任务的重要程度, 默认为低优任务, 可修改为普通任务或者高优任务. 不同任务具有如下的区别
| 任务类型 | 默认截止时间 |
|---|---|
| 高优任务 | +2d |
| 普通任务 | +4d |
| 低优任务 | +8d |
所有任务都会设置一个默认的截止时间, 例如+8d表示在当前时间的基础上增加8天作为截止时间.
在创建待办时, 如果输入为一个URL, 则自动将此URL对应的页面的标题作为此待办的标题. 同时左键点击此待办事项可以直接跳转到对应的页面, 右键单击此待办事项可以按照Markdown格式复制标题和对应的URL
此功能可用于临时保存某个需要后续查看的网页, 或者需要将该网页在Markdown格式的博客中引用的场景.
对于标记为已完成的待办事项, 在每天凌晨会自动被删除.
本项目支持使用番茄工作法来管理和完成任务. 本项目提供了两个任务列表, 即"活动清单"和"今日任务". 位于活动清单中的任务是等待被完成的任务, 根据其重要性与截止日期, 活动清单中的任务按照优先级进行排序. 点击右侧按钮可将其中的任务转移到今日任务.
位于今日任务列表中的任务是预今日完成的任务, 其中的任务按照添加顺序排列, 即最先添加的任务排列在列表的最前面. 点击标题部分的"今日任务"跳转至番茄钟页面.
在番茄钟页面可查看当前用户所有的今日任务, 并可选择其中的一项任务启用番茄钟. 启动番茄钟后, 将自动开始25分钟的倒计时. 倒计时结束后, 将会自动将该任务的完成计数加一, 并播放音乐提示用户.
注意: 倒计时结束依赖Web端检测, 因此需要确保番茄钟页面处于活动状态. 例如在移动端浏览器进入后台后, 页面就可能不处于活动状态.
每日除了按照番茄钟进行划分以外, 还可以将若干番茄钟组合为一个番茄组, 在组与组之间增加一段较长的休息时间. 当前按照如下的方式构造番茄组
| 时段 | 起止时间 | 番茄钟数量 |
|---|---|---|
| 早间 | 7:00 ~ 9:40 | 自由安排 |
| 上午 | 9:40 ~ 11:40 | 4个 |
| 午间 | 11:40 ~ 14:20 | 自由安排 |
| 下午1 | 14:20 ~ 16:20 | 4个 |
| 下午休息 | 16:20 ~ 16:40 | 中间休息 |
| 下午2 | 16:40 ~ 17:40 | 2个 |
| 晚间 | 17:40 ~ 19:00 | 自由安排 |
| 晚上 | 19:00 ~ 20:00 | 2个 |
| 晚上sp | 20:00 ~ 21:00 | 自由安排 |
在创建代办事项时, 支持使用如下的参数为代办事项附加额外的属性.
在创建任意类型的任务时, 可以使用-dl参数来设置截止日期. 例如
写日记 -dl 11.12
周末会议 -dl 3.12:12
可以用11.12的方式指定日期为11月12日, 也可以使用3.12:12的方式将截止日期精确到3月12日中午12点.
如果不指定小时, 则默认为当天的零点, 不需要指定年份, 程序会自动推断未来一年内最接近的日期.
除了明确指定某个日期以外, 还可以通过类似W<N>的方式指定截止时间为一周中的某一天. 例如
写日记 -dl W2
周末会议 -dl W5
如果当前是周三, 则W2表示下周二, W5表示本周五.
代办事项的截止日期是影响该事项排序的重要指标之一, 将决定该事项在列表中展示的先后位置. 虽然所有任务均会根据优先级默认设置截止日期, 但依然鼓励手动设置精确的截止日期
在创建代办事项时, 可使用-tag参数来设置标签. 例如
上班打卡 -tag before
标签为代办事项附加额外的语义信息, 并且如下的一些tag将产生特殊效果
| 标签名 | 效果 |
|---|---|
| before | 此标记任务进入今日事项后将位于所有任务之前 |
| lunch | 此标记任务进入今日事项后将位于午餐时段展示 |
| dinner | 此标记任务进入今日事项后将位于晚餐时段展示 |
| after | 此标记任务进入今日事项后将位于所有任务之后 |
在创建代办事项时, 如果以每日开头, 则会询问是否创建每日任务, 例如
每日看论文
每日任务在标记为完成状态后不会被垃圾收集, 并且在第二天会自动变为未完成状态的今日任务.
在创建任意类型的任务时, 可以使用-sp参数来创建一个周期任务. 例如
每周任务 -sp 7
周期任务在标记为完成状态后不会被垃圾收集. 在每日凌晨会检查所有处于已完成状态的周期性任务, 重置该周期性任务的的状态为未完成状态, 并自动将任务的截止日期增加-sp参数所指定的天数.
例如当前示例上-sp后的数字为7, 就相当于每周执行一次.
建议与
-dl参数配合使用, 如果当前任务并未指定截止时间, 则第一次增加截止时间时, 以当前时间作为截止时间
如果给定了必要的属性, 在任务列表中的代办事项将自动进行排序, 从而使用户能够更好的决策各类代办事项的处理顺序.
两个不具有任何特殊属性的代办事项之间, 根据创建时间决定优先级, 创建时间越早, 优先级越高. 使用此规则时, 越早创建的任务在活动清单中的位置越靠前. 从而减少任务沉底导致的长期处于不被考虑执行的问题.
本项目中所有的优先级排序算法都是通过间接影响创建时间实现优先级的变化, 算法将各种代办事项的影响因素转换为浮点数后与该代办事项的创建时间相加得到总分值, 然后对总分值进行排序实现自动优先级.
创建任务时, 可以设置截止日期. 系统将根据截止日期的远近进行排序. 规则如下
如果现在距离截止日期还有X天, 则任务优先级提高 (56 - 8X) 天. 该规则的产生原因可见文档的算法分析部分
根据截止日期与当前时间, 可以计算出紧急等级, 并依据等级在页面上使用不同的颜色预警, 规则如下(类似于天气预报系统的颜色规则)
| 颜色 | 截止日期 |
|---|---|
| 红色 | 距离截止日期小于1天 |
| 橙色 | 距离截止日期小于2天 |
| 黄色 | 距离截止日期小于3天 |
| 蓝色 | 距离截止日期小于4天 |
特定任务在每周的特定的一天触发, 属于最高优先级的任务. 特定任务触发时, 会在当前时间的基础上将优先级提高 100 天
在创建代办事项时, 如果输入的内容是一个文件的URL路径, 则服务将会在后台下载对应的文件, 并创建一个与文件名相同的代办事项. 下载完毕后, 左键单击此代办事项将会触发下载操作.
这相当于一个离线下载功能, 可用于临时下载某些小文件
注意: 后台会根据URL的后缀推断是否是一个文件. 如果不是文件则会按照网页书签逻辑进行处理.
除了从URL下载外, 点击页面底部的上传文件按钮, 也可以从本地上传一个文件到服务器. 上传的文件会在服务器上生成一个URL路径, 任何人都可以通过该路径获取到对应的文件.
此功能可以临时的将某个文件发布到互联网. 也可以通过上传和下载实现文件中传. 由于文件完全公开, 因此不建议上传涉及隐私的文件.
无论是上传的文件还是下载的文件, 都与代办事项本身的生命周期绑定, 即当对应的代办事项被删除时(无论是手动删除还是垃圾回收删除), 相应的文件也会同步的在服务器上被删除.
便签是一种特殊的待办事项, 在创建代办事项时, 如果名称以计划, 规划等词汇结尾, 则会询问用户是否需要创建一个便签类型的代办事项.
创建完成后, 点击该待办事项会跳转到一个新的页面之中. 此页面提供一个可以编辑的文本框, 该文本框可输入任意文本内容并支持使用如下的快捷键设置一些特殊样式.
| 快捷键 | 效果 |
|---|---|
| C+b | 黑体 |
| C+i | 斜体 |
| C+u | 下划线 |
| C+d | 删除线 |
| C+1 | 一级标题 |
| C+2 | 二级标题 |
| C+h | 插入分割线 |
对于Win平台, C表示
Ctrl键, 对于Mac和Linux平台, C表示Ctrl键或Cmd键
在便签页面, 输入的内容会静默的执行自动保存, 每分钟保存一次. 也可以使用C+S快捷键, 或者点击Note编辑框右上角的"保存文档"按钮手动保存文档内容.
在便签页面内也可以创建其他代办事项, 这些待办事项仅在此便签页面内可见. 因此便签相当于开启了一个子空间. 借助于此功能, 可以将一个复杂的计划拆分为更细致的子任务, 从而更细致有效地管理待办事项.
当便签被删除时, 便签内所包含的全部数据同时被删除, 即该便签内记录的全部文本内容和代办事项将同时被删除.
本项目支持在待办事项输入框中输入func开头的指令, 来执行一些系统层次的操作或者一些较为少用的代办事项类操作. 指令系统仅对管理员权限的用户开放. 不当使用指令系统可能导致数据丢失或状态异常等问题, 请谨慎操作.
指令系统的具体内容, 可参考文档
如果对开发本项目感兴趣, 可以阅读本节了解开发细节
- 使用Window的PC进行开发, 存在下载依赖困难, 命令行使用不方便的问题. 但可以使用功能较为强大的IDE, Pycharm和WebStorm均可以非商业使用.
- (推荐)使用CodeSpace相对来说最便捷, 同时可以方便的跨端开发. 仅需要保证可以正常连接到Github即可.
- (不推荐)使用云服务器进行开发, 国内机器存在下载依赖困难的问题, 海外机器存在连接困难的问题. 既浪费钱又不使用.
如果使用Vscode开发, 推荐安装如下的插件
- Python: Python开发基础插件
- Vue-Official: Vue开发基础插件
- Live Server: 启动本地Web服务, 用于查看代码覆盖率报告
感谢以下的开源项目和免费组件:

