#!/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 "================================================================================ "