架构设计:
- 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 天
优先级: 高
240 lines
8.2 KiB
Bash
Executable File
240 lines
8.2 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 ""
|
|
|
|
# 检查目录结构
|
|
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 "================================================================================
|
|
" |