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 @@
+
+