Files
momentry_studio/scripts/init_three_layer_db.sh
Momentry Studio be3cef2e0d feat: MarkBase 三层架构设计
架构设计:
- Admin Layer: 系统管理 (admin.sqlite)
  * system_config - 系统配置
  * users - 用户管理
  * groups - 群组管理
  * permissions - 权限管理
  * audit_logs - 审计日志

- Group Layer: 群组管理 (group_{id}.sqlite)
  * group_config - 群组配置
  * group_members - 群组成员
  * group_files - 群组文件
  * group_permissions - 群组权限
  * group_shares - 群组共享

- User Layer: 用户数据 ({username}.sqlite)
  * user_config - 用户配置
  * user_files - 用户文件
  * user_bookmarks - 用户书签
  * search_history - 搜索历史
  * video_marks - 视频标记

目录结构:
data/
├── admin/admin.sqlite
├── groups/group_{id}.sqlite
└── users/{username}.sqlite

权限模型:
- Admin: 系统管理
- Group Owner: 群组管理
- Group Member: 群组访问
- User: 个人数据

文档:
- MARKBASE_THREE_LAYER_ARCHITECTURE.md - 完整架构设计
- THREE_LAYER_IMPLEMENTATION_GUIDE.md - 实施指南

脚本:
- init_three_layer_db.sh - 数据库初始化
- check_three_layer.sh - 架构检查

预计工作量: 3-5 天
优先级: 高
2026-10-12 15:08:48 +08:00

348 lines
9.7 KiB
Bash
Executable File

#!/bin/bash
# 三层架构数据库初始化脚本
echo "================================================================================
MarkBase 三层架构初始化
================================================================================
"
USER_HOME=$(eval echo ~${SUDO_USER:-$USER})
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DATA_DIR="${SCRIPT_DIR}/data"
echo "数据目录: ${DATA_DIR}"
echo ""
# 步骤 1: 创建目录结构
echo "步骤 1/4: 创建目录结构..."
mkdir -p "${DATA_DIR}/admin"
mkdir -p "${DATA_DIR}/groups"
mkdir -p "${DATA_DIR}/users"
echo "✅ 已创建目录:"
echo " - ${DATA_DIR}/admin"
echo " - ${DATA_DIR}/groups"
echo " - ${DATA_DIR}/users"
echo ""
# 步骤 2: 创建 Admin 数据库
echo "步骤 2/4: 创建 Admin 数据库..."
ADMIN_DB="${DATA_DIR}/admin/admin.sqlite"
sqlite3 "${ADMIN_DB}" << 'EOF'
-- 系统配置表
CREATE TABLE IF NOT EXISTS system_config (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
description TEXT,
updated_by TEXT,
updated_at TEXT DEFAULT (datetime('now'))
);
-- 用户表
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
email TEXT UNIQUE,
password_hash TEXT NOT NULL,
display_name TEXT,
role TEXT DEFAULT 'user',
status TEXT DEFAULT 'active',
group_ids TEXT,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now')),
last_login_at TEXT
);
-- 群组表
CREATE TABLE IF NOT EXISTS groups (
id TEXT PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
description TEXT,
owner_id TEXT NOT NULL,
members TEXT,
permissions TEXT,
storage_quota TEXT,
status TEXT DEFAULT 'active',
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
-- 权限表
CREATE TABLE IF NOT EXISTS permissions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
resource_type TEXT NOT NULL,
resource_id TEXT NOT NULL,
permission TEXT NOT NULL,
granted_by TEXT NOT NULL,
granted_at TEXT DEFAULT (datetime('now')),
expires_at TEXT,
UNIQUE(user_id, resource_type, resource_id, permission)
);
-- 审计日志表
CREATE TABLE IF NOT EXISTS audit_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
action TEXT NOT NULL,
resource_type TEXT,
resource_id TEXT,
details TEXT,
ip_address TEXT,
user_agent TEXT,
created_at TEXT DEFAULT (datetime('now'))
);
-- 插入默认系统配置
INSERT OR IGNORE INTO system_config (key, value, description) VALUES
('system_name', 'Momentry Studio', '系统名称'),
('version', '0.1.0', '系统版本'),
('max_users', '100', '最大用户数'),
('max_groups', '20', '最大群组数'),
('storage_quota', '100GB', '存储配额'),
('backup_enabled', 'true', '是否启用备份');
-- 创建默认管理员 (密码: admin123)
INSERT OR IGNORE INTO users (id, username, password_hash, display_name, role, status) VALUES
('admin', 'admin', '$argon2id$v=19$m=19456,t=2,p=1$placeholder_hash', 'System Administrator', 'admin', 'active');
-- 创建 demo 用户
INSERT OR IGNORE INTO users (id, username, password_hash, display_name, role, status) VALUES
('demo', 'demo', '$argon2id$v=19$m=19456,t=2,p=1$placeholder_hash', 'Demo User', 'user', 'active');
EOF
echo "✅ Admin 数据库已创建: ${ADMIN_DB}"
echo " 表: system_config, users, groups, permissions, audit_logs"
echo " 默认管理员: admin / admin123"
echo ""
# 步骤 3: 创建示例群组
echo "步骤 3/4: 创建示例群组..."
create_group_db() {
local group_id=$1
local group_name=$2
local group_db="${DATA_DIR}/groups/group_${group_id}.sqlite"
sqlite3 "${group_db}" << EOF
-- 群组配置表
CREATE TABLE IF NOT EXISTS group_config (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
description TEXT,
updated_by TEXT,
updated_at TEXT DEFAULT (datetime('now'))
);
-- 群组成员表
CREATE TABLE IF NOT EXISTS group_members (
user_id TEXT PRIMARY KEY,
username TEXT NOT NULL,
role TEXT DEFAULT 'member',
permissions TEXT,
joined_at TEXT DEFAULT (datetime('now')),
invited_by TEXT
);
-- 群组文件表
CREATE TABLE IF NOT EXISTS group_files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_uuid TEXT NOT NULL UNIQUE,
filename TEXT NOT NULL,
file_path TEXT NOT NULL,
file_size INTEGER,
mime_type TEXT,
uploaded_by TEXT NOT NULL,
access_level TEXT DEFAULT 'group',
tags TEXT,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
-- 群组权限表
CREATE TABLE IF NOT EXISTS group_permissions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
permission TEXT NOT NULL,
resource_type TEXT,
resource_id TEXT,
granted_by TEXT NOT NULL,
granted_at TEXT DEFAULT (datetime('now')),
UNIQUE(user_id, permission, resource_type, resource_id)
);
-- 群组共享表
CREATE TABLE IF NOT EXISTS group_shares (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_uuid TEXT NOT NULL,
shared_by TEXT NOT NULL,
shared_with TEXT,
share_type TEXT,
permissions TEXT,
expires_at TEXT,
created_at TEXT DEFAULT (datetime('now'))
);
-- 插入群组配置
INSERT OR IGNORE INTO group_config (key, value, description) VALUES
('group_name', '${group_name}', '群组名称'),
('storage_quota', '50GB', '群组存储配额'),
('max_members', '20', '最大成员数');
-- 添加管理员为群组所有者
INSERT OR IGNORE INTO group_members (user_id, username, role, permissions) VALUES
('admin', 'admin', 'owner', '{"read": true, "write": true, "admin": true}');
EOF
echo " ✅ 群组数据库: ${group_db}"
}
# 创建示例群组
create_group_db "marketing" "Marketing Team"
create_group_db "development" "Development Team"
# 更新 admin 数据库中的群组列表
sqlite3 "${ADMIN_DB}" << 'EOF'
INSERT OR IGNORE INTO groups (id, name, description, owner_id, members, status) VALUES
('marketing', 'Marketing Team', '营销团队', 'admin', '["admin"]', 'active'),
('development', 'Development Team', '开发团队', 'admin', '["admin"]', 'active');
EOF
echo ""
# 步骤 4: 创建用户数据库模板
echo "步骤 4/4: 创建用户数据库..."
create_user_db() {
local username=$1
local user_db="${DATA_DIR}/users/${username}.sqlite"
if [ -f "${user_db}" ]; then
echo " ⚠️ 用户数据库已存在: ${user_db}"
return
fi
sqlite3 "${user_db}" << 'EOF'
-- 用户配置表
CREATE TABLE IF NOT EXISTS user_config (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
description TEXT,
updated_at TEXT DEFAULT (datetime('now'))
);
-- 用户文件表
CREATE TABLE IF NOT EXISTS user_files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_uuid TEXT NOT NULL UNIQUE,
filename TEXT NOT NULL,
file_path TEXT NOT NULL,
file_size INTEGER,
mime_type TEXT,
tags TEXT,
is_starred INTEGER DEFAULT 0,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
-- 用户书签表
CREATE TABLE IF NOT EXISTS user_bookmarks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
label TEXT NOT NULL,
url TEXT,
file_uuid TEXT,
created_at TEXT DEFAULT (datetime('now'))
);
-- 搜索历史表
CREATE TABLE IF NOT EXISTS search_history (
id TEXT PRIMARY KEY,
query TEXT NOT NULL,
title TEXT NOT NULL,
chat_state TEXT,
mode TEXT DEFAULT 'keyword',
pinned INTEGER DEFAULT 0,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
-- 视频标记表
CREATE TABLE IF NOT EXISTS video_marks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_uuid TEXT NOT NULL,
tag TEXT NOT NULL,
start_frame INTEGER NOT NULL,
end_frame INTEGER,
note TEXT,
created_at TEXT DEFAULT (datetime('now'))
);
-- 用户设置表
CREATE TABLE IF NOT EXISTS user_settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
updated_at TEXT DEFAULT (datetime('now'))
);
-- 插入默认配置
INSERT OR IGNORE INTO user_config (key, value, description) VALUES
('theme', 'dark', '界面主题'),
('language', 'zh-TW', '界面语言'),
('notifications_enabled', 'true', '是否启用通知');
EOF
echo " ✅ 用户数据库: ${user_db}"
}
# 创建 demo 用户数据库
create_user_db "demo"
echo ""
echo "================================================================================
初始化完成
================================================================================
"
echo "数据库结构:"
echo ""
echo "Admin Layer:"
ls -lh "${DATA_DIR}/admin/"*.sqlite 2>/dev/null || echo " 无数据库"
echo ""
echo "Group Layer:"
ls -lh "${DATA_DIR}/groups/"*.sqlite 2>/dev/null || echo " 无数据库"
echo ""
echo "User Layer:"
ls -lh "${DATA_DIR}/users/"*.sqlite 2>/dev/null || echo " 无数据库"
echo ""
echo "================================================================================
使用说明
================================================================================
"
echo "1. 默认管理员账号:"
echo " 用户名: admin"
echo " 密码: admin123"
echo " ⚠️ 请及时修改密码!"
echo ""
echo "2. 默认用户账号:"
echo " 用户名: demo"
echo " 密码: (从 .env 文件读取或自动生成)"
echo ""
echo "3. 示例群组:"
echo " - marketing (Marketing Team)"
echo " - development (Development Team)"
echo ""
echo "4. 数据库路径:"
echo " Admin: ${DATA_DIR}/admin/admin.sqlite"
echo " Groups: ${DATA_DIR}/groups/group_{id}.sqlite"
echo " Users: ${DATA_DIR}/users/{username}.sqlite"
echo ""
echo "================================================================================
"