简约的单用户看板待办事项应用Tellor

简介

什么是 Tellor ?

Tellor 是一个简约的单用户看板待办事项应用。

主要特点

  • 用户界面:具有简单、紧凑的用户界面,易于使用。
  • 功能:可以从 Trello 导入看板,支持快速加载和轻量级操作。
  • 无认证:设计为单用户应用,无需身份验证,便于快速访问和管理任务。
  • 兼容性:可在移动设备上友好使用。
  • 开发要求:基于 PHPMySQL,适用于 LAMPLinuxApacheMySQLPHP)环境。
  • 代码简洁:代码简单明了,便于修改,不依赖任何库或框架。

此应用适合希望快速管理待办事项的用户,特别是在不需要多人协作的情况下。

构建镜像

如果你不想自己构建,可以跳过,直接阅读下一章节

Dockerfile

官方没有提供 Docker 镜像,所以老苏只能自己构建,Dockerfile 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用官方 PHP 镜像  
FROM php:7.4-apache

# 设置工作目录
WORKDIR /var/www/html

# 复制项目文件到容器中
COPY . .

# 安装所需的 PHP 扩展
RUN docker-php-ext-install mysqli

# 设置数据库连接的环境变量
ENV DB_DATABASE=tellordb
ENV DB_USER=telloruser
ENV DB_PASSWORD=tellorpasswd
ENV DB_HOST=mysql-container

# 开放端口 80
EXPOSE 80

api.php

还需要修改 api.php 文件,这样才能使用环境变量对数据库连接进行设置

1
2
3
4
5
6
7
8
<?php
if(empty($_REQUEST['api'])) {
http_response_code(400);
exit();
}
$scon = new mysqli('localhost', 'telloruser', 'tellorpasswd', 'tellordb');
$scon->set_charset('utf8mb4');
header("Cache-Control: no-store");

改为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
if (empty($_REQUEST['api'])) {
http_response_code(400);
exit();
}

// 从环境变量获取数据库连接信息
$host = getenv('DB_HOST') ?: 'localhost'; // 默认值为 localhost
$user = getenv('DB_USER') ?: 'telloruser'; // 默认值
$passwd = getenv('DB_PASSWORD') ?: 'tellorpasswd'; // 默认值
$database = getenv('DB_DATABASE') ?: 'tellordb'; // 默认值

// 创建数据库连接
$scon = new mysqli($host, $user, $passwd, $database);
$scon->set_charset('utf8mb4');
header("Cache-Control: no-store");

// 检查连接是否成功
if ($scon->connect_error) {
http_response_code(500);
exit("连接失败: " . $scon->connect_error);
}

.dockerignore

在项目根目录下创建一个名为 .dockerignore 的文件,以防止将不必要的文件复制到镜像中

1
2
3
4
5
.git
node_modules
npm-debug.log
Dockerfile
.dockerignore

构建镜像和容器运行的基本命令如下👇

1
2
3
4
5
6
7
8
9
10
# 下载代码
git clone https://github.com/Voldrix/Tellor.git

# 进入目录
cd Tellor

# 将 Dockerfile 放入当前目录

# 构建镜像
docker build -t wbsu2003/tellor:v1 .

安装

在群晖上以 Docker 方式安装。

涉及到两个容器,采用 docker-compose 方式进行安装

setup-db.sql

setup-db.sql 是从 setup-db.sh 中整理出来的,用于初始化数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
-- setup-db.sql

-- 创建数据库
CREATE DATABASE IF NOT EXISTS tellordb;

-- 创建用户并授权
CREATE USER 'telloruser'@'localhost' IDENTIFIED BY 'tellorpasswd';
GRANT ALL PRIVILEGES ON tellordb.* TO 'telloruser'@'localhost';

-- 创建 boards 表
CREATE TABLE IF NOT EXISTS `boards` (
`id` BINARY(16) NOT NULL,
`name` VARCHAR(127) NOT NULL,
`bgimg` VARCHAR(1023) CHARACTER SET ascii COLLATE ascii_bin,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- 创建 lists 表
CREATE TABLE IF NOT EXISTS `lists` (
`board` BINARY(16) NOT NULL,
`id` BINARY(16) NOT NULL,
`color` CHAR(6) CHARACTER SET ascii COLLATE ascii_bin,
`name` VARCHAR(1023) NOT NULL,
`ordr` INT(10) UNSIGNED NOT NULL,
KEY `listsBoardIdx` (`board`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- 创建 cards 表
CREATE TABLE IF NOT EXISTS `cards` (
`board` BINARY(16) NOT NULL,
`list` BINARY(16) NOT NULL,
`id` BINARY(16) NOT NULL,
`parent` CHAR(16) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
`title` VARCHAR(1023) NOT NULL,
`tags` VARCHAR(127) CHARACTER SET ascii COLLATE ascii_bin,
`cdate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(),
`mdate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(),
`description` TEXT,
KEY `cardsBoardIdx` (`board`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- 创建 archive 表
CREATE TABLE IF NOT EXISTS `archive` (
`board` BINARY(16) NOT NULL,
`list` BINARY(16) NOT NULL,
`id` BINARY(16) NOT NULL,
`parent` CHAR(16) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
`title` VARCHAR(1023) NOT NULL,
`tags` VARCHAR(127) CHARACTER SET ascii COLLATE ascii_bin,
`cdate` DATETIME NOT NULL,
`mdate` DATETIME NOT NULL,
`description` TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- 创建 history 表
CREATE TABLE IF NOT EXISTS `history` (
`board` BINARY(16) NOT NULL,
`cardid` BINARY(16) NOT NULL,
`type` BINARY(3) NOT NULL,
`change_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(),
`patch` BLOB,
INDEX `historyIdx` (`board`, `cardid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

docker-compose.yml

将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: '3'  

services:
mysql:
image: mysql:5.7
# ports:
# - "3306:3306"
volumes:
- ./data:/var/lib/mysql
- ./initdb:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: tellordb
MYSQL_USER: telloruser
MYSQL_PASSWORD: tellorpasswd

web:
image: wbsu2003/tellor:latest
ports:
- "3438:80"
environment:
DB_DATABASE: tellordb
DB_USER: telloruser
DB_PASSWORD: tellorpasswd
DB_HOST: mysql
depends_on:
- mysql

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 tellor 和 子目录
mkdir -p /volume1/docker/tellor/{data,initdb}

# 进入 tellor 目录
cd /volume1/docker/tellor

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中输入 http://群晖IP:3438 就能看到主界面

New Board 新建一个看板

Board 创建成功后,就可以添加 List

按照惯常依次添加了

  • 待办事项(To Do
  • 进行中(In Progress
  • 完成(Done

接下来可以在 List 中添加 Card

New Card 进行编辑

一个完整的看板

支持导入/导出

参考文档

Voldrix/Tellor: Kanban todo app. Simple, minimal, compact UI, single-user. Can Import from Trello. (PHP + mysql)
地址:https://github.com/Voldrix/Tellor