weblebby/framework

Laravel 管理面板。

安装次数: 4

依赖者: 0

建议者: 0

安全: 0

星标: 1

关注者: 2

分支: 0

开放问题: 0

语言:JavaScript

v0.0.2 2024-03-09 16:24 UTC

This package is auto-updated.

Last update: 2024-09-09 19:01:09 UTC


README

weblebby-panel

重要说明

Weblebby 框架需要 PHP 8.2+ 和 Laravel 10+。

此外,此框架添加到现有项目中时可能无法正常工作。建议用于新项目。

安装

composer require weblebby/framework

在将 Weblebby 框架包含到您的库中后,还有一些其他事情要做。让我们一步一步看看应该做什么。

用法

AppServiceProvider

首先,让我们在服务提供器中创建一个新的面板。 我们可以使用 AppServiceProvider 来实现。

use App\Http\Middleware\AdminPanel;
use Weblebby\Framework\Facades\Panel;
use Weblebby\Framework\Support\Features;
/**
 * Create a new panel named "admin".
 */
Panel::create('admin')
    ->prefix('admin')
    ->as('admin::')
    ->middleware(AdminPanel::class) // We will create this middleware later.
    ->features([
        /**
         * You can delete the features you want.
         */
        Features::users(),
        Features::roles(),
        Features::registration(),
        Features::preferences(),
        Features::navigations(),
        Features::extensions(),
        Features::themes(),
        Features::appearance(),
        Features::setup(),
    ]);

/**
 * Set as main panel.
 */
Panel::setMainPanel('admin');

用户模型

在用户模型中,我们应使用 Weblebby 框架提供的类,而不是使用默认的 Authenticatable 类。

<?php

// app/Models/User.php

// remove
- use Illuminate\Foundation\Auth\User as Authenticatable;

// add
+ use Weblebby\Framework\Models\User as Authenticatable;

进行此更改后,我们需要在用户模型中包含 authorizedPanels() 方法以处理访问管理。

public function authorizedPanels(): array|bool
{
    if ($this->hasRole('Super Admin')) {
        // Grant access to all panels.
        return true;
    }
    
    if ($this->hasRole('Reseller')) {
        // Grant access to specific panels.
        return ['reseller'];
    }
    
    // Deny all access.
    return false;
}

创建中间件

我们必须为每个面板创建一个中间件。让我们为 "admin" 面板创建一个。

php artisan make:middleware AdminPanel
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Weblebby\Framework\Facades\Panel;
use Weblebby\Framework\Items\MenuItem;
use Weblebby\Framework\Support\Features;

class AdminPanel
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        /**
         * We must set "admin" panel as current.
         */
        Panel::setCurrentPanel('admin');

        /**
         * Initialize menu for "admin" panel.
         */
        panel()->menu('sidebar')
            ->withCategory('general')
            ->addMany([
                MenuItem::create(__('Users'))
                    ->withUrl(route('admin::users.index'))
                    ->withActive($request->routeIs('admin::users.*'))
                    ->withIcon('people')
                    ->withAbility([panel()->supports(Features::users()), 'user:read']),

                MenuItem::create(__('Preferences'))
                    ->withUrl(route('admin::preferences.index'))
                    ->withActive($request->routeIs('admin::preferences.*'))
                    ->withIcon('sliders')
                    ->withAbility([
                        panel()->supports(Features::preferences()),
                        fn () => auth()->user()->getAllPermissions()
                            ->pluck('name')
                            ->intersect(panel()->preference('default')->toPermissions())
                            ->isNotEmpty(),
                    ]),
            ]);

        /**
         * You can create menu items for custom categories.
         */
        panel()->menu('sidebar')
            ->withCategory('content', __('Content'))
            ->addMany([
                MenuItem::create(__('Cars'))
                    ->withUrl(route('admin::preferences.index'))
                    ->withActive($request->routeIs('admin::cars.*'))
                    ->withIcon('people')
                    ->withAbility('car:read'),
            ]);

        /**
         * Set preference sections for "admin" panel.
         * 
         * We will set the fields of these bags within a service provider later.
         */
        panel()
            ->preference('default')
            ->withBag('general', __('General settings'))
            ->withBag('email', __('Email settings'));

        /**
         * Set default permissions for "Role Permissions" page.
         */
        panel()->permission()->defaults(
            navigations: true,
            users: true,
            extensions: true,
            appearance: true,
            preferences: true,
            roles: true,
        );

        /**
         * You can create custom permissions.
         */
        panel()->permission()
            ->withGroup('car')
            ->withTitle(__('Cars'))
            ->withPermissions([
                'create' => __('Can create cars'),
                'read' => __('Can view cars'),
                'update' => __('Can edit cars'),
                'delete' => __('Can delete cars'),
            ]);

        return $next($request);
    }
}

路由

我们必须在 RouteServiceProvider.php 中包含路由助手。

use Weblebby\Framework\Facades\Panel;

$this->routes(function () {
    Panel::useRoutes();
    Panel::useFortifyRoutes();

    // ...
});

偏好设置

偏好设置的工作方式类似于 Laravel 中的 config(...) 方法。但是,您可以从管理面板更新偏好设置,并在需要的位置使用 preference(...) 方法调用它们。

为了通过面板管理偏好设置,您必须首先定义您想要的字段。让我们做一个例子。

<?php

namespace App\Providers;

use Weblebby\Framework\Facades\Preference;
use Weblebby\Framework\Items\Field\FieldItem;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        // ...
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Preference::create('default', 'general')->addMany([
            FieldItem::text('site_name')
                ->label(__('Site name'))
                ->hint(__('Enter your site name.'))
                ->rules(['required', 'string', 'max:191']),
        
            FieldItem::text('site_url')
                ->label(__('Site URL'))
                ->rules(['required', 'string', 'url', 'max:191']),
            
            /**
             * For select field items, the `in` rule is automatically created using the options available.
             * You can also include required or nullable rules if needed.
             */
            FieldItem::select('ssl')
                ->label(__('SSL'))
                ->options([
                    'yes' => __('Yes!'),
                    'no' => __('No'),
                ]),
        
            FieldItem::image('site_logo')
                ->label(__('Site Logo'))
                ->rules(['nullable', 'image', 'max:2048']),
        ]);
    }
}

身份验证中间件

为了避免异常,将 route('login') 更改为 route('admin::login')app/Http/Middleware/Authenticate.php 中。

安装命令

最后,我们运行 weblebby:install 来配置数据库并创建管理员用户。

php artisan weblebby:install