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 00000000..cd2f2986 Binary files /dev/null and b/plugins/Bestseller/Static/image/logo.png differ 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' => '請至少選擇一個角色', ];