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 天
优先级: 高
This commit is contained in:
348
scripts/init_three_layer_db.sh
Executable file
348
scripts/init_three_layer_db.sh
Executable file
@@ -0,0 +1,348 @@
|
||||
#!/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 "================================================================================
|
||||
"
|
||||
Reference in New Issue
Block a user