appaydin/pd-admin

Symfony 强力管理仪表盘

安装次数: 1,075

依赖项: 0

建议者: 0

安全: 0

星星: 95

观察者: 10

分支: 21

公开问题: 11

类型:项目

3.0.07 2021-08-10 21:35 UTC

README

page-login

page-admin

pdAdmin

支持 PHP8 和 Composer 2

Symfony 强力仪表盘 & 管理员。使用 Symfony 5Vue 3Bootstrap 5 框架开发。

没有对 symfony 结构做出更改,当前目录结构被使用。已创建一个用于 Admin 的自定义命名空间。此字段用于所有管理员操作。

界面使用 Twitter Bootstrap 设计,以便响应。尝试尽可能减少依赖。

属性

  • 使用 Messenger 进行队列。
  • 已将 PM2 设置为后台进程。
  • cron 进程由 PM2 管理。
  • 为面板(Vue3)编写了特殊的数据表。
  • 支持 CSV、Excel 导出。
  • 为 HTTP 与邮件日志编写了特殊包。
  • 使用 JWT 进行 API 登录。
  • 响应式设计
  • Vue 文档尚未提供,请参阅源文件。

安装

  1. 下载 pdAdmin

    composer create-project appaydin/pd-admin pdadmin
    
  2. 创建并配置 .env 文件。

  3. 创建数据库模式

    bin/console doctrine:schema:create --force
    
  4. 运行内置 Web 服务器

    symfony server:start --no-tls -d
    
  5. 安装 & 构建资源

    yarn install
    yarn run build
    
  6. 运行后台进程

    pm2 start
    
    # Manuel
    # bin/console messenger:consume -vv
    # bin/console schedule:run
    

文档

用户管理

存在 pd-user 用于用户管理。所有设置均在 config/packages/pd_user.yaml 文件中。

  • 创建用户
    bin/console user:create
    
  • 更改用户密码
    bin/console user:changepassword
    
  • 更改用户角色
    bin/console user:role
    

多语言系统

使用多语言用户登录。每个用户都可以选择自己的语言。登录时,会自动跳转。

可以从内核设置中添加新语言。您需要手动为新语言进行翻译。

委托

使用 SensioFrameworkExtraBundle 与 Symfony 安全组件一起使用。有三个默认用户角色。

  • ROLE_USER
  • ROLE_SUPER_ADMIN

ROLE_SUPER_ADMIN 拥有全部权限。ROLE_USER 权限可以在 security.yaml 文件中受限,并且可以关闭面板访问。

系统设置

系统设置存储在数据库中。所有设置都可以在容器组装后用作参数。由于所有设置都随着容器一起编译,因此不会给系统带来任何额外负载。可以使用 Symfony 表单进行配置,并通过“菜单事件”系统从外部添加到设置菜单中。更改系统设置后,请清除缓存,否则新设置将无法启用。

对于一般设置,您可以将其添加到 src/Admin/Forms/System/GeneralForm

将新菜单添加到设置:

<?php
//src/Admin/Menu/SettingsMenu.php

namespace App\Admin\Menu;

use Pd\MenuBundle\Builder\ItemInterface;
use Pd\MenuBundle\Builder\Menu;

class SettingsMenu extends Menu
{
    public function createMenu(array $options = []): ItemInterface
    {
        // Create Root Item
        $menu = $this->createRoot('settings_menu')->setChildAttr([
            'class' => 'nav nav-pills',
            'data-parent' => 'admin_config_general',
        ]);

        // Create Menu Items
        $menu->addChild('nav_config_general')
            ->setLabel('nav_config_general')
            ->setRoute('admin_config_general')
            ->setLinkAttr(['class' => 'nav-item'])
            ->setRoles(['ROLE_CONFIG_GENERAL'])
            // Email
            ->addChildParent('nav_config_email')
            ->setLabel('nav_config_email')
            ->setRoute('admin_settings_email')
            ->setLinkAttr(['class' => 'nav-item'])
            ->setRoles(['ROLE_SETTINGS_EMAIL']);

        return $menu;
    }
}

创建新小部件

使用 Symfony "EventDispatcher Component" 创建了小部件系统。它为每个用户具有可调整的结构,并可以使用 "Twig Template" 引擎特别设计。更多信息请访问 pd-widget

创建新管理员小部件

<?php
//src/Admin/Widgets/AccountWidget.php

namespace App\Admin\Widgets;

use Pd\WidgetBundle\Builder\Item;
use Pd\WidgetBundle\Event\WidgetEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;

class AccountWidget
{
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    /**
     * Build Widgets.
     *
     * @param WidgetEvent $event
     */
    public function builder(WidgetEvent $event)
    {
        // Get Widget Container
        $widgets = $event->getWidgetContainer();

        // Add Widgets
        $widgets
            ->addWidget((new Item('user_statistics', 3600))
                ->setGroup('admin') // Widget Adds to "Admin" Group
                ->setName('widget_user_statistics.name')
                ->setDescription('widget_user_statistics.description')
                ->setTemplate('@Admin/Widget/userStatistics.html.twig')
                ->setRole(['ROLE_WIDGET_USERSTATISTICS'])
                ->setConfigProcess(function (Request $request) {
                    /**
                     * Controller for Widget Settings
                     * The return value is stored in the user specific database
                     */
                    if ($type = $request->get('type')) {
                        switch ($type) {
                            case '1week':
                                return ['type' => '1week'];
                            case '1month':
                                return ['type' => '1month'];
                            case '3month':
                                return ['type' => '3month'];
                        }
                    }

                    return false;
                })
                ->setData(function ($config) {
                    /**
                     * The return value can be used in the twig template.
                     * The function will not execute unless you call it in the template.
                     * You can use the database operations here.
                     */
                    // Set Default Config
                    if (!isset($config['type'])) {
                        $config['type'] = '1week';
                    }

                    // Create Statistics Data
                    if ($config['type'] === '1month') {
                        $data = ['chartDay' => '7'];
                        // Create Data
                    } else if ($config['type'] === '1month') {
                        $data = ['chartDay' => '30'];
                    } else {
                        $data = ['chartDay' => '90'];
                    }

                    return $data;
                })
            );
    }
}

创建新菜单

使用 Symfony "EventDispatcher Component" 创建了菜单系统。对于创建的每个菜单,默认生成事件,可以通过菜单配置关闭。更多信息请访问 pd-menu

创建菜单

<?php
// src/Admin/Menu/MainNav.php

namespace App\Admin\Menu;

use Pd\MenuBundle\Builder\ItemInterface;
use Pd\MenuBundle\Builder\Menu;

class MainNav extends Menu
{
    public function createMenu(array $options = []): ItemInterface
    {
        // Create ROOT Menu
        $menu = $this->createRoot('main_menu', true); // Event enabled

        // Create Dashboard
        $menu->addChild('nav_dashboard', 1)
            ->setLabel('nav_dashboard')
            ->setRoute('admin_dashboard')
            ->setRoles(['ROLE_DASHBOARD'])
            ->setExtra('label_icon', 'dashboard');

        /*
         * Create Account Section
         */
        $menu
            ->addChild('nav_account', 5)
            ->setLabel('nav_account')
            ->setRoute('admin_account_list')
            ->setRoles(['ROLE_ACCOUNT_LIST'])
            ->setExtra('label_icon', 'people')
                // Account List
                ->addChild('nav_account', 1)
                ->setLabel('nav_account')
                ->setRoute('admin_account_list')
                ->setRoles(['ROLE_ACCOUNT_LIST'])
                // Group List
                ->addChildParent('nav_group', 2)
                ->setLabel('nav_group')
                ->setRoute('admin_account_group_list')
                ->setRoles(['ROLE_GROUP_LIST']);

        return $menu;
    }
}