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

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('用户种子数据插入完成');
}
}