Browse Source

extension

jqh 4 years ago
parent
commit
f711005665

+ 47 - 0
database/migrations/2020_09_22_015815_create_admin_extensions_table.php

@@ -0,0 +1,47 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateAdminExtensionsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('admin_extensions', function (Blueprint $table) {
+            $table->increments('id')->unsigned();
+            $table->string('slug', 100)->unique();
+            $table->string('version', 20)->default('');
+            $table->tinyInteger('is_enabled')->default(0);
+            $table->json('options')->nullable();
+            $table->timestamps();
+        });
+
+        Schema::create('admin_extension_histories', function (Blueprint $table) {
+            $table->bigIncrements('id')->unsigned();
+            $table->string('slug', 100);
+            $table->tinyInteger('type')->default(1);
+            $table->string('version', 20)->default(0);
+            $table->text('description')->nullable();
+
+            $table->index('slug');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('admin_extensions');
+        Schema::dropIfExists('admin_extension_histories');
+    }
+}

+ 9 - 11
src/Admin.php

@@ -414,21 +414,19 @@ class Admin
             'prefix'     => admin_base_path('dcat-api'),
             'middleware' => config('admin.route.middleware'),
             'as'         => $as ?: static::app()->getApiRoutePrefix(Application::DEFAULT),
+            'namespace'  => 'Dcat\Admin\Http\Controllers',
         ];
 
         app('router')->group($attributes, function ($router) {
             /* @var \Illuminate\Routing\Router $router */
-            $router->namespace('Dcat\Admin\Http\Controllers')->group(function ($router) {
-                /* @var \Illuminate\Routing\Router $router */
-                $router->post('action', 'HandleActionController@handle')->name('action');
-                $router->post('form', 'HandleFormController@handle')->name('form');
-                $router->post('form/upload', 'HandleFormController@uploadFile')->name('form.upload');
-                $router->post('form/destroy-file', 'HandleFormController@destroyFile')->name('form.destroy-file');
-                $router->post('value', 'ValueController@handle')->name('value');
-                $router->get('render', 'RenderableController@handle')->name('render');
-                $router->post('tinymce/upload', 'TinymceController@upload')->name('tinymce.upload');
-                $router->post('editor-md/upload', 'EditorMDController@upload')->name('editor-md.upload');
-            });
+            $router->post('action', 'HandleActionController@handle')->name('action');
+            $router->post('form', 'HandleFormController@handle')->name('form');
+            $router->post('form/upload', 'HandleFormController@uploadFile')->name('form.upload');
+            $router->post('form/destroy-file', 'HandleFormController@destroyFile')->name('form.destroy-file');
+            $router->post('value', 'ValueController@handle')->name('value');
+            $router->get('render', 'RenderableController@handle')->name('render');
+            $router->post('tinymce/upload', 'TinymceController@upload')->name('tinymce.upload');
+            $router->post('editor-md/upload', 'EditorMDController@upload')->name('editor-md.upload');
         });
     }
 

+ 50 - 3
src/Extend/Manager.php

@@ -3,8 +3,8 @@
 namespace Dcat\Admin\Extend;
 
 use Dcat\Admin\Admin;
+use Dcat\Admin\Models\Extension as ExtensionModel;
 use Dcat\Admin\Support\Composer;
-use Dcat\Test\Test;
 use Illuminate\Contracts\Container\Container;
 use Illuminate\Support\Collection;
 use RecursiveDirectoryIterator;
@@ -27,6 +27,11 @@ class Manager
      */
     protected $extensionPaths = [];
 
+    /**
+     * @var ExtensionModel[]|Collection
+     */
+    protected $settings;
+
     public function __construct(Container $app)
     {
         $this->app = $app;
@@ -52,12 +57,24 @@ class Manager
     public function boot()
     {
         foreach ($this->extensions as $extension) {
-            if ($extension->enabled()) {
+            if ($this->enabled($extension->getName())) {
                 $extension->boot();
             }
         }
     }
 
+    /**
+     * 判断扩展是否启用.
+     *
+     * @param string|null $slug
+     *
+     * @return bool
+     */
+    public function enabled(?string $slug)
+    {
+        return (bool) optional($this->settings()->get($slug))->is_enabled;
+    }
+
     /**
      * 加载扩展,注册自动加载规则.
      *
@@ -88,7 +105,7 @@ class Manager
     public function availableExtensions()
     {
         return $this->extensions()->filter(function (ServiceProvider $extension) {
-            return $extension->enabled();
+            return $this->enabled($extension->getName());
         });
     }
 
@@ -175,11 +192,36 @@ class Manager
         return $extensions;
     }
 
+    /**
+     * 添加扩展.
+     *
+     * @param \Dcat\Admin\Extend\ServiceProvider $serviceProvider
+     */
     public function addExtension(ServiceProvider $serviceProvider)
     {
         $this->extensions->put($serviceProvider->getName(), $serviceProvider);
     }
 
+    /**
+     * 获取配置.
+     *
+     * @return ExtensionModel[]|Collection
+     */
+    public function settings()
+    {
+        if ($this->settings === null) {
+            try {
+                $this->settings = ExtensionModel::all()->keyBy('slug');
+            } catch (\Throwable $e) {
+                $this->reportException($e);
+
+                $this->settings = new Collection();
+            }
+        }
+
+        return $this->settings;
+    }
+
     protected function registerPsr4($directory, array $psr4)
     {
         $classLoader = Admin::classLoader();
@@ -190,4 +232,9 @@ class Manager
             $classLoader->addPsr4($namespace, $path);
         }
     }
+
+    protected function reportException(\Throwable $e)
+    {
+        logger()->error($e);
+    }
 }

+ 1 - 1
src/Extend/ServiceProvider.php

@@ -141,7 +141,7 @@ abstract class ServiceProvider extends LaravelServiceProvider
      */
     final public function enabled()
     {
-        return in_array($this->getName(), Admin::setting()->getExtensionsEnabled(), true);
+        return Admin::extension()->enabled($this->getName());
     }
 
     /**

+ 1 - 1
src/Form/Field/WebUploader.php

@@ -197,7 +197,7 @@ trait WebUploader
             'fileVal'             => WebUploaderHelper::FILE_NAME,
             'isImage'             => false,
             'disableRemove'       => false,
-            'chunked'             => true,
+            'chunked'             => false,
             'fileNumLimit'        => 10,
             // 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候,把图片打开。
             'disableGlobalDnd'    => true,

+ 2 - 2
src/Http/Controllers/RenderableController.php

@@ -61,8 +61,8 @@ class RenderableController
 
     protected function forgetDefaultAssets()
     {
-        Admin::baseJs([]);
-        Admin::baseCss([]);
+        Admin::baseJs([], false);
+        Admin::baseCss([], false);
         Admin::fonts([]);
     }
 }

+ 14 - 7
src/Layout/Asset.php

@@ -38,9 +38,6 @@ class Asset
         '@nunito' => [
             'css' => ['https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,800,800i,900,900i'],
         ],
-        '@montserrat' => [
-            'css' => ['https://fonts.googleapis.com/css?family=Montserrat:300,400,500,600'],
-        ],
         '@dcat' => [
             'js'  => '@admin/dcat/js/dcat-app.js',
             'css' => '@admin/dcat/css/dcat-app.css',
@@ -383,9 +380,13 @@ class Asset
      *
      * @param array $css
      */
-    public function baseCss(array $css)
+    public function baseCss(array $css, bool $merge = false)
     {
-        $this->baseCss = $css;
+        if ($merge) {
+            $this->baseCss = array_merge($this->baseCss, $css);
+        } else {
+            $this->baseCss = $css;
+        }
     }
 
     /**
@@ -505,6 +506,7 @@ class Asset
         if (! $js) {
             return;
         }
+
         $this->headerJs = array_merge($this->headerJs, (array) $js);
     }
 
@@ -512,10 +514,15 @@ class Asset
      * 设置基础js脚本.
      *
      * @param array $js
+     * @param bool $merge
      */
-    public function baseJs(array $js)
+    public function baseJs(array $js, bool $merge = true)
     {
-        $this->baseJs = $js;
+        if ($merge) {
+            $this->baseJs = array_merge($this->baseJs, $js);
+        } else {
+            $this->baseJs = $js;
+        }
     }
 
     /**

+ 10 - 0
src/Models/Extension.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace Dcat\Admin\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Extension extends Model
+{
+    protected $table = 'admin_extensions';
+}

+ 10 - 0
src/Models/ExtensionHistory.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace Dcat\Admin\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ExtensionHistory extends Model
+{
+    protected $table = 'admin_extension_histories';
+}

+ 1 - 1
src/Support/JavaScript.php

@@ -16,7 +16,7 @@ class JavaScript
 
     public function __construct($script)
     {
-        $this->id = '@javascript:'.Str::random();
+        $this->id = Str::random();
 
         $this->value($script);
     }

+ 0 - 14
src/Support/Setting.php

@@ -71,20 +71,6 @@ class Setting extends Fluent
         return $this;
     }
 
-    /**
-     * 获取启用的扩展.
-     *
-     * @return array
-     */
-    public function getExtensionsEnabled()
-    {
-        $value = $this->get('extensions_enabled') ?: '[]';
-
-        $value = json_decode($value, true);
-
-        return $value ?: [];
-    }
-
     /**
      * @return static
      */

+ 6 - 8
src/Traits/HasAssets.php

@@ -38,12 +38,11 @@ trait HasAssets
      * Set base css.
      *
      * @param array $css
-     *
-     * @return array|void
+     * @param bool $merge
      */
-    public static function baseCss(array $css)
+    public static function baseCss(array $css, bool $merge = true)
     {
-        static::asset()->baseCss($css);
+        static::asset()->baseCss($css, $merge);
     }
 
     /**
@@ -74,12 +73,11 @@ trait HasAssets
      * Set base js.
      *
      * @param array $js
-     *
-     * @return void
+     * @param bool $merge
      */
-    public static function baseJs(array $js)
+    public static function baseJs(array $js, bool $merge = true)
     {
-        static::asset()->baseJs($js);
+        static::asset()->baseJs($js, $merge);
     }
 
     /**

+ 2 - 5
src/Traits/HasHtml.php

@@ -55,11 +55,8 @@ trait HasHtml
     {
         $dom = static::getDOMDocument(Helper::render($content));
 
-        $head = $dom->getElementsByTagName('head')->item(0) ?: null;
-        $body = $dom->getElementsByTagName('body')->item(0) ?: null;
-
-        $head = static::resolveElement($head);
-        $body = static::resolveElement($body);
+        $head = static::resolveElement($dom->getElementsByTagName('head')->item(0) ?: null);
+        $body = static::resolveElement($dom->getElementsByTagName('body')->item(0) ?: null);
 
         $script = $head['script'].$body['script'];
 

+ 2 - 2
src/Widgets/DialogForm.php

@@ -302,8 +302,8 @@ JS
             return;
         }
 
-        Admin::baseCss([]);
-        Admin::baseJs([]);
+        Admin::baseCss([], false);
+        Admin::baseJs([], false);
         Admin::fonts(false);
         Admin::style('.form-content{ padding-top: 7px }');