-- FendxPHP 完整数据库脚本 -- 包含所有表结构、索引、约束和初始数据 -- 版本: 1.0 -- 创建时间: 2024-01-15 -- 创建数据库 CREATE DATABASE IF NOT EXISTS `fendx_php` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `fendx_php`; -- 设置外键检查 SET FOREIGN_KEY_CHECKS = 0; -- 删除已存在的表(按依赖关系倒序) DROP TABLE IF EXISTS `role_permissions`; DROP TABLE IF EXISTS `user_roles`; DROP TABLE IF EXISTS `permissions`; DROP TABLE IF EXISTS `roles`; DROP TABLE IF EXISTS `users`; DROP TABLE IF EXISTS `migrations`; -- 1. 创建用户表 CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(50) NOT NULL COMMENT '用户名', `email` varchar(100) NOT NULL COMMENT '邮箱', `password` varchar(255) NOT NULL COMMENT '密码', `nickname` varchar(50) DEFAULT NULL COMMENT '昵称', `avatar` varchar(255) DEFAULT NULL COMMENT '头像', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `gender` enum('male','female','other') DEFAULT NULL COMMENT '性别', `birthday` date DEFAULT NULL COMMENT '生日', `bio` text COMMENT '个人简介', `status` varchar(20) DEFAULT 'active' COMMENT '状态: active, inactive, banned', `email_verified` tinyint(1) DEFAULT 0 COMMENT '邮箱是否验证', `phone_verified` tinyint(1) DEFAULT 0 COMMENT '手机是否验证', `email_verified_at` timestamp NULL DEFAULT NULL COMMENT '邮箱验证时间', `phone_verified_at` timestamp NULL DEFAULT NULL COMMENT '手机验证时间', `last_login_at` timestamp NULL DEFAULT NULL COMMENT '最后登录时间', `last_login_ip` varchar(45) DEFAULT NULL COMMENT '最后登录IP', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `users_username_unique` (`username`), UNIQUE KEY `users_email_unique` (`email`), KEY `users_username_index` (`username`), KEY `users_email_index` (`email`), KEY `users_status_index` (`status`), KEY `users_created_at_index` (`created_at`), KEY `users_last_login_at_index` (`last_login_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'; -- 2. 创建角色表 CREATE TABLE `roles` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色ID', `name` varchar(50) NOT NULL COMMENT '角色名称', `display_name` varchar(100) NOT NULL COMMENT '显示名称', `description` text COMMENT '角色描述', `guard_name` varchar(50) DEFAULT 'web' COMMENT '守卫名称', `is_active` tinyint(1) DEFAULT 1 COMMENT '是否激活', `sort_order` int(11) DEFAULT 0 COMMENT '排序', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `roles_name_unique` (`name`), KEY `roles_name_index` (`name`), KEY `roles_guard_name_index` (`guard_name`), KEY `roles_is_active_index` (`is_active`), KEY `roles_sort_order_index` (`sort_order`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表'; -- 3. 创建权限表 CREATE TABLE `permissions` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID', `name` varchar(100) NOT NULL COMMENT '权限名称', `display_name` varchar(100) NOT NULL COMMENT '显示名称', `description` text COMMENT '权限描述', `guard_name` varchar(50) DEFAULT 'web' COMMENT '守卫名称', `group_name` varchar(50) DEFAULT NULL COMMENT '权限分组', `is_active` tinyint(1) DEFAULT 1 COMMENT '是否激活', `sort_order` int(11) DEFAULT 0 COMMENT '排序', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `permissions_name_unique` (`name`), KEY `permissions_name_index` (`name`), KEY `permissions_guard_name_index` (`guard_name`), KEY `permissions_group_name_index` (`group_name`), KEY `permissions_is_active_index` (`is_active`), KEY `permissions_sort_order_index` (`sort_order`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表'; -- 4. 创建用户角色关联表 CREATE TABLE `user_roles` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID', `role_id` bigint(20) unsigned NOT NULL COMMENT '角色ID', `guard_name` varchar(50) DEFAULT 'web' COMMENT '守卫名称', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `user_roles_unique` (`user_id`,`role_id`,`guard_name`), KEY `user_roles_user_id_index` (`user_id`), KEY `user_roles_role_id_index` (`role_id`), KEY `user_roles_guard_name_index` (`guard_name`), CONSTRAINT `user_roles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, CONSTRAINT `user_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表'; -- 5. 创建角色权限关联表 CREATE TABLE `role_permissions` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `role_id` bigint(20) unsigned NOT NULL COMMENT '角色ID', `permission_id` bigint(20) unsigned NOT NULL COMMENT '权限ID', `guard_name` varchar(50) DEFAULT 'web' COMMENT '守卫名称', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `role_permissions_unique` (`role_id`,`permission_id`,`guard_name`), KEY `role_permissions_role_id_index` (`role_id`), KEY `role_permissions_permission_id_index` (`permission_id`), KEY `role_permissions_guard_name_index` (`guard_name`), CONSTRAINT `role_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE, CONSTRAINT `role_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色权限关联表'; -- 6. 创建迁移记录表 CREATE TABLE `migrations` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `migration` varchar(255) NOT NULL COMMENT '迁移文件名', `batch` int(11) NOT NULL COMMENT '批次号', `ran_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '执行时间', PRIMARY KEY (`id`), KEY `migrations_migration_index` (`migration`), KEY `migrations_batch_index` (`batch`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='迁移记录表'; -- 恢复外键检查 SET FOREIGN_KEY_CHECKS = 1; -- ================================ -- 插入基础数据 -- ================================ -- 1. 插入角色数据 INSERT INTO `roles` (`id`, `name`, `display_name`, `description`, `guard_name`, `is_active`, `sort_order`, `created_at`, `updated_at`) VALUES (1, 'super_admin', '超级管理员', '系统超级管理员,拥有所有权限', 'web', 1, 1, NOW(), NOW()), (2, 'admin', '管理员', '系统管理员,拥有大部分管理权限', 'web', 1, 2, NOW(), NOW()), (3, 'moderator', '版主', '内容管理员,负责内容审核和管理', 'web', 1, 3, NOW(), NOW()), (4, 'user', '普通用户', '普通注册用户', 'web', 1, 4, NOW(), NOW()), (5, 'guest', '访客', '未登录访客', 'web', 1, 5, NOW(), NOW()); -- 2. 插入权限数据 INSERT INTO `permissions` (`id`, `name`, `display_name`, `description`, `guard_name`, `group_name`, `is_active`, `sort_order`, `created_at`, `updated_at`) VALUES -- 用户管理权限 (1-5) (1, 'user.list', '查看用户列表', '查看系统用户列表', 'web', '用户管理', 1, 1, NOW(), NOW()), (2, 'user.create', '创建用户', '创建新用户账号', 'web', '用户管理', 1, 2, NOW(), NOW()), (3, 'user.edit', '编辑用户', '编辑用户信息', 'web', '用户管理', 1, 3, NOW(), NOW()), (4, 'user.delete', '删除用户', '删除用户账号', 'web', '用户管理', 1, 4, NOW(), NOW()), (5, 'user.view', '查看用户详情', '查看用户详细信息', 'web', '用户管理', 1, 5, NOW(), NOW()), -- 角色管理权限 (6-10) (6, 'role.list', '查看角色列表', '查看系统角色列表', 'web', '角色管理', 1, 1, NOW(), NOW()), (7, 'role.create', '创建角色', '创建新角色', 'web', '角色管理', 1, 2, NOW(), NOW()), (8, 'role.edit', '编辑角色', '编辑角色信息', 'web', '角色管理', 1, 3, NOW(), NOW()), (9, 'role.delete', '删除角色', '删除角色', 'web', '角色管理', 1, 4, NOW(), NOW()), (10, 'role.assign', '分配角色', '为用户分配角色', 'web', '角色管理', 1, 5, NOW(), NOW()), -- 权限管理权限 (11-14) (11, 'permission.list', '查看权限列表', '查看系统权限列表', 'web', '权限管理', 1, 1, NOW(), NOW()), (12, 'permission.create', '创建权限', '创建新权限', 'web', '权限管理', 1, 2, NOW(), NOW()), (13, 'permission.edit', '编辑权限', '编辑权限信息', 'web', '权限管理', 1, 3, NOW(), NOW()), (14, 'permission.delete', '删除权限', '删除权限', 'web', '权限管理', 1, 4, NOW(), NOW()), -- 内容管理权限 (15-20) (15, 'content.list', '查看内容列表', '查看内容列表', 'web', '内容管理', 1, 1, NOW(), NOW()), (16, 'content.create', '创建内容', '创建新内容', 'web', '内容管理', 1, 2, NOW(), NOW()), (17, 'content.edit', '编辑内容', '编辑内容', 'web', '内容管理', 1, 3, NOW(), NOW()), (18, 'content.delete', '删除内容', '删除内容', 'web', '内容管理', 1, 4, NOW(), NOW()), (19, 'content.publish', '发布内容', '发布内容', 'web', '内容管理', 1, 5, NOW(), NOW()), (20, 'content.audit', '审核内容', '审核内容', 'web', '内容管理', 1, 6, NOW(), NOW()), -- 系统管理权限 (21-25) (21, 'system.config', '系统配置', '系统配置管理', 'web', '系统管理', 1, 1, NOW(), NOW()), (22, 'system.log', '查看系统日志', '查看系统操作日志', 'web', '系统管理', 1, 2, NOW(), NOW()), (23, 'system.monitor', '系统监控', '系统运行监控', 'web', '系统管理', 1, 3, NOW(), NOW()), (24, 'system.backup', '数据备份', '数据备份操作', 'web', '系统管理', 1, 4, NOW(), NOW()), (25, 'system.restore', '数据恢复', '数据恢复操作', 'web', '系统管理', 1, 5, NOW(), NOW()), -- API权限 (26-29) (26, 'api.access', 'API访问', '访问API接口', 'web', 'API管理', 1, 1, NOW(), NOW()), (27, 'api.create', 'API创建', '通过API创建资源', 'web', 'API管理', 1, 2, NOW(), NOW()), (28, 'api.update', 'API更新', '通过API更新资源', 'web', 'API管理', 1, 3, NOW(), NOW()), (29, 'api.delete', 'API删除', '通过API删除资源', 'web', 'API管理', 1, 4, NOW(), NOW()); -- 3. 插入用户数据 INSERT INTO `users` (`id`, `username`, `email`, `password`, `nickname`, `avatar`, `phone`, `gender`, `birthday`, `bio`, `status`, `email_verified`, `phone_verified`, `email_verified_at`, `phone_verified_at`, `last_login_at`, `last_login_ip`, `created_at`, `updated_at`) VALUES (1, 'admin', 'admin@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '系统管理员', NULL, '13800138000', 'other', NULL, '系统默认管理员账号', 'active', 1, 1, NOW(), NOW(), NOW(), '127.0.0.1', NOW(), NOW()), (2, 'test_user', 'test@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '测试用户', NULL, '13800138001', 'male', '1990-01-01', '这是一个测试用户账号', 'active', 1, 0, NOW(), NULL, NOW(), '127.0.0.1', NOW(), NOW()), (3, 'developer', 'dev@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '开发者', NULL, '13800138002', 'male', '1985-05-15', '系统开发者账号', 'active', 1, 1, NOW(), NOW(), NOW(), '127.0.0.1', NOW(), NOW()), (4, 'moderator', 'mod@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '内容管理员', NULL, '13800138003', 'female', '1992-08-20', '负责内容审核和管理的版主', 'active', 1, 0, NOW(), NULL, NOW(), '127.0.0.1', NOW(), NOW()), (5, 'user001', 'user001@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '普通用户1', NULL, '13800138004', 'male', '1995-03-10', '普通注册用户', 'active', 1, 0, NOW(), NULL, NOW(), '127.0.0.1', NOW(), NOW()), (6, 'user002', 'user002@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '普通用户2', NULL, '13800138005', 'female', '1993-11-25', '普通注册用户', 'active', 1, 0, NOW(), NULL, NOW(), '127.0.0.1', NOW(), NOW()); -- 4. 插入用户角色关联数据 INSERT INTO `user_roles` (`user_id`, `role_id`, `guard_name`, `created_at`) VALUES (1, 1, 'web', NOW()), -- admin -> super_admin (2, 4, 'web', NOW()), -- test_user -> user (3, 2, 'web', NOW()), -- developer -> admin (4, 3, 'web', NOW()), -- moderator -> moderator (5, 4, 'web', NOW()), -- user001 -> user (6, 4, 'web', NOW()); -- user002 -> user -- 5. 插入角色权限关联数据 -- 超级管理员拥有所有权限 (role_id = 1) INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`, `created_at`) SELECT 1, id, 'web', NOW() FROM permissions; -- 管理员权限 (role_id = 2) - 除了系统管理中的敏感权限 INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`, `created_at`) VALUES (2, 1, 'web', NOW()), (2, 2, 'web', NOW()), (2, 3, 'web', NOW'), (2, 5, 'web', NOW()), -- 用户管理 (2, 6, 'web', NOW()), (2, 7, 'web', NOW()), (2, 8, 'web', NOW'), (2, 10, 'web', NOW()), -- 角色管理 (2, 11, 'web', NOW()), (2, 13, 'web', NOW()), -- 权限管理 (2, 15, 'web', NOW()), (2, 16, 'web', NOW()), (2, 17, 'web', NOW'), (2, 19, 'web', NOW()), (2, 20, 'web', NOW()), -- 内容管理 (2, 22, 'web', NOW'), (2, 23, 'web', NOW'), -- 系统管理(部分) (2, 26, 'web', NOW'), (2, 27, 'web', NOW'), (2, 28, 'web', NOW'); -- API管理 -- 版主权限 (role_id = 3) - 内容管理相关 INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`, `created_at`) VALUES (3, 1, 'web', NOW'), (3, 5, 'web', NOW'), -- 用户查看 (3, 15, 'web', NOW'), (3, 16, 'web', NOW'), (3, 17, 'web', NOW'), (3, 20, 'web', NOW'), -- 内容管理 (3, 26, 'web', NOW'); -- API访问 -- 普通用户权限 (role_id = 4) - 基础权限 INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`, `created_at`) VALUES (4, 5, 'web', NOW'), -- 查看自己的信息 (4, 15, 'web', NOW'), (4, 16, 'web', NOW'), (4, 17, 'web', NOW'), -- 内容管理 (4, 26, 'web', NOW'); -- API访问 -- 访客权限 (role_id = 5) - 最基础权限 INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`, `created_at`) VALUES (5, 15, 'web', NOW'), -- 查看公开内容 (5, 26, 'web', NOW'); -- 基础API访问 -- 6. 插入迁移记录 INSERT INTO `migrations` (`migration`, `batch`, `ran_at`) VALUES ('2024_01_15_000001_create_users_table', 1, NOW()), ('2024_01_15_000002_create_roles_table', 1, NOW()), ('2024_01_15_000003_create_permissions_table', 1, NOW()), ('2024_01_15_000004_create_user_roles_table', 1, NOW()), ('2024_01_15_000005_create_role_permissions_table', 1, NOW()), ('2024_01_15_000006_create_migrations_table', 1, NOW()); -- ================================ -- 创建视图(可选) -- ================================ -- 用户详细信息视图 CREATE OR REPLACE VIEW `user_details` AS SELECT u.id, u.username, u.email, u.nickname, u.avatar, u.phone, u.gender, u.birthday, u.bio, u.status, u.email_verified, u.phone_verified, u.last_login_at, u.last_login_ip, u.created_at, u.updated_at, GROUP_CONCAT(r.name) as roles, GROUP_CONCAT(r.display_name) as role_names FROM users u LEFT JOIN user_roles ur ON u.id = ur.user_id LEFT JOIN roles r ON ur.role_id = r.id GROUP BY u.id; -- 用户权限视图 CREATE OR REPLACE VIEW `user_permissions` AS SELECT u.id as user_id, u.username, p.name as permission_name, p.display_name as permission_display_name, p.group_name as permission_group FROM users u JOIN user_roles ur ON u.id = ur.user_id JOIN roles r ON ur.role_id = r.id JOIN role_permissions rp ON r.id = rp.role_id JOIN permissions p ON rp.permission_id = p.id WHERE r.is_active = 1 AND p.is_active = 1; -- ================================ -- 创建存储过程(可选) -- ================================ -- 检查用户权限的存储过程 DELIMITER // CREATE PROCEDURE `check_user_permission`( IN p_user_id BIGINT, IN p_permission_name VARCHAR(100) ) BEGIN SELECT COUNT(*) as has_permission FROM user_permissions WHERE user_id = p_user_id AND permission_name = p_permission_name; END // DELIMITER ; -- 获取用户角色的存储过程 DELIMITER // CREATE PROCEDURE `get_user_roles`( IN p_user_id BIGINT ) BEGIN SELECT r.id, r.name, r.display_name, r.description FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = p_user_id AND r.is_active = 1; END // DELIMITER ; -- ================================ -- 创建触发器(可选) -- ================================ -- 用户更新时间触发器 DELIMITER // CREATE TRIGGER `users_update_timestamp` BEFORE UPDATE ON `users` FOR EACH ROW BEGIN SET NEW.updated_at = CURRENT_TIMESTAMP; END // DELIMITER ; -- 角色更新时间触发器 DELIMITER // CREATE TRIGGER `roles_update_timestamp` BEFORE UPDATE ON `roles` FOR EACH ROW BEGIN SET NEW.updated_at = CURRENT_TIMESTAMP; END // DELIMITER ; -- 权限更新时间触发器 DELIMITER // CREATE TRIGGER `permissions_update_timestamp` BEFORE UPDATE ON `permissions` FOR EACH ROW BEGIN SET NEW.updated_at = CURRENT_TIMESTAMP; END // DELIMITER ; -- ================================ -- 输出初始化完成信息 -- ================================ SELECT 'FendxPHP 数据库初始化完成!' as message; SELECT COUNT(*) as total_users FROM users; SELECT COUNT(*) as total_roles FROM roles; SELECT COUNT(*) as total_permissions FROM permissions; SELECT COUNT(*) as total_user_roles FROM user_roles; SELECT COUNT(*) as total_role_permissions FROM role_permissions; -- 默认账号信息 SELECT '默认管理员账号: admin / password' as admin_info; SELECT '测试用户账号: test_user / password' as test_info; SELECT '开发者账号: developer / dev123' as dev_info; SELECT '版主账号: moderator / mod123' as mod_info; -- 权限统计 SELECT (SELECT COUNT(*) FROM permissions) as total_permissions, (SELECT COUNT(*) FROM permissions WHERE group_name = '用户管理') as user_management_perms, (SELECT COUNT(*) FROM permissions WHERE group_name = '角色管理') as role_management_perms, (SELECT COUNT(*) FROM permissions WHERE group_name = '权限管理') as permission_management_perms, (SELECT COUNT(*) FROM permissions WHERE group_name = '内容管理') as content_management_perms, (SELECT COUNT(*) FROM permissions WHERE group_name = '系统管理') as system_management_perms, (SELECT COUNT(*) FROM permissions WHERE group_name = 'API管理') as api_management_perms; -- 完成提示 SELECT '数据库初始化完成,可以开始使用 FendxPHP 系统!' as completion_message;