2026-04-02 23:03:18 +08:00

TodoList

一个面向个人与团队的离线优先的待办事宜 Web App,目标是把传统待办清单升级为“可执行计划系统”

GitHub stars GitHub forks Last commit React 18 TypeScript 5 NestJS License


核心功能

任务管理

  • 创建、编辑、删除任务
  • 任务字段:主题、详细内容、DDL、状态、优先级、标签
  • 富文本内容支持:图片、视频、链接等媒体信息
  • 面向执行的展示:按时间、优先级、状态分组

AI 分析与 AI 问答

  • 对单任务进行可执行策略建议(步骤拆解、风险点、时间预估)
  • 对任务集合做协调建议(先后顺序、时间冲突优化)
  • 支持会话式问答,围绕用户现有任务上下文进行回答
  • 支持多 AI 渠道切换与故障兜底

Astrbot 双向集成

  • TodoList 可调用 Astrbot 接口,复用用户在 Astrbot 中配置的 AI 提供商
  • TodoList 可注册为 Astrbot skill,被 QQ 机器人调用
  • 机器人可执行典型操作:添加任务、修改任务、删除任务、请求建议

DDL 邮件提醒

  • 任务临近截止时间时触发邮件通知
  • 支持可靠定时任务队列,避免高峰期漏发
  • 后续可扩展多级提醒策略(如 24h/6h/1h)

认证与账号安全

  • 邮箱验证码登录
  • 2FATOTP
  • OAuth 第三方登录:QQ / 微信 / GitHub
  • JWT 双 TokenAccess + Refresh)机制

PWA 与本地能力

  • 支持“添加到桌面/主屏幕”
  • 首次访问后缓存关键静态资源,离线可进入
  • 本地数据通过 Dexie.js 管理 IndexedDB
  • 联网后自动进行增量同步与冲突处理

管理后台(Admin WebUI

  • 站点品牌配置:头像、Header 等视觉信息
  • 用户配额管理:默认 100MB,可按用户覆盖
  • 存储用量监控与限制策略
  • 日志查看与运维辅助功能
  • 基于 Token 的后台登录控制

TODO List :(

状态说明:[x] 已完成,[ ] 进行中/未开始(请随开发进度更新)

顺序 功能实现项(用户视角) 你会看到的效果 状态
1 明确产品能力与交互流程 确认 TodoList 的核心使用方式与页面路径 [x]
2 实现基础登录(邮箱验证码) 可以注册/登录并进入主页面 [x]
3 实现任务基础能力(增删改查) 可以创建、编辑、删除、完成任务 [x]
4 实现富文本与媒体内容 任务详情可插入图片、视频、链接等内容 [x]
5 实现本地离线存储(Dexie 无网时仍可打开并编辑任务 [ ]
6 实现云端同步与冲突处理 恢复网络后自动同步,冲突按规则合并 [ ]
7 实现提醒系统(邮件) DDL 临近时收到邮件提醒 [ ]
8 实现 AI 问答(用户自带 Key 可直接用自己的 AI API Key 获取建议 [ ]
9 实现 Astrbot Provider 接入 可复用 Astrbot 内配置的 AI 提供商 [ ]
10 实现公共 AI 通道(可开关) 管理员开启后,用户可直接使用站点公共 AI [ ]
11 实现 Astrbot Skill 对接 可通过 QQ 机器人添加/修改任务与获取建议 [ ]
12 实现完整账号安全(2FA + OAuth) 支持 2FA、QQ/微信/GitHub 登录 [ ]
13 实现 PWA 安装与离线体验优化 支持“添加到桌面”,像本地 App 一样使用 [ ]
14 实现管理后台(配额/日志/系统配置) 管理员可管理用户配额、站点信息、日志 [ ]
15 上线前安全与性能收尾 使用更稳定、更安全,核心链路可观测 [ ]

技术架构

Monorepo

  • 仓库管理:pnpm workspacesTurborepo
  • 目标:在一个仓库管理客户端、服务端、后台,统一工程规范与依赖
  • 共享能力:TypeScript 类型、工具库、API SDK、Lint/Format 配置

客户端(C 端 SPA + PWA

  • 框架:React 18 + TypeScript + Vite
  • UITailwind CSS + shadcn/ui
  • 富文本:Tiptap
  • 状态管理:Zustand
  • 离线存储:Dexie.jsIndexedDB
  • PWAvite-plugin-pwaService Worker + 资源缓存)

管理后台

  • 复用 React + TypeScript + Vite
  • 后台组件库:Ant Design 或 Mantine(待最终确认)
  • 目标:提升数据管理类页面的开发效率与稳定性

后端 APIBFF + 核心服务)

  • 框架:NestJS + TypeScript
  • 数据库:PostgreSQL + Prisma ORM
  • 缓存与任务队列:Redis + BullMQ
  • 文件存储:MinIO(S3 兼容,可迁移至 OSS/COS

认证中心

  • JWT 双 TokenAccess Token + Refresh Token
  • 2FAotplibTOTP
  • OAuthPassport.js 策略体系

仓库目标结构

TodoList/
  apps/
    web/              # C端 SPA + PWA
    admin/            # 管理后台
    api/              # NestJS 后端
  packages/
    shared-types/     # 前后端共享类型
    ui/               # 可复用 UI 组件(可选)
    sdk/              # API 客户端封装(可选)
    eslint-config/    # 统一规范(可选)
    tsconfig/         # 统一 TS 配置(可选)
  infra/
    docker/           # PostgreSQL/Redis/MinIO 等本地编排(规划)
  docs/
    architecture/     # 架构文档与决策记录(ADR)

部署与使用

1. 环境要求

  • Node.js 20.x
  • pnpm 9.15.2
  • PostgreSQL 14+(本地或远程都可)
  • 可选:MinIO / S3(附件上传功能使用)

2. 安装依赖

pnpm install

3. 后端环境变量配置

  1. 复制环境变量示例文件:
cp apps/api/.env.example apps/api/.env
# PowerShell:
# Copy-Item apps/api/.env.example apps/api/.env
  1. 至少修改以下配置:
  • DATABASE_URL:你的 PostgreSQL 连接串
  • AUTH_ACCESS_SECRET:生产环境请改为高强度随机值
  • MAIL_SMTP_*:邮件服务器配置(验证码/提醒邮件)
  • OAUTH_*:第三方登录配置(未接入可先保留示例值)
  • S3_*:对象存储配置(未启用附件可后续再配)

4. 初始化数据库

pnpm --filter @todolist/api exec prisma db push

5. 本地开发启动

  1. 启动后端(默认端口 3000):
pnpm --filter @todolist/api start:dev
  1. 启动前端(默认端口 5173):
pnpm --filter web dev
  1. 若前端需连接非默认后端地址,可设置:
VITE_API_BASE_URL=http://localhost:3000

6. 生产构建与运行

  1. 构建:
pnpm run build
  1. 运行 API(需先构建):
pnpm --filter @todolist/api start
  1. 发布 Web
  • apps/web/dist 为静态资源产物,建议使用 Nginx/静态托管服务发布。

7. CI/CD 说明(当前仓库)

  • PR 质量检查:.github/workflows/pr-quality.yml
  • Web 部署模板:.github/workflows/deploy-web.yml
  • Admin 部署模板:.github/workflows/deploy-admin.yml
  • API 镜像构建:.github/workflows/api-docker-image.yml

说明:

  • Web/Admin 工作流通过 Webhook 触发真实部署,需在仓库 Secrets 配置:
    • WEB_DEPLOY_WEBHOOK_URL
    • ADMIN_DEPLOY_WEBHOOK_URL
  • API 镜像工作流仅在存在 apps/api/Dockerfile 时执行镜像构建与推送。

License

本项目遵循 GNUv3

S
Description
方便好用的TodoList网站,但不止于网站
Readme GPL-3.0 2.2 MiB
Languages
TypeScript 98%
CSS 1.1%
JavaScript 0.8%
HTML 0.1%