Files
ai-xiaocai/server/db.js
2026-07-22 10:26:32 +08:00

79 lines
2.1 KiB
JavaScript

const Database = require('better-sqlite3');
const path = require('path');
const fs = require('fs');
// 确保数据目录存在
const dataDir = '/app/data';
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
const dbPath = path.join(dataDir, 'xiaocai.db');
const db = new Database(dbPath);
// 启用 WAL 模式提升并发
db.pragma('journal_mode = WAL');
// 创建表
db.exec(`
CREATE TABLE IF NOT EXISTS users (
username TEXT PRIMARY KEY,
password TEXT NOT NULL,
is_admin INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS rooms (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
created_by TEXT NOT NULL,
white_list TEXT DEFAULT '', -- 逗号分隔用户名,空表示所有人
created_at TEXT DEFAULT (datetime('now','localtime'))
);
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
room_id TEXT NOT NULL,
user TEXT NOT NULL,
text TEXT,
attachments TEXT, -- JSON array of file paths
timestamp TEXT DEFAULT (datetime('now','localtime')),
FOREIGN KEY(room_id) REFERENCES rooms(id)
);
CREATE TABLE IF NOT EXISTS purchases (
id TEXT PRIMARY KEY,
room_id TEXT NOT NULL,
item TEXT,
amount REAL,
method TEXT,
status TEXT DEFAULT '待处理',
applicant TEXT,
created_at TEXT DEFAULT (datetime('now','localtime')),
updated_at TEXT DEFAULT (datetime('now','localtime')),
ai_notes TEXT,
FOREIGN KEY(room_id) REFERENCES rooms(id)
);
CREATE TABLE IF NOT EXISTS purchase_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
purchase_id TEXT NOT NULL,
action TEXT NOT NULL,
user TEXT NOT NULL,
timestamp TEXT DEFAULT (datetime('now','localtime')),
attachments TEXT,
FOREIGN KEY(purchase_id) REFERENCES purchases(id)
);
CREATE TABLE IF NOT EXISTS purchase_attachments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
purchase_id TEXT NOT NULL,
file_path TEXT NOT NULL,
uploaded_by TEXT NOT NULL,
timestamp TEXT DEFAULT (datetime('now','localtime')),
FOREIGN KEY(purchase_id) REFERENCES purchases(id)
);
`);
module.exports = db;