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:
2026-10-12 15:08:48 +08:00
parent 3080c57c54
commit be3cef2e0d
4 changed files with 2296 additions and 0 deletions

240
scripts/check_three_layer.sh Executable file
View File

@@ -0,0 +1,240 @@
#!/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 ""
# 检查目录结构
echo "1. 检查目录结构"
echo "--------------------------------------------------------------------------------"
check_directory() {
local dir=$1
local name=$2
if [ -d "$dir" ]; then
echo "✅ ${name} 目录存在: ${dir}"
local count=$(ls "$dir"/*.sqlite 2>/dev/null | wc -l | tr -d ' ')
echo " 数据库数量: ${count}"
if [ $count -gt 0 ]; then
ls -lh "$dir"/*.sqlite 2>/dev/null | awk '{print " - " $9 " (" $5 ")"}'
fi
else
echo "❌ ${name} 目录不存在: ${dir}"
fi
echo ""
}
check_directory "${DATA_DIR}/admin" "Admin Layer"
check_directory "${DATA_DIR}/groups" "Group Layer"
check_directory "${DATA_DIR}/users" "User Layer"
# 检查 Admin 数据库表结构
echo "2. 检查 Admin 数据库表结构"
echo "--------------------------------------------------------------------------------"
ADMIN_DB="${DATA_DIR}/admin/admin.sqlite"
if [ -f "$ADMIN_DB" ]; then
echo "✅ Admin 数据库存在: ${ADMIN_DB}"
echo ""
# 检查必需表
REQUIRED_TABLES=("system_config" "users" "groups" "permissions" "audit_logs")
for table in "${REQUIRED_TABLES[@]}"; do
if sqlite3 "${ADMIN_DB}" "SELECT name FROM sqlite_master WHERE type='table' AND name='${table}';" | grep -q "${table}"; then
echo " ✅ ${table} 表存在"
else
echo " ❌ ${table} 表不存在"
fi
done
echo ""
# 检查默认管理员
echo "默认管理员检查:"
if sqlite3 "${ADMIN_DB}" "SELECT username, role FROM users WHERE username='admin';" | grep -q "admin"; then
echo " ✅ 默认管理员存在"
sqlite3 "${ADMIN_DB}" "SELECT username, role, status FROM users WHERE username='admin';" | awk -F'|' '{print " 用户: " $1 ", 角色: " $2 ", 状态: " $3}'
else
echo " ❌ 默认管理员不存在"
fi
echo ""
# 检查系统配置
echo "系统配置检查:"
local config_count=$(sqlite3 "${ADMIN_DB}" "SELECT COUNT(*) FROM system_config;")
if [ $config_count -gt 0 ]; then
echo " ✅ 系统配置已初始化 (${config_count} 项)"
else
echo " ❌ 系统配置未初始化"
fi
else
echo "❌ Admin 数据库不存在"
fi
echo ""
# 检查群组数据库
echo "3. 检查 Group 数据库"
echo "--------------------------------------------------------------------------------"
GROUP_DIR="${DATA_DIR}/groups"
if [ -d "$GROUP_DIR" ]; then
local group_count=$(ls "$GROUP_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ')
if [ $group_count -gt 0 ]; then
echo "✅ 找到 ${group_count} 个群组数据库"
echo ""
# 检查每个群组数据库
for db in "$GROUP_DIR"/*.sqlite; do
if [ -f "$db" ]; then
local group_name=$(basename "$db" .sqlite | sed 's/group_//')
echo "群组: ${group_name}"
# 检查必需表
local has_members=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='group_members';" 2>/dev/null)
local has_files=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='group_files';" 2>/dev/null)
if [ -n "$has_members" ]; then
echo " ✅ group_members 表存在"
else
echo " ❌ group_members 表不存在"
fi
if [ -n "$has_files" ]; then
echo " ✅ group_files 表存在"
else
echo " ❌ group_files 表不存在"
fi
echo ""
fi
done
else
echo "⚠️ 未找到群组数据库"
fi
else
echo "❌ Groups 目录不存在"
fi
echo ""
# 检查用户数据库
echo "4. 检查 User 数据库"
echo "--------------------------------------------------------------------------------"
USER_DIR="${DATA_DIR}/users"
if [ -d "$USER_DIR" ]; then
local user_count=$(ls "$USER_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ')
if [ $user_count -gt 0 ]; then
echo "✅ 找到 ${user_count} 个用户数据库"
echo ""
# 检查每个用户数据库
for db in "$USER_DIR"/*.sqlite; do
if [ -f "$db" ]; then
local username=$(basename "$db" .sqlite)
echo "用户: ${username}"
# 检查必需表
local has_history=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='search_history';" 2>/dev/null)
local has_bookmarks=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='user_bookmarks';" 2>/dev/null)
local has_files=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='user_files';" 2>/dev/null)
[ -n "$has_history" ] && echo " ✅ search_history 表存在" || echo " ❌ search_history 表不存在"
[ -n "$has_bookmarks" ] && echo " ✅ user_bookmarks 表存在" || echo " ❌ user_bookmarks 表不存在"
[ -n "$has_files" ] && echo " ✅ user_files 表存在" || echo " ❌ user_files 表不存在"
echo ""
fi
done
else
echo "⚠️ 未找到用户数据库"
fi
else
echo "❌ Users 目录不存在"
fi
echo ""
# 检查数据库隔离
echo "5. 检查数据库隔离"
echo "--------------------------------------------------------------------------------"
# 检查是否有数据库在错误的位置
WRONG_DB=$(find "${DATA_DIR}" -maxdepth 1 -name "*.sqlite" 2>/dev/null)
if [ -n "$WRONG_DB" ]; then
echo "❌ 发现数据库在错误的位置 (应该在子目录中):"
echo "$WRONG_DB"
else
echo "✅ 所有数据库都在正确的位置"
fi
echo ""
# 检查权限
echo "6. 检查文件权限"
echo "--------------------------------------------------------------------------------"
if [ -f "$ADMIN_DB" ]; then
local admin_perms=$(stat -f "%Lp" "$ADMIN_DB" 2>/dev/null || stat -c "%a" "$ADMIN_DB" 2>/dev/null)
if [ "$admin_perms" = "600" ] || [ "$admin_perms" = "644" ]; then
echo "✅ Admin 数据库权限正确: ${admin_perms}"
else
echo "⚠️ Admin 数据库权限可能不安全: ${admin_perms} (建议: 600 或 644)"
fi
else
echo "❌ Admin 数据库不存在"
fi
echo ""
# 总结
echo "================================================================================
检查总结
================================================================================
"
# 统计
ADMIN_EXISTS=$([ -f "$ADMIN_DB" ] && echo "✅" || echo "❌")
GROUP_COUNT=$(ls "$GROUP_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ')
USER_COUNT=$(ls "$USER_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ')
echo "Admin Layer: ${ADMIN_EXISTS}"
echo "Group Layer: $( [ $GROUP_COUNT -gt 0 ] && echo "✅ ${GROUP_COUNT} 个群组" || echo "❌ 无群组")"
echo "User Layer: $( [ $USER_COUNT -gt 0 ] && echo "✅ ${USER_COUNT} 个用户" || echo "❌ 无用户")"
echo ""
if [ -f "$ADMIN_DB" ] && [ $USER_COUNT -gt 0 ]; then
echo "✅ 三层架构已初始化"
echo ""
echo "建议:"
echo "1. 使用 user_tool 修改默认管理员密码"
echo "2. 创建更多群组和用户"
echo "3. 配置权限和访问控制"
else
echo "❌ 三层架构未完全初始化"
echo ""
echo "建议:"
echo "1. 运行初始化脚本:"
echo " ./scripts/init_three_layer_db.sh"
echo "2. 或手动创建数据库:"
echo " 参考 docs/MARKBASE_THREE_LAYER_ARCHITECTURE.md"
fi
echo ""
echo "================================================================================
"

348
scripts/init_three_layer_db.sh Executable file
View 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 "================================================================================
"