Skip to content

Repository files navigation

loom — 个人信息管理系统

长期自用的个人信息管理系统。v1:待办(一次性 + 循环)+ 按日期算出的 dashboard + 每分钟轮询的提醒 worker + 对外 API。另有收集箱(碎片)与「纸」(一整片自由文本,可把某几行抽成待办)。设计见 设计文档

结构

backend/    # 核心:API + worker + core + 迁移
frontend/   # Vite + React 皮(开发中;backend/public 是过渡期的静态皮)

后端双进程 + 共享 Postgres,横跨"两个世界":

  • API(被动世界) backend/src/api — Hono,统一入口、静态 token 鉴权、CRUD。
  • worker(主动世界) backend/src/worker — 每分钟醒来,到点的任务生成通知。状态全在数据库,重启不丢。
  • core backend/src/core — 数据 + 逻辑,两个进程共享。API/worker 都只是 core 的消费者。
  • 两个世界在 notifications 表交汇。

快速开始

# 1. Postgres(本机装了 PG 17 服务;或用 docker compose up -d)
#    需要 role loom / 密码 loom / 数据库 loom

# 2. 后端
cd backend
cp .env.example .env   # 按需改 DATABASE_URL / LOOM_API_TOKEN
npm install
npm run migrate
npm run api      # http://localhost:8787(另开终端 npm run worker)

# 3. 前端(开发)
cd frontend
npm install
npm run dev      # http://localhost:5173,API 请求经 vite 代理转给 8787

API

所有请求带 Authorization: Bearer <LOOM_API_TOKEN>

方法 路径 说明
POST /tasks 建任务:{title, due_date?} 一次性 / {title, recurrence, start_date?, end_date?} 循环;remind_time? 均可带。可带客户端生成的 id(26 位 ULID)——同 id 重放幂等去重,供离线补发用
GET /tasks 列任务(?include_archived=true 含归档)
GET/PATCH/DELETE /tasks/:id 查/改/删
POST /tasks/:id/done 标完成 {done?: bool, date?: 'YYYY-MM-DD'}(循环任务默认今天;一次性记在 due_date 上)
GET /dashboard 当天视图(?date= 看任意一天);算出来的,不预生成
POST /papers 建一张纸:{id?, content?},两个都不给 = 一张空白纸
GET /papers 列纸(只带开头 200 字摘要,按最近编辑倒序;正文走 /papers/:id)
GET/PATCH/DELETE /papers/:id 取正文 / 整片覆盖写 {content}(可写空) / 删
GET /notifications 拉通知(?status=pending)
POST /notifications/:id/read 标读

循环规则 v1:dailyweekly:MON,WED(星期用 MON..SUN)。

所有"今天"与 remind_timeUTC+8 计算,与机器时区无关。

开发

npm run typecheck
npm test
npm run api:dev / worker:dev   # watch 模式

迁移:往 src/db/migrations/ 加按序号命名的 .sql,npm run migrate 只跑没跑过的。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages