appaydin / pd-admin
Symfony 强力管理仪表盘
Requires
- php: >=8.0.0
- ext-ctype: *
- ext-iconv: *
- ext-intl: *
- ext-json: *
- ext-mbstring: *
- appaydin/pd-activity: ^1.0
- appaydin/pd-api: ^1.0
- appaydin/pd-menu: 3.*
- appaydin/pd-user: ^3.0
- appaydin/pd-widget: 3.*
- beberlei/doctrineextensions: 1.*
- doctrine/doctrine-bundle: ^2.3
- doctrine/doctrine-migrations-bundle: ^3.1
- doctrine/orm: ^2.8
- gregwar/image: ^2.1
- knplabs/knp-paginator-bundle: dev-master
- sensio/framework-extra-bundle: 5.*
- sonata-project/exporter: ^2.6
- symfony/asset: 5.*
- symfony/console: 5.*
- symfony/dotenv: 5.*
- symfony/flex: 1.*
- symfony/form: 5.*
- symfony/framework-bundle: 5.*
- symfony/intl: 5.3.*
- symfony/mailer: 5.*
- symfony/messenger: 5.*
- symfony/monolog-bundle: 3.*
- symfony/runtime: 5.3.*
- symfony/security-bundle: 5.*
- symfony/translation: 5.*
- symfony/twig-bundle: 5.*
- symfony/validator: 5.*
- symfony/webpack-encore-bundle: ^1.8
- symfony/yaml: 5.*
- zenstruck/schedule-bundle: ^1.1
Requires (Dev)
- roave/security-advisories: dev-master
- symfony/debug-bundle: 5.*
- symfony/maker-bundle: ^1.0
- symfony/profiler-pack: ^1.0
- symfony/test-pack: ^1.0
Conflicts
Replaces
- symfony/polyfill-ctype: *
- symfony/polyfill-iconv: *
- symfony/polyfill-intl-grapheme: *
- symfony/polyfill-intl-icu: *
- symfony/polyfill-intl-idn: *
- symfony/polyfill-intl-normalizer: *
- symfony/polyfill-mbstring: *
- symfony/polyfill-php56: *
- symfony/polyfill-php70: *
- symfony/polyfill-php71: *
- symfony/polyfill-php72: *
- symfony/polyfill-php73: *
- symfony/polyfill-php74: *
- symfony/polyfill-php80: *
README
pdAdmin
支持 PHP8 和 Composer 2
Symfony 强力仪表盘 & 管理员。使用 Symfony 5、Vue 3、Bootstrap 5 框架开发。
没有对 symfony 结构做出更改,当前目录结构被使用。已创建一个用于 Admin 的自定义命名空间。此字段用于所有管理员操作。
界面使用 Twitter Bootstrap 设计,以便响应。尝试尽可能减少依赖。
属性
- 使用 Messenger 进行队列。
- 已将 PM2 设置为后台进程。
- cron 进程由 PM2 管理。
- 为面板(Vue3)编写了特殊的数据表。
- 支持 CSV、Excel 导出。
- 为 HTTP 与邮件日志编写了特殊包。
- 使用 JWT 进行 API 登录。
- 响应式设计
- Vue 文档尚未提供,请参阅源文件。
安装
-
下载 pdAdmin
composer create-project appaydin/pd-admin pdadmin
-
创建并配置
.env
文件。 -
创建数据库模式
bin/console doctrine:schema:create --force
-
运行内置 Web 服务器
symfony server:start --no-tls -d
-
安装 & 构建资源
yarn install yarn run build
-
运行后台进程
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; } }