feat(database): 添加用户角色权限系统及相关监控功能

- 创建用户表(users)包含基本信息和认证字段
- 创建角色表(roles)用于权限控制
- 创建权限表(permissions)定义系统权限
- 创建用户角色关联表(user_roles)建立用户与角色关系
- 创建角色权限关联表(role_permissions)建立角色与权限关系
- 创建迁移记录表(migrations)追踪数据库变更
- 添加AdminController提供管理员面板功能
- 实现系统监控、配置管理、缓存清理等功能
- 添加AOP切面编程支持的各种通知类型
- 实现告警管理AlertManager支持多渠道告警
- 添加文档注解接口规范
This commit is contained in:
Lawson
2026-04-08 17:00:28 +08:00
commit 2782d765fb
270 changed files with 107192 additions and 0 deletions

220
database/init.sql Normal file
View File

@@ -0,0 +1,220 @@
-- FendxPHP 数据库初始化脚本
-- 创建数据库和基础表结构
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `fendx_php`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE `fendx_php`;
-- 创建用户表
CREATE TABLE IF NOT EXISTS `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='用户表';
-- 创建角色表
CREATE TABLE IF NOT EXISTS `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='角色表';
-- 创建权限表
CREATE TABLE IF NOT EXISTS `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='权限表';
-- 创建用户角色关联表
CREATE TABLE IF NOT EXISTS `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='用户角色关联表';
-- 创建角色权限关联表
CREATE TABLE IF NOT EXISTS `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='角色权限关联表';
-- 创建迁移记录表
CREATE TABLE IF NOT EXISTS `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='迁移记录表';
-- 插入基础角色数据
INSERT INTO `roles` (`name`, `display_name`, `description`, `guard_name`, `is_active`, `sort_order`) VALUES
('super_admin', '超级管理员', '系统超级管理员,拥有所有权限', 'web', 1, 1),
('admin', '管理员', '系统管理员,拥有大部分管理权限', 'web', 1, 2),
('moderator', '版主', '内容管理员,负责内容审核和管理', 'web', 1, 3),
('user', '普通用户', '普通注册用户', 'web', 1, 4),
('guest', '访客', '未登录访客', 'web', 1, 5);
-- 插入基础权限数据
INSERT INTO `permissions` (`name`, `display_name`, `group_name`, `guard_name`, `is_active`, `sort_order`) VALUES
-- 用户管理权限
('user.list', '查看用户列表', '用户管理', 'web', 1, 1),
('user.create', '创建用户', '用户管理', 'web', 1, 2),
('user.edit', '编辑用户', '用户管理', 'web', 1, 3),
('user.delete', '删除用户', '用户管理', 'web', 1, 4),
('user.view', '查看用户详情', '用户管理', 'web', 1, 5),
-- 角色管理权限
('role.list', '查看角色列表', '角色管理', 'web', 1, 1),
('role.create', '创建角色', '角色管理', 'web', 1, 2),
('role.edit', '编辑角色', '角色管理', 'web', 1, 3),
('role.delete', '删除角色', '角色管理', 'web', 1, 4),
('role.assign', '分配角色', '角色管理', 'web', 1, 5),
-- 权限管理权限
('permission.list', '查看权限列表', '权限管理', 'web', 1, 1),
('permission.create', '创建权限', '权限管理', 'web', 1, 2),
('permission.edit', '编辑权限', '权限管理', 'web', 1, 3),
('permission.delete', '删除权限', '权限管理', 'web', 1, 4),
-- 内容管理权限
('content.list', '查看内容列表', '内容管理', 'web', 1, 1),
('content.create', '创建内容', '内容管理', 'web', 1, 2),
('content.edit', '编辑内容', '内容管理', 'web', 1, 3),
('content.delete', '删除内容', '内容管理', 'web', 1, 4),
('content.publish', '发布内容', '内容管理', 'web', 1, 5),
('content.audit', '审核内容', '内容管理', 'web', 1, 6),
-- 系统管理权限
('system.config', '系统配置', '系统管理', 'web', 1, 1),
('system.log', '查看系统日志', '系统管理', 'web', 1, 2),
('system.monitor', '系统监控', '系统管理', 'web', 1, 3),
('system.backup', '数据备份', '系统管理', 'web', 1, 4),
('system.restore', '数据恢复', '系统管理', 'web', 1, 5),
-- API权限
('api.access', 'API访问', 'API管理', 'web', 1, 1),
('api.create', 'API创建', 'API管理', 'web', 1, 2),
('api.update', 'API更新', 'API管理', 'web', 1, 3),
('api.delete', 'API删除', 'API管理', 'web', 1, 4);
-- 插入默认管理员用户
INSERT INTO `users` (`username`, `email`, `password`, `nickname`, `phone`, `gender`, `bio`, `status`, `email_verified`, `phone_verified`, `email_verified_at`, `phone_verified_at`, `last_login_at`, `last_login_ip`) VALUES
('admin', 'admin@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '系统管理员', '13800138000', 'other', '系统默认管理员账号', 'active', 1, 1, NOW(), NOW(), NOW(), '127.0.0.1');
-- 分配超级管理员角色给admin用户
INSERT INTO `user_roles` (`user_id`, `role_id`, `guard_name`)
SELECT u.id, r.id, 'web'
FROM users u, roles r
WHERE u.username = 'admin' AND r.name = 'super_admin';
-- 给超级管理员分配所有权限
INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`)
SELECT r.id, p.id, 'web'
FROM roles r, permissions p
WHERE r.name = 'super_admin';
-- 插入迁移记录
INSERT INTO `migrations` (`migration`, `batch`) VALUES
('2024_01_15_000001_create_users_table', 1),
('2024_01_15_000002_create_roles_table', 1),
('2024_01_15_000003_create_permissions_table', 1),
('2024_01_15_000004_create_user_roles_table', 1),
('2024_01_15_000005_create_role_permissions_table', 1),
('2024_01_15_000006_create_migrations_table', 1);
-- 创建测试用户
INSERT INTO `users` (`username`, `email`, `password`, `nickname`, `phone`, `gender`, `bio`, `status`, `email_verified`, `phone_verified`, `email_verified_at`, `phone_verified_at`, `last_login_at`, `last_login_ip`) VALUES
('test_user', 'test@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '测试用户', '13800138001', 'male', '这是一个测试用户账号', 'active', 1, 0, NOW(), NULL, NOW(), '127.0.0.1');
-- 分配普通用户角色给测试用户
INSERT INTO `user_roles` (`user_id`, `role_id`, `guard_name`)
SELECT u.id, r.id, 'web'
FROM users u, roles r
WHERE u.username = 'test_user' AND r.name = 'user';
-- 给普通用户分配基础权限
INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`)
SELECT r.id, p.id, 'web'
FROM roles r, permissions p
WHERE r.name = 'user' AND p.name IN ('user.view', 'content.list', 'content.create', 'content.edit', 'api.access');
-- 输出初始化完成信息
SELECT 'FendxPHP 数据库初始化完成!' as message;
SELECT '默认管理员账号: admin / password' as admin_info;
SELECT '测试用户账号: test_user / password' as test_info;

View File

@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
use Fendx\Database\Schema\Schema;
use Fendx\Database\Migration;
/**
* 创建用户表
*/
class CreateUsersTable extends Migration
{
public function up(): void
{
Schema::create('users', function (Schema\Table $table) {
$table->id('id')->primary()->autoIncrement();
$table->string('username', 50)->unique()->comment('用户名');
$table->string('email', 100)->unique()->comment('邮箱');
$table->string('password', 255)->comment('密码');
$table->string('nickname', 50)->nullable()->comment('昵称');
$table->string('avatar', 255)->nullable()->comment('头像');
$table->string('phone', 20)->nullable()->comment('手机号');
$table->enum('gender', ['male', 'female', 'other'])->nullable()->comment('性别');
$table->date('birthday')->nullable()->comment('生日');
$table->text('bio')->nullable()->comment('个人简介');
$table->string('status', 20)->default('active')->comment('状态: active, inactive, banned');
$table->boolean('email_verified')->default(false)->comment('邮箱是否验证');
$table->boolean('phone_verified')->default(false)->comment('手机是否验证');
$table->timestamp('email_verified_at')->nullable()->comment('邮箱验证时间');
$table->timestamp('phone_verified_at')->nullable()->comment('手机验证时间');
$table->timestamp('last_login_at')->nullable()->comment('最后登录时间');
$table->string('last_login_ip', 45)->nullable()->comment('最后登录IP');
$table->timestamp('created_at')->useCurrent()->comment('创建时间');
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->comment('更新时间');
// 索引
$table->index('username');
$table->index('email');
$table->index('status');
$table->index('created_at');
$table->index('last_login_at');
});
}
public function down(): void
{
Schema::dropIfExists('users');
}
}

View File

@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
use Fendx\Database\Schema\Schema;
use Fendx\Database\Migration;
/**
* 创建角色表
*/
class CreateRolesTable extends Migration
{
public function up(): void
{
Schema::create('roles', function (Schema\Table $table) {
$table->id('id')->primary()->autoIncrement();
$table->string('name', 50)->unique()->comment('角色名称');
$table->string('display_name', 100)->comment('显示名称');
$table->text('description')->nullable()->comment('角色描述');
$table->string('guard_name', 50)->default('web')->comment('守卫名称');
$table->boolean('is_active')->default(true)->comment('是否激活');
$table->integer('sort_order')->default(0)->comment('排序');
$table->timestamp('created_at')->useCurrent()->comment('创建时间');
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->comment('更新时间');
// 索引
$table->index('name');
$table->index('guard_name');
$table->index('is_active');
$table->index('sort_order');
});
}
public function down(): void
{
Schema::dropIfExists('roles');
}
}

View File

@@ -0,0 +1,39 @@
<?php
declare(strict_types=1);
use Fendx\Database\Schema\Schema;
use Fendx\Database\Migration;
/**
* 创建权限表
*/
class CreatePermissionsTable extends Migration
{
public function up(): void
{
Schema::create('permissions', function (Schema\Table $table) {
$table->id('id')->primary()->autoIncrement();
$table->string('name', 100)->unique()->comment('权限名称');
$table->string('display_name', 100)->comment('显示名称');
$table->text('description')->nullable()->comment('权限描述');
$table->string('guard_name', 50)->default('web')->comment('守卫名称');
$table->string('group_name', 50)->nullable()->comment('权限分组');
$table->boolean('is_active')->default(true)->comment('是否激活');
$table->integer('sort_order')->default(0)->comment('排序');
$table->timestamp('created_at')->useCurrent()->comment('创建时间');
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->comment('更新时间');
// 索引
$table->index('name');
$table->index('guard_name');
$table->index('group_name');
$table->index('is_active');
$table->index('sort_order');
});
}
public function down(): void
{
Schema::dropIfExists('permissions');
}
}

View File

@@ -0,0 +1,39 @@
<?php
declare(strict_types=1);
use Fendx\Database\Schema\Schema;
use Fendx\Database\Migration;
/**
* 创建用户角色关联表
*/
class CreateUserRolesTable extends Migration
{
public function up(): void
{
Schema::create('user_roles', function (Schema\Table $table) {
$table->id('id')->primary()->autoIncrement();
$table->unsignedBigInteger('user_id')->comment('用户ID');
$table->unsignedBigInteger('role_id')->comment('角色ID');
$table->string('guard_name', 50)->default('web')->comment('守卫名称');
$table->timestamp('created_at')->useCurrent()->comment('创建时间');
// 外键约束
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
// 唯一索引
$table->unique(['user_id', 'role_id', 'guard_name'], 'user_roles_unique');
// 索引
$table->index('user_id');
$table->index('role_id');
$table->index('guard_name');
});
}
public function down(): void
{
Schema::dropIfExists('user_roles');
}
}

View File

@@ -0,0 +1,39 @@
<?php
declare(strict_types=1);
use Fendx\Database\Schema\Schema;
use Fendx\Database\Migration;
/**
* 创建角色权限关联表
*/
class CreateRolePermissionsTable extends Migration
{
public function up(): void
{
Schema::create('role_permissions', function (Schema\Table $table) {
$table->id('id')->primary()->autoIncrement();
$table->unsignedBigInteger('role_id')->comment('角色ID');
$table->unsignedBigInteger('permission_id')->comment('权限ID');
$table->string('guard_name', 50)->default('web')->comment('守卫名称');
$table->timestamp('created_at')->useCurrent()->comment('创建时间');
// 外键约束
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
// 唯一索引
$table->unique(['role_id', 'permission_id', 'guard_name'], 'role_permissions_unique');
// 索引
$table->index('role_id');
$table->index('permission_id');
$table->index('guard_name');
});
}
public function down(): void
{
Schema::dropIfExists('role_permissions');
}
}

View File

@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
use Fendx\Database\Schema\Schema;
use Fendx\Database\Migration;
/**
* 创建迁移记录表
*/
class CreateMigrationsTable extends Migration
{
public function up(): void
{
Schema::create('migrations', function (Schema\Table $table) {
$table->id('id')->primary()->autoIncrement();
$table->string('migration', 255)->comment('迁移文件名');
$table->integer('batch')->comment('批次号');
$table->timestamp('ran_at')->useCurrent()->comment('执行时间');
// 索引
$table->index('migration');
$table->index('batch');
});
}
public function down(): void
{
Schema::dropIfExists('migrations');
}
}

View File

@@ -0,0 +1,59 @@
<?php
declare(strict_types=1);
use Fendx\Database\Seeder\Seeder;
use Fendx\Database\Seeder\RoleSeeder;
use Fendx\Database\Seeder\PermissionSeeder;
use Fendx\Database\Seeder\UserSeeder;
use Fendx\Database\Seeder\RolePermissionSeeder;
use Fendx\Database\Seeder\UserRoleSeeder;
/**
* 数据库种子数据主文件
*/
class DatabaseSeeder extends Seeder
{
/**
* 运行所有种子数据
*/
public function run(): void
{
$this->command->info('开始执行数据库种子数据...');
// 1. 创建角色数据
$this->command->info('正在插入角色数据...');
$this->call(RoleSeeder::class);
// 2. 创建权限数据
$this->command->info('正在插入权限数据...');
$this->call(PermissionSeeder::class);
// 3. 创建用户数据
$this->command->info('正在插入用户数据...');
$this->call(UserSeeder::class);
// 4. 创建角色权限关联数据
$this->command->info('正在插入角色权限关联数据...');
$this->call(RolePermissionSeeder::class);
// 5. 创建用户角色关联数据
$this->command->info('正在插入用户角色关联数据...');
$this->call(UserRoleSeeder::class);
$this->command->info('所有种子数据执行完成!');
}
/**
* 调用指定的种子类
*/
private function call(string $seederClass): void
{
if (class_exists($seederClass)) {
$seeder = new $seederClass();
$seeder->setCommand($this->command);
$seeder->run();
} else {
$this->command->error("种子类不存在: {$seederClass}");
}
}
}

View File

@@ -0,0 +1,72 @@
<?php
declare(strict_types=1);
use Fendx\Database\Seeder\Seeder;
use Fendx\Database\Connection\DB;
/**
* 权限种子数据
*/
class PermissionSeeder extends Seeder
{
public function run(): void
{
$permissions = [
// 用户管理权限
['name' => 'user.list', 'display_name' => '查看用户列表', 'group_name' => '用户管理', 'sort_order' => 1],
['name' => 'user.create', 'display_name' => '创建用户', 'group_name' => '用户管理', 'sort_order' => 2],
['name' => 'user.edit', 'display_name' => '编辑用户', 'group_name' => '用户管理', 'sort_order' => 3],
['name' => 'user.delete', 'display_name' => '删除用户', 'group_name' => '用户管理', 'sort_order' => 4],
['name' => 'user.view', 'display_name' => '查看用户详情', 'group_name' => '用户管理', 'sort_order' => 5],
// 角色管理权限
['name' => 'role.list', 'display_name' => '查看角色列表', 'group_name' => '角色管理', 'sort_order' => 1],
['name' => 'role.create', 'display_name' => '创建角色', 'group_name' => '角色管理', 'sort_order' => 2],
['name' => 'role.edit', 'display_name' => '编辑角色', 'group_name' => '角色管理', 'sort_order' => 3],
['name' => 'role.delete', 'display_name' => '删除角色', 'group_name' => '角色管理', 'sort_order' => 4],
['name' => 'role.assign', 'display_name' => '分配角色', 'group_name' => '角色管理', 'sort_order' => 5],
// 权限管理权限
['name' => 'permission.list', 'display_name' => '查看权限列表', 'group_name' => '权限管理', 'sort_order' => 1],
['name' => 'permission.create', 'display_name' => '创建权限', 'group_name' => '权限管理', 'sort_order' => 2],
['name' => 'permission.edit', 'display_name' => '编辑权限', 'group_name' => '权限管理', 'sort_order' => 3],
['name' => 'permission.delete', 'display_name' => '删除权限', 'group_name' => '权限管理', 'sort_order' => 4],
// 内容管理权限
['name' => 'content.list', 'display_name' => '查看内容列表', 'group_name' => '内容管理', 'sort_order' => 1],
['name' => 'content.create', 'display_name' => '创建内容', 'group_name' => '内容管理', 'sort_order' => 2],
['name' => 'content.edit', 'display_name' => '编辑内容', 'group_name' => '内容管理', 'sort_order' => 3],
['name' => 'content.delete', 'display_name' => '删除内容', 'group_name' => '内容管理', 'sort_order' => 4],
['name' => 'content.publish', 'display_name' => '发布内容', 'group_name' => '内容管理', 'sort_order' => 5],
['name' => 'content.audit', 'display_name' => '审核内容', 'group_name' => '内容管理', 'sort_order' => 6],
// 系统管理权限
['name' => 'system.config', 'display_name' => '系统配置', 'group_name' => '系统管理', 'sort_order' => 1],
['name' => 'system.log', 'display_name' => '查看系统日志', 'group_name' => '系统管理', 'sort_order' => 2],
['name' => 'system.monitor', 'display_name' => '系统监控', 'group_name' => '系统管理', 'sort_order' => 3],
['name' => 'system.backup', 'display_name' => '数据备份', 'group_name' => '系统管理', 'sort_order' => 4],
['name' => 'system.restore', 'display_name' => '数据恢复', 'group_name' => '系统管理', 'sort_order' => 5],
// API权限
['name' => 'api.access', 'display_name' => 'API访问', 'group_name' => 'API管理', 'sort_order' => 1],
['name' => 'api.create', 'display_name' => 'API创建', 'group_name' => 'API管理', 'sort_order' => 2],
['name' => 'api.update', 'display_name' => 'API更新', 'group_name' => 'API管理', 'sort_order' => 3],
['name' => 'api.delete', 'display_name' => 'API删除', 'group_name' => 'API管理', 'sort_order' => 4],
];
foreach ($permissions as $permission) {
DB::table('permissions')->insert([
'name' => $permission['name'],
'display_name' => $permission['display_name'],
'group_name' => $permission['group_name'],
'guard_name' => 'web',
'is_active' => true,
'sort_order' => $permission['sort_order'],
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
}
$this->command->info('权限种子数据插入完成');
}
}

View File

@@ -0,0 +1,121 @@
<?php
declare(strict_types=1);
use Fendx\Database\Seeder\Seeder;
use Fendx\Database\Connection\DB;
/**
* 角色权限关联种子数据
*/
class RolePermissionSeeder extends Seeder
{
public function run(): void
{
// 获取角色和权限ID
$roles = DB::table('roles')->pluck('id', 'name')->toArray();
$permissions = DB::table('permissions')->pluck('id', 'name')->toArray();
$rolePermissions = [];
// 超级管理员拥有所有权限
if (isset($roles['super_admin'])) {
foreach ($permissions as $permissionId) {
$rolePermissions[] = [
'role_id' => $roles['super_admin'],
'permission_id' => $permissionId,
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
}
// 管理员权限(除了系统管理中的敏感权限)
if (isset($roles['admin'])) {
$adminPermissions = [
'user.list', 'user.create', 'user.edit', 'user.view',
'role.list', 'role.create', 'role.edit', 'role.assign',
'permission.list', 'permission.edit',
'content.list', 'content.create', 'content.edit', 'content.publish', 'content.audit',
'system.log', 'system.monitor',
'api.access', 'api.create', 'api.update',
];
foreach ($adminPermissions as $permissionName) {
if (isset($permissions[$permissionName])) {
$rolePermissions[] = [
'role_id' => $roles['admin'],
'permission_id' => $permissions[$permissionName],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
}
}
// 版主权限(内容管理相关)
if (isset($roles['moderator'])) {
$moderatorPermissions = [
'user.list', 'user.view',
'content.list', 'content.create', 'content.edit', 'content.audit',
'api.access',
];
foreach ($moderatorPermissions as $permissionName) {
if (isset($permissions[$permissionName])) {
$rolePermissions[] = [
'role_id' => $roles['moderator'],
'permission_id' => $permissions[$permissionName],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
}
}
// 普通用户权限(基础权限)
if (isset($roles['user'])) {
$userPermissions = [
'user.view', // 查看自己的信息
'content.list', 'content.create', 'content.edit', // 内容管理
'api.access', // API访问
];
foreach ($userPermissions as $permissionName) {
if (isset($permissions[$permissionName])) {
$rolePermissions[] = [
'role_id' => $roles['user'],
'permission_id' => $permissions[$permissionName],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
}
}
// 访客权限(最基础的权限)
if (isset($roles['guest'])) {
$guestPermissions = [
'content.list', // 查看公开内容
'api.access', // 基础API访问
];
foreach ($guestPermissions as $permissionName) {
if (isset($permissions[$permissionName])) {
$rolePermissions[] = [
'role_id' => $roles['guest'],
'permission_id' => $permissions[$permissionName],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
}
}
// 批量插入角色权限关联
if (!empty($rolePermissions)) {
DB::table('role_permissions')->insert($rolePermissions);
}
$this->command->info('角色权限关联种子数据插入完成');
}
}

View File

@@ -0,0 +1,73 @@
<?php
declare(strict_types=1);
use Fendx\Database\Seeder\Seeder;
use Fendx\Database\Connection\DB;
/**
* 角色种子数据
*/
class RoleSeeder extends Seeder
{
public function run(): void
{
$roles = [
[
'name' => 'super_admin',
'display_name' => '超级管理员',
'description' => '系统超级管理员,拥有所有权限',
'guard_name' => 'web',
'is_active' => true,
'sort_order' => 1,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'name' => 'admin',
'display_name' => '管理员',
'description' => '系统管理员,拥有大部分管理权限',
'guard_name' => 'web',
'is_active' => true,
'sort_order' => 2,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'name' => 'moderator',
'display_name' => '版主',
'description' => '内容管理员,负责内容审核和管理',
'guard_name' => 'web',
'is_active' => true,
'sort_order' => 3,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'name' => 'user',
'display_name' => '普通用户',
'description' => '普通注册用户',
'guard_name' => 'web',
'is_active' => true,
'sort_order' => 4,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'name' => 'guest',
'display_name' => '访客',
'description' => '未登录访客',
'guard_name' => 'web',
'is_active' => true,
'sort_order' => 5,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
];
foreach ($roles as $role) {
DB::table('roles')->insert($role);
}
$this->command->info('角色种子数据插入完成');
}
}

View File

@@ -0,0 +1,87 @@
<?php
declare(strict_types=1);
use Fendx\Database\Seeder\Seeder;
use Fendx\Database\Connection\DB;
/**
* 用户角色关联种子数据
*/
class UserRoleSeeder extends Seeder
{
public function run(): void
{
// 获取用户和角色ID
$users = DB::table('users')->pluck('id', 'username')->toArray();
$roles = DB::table('roles')->pluck('id', 'name')->toArray();
$userRoles = [];
// admin 用户 -> 超级管理员
if (isset($users['admin']) && isset($roles['super_admin'])) {
$userRoles[] = [
'user_id' => $users['admin'],
'role_id' => $roles['super_admin'],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
// test_user 用户 -> 普通用户
if (isset($users['test_user']) && isset($roles['user'])) {
$userRoles[] = [
'user_id' => $users['test_user'],
'role_id' => $roles['user'],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
// developer 用户 -> 管理员
if (isset($users['developer']) && isset($roles['admin'])) {
$userRoles[] = [
'user_id' => $users['developer'],
'role_id' => $roles['admin'],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
// moderator 用户 -> 版主
if (isset($users['moderator']) && isset($roles['moderator'])) {
$userRoles[] = [
'user_id' => $users['moderator'],
'role_id' => $roles['moderator'],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
// user001 用户 -> 普通用户
if (isset($users['user001']) && isset($roles['user'])) {
$userRoles[] = [
'user_id' => $users['user001'],
'role_id' => $roles['user'],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
// user002 用户 -> 普通用户
if (isset($users['user002']) && isset($roles['user'])) {
$userRoles[] = [
'user_id' => $users['user002'],
'role_id' => $roles['user'],
'guard_name' => 'web',
'created_at' => date('Y-m-d H:i:s'),
];
}
// 批量插入用户角色关联
if (!empty($userRoles)) {
DB::table('user_roles')->insert($userRoles);
}
$this->command->info('用户角色关联种子数据插入完成');
}
}

View File

@@ -0,0 +1,143 @@
<?php
declare(strict_types=1);
use Fendx\Database\Seeder\Seeder;
use Fendx\Database\Connection\DB;
/**
* 用户种子数据
*/
class UserSeeder extends Seeder
{
public function run(): void
{
$users = [
[
'username' => 'admin',
'email' => 'admin@fendx.com',
'password' => password_hash('admin123', PASSWORD_DEFAULT),
'nickname' => '系统管理员',
'avatar' => null,
'phone' => '13800138000',
'gender' => 'other',
'birthday' => null,
'bio' => '系统默认管理员账号',
'status' => 'active',
'email_verified' => true,
'phone_verified' => true,
'email_verified_at' => date('Y-m-d H:i:s'),
'phone_verified_at' => date('Y-m-d H:i:s'),
'last_login_at' => date('Y-m-d H:i:s'),
'last_login_ip' => '127.0.0.1',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'username' => 'test_user',
'email' => 'test@fendx.com',
'password' => password_hash('test123', PASSWORD_DEFAULT),
'nickname' => '测试用户',
'avatar' => null,
'phone' => '13800138001',
'gender' => 'male',
'birthday' => '1990-01-01',
'bio' => '这是一个测试用户账号',
'status' => 'active',
'email_verified' => true,
'phone_verified' => false,
'email_verified_at' => date('Y-m-d H:i:s'),
'phone_verified_at' => null,
'last_login_at' => date('Y-m-d H:i:s'),
'last_login_ip' => '127.0.0.1',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'username' => 'developer',
'email' => 'dev@fendx.com',
'password' => password_hash('dev123', PASSWORD_DEFAULT),
'nickname' => '开发者',
'avatar' => null,
'phone' => '13800138002',
'gender' => 'male',
'birthday' => '1985-05-15',
'bio' => '系统开发者账号',
'status' => 'active',
'email_verified' => true,
'phone_verified' => true,
'email_verified_at' => date('Y-m-d H:i:s'),
'phone_verified_at' => date('Y-m-d H:i:s'),
'last_login_at' => date('Y-m-d H:i:s'),
'last_login_ip' => '127.0.0.1',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'username' => 'moderator',
'email' => 'mod@fendx.com',
'password' => password_hash('mod123', PASSWORD_DEFAULT),
'nickname' => '内容管理员',
'avatar' => null,
'phone' => '13800138003',
'gender' => 'female',
'birthday' => '1992-08-20',
'bio' => '负责内容审核和管理的版主',
'status' => 'active',
'email_verified' => true,
'phone_verified' => false,
'email_verified_at' => date('Y-m-d H:i:s'),
'phone_verified_at' => null,
'last_login_at' => date('Y-m-d H:i:s'),
'last_login_ip' => '127.0.0.1',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'username' => 'user001',
'email' => 'user001@fendx.com',
'password' => password_hash('user123', PASSWORD_DEFAULT),
'nickname' => '普通用户1',
'avatar' => null,
'phone' => '13800138004',
'gender' => 'male',
'birthday' => '1995-03-10',
'bio' => '普通注册用户',
'status' => 'active',
'email_verified' => true,
'phone_verified' => false,
'email_verified_at' => date('Y-m-d H:i:s'),
'phone_verified_at' => null,
'last_login_at' => date('Y-m-d H:i:s'),
'last_login_ip' => '127.0.0.1',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
[
'username' => 'user002',
'email' => 'user002@fendx.com',
'password' => password_hash('user123', PASSWORD_DEFAULT),
'nickname' => '普通用户2',
'avatar' => null,
'phone' => '13800138005',
'gender' => 'female',
'birthday' => '1993-11-25',
'bio' => '普通注册用户',
'status' => 'active',
'email_verified' => true,
'phone_verified' => false,
'email_verified_at' => date('Y-m-d H:i:s'),
'phone_verified_at' => null,
'last_login_at' => date('Y-m-d H:i:s'),
'last_login_ip' => '127.0.0.1',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
],
];
foreach ($users as $user) {
DB::table('users')->insert($user);
}
$this->command->info('用户种子数据插入完成');
}
}