Refactor to Vue 3 + FastAPI + SQLite architecture
Some checks failed
Some checks failed
- Backend: FastAPI + SQLite (WAL mode), 22 tables, ~40 API endpoints - Frontend: Vue 3 + Vite + Pinia + Vue Router, 8 views, 3 stores - Database: migrate from JSON file to SQLite with proper schema - Dockerfile: multi-stage build (node + python) - Deploy: K8s manifests (namespace, deployment, service, ingress, pvc, backup) - CI/CD: Gitea Actions (test, deploy, PR preview at pr-$id.planner.oci.euphon.net) - Tests: 20 Cypress E2E test files, 196 test cases, ~85% coverage - Doc: test-coverage.md with full feature coverage report Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
0
backend/__init__.py
Normal file
0
backend/__init__.py
Normal file
218
backend/database.py
Normal file
218
backend/database.py
Normal file
@@ -0,0 +1,218 @@
|
||||
import sqlite3
|
||||
import os
|
||||
|
||||
DB_PATH = os.environ.get("DB_PATH", "/data/planner.db")
|
||||
|
||||
|
||||
def get_db():
|
||||
conn = sqlite3.connect(DB_PATH)
|
||||
conn.row_factory = sqlite3.Row
|
||||
conn.execute("PRAGMA journal_mode=WAL")
|
||||
conn.execute("PRAGMA foreign_keys=ON")
|
||||
return conn
|
||||
|
||||
|
||||
def init_db():
|
||||
os.makedirs(os.path.dirname(DB_PATH) or ".", exist_ok=True)
|
||||
conn = get_db()
|
||||
c = conn.cursor()
|
||||
c.executescript("""
|
||||
-- 用户认证(单用户 planner 密码)
|
||||
CREATE TABLE IF NOT EXISTS config (
|
||||
key TEXT PRIMARY KEY,
|
||||
value TEXT NOT NULL
|
||||
);
|
||||
|
||||
-- 随手记
|
||||
CREATE TABLE IF NOT EXISTS notes (
|
||||
id TEXT PRIMARY KEY,
|
||||
text TEXT NOT NULL,
|
||||
tag TEXT DEFAULT '灵感',
|
||||
created_at TEXT DEFAULT (datetime('now')),
|
||||
updated_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 待办事项(四象限)
|
||||
CREATE TABLE IF NOT EXISTS todos (
|
||||
id TEXT PRIMARY KEY,
|
||||
text TEXT NOT NULL,
|
||||
quadrant TEXT NOT NULL DEFAULT 'q1',
|
||||
done INTEGER DEFAULT 0,
|
||||
created_at TEXT DEFAULT (datetime('now')),
|
||||
updated_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 收集箱
|
||||
CREATE TABLE IF NOT EXISTS inbox (
|
||||
id TEXT PRIMARY KEY,
|
||||
text TEXT NOT NULL,
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 提醒
|
||||
CREATE TABLE IF NOT EXISTS reminders (
|
||||
id TEXT PRIMARY KEY,
|
||||
text TEXT NOT NULL,
|
||||
time TEXT,
|
||||
repeat TEXT DEFAULT 'none',
|
||||
enabled INTEGER DEFAULT 1,
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 目标
|
||||
CREATE TABLE IF NOT EXISTS goals (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
month TEXT,
|
||||
checks TEXT DEFAULT '{}',
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 清单
|
||||
CREATE TABLE IF NOT EXISTS checklists (
|
||||
id TEXT PRIMARY KEY,
|
||||
title TEXT NOT NULL,
|
||||
items TEXT DEFAULT '[]',
|
||||
archived INTEGER DEFAULT 0,
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 健康打卡 - 项目池
|
||||
CREATE TABLE IF NOT EXISTS health_items (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
type TEXT NOT NULL DEFAULT 'health',
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 健康打卡 - 月计划
|
||||
CREATE TABLE IF NOT EXISTS health_plans (
|
||||
month TEXT NOT NULL,
|
||||
type TEXT NOT NULL DEFAULT 'health',
|
||||
item_ids TEXT DEFAULT '[]',
|
||||
PRIMARY KEY (month, type)
|
||||
);
|
||||
|
||||
-- 健康打卡 - 记录
|
||||
CREATE TABLE IF NOT EXISTS health_checks (
|
||||
date TEXT NOT NULL,
|
||||
type TEXT NOT NULL DEFAULT 'health',
|
||||
item_id TEXT NOT NULL,
|
||||
checked INTEGER DEFAULT 1,
|
||||
PRIMARY KEY (date, type, item_id)
|
||||
);
|
||||
|
||||
-- 睡眠记录
|
||||
CREATE TABLE IF NOT EXISTS sleep_records (
|
||||
date TEXT PRIMARY KEY,
|
||||
time TEXT NOT NULL,
|
||||
minutes REAL,
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 健身记录
|
||||
CREATE TABLE IF NOT EXISTS gym_records (
|
||||
id TEXT PRIMARY KEY,
|
||||
date TEXT NOT NULL,
|
||||
type TEXT DEFAULT '',
|
||||
duration TEXT DEFAULT '',
|
||||
note TEXT DEFAULT '',
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 经期记录
|
||||
CREATE TABLE IF NOT EXISTS period_records (
|
||||
id TEXT PRIMARY KEY,
|
||||
start_date TEXT NOT NULL,
|
||||
end_date TEXT,
|
||||
note TEXT DEFAULT '',
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 文档
|
||||
CREATE TABLE IF NOT EXISTS docs (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
icon TEXT DEFAULT '📄',
|
||||
keywords TEXT DEFAULT '',
|
||||
extract_rule TEXT DEFAULT 'none',
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 文档条目
|
||||
CREATE TABLE IF NOT EXISTS doc_entries (
|
||||
id TEXT PRIMARY KEY,
|
||||
doc_id TEXT NOT NULL REFERENCES docs(id) ON DELETE CASCADE,
|
||||
text TEXT NOT NULL,
|
||||
note_id TEXT,
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- 日程模块
|
||||
CREATE TABLE IF NOT EXISTS schedule_modules (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
emoji TEXT DEFAULT '📌',
|
||||
color TEXT DEFAULT '#667eea',
|
||||
sort_order INTEGER DEFAULT 0
|
||||
);
|
||||
|
||||
-- 日程安排(每天的时间块)
|
||||
CREATE TABLE IF NOT EXISTS schedule_slots (
|
||||
date TEXT NOT NULL,
|
||||
time_slot TEXT NOT NULL,
|
||||
module_id TEXT NOT NULL REFERENCES schedule_modules(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (date, time_slot, module_id)
|
||||
);
|
||||
|
||||
-- 每周模板
|
||||
CREATE TABLE IF NOT EXISTS weekly_template (
|
||||
day INTEGER NOT NULL,
|
||||
data TEXT DEFAULT '[]',
|
||||
PRIMARY KEY (day)
|
||||
);
|
||||
|
||||
-- 周回顾
|
||||
CREATE TABLE IF NOT EXISTS reviews (
|
||||
week TEXT PRIMARY KEY,
|
||||
data TEXT DEFAULT '{}'
|
||||
);
|
||||
|
||||
-- Bug 追踪
|
||||
CREATE TABLE IF NOT EXISTS bugs (
|
||||
id TEXT PRIMARY KEY,
|
||||
text TEXT NOT NULL,
|
||||
status TEXT DEFAULT 'open',
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- Sleep Buddy 用户
|
||||
CREATE TABLE IF NOT EXISTS buddy_users (
|
||||
username TEXT PRIMARY KEY,
|
||||
password_hash TEXT NOT NULL,
|
||||
target_time TEXT DEFAULT '22:00',
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
-- Sleep Buddy 记录
|
||||
CREATE TABLE IF NOT EXISTS buddy_records (
|
||||
username TEXT NOT NULL,
|
||||
date TEXT NOT NULL,
|
||||
time TEXT NOT NULL,
|
||||
created_at TEXT DEFAULT (datetime('now')),
|
||||
PRIMARY KEY (username, date)
|
||||
);
|
||||
|
||||
-- Sleep Buddy 通知
|
||||
CREATE TABLE IF NOT EXISTS buddy_notifications (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
from_user TEXT NOT NULL,
|
||||
message TEXT NOT NULL,
|
||||
time TEXT NOT NULL,
|
||||
date TEXT NOT NULL,
|
||||
created_at REAL NOT NULL
|
||||
);
|
||||
""")
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
1071
backend/main.py
Normal file
1071
backend/main.py
Normal file
File diff suppressed because it is too large
Load Diff
3
backend/requirements.txt
Normal file
3
backend/requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
fastapi==0.115.6
|
||||
uvicorn[standard]==0.34.0
|
||||
aiosqlite==0.20.0
|
||||
Reference in New Issue
Block a user