架构设计:
- 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 天
优先级: 高
348 lines
9.7 KiB
Bash
Executable File
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 "================================================================================
|
|
" |