From 8933cbbdd4bad1c51620ce6b7b53a1630d54f6f2 Mon Sep 17 00:00:00 2001 From: pushuo Date: Tue, 7 Mar 2023 17:00:57 +0800 Subject: [PATCH] Bestseller module plugin for home page designer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持首页模块插件化 bestseller wip wip Optimize module view path. wip Fixed module content Optimize module view path. wip wip Optimize module view path. --- .../Http/Controllers/AdminRoleController.php | 6 +- .../Http/Controllers/DesignController.php | 13 +++- beike/Repositories/PluginRepo.php | 2 +- beike/Services/DesignService.php | 9 ++- .../Shop/Http/Controllers/HomeController.php | 13 ++-- .../Shop/Providers/PluginServiceProvider.php | 46 +++++++++--- plugins/.gitignore | 1 + .../Admin/View/DesignBuilders/Bestseller.php | 46 ++++++++++++ plugins/Bestseller/Bootstrap.php | 43 ++++++++++++ .../Bestseller/Repositories/ProductRepo.php | 35 ++++++++++ plugins/Bestseller/Static/image/logo.png | Bin 0 -> 43295 bytes .../admin/design_module_bestseller.blade.php | 51 ++++++++++++++ .../shop/design_module_bestseller.blade.php | 66 ++++++++++++++++++ plugins/Bestseller/config.json | 12 ++++ .../pages/design/builder/index.blade.php | 20 ++++-- resources/lang/de/admin/admin_roles.php | 12 ++-- resources/lang/en/admin/admin_roles.php | 14 ++-- resources/lang/es/admin/admin_roles.php | 12 ++-- resources/lang/fr/admin/admin_roles.php | 12 ++-- resources/lang/ja/admin/admin_roles.php | 12 ++-- resources/lang/ru/admin/admin_roles.php | 12 ++-- resources/lang/zh_cn/admin/admin_roles.php | 14 ++-- resources/lang/zh_hk/admin/admin_roles.php | 12 ++-- 23 files changed, 389 insertions(+), 74 deletions(-) create mode 100644 plugins/Bestseller/Admin/View/DesignBuilders/Bestseller.php create mode 100644 plugins/Bestseller/Bootstrap.php create mode 100644 plugins/Bestseller/Repositories/ProductRepo.php create mode 100644 plugins/Bestseller/Static/image/logo.png create mode 100644 plugins/Bestseller/Views/admin/design_module_bestseller.blade.php create mode 100644 plugins/Bestseller/Views/shop/design_module_bestseller.blade.php create mode 100644 plugins/Bestseller/config.json diff --git a/beike/Admin/Http/Controllers/AdminRoleController.php b/beike/Admin/Http/Controllers/AdminRoleController.php index 3d96a97c..f49a2dd7 100644 --- a/beike/Admin/Http/Controllers/AdminRoleController.php +++ b/beike/Admin/Http/Controllers/AdminRoleController.php @@ -34,7 +34,7 @@ class AdminRoleController extends Controller { $permissionRepo = (new PermissionRepo()); $data = [ - 'core_permissions' => $permissionRepo->getRoleCorePermissions(), + 'core_permissions' => $permissionRepo->getRoleCorePermissions(), 'plugin_permissions' => $permissionRepo->getRolePluginPermissions(), ]; @@ -49,9 +49,9 @@ class AdminRoleController extends Controller $role = Role::query()->findOrFail($id); $permissionRepo = (new PermissionRepo())->setRole($role); $data = [ - 'core_permissions' => $permissionRepo->getRoleCorePermissions(), + 'core_permissions' => $permissionRepo->getRoleCorePermissions(), 'plugin_permissions' => $permissionRepo->getRolePluginPermissions(), - 'role' => $role, + 'role' => $role, ]; $data = hook_filter('admin.admin_role.edit.data', $data); diff --git a/beike/Admin/Http/Controllers/DesignController.php b/beike/Admin/Http/Controllers/DesignController.php index 30056a7c..e048e47b 100644 --- a/beike/Admin/Http/Controllers/DesignController.php +++ b/beike/Admin/Http/Controllers/DesignController.php @@ -18,9 +18,13 @@ class DesignController extends Controller public function index(Request $request): View { $data = [ - 'editors' => ['editor-slide_show', 'editor-image401', 'editor-tab_product', 'editor-product', 'editor-image100', 'editor-brand', 'editor-icons', 'editor-rich_text'], + 'editors' => [ + 'editor-slide_show', 'editor-image401', 'editor-tab_product', 'editor-product', 'editor-image100', + 'editor-brand', 'editor-icons', 'editor-rich_text', + ], 'design_settings' => system_setting('base.design_setting'), ]; + $data = hook_filter('admin.design.index.data', $data); return view('admin::pages.design.builder.index', $data); @@ -39,7 +43,11 @@ class DesignController extends Controller $moduleId = $module['module_id'] ?? ''; $moduleCode = $module['code'] ?? ''; $content = $module['content'] ?? ''; - $viewPath = "design.{$moduleCode}"; + $viewPath = $module['view_path'] ?? ''; + + if (empty($viewPath)) { + $viewPath = "design.{$moduleCode}"; + } $viewData = [ 'code' => $moduleCode, @@ -48,6 +56,7 @@ class DesignController extends Controller 'content' => DesignService::handleModuleContent($moduleCode, $content), 'design' => (bool) $request->get('design'), ]; + $viewData = hook_filter('admin.design.preview.data', $viewData); return view($viewPath, $viewData); diff --git a/beike/Repositories/PluginRepo.php b/beike/Repositories/PluginRepo.php index c0fe632c..a911c75d 100644 --- a/beike/Repositories/PluginRepo.php +++ b/beike/Repositories/PluginRepo.php @@ -41,7 +41,7 @@ class PluginRepo */ public static function installPlugin(BPlugin $bPlugin) { - self::publishStaticFiles($bPlugin); + // self::publishStaticFiles($bPlugin); self::migrateDatabase($bPlugin); $type = $bPlugin->type; $code = $bPlugin->code; diff --git a/beike/Services/DesignService.php b/beike/Services/DesignService.php index d6d26af7..b24d3e2e 100644 --- a/beike/Services/DesignService.php +++ b/beike/Services/DesignService.php @@ -30,6 +30,12 @@ class DesignService if (empty($moduleId)) { $moduleData['module_id'] = Str::random(16); } + + $viewPath = $moduleData['view_path'] ?? ''; + if ($viewPath == 'design.') { + $moduleData['view_path'] = ''; + } + $modulesData[$index] = $moduleData; } @@ -41,6 +47,7 @@ class DesignService */ public static function handleModuleContent($moduleCode, $content) { + $content['module_code'] = $moduleCode; if ($moduleCode == 'slideshow') { return self::handleSlideShow($content); } elseif (in_array($moduleCode, ['image401', 'image100'])) { @@ -57,7 +64,7 @@ class DesignService return self::handleRichText($content); } - return $content; + return hook_filter('admin.service.design.module.content', $content); } /** diff --git a/beike/Shop/Http/Controllers/HomeController.php b/beike/Shop/Http/Controllers/HomeController.php index 3426fb45..cdedbd07 100644 --- a/beike/Shop/Http/Controllers/HomeController.php +++ b/beike/Shop/Http/Controllers/HomeController.php @@ -20,10 +20,15 @@ class HomeController extends Controller $moduleItems = []; foreach ($modules as $module) { - $code = $module['code']; - $moduleId = $module['module_id'] ?? ''; - $content = $module['content']; - $viewPath = "design.{$code}"; + $code = $module['code']; + $moduleId = $module['module_id'] ?? ''; + $content = $module['content']; + $viewPath = $module['view_path'] ?? ''; + + if (empty($viewPath)) { + $viewPath = "design.{$code}"; + } + if (view()->exists($viewPath) && $moduleId) { $moduleItems[] = [ 'code' => $code, diff --git a/beike/Shop/Providers/PluginServiceProvider.php b/beike/Shop/Providers/PluginServiceProvider.php index ba392a32..00a1234d 100644 --- a/beike/Shop/Providers/PluginServiceProvider.php +++ b/beike/Shop/Providers/PluginServiceProvider.php @@ -15,6 +15,7 @@ use Beike\Models\AdminUser; use Beike\Plugin\Manager; use Illuminate\Support\Facades\Route; use Illuminate\Support\ServiceProvider; +use Illuminate\Support\Str; class PluginServiceProvider extends ServiceProvider { @@ -34,6 +35,7 @@ class PluginServiceProvider extends ServiceProvider /** * Bootstrap Plugin Service Provider + * @throws \Exception */ public function boot() { @@ -41,16 +43,8 @@ class PluginServiceProvider extends ServiceProvider return; } $manager = app('plugin'); - $plugins = $manager->getEnabledPlugins(); $this->pluginBasePath = base_path('plugins'); - foreach ($plugins as $plugin) { - $pluginCode = $plugin->getDirname(); - $this->bootPlugin($plugin); - $this->registerRoutes($pluginCode); - $this->registerMiddleware($pluginCode); - } - $allPlugins = $manager->getPlugins(); foreach ($allPlugins as $plugin) { $pluginCode = $plugin->getDirname(); @@ -58,6 +52,15 @@ class PluginServiceProvider extends ServiceProvider $this->loadViews($pluginCode); $this->loadTranslations($pluginCode); } + + $enabledPlugins = $manager->getEnabledPlugins(); + foreach ($enabledPlugins as $plugin) { + $pluginCode = $plugin->getDirname(); + $this->bootPlugin($plugin); + $this->registerRoutes($pluginCode); + $this->registerMiddleware($pluginCode); + $this->loadDesignComponents($pluginCode); + } } /** @@ -189,4 +192,31 @@ class PluginServiceProvider extends ServiceProvider return $middlewares; } + + /** + * 加载插件内首页 page builder 相关组件 + * + * @throws \Exception + */ + protected function loadDesignComponents($pluginCode) + { + $pluginBasePath = $this->pluginBasePath; + $builderPath = "{$pluginBasePath}/{$pluginCode}/Admin/View/DesignBuilders/"; + + $builders = glob($builderPath . '*'); + foreach ($builders as $builder) { + $builderName = basename($builder, '.php'); + $aliasName = Str::snake($builderName); + $componentName = Str::studly($builderName); + $classBaseName = "\\Plugin\\{$pluginCode}\\Admin\\View\\DesignBuilders\\{$componentName}"; + + if (! class_exists($classBaseName)) { + throw new \Exception("请先定义自定义模板类 {$classBaseName}"); + } + + $this->loadViewComponentsAs('editor', [ + $aliasName => $classBaseName, + ]); + } + } } diff --git a/plugins/.gitignore b/plugins/.gitignore index e31e19fd..0a45ed47 100644 --- a/plugins/.gitignore +++ b/plugins/.gitignore @@ -5,3 +5,4 @@ !Paypal !Social !Stripe +!Bestseller diff --git a/plugins/Bestseller/Admin/View/DesignBuilders/Bestseller.php b/plugins/Bestseller/Admin/View/DesignBuilders/Bestseller.php new file mode 100644 index 00000000..319d15d5 --- /dev/null +++ b/plugins/Bestseller/Admin/View/DesignBuilders/Bestseller.php @@ -0,0 +1,46 @@ + + * @created 2022-07-08 17:09:15 + * @modified 2022-07-08 17:09:15 + */ + +namespace Plugin\Bestseller\Admin\View\DesignBuilders; + +use Illuminate\Contracts\View\View; +use Illuminate\View\Component; + +class Bestseller extends Component +{ + /** + * Create a new component instance. + * + * @return void + */ + public function __construct() + { + } + + /** + * Get the view / contents that represent the component. + * + * @return View + */ + public function render(): View + { + $data['register'] = [ + 'code' => 'bestseller', + 'sort' => 0, + // 'name' => trans('admin/design_builder.module_brand'), + 'name' => 'Bestseller', + 'icon' => '', + 'view_path' => 'Bestseller::shop/design_module_bestseller', + ]; + + return view('Bestseller::admin/design_module_bestseller', $data); + } +} diff --git a/plugins/Bestseller/Bootstrap.php b/plugins/Bestseller/Bootstrap.php new file mode 100644 index 00000000..67eb1a88 --- /dev/null +++ b/plugins/Bestseller/Bootstrap.php @@ -0,0 +1,43 @@ + + * @created 2022-07-20 15:35:59 + * @modified 2022-07-20 15:35:59 + */ + +namespace Plugin\Bestseller; + +use Plugin\Bestseller\Repositories\ProductRepo; + +class Bootstrap +{ + public function boot() + { + /** + * Add module for admin design. + */ + add_hook_filter('admin.design.index.data', function ($data) { + $data['editors'][] = 'editor-bestseller'; + + return $data; + }); + + /** + * Get module content for home page and preview. + */ + add_hook_filter('admin.service.design.module.content', function ($data) { + $module = $data['module_code'] ?? ''; + + if ($module == 'bestseller') { + $data['title'] = $data['title'][locale()] ?? ''; + $data['products'] = ProductRepo::getBestSellerProducts($data['limit']); + } + + return $data; + }); + } +} diff --git a/plugins/Bestseller/Repositories/ProductRepo.php b/plugins/Bestseller/Repositories/ProductRepo.php new file mode 100644 index 00000000..6d0da567 --- /dev/null +++ b/plugins/Bestseller/Repositories/ProductRepo.php @@ -0,0 +1,35 @@ + + * @created 2023-03-08 11:56:17 + * @modified 2023-03-08 11:56:17 + */ + +namespace Plugin\Bestseller\Repositories; + +use Beike\Shop\Http\Resources\ProductSimple; + +class ProductRepo +{ + /** + * Get best seller + * + * @param $limit + * @return array + */ + public static function getBestSellerProducts($limit): array + { + $products = \Beike\Repositories\ProductRepo::getBuilder([ + 'active' => 1, + 'sort' => 'products.sales', + 'order' => 'desc', + ]) + ->whereHas('masterSku') + ->limit($limit)->get(); + return ProductSimple::collection($products)->jsonSerialize(); + } +} diff --git a/plugins/Bestseller/Static/image/logo.png b/plugins/Bestseller/Static/image/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2f2986dd8480ef9224d2d66615fcb4e93bd298 GIT binary patch literal 43295 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 literal 0 HcmV?d00001 diff --git a/plugins/Bestseller/Views/admin/design_module_bestseller.blade.php b/plugins/Bestseller/Views/admin/design_module_bestseller.blade.php new file mode 100644 index 00000000..b8ad345c --- /dev/null +++ b/plugins/Bestseller/Views/admin/design_module_bestseller.blade.php @@ -0,0 +1,51 @@ + + + diff --git a/plugins/Bestseller/Views/shop/design_module_bestseller.blade.php b/plugins/Bestseller/Views/shop/design_module_bestseller.blade.php new file mode 100644 index 00000000..e0eff36f --- /dev/null +++ b/plugins/Bestseller/Views/shop/design_module_bestseller.blade.php @@ -0,0 +1,66 @@ +
+ @include('design._partial._module_tool') +
+
+
{{ $content['title'] }}
+ @if ($content['products']) +
+
+ @foreach ($content['products'] as $product) +
+ @include('shared.product') +
+ @endforeach +
+
+
+
+
+ @elseif (!$content['products'] and $design) +
+ @for ($s = 0; $s < 4; $s++) +
+
+
+
请配置商品
+
+ 66.66 + 99.99 +
+
+
+ @endfor +
+ @endif +
+
+ + +
diff --git a/plugins/Bestseller/config.json b/plugins/Bestseller/config.json new file mode 100644 index 00000000..b4bee6a7 --- /dev/null +++ b/plugins/Bestseller/config.json @@ -0,0 +1,12 @@ +{ + "code": "bestseller", + "name": "热卖商品模块", + "description": "首页装修热卖商品模块", + "type": "feature", + "version": "v1.0.0", + "icon": "/image/logo.png", + "author": { + "name": "成都光大网络科技有限公司", + "email": "yangjin@guangda.work" + } +} diff --git a/resources/beike/admin/views/pages/design/builder/index.blade.php b/resources/beike/admin/views/pages/design/builder/index.blade.php index 29855591..7f88de92 100644 --- a/resources/beike/admin/views/pages/design/builder/index.blade.php +++ b/resources/beike/admin/views/pages/design/builder/index.blade.php @@ -12,6 +12,7 @@ {{ __('admin/builder.text_edit_home') }} + @@ -22,9 +23,18 @@ @stack('header') @@ -65,11 +75,6 @@ - - @foreach($editors as $editor) - - @endforeach - + @foreach($editors as $editor) + + @endforeach + @include('admin::pages.design.builder.component.image_selector') @include('admin::pages.design.builder.component.link_selector') @include('admin::pages.design.builder.component.text_i18n') @@ -201,6 +210,7 @@ content: sourceModule.make, module_id: module_id, name: sourceModule.name, + view_path: sourceModule.view_path || '', } $http.post('design/builder/preview?design=1', _data, {hload: true}).then((res) => { diff --git a/resources/lang/de/admin/admin_roles.php b/resources/lang/de/admin/admin_roles.php index 7c566aa5..2f498f74 100644 --- a/resources/lang/de/admin/admin_roles.php +++ b/resources/lang/de/admin/admin_roles.php @@ -10,11 +10,11 @@ */ return [ - 'select_all' => 'alle auswählen', - 'unselect_all' => 'Auswahl aufheben', - 'role_name' => 'Rollenname', - 'role_management' => 'Rollenverwaltung', - 'permission' => 'System Authority', + 'select_all' => 'alle auswählen', + 'unselect_all' => 'Auswahl aufheben', + 'role_name' => 'Rollenname', + 'role_management' => 'Rollenverwaltung', + 'permission' => 'System Authority', 'plugin_permission' => 'Plugin permissions', - 'error_roles' => 'Bitte mindestens eine Rolle auswählen', + 'error_roles' => 'Bitte mindestens eine Rolle auswählen', ]; diff --git a/resources/lang/en/admin/admin_roles.php b/resources/lang/en/admin/admin_roles.php index 2bdeb287..24423312 100644 --- a/resources/lang/en/admin/admin_roles.php +++ b/resources/lang/en/admin/admin_roles.php @@ -10,12 +10,12 @@ */ return [ - 'select_all' => 'Select All', - 'unselect_all' => 'Unselect All', - 'role' => 'Role', - 'role_name' => 'Role Name', - 'role_management' => 'Role Management', - 'permission' => 'System Authority', + 'select_all' => 'Select All', + 'unselect_all' => 'Unselect All', + 'role' => 'Role', + 'role_name' => 'Role Name', + 'role_management' => 'Role Management', + 'permission' => 'System Authority', 'plugin_permission' => 'Plugin permissions', - 'error_roles' => 'Please select at least one role', + 'error_roles' => 'Please select at least one role', ]; diff --git a/resources/lang/es/admin/admin_roles.php b/resources/lang/es/admin/admin_roles.php index 1d53d468..1c404aa7 100644 --- a/resources/lang/es/admin/admin_roles.php +++ b/resources/lang/es/admin/admin_roles.php @@ -10,11 +10,11 @@ */ return [ - 'select_all' => 'Comprobar todo', - 'unselect_all' => 'desmarcar', - 'role_name' => 'Nombre de rol', - 'role_management' => 'gestión de roles', - 'permission' => 'System Authority', + 'select_all' => 'Comprobar todo', + 'unselect_all' => 'desmarcar', + 'role_name' => 'Nombre de rol', + 'role_management' => 'gestión de roles', + 'permission' => 'System Authority', 'plugin_permission' => 'Plugin permissions', - 'error_roles' => 'Seleccione al menos un rol', + 'error_roles' => 'Seleccione al menos un rol', ]; diff --git a/resources/lang/fr/admin/admin_roles.php b/resources/lang/fr/admin/admin_roles.php index ce631c96..99c61d77 100644 --- a/resources/lang/fr/admin/admin_roles.php +++ b/resources/lang/fr/admin/admin_roles.php @@ -10,11 +10,11 @@ */ return [ - 'select_all' => 'tout sélectionner', - 'unselect_all' => 'désélectionner', - 'role_name' => 'nom du rôle', - 'role_management' => 'gestion des rôles', - 'permission' => 'System Authority', + 'select_all' => 'tout sélectionner', + 'unselect_all' => 'désélectionner', + 'role_name' => 'nom du rôle', + 'role_management' => 'gestion des rôles', + 'permission' => 'System Authority', 'plugin_permission' => 'Plugin permissions', - 'error_roles' => 'Veuillez sélectionner au moins un rôle', + 'error_roles' => 'Veuillez sélectionner au moins un rôle', ]; diff --git a/resources/lang/ja/admin/admin_roles.php b/resources/lang/ja/admin/admin_roles.php index f66163fe..6ca0ea6c 100644 --- a/resources/lang/ja/admin/admin_roles.php +++ b/resources/lang/ja/admin/admin_roles.php @@ -10,11 +10,11 @@ */ return [ - 'select_all' => 'すべて選択', - 'unselect_all' => 'unselect', - 'role_name' => '役割名', - 'role_management' => '役割管理', - 'permission' => 'システム権限', + 'select_all' => 'すべて選択', + 'unselect_all' => 'unselect', + 'role_name' => '役割名', + 'role_management' => '役割管理', + 'permission' => 'システム権限', 'plugin_permission' => 'プラグインのパーミッション', - 'error_roles' => '少なくとも 1 つのロールを選択してください', + 'error_roles' => '少なくとも 1 つのロールを選択してください', ]; diff --git a/resources/lang/ru/admin/admin_roles.php b/resources/lang/ru/admin/admin_roles.php index dd9606fa..72353a69 100644 --- a/resources/lang/ru/admin/admin_roles.php +++ b/resources/lang/ru/admin/admin_roles.php @@ -10,11 +10,11 @@ */ return [ - 'select_all' => 'выбрать все', - 'unselect_all' => 'отменить выбор', - 'role_name' => 'имя роли', - 'role_management' => 'управление ролями', - 'permission' => 'System Authority', + 'select_all' => 'выбрать все', + 'unselect_all' => 'отменить выбор', + 'role_name' => 'имя роли', + 'role_management' => 'управление ролями', + 'permission' => 'System Authority', 'plugin_permission' => 'Plugin permissions', - 'error_roles' => 'Выберите хотя бы одну роль', + 'error_roles' => 'Выберите хотя бы одну роль', ]; diff --git a/resources/lang/zh_cn/admin/admin_roles.php b/resources/lang/zh_cn/admin/admin_roles.php index cda9eaa9..e92c10f9 100644 --- a/resources/lang/zh_cn/admin/admin_roles.php +++ b/resources/lang/zh_cn/admin/admin_roles.php @@ -10,12 +10,12 @@ */ return [ - 'select_all' => '选中所有', - 'unselect_all' => '取消选中', - 'role_name' => '角色名称', - 'role_management' => '角色管理', - 'role' => '角色', - 'permission' => '系统权限', + 'select_all' => '选中所有', + 'unselect_all' => '取消选中', + 'role_name' => '角色名称', + 'role_management' => '角色管理', + 'role' => '角色', + 'permission' => '系统权限', 'plugin_permission' => '插件权限', - 'error_roles' => '请至少选择一个角色', + 'error_roles' => '请至少选择一个角色', ]; diff --git a/resources/lang/zh_hk/admin/admin_roles.php b/resources/lang/zh_hk/admin/admin_roles.php index 3bd35577..ba4310aa 100644 --- a/resources/lang/zh_hk/admin/admin_roles.php +++ b/resources/lang/zh_hk/admin/admin_roles.php @@ -10,11 +10,11 @@ */ return [ - 'select_all' => '選中所有', - 'unselect_all' => '取消選中', - 'role_name' => '角色名稱', - 'role_management' => '角色管理', - 'permission' => '系統權限', + 'select_all' => '選中所有', + 'unselect_all' => '取消選中', + 'role_name' => '角色名稱', + 'role_management' => '角色管理', + 'permission' => '系統權限', 'plugin_permission' => '插件權限', - 'error_roles' => '請至少選擇一個角色', + 'error_roles' => '請至少選擇一個角色', ];