Skip to content

Repository files navigation

Consilium

基于「重要 × 紧急」四象限(艾森豪威尔矩阵)的计划管理应用。

添加任务时只需设置重要性截止时间,应用会自动把任务归入四个象限并排序:

紧急 不紧急
重要 立即执行 计划安排
不重要 尽快处理 有空再做
  • 紧急判定:距截止时间不足 48 小时(或已逾期)的任务自动视为紧急,随时间推移任务会自动在象限间流动(阈值见 utils/quadrant.tsURGENT_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_cacheproxy_cache_validproxy_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)

About

A plan management frontend program.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages