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:
240
scripts/check_three_layer.sh
Executable file
240
scripts/check_three_layer.sh
Executable 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
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