基于「重要 × 紧急」四象限(艾森豪威尔矩阵)的计划管理应用。
添加任务时只需设置重要性和截止时间,应用会自动把任务归入四个象限并排序:
| 紧急 | 不紧急 | |
|---|---|---|
| 重要 | 立即执行 | 计划安排 |
| 不重要 | 尽快处理 | 有空再做 |
- 紧急判定:距截止时间不足 48 小时(或已逾期)的任务自动视为紧急,随时间推移任务会自动在象限间流动(阈值见 utils/quadrant.ts 的
URGENT_THRESHOLD_MS)。 - 象限内排序:未完成在前,按截止时间升序,无截止时间的排最后。
- 多用户:邮箱注册/登录,任务按用户隔离,会话存储在加密 Cookie 中。
- Nuxt 3(Vue 3 全栈框架,前端 + 服务端 API 一体)
- shadcn-vue + Tailwind CSS v4(UI)
- SQLite + Drizzle ORM(服务端存储,数据文件在
.data/consilium.db) - nuxt-auth-utils(会话与密码哈希)
cp .env.example .env # 首次运行:设置会话加密密钥
pnpm install
pnpm dev # http://localhost:3000使用 pnpm 时需允许 better-sqlite3 的原生构建:首次
pnpm install后运行pnpm approve-builds勾选 better-sqlite3(本仓库的 pnpm-workspace.yaml 已配置好)。
本应用的任务数据与登录会话都在服务端,因此必须以 Node 服务器方式运行,
不能使用 nuxt generate 输出的纯静态 HTML(静态产物没有 API,登录/注册会直接失败)。
pnpm build # 构建到 .output/
pnpm start # 等价于 node --env-file=.env .output/server/index.mjs生产环境请务必在 .env(或进程环境变量)中设置强随机的 NUXT_SESSION_PASSWORD,
并妥善备份 .data/ 目录(SQLite 数据库)。
⚠️ 反向代理注意:本应用所有页面都带登录态,必须关闭反向代理的响应缓存, 否则会把某个用户的页面缓存后发给所有访客(表现为“一人登录、人人登录”)。 宝塔面板:网站 → 设置 → 反向代理 → 编辑 → 关闭「缓存」开关; 或删除 Nginx 配置中的proxy_cache、proxy_cache_valid、proxy_ignore_headers Set-Cookie Cache-Control等行后重载 Nginx。 应用自身已对页面和 API 输出Cache-Control: no-store, 但proxy_ignore_headers会使其失效,因此代理层必须不开缓存。
用 PM2 等进程管理器长期运行的示例:
NUXT_SESSION_PASSWORD=<随机32位以上字符串> pm2 start .output/server/index.mjs --name consilium| 变量 | 说明 |
|---|---|
NUXT_SESSION_PASSWORD |
会话 Cookie 的加密密钥,至少 32 个字符,生产环境必须使用随机值 |
PORT |
生产服务器监听端口,默认 3000 |
pages/ 登录页与四象限主页
components/ 任务卡片、添加/编辑对话框(components/ui 为 shadcn-vue 生成组件)
server/api/ 注册/登录/登出 + 任务 CRUD 接口
server/utils/ SQLite 连接与建表
utils/quadrant.ts 象限判定、紧急阈值、排序与时间格式化
middleware/auth.ts 未登录跳转到 /login
.data/ SQLite 数据库文件(已 gitignore)